--- /srv/reproducible-results/rbuild-debian/r-b-build.AbCIaARL/b1/dune-functions_2.9.0-2_armhf.changes +++ /srv/reproducible-results/rbuild-debian/r-b-build.AbCIaARL/b2/dune-functions_2.9.0-2_armhf.changes ├── Files │ @@ -1,3 +1,3 @@ │ │ 95a527c934281b71789d5f160185af88 83196 libdevel optional libdune-functions-dev_2.9.0-2_armhf.deb │ - 1af98441e2c67fac59ba8e2a8dccef7f 1778972 doc optional libdune-functions-doc_2.9.0-2_all.deb │ + 7e175c1d1f29085e2c11a92a06df30de 1779596 doc optional libdune-functions-doc_2.9.0-2_all.deb ├── libdune-functions-doc_2.9.0-2_all.deb │ ├── file list │ │ @@ -1,3 +1,3 @@ │ │ -rw-r--r-- 0 0 0 4 2023-01-12 22:26:33.000000 debian-binary │ │ --rw-r--r-- 0 0 0 13164 2023-01-12 22:26:33.000000 control.tar.xz │ │ --rw-r--r-- 0 0 0 1765616 2023-01-12 22:26:33.000000 data.tar.xz │ │ +-rw-r--r-- 0 0 0 13152 2023-01-12 22:26:33.000000 control.tar.xz │ │ +-rw-r--r-- 0 0 0 1766252 2023-01-12 22:26:33.000000 data.tar.xz │ ├── control.tar.xz │ │ ├── control.tar │ │ │ ├── ./md5sums │ │ │ │ ├── ./md5sums │ │ │ │ │┄ Files differ │ │ │ │ ├── line order │ │ │ │ │ @@ -43,18 +43,18 @@ │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00059_source.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00062.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00062_source.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00065.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00065_source.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00068.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00068_source.html │ │ │ │ │ -usr/share/doc/libdune-functions-doc/doxygen/a00071.html │ │ │ │ │ -usr/share/doc/libdune-functions-doc/doxygen/a00071_source.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00074.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00074_source.html │ │ │ │ │ +usr/share/doc/libdune-functions-doc/doxygen/a00077.html │ │ │ │ │ +usr/share/doc/libdune-functions-doc/doxygen/a00077_source.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00080.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00080_source.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00083.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00083_source.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00086.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00086_source.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00089.html │ ├── data.tar.xz │ │ ├── data.tar │ │ │ ├── file list │ │ │ │ @@ -3,140 +3,140 @@ │ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2023-01-12 22:26:33.000000 ./usr/share/ │ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2023-01-12 22:26:33.000000 ./usr/share/doc/ │ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 810 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/changelog.Debian.gz │ │ │ │ -rw-r--r-- 0 root (0) root (0) 4118 2022-11-16 12:11:40.000000 ./usr/share/doc/libdune-functions-doc/changelog.gz │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3331 2023-01-12 15:07:37.000000 ./usr/share/doc/libdune-functions-doc/copyright │ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/ │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5328 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00002.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 25921 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00002_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6513 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00005.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 16008 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00005_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4395 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00008.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 18047 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00008_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7509 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00011.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 28251 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00011_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5486 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00014.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 11779 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00014_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10231 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00017.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 51362 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00017_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7683 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00020.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 27200 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00020_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4388 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00023.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 13611 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00023_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 23350 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00026.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 68684 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00026_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7651 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00029.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 15189 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00029_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7280 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00032.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 11255 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00032_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4981 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00035.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 27963 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00035_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5136 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00038.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 49466 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00038_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5074 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00041.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 12567 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00041_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 15745 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00044.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 48865 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00044_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4881 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00047.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10069 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00047_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6093 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00050.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 22105 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00050_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6731 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00053.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 48399 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00053_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6923 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00056.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 14988 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00056_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6686 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00059.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 17547 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00059_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5963 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00062.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 26463 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00062_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6659 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00065.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 45971 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00065_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6149 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00068.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10192 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00068_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4953 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00071.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 20264 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00071_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8161 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00074.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 52869 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00074_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4906 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00080.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 21677 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00080_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4509 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00083.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 13605 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00083_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5486 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00086.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 35187 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00086_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6668 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00089.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 36917 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00089_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7229 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00092.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 46756 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00092_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8120 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00095.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 16692 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00095_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6209 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00098.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 28013 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00098_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9885 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00101.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 129555 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00101_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5723 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00104.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 12131 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00104_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7995 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00107.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 79863 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00107_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7931 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00110.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 51127 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00110_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5337 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00113.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7264 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00113_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5531 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00116.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 16841 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00116_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8146 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00119.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 55287 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00119_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5166 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00122.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 34473 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00122_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8422 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00125.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 67255 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00125_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8275 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00128.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 42991 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00128_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5502 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00131.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 41013 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00131_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9047 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00134.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 119825 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00134_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5633 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00137.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 16399 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00137_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7067 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00140.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 30363 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00140_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8289 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00143.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 73804 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00143_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8734 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00146.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 76258 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00146_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8932 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00149.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 84710 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00149_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8515 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00152.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 73752 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00152_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8181 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00155.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 58888 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00155_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8424 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00158.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 38765 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00158_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 12925 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00161.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 22115 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00161_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7961 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00164.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 25642 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00164_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10568 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00167.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 222246 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00167_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7007 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00170.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 23394 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00170_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4827 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00173.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 49470 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00173_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7711 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00176.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 47942 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00176_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10569 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00179.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 57247 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00179_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8154 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00182.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 51505 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00182_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5264 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00185.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 12341 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00185_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8298 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00188.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 46365 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00188_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7093 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00191.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 32392 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00191_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5963 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00002.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 26463 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00002_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 23350 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00005.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 68684 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00005_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7280 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00008.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 11255 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00008_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4388 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00011.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 13611 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00011_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7509 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00014.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 28251 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00014_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7683 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00017.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 27200 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00017_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4395 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00020.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 18047 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00020_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6923 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00023.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 14988 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00023_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6659 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00026.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 45971 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00026_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5328 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00029.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 25921 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00029_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10231 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00032.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 51362 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00032_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7651 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00035.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 15189 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00035_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6093 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00038.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 22105 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00038_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6731 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00041.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 48399 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00041_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6513 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00044.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 16008 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00044_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 15745 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00047.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 48865 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00047_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5486 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00050.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 11779 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00050_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4881 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00053.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10069 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00053_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6686 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00056.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 17547 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00056_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5074 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00059.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 12567 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00059_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4981 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00062.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 27963 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00062_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5136 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00065.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 49466 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00065_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7007 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00068.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 23394 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00068_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5531 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00074.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 16841 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00074_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8422 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00077.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 67255 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00077_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8298 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00080.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 46365 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00080_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10568 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00083.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 222246 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00083_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8515 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00086.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 73752 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00086_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7961 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00089.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 25642 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00089_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 12925 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00092.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 22115 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00092_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7067 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00095.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 30363 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00095_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8734 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00098.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 76258 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00098_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5166 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00101.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 34473 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00101_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8424 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00104.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 38765 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00104_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7093 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00107.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 32392 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00107_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5633 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00110.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 16399 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00110_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8154 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00113.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 51505 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00113_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7931 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00116.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 51127 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00116_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9047 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00119.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 119825 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00119_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5337 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00122.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7264 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00122_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7995 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00125.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 79863 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00125_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8146 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00128.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 55287 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00128_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7711 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00131.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 47942 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00131_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5264 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00134.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 12341 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00134_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10569 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00137.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 57247 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00137_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8932 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00140.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 84710 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00140_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5502 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00143.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 41013 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00143_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8181 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00146.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 58888 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00146_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8275 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00149.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 42991 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00149_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8289 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00152.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 73804 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00152_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4827 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00155.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 49470 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00155_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8161 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00158.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 52869 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00158_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4953 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00161.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 20264 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00161_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6149 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00164.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10192 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00164_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6668 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00167.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 36917 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00167_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6209 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00170.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 28013 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00170_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4509 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00173.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 13605 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00173_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4906 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00176.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 21677 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00176_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5723 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00179.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 12131 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00179_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8120 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00182.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 16692 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00182_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7229 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00185.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 46756 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00185_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5486 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00188.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 35187 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00188_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9885 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00191.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 129555 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00191_source.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 2871 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00194.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 2879 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00197.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 2877 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00200.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3925 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00203.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 6471 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00204.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 6184 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00206.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 12066 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00206.png │ │ │ │ @@ -513,15 +513,15 @@ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 6938 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/dir_a5545368301c4029d7054f90c0ed45fc.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 27691 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/dir_a5545368301c4029d7054f90c0ed45fc_dep.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 4682 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/dir_e22f2c69b2799e923164d7b2e4fa3f8c.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3046 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/dir_e22f2c69b2799e923164d7b2e4fa3f8c_dep.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3482 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/dir_e68e8157741866f444e17edd764ebbae.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 746 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/doc.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 33676 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/doxygen.css │ │ │ │ --rw-r--r-- 0 root (0) root (0) 55020 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/dune-functions.tag.gz │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 55035 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/dune-functions.tag.gz │ │ │ │ -rw-r--r-- 0 root (0) root (0) 4452 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/dynsections.js │ │ │ │ -rw-r--r-- 0 root (0) root (0) 24524 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/files.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 616 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/folderclosed.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 597 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/folderopen.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3926 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/functions.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 9073 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/functions_b.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 7791 2023-01-12 22:26:33.000000 ./usr/share/doc/libdune-functions-doc/doxygen/functions_c.html │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00002.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: typeerasure.hh File Reference │ │ │ │ +dune-functions: localfunction.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,29 +65,33 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
typeerasure.hh File Reference
│ │ │ │ +
localfunction.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <typeinfo>
│ │ │ │ +
#include <type_traits>
│ │ │ │ #include <dune/common/typeutilities.hh>
│ │ │ │ -#include <dune/functions/common/type_traits.hh>
│ │ │ │ -#include <dune/functions/common/interfaces.hh>
│ │ │ │ -#include <dune/functions/common/polymorphicsmallobject.hh>
│ │ │ │ +#include <dune/functions/common/defaultderivativetraits.hh>
│ │ │ │ +#include <dune/functions/common/differentiablefunction.hh>
│ │ │ │ +#include <dune/functions/common/localfunction_imp.hh>
│ │ │ │ +#include <dune/functions/common/typeerasure.hh>
│ │ │ │ +#include <dune/functions/common/functionconcepts.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::TypeErasureBase< Interface, Implementation, bufferSize >
 Base class for type-erased interface wrapper. More...
class  Dune::Functions::LocalFunction< Signature, LocalContext, DerivativeTraits, bufferSize >
 
class  Dune::Functions::LocalFunction< Range(Domain), LocalContext, DerivativeTraits, bufferSize >
 Class storing local functions using type erasure. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -6,25 +6,30 @@ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ Classes | Namespaces │ │ │ │ │ -typeerasure.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +localfunction.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::TypeErasureBase<_Interface,_Implementation,_bufferSize │ │ │ │ │ - > │ │ │ │ │ -  Base class for type-erased interface wrapper. More... │ │ │ │ │ +class  Dune::Functions::LocalFunction<_Signature,_LocalContext, │ │ │ │ │ + DerivativeTraits,_bufferSize_> │ │ │ │ │ +  │ │ │ │ │ +class  Dune::Functions::LocalFunction<_Range(Domain),_LocalContext, │ │ │ │ │ + DerivativeTraits,_bufferSize_> │ │ │ │ │ +  Class storing local functions using type erasure. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00002_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: typeerasure.hh Source File │ │ │ │ +dune-functions: localfunction.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,159 +62,152 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
typeerasure.hh
│ │ │ │ +
localfunction.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#ifndef DUNE_FUNCTIONS_COMMON_TYPEERASURE_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_COMMON_TYPEERASURE_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_COMMON_LOCAL_FUNCTION_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_COMMON_LOCAL_FUNCTION_HH
│ │ │ │
5
│ │ │ │ -
6#include <typeinfo>
│ │ │ │ +
6#include <type_traits>
│ │ │ │
7
│ │ │ │
8#include <dune/common/typeutilities.hh>
│ │ │ │
9
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
13
│ │ │ │ -
14namespace Dune {
│ │ │ │ -
15namespace Functions {
│ │ │ │ -
16namespace Imp {
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
15
│ │ │ │ +
16
│ │ │ │
17
│ │ │ │ -
18
│ │ │ │ -
19
│ │ │ │ -
33template<class Interface>
│ │ │ │ -
34class TypeErasureWrapperInterface :
│ │ │ │ -
35 public Interface,
│ │ │ │ -
36 public PolymorphicType<TypeErasureWrapperInterface<Interface>>
│ │ │ │ -
37{
│ │ │ │ -
38public:
│ │ │ │ -
39 virtual const std::type_info& target_type() const = 0;
│ │ │ │ -
40};
│ │ │ │ -
41
│ │ │ │ -
42
│ │ │ │ -
43
│ │ │ │ -
60template<class Interface, class T>
│ │ │ │ -
61class TypeErasureWrapperBase :
│ │ │ │ -
62 public TypeErasureWrapperInterface<Interface>
│ │ │ │ -
63{
│ │ │ │ -
64public:
│ │ │ │ -
65 template<class TT, disableCopyMove<TypeErasureWrapperBase, TT> = 0>
│ │ │ │ -
66 TypeErasureWrapperBase(TT&& t) :
│ │ │ │ -
67 wrapped_(std::forward<TT>(t))
│ │ │ │ -
68 {}
│ │ │ │ -
69
│ │ │ │ -
71 T& get()
│ │ │ │ -
72 {
│ │ │ │ -
73 return wrapped_;
│ │ │ │ -
74 }
│ │ │ │ -
75
│ │ │ │ -
77 const T& get() const
│ │ │ │ -
78 {
│ │ │ │ -
79 return wrapped_;
│ │ │ │ -
80 }
│ │ │ │ -
81
│ │ │ │ -
82protected:
│ │ │ │ -
83 using Wrapped = T;
│ │ │ │ -
84 Wrapped wrapped_;
│ │ │ │ -
85};
│ │ │ │ -
86
│ │ │ │ -
87
│ │ │ │ -
88
│ │ │ │ -
112template<class Interface, template<class> class Implementation, class T>
│ │ │ │ -
113class TypeErasureWrapperImplementation :
│ │ │ │ -
114 public Implementation<TypeErasureWrapperBase<Interface, T> >
│ │ │ │ -
115{
│ │ │ │ -
116public:
│ │ │ │ +
18namespace Dune {
│ │ │ │ +
19namespace Functions {
│ │ │ │ +
20
│ │ │ │ +
21
│ │ │ │ +
22
│ │ │ │ +
23/*
│ │ │ │ +
24 * Default implementation is empty
│ │ │ │ +
25 * The actual implementation is only given if Signature is an type
│ │ │ │ +
26 * describing a function signature as Range(Domain).
│ │ │ │ +
27 */
│ │ │ │ +
28template<class Signature, class LocalContext, template<class> class DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56>
│ │ │ │ + │ │ │ │ +
30{};
│ │ │ │ +
31
│ │ │ │ +
32
│ │ │ │ +
33
│ │ │ │ +
34namespace Imp
│ │ │ │ +
35{
│ │ │ │ +
36
│ │ │ │ +
38 template<class S, class L, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ +
39 struct LocalFunctionTraits :
│ │ │ │ +
40 DifferentiableFunctionTraits<S, DerivativeTraits, bufferSize>
│ │ │ │ +
41 {
│ │ │ │ +
42 protected:
│ │ │ │ +
43 using Base=DifferentiableFunctionTraits<S, DerivativeTraits, bufferSize>;
│ │ │ │ +
44
│ │ │ │ +
45 public:
│ │ │ │ +
47 using LocalContext = L;
│ │ │ │ +
48
│ │ │ │ +
50 using DerivativeSignature = typename Base::DerivativeSignature;
│ │ │ │ +
51
│ │ │ │ + │ │ │ │ +
54
│ │ │ │ +
56 using Concept = LocalFunctionWrapperInterface<S, DerivativeInterface, L>;
│ │ │ │ +
57
│ │ │ │ +
59 template<class B>
│ │ │ │ +
60 using Model = LocalFunctionWrapperImplementation<S, DerivativeInterface, L, B>;
│ │ │ │ +
61 };
│ │ │ │ +
62}
│ │ │ │ +
63
│ │ │ │ +
64
│ │ │ │ +
65
│ │ │ │ +
86template<class Range, class Domain, class LocalContext, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ +
87class LocalFunction< Range(Domain), LocalContext, DerivativeTraits, bufferSize> :
│ │ │ │ +
88 public TypeErasureBase<
│ │ │ │ +
89 typename Imp::LocalFunctionTraits<Range(Domain), LocalContext, DerivativeTraits, bufferSize>::Concept,
│ │ │ │ +
90 Imp::LocalFunctionTraits<Range(Domain), LocalContext, DerivativeTraits, bufferSize>::template Model>
│ │ │ │ +
91{
│ │ │ │ +
92 using Traits = Imp::LocalFunctionTraits<Range(Domain), LocalContext, DerivativeTraits, bufferSize>;
│ │ │ │ +
93
│ │ │ │ + │ │ │ │ +
95
│ │ │ │ +
96 using DerivativeInterface = typename Traits::DerivativeInterface;
│ │ │ │ +
97
│ │ │ │ +
98public:
│ │ │ │ +
99
│ │ │ │ +
111 template<class F, disableCopyMove<LocalFunction, F> = 0 >
│ │ │ │ + │ │ │ │ +
113 Base(std::forward<F>(f))
│ │ │ │ +
114 {
│ │ │ │ +
115 static_assert(Dune::Functions::Concept::isLocalFunction<F, Range(Domain), LocalContext>(), "Trying to construct a LocalFunction from type that does not model the LocalFunction concept");
│ │ │ │ +
116 }
│ │ │ │
117
│ │ │ │ -
119 template<class TT, disableCopyMove<TypeErasureWrapperImplementation, T> = 0>
│ │ │ │ -
120 TypeErasureWrapperImplementation(TT&& t) :
│ │ │ │ -
121 Implementation<TypeErasureWrapperBase<Interface, T> >(std::forward<TT>(t))
│ │ │ │ -
122 {}
│ │ │ │ -
123
│ │ │ │ -
125 virtual TypeErasureWrapperImplementation* clone() const
│ │ │ │ -
126 {
│ │ │ │ -
127 return new TypeErasureWrapperImplementation(*this);
│ │ │ │ -
128 }
│ │ │ │ -
129
│ │ │ │ -
131 virtual TypeErasureWrapperImplementation* clone(void* buffer) const
│ │ │ │ -
132 {
│ │ │ │ -
133 return new (buffer) TypeErasureWrapperImplementation(*this);
│ │ │ │ -
134 }
│ │ │ │ -
135
│ │ │ │ -
137 virtual TypeErasureWrapperImplementation* move(void* buffer)
│ │ │ │ -
138 {
│ │ │ │ -
139 return new (buffer) TypeErasureWrapperImplementation(std::move(*this));
│ │ │ │ -
140 }
│ │ │ │ -
141
│ │ │ │ -
143 virtual const std::type_info& target_type() const
│ │ │ │ -
144 {
│ │ │ │ -
145 return typeid(T);
│ │ │ │ -
146 }
│ │ │ │ -
147};
│ │ │ │ -
148
│ │ │ │ -
149} // namespace Dune::Functions::Imp
│ │ │ │ +
118 LocalFunction() = default;
│ │ │ │ +
119
│ │ │ │ +
123 Range operator() (const Domain& x) const
│ │ │ │ +
124 {
│ │ │ │ +
125 return this->asInterface().operator()(x);
│ │ │ │ +
126 }
│ │ │ │ +
127
│ │ │ │ +
135 friend DerivativeInterface derivative(const LocalFunction& t)
│ │ │ │ +
136 {
│ │ │ │ +
137 return t.asInterface().derivative();
│ │ │ │ +
138 }
│ │ │ │ +
139
│ │ │ │ +
146 void bind(const LocalContext& context)
│ │ │ │ +
147 {
│ │ │ │ +
148 this->asInterface().bind(context);
│ │ │ │ +
149 }
│ │ │ │
150
│ │ │ │ -
151
│ │ │ │ -
152
│ │ │ │ -
163template<class Interface, template<class> class Implementation, size_t bufferSize = 56>
│ │ │ │ - │ │ │ │ -
165{
│ │ │ │ -
166public:
│ │ │ │ -
167
│ │ │ │ -
169 template<class T, disableCopyMove<TypeErasureBase, T> = 0 >
│ │ │ │ - │ │ │ │ -
171 wrapped_(Imp::TypeErasureWrapperImplementation<Interface, Implementation, typename std::decay<T>::type>(std::forward<T>(t)))
│ │ │ │ -
172 {}
│ │ │ │ -
173
│ │ │ │ -
175 TypeErasureBase() = default;
│ │ │ │ +
154 void unbind()
│ │ │ │ +
155 {
│ │ │ │ +
156 this->asInterface().unbind();
│ │ │ │ +
157 }
│ │ │ │ +
158
│ │ │ │ +
161 bool bound() const
│ │ │ │ +
162 {
│ │ │ │ +
163 return this->asInterface().bound();
│ │ │ │ +
164 }
│ │ │ │ +
165
│ │ │ │ +
169 const LocalContext& localContext() const
│ │ │ │ +
170 {
│ │ │ │ +
171 return this->asInterface().localContext();
│ │ │ │ +
172 }
│ │ │ │ +
173};
│ │ │ │ +
174
│ │ │ │ +
175
│ │ │ │
176
│ │ │ │ -
178 Interface& asInterface()
│ │ │ │ -
179 {
│ │ │ │ -
180 return wrapped_.get();
│ │ │ │ -
181 }
│ │ │ │ -
182
│ │ │ │ -
184 const Interface& asInterface() const
│ │ │ │ -
185 {
│ │ │ │ -
186 return wrapped_.get();
│ │ │ │ -
187 }
│ │ │ │ -
188
│ │ │ │ -
190 const std::type_info& target_type() const
│ │ │ │ -
191 {
│ │ │ │ -
192 return wrapped_.get().target_type();
│ │ │ │ -
193 }
│ │ │ │ -
194
│ │ │ │ -
195protected:
│ │ │ │ - │ │ │ │ -
197};
│ │ │ │ -
198
│ │ │ │ -
199
│ │ │ │ -
200}} // namespace Dune::Functions
│ │ │ │ -
201
│ │ │ │ -
202
│ │ │ │ -
203
│ │ │ │ -
204#endif // DUNE_FUNCTIONS_COMMON_TYPEERASURE_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +
177}} // namespace Dune::Functions
│ │ │ │ +
178
│ │ │ │ +
179
│ │ │ │ +
180
│ │ │ │ +
181#endif // DUNE_FUNCTIONS_COMMON_LOCAL_FUNCTION_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
friend DerivativeInterface derivative(const LocalFunction &t)
Get derivative of wrapped function.
Definition: localfunction.hh:135
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
A wrapper providing small object optimization with polymorphic types.
Definition: polymorphicsmallobject.hh:45
│ │ │ │ +
Definition: localfunction.hh:30
│ │ │ │ +
const LocalContext & localContext() const
Obtain local context this LocalFunction is bound to.
Definition: localfunction.hh:169
│ │ │ │ +
LocalFunction(F &&f)
Construct from function.
Definition: localfunction.hh:112
│ │ │ │ +
void unbind()
Unbind from local context.
Definition: localfunction.hh:154
│ │ │ │ +
bool bound() const
Return if the local function is bound to a grid element.
Definition: localfunction.hh:161
│ │ │ │ +
void bind(const LocalContext &context)
Bind function to a local context.
Definition: localfunction.hh:146
│ │ │ │ + │ │ │ │
Base class for type-erased interface wrapper.
Definition: typeerasure.hh:165
│ │ │ │ -
const std::type_info & target_type() const
Get type of stored object.
Definition: typeerasure.hh:190
│ │ │ │ -
TypeErasureBase(T &&t)
Construct wrapper from object.
Definition: typeerasure.hh:170
│ │ │ │ -
PolymorphicSmallObject< Imp::TypeErasureWrapperInterface< Interface >, bufferSize > wrapped_
Definition: typeerasure.hh:196
│ │ │ │ -
TypeErasureBase()=default
Default constructor.
│ │ │ │ -
Interface & asInterface()
Get mutable reference to wrapped object.
Definition: typeerasure.hh:178
│ │ │ │ -
const Interface & asInterface() const
Get reference to wrapped object.
Definition: typeerasure.hh:184
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,180 +5,189 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -typeerasure.hh │ │ │ │ │ +localfunction.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#ifndef DUNE_FUNCTIONS_COMMON_TYPEERASURE_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_COMMON_TYPEERASURE_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_COMMON_LOCAL_FUNCTION_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_COMMON_LOCAL_FUNCTION_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ + 6#include │ │ │ │ │ 7 │ │ │ │ │ 8#include │ │ │ │ │ 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13 │ │ │ │ │ - 14namespace Dune { │ │ │ │ │ - 15namespace Functions { │ │ │ │ │ - 16namespace Imp { │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14#include │ │ │ │ │ + 15 │ │ │ │ │ + 16 │ │ │ │ │ 17 │ │ │ │ │ - 18 │ │ │ │ │ - 19 │ │ │ │ │ - 33template │ │ │ │ │ - 34class TypeErasureWrapperInterface : │ │ │ │ │ - 35 public Interface, │ │ │ │ │ - 36 public PolymorphicType> │ │ │ │ │ - 37{ │ │ │ │ │ - 38public: │ │ │ │ │ - 39 virtual const std::type_info& target_type() const = 0; │ │ │ │ │ - 40}; │ │ │ │ │ - 41 │ │ │ │ │ - 42 │ │ │ │ │ - 43 │ │ │ │ │ - 60template │ │ │ │ │ - 61class TypeErasureWrapperBase : │ │ │ │ │ - 62 public TypeErasureWrapperInterface │ │ │ │ │ - 63{ │ │ │ │ │ - 64public: │ │ │ │ │ - 65 template = 0> │ │ │ │ │ - 66 TypeErasureWrapperBase(TT&& t) : │ │ │ │ │ - 67 wrapped_(std::forward(t)) │ │ │ │ │ - 68 {} │ │ │ │ │ - 69 │ │ │ │ │ - 71 T& get() │ │ │ │ │ - 72 { │ │ │ │ │ - 73 return wrapped_; │ │ │ │ │ - 74 } │ │ │ │ │ - 75 │ │ │ │ │ - 77 const T& get() const │ │ │ │ │ - 78 { │ │ │ │ │ - 79 return wrapped_; │ │ │ │ │ - 80 } │ │ │ │ │ - 81 │ │ │ │ │ - 82protected: │ │ │ │ │ - 83 using Wrapped = T; │ │ │ │ │ - 84 Wrapped wrapped_; │ │ │ │ │ - 85}; │ │ │ │ │ - 86 │ │ │ │ │ - 87 │ │ │ │ │ - 88 │ │ │ │ │ - 112template class Implementation, class T> │ │ │ │ │ - 113class TypeErasureWrapperImplementation : │ │ │ │ │ - 114 public Implementation > │ │ │ │ │ - 115{ │ │ │ │ │ - 116public: │ │ │ │ │ + 18namespace Dune { │ │ │ │ │ + 19namespace Functions { │ │ │ │ │ + 20 │ │ │ │ │ + 21 │ │ │ │ │ + 22 │ │ │ │ │ + 23/* │ │ │ │ │ + 24 * Default implementation is empty │ │ │ │ │ + 25 * The actual implementation is only given if Signature is an type │ │ │ │ │ + 26 * describing a function signature as Range(Domain). │ │ │ │ │ + 27 */ │ │ │ │ │ + 28template class │ │ │ │ │ +DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56> │ │ │ │ │ +29class LocalFunction │ │ │ │ │ + 30{}; │ │ │ │ │ + 31 │ │ │ │ │ + 32 │ │ │ │ │ + 33 │ │ │ │ │ + 34namespace Imp │ │ │ │ │ + 35{ │ │ │ │ │ + 36 │ │ │ │ │ + 38 template class DerivativeTraits, size_t │ │ │ │ │ +bufferSize> │ │ │ │ │ + 39 struct LocalFunctionTraits : │ │ │ │ │ + 40 DifferentiableFunctionTraits │ │ │ │ │ + 41 { │ │ │ │ │ + 42 protected: │ │ │ │ │ + 43 using Base=DifferentiableFunctionTraits; │ │ │ │ │ + 44 │ │ │ │ │ + 45 public: │ │ │ │ │ + 47 using LocalContext = L; │ │ │ │ │ + 48 │ │ │ │ │ + 50 using DerivativeSignature = typename Base::DerivativeSignature; │ │ │ │ │ + 51 │ │ │ │ │ + 53 using DerivativeInterface = LocalFunction; │ │ │ │ │ + 54 │ │ │ │ │ + 56 using Concept = LocalFunctionWrapperInterface; │ │ │ │ │ + 57 │ │ │ │ │ + 59 template │ │ │ │ │ + 60 using Model = LocalFunctionWrapperImplementation; │ │ │ │ │ + 61 }; │ │ │ │ │ + 62} │ │ │ │ │ + 63 │ │ │ │ │ + 64 │ │ │ │ │ + 65 │ │ │ │ │ + 86template │ │ │ │ │ +class DerivativeTraits, size_t bufferSize> │ │ │ │ │ +87class LocalFunction< Range(Domain), LocalContext, DerivativeTraits, │ │ │ │ │ +bufferSize> : │ │ │ │ │ + 88 public TypeErasureBase< │ │ │ │ │ + 89 typename Imp::LocalFunctionTraits::Concept, │ │ │ │ │ + 90 Imp::LocalFunctionTraits::template Model> │ │ │ │ │ + 91{ │ │ │ │ │ + 92 using Traits = Imp::LocalFunctionTraits; │ │ │ │ │ + 93 │ │ │ │ │ + 94 using Base = TypeErasureBase; │ │ │ │ │ + 95 │ │ │ │ │ + 96 using DerivativeInterface = typename Traits::DerivativeInterface; │ │ │ │ │ + 97 │ │ │ │ │ + 98public: │ │ │ │ │ + 99 │ │ │ │ │ + 111 template = 0 > │ │ │ │ │ +112 LocalFunction(F&& f) : │ │ │ │ │ + 113 Base(std::forward(f)) │ │ │ │ │ + 114 { │ │ │ │ │ + 115 static_assert(Dune::Functions::Concept::isLocalFunction(), "Trying to construct a LocalFunction from type that does not │ │ │ │ │ +model the LocalFunction concept"); │ │ │ │ │ + 116 } │ │ │ │ │ 117 │ │ │ │ │ - 119 template = │ │ │ │ │ -0> │ │ │ │ │ - 120 TypeErasureWrapperImplementation(TT&& t) : │ │ │ │ │ - 121 Implementation >(std::forward(t)) │ │ │ │ │ - 122 {} │ │ │ │ │ - 123 │ │ │ │ │ - 125 virtual TypeErasureWrapperImplementation* clone() const │ │ │ │ │ - 126 { │ │ │ │ │ - 127 return new TypeErasureWrapperImplementation(*this); │ │ │ │ │ - 128 } │ │ │ │ │ - 129 │ │ │ │ │ - 131 virtual TypeErasureWrapperImplementation* clone(void* buffer) const │ │ │ │ │ - 132 { │ │ │ │ │ - 133 return new (buffer) TypeErasureWrapperImplementation(*this); │ │ │ │ │ - 134 } │ │ │ │ │ - 135 │ │ │ │ │ - 137 virtual TypeErasureWrapperImplementation* move(void* buffer) │ │ │ │ │ - 138 { │ │ │ │ │ - 139 return new (buffer) TypeErasureWrapperImplementation(std::move(*this)); │ │ │ │ │ - 140 } │ │ │ │ │ - 141 │ │ │ │ │ - 143 virtual const std::type_info& target_type() const │ │ │ │ │ - 144 { │ │ │ │ │ - 145 return typeid(T); │ │ │ │ │ - 146 } │ │ │ │ │ - 147}; │ │ │ │ │ - 148 │ │ │ │ │ - 149} // namespace Dune::Functions::Imp │ │ │ │ │ +118 LocalFunction() = default; │ │ │ │ │ + 119 │ │ │ │ │ +123 Range operator() (const Domain& x) const │ │ │ │ │ + 124 { │ │ │ │ │ + 125 return this->asInterface().operator()(x); │ │ │ │ │ + 126 } │ │ │ │ │ + 127 │ │ │ │ │ +135 friend DerivativeInterface derivative(const LocalFunction& t) │ │ │ │ │ + 136 { │ │ │ │ │ + 137 return t.asInterface().derivative(); │ │ │ │ │ + 138 } │ │ │ │ │ + 139 │ │ │ │ │ +146 void bind(const LocalContext& context) │ │ │ │ │ + 147 { │ │ │ │ │ + 148 this->asInterface().bind(context); │ │ │ │ │ + 149 } │ │ │ │ │ 150 │ │ │ │ │ - 151 │ │ │ │ │ - 152 │ │ │ │ │ - 163template class Implementation, size_t │ │ │ │ │ -bufferSize = 56> │ │ │ │ │ -164class TypeErasureBase │ │ │ │ │ - 165{ │ │ │ │ │ - 166public: │ │ │ │ │ - 167 │ │ │ │ │ - 169 template = 0 > │ │ │ │ │ -170 TypeErasureBase(T&& t) : │ │ │ │ │ - 171 wrapped_(Imp::TypeErasureWrapperImplementation::type>(std::forward(t))) │ │ │ │ │ - 172 {} │ │ │ │ │ - 173 │ │ │ │ │ -175 TypeErasureBase() = default; │ │ │ │ │ +154 void unbind() │ │ │ │ │ + 155 { │ │ │ │ │ + 156 this->asInterface().unbind(); │ │ │ │ │ + 157 } │ │ │ │ │ + 158 │ │ │ │ │ +161 bool bound() const │ │ │ │ │ + 162 { │ │ │ │ │ + 163 return this->asInterface().bound(); │ │ │ │ │ + 164 } │ │ │ │ │ + 165 │ │ │ │ │ +169 const LocalContext& localContext() const │ │ │ │ │ + 170 { │ │ │ │ │ + 171 return this->asInterface().localContext(); │ │ │ │ │ + 172 } │ │ │ │ │ + 173}; │ │ │ │ │ + 174 │ │ │ │ │ + 175 │ │ │ │ │ 176 │ │ │ │ │ -178 Interface& asInterface() │ │ │ │ │ - 179 { │ │ │ │ │ - 180 return wrapped_.get(); │ │ │ │ │ - 181 } │ │ │ │ │ - 182 │ │ │ │ │ -184 const Interface& asInterface() const │ │ │ │ │ - 185 { │ │ │ │ │ - 186 return wrapped_.get(); │ │ │ │ │ - 187 } │ │ │ │ │ - 188 │ │ │ │ │ -190 const std::type_info& target_type() const │ │ │ │ │ - 191 { │ │ │ │ │ - 192 return wrapped_.get().target_type(); │ │ │ │ │ - 193 } │ │ │ │ │ - 194 │ │ │ │ │ - 195protected: │ │ │ │ │ -196 PolymorphicSmallObject, │ │ │ │ │ -bufferSize > wrapped_; │ │ │ │ │ - 197}; │ │ │ │ │ - 198 │ │ │ │ │ - 199 │ │ │ │ │ - 200}} // namespace Dune::Functions │ │ │ │ │ - 201 │ │ │ │ │ - 202 │ │ │ │ │ - 203 │ │ │ │ │ - 204#endif // DUNE_FUNCTIONS_COMMON_TYPEERASURE_HH │ │ │ │ │ -type_traits.hh │ │ │ │ │ -polymorphicsmallobject.hh │ │ │ │ │ -interfaces.hh │ │ │ │ │ + 177}} // namespace Dune::Functions │ │ │ │ │ + 178 │ │ │ │ │ + 179 │ │ │ │ │ + 180 │ │ │ │ │ + 181#endif // DUNE_FUNCTIONS_COMMON_LOCAL_FUNCTION_HH │ │ │ │ │ +functionconcepts.hh │ │ │ │ │ +localfunction_imp.hh │ │ │ │ │ +typeerasure.hh │ │ │ │ │ +defaultderivativetraits.hh │ │ │ │ │ +differentiablefunction.hh │ │ │ │ │ +Dune::Functions::LocalFunction<_Range(Domain),_LocalContext,_DerivativeTraits, │ │ │ │ │ +bufferSize_>::derivative │ │ │ │ │ +friend DerivativeInterface derivative(const LocalFunction &t) │ │ │ │ │ +Get derivative of wrapped function. │ │ │ │ │ +Definition: localfunction.hh:135 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::PolymorphicSmallObject │ │ │ │ │ -A wrapper providing small object optimization with polymorphic types. │ │ │ │ │ -Definition: polymorphicsmallobject.hh:45 │ │ │ │ │ +Dune::Functions::LocalFunction │ │ │ │ │ +Definition: localfunction.hh:30 │ │ │ │ │ +Dune::Functions::LocalFunction<_Range(Domain),_LocalContext,_DerivativeTraits, │ │ │ │ │ +bufferSize_>::localContext │ │ │ │ │ +const LocalContext & localContext() const │ │ │ │ │ +Obtain local context this LocalFunction is bound to. │ │ │ │ │ +Definition: localfunction.hh:169 │ │ │ │ │ +Dune::Functions::LocalFunction<_Range(Domain),_LocalContext,_DerivativeTraits, │ │ │ │ │ +bufferSize_>::LocalFunction │ │ │ │ │ +LocalFunction(F &&f) │ │ │ │ │ +Construct from function. │ │ │ │ │ +Definition: localfunction.hh:112 │ │ │ │ │ +Dune::Functions::LocalFunction<_Range(Domain),_LocalContext,_DerivativeTraits, │ │ │ │ │ +bufferSize_>::unbind │ │ │ │ │ +void unbind() │ │ │ │ │ +Unbind from local context. │ │ │ │ │ +Definition: localfunction.hh:154 │ │ │ │ │ +Dune::Functions::LocalFunction<_Range(Domain),_LocalContext,_DerivativeTraits, │ │ │ │ │ +bufferSize_>::bound │ │ │ │ │ +bool bound() const │ │ │ │ │ +Return if the local function is bound to a grid element. │ │ │ │ │ +Definition: localfunction.hh:161 │ │ │ │ │ +Dune::Functions::LocalFunction<_Range(Domain),_LocalContext,_DerivativeTraits, │ │ │ │ │ +bufferSize_>::bind │ │ │ │ │ +void bind(const LocalContext &context) │ │ │ │ │ +Bind function to a local context. │ │ │ │ │ +Definition: localfunction.hh:146 │ │ │ │ │ +Dune::Functions::LocalFunction<_Range(Domain),_LocalContext,_DerivativeTraits, │ │ │ │ │ +bufferSize_>::LocalFunction │ │ │ │ │ +LocalFunction()=default │ │ │ │ │ Dune::Functions::TypeErasureBase │ │ │ │ │ Base class for type-erased interface wrapper. │ │ │ │ │ Definition: typeerasure.hh:165 │ │ │ │ │ -Dune::Functions::TypeErasureBase::target_type │ │ │ │ │ -const std::type_info & target_type() const │ │ │ │ │ -Get type of stored object. │ │ │ │ │ -Definition: typeerasure.hh:190 │ │ │ │ │ -Dune::Functions::TypeErasureBase::TypeErasureBase │ │ │ │ │ -TypeErasureBase(T &&t) │ │ │ │ │ -Construct wrapper from object. │ │ │ │ │ -Definition: typeerasure.hh:170 │ │ │ │ │ -Dune::Functions::TypeErasureBase::wrapped_ │ │ │ │ │ -PolymorphicSmallObject< Imp::TypeErasureWrapperInterface< Interface >, │ │ │ │ │ -bufferSize > wrapped_ │ │ │ │ │ -Definition: typeerasure.hh:196 │ │ │ │ │ -Dune::Functions::TypeErasureBase::TypeErasureBase │ │ │ │ │ -TypeErasureBase()=default │ │ │ │ │ -Default constructor. │ │ │ │ │ -Dune::Functions::TypeErasureBase::asInterface │ │ │ │ │ -Interface & asInterface() │ │ │ │ │ -Get mutable reference to wrapped object. │ │ │ │ │ -Definition: typeerasure.hh:178 │ │ │ │ │ -Dune::Functions::TypeErasureBase::asInterface │ │ │ │ │ -const Interface & asInterface() const │ │ │ │ │ -Get reference to wrapped object. │ │ │ │ │ -Definition: typeerasure.hh:184 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00005.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: type_traits.hh File Reference │ │ │ │ +dune-functions: functionconcepts.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,45 +65,122 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Typedefs
│ │ │ │ -
type_traits.hh File Reference
│ │ │ │ +Functions
│ │ │ │ +
functionconcepts.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ -#include <dune/common/typeutilities.hh>
│ │ │ │ +
#include <dune/common/typelist.hh>
│ │ │ │ +#include <dune/common/concept.hh>
│ │ │ │ +#include <dune/functions/common/signature.hh>
│ │ │ │ +#include <dune/functions/gridfunctions/localderivativetraits.hh>
│ │ │ │ +#include <dune/functions/gridfunctions/gridviewentityset.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Classes

struct  Dune::Functions::HasStaticSize< T >
 Check if type is a statically sized container. More...
struct  Dune::Functions::Concept::Callable< Args >
 Concept objects that can be called with given argument list. More...
 
struct  Dune::Functions::StaticSize< T >
 Obtain size of statically sized container. More...
struct  Dune::Functions::Concept::Function< Range(Domain)>
 Concept for a function mapping Domain to Range. More...
 
struct  Dune::Functions::Concept::DifferentiableFunction< Range(Domain), DerivativeTraits >
 Concept for a differentiable function mapping Domain to Range. More...
 
struct  Dune::Functions::Concept::LocalFunction< Range(Domain), LocalContext >
 Concept for a local function mapping Domain to Range. More...
 
struct  Dune::Functions::Concept::DifferentiableLocalFunction< Range(Domain), LocalContext, DerivativeTraits >
 Concept for a differentiable local function mapping Domain to Range. More...
 
struct  Dune::Functions::Concept::EntitySet
 Concept for an entity set for a Concept::GridFunction<Range(Domain), EntitySet, DerivativeTraits> More...
 
struct  Dune::Functions::Concept::GridFunction< Range(Domain), EntitySet >
 Concept for a grid function mapping Domain to Range. More...
 
struct  Dune::Functions::Concept::DifferentiableGridFunction< Range(Domain), EntitySet, DerivativeTraits >
 Concept for a differentiable grid function mapping Domain to Range. More...
 
struct  Dune::Functions::Concept::GridViewFunction< Range(Domain), GridView >
 Concept for a grid view function mapping Domain to Range. More...
 
struct  Dune::Functions::Concept::DifferentiableGridViewFunction< Range(Domain), GridView, DerivativeTraits >
 Concept for a differentiable grid view function mapping Domain to Range. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
namespace  Dune::Functions::Concept
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Typedefs

template<class T , class... Args>
using Dune::Functions::enableIfConstructible = typename std::enable_if< std::is_constructible< T, Args... >::value, int >::type
 Helper to constrain forwarding constructors. More...
 

│ │ │ │ +Functions

template<class F , class... Args>
static constexpr auto Dune::Functions::Concept::isCallable ()
 Check if f is callable with given argument list. More...
 
template<class F , class... Args>
static constexpr auto Dune::Functions::Concept::isCallable (F &&, Args &&...)
 Check if f is callable with given argument list. More...
 
template<class F , class Signature >
static constexpr bool Dune::Functions::Concept::isFunction ()
 Check if F models the Function concept with given signature. More...
 
template<class F , class Signature , template< class > class DerivativeTraits>
static constexpr bool Dune::Functions::Concept::isFunction (F &&f, SignatureTag< Signature, DerivativeTraits >)
 Check if f models the Function concept with given signature. More...
 
template<class F , class Signature , template< class > class DerivativeTraits = DefaultDerivativeTraits>
static constexpr bool Dune::Functions::Concept::isDifferentiableFunction ()
 Check if F models the DifferentiableFunction concept with given signature. More...
 
template<class F , class Signature , template< class > class DerivativeTraits>
static constexpr bool Dune::Functions::Concept::isDifferentiableFunction (F &&f, SignatureTag< Signature, DerivativeTraits >)
 Check if f models the DifferentiableFunction concept with given signature. More...
 
template<class F , class Signature , class LocalContext >
static constexpr bool Dune::Functions::Concept::isLocalFunction ()
 Check if F models the LocalFunction concept with given signature and local context. More...
 
template<class F , class Signature , class LocalContext , template< class > class DerivativeTraits = DefaultDerivativeTraits>
static constexpr bool Dune::Functions::Concept::isDifferentiableLocalFunction ()
 Check if F models the DifferentiableLocalFunction concept with given signature and local context. More...
 
template<class E >
static constexpr bool Dune::Functions::Concept::isEntitySet ()
 Check if F models the GridFunction concept with given signature and entity set. More...
 
template<class F , class Signature , class EntitySet >
static constexpr bool Dune::Functions::Concept::isGridFunction ()
 Check if F models the GridFunction concept with given signature and entity set. More...
 
template<class F , class Signature , class EntitySet , template< class > class DerivativeTraits = DefaultDerivativeTraits>
static constexpr bool Dune::Functions::Concept::isDifferentiableGridFunction ()
 Check if F models the DifferentiableGridFunction concept with given signature and entity set. More...
 
template<class F , class Signature , class GridView >
static constexpr bool Dune::Functions::Concept::isGridViewFunction ()
 Check if F models the GridViewFunction concept with given signature. More...
 
template<class F , class Signature , class GridView , template< class > class DerivativeTraits = DefaultDerivativeTraits>
static constexpr bool Dune::Functions::Concept::isDifferentiableGridViewFunction ()
 Check if F models the DifferentiableGridViewFunction concept with given signature. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,33 +5,137 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -Classes | Namespaces | Typedefs │ │ │ │ │ -type_traits.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Functions │ │ │ │ │ +functionconcepts.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -struct  Dune::Functions::HasStaticSize<_T_> │ │ │ │ │ -  Check if type is a statically sized container. More... │ │ │ │ │ +struct  Dune::Functions::Concept::Callable<_Args_> │ │ │ │ │ +  Concept objects that can be called with given argument list. More... │ │ │ │ │   │ │ │ │ │ -struct  Dune::Functions::StaticSize<_T_> │ │ │ │ │ -  Obtain size of statically sized container. More... │ │ │ │ │ +struct  Dune::Functions::Concept::Function<_Range(Domain)> │ │ │ │ │ +  Concept for a function mapping Domain to Range. More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::Concept::DifferentiableFunction<_Range(Domain), │ │ │ │ │ + DerivativeTraits_> │ │ │ │ │ +  Concept for a differentiable function mapping Domain to Range. More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::Concept::LocalFunction<_Range(Domain),_LocalContext_> │ │ │ │ │ +  Concept for a local function mapping Domain to Range. More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::Concept::DifferentiableLocalFunction<_Range(Domain), │ │ │ │ │ + LocalContext,_DerivativeTraits_> │ │ │ │ │ +  Concept for a differentiable local function mapping Domain to Range. │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::Concept::EntitySet │ │ │ │ │ +  Concept for an entity set for a Concept::GridFunction More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::Concept::GridFunction<_Range(Domain),_EntitySet_> │ │ │ │ │ +  Concept for a grid function mapping Domain to Range. More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::Concept::DifferentiableGridFunction<_Range(Domain), │ │ │ │ │ + EntitySet,_DerivativeTraits_> │ │ │ │ │ +  Concept for a differentiable grid function mapping Domain to Range. │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::Concept::GridViewFunction<_Range(Domain),_GridView_> │ │ │ │ │ +  Concept for a grid view function mapping Domain to Range. More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::Concept::DifferentiableGridViewFunction<_Range │ │ │ │ │ + (Domain),_GridView,_DerivativeTraits_> │ │ │ │ │ +  Concept for a differentiable grid view function mapping Domain to │ │ │ │ │ + Range. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ - Typedefs │ │ │ │ │ -template │ │ │ │ │ -using Dune::Functions::enableIfConstructible = typename std::enable_if< std:: │ │ │ │ │ - is_constructible< T, Args... >::value, int >::type │ │ │ │ │ -  Helper to constrain forwarding constructors. More... │ │ │ │ │ +namespace  Dune::Functions::Concept │ │ │ │ │ +  │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +static constexpr auto Dune::Functions::Concept::isCallable () │ │ │ │ │ +  Check if f is callable with given argument list. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +static constexpr auto Dune::Functions::Concept::isCallable (F &&, Args &&...) │ │ │ │ │ +  Check if f is callable with given argument list. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +static constexpr bool Dune::Functions::Concept::isFunction () │ │ │ │ │ +  Check if F models the Function concept with given │ │ │ │ │ + signature. More... │ │ │ │ │ +  │ │ │ │ │ +template class DerivativeTraits> │ │ │ │ │ +static constexpr bool Dune::Functions::Concept::isFunction (F &&f, │ │ │ │ │ + SignatureTag< Signature, DerivativeTraits >) │ │ │ │ │ +  Check if f models the Function concept with given │ │ │ │ │ + signature. More... │ │ │ │ │ +  │ │ │ │ │ +template class DerivativeTraits = │ │ │ │ │ +DefaultDerivativeTraits> │ │ │ │ │ +static constexpr bool Dune::Functions::Concept::isDifferentiableFunction () │ │ │ │ │ +  Check if F models the DifferentiableFunction concept │ │ │ │ │ + with given signature. More... │ │ │ │ │ +  │ │ │ │ │ +template class DerivativeTraits> │ │ │ │ │ +static constexpr bool Dune::Functions::Concept::isDifferentiableFunction (F │ │ │ │ │ + &&f, SignatureTag< Signature, DerivativeTraits >) │ │ │ │ │ +  Check if f models the DifferentiableFunction concept │ │ │ │ │ + with given signature. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +static constexpr bool Dune::Functions::Concept::isLocalFunction () │ │ │ │ │ +  Check if F models the LocalFunction concept with given │ │ │ │ │ + signature and local context. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +class DerivativeTraits = DefaultDerivativeTraits> │ │ │ │ │ +static constexpr bool Dune::Functions::Concept::isDifferentiableLocalFunction │ │ │ │ │ + () │ │ │ │ │ +  Check if F models the DifferentiableLocalFunction │ │ │ │ │ + concept with given signature and local context. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +static constexpr bool Dune::Functions::Concept::isEntitySet () │ │ │ │ │ +  Check if F models the GridFunction concept with given │ │ │ │ │ + signature and entity set. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +static constexpr bool Dune::Functions::Concept::isGridFunction () │ │ │ │ │ +  Check if F models the GridFunction concept with given │ │ │ │ │ + signature and entity set. More... │ │ │ │ │ +  │ │ │ │ │ +template class │ │ │ │ │ +DerivativeTraits = DefaultDerivativeTraits> │ │ │ │ │ +static constexpr bool Dune::Functions::Concept::isDifferentiableGridFunction │ │ │ │ │ + () │ │ │ │ │ +  Check if F models the DifferentiableGridFunction concept │ │ │ │ │ + with given signature and entity set. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +static constexpr bool Dune::Functions::Concept::isGridViewFunction () │ │ │ │ │ +  Check if F models the GridViewFunction concept with │ │ │ │ │ + given signature. More... │ │ │ │ │ +  │ │ │ │ │ +template class │ │ │ │ │ +DerivativeTraits = DefaultDerivativeTraits> │ │ │ │ │ +static constexpr bool Dune::Functions::Concept:: │ │ │ │ │ + isDifferentiableGridViewFunction () │ │ │ │ │ +  Check if F models the DifferentiableGridViewFunction │ │ │ │ │ + concept with given signature. More... │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00005_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: type_traits.hh Source File │ │ │ │ +dune-functions: functionconcepts.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,100 +62,320 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
type_traits.hh
│ │ │ │ +
functionconcepts.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#ifndef DUNE_FUNCTIONS_COMMON_TYPE_TRAITS_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_COMMON_TYPE_TRAITS_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH
│ │ │ │
5
│ │ │ │ -
6#include <type_traits>
│ │ │ │ -
7
│ │ │ │ -
8#include <dune/common/typeutilities.hh>
│ │ │ │ -
9
│ │ │ │ -
10namespace Dune {
│ │ │ │ -
11namespace Functions {
│ │ │ │ +
6#include <dune/common/typelist.hh>
│ │ │ │ +
7#include <dune/common/concept.hh>
│ │ │ │ +
8
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
12
│ │ │ │ -
13
│ │ │ │ -
24template<class T, class... Args>
│ │ │ │ -
25using enableIfConstructible = typename std::enable_if<
│ │ │ │ -
26 std::is_constructible<T, Args...>::value, int>::type;
│ │ │ │ -
27
│ │ │ │ -
28
│ │ │ │ -
29
│ │ │ │ -
30namespace Imp {
│ │ │ │ -
31
│ │ │ │ -
32 // As a last resort try if there's a static constexpr size()
│ │ │ │ -
33 template<class T>
│ │ │ │ -
34 constexpr auto staticSize(const T*, const PriorityTag<0>&)
│ │ │ │ -
35 -> decltype(std::integral_constant<std::size_t,T::size()>())
│ │ │ │ -
36 {
│ │ │ │ -
37 return {};
│ │ │ │ -
38 }
│ │ │ │ +
13namespace Dune {
│ │ │ │ +
14namespace Functions {
│ │ │ │ +
15namespace Concept {
│ │ │ │ +
16
│ │ │ │ +
17using namespace Dune::Concept;
│ │ │ │ +
18
│ │ │ │ +
19
│ │ │ │ +
20
│ │ │ │ +
21// Callable concept ############################################################
│ │ │ │ +
22
│ │ │ │ +
23
│ │ │ │ +
31template<class... Args>
│ │ │ │ + │ │ │ │ +
33{
│ │ │ │ +
34 template<class F>
│ │ │ │ +
35 auto require(F&& f) -> decltype(
│ │ │ │ +
36 f(std::declval<Args>()...)
│ │ │ │ +
37 );
│ │ │ │ +
38};
│ │ │ │
39
│ │ │ │ -
40 // Try if class has constexpr default constructor and size method
│ │ │ │ -
41 template<class T>
│ │ │ │ -
42 constexpr auto staticSize(const T*, const PriorityTag<1>&)
│ │ │ │ -
43 -> decltype(std::integral_constant<std::size_t,T().size()>())
│ │ │ │ -
44 {
│ │ │ │ -
45 return {};
│ │ │ │ -
46 }
│ │ │ │ -
47
│ │ │ │ -
48 // Try if tuple_size is implemented for class
│ │ │ │ -
49 template<class T>
│ │ │ │ -
50 constexpr auto staticSize(const T*, const PriorityTag<2>&)
│ │ │ │ -
51 -> decltype(std::integral_constant<std::size_t,std::tuple_size<T>::value>())
│ │ │ │ -
52 {
│ │ │ │ -
53 return {};
│ │ │ │ -
54 }
│ │ │ │ -
55
│ │ │ │ -
56 template<class T>
│ │ │ │ -
57 constexpr std::false_type hasStaticSize(const T* t, const PriorityTag<0>& p)
│ │ │ │ -
58 {
│ │ │ │ -
59 return {};
│ │ │ │ -
60 }
│ │ │ │ +
46template<class F, class... Args>
│ │ │ │ +
47static constexpr auto isCallable()
│ │ │ │ +
48{ return models<Concept::Callable<Args...>, F>(); }
│ │ │ │ +
49
│ │ │ │ +
56template<class F, class... Args>
│ │ │ │ +
57static constexpr auto isCallable(F&&, Args&&...)
│ │ │ │ +
58{
│ │ │ │ +
59 return models<Concept::Callable<Args&&...>, F>();
│ │ │ │ +
60}
│ │ │ │
61
│ │ │ │ -
62 template<class T>
│ │ │ │ -
63 constexpr auto hasStaticSize(const T* t, const PriorityTag<1>& p)
│ │ │ │ -
64 -> decltype(staticSize(t ,PriorityTag<42>()), std::true_type())
│ │ │ │ -
65 {
│ │ │ │ -
66 return {};
│ │ │ │ -
67 }
│ │ │ │ -
68
│ │ │ │ -
69}
│ │ │ │ -
70
│ │ │ │ -
71
│ │ │ │ -
72
│ │ │ │ -
80template<class T>
│ │ │ │ - │ │ │ │ -
82 public decltype(Imp::hasStaticSize((typename std::decay<T>::type*)(nullptr), PriorityTag<42>()))
│ │ │ │ -
83{};
│ │ │ │ -
84
│ │ │ │ +
62
│ │ │ │ +
63
│ │ │ │ +
64// Function concept ############################################################
│ │ │ │ +
65template<class Signature>
│ │ │ │ +
66struct Function;
│ │ │ │ +
67
│ │ │ │ +
76template<class Range, class Domain>
│ │ │ │ +
77struct Function<Range(Domain)> : Refines<Callable<Domain> >
│ │ │ │ +
78{
│ │ │ │ +
79 template<class F>
│ │ │ │ +
80 auto require(F&& f) -> decltype(
│ │ │ │ +
81 // F models Function<Range(Domain)> if the result of F(Domain) is implicitly convertible to Range
│ │ │ │ +
82 requireConvertible<Range>(f(std::declval<Domain>()))
│ │ │ │ +
83 );
│ │ │ │ +
84};
│ │ │ │
85
│ │ │ │ -
86
│ │ │ │ -
94template<class T>
│ │ │ │ -
95struct StaticSize :
│ │ │ │ -
96 public decltype(Imp::staticSize((typename std::decay<T>::type*)(nullptr), PriorityTag<42>()))
│ │ │ │ -
97{};
│ │ │ │ -
98
│ │ │ │ -
99
│ │ │ │ -
100
│ │ │ │ -
101}} // namespace Dune::Functions
│ │ │ │ -
102
│ │ │ │ -
103#endif // DUNE_FUNCTIONS_COMMON_TYPE_TRAITS_HH
│ │ │ │ -
typename std::enable_if< std::is_constructible< T, Args... >::value, int >::type enableIfConstructible
Helper to constrain forwarding constructors.
Definition: type_traits.hh:26
│ │ │ │ +
87template<class F, class Signature>
│ │ │ │ +
88static constexpr bool isFunction()
│ │ │ │ +
89{ return models<Concept::Function<Signature>, F>(); }
│ │ │ │ +
90
│ │ │ │ +
92template<class F, class Signature, template<class> class DerivativeTraits>
│ │ │ │ + │ │ │ │ +
94{ return models<Concept::Function<Signature>, F>(); }
│ │ │ │ +
95
│ │ │ │ +
96
│ │ │ │ +
97
│ │ │ │ +
98// DifferentiableFunction concept ##############################################
│ │ │ │ +
99template<class Signature, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ + │ │ │ │ +
101
│ │ │ │ +
113template<class Range, class Domain, template<class> class DerivativeTraits>
│ │ │ │ +
114struct DifferentiableFunction<Range(Domain), DerivativeTraits> : Refines<Dune::Functions::Concept::Function<Range(Domain)> >
│ │ │ │ +
115{
│ │ │ │ + │ │ │ │ +
117
│ │ │ │ +
118 template<class F>
│ │ │ │ +
119 auto require(F&& f) -> decltype(
│ │ │ │ +
120 derivative(f),
│ │ │ │ +
121 requireConcept<Function<DerivativeSignature>>(derivative(f))
│ │ │ │ +
122 );
│ │ │ │ +
123};
│ │ │ │ +
124
│ │ │ │ +
126template<class F, class Signature, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ +
127static constexpr bool isDifferentiableFunction()
│ │ │ │ +
128{ return models<Concept::DifferentiableFunction<Signature, DerivativeTraits>, F>(); }
│ │ │ │ +
129
│ │ │ │ +
131template<class F, class Signature, template<class> class DerivativeTraits>
│ │ │ │ + │ │ │ │ +
133{ return models<Concept::DifferentiableFunction<Signature, DerivativeTraits>, F>(); }
│ │ │ │ +
134
│ │ │ │ +
135
│ │ │ │ +
136
│ │ │ │ +
137// LocalFunction concept ##############################################
│ │ │ │ +
138template<class Signature, class LocalContext>
│ │ │ │ + │ │ │ │ +
140
│ │ │ │ +
150template<class Range, class Domain, class LocalContext>
│ │ │ │ +
151struct LocalFunction<Range(Domain), LocalContext> :
│ │ │ │ +
152 Refines<Dune::Functions::Concept::Function<Range(Domain)> >
│ │ │ │ +
153{
│ │ │ │ +
154 template<class F>
│ │ │ │ +
155 auto require(F&& f) -> decltype(
│ │ │ │ +
156 f.bind(std::declval<LocalContext>()),
│ │ │ │ +
157 f.unbind(),
│ │ │ │ +
158 requireConvertible<bool>(f.bound()),
│ │ │ │ +
159 f.localContext(),
│ │ │ │ +
160 requireConvertible<LocalContext>(f.localContext())
│ │ │ │ +
161 );
│ │ │ │ +
162};
│ │ │ │ +
163
│ │ │ │ +
165template<class F, class Signature, class LocalContext>
│ │ │ │ +
166static constexpr bool isLocalFunction()
│ │ │ │ +
167{ return models<Concept::LocalFunction<Signature, LocalContext>, F>(); }
│ │ │ │ +
168
│ │ │ │ +
169
│ │ │ │ +
170// DifferentiableLocalFunction concept ##############################################
│ │ │ │ +
171template<class Signature, class LocalContext, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ + │ │ │ │ +
173
│ │ │ │ +
186template<class Range, class Domain, class LocalContext, template<class> class DerivativeTraits>
│ │ │ │ +
187struct DifferentiableLocalFunction<Range(Domain), LocalContext, DerivativeTraits> :
│ │ │ │ +
188 Refines<
│ │ │ │ +
189 Dune::Functions::Concept::DifferentiableFunction<Range(Domain), DerivativeTraits>,
│ │ │ │ +
190 Dune::Functions::Concept::LocalFunction<Range(Domain),LocalContext>
│ │ │ │ +
191 >
│ │ │ │ +
192{
│ │ │ │ +
193 template<class F>
│ │ │ │ +
194 auto require(F&& f) -> decltype(
│ │ │ │ +
195 f.bind(std::declval<LocalContext>()),
│ │ │ │ +
196 f.unbind(),
│ │ │ │ +
197 f.localContext(),
│ │ │ │ +
198 requireConvertible<LocalContext>(f.localContext())
│ │ │ │ +
199 );
│ │ │ │ +
200};
│ │ │ │ +
201
│ │ │ │ +
203template<class F, class Signature, class LocalContext, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ +
204static constexpr bool isDifferentiableLocalFunction()
│ │ │ │ +
205{ return models<Concept::DifferentiableLocalFunction<Signature, LocalContext, DerivativeTraits>, F>(); }
│ │ │ │ +
206
│ │ │ │ +
207
│ │ │ │ +
208// EntitySet concept ##############################################
│ │ │ │ +
209
│ │ │ │ + │ │ │ │ +
220{
│ │ │ │ +
221 template<class E>
│ │ │ │ +
222 auto require(E&& f) -> decltype(
│ │ │ │ +
223 requireType<typename E::Element>(),
│ │ │ │ +
224 requireType<typename E::LocalCoordinate>(),
│ │ │ │ +
225 requireType<typename E::GlobalCoordinate>()
│ │ │ │ +
226 );
│ │ │ │ +
227};
│ │ │ │ +
228
│ │ │ │ +
230template<class E>
│ │ │ │ +
231static constexpr bool isEntitySet()
│ │ │ │ +
232{ return models<Concept::EntitySet, E>(); }
│ │ │ │ +
233
│ │ │ │ +
234
│ │ │ │ +
235
│ │ │ │ +
236// GridFunction concept ##############################################
│ │ │ │ +
237template<class Signature, class EntitySet>
│ │ │ │ + │ │ │ │ +
239
│ │ │ │ +
249template<class Range, class Domain, class EntitySet>
│ │ │ │ +
250struct GridFunction<Range(Domain), EntitySet> :
│ │ │ │ +
251 Refines<Dune::Functions::Concept::Function<Range(Domain)> >
│ │ │ │ +
252{
│ │ │ │ +
253 using LocalSignature = Range(typename EntitySet::LocalCoordinate);
│ │ │ │ +
254 using LocalContext = typename EntitySet::Element;
│ │ │ │ +
255
│ │ │ │ +
256 template<class F>
│ │ │ │ +
257 auto require(F&& f) -> decltype(
│ │ │ │ +
258 localFunction(f),
│ │ │ │ +
259 f.entitySet(),
│ │ │ │ +
260 requireConcept<LocalFunction<LocalSignature, LocalContext>>(localFunction(f)),
│ │ │ │ +
261 requireConcept<Concept::EntitySet, EntitySet>(),
│ │ │ │ +
262 requireConvertible<EntitySet>(f.entitySet()),
│ │ │ │ +
263 requireConvertible<typename EntitySet::GlobalCoordinate, Domain>()
│ │ │ │ +
264 );
│ │ │ │ +
265};
│ │ │ │ +
266
│ │ │ │ +
268template<class F, class Signature, class EntitySet>
│ │ │ │ +
269static constexpr bool isGridFunction()
│ │ │ │ +
270{ return models<Concept::GridFunction<Signature, EntitySet>, F>(); }
│ │ │ │ +
271
│ │ │ │ +
272
│ │ │ │ +
273// DifferentiableGridFunction concept ##############################################
│ │ │ │ +
274template<class Signature, class EntitySet, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ + │ │ │ │ +
276
│ │ │ │ +
289template<class Range, class Domain, class EntitySet, template<class> class DerivativeTraits>
│ │ │ │ +
290struct DifferentiableGridFunction<Range(Domain), EntitySet, DerivativeTraits> :
│ │ │ │ +
291 Refines<
│ │ │ │ +
292 Dune::Functions::Concept::DifferentiableFunction<Range(Domain), DerivativeTraits>,
│ │ │ │ +
293 Dune::Functions::Concept::GridFunction<Range(Domain),EntitySet>
│ │ │ │ +
294 >
│ │ │ │ +
295{
│ │ │ │ +
296 using LocalSignature = Range(typename EntitySet::LocalCoordinate);
│ │ │ │ +
297 using LocalContext = typename EntitySet::Element;
│ │ │ │ +
298
│ │ │ │ +
299 template<class R>
│ │ │ │ + │ │ │ │ +
301
│ │ │ │ +
302 template<class F>
│ │ │ │ +
303 auto require(F&& f) -> decltype(
│ │ │ │ +
304 requireConcept<DifferentiableLocalFunction<LocalSignature, LocalContext, LocalDerivativeTraits>>(localFunction(f))
│ │ │ │ +
305 );
│ │ │ │ +
306};
│ │ │ │ +
307
│ │ │ │ +
309template<class F, class Signature, class EntitySet, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ +
310static constexpr bool isDifferentiableGridFunction()
│ │ │ │ +
311{ return models<Concept::DifferentiableGridFunction<Signature, EntitySet, DerivativeTraits>, F>(); }
│ │ │ │ +
312
│ │ │ │ +
313
│ │ │ │ +
314
│ │ │ │ +
315// GridViewFunction concept ##############################################
│ │ │ │ +
316template<class Signature, class GridView>
│ │ │ │ + │ │ │ │ +
318
│ │ │ │ +
331template<class Range, class Domain, class GridView>
│ │ │ │ +
332struct GridViewFunction<Range(Domain), GridView> :
│ │ │ │ +
333 Refines<Dune::Functions::Concept::GridFunction<Range(Domain), GridViewEntitySet<GridView,0>>>
│ │ │ │ +
334{
│ │ │ │ +
335 template<class F>
│ │ │ │ +
336 auto require(F&& f) -> decltype(
│ │ │ │ +
337 0 // We don't need to check any further expressions, because a GridViewFunction is just a GridFunction with a special EntitySet
│ │ │ │ +
338 );
│ │ │ │ +
339};
│ │ │ │ +
340
│ │ │ │ +
342template<class F, class Signature, class GridView>
│ │ │ │ +
343static constexpr bool isGridViewFunction()
│ │ │ │ +
344{ return models<Concept::GridViewFunction<Signature, GridView>, F>(); }
│ │ │ │ +
345
│ │ │ │ +
346
│ │ │ │ +
347// DifferentiableGridViewFunction concept ##############################################
│ │ │ │ +
348template<class Signature, class GridView, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ + │ │ │ │ +
350
│ │ │ │ +
364template<class Range, class Domain, class GridView, template<class> class DerivativeTraits>
│ │ │ │ +
365struct DifferentiableGridViewFunction<Range(Domain), GridView, DerivativeTraits> :
│ │ │ │ +
366 Refines<Dune::Functions::Concept::DifferentiableGridFunction<Range(Domain), GridViewEntitySet<GridView,0>, DerivativeTraits>>
│ │ │ │ +
367{
│ │ │ │ +
368 template<class F>
│ │ │ │ +
369 auto require(F&& f) -> decltype(
│ │ │ │ +
370 0 // We don't need to check any further expressions, because a GridViewFunction is just a GridFunction with a special EntitySet
│ │ │ │ +
371 );
│ │ │ │ +
372};
│ │ │ │ +
373
│ │ │ │ +
375template<class F, class Signature, class GridView, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ +
376static constexpr bool isDifferentiableGridViewFunction()
│ │ │ │ +
377{ return models<Concept::DifferentiableGridViewFunction<Signature, GridView, DerivativeTraits>, F>(); }
│ │ │ │ +
378
│ │ │ │ +
379
│ │ │ │ +
380
│ │ │ │ +
381}}} // namespace Dune::Functions::Concept
│ │ │ │ +
382
│ │ │ │ +
383#endif // DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
static constexpr bool isGridFunction()
Check if F models the GridFunction concept with given signature and entity set.
Definition: functionconcepts.hh:269
│ │ │ │ +
static constexpr bool isDifferentiableLocalFunction()
Check if F models the DifferentiableLocalFunction concept with given signature and local context.
Definition: functionconcepts.hh:204
│ │ │ │ +
static constexpr bool isFunction()
Check if F models the Function concept with given signature.
Definition: functionconcepts.hh:88
│ │ │ │ +
static constexpr bool isDifferentiableGridViewFunction()
Check if F models the DifferentiableGridViewFunction concept with given signature.
Definition: functionconcepts.hh:376
│ │ │ │ +
static constexpr bool isDifferentiableFunction()
Check if F models the DifferentiableFunction concept with given signature.
Definition: functionconcepts.hh:127
│ │ │ │ +
static constexpr bool isGridViewFunction()
Check if F models the GridViewFunction concept with given signature.
Definition: functionconcepts.hh:343
│ │ │ │ +
static constexpr bool isEntitySet()
Check if F models the GridFunction concept with given signature and entity set.
Definition: functionconcepts.hh:231
│ │ │ │ +
static constexpr bool isDifferentiableGridFunction()
Check if F models the DifferentiableGridFunction concept with given signature and entity set.
Definition: functionconcepts.hh:310
│ │ │ │ +
static constexpr bool isLocalFunction()
Check if F models the LocalFunction concept with given signature and local context.
Definition: functionconcepts.hh:166
│ │ │ │ +
TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const TrigonometricFunction< K, sinFactor, cosFactor > &f)
Obtain derivative of TrigonometricFunction function.
Definition: trigonometricfunction.hh:39
│ │ │ │ +
static constexpr auto isCallable()
Check if f is callable with given argument list.
Definition: functionconcepts.hh:47
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
Check if type is a statically sized container.
Definition: type_traits.hh:83
│ │ │ │ -
Obtain size of statically sized container.
Definition: type_traits.hh:97
│ │ │ │ +
Default implementation for derivative traits.
Definition: defaultderivativetraits.hh:37
│ │ │ │ +
Concept objects that can be called with given argument list.
Definition: functionconcepts.hh:33
│ │ │ │ +
auto require(F &&f) -> decltype(f(std::declval< Args >()...))
│ │ │ │ +
Definition: functionconcepts.hh:66
│ │ │ │ +
auto require(F &&f) -> decltype(requireConvertible< Range >(f(std::declval< Domain >())))
│ │ │ │ +
Definition: functionconcepts.hh:100
│ │ │ │ +
typename SignatureTraits< Range(Domain)>::template DerivativeSignature< DerivativeTraits > DerivativeSignature
Definition: functionconcepts.hh:116
│ │ │ │ +
auto require(F &&f) -> decltype(derivative(f), requireConcept< Function< DerivativeSignature > >(derivative(f)))
│ │ │ │ +
Definition: functionconcepts.hh:139
│ │ │ │ +
auto require(F &&f) -> decltype(f.bind(std::declval< LocalContext >()), f.unbind(), requireConvertible< bool >(f.bound()), f.localContext(), requireConvertible< LocalContext >(f.localContext()))
│ │ │ │ + │ │ │ │ +
auto require(F &&f) -> decltype(f.bind(std::declval< LocalContext >()), f.unbind(), f.localContext(), requireConvertible< LocalContext >(f.localContext()))
│ │ │ │ +
Concept for an entity set for a Concept::GridFunction<Range(Domain), EntitySet, DerivativeTraits>
Definition: functionconcepts.hh:220
│ │ │ │ +
auto require(E &&f) -> decltype(requireType< typename E::Element >(), requireType< typename E::LocalCoordinate >(), requireType< typename E::GlobalCoordinate >())
│ │ │ │ +
Definition: functionconcepts.hh:238
│ │ │ │ +
typename EntitySet::Element LocalContext
Definition: functionconcepts.hh:254
│ │ │ │ +
Range(typename EntitySet::LocalCoordinate) LocalSignature
Definition: functionconcepts.hh:253
│ │ │ │ +
auto require(F &&f) -> decltype(localFunction(f), f.entitySet(), requireConcept< LocalFunction< LocalSignature, LocalContext > >(localFunction(f)), requireConcept< Concept::EntitySet, EntitySet >(), requireConvertible< EntitySet >(f.entitySet()), requireConvertible< typename EntitySet::GlobalCoordinate, Domain >())
│ │ │ │ +
Definition: functionconcepts.hh:275
│ │ │ │ +
typename Dune::Functions::LocalDerivativeTraits< EntitySet, DerivativeTraits >::template Traits< R > LocalDerivativeTraits
Definition: functionconcepts.hh:300
│ │ │ │ +
auto require(F &&f) -> decltype(requireConcept< DifferentiableLocalFunction< LocalSignature, LocalContext, LocalDerivativeTraits > >(localFunction(f)))
│ │ │ │ +
Range(typename EntitySet::LocalCoordinate) LocalSignature
Definition: functionconcepts.hh:296
│ │ │ │ +
typename EntitySet::Element LocalContext
Definition: functionconcepts.hh:297
│ │ │ │ +
Definition: functionconcepts.hh:317
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
Helper class to deduce the signature of a callable.
Definition: signature.hh:56
│ │ │ │ +
Definition: signature.hh:102
│ │ │ │ +
Derivative traits for local functions.
Definition: localderivativetraits.hh:28
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,108 +5,460 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -type_traits.hh │ │ │ │ │ +functionconcepts.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#ifndef DUNE_FUNCTIONS_COMMON_TYPE_TRAITS_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_COMMON_TYPE_TRAITS_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9 │ │ │ │ │ - 10namespace Dune { │ │ │ │ │ - 11namespace Functions { │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8 │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ 12 │ │ │ │ │ - 13 │ │ │ │ │ - 24template │ │ │ │ │ -25using enableIfConstructible = typename std::enable_if< │ │ │ │ │ - 26 std::is_constructible::value, int>::type; │ │ │ │ │ - 27 │ │ │ │ │ - 28 │ │ │ │ │ - 29 │ │ │ │ │ - 30namespace Imp { │ │ │ │ │ - 31 │ │ │ │ │ - 32 // As a last resort try if there's a static constexpr size() │ │ │ │ │ - 33 template │ │ │ │ │ - 34 constexpr auto staticSize(const T*, const PriorityTag<0>&) │ │ │ │ │ - 35 -> decltype(std::integral_constant()) │ │ │ │ │ - 36 { │ │ │ │ │ - 37 return {}; │ │ │ │ │ - 38 } │ │ │ │ │ + 13namespace Dune { │ │ │ │ │ + 14namespace Functions { │ │ │ │ │ + 15namespace Concept { │ │ │ │ │ + 16 │ │ │ │ │ + 17using namespace Dune::Concept; │ │ │ │ │ + 18 │ │ │ │ │ + 19 │ │ │ │ │ + 20 │ │ │ │ │ + 21// Callable concept │ │ │ │ │ +############################################################ │ │ │ │ │ + 22 │ │ │ │ │ + 23 │ │ │ │ │ + 31template │ │ │ │ │ +32struct Callable │ │ │ │ │ + 33{ │ │ │ │ │ + 34 template │ │ │ │ │ +35 auto require(F&& f) -> decltype( │ │ │ │ │ + 36 f(std::declval()...) │ │ │ │ │ + 37 ); │ │ │ │ │ + 38}; │ │ │ │ │ 39 │ │ │ │ │ - 40 // Try if class has constexpr default constructor and size method │ │ │ │ │ - 41 template │ │ │ │ │ - 42 constexpr auto staticSize(const T*, const PriorityTag<1>&) │ │ │ │ │ - 43 -> decltype(std::integral_constant()) │ │ │ │ │ - 44 { │ │ │ │ │ - 45 return {}; │ │ │ │ │ - 46 } │ │ │ │ │ - 47 │ │ │ │ │ - 48 // Try if tuple_size is implemented for class │ │ │ │ │ - 49 template │ │ │ │ │ - 50 constexpr auto staticSize(const T*, const PriorityTag<2>&) │ │ │ │ │ - 51 -> decltype(std::integral_constant::value> │ │ │ │ │ -()) │ │ │ │ │ - 52 { │ │ │ │ │ - 53 return {}; │ │ │ │ │ - 54 } │ │ │ │ │ - 55 │ │ │ │ │ - 56 template │ │ │ │ │ - 57 constexpr std::false_type hasStaticSize(const T* t, const PriorityTag<0>& │ │ │ │ │ -p) │ │ │ │ │ - 58 { │ │ │ │ │ - 59 return {}; │ │ │ │ │ - 60 } │ │ │ │ │ + 46template │ │ │ │ │ +47static constexpr auto isCallable() │ │ │ │ │ + 48{ return models, F>(); } │ │ │ │ │ + 49 │ │ │ │ │ + 56template │ │ │ │ │ +57static constexpr auto isCallable(F&&, Args&&...) │ │ │ │ │ + 58{ │ │ │ │ │ + 59 return models, F>(); │ │ │ │ │ + 60} │ │ │ │ │ 61 │ │ │ │ │ - 62 template │ │ │ │ │ - 63 constexpr auto hasStaticSize(const T* t, const PriorityTag<1>& p) │ │ │ │ │ - 64 -> decltype(staticSize(t ,PriorityTag<42>()), std::true_type()) │ │ │ │ │ - 65 { │ │ │ │ │ - 66 return {}; │ │ │ │ │ - 67 } │ │ │ │ │ - 68 │ │ │ │ │ - 69} │ │ │ │ │ - 70 │ │ │ │ │ - 71 │ │ │ │ │ - 72 │ │ │ │ │ - 80template │ │ │ │ │ -81struct HasStaticSize : │ │ │ │ │ - 82 public decltype(Imp::hasStaticSize((typename std::decay::type*) │ │ │ │ │ -(nullptr), PriorityTag<42>())) │ │ │ │ │ - 83{}; │ │ │ │ │ - 84 │ │ │ │ │ + 62 │ │ │ │ │ + 63 │ │ │ │ │ + 64// Function concept │ │ │ │ │ +############################################################ │ │ │ │ │ + 65template │ │ │ │ │ +66struct Function; │ │ │ │ │ + 67 │ │ │ │ │ + 76template │ │ │ │ │ +77struct Function : Refines > │ │ │ │ │ + 78{ │ │ │ │ │ + 79 template │ │ │ │ │ +80 auto require(F&& f) -> decltype( │ │ │ │ │ + 81 // F models Function if the result of F(Domain) is │ │ │ │ │ +implicitly convertible to Range │ │ │ │ │ + 82 requireConvertible(f(std::declval())) │ │ │ │ │ + 83 ); │ │ │ │ │ + 84}; │ │ │ │ │ 85 │ │ │ │ │ - 86 │ │ │ │ │ - 94template │ │ │ │ │ -95struct StaticSize : │ │ │ │ │ - 96 public decltype(Imp::staticSize((typename std::decay::type*)(nullptr), │ │ │ │ │ -PriorityTag<42>())) │ │ │ │ │ - 97{}; │ │ │ │ │ - 98 │ │ │ │ │ - 99 │ │ │ │ │ - 100 │ │ │ │ │ - 101}} // namespace Dune::Functions │ │ │ │ │ - 102 │ │ │ │ │ - 103#endif // DUNE_FUNCTIONS_COMMON_TYPE_TRAITS_HH │ │ │ │ │ -Dune::Functions::enableIfConstructible │ │ │ │ │ -typename std::enable_if< std::is_constructible< T, Args... >::value, int >:: │ │ │ │ │ -type enableIfConstructible │ │ │ │ │ -Helper to constrain forwarding constructors. │ │ │ │ │ -Definition: type_traits.hh:26 │ │ │ │ │ + 87template │ │ │ │ │ +88static constexpr bool isFunction() │ │ │ │ │ + 89{ return models, F>(); } │ │ │ │ │ + 90 │ │ │ │ │ + 92template class DerivativeTraits> │ │ │ │ │ +93static constexpr bool isFunction(F&& f, SignatureTag) │ │ │ │ │ + 94{ return models, F>(); } │ │ │ │ │ + 95 │ │ │ │ │ + 96 │ │ │ │ │ + 97 │ │ │ │ │ + 98// DifferentiableFunction concept │ │ │ │ │ +############################################## │ │ │ │ │ + 99template class DerivativeTraits = │ │ │ │ │ +DefaultDerivativeTraits> │ │ │ │ │ +100struct DifferentiableFunction; │ │ │ │ │ + 101 │ │ │ │ │ + 113template class DerivativeTraits> │ │ │ │ │ +114struct DifferentiableFunction : │ │ │ │ │ +Refines > │ │ │ │ │ + 115{ │ │ │ │ │ +116 using DerivativeSignature = typename SignatureTraits:: │ │ │ │ │ +template DerivativeSignature; │ │ │ │ │ + 117 │ │ │ │ │ + 118 template │ │ │ │ │ +119 auto require(F&& f) -> decltype( │ │ │ │ │ + 120 derivative(f), │ │ │ │ │ + 121 requireConcept>(derivative(f)) │ │ │ │ │ + 122 ); │ │ │ │ │ + 123}; │ │ │ │ │ + 124 │ │ │ │ │ + 126template class DerivativeTraits = │ │ │ │ │ +DefaultDerivativeTraits> │ │ │ │ │ +127static constexpr bool isDifferentiableFunction() │ │ │ │ │ + 128{ return models, F>(); } │ │ │ │ │ + 129 │ │ │ │ │ + 131template class DerivativeTraits> │ │ │ │ │ +132static constexpr bool isDifferentiableFunction(F&& f, │ │ │ │ │ +SignatureTag) │ │ │ │ │ + 133{ return models, F>(); } │ │ │ │ │ + 134 │ │ │ │ │ + 135 │ │ │ │ │ + 136 │ │ │ │ │ + 137// LocalFunction concept ############################################## │ │ │ │ │ + 138template │ │ │ │ │ +139struct LocalFunction; │ │ │ │ │ + 140 │ │ │ │ │ + 150template │ │ │ │ │ +151struct LocalFunction : │ │ │ │ │ + 152 Refines > │ │ │ │ │ + 153{ │ │ │ │ │ + 154 template │ │ │ │ │ +155 auto require(F&& f) -> decltype( │ │ │ │ │ + 156 f.bind(std::declval()), │ │ │ │ │ + 157 f.unbind(), │ │ │ │ │ + 158 requireConvertible(f.bound()), │ │ │ │ │ + 159 f.localContext(), │ │ │ │ │ + 160 requireConvertible(f.localContext()) │ │ │ │ │ + 161 ); │ │ │ │ │ + 162}; │ │ │ │ │ + 163 │ │ │ │ │ + 165template │ │ │ │ │ +166static constexpr bool isLocalFunction() │ │ │ │ │ + 167{ return models, F>(); } │ │ │ │ │ + 168 │ │ │ │ │ + 169 │ │ │ │ │ + 170// DifferentiableLocalFunction concept │ │ │ │ │ +############################################## │ │ │ │ │ + 171template class │ │ │ │ │ +DerivativeTraits = DefaultDerivativeTraits> │ │ │ │ │ +172struct DifferentiableLocalFunction; │ │ │ │ │ + 173 │ │ │ │ │ + 186template │ │ │ │ │ +class DerivativeTraits> │ │ │ │ │ +187struct DifferentiableLocalFunction : │ │ │ │ │ + 188 Refines< │ │ │ │ │ + 189 Dune::Functions::Concept::DifferentiableFunction, │ │ │ │ │ + 190 Dune::Functions::Concept::LocalFunction │ │ │ │ │ + 191 > │ │ │ │ │ + 192{ │ │ │ │ │ + 193 template │ │ │ │ │ +194 auto require(F&& f) -> decltype( │ │ │ │ │ + 195 f.bind(std::declval()), │ │ │ │ │ + 196 f.unbind(), │ │ │ │ │ + 197 f.localContext(), │ │ │ │ │ + 198 requireConvertible(f.localContext()) │ │ │ │ │ + 199 ); │ │ │ │ │ + 200}; │ │ │ │ │ + 201 │ │ │ │ │ + 203template │ │ │ │ │ +class DerivativeTraits = DefaultDerivativeTraits> │ │ │ │ │ +204static constexpr bool isDifferentiableLocalFunction() │ │ │ │ │ + 205{ return models, F>(); } │ │ │ │ │ + 206 │ │ │ │ │ + 207 │ │ │ │ │ + 208// EntitySet concept ############################################## │ │ │ │ │ + 209 │ │ │ │ │ +219struct EntitySet │ │ │ │ │ + 220{ │ │ │ │ │ + 221 template │ │ │ │ │ +222 auto require(E&& f) -> decltype( │ │ │ │ │ + 223 requireType(), │ │ │ │ │ + 224 requireType(), │ │ │ │ │ + 225 requireType() │ │ │ │ │ + 226 ); │ │ │ │ │ + 227}; │ │ │ │ │ + 228 │ │ │ │ │ + 230template │ │ │ │ │ +231static constexpr bool isEntitySet() │ │ │ │ │ + 232{ return models(); } │ │ │ │ │ + 233 │ │ │ │ │ + 234 │ │ │ │ │ + 235 │ │ │ │ │ + 236// GridFunction concept ############################################## │ │ │ │ │ + 237template │ │ │ │ │ +238struct GridFunction; │ │ │ │ │ + 239 │ │ │ │ │ + 249template │ │ │ │ │ +250struct GridFunction : │ │ │ │ │ + 251 Refines > │ │ │ │ │ + 252{ │ │ │ │ │ +253 using LocalSignature = Range(typename EntitySet::LocalCoordinate); │ │ │ │ │ +254 using LocalContext = typename EntitySet::Element; │ │ │ │ │ + 255 │ │ │ │ │ + 256 template │ │ │ │ │ +257 auto require(F&& f) -> decltype( │ │ │ │ │ + 258 localFunction(f), │ │ │ │ │ + 259 f.entitySet(), │ │ │ │ │ + 260 requireConcept>(localFunction │ │ │ │ │ +(f)), │ │ │ │ │ + 261 requireConcept(), │ │ │ │ │ + 262 requireConvertible(f.entitySet()), │ │ │ │ │ + 263 requireConvertible() │ │ │ │ │ + 264 ); │ │ │ │ │ + 265}; │ │ │ │ │ + 266 │ │ │ │ │ + 268template │ │ │ │ │ +269static constexpr bool isGridFunction() │ │ │ │ │ + 270{ return models, F>(); } │ │ │ │ │ + 271 │ │ │ │ │ + 272 │ │ │ │ │ + 273// DifferentiableGridFunction concept │ │ │ │ │ +############################################## │ │ │ │ │ + 274template class │ │ │ │ │ +DerivativeTraits = DefaultDerivativeTraits> │ │ │ │ │ +275struct DifferentiableGridFunction; │ │ │ │ │ + 276 │ │ │ │ │ + 289template class │ │ │ │ │ +DerivativeTraits> │ │ │ │ │ +290struct DifferentiableGridFunction : │ │ │ │ │ + 291 Refines< │ │ │ │ │ + 292 Dune::Functions::Concept::DifferentiableFunction, │ │ │ │ │ + 293 Dune::Functions::Concept::GridFunction │ │ │ │ │ + 294 > │ │ │ │ │ + 295{ │ │ │ │ │ +296 using LocalSignature = Range(typename EntitySet::LocalCoordinate); │ │ │ │ │ +297 using LocalContext = typename EntitySet::Element; │ │ │ │ │ + 298 │ │ │ │ │ + 299 template │ │ │ │ │ +300 using LocalDerivativeTraits = typename Dune::Functions:: │ │ │ │ │ +LocalDerivativeTraits::template Traits; │ │ │ │ │ + 301 │ │ │ │ │ + 302 template │ │ │ │ │ +303 auto require(F&& f) -> decltype( │ │ │ │ │ + 304 requireConcept>(localFunction(f)) │ │ │ │ │ + 305 ); │ │ │ │ │ + 306}; │ │ │ │ │ + 307 │ │ │ │ │ + 309template class │ │ │ │ │ +DerivativeTraits = DefaultDerivativeTraits> │ │ │ │ │ +310static constexpr bool isDifferentiableGridFunction() │ │ │ │ │ + 311{ return models, F>(); } │ │ │ │ │ + 312 │ │ │ │ │ + 313 │ │ │ │ │ + 314 │ │ │ │ │ + 315// GridViewFunction concept ############################################## │ │ │ │ │ + 316template │ │ │ │ │ +317struct GridViewFunction; │ │ │ │ │ + 318 │ │ │ │ │ + 331template │ │ │ │ │ +332struct GridViewFunction : │ │ │ │ │ + 333 Refines>> │ │ │ │ │ + 334{ │ │ │ │ │ + 335 template │ │ │ │ │ +336 auto require(F&& f) -> decltype( │ │ │ │ │ + 337 0 // We don't need to check any further expressions, because a │ │ │ │ │ +GridViewFunction is just a GridFunction with a special EntitySet │ │ │ │ │ + 338 ); │ │ │ │ │ + 339}; │ │ │ │ │ + 340 │ │ │ │ │ + 342template │ │ │ │ │ +343static constexpr bool isGridViewFunction() │ │ │ │ │ + 344{ return models, F>(); } │ │ │ │ │ + 345 │ │ │ │ │ + 346 │ │ │ │ │ + 347// DifferentiableGridViewFunction concept │ │ │ │ │ +############################################## │ │ │ │ │ + 348template class │ │ │ │ │ +DerivativeTraits = DefaultDerivativeTraits> │ │ │ │ │ +349struct DifferentiableGridViewFunction; │ │ │ │ │ + 350 │ │ │ │ │ + 364template class │ │ │ │ │ +DerivativeTraits> │ │ │ │ │ +365struct DifferentiableGridViewFunction : │ │ │ │ │ + 366 Refines, DerivativeTraits>> │ │ │ │ │ + 367{ │ │ │ │ │ + 368 template │ │ │ │ │ +369 auto require(F&& f) -> decltype( │ │ │ │ │ + 370 0 // We don't need to check any further expressions, because a │ │ │ │ │ +GridViewFunction is just a GridFunction with a special EntitySet │ │ │ │ │ + 371 ); │ │ │ │ │ + 372}; │ │ │ │ │ + 373 │ │ │ │ │ + 375template class │ │ │ │ │ +DerivativeTraits = DefaultDerivativeTraits> │ │ │ │ │ +376static constexpr bool isDifferentiableGridViewFunction() │ │ │ │ │ + 377{ return models, F>(); } │ │ │ │ │ + 378 │ │ │ │ │ + 379 │ │ │ │ │ + 380 │ │ │ │ │ + 381}}} // namespace Dune::Functions::Concept │ │ │ │ │ + 382 │ │ │ │ │ + 383#endif // DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH │ │ │ │ │ +signature.hh │ │ │ │ │ +gridviewentityset.hh │ │ │ │ │ +localderivativetraits.hh │ │ │ │ │ +Dune::Functions::Concept::isGridFunction │ │ │ │ │ +static constexpr bool isGridFunction() │ │ │ │ │ +Check if F models the GridFunction concept with given signature and entity set. │ │ │ │ │ +Definition: functionconcepts.hh:269 │ │ │ │ │ +Dune::Functions::Concept::isDifferentiableLocalFunction │ │ │ │ │ +static constexpr bool isDifferentiableLocalFunction() │ │ │ │ │ +Check if F models the DifferentiableLocalFunction concept with given signature │ │ │ │ │ +and local context. │ │ │ │ │ +Definition: functionconcepts.hh:204 │ │ │ │ │ +Dune::Functions::Concept::isFunction │ │ │ │ │ +static constexpr bool isFunction() │ │ │ │ │ +Check if F models the Function concept with given signature. │ │ │ │ │ +Definition: functionconcepts.hh:88 │ │ │ │ │ +Dune::Functions::Concept::isDifferentiableGridViewFunction │ │ │ │ │ +static constexpr bool isDifferentiableGridViewFunction() │ │ │ │ │ +Check if F models the DifferentiableGridViewFunction concept with given │ │ │ │ │ +signature. │ │ │ │ │ +Definition: functionconcepts.hh:376 │ │ │ │ │ +Dune::Functions::Concept::isDifferentiableFunction │ │ │ │ │ +static constexpr bool isDifferentiableFunction() │ │ │ │ │ +Check if F models the DifferentiableFunction concept with given signature. │ │ │ │ │ +Definition: functionconcepts.hh:127 │ │ │ │ │ +Dune::Functions::Concept::isGridViewFunction │ │ │ │ │ +static constexpr bool isGridViewFunction() │ │ │ │ │ +Check if F models the GridViewFunction concept with given signature. │ │ │ │ │ +Definition: functionconcepts.hh:343 │ │ │ │ │ +Dune::Functions::Concept::isEntitySet │ │ │ │ │ +static constexpr bool isEntitySet() │ │ │ │ │ +Check if F models the GridFunction concept with given signature and entity set. │ │ │ │ │ +Definition: functionconcepts.hh:231 │ │ │ │ │ +Dune::Functions::Concept::isDifferentiableGridFunction │ │ │ │ │ +static constexpr bool isDifferentiableGridFunction() │ │ │ │ │ +Check if F models the DifferentiableGridFunction concept with given signature │ │ │ │ │ +and entity set. │ │ │ │ │ +Definition: functionconcepts.hh:310 │ │ │ │ │ +Dune::Functions::Concept::isLocalFunction │ │ │ │ │ +static constexpr bool isLocalFunction() │ │ │ │ │ +Check if F models the LocalFunction concept with given signature and local │ │ │ │ │ +context. │ │ │ │ │ +Definition: functionconcepts.hh:166 │ │ │ │ │ +Dune::Functions::derivative │ │ │ │ │ +TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const │ │ │ │ │ +TrigonometricFunction< K, sinFactor, cosFactor > &f) │ │ │ │ │ +Obtain derivative of TrigonometricFunction function. │ │ │ │ │ +Definition: trigonometricfunction.hh:39 │ │ │ │ │ +Dune::Functions::Concept::isCallable │ │ │ │ │ +static constexpr auto isCallable() │ │ │ │ │ +Check if f is callable with given argument list. │ │ │ │ │ +Definition: functionconcepts.hh:47 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::HasStaticSize │ │ │ │ │ -Check if type is a statically sized container. │ │ │ │ │ -Definition: type_traits.hh:83 │ │ │ │ │ -Dune::Functions::StaticSize │ │ │ │ │ -Obtain size of statically sized container. │ │ │ │ │ -Definition: type_traits.hh:97 │ │ │ │ │ +Dune::Functions::DefaultDerivativeTraits │ │ │ │ │ +Default implementation for derivative traits. │ │ │ │ │ +Definition: defaultderivativetraits.hh:37 │ │ │ │ │ +Dune::Functions::Concept::Callable │ │ │ │ │ +Concept objects that can be called with given argument list. │ │ │ │ │ +Definition: functionconcepts.hh:33 │ │ │ │ │ +Dune::Functions::Concept::Callable::require │ │ │ │ │ +auto require(F &&f) -> decltype(f(std::declval< Args >()...)) │ │ │ │ │ +Dune::Functions::Concept::Function │ │ │ │ │ +Definition: functionconcepts.hh:66 │ │ │ │ │ +Dune::Functions::Concept::Function<_Range(Domain)>::require │ │ │ │ │ +auto require(F &&f) -> decltype(requireConvertible< Range >(f(std::declval< │ │ │ │ │ +Domain >()))) │ │ │ │ │ +Dune::Functions::Concept::DifferentiableFunction │ │ │ │ │ +Definition: functionconcepts.hh:100 │ │ │ │ │ +Dune::Functions::Concept::DifferentiableFunction<_Range(Domain), │ │ │ │ │ +DerivativeTraits_>::DerivativeSignature │ │ │ │ │ +typename SignatureTraits< Range(Domain)>::template DerivativeSignature< │ │ │ │ │ +DerivativeTraits > DerivativeSignature │ │ │ │ │ +Definition: functionconcepts.hh:116 │ │ │ │ │ +Dune::Functions::Concept::DifferentiableFunction<_Range(Domain), │ │ │ │ │ +DerivativeTraits_>::require │ │ │ │ │ +auto require(F &&f) -> decltype(derivative(f), requireConcept< Function< │ │ │ │ │ +DerivativeSignature > >(derivative(f))) │ │ │ │ │ +Dune::Functions::Concept::LocalFunction │ │ │ │ │ +Definition: functionconcepts.hh:139 │ │ │ │ │ +Dune::Functions::Concept::LocalFunction<_Range(Domain),_LocalContext_>::require │ │ │ │ │ +auto require(F &&f) -> decltype(f.bind(std::declval< LocalContext >()), │ │ │ │ │ +f.unbind(), requireConvertible< bool >(f.bound()), f.localContext(), │ │ │ │ │ +requireConvertible< LocalContext >(f.localContext())) │ │ │ │ │ +Dune::Functions::Concept::DifferentiableLocalFunction │ │ │ │ │ +Definition: functionconcepts.hh:172 │ │ │ │ │ +Dune::Functions::Concept::DifferentiableLocalFunction<_Range(Domain), │ │ │ │ │ +LocalContext,_DerivativeTraits_>::require │ │ │ │ │ +auto require(F &&f) -> decltype(f.bind(std::declval< LocalContext >()), │ │ │ │ │ +f.unbind(), f.localContext(), requireConvertible< LocalContext >(f.localContext │ │ │ │ │ +())) │ │ │ │ │ +Dune::Functions::Concept::EntitySet │ │ │ │ │ +Concept for an entity set for a Concept::GridFunction │ │ │ │ │ +Definition: functionconcepts.hh:220 │ │ │ │ │ +Dune::Functions::Concept::EntitySet::require │ │ │ │ │ +auto require(E &&f) -> decltype(requireType< typename E::Element >(), │ │ │ │ │ +requireType< typename E::LocalCoordinate >(), requireType< typename E:: │ │ │ │ │ +GlobalCoordinate >()) │ │ │ │ │ +Dune::Functions::Concept::GridFunction │ │ │ │ │ +Definition: functionconcepts.hh:238 │ │ │ │ │ +Dune::Functions::Concept::GridFunction<_Range(Domain),_EntitySet_>:: │ │ │ │ │ +LocalContext │ │ │ │ │ +typename EntitySet::Element LocalContext │ │ │ │ │ +Definition: functionconcepts.hh:254 │ │ │ │ │ +Dune::Functions::Concept::GridFunction<_Range(Domain),_EntitySet_>:: │ │ │ │ │ +LocalSignature │ │ │ │ │ +Range(typename EntitySet::LocalCoordinate) LocalSignature │ │ │ │ │ +Definition: functionconcepts.hh:253 │ │ │ │ │ +Dune::Functions::Concept::GridFunction<_Range(Domain),_EntitySet_>::require │ │ │ │ │ +auto require(F &&f) -> decltype(localFunction(f), f.entitySet(), │ │ │ │ │ +requireConcept< LocalFunction< LocalSignature, LocalContext > >(localFunction │ │ │ │ │ +(f)), requireConcept< Concept::EntitySet, EntitySet >(), requireConvertible< │ │ │ │ │ +EntitySet >(f.entitySet()), requireConvertible< typename EntitySet:: │ │ │ │ │ +GlobalCoordinate, Domain >()) │ │ │ │ │ +Dune::Functions::Concept::DifferentiableGridFunction │ │ │ │ │ +Definition: functionconcepts.hh:275 │ │ │ │ │ +Dune::Functions::Concept::DifferentiableGridFunction<_Range(Domain),_EntitySet, │ │ │ │ │ +DerivativeTraits_>::LocalDerivativeTraits │ │ │ │ │ +typename Dune::Functions::LocalDerivativeTraits< EntitySet, DerivativeTraits │ │ │ │ │ +>::template Traits< R > LocalDerivativeTraits │ │ │ │ │ +Definition: functionconcepts.hh:300 │ │ │ │ │ +Dune::Functions::Concept::DifferentiableGridFunction<_Range(Domain),_EntitySet, │ │ │ │ │ +DerivativeTraits_>::require │ │ │ │ │ +auto require(F &&f) -> decltype(requireConcept< DifferentiableLocalFunction< │ │ │ │ │ +LocalSignature, LocalContext, LocalDerivativeTraits > >(localFunction(f))) │ │ │ │ │ +Dune::Functions::Concept::DifferentiableGridFunction<_Range(Domain),_EntitySet, │ │ │ │ │ +DerivativeTraits_>::LocalSignature │ │ │ │ │ +Range(typename EntitySet::LocalCoordinate) LocalSignature │ │ │ │ │ +Definition: functionconcepts.hh:296 │ │ │ │ │ +Dune::Functions::Concept::DifferentiableGridFunction<_Range(Domain),_EntitySet, │ │ │ │ │ +DerivativeTraits_>::LocalContext │ │ │ │ │ +typename EntitySet::Element LocalContext │ │ │ │ │ +Definition: functionconcepts.hh:297 │ │ │ │ │ +Dune::Functions::Concept::GridViewFunction │ │ │ │ │ +Definition: functionconcepts.hh:317 │ │ │ │ │ +Dune::Functions::Concept::GridViewFunction<_Range(Domain),_GridView_>::require │ │ │ │ │ +auto require(F &&f) -> decltype(0) │ │ │ │ │ +Dune::Functions::Concept::DifferentiableGridViewFunction │ │ │ │ │ +Definition: functionconcepts.hh:349 │ │ │ │ │ +Dune::Functions::Concept::DifferentiableGridViewFunction<_Range(Domain), │ │ │ │ │ +GridView,_DerivativeTraits_>::require │ │ │ │ │ +auto require(F &&f) -> decltype(0) │ │ │ │ │ +Dune::Functions::SignatureTraits │ │ │ │ │ +Helper class to deduce the signature of a callable. │ │ │ │ │ +Definition: signature.hh:56 │ │ │ │ │ +Dune::Functions::SignatureTag │ │ │ │ │ +Definition: signature.hh:102 │ │ │ │ │ +Dune::Functions::LocalDerivativeTraits │ │ │ │ │ +Derivative traits for local functions. │ │ │ │ │ +Definition: localderivativetraits.hh:28 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00008.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: differentiablefunction_imp.hh File Reference │ │ │ │ +dune-functions: referencehelper.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,30 +63,53 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Namespaces
│ │ │ │ -
differentiablefunction_imp.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Typedefs | │ │ │ │ +Functions | │ │ │ │ +Variables
│ │ │ │ +
referencehelper.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/common/concept.hh>
│ │ │ │ -#include <dune/functions/common/type_traits.hh>
│ │ │ │ +
#include <type_traits>
│ │ │ │ +#include <dune/common/referencehelper.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Typedefs

template<class T >
using Dune::Functions::ResolveRef_t = Dune::ResolveRef_t< T >
 This is an alias for Dune::ResolveRef_t. More...
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Functions

template<class T >
decltype(auto) Dune::Functions::resolveRef (T &&t)
 This is an alias for Dune::resolveRef. More...
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Variables

template<class T >
constexpr bool Dune::Functions::IsReferenceWrapper_v = Dune::IsReferenceWrapper_v<T>
 This is an alias for Dune::IsReferenceWrapper_v. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,21 +5,36 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -Namespaces │ │ │ │ │ -differentiablefunction_imp.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Namespaces | Typedefs | Functions | Variables │ │ │ │ │ +referencehelper.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ + Typedefs │ │ │ │ │ +template │ │ │ │ │ +using Dune::Functions::ResolveRef_t = Dune::ResolveRef_t< T > │ │ │ │ │ +  This is an alias for Dune::ResolveRef_t. More... │ │ │ │ │ +  │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +decltype(auto) Dune::Functions::resolveRef (T &&t) │ │ │ │ │ +  This is an alias for Dune::resolveRef. More... │ │ │ │ │ +  │ │ │ │ │ + Variables │ │ │ │ │ +template │ │ │ │ │ +constexpr bool Dune::Functions::IsReferenceWrapper_v = Dune:: │ │ │ │ │ + IsReferenceWrapper_v │ │ │ │ │ +  This is an alias for Dune::IsReferenceWrapper_v. More... │ │ │ │ │ +  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00008_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: differentiablefunction_imp.hh Source File │ │ │ │ +dune-functions: referencehelper.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,116 +62,65 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
differentiablefunction_imp.hh
│ │ │ │ +
referencehelper.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#ifndef DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_IMP_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_IMP_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_COMMON_REFERENCE_HELPER_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_COMMON_REFERENCE_HELPER_HH
│ │ │ │
5
│ │ │ │ -
6#include <dune/common/exceptions.hh>
│ │ │ │ -
7#include <dune/common/concept.hh>
│ │ │ │ -
8
│ │ │ │ - │ │ │ │ -
10
│ │ │ │ +
6#warning The header dune/functions/common/referencehelper.hh is deprecated and will be removed after release 2.9. Include dune/common/referencehelper.hh instead.
│ │ │ │ +
7
│ │ │ │ +
8#include <type_traits>
│ │ │ │ +
9
│ │ │ │ +
10#include <dune/common/referencehelper.hh>
│ │ │ │
11
│ │ │ │ -
12namespace Dune {
│ │ │ │ -
13namespace Functions {
│ │ │ │ -
14namespace Imp {
│ │ │ │ -
15
│ │ │ │ -
19struct HasFreeDerivative
│ │ │ │ -
20{
│ │ │ │ -
21 template<class F>
│ │ │ │ -
22 auto require(F&& f) -> decltype(
│ │ │ │ -
23 derivative(f)
│ │ │ │ -
24 );
│ │ │ │ -
25};
│ │ │ │ -
26
│ │ │ │ +
12
│ │ │ │ +
13
│ │ │ │ +
14
│ │ │ │ +
15namespace Dune {
│ │ │ │ +
16namespace Functions {
│ │ │ │ +
17
│ │ │ │ +
18
│ │ │ │ +
23template<class T>
│ │ │ │ +
24[[deprecated("Use Dune::IsReferenceWrapper_v instead. Will be removed after release 2.9.")]]
│ │ │ │ +
25constexpr bool
│ │ │ │ +
26IsReferenceWrapper_v = Dune::IsReferenceWrapper_v<T>;
│ │ │ │
27
│ │ │ │
28
│ │ │ │ -
29template<class Dummy, class F,
│ │ │ │ -
30 typename std::enable_if<
│ │ │ │ -
31 models< HasFreeDerivative, F>() , int>::type = 0>
│ │ │ │ -
32auto derivativeIfImplemented(const F& f) -> decltype(derivative(f))
│ │ │ │ -
33{
│ │ │ │ -
34 return derivative(f);
│ │ │ │ -
35}
│ │ │ │ -
36
│ │ │ │ -
37
│ │ │ │ -
38
│ │ │ │ -
39template<class Dummy, class F,
│ │ │ │ -
40 typename std::enable_if<
│ │ │ │ -
41 not(models< HasFreeDerivative, F>()) , int>::type = 0>
│ │ │ │ -
42Dummy derivativeIfImplemented(const F& f)
│ │ │ │ -
43{
│ │ │ │ -
44 DUNE_THROW(Dune::NotImplemented, "Derivative not implemented");
│ │ │ │ -
45}
│ │ │ │ -
46
│ │ │ │ -
47
│ │ │ │ -
48
│ │ │ │ -
49template<class Signature, class DerivativeInterface>
│ │ │ │ -
50class DifferentiableFunctionWrapperInterface
│ │ │ │ -
51{};
│ │ │ │ -
52
│ │ │ │ -
53// Interface of type erasure wrapper
│ │ │ │ -
54//
│ │ │ │ -
55// Notice that the basic interface of polymorphic classes (destructor, clone, ...)
│ │ │ │ -
56// will be added by the type erasure foundation classes.
│ │ │ │ -
57template<class Range, class Domain, class DerivativeInterface>
│ │ │ │ -
58class DifferentiableFunctionWrapperInterface<Range(Domain), DerivativeInterface>
│ │ │ │ -
59{
│ │ │ │ -
60public:
│ │ │ │ -
61 virtual Range operator() (const Domain& x) const = 0;
│ │ │ │ -
62
│ │ │ │ -
63 virtual DerivativeInterface derivative() const = 0;
│ │ │ │ -
64};
│ │ │ │ -
65
│ │ │ │ -
66
│ │ │ │ -
67
│ │ │ │ -
68template<class Signature, class DerivativeInterface, class B>
│ │ │ │ -
69class DifferentiableFunctionWrapperImplementation
│ │ │ │ -
70{};
│ │ │ │ -
71
│ │ │ │ -
72// Implementation of type erasure wrapper
│ │ │ │ -
73template<class Range, class Domain, class DerivativeInterface, class B>
│ │ │ │ -
74class DifferentiableFunctionWrapperImplementation< Range(Domain), DerivativeInterface, B> :
│ │ │ │ -
75 public B
│ │ │ │ -
76{
│ │ │ │ -
77public:
│ │ │ │ -
78
│ │ │ │ -
79 using B::B;
│ │ │ │ -
80 using Wrapped = typename B::Wrapped;
│ │ │ │ -
81
│ │ │ │ -
82 virtual Range operator() (const Domain& x) const
│ │ │ │ -
83 {
│ │ │ │ -
84 return this->get()(x);
│ │ │ │ -
85 }
│ │ │ │ -
86
│ │ │ │ -
87 virtual DerivativeInterface derivative() const
│ │ │ │ -
88 {
│ │ │ │ -
89 return derivativeIfImplemented<DerivativeInterface, Wrapped>(this->get());
│ │ │ │ -
90 }
│ │ │ │ -
91};
│ │ │ │ -
92
│ │ │ │ -
93
│ │ │ │ -
94
│ │ │ │ -
95}}} // namespace Dune::Functions::Imp
│ │ │ │ -
96
│ │ │ │ -
97
│ │ │ │ -
98
│ │ │ │ -
99#endif // DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_IMP_HH
│ │ │ │ - │ │ │ │ -
TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const TrigonometricFunction< K, sinFactor, cosFactor > &f)
Obtain derivative of TrigonometricFunction function.
Definition: trigonometricfunction.hh:39
│ │ │ │ +
33template<class T>
│ │ │ │ +
34decltype(auto)
│ │ │ │ + │ │ │ │ +
36[[deprecated("Use Dune::resolveRef instead. Will be removed after release 2.9.")]]
│ │ │ │ +
37(T&& t)
│ │ │ │ +
38{
│ │ │ │ +
39 return Dune::resolveRef(std::forward<T>(t));
│ │ │ │ +
40}
│ │ │ │ +
41
│ │ │ │ +
46template<class T>
│ │ │ │ + │ │ │ │ +
48[[deprecated("Use Dune::ResolveRef_t instead. Will be removed after release 2.9.")]]
│ │ │ │ +
49 = Dune::ResolveRef_t<T>;
│ │ │ │ +
50
│ │ │ │ +
51
│ │ │ │ +
52}} // namespace Dune::Functions
│ │ │ │ +
53
│ │ │ │ +
54
│ │ │ │ +
55
│ │ │ │ +
56#endif // DUNE_FUNCTIONS_COMMON_REFERENCE_HELPER_HH
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ +
constexpr bool IsReferenceWrapper_v
This is an alias for Dune::IsReferenceWrapper_v.
Definition: referencehelper.hh:26
│ │ │ │ +
Dune::ResolveRef_t< T > ResolveRef_t
This is an alias for Dune::ResolveRef_t.
Definition: referencehelper.hh:49
│ │ │ │ +
decltype(auto) resolveRef(T &&t)
This is an alias for Dune::resolveRef.
Definition: referencehelper.hh:37
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,119 +5,75 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -differentiablefunction_imp.hh │ │ │ │ │ +referencehelper.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#ifndef DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_IMP_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_IMP_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_COMMON_REFERENCE_HELPER_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_COMMON_REFERENCE_HELPER_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ - 8 │ │ │ │ │ - 9#include │ │ │ │ │ - 10 │ │ │ │ │ + 6#warning The header dune/functions/common/referencehelper.hh is deprecated │ │ │ │ │ +and will be removed after release 2.9. Include dune/common/referencehelper.hh │ │ │ │ │ +instead. │ │ │ │ │ + 7 │ │ │ │ │ + 8#include │ │ │ │ │ + 9 │ │ │ │ │ + 10#include │ │ │ │ │ 11 │ │ │ │ │ - 12namespace Dune { │ │ │ │ │ - 13namespace Functions { │ │ │ │ │ - 14namespace Imp { │ │ │ │ │ - 15 │ │ │ │ │ - 19struct HasFreeDerivative │ │ │ │ │ - 20{ │ │ │ │ │ - 21 template │ │ │ │ │ - 22 auto require(F&& f) -> decltype( │ │ │ │ │ - 23 derivative(f) │ │ │ │ │ - 24 ); │ │ │ │ │ - 25}; │ │ │ │ │ - 26 │ │ │ │ │ + 12 │ │ │ │ │ + 13 │ │ │ │ │ + 14 │ │ │ │ │ + 15namespace Dune { │ │ │ │ │ + 16namespace Functions { │ │ │ │ │ + 17 │ │ │ │ │ + 18 │ │ │ │ │ + 23template │ │ │ │ │ + 24[[deprecated("Use Dune::IsReferenceWrapper_v instead. Will be removed after │ │ │ │ │ +release 2.9.")]] │ │ │ │ │ + 25constexpr bool │ │ │ │ │ +26IsReferenceWrapper_v = Dune::IsReferenceWrapper_v; │ │ │ │ │ 27 │ │ │ │ │ 28 │ │ │ │ │ - 29template() , int>::type = 0> │ │ │ │ │ - 32auto derivativeIfImplemented(const F& f) -> decltype(derivative(f)) │ │ │ │ │ - 33{ │ │ │ │ │ - 34 return derivative(f); │ │ │ │ │ - 35} │ │ │ │ │ - 36 │ │ │ │ │ - 37 │ │ │ │ │ - 38 │ │ │ │ │ - 39template()) , int>::type = 0> │ │ │ │ │ - 42Dummy derivativeIfImplemented(const F& f) │ │ │ │ │ - 43{ │ │ │ │ │ - 44 DUNE_THROW(Dune::NotImplemented, "Derivative not implemented"); │ │ │ │ │ - 45} │ │ │ │ │ - 46 │ │ │ │ │ - 47 │ │ │ │ │ - 48 │ │ │ │ │ - 49template │ │ │ │ │ - 50class DifferentiableFunctionWrapperInterface │ │ │ │ │ - 51{}; │ │ │ │ │ - 52 │ │ │ │ │ - 53// Interface of type erasure wrapper │ │ │ │ │ - 54// │ │ │ │ │ - 55// Notice that the basic interface of polymorphic classes (destructor, │ │ │ │ │ -clone, ...) │ │ │ │ │ - 56// will be added by the type erasure foundation classes. │ │ │ │ │ - 57template │ │ │ │ │ - 58class DifferentiableFunctionWrapperInterface │ │ │ │ │ - 59{ │ │ │ │ │ - 60public: │ │ │ │ │ - 61 virtual Range operator() (const Domain& x) const = 0; │ │ │ │ │ - 62 │ │ │ │ │ - 63 virtual DerivativeInterface derivative() const = 0; │ │ │ │ │ - 64}; │ │ │ │ │ - 65 │ │ │ │ │ - 66 │ │ │ │ │ - 67 │ │ │ │ │ - 68template │ │ │ │ │ - 69class DifferentiableFunctionWrapperImplementation │ │ │ │ │ - 70{}; │ │ │ │ │ - 71 │ │ │ │ │ - 72// Implementation of type erasure wrapper │ │ │ │ │ - 73template │ │ │ │ │ - 74class DifferentiableFunctionWrapperImplementation< Range(Domain), │ │ │ │ │ -DerivativeInterface, B> : │ │ │ │ │ - 75 public B │ │ │ │ │ - 76{ │ │ │ │ │ - 77public: │ │ │ │ │ - 78 │ │ │ │ │ - 79 using B::B; │ │ │ │ │ - 80 using Wrapped = typename B::Wrapped; │ │ │ │ │ - 81 │ │ │ │ │ - 82 virtual Range operator() (const Domain& x) const │ │ │ │ │ - 83 { │ │ │ │ │ - 84 return this->get()(x); │ │ │ │ │ - 85 } │ │ │ │ │ - 86 │ │ │ │ │ - 87 virtual DerivativeInterface derivative() const │ │ │ │ │ - 88 { │ │ │ │ │ - 89 return derivativeIfImplemented(this->get()); │ │ │ │ │ - 90 } │ │ │ │ │ - 91}; │ │ │ │ │ - 92 │ │ │ │ │ - 93 │ │ │ │ │ - 94 │ │ │ │ │ - 95}}} // namespace Dune::Functions::Imp │ │ │ │ │ - 96 │ │ │ │ │ - 97 │ │ │ │ │ - 98 │ │ │ │ │ - 99#endif // DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_IMP_HH │ │ │ │ │ -type_traits.hh │ │ │ │ │ -Dune::Functions::derivative │ │ │ │ │ -TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const │ │ │ │ │ -TrigonometricFunction< K, sinFactor, cosFactor > &f) │ │ │ │ │ -Obtain derivative of TrigonometricFunction function. │ │ │ │ │ -Definition: trigonometricfunction.hh:39 │ │ │ │ │ + 33template │ │ │ │ │ + 34decltype(auto) │ │ │ │ │ +35resolveRef │ │ │ │ │ + 36[[deprecated("Use Dune::resolveRef instead. Will be removed after release │ │ │ │ │ +2.9.")]] │ │ │ │ │ + 37(T&& t) │ │ │ │ │ + 38{ │ │ │ │ │ + 39 return Dune::resolveRef(std::forward(t)); │ │ │ │ │ + 40} │ │ │ │ │ + 41 │ │ │ │ │ + 46template │ │ │ │ │ +47using ResolveRef_t │ │ │ │ │ + 48[[deprecated("Use Dune::ResolveRef_t instead. Will be removed after release │ │ │ │ │ +2.9.")]] │ │ │ │ │ + 49 = Dune::ResolveRef_t; │ │ │ │ │ + 50 │ │ │ │ │ + 51 │ │ │ │ │ + 52}} // namespace Dune::Functions │ │ │ │ │ + 53 │ │ │ │ │ + 54 │ │ │ │ │ + 55 │ │ │ │ │ + 56#endif // DUNE_FUNCTIONS_COMMON_REFERENCE_HELPER_HH │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ +Dune::Functions::IsReferenceWrapper_v │ │ │ │ │ +constexpr bool IsReferenceWrapper_v │ │ │ │ │ +This is an alias for Dune::IsReferenceWrapper_v. │ │ │ │ │ +Definition: referencehelper.hh:26 │ │ │ │ │ +Dune::Functions::ResolveRef_t │ │ │ │ │ +Dune::ResolveRef_t< T > ResolveRef_t │ │ │ │ │ +This is an alias for Dune::ResolveRef_t. │ │ │ │ │ +Definition: referencehelper.hh:49 │ │ │ │ │ +Dune::Functions::resolveRef │ │ │ │ │ +decltype(auto) resolveRef(T &&t) │ │ │ │ │ +This is an alias for Dune::resolveRef. │ │ │ │ │ +Definition: referencehelper.hh:37 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00011.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: differentiablefunctionfromcallables.hh File Reference │ │ │ │ +dune-functions: localfunction_imp.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,50 +63,29 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
differentiablefunctionfromcallables.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
localfunction_imp.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <dune/common/typeutilities.hh>
│ │ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ │ -#include <dune/functions/common/signature.hh>
│ │ │ │ -#include <dune/functions/common/differentiablefunction.hh>
│ │ │ │ -#include <dune/functions/common/functionconcepts.hh>
│ │ │ │ + │ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::Functions::DifferentiableFunctionFromCallables< Range(Domain), DerivativeTraits, F >
 Wrap a list of callable objects as derivative sequence modelling Concept::DifferentiableFunction<Range(Domain), DerivativeTraits> More...
 
class  Dune::Functions::DifferentiableFunctionFromCallables< Range(Domain), DerivativeTraits, F, DF, Derivatives... >
 Wrap a list of callable objects as derivative sequence modelling Concept::DifferentiableFunction<Range(Domain), DerivativeTraits> More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<class Signature , template< class > class DerivativeTraits, class... F>
DifferentiableFunctionFromCallables< Signature, DerivativeTraits, F... > Dune::Functions::makeDifferentiableFunctionFromCallables (const SignatureTag< Signature, DerivativeTraits > &signatureTag, F &&... f)
 Create a DifferentiableFunction from callables. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,47 +5,20 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -Classes | Namespaces | Functions │ │ │ │ │ -differentiablefunctionfromcallables.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Namespaces │ │ │ │ │ +localfunction_imp.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ - Classes │ │ │ │ │ -class  Dune::Functions::DifferentiableFunctionFromCallables<_Range(Domain), │ │ │ │ │ - DerivativeTraits,_F_> │ │ │ │ │ - Wrap a list of callable objects as derivative sequence modelling │ │ │ │ │ -  Concept::DifferentiableFunction │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::Functions::DifferentiableFunctionFromCallables<_Range(Domain), │ │ │ │ │ - DerivativeTraits,_F,_DF,_Derivatives..._> │ │ │ │ │ - Wrap a list of callable objects as derivative sequence modelling │ │ │ │ │ -  Concept::DifferentiableFunction │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ - Functions │ │ │ │ │ -template class DerivativeTraits, class... │ │ │ │ │ -F> │ │ │ │ │ - DifferentiableFunctionFromCallables< Dune::Functions:: │ │ │ │ │ - Signature, DerivativeTraits, F... > makeDifferentiableFunctionFromCallables │ │ │ │ │ - (const SignatureTag< Signature, │ │ │ │ │ - DerivativeTraits > &signatureTag, F &&... │ │ │ │ │ - f) │ │ │ │ │ -  Create a DifferentiableFunction from │ │ │ │ │ - callables. More... │ │ │ │ │ -  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00011_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: differentiablefunctionfromcallables.hh Source File │ │ │ │ +dune-functions: localfunction_imp.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,141 +62,88 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
differentiablefunctionfromcallables.hh
│ │ │ │ +
localfunction_imp.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#ifndef DUNE_FUNCTIONS_COMMON_DIFFEREENTIONABEFUNCTIONFROMCALLABLES_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_COMMON_DIFFEREENTIONABEFUNCTIONFROMCALLABLES_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_COMMON_LOCALFUNCTION_FUNCTION_IMP_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_COMMON_LOCALFUNCTION_FUNCTION_IMP_HH
│ │ │ │
5
│ │ │ │ -
6
│ │ │ │ -
7#include <dune/common/typeutilities.hh>
│ │ │ │ -
8#include <dune/common/hybridutilities.hh>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
8
│ │ │ │
9
│ │ │ │ - │ │ │ │ -
11
│ │ │ │ - │ │ │ │ - │ │ │ │ +
10
│ │ │ │ +
11namespace Dune {
│ │ │ │ +
12namespace Functions {
│ │ │ │ +
13namespace Imp {
│ │ │ │
14
│ │ │ │ -
15
│ │ │ │ -
16
│ │ │ │ -
17namespace Dune {
│ │ │ │ -
18namespace Functions {
│ │ │ │ -
19
│ │ │ │ -
20
│ │ │ │ -
21
│ │ │ │ -
22template<class Signature, template<class> class DerivativeTraits, class... Callables>
│ │ │ │ - │ │ │ │ -
24
│ │ │ │ +
15// Interface of type erasure wrapper
│ │ │ │ +
16//
│ │ │ │ +
17// Notice that the basic interface of polymorphic classes (destructor, clone, ...)
│ │ │ │ +
18// will be added by the type erasure foundation classes.
│ │ │ │ +
19template<class Signature, class DerivativeInterface, class LocalContext>
│ │ │ │ +
20class LocalFunctionWrapperInterface :
│ │ │ │ +
21 public DifferentiableFunctionWrapperInterface<Signature, DerivativeInterface>
│ │ │ │ +
22{
│ │ │ │ +
23public:
│ │ │ │ +
24 virtual void bind(const LocalContext&) = 0;
│ │ │ │
25
│ │ │ │ -
26
│ │ │ │ -
43template<class Range, class Domain, template<class> class DerivativeTraits, class F>
│ │ │ │ -
44class DifferentiableFunctionFromCallables<Range(Domain), DerivativeTraits, F>
│ │ │ │ -
45{
│ │ │ │ -
46public:
│ │ │ │ +
26 virtual void unbind() = 0;
│ │ │ │ +
27
│ │ │ │ +
28 virtual bool bound() const = 0;
│ │ │ │ +
29
│ │ │ │ +
30 virtual const LocalContext& localContext() const = 0;
│ │ │ │ +
31};
│ │ │ │ +
32
│ │ │ │ +
33
│ │ │ │ +
34// Implementation of type erasure wrapper
│ │ │ │ +
35template<class Signature, class DerivativeInterface, class LocalContext, class B>
│ │ │ │ +
36class LocalFunctionWrapperImplementation :
│ │ │ │ +
37 public DifferentiableFunctionWrapperImplementation<Signature, DerivativeInterface, B>
│ │ │ │ +
38{
│ │ │ │ +
39 using Base = DifferentiableFunctionWrapperImplementation<Signature, DerivativeInterface, B>;
│ │ │ │ +
40public:
│ │ │ │ +
41 using Base::Base;
│ │ │ │ +
42
│ │ │ │ +
43 virtual void bind(const LocalContext& context)
│ │ │ │ +
44 {
│ │ │ │ +
45 this->get().bind(context);
│ │ │ │ +
46 }
│ │ │ │
47
│ │ │ │ -
49 using Signature = Range(Domain);
│ │ │ │ -
50
│ │ │ │ - │ │ │ │ +
48 virtual void unbind()
│ │ │ │ +
49 {
│ │ │ │ +
50 this->get().unbind();
│ │ │ │ +
51 }
│ │ │ │
52
│ │ │ │ -
54 using DerivativeSignature = typename DerivativeTraits<RawSignature>::Range(Domain);
│ │ │ │ -
55
│ │ │ │ - │ │ │ │ -
58
│ │ │ │ -
60 template<class FF, disableCopyMove<DifferentiableFunctionFromCallables, FF> = 0>
│ │ │ │ - │ │ │ │ -
62 f_(std::forward<FF>(f))
│ │ │ │ -
63 {}
│ │ │ │ -
64
│ │ │ │ -
66 Range operator() (const Domain& x) const
│ │ │ │ -
67 {
│ │ │ │ -
68 return f_(x);
│ │ │ │ -
69 }
│ │ │ │ -
70
│ │ │ │ - │ │ │ │ -
77 {
│ │ │ │ -
78 DUNE_THROW(Dune::NotImplemented, "Derivative not implemented");
│ │ │ │ -
79 }
│ │ │ │ -
80
│ │ │ │ -
81private:
│ │ │ │ -
82 F f_;
│ │ │ │ -
83};
│ │ │ │ -
84
│ │ │ │ -
85
│ │ │ │ -
86
│ │ │ │ -
103template<class Range, class Domain, template<class> class DerivativeTraits, class F, class DF, class... Derivatives>
│ │ │ │ -
104class DifferentiableFunctionFromCallables<Range(Domain), DerivativeTraits, F, DF, Derivatives...>
│ │ │ │ -
105{
│ │ │ │ -
106public:
│ │ │ │ -
107
│ │ │ │ -
108 using Signature = Range(Domain);
│ │ │ │ - │ │ │ │ -
110 using DerivativeSignature = typename DerivativeTraits<RawSignature>::Range(Domain);
│ │ │ │ -
111
│ │ │ │ -
112 using Derivative = DifferentiableFunctionFromCallables<DerivativeSignature, DerivativeTraits, DF, Derivatives...>;
│ │ │ │ -
113
│ │ │ │ -
120 template<class FF, class DFF, class... DDFF>
│ │ │ │ -
121 DifferentiableFunctionFromCallables(FF&& f, DFF&& df, DDFF&&... ddf) :
│ │ │ │ -
122 f_(std::forward<FF>(f)),
│ │ │ │ -
123 df_(std::forward<DFF>(df), std::forward<DDFF>(ddf)...)
│ │ │ │ -
124 {}
│ │ │ │ -
125
│ │ │ │ -
127 Range operator() (const Domain& x) const
│ │ │ │ -
128 {
│ │ │ │ -
129 return f_(x);
│ │ │ │ -
130 }
│ │ │ │ -
131
│ │ │ │ - │ │ │ │ -
138 {
│ │ │ │ -
139 return t.df_;
│ │ │ │ -
140 }
│ │ │ │ -
141
│ │ │ │ -
142private:
│ │ │ │ -
143 F f_;
│ │ │ │ -
144 Derivative df_;
│ │ │ │ -
145};
│ │ │ │ -
146
│ │ │ │ -
147
│ │ │ │ -
162template<class Signature, template<class> class DerivativeTraits, class... F>
│ │ │ │ -
163DifferentiableFunctionFromCallables<Signature, DerivativeTraits, F...>
│ │ │ │ - │ │ │ │ -
165{
│ │ │ │ -
166 return DifferentiableFunctionFromCallables<Signature, DerivativeTraits, F...>(f...);
│ │ │ │ -
167}
│ │ │ │ -
168
│ │ │ │ -
169
│ │ │ │ -
170
│ │ │ │ -
171} // namespace Functions
│ │ │ │ -
172} // namespace Dune
│ │ │ │ -
173
│ │ │ │ -
174#endif //DUNE_FUNCTIONS_COMMON_DIFFEREENTIONABEFUNCTIONFROMCALLABLES_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
friend Derivative derivative(const DifferentiableFunctionFromCallables &t)
Get derivative of DifferentiableFunctionFromCallables.
Definition: differentiablefunctionfromcallables.hh:76
│ │ │ │ -
DifferentiableFunctionFromCallables< Signature, DerivativeTraits, F... > makeDifferentiableFunctionFromCallables(const SignatureTag< Signature, DerivativeTraits > &signatureTag, F &&... f)
Create a DifferentiableFunction from callables.
Definition: differentiablefunctionfromcallables.hh:164
│ │ │ │ +
53 virtual bool bound() const
│ │ │ │ +
54 {
│ │ │ │ +
55 return this->get().bound();
│ │ │ │ +
56 }
│ │ │ │ +
57
│ │ │ │ +
58 virtual const LocalContext& localContext() const
│ │ │ │ +
59 {
│ │ │ │ +
60 return this->get().localContext();
│ │ │ │ +
61 }
│ │ │ │ +
62};
│ │ │ │ +
63
│ │ │ │ +
64}}} // namespace Dune::Functions::Imp
│ │ │ │ +
65
│ │ │ │ +
66
│ │ │ │ +
67
│ │ │ │ +
68#endif // DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_IMP_HH
│ │ │ │ + │ │ │ │ + │ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
Definition: differentiablefunction.hh:29
│ │ │ │ -
Definition: differentiablefunctionfromcallables.hh:23
│ │ │ │ -
DifferentiableFunctionFromCallables(FF &&f)
Constructor copying the given function.
Definition: differentiablefunctionfromcallables.hh:61
│ │ │ │ -
typename SignatureTraits< Signature >::RawSignature RawSignature
Definition: differentiablefunctionfromcallables.hh:51
│ │ │ │ -
Range(Domain) Signature
Signature of function.
Definition: differentiablefunctionfromcallables.hh:49
│ │ │ │ -
typename DerivativeTraits< RawSignature >::Range(Domain) DerivativeSignature
Signature of derivative.
Definition: differentiablefunctionfromcallables.hh:54
│ │ │ │ -
typename DerivativeTraits< RawSignature >::Range(Domain) DerivativeSignature
Definition: differentiablefunctionfromcallables.hh:110
│ │ │ │ - │ │ │ │ -
typename SignatureTraits< Signature >::RawSignature RawSignature
Definition: differentiablefunctionfromcallables.hh:109
│ │ │ │ -
DifferentiableFunctionFromCallables(FF &&f, DFF &&df, DDFF &&... ddf)
Constructor copying the given functions.
Definition: differentiablefunctionfromcallables.hh:121
│ │ │ │ -
Helper class to deduce the signature of a callable.
Definition: signature.hh:56
│ │ │ │ -
Definition: signature.hh:102
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,191 +5,89 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -differentiablefunctionfromcallables.hh │ │ │ │ │ +localfunction_imp.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#ifndef DUNE_FUNCTIONS_COMMON_DIFFEREENTIONABEFUNCTIONFROMCALLABLES_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_COMMON_DIFFEREENTIONABEFUNCTIONFROMCALLABLES_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_COMMON_LOCALFUNCTION_FUNCTION_IMP_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_COMMON_LOCALFUNCTION_FUNCTION_IMP_HH │ │ │ │ │ 5 │ │ │ │ │ - 6 │ │ │ │ │ - 7#include │ │ │ │ │ - 8#include │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8 │ │ │ │ │ 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11 │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ + 10 │ │ │ │ │ + 11namespace Dune { │ │ │ │ │ + 12namespace Functions { │ │ │ │ │ + 13namespace Imp { │ │ │ │ │ 14 │ │ │ │ │ - 15 │ │ │ │ │ - 16 │ │ │ │ │ - 17namespace Dune { │ │ │ │ │ - 18namespace Functions { │ │ │ │ │ - 19 │ │ │ │ │ - 20 │ │ │ │ │ - 21 │ │ │ │ │ - 22template class DerivativeTraits, class... │ │ │ │ │ -Callables> │ │ │ │ │ -23class DifferentiableFunctionFromCallables; │ │ │ │ │ - 24 │ │ │ │ │ + 15// Interface of type erasure wrapper │ │ │ │ │ + 16// │ │ │ │ │ + 17// Notice that the basic interface of polymorphic classes (destructor, │ │ │ │ │ +clone, ...) │ │ │ │ │ + 18// will be added by the type erasure foundation classes. │ │ │ │ │ + 19template │ │ │ │ │ + 20class LocalFunctionWrapperInterface : │ │ │ │ │ + 21 public DifferentiableFunctionWrapperInterface │ │ │ │ │ + 22{ │ │ │ │ │ + 23public: │ │ │ │ │ + 24 virtual void bind(const LocalContext&) = 0; │ │ │ │ │ 25 │ │ │ │ │ - 26 │ │ │ │ │ - 43template class DerivativeTraits, │ │ │ │ │ -class F> │ │ │ │ │ -44class DifferentiableFunctionFromCallables │ │ │ │ │ - 45{ │ │ │ │ │ - 46public: │ │ │ │ │ + 26 virtual void unbind() = 0; │ │ │ │ │ + 27 │ │ │ │ │ + 28 virtual bool bound() const = 0; │ │ │ │ │ + 29 │ │ │ │ │ + 30 virtual const LocalContext& localContext() const = 0; │ │ │ │ │ + 31}; │ │ │ │ │ + 32 │ │ │ │ │ + 33 │ │ │ │ │ + 34// Implementation of type erasure wrapper │ │ │ │ │ + 35template │ │ │ │ │ + 36class LocalFunctionWrapperImplementation : │ │ │ │ │ + 37 public DifferentiableFunctionWrapperImplementation │ │ │ │ │ + 38{ │ │ │ │ │ + 39 using Base = DifferentiableFunctionWrapperImplementation; │ │ │ │ │ + 40public: │ │ │ │ │ + 41 using Base::Base; │ │ │ │ │ + 42 │ │ │ │ │ + 43 virtual void bind(const LocalContext& context) │ │ │ │ │ + 44 { │ │ │ │ │ + 45 this->get().bind(context); │ │ │ │ │ + 46 } │ │ │ │ │ 47 │ │ │ │ │ -49 using Signature = Range(Domain); │ │ │ │ │ - 50 │ │ │ │ │ -51 using RawSignature = typename SignatureTraits::RawSignature; │ │ │ │ │ + 48 virtual void unbind() │ │ │ │ │ + 49 { │ │ │ │ │ + 50 this->get().unbind(); │ │ │ │ │ + 51 } │ │ │ │ │ 52 │ │ │ │ │ -54 using DerivativeSignature = typename DerivativeTraits::Range │ │ │ │ │ -(Domain); │ │ │ │ │ - 55 │ │ │ │ │ -57 using Derivative = DifferentiableFunction; │ │ │ │ │ - 58 │ │ │ │ │ - 60 template │ │ │ │ │ -= 0> │ │ │ │ │ -61 DifferentiableFunctionFromCallables(FF&& f) : │ │ │ │ │ - 62 f_(std::forward(f)) │ │ │ │ │ - 63 {} │ │ │ │ │ - 64 │ │ │ │ │ -66 Range operator() (const Domain& x) const │ │ │ │ │ - 67 { │ │ │ │ │ - 68 return f_(x); │ │ │ │ │ - 69 } │ │ │ │ │ - 70 │ │ │ │ │ -76 friend Derivative derivative(const DifferentiableFunctionFromCallables& t) │ │ │ │ │ - 77 { │ │ │ │ │ - 78 DUNE_THROW(Dune::NotImplemented, "Derivative not implemented"); │ │ │ │ │ - 79 } │ │ │ │ │ - 80 │ │ │ │ │ - 81private: │ │ │ │ │ - 82 F f_; │ │ │ │ │ - 83}; │ │ │ │ │ - 84 │ │ │ │ │ - 85 │ │ │ │ │ - 86 │ │ │ │ │ - 103template class DerivativeTraits, │ │ │ │ │ -class F, class DF, class... Derivatives> │ │ │ │ │ -104class DifferentiableFunctionFromCallables │ │ │ │ │ - 105{ │ │ │ │ │ - 106public: │ │ │ │ │ - 107 │ │ │ │ │ -108 using Signature = Range(Domain); │ │ │ │ │ -109 using RawSignature = typename SignatureTraits::RawSignature; │ │ │ │ │ -110 using DerivativeSignature = typename DerivativeTraits::Range │ │ │ │ │ -(Domain); │ │ │ │ │ - 111 │ │ │ │ │ -112 using Derivative = DifferentiableFunctionFromCallables; │ │ │ │ │ - 113 │ │ │ │ │ - 120 template │ │ │ │ │ -121 DifferentiableFunctionFromCallables(FF&& f, DFF&& df, DDFF&&... ddf) : │ │ │ │ │ - 122 f_(std::forward(f)), │ │ │ │ │ - 123 df_(std::forward(df), std::forward(ddf)...) │ │ │ │ │ - 124 {} │ │ │ │ │ - 125 │ │ │ │ │ -127 Range operator() (const Domain& x) const │ │ │ │ │ - 128 { │ │ │ │ │ - 129 return f_(x); │ │ │ │ │ - 130 } │ │ │ │ │ - 131 │ │ │ │ │ -137 friend Derivative derivative(const DifferentiableFunctionFromCallables& t) │ │ │ │ │ - 138 { │ │ │ │ │ - 139 return t.df_; │ │ │ │ │ - 140 } │ │ │ │ │ - 141 │ │ │ │ │ - 142private: │ │ │ │ │ - 143 F f_; │ │ │ │ │ - 144 Derivative df_; │ │ │ │ │ - 145}; │ │ │ │ │ - 146 │ │ │ │ │ - 147 │ │ │ │ │ - 162template class DerivativeTraits, class... │ │ │ │ │ -F> │ │ │ │ │ - 163DifferentiableFunctionFromCallables │ │ │ │ │ -164 makeDifferentiableFunctionFromCallables(const SignatureTag& signatureTag, F&&... f) │ │ │ │ │ - 165{ │ │ │ │ │ - 166 return DifferentiableFunctionFromCallables(f...); │ │ │ │ │ - 167} │ │ │ │ │ - 168 │ │ │ │ │ - 169 │ │ │ │ │ - 170 │ │ │ │ │ - 171} // namespace Functions │ │ │ │ │ - 172} // namespace Dune │ │ │ │ │ - 173 │ │ │ │ │ - 174#endif //DUNE_FUNCTIONS_COMMON_DIFFEREENTIONABEFUNCTIONFROMCALLABLES_HH │ │ │ │ │ -signature.hh │ │ │ │ │ -functionconcepts.hh │ │ │ │ │ -differentiablefunction.hh │ │ │ │ │ -Dune::Functions::DifferentiableFunctionFromCallables<_Range(Domain), │ │ │ │ │ -DerivativeTraits,_F_>::derivative │ │ │ │ │ -friend Derivative derivative(const DifferentiableFunctionFromCallables &t) │ │ │ │ │ -Get derivative of DifferentiableFunctionFromCallables. │ │ │ │ │ -Definition: differentiablefunctionfromcallables.hh:76 │ │ │ │ │ -Dune::Functions::makeDifferentiableFunctionFromCallables │ │ │ │ │ -DifferentiableFunctionFromCallables< Signature, DerivativeTraits, F... > │ │ │ │ │ -makeDifferentiableFunctionFromCallables(const SignatureTag< Signature, │ │ │ │ │ -DerivativeTraits > &signatureTag, F &&... f) │ │ │ │ │ -Create a DifferentiableFunction from callables. │ │ │ │ │ -Definition: differentiablefunctionfromcallables.hh:164 │ │ │ │ │ + 53 virtual bool bound() const │ │ │ │ │ + 54 { │ │ │ │ │ + 55 return this->get().bound(); │ │ │ │ │ + 56 } │ │ │ │ │ + 57 │ │ │ │ │ + 58 virtual const LocalContext& localContext() const │ │ │ │ │ + 59 { │ │ │ │ │ + 60 return this->get().localContext(); │ │ │ │ │ + 61 } │ │ │ │ │ + 62}; │ │ │ │ │ + 63 │ │ │ │ │ + 64}}} // namespace Dune::Functions::Imp │ │ │ │ │ + 65 │ │ │ │ │ + 66 │ │ │ │ │ + 67 │ │ │ │ │ + 68#endif // DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_IMP_HH │ │ │ │ │ +differentiablefunction_imp.hh │ │ │ │ │ +type_traits.hh │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::DifferentiableFunction │ │ │ │ │ -Definition: differentiablefunction.hh:29 │ │ │ │ │ -Dune::Functions::DifferentiableFunctionFromCallables │ │ │ │ │ -Definition: differentiablefunctionfromcallables.hh:23 │ │ │ │ │ -Dune::Functions::DifferentiableFunctionFromCallables<_Range(Domain), │ │ │ │ │ -DerivativeTraits,_F_>::DifferentiableFunctionFromCallables │ │ │ │ │ -DifferentiableFunctionFromCallables(FF &&f) │ │ │ │ │ -Constructor copying the given function. │ │ │ │ │ -Definition: differentiablefunctionfromcallables.hh:61 │ │ │ │ │ -Dune::Functions::DifferentiableFunctionFromCallables<_Range(Domain), │ │ │ │ │ -DerivativeTraits,_F_>::RawSignature │ │ │ │ │ -typename SignatureTraits< Signature >::RawSignature RawSignature │ │ │ │ │ -Definition: differentiablefunctionfromcallables.hh:51 │ │ │ │ │ -Dune::Functions::DifferentiableFunctionFromCallables<_Range(Domain), │ │ │ │ │ -DerivativeTraits,_F_>::Signature │ │ │ │ │ -Range(Domain) Signature │ │ │ │ │ -Signature of function. │ │ │ │ │ -Definition: differentiablefunctionfromcallables.hh:49 │ │ │ │ │ -Dune::Functions::DifferentiableFunctionFromCallables<_Range(Domain), │ │ │ │ │ -DerivativeTraits,_F_>::DerivativeSignature │ │ │ │ │ -typename DerivativeTraits< RawSignature >::Range(Domain) DerivativeSignature │ │ │ │ │ -Signature of derivative. │ │ │ │ │ -Definition: differentiablefunctionfromcallables.hh:54 │ │ │ │ │ -Dune::Functions::DifferentiableFunctionFromCallables<_Range(Domain), │ │ │ │ │ -DerivativeTraits,_F,_DF,_Derivatives..._>::DerivativeSignature │ │ │ │ │ -typename DerivativeTraits< RawSignature >::Range(Domain) DerivativeSignature │ │ │ │ │ -Definition: differentiablefunctionfromcallables.hh:110 │ │ │ │ │ -Dune::Functions::DifferentiableFunctionFromCallables<_Range(Domain), │ │ │ │ │ -DerivativeTraits,_F,_DF,_Derivatives..._>::Signature │ │ │ │ │ -Range(Domain) Signature │ │ │ │ │ -Definition: differentiablefunctionfromcallables.hh:108 │ │ │ │ │ -Dune::Functions::DifferentiableFunctionFromCallables<_Range(Domain), │ │ │ │ │ -DerivativeTraits,_F,_DF,_Derivatives..._>::RawSignature │ │ │ │ │ -typename SignatureTraits< Signature >::RawSignature RawSignature │ │ │ │ │ -Definition: differentiablefunctionfromcallables.hh:109 │ │ │ │ │ -Dune::Functions::DifferentiableFunctionFromCallables<_Range(Domain), │ │ │ │ │ -DerivativeTraits,_F,_DF,_Derivatives..._>::DifferentiableFunctionFromCallables │ │ │ │ │ -DifferentiableFunctionFromCallables(FF &&f, DFF &&df, DDFF &&... ddf) │ │ │ │ │ -Constructor copying the given functions. │ │ │ │ │ -Definition: differentiablefunctionfromcallables.hh:121 │ │ │ │ │ -Dune::Functions::SignatureTraits │ │ │ │ │ -Helper class to deduce the signature of a callable. │ │ │ │ │ -Definition: signature.hh:56 │ │ │ │ │ -Dune::Functions::SignatureTag │ │ │ │ │ -Definition: signature.hh:102 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00014.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: staticforloop.hh File Reference │ │ │ │ +dune-functions: differentiablefunctionfromcallables.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,38 +63,50 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
staticforloop.hh File Reference
│ │ │ │ +
differentiablefunctionfromcallables.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <dune/common/concept.hh>
│ │ │ │ -#include <dune/functions/common/type_traits.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │ +
#include <dune/common/typeutilities.hh>
│ │ │ │ +#include <dune/common/hybridutilities.hh>
│ │ │ │ +#include <dune/functions/common/signature.hh>
│ │ │ │ +#include <dune/functions/common/differentiablefunction.hh>
│ │ │ │ +#include <dune/functions/common/functionconcepts.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ +Classes

class  Dune::Functions::DifferentiableFunctionFromCallables< Range(Domain), DerivativeTraits, F >
 Wrap a list of callable objects as derivative sequence modelling Concept::DifferentiableFunction<Range(Domain), DerivativeTraits> More...
 
class  Dune::Functions::DifferentiableFunctionFromCallables< Range(Domain), DerivativeTraits, F, DF, Derivatives... >
 Wrap a list of callable objects as derivative sequence modelling Concept::DifferentiableFunction<Range(Domain), DerivativeTraits> More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<std::size_t begin_t, std::size_t end_t, class F , class... Args>
void Dune::Functions::staticFindInRange (F &&f, Args &&... args)
 Static find loop. More...
 
template<class Signature , template< class > class DerivativeTraits, class... F>
DifferentiableFunctionFromCallables< Signature, DerivativeTraits, F... > Dune::Functions::makeDifferentiableFunctionFromCallables (const SignatureTag< Signature, DerivativeTraits > &signatureTag, F &&... f)
 Create a DifferentiableFunction from callables. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,26 +5,47 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -Namespaces | Functions │ │ │ │ │ -staticforloop.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Functions │ │ │ │ │ +differentiablefunctionfromcallables.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ + Classes │ │ │ │ │ +class  Dune::Functions::DifferentiableFunctionFromCallables<_Range(Domain), │ │ │ │ │ + DerivativeTraits,_F_> │ │ │ │ │ + Wrap a list of callable objects as derivative sequence modelling │ │ │ │ │ +  Concept::DifferentiableFunction │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ +class  Dune::Functions::DifferentiableFunctionFromCallables<_Range(Domain), │ │ │ │ │ + DerivativeTraits,_F,_DF,_Derivatives..._> │ │ │ │ │ + Wrap a list of callable objects as derivative sequence modelling │ │ │ │ │ +  Concept::DifferentiableFunction │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ -void Dune::Functions::staticFindInRange (F &&f, Args &&... args) │ │ │ │ │ -  Static find loop. More... │ │ │ │ │ +template class DerivativeTraits, class... │ │ │ │ │ +F> │ │ │ │ │ + DifferentiableFunctionFromCallables< Dune::Functions:: │ │ │ │ │ + Signature, DerivativeTraits, F... > makeDifferentiableFunctionFromCallables │ │ │ │ │ + (const SignatureTag< Signature, │ │ │ │ │ + DerivativeTraits > &signatureTag, F &&... │ │ │ │ │ + f) │ │ │ │ │ +  Create a DifferentiableFunction from │ │ │ │ │ + callables. More... │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00014_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: staticforloop.hh Source File │ │ │ │ +dune-functions: differentiablefunctionfromcallables.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,75 +62,141 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
staticforloop.hh
│ │ │ │ +
differentiablefunctionfromcallables.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#ifndef DUNE_FUNCTIONS_COMMON_STATICFORLOOP_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_COMMON_STATICFORLOOP_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_COMMON_DIFFEREENTIONABEFUNCTIONFROMCALLABLES_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_COMMON_DIFFEREENTIONABEFUNCTIONFROMCALLABLES_HH
│ │ │ │
5
│ │ │ │
6
│ │ │ │ -
7#include <dune/common/concept.hh>
│ │ │ │ -
8
│ │ │ │ - │ │ │ │ - │ │ │ │ +
7#include <dune/common/typeutilities.hh>
│ │ │ │ +
8#include <dune/common/hybridutilities.hh>
│ │ │ │ +
9
│ │ │ │ + │ │ │ │
11
│ │ │ │ -
12
│ │ │ │ -
13namespace Dune {
│ │ │ │ -
14namespace Functions {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
14
│ │ │ │
15
│ │ │ │ -
16namespace Imp {
│ │ │ │ -
17
│ │ │ │ -
18template<class ST, ST begin, ST end>
│ │ │ │ -
19struct StaticFindInRange
│ │ │ │ -
20{
│ │ │ │ -
21 template<class F, class...Args>
│ │ │ │ -
22 static void apply(F&& f, Args&&... args)
│ │ │ │ -
23 {
│ │ │ │ -
24 if (f(std::integral_constant<ST, begin>(), std::forward<Args>(args)...))
│ │ │ │ -
25 return;
│ │ │ │ -
26 StaticFindInRange<ST, begin+1, end>::apply(std::forward<F>(f), std::forward<Args>(args)...);
│ │ │ │ -
27 }
│ │ │ │ -
28};
│ │ │ │ -
29
│ │ │ │ -
30template<class ST, ST end>
│ │ │ │ -
31struct StaticFindInRange<ST, end, end>
│ │ │ │ -
32{
│ │ │ │ -
33 template<class F, class...Args>
│ │ │ │ -
34 static void apply(F&& f, Args&&...)
│ │ │ │ -
35 {}
│ │ │ │ -
36};
│ │ │ │ -
37
│ │ │ │ -
38} //end namespace Imp
│ │ │ │ -
39
│ │ │ │ -
40
│ │ │ │ -
41
│ │ │ │ -
55template<std::size_t begin_t, std::size_t end_t, class F, class... Args>
│ │ │ │ -
56void staticFindInRange(F&& f, Args&&... args)
│ │ │ │ -
57{
│ │ │ │ -
58 Imp::StaticFindInRange<std::size_t, begin_t, end_t>::apply(std::forward<F>(f), std::forward<Args>(args)...);
│ │ │ │ -
59}
│ │ │ │ -
60
│ │ │ │ -
61
│ │ │ │ -
62} // namespace Dune::Functions
│ │ │ │ -
63} // namespace Dune
│ │ │ │ +
16
│ │ │ │ +
17namespace Dune {
│ │ │ │ +
18namespace Functions {
│ │ │ │ +
19
│ │ │ │ +
20
│ │ │ │ +
21
│ │ │ │ +
22template<class Signature, template<class> class DerivativeTraits, class... Callables>
│ │ │ │ + │ │ │ │ +
24
│ │ │ │ +
25
│ │ │ │ +
26
│ │ │ │ +
43template<class Range, class Domain, template<class> class DerivativeTraits, class F>
│ │ │ │ +
44class DifferentiableFunctionFromCallables<Range(Domain), DerivativeTraits, F>
│ │ │ │ +
45{
│ │ │ │ +
46public:
│ │ │ │ +
47
│ │ │ │ +
49 using Signature = Range(Domain);
│ │ │ │ +
50
│ │ │ │ + │ │ │ │ +
52
│ │ │ │ +
54 using DerivativeSignature = typename DerivativeTraits<RawSignature>::Range(Domain);
│ │ │ │ +
55
│ │ │ │ + │ │ │ │ +
58
│ │ │ │ +
60 template<class FF, disableCopyMove<DifferentiableFunctionFromCallables, FF> = 0>
│ │ │ │ + │ │ │ │ +
62 f_(std::forward<FF>(f))
│ │ │ │ +
63 {}
│ │ │ │
64
│ │ │ │ -
65
│ │ │ │ -
66
│ │ │ │ -
67#endif //DUNE_FUNCTIONS_COMMON_STATICFORLOOP_HH
│ │ │ │ - │ │ │ │ -
void staticFindInRange(F &&f, Args &&... args)
Static find loop.
Definition: staticforloop.hh:56
│ │ │ │ +
66 Range operator() (const Domain& x) const
│ │ │ │ +
67 {
│ │ │ │ +
68 return f_(x);
│ │ │ │ +
69 }
│ │ │ │ +
70
│ │ │ │ + │ │ │ │ +
77 {
│ │ │ │ +
78 DUNE_THROW(Dune::NotImplemented, "Derivative not implemented");
│ │ │ │ +
79 }
│ │ │ │ +
80
│ │ │ │ +
81private:
│ │ │ │ +
82 F f_;
│ │ │ │ +
83};
│ │ │ │ +
84
│ │ │ │ +
85
│ │ │ │ +
86
│ │ │ │ +
103template<class Range, class Domain, template<class> class DerivativeTraits, class F, class DF, class... Derivatives>
│ │ │ │ +
104class DifferentiableFunctionFromCallables<Range(Domain), DerivativeTraits, F, DF, Derivatives...>
│ │ │ │ +
105{
│ │ │ │ +
106public:
│ │ │ │ +
107
│ │ │ │ +
108 using Signature = Range(Domain);
│ │ │ │ + │ │ │ │ +
110 using DerivativeSignature = typename DerivativeTraits<RawSignature>::Range(Domain);
│ │ │ │ +
111
│ │ │ │ +
112 using Derivative = DifferentiableFunctionFromCallables<DerivativeSignature, DerivativeTraits, DF, Derivatives...>;
│ │ │ │ +
113
│ │ │ │ +
120 template<class FF, class DFF, class... DDFF>
│ │ │ │ +
121 DifferentiableFunctionFromCallables(FF&& f, DFF&& df, DDFF&&... ddf) :
│ │ │ │ +
122 f_(std::forward<FF>(f)),
│ │ │ │ +
123 df_(std::forward<DFF>(df), std::forward<DDFF>(ddf)...)
│ │ │ │ +
124 {}
│ │ │ │ +
125
│ │ │ │ +
127 Range operator() (const Domain& x) const
│ │ │ │ +
128 {
│ │ │ │ +
129 return f_(x);
│ │ │ │ +
130 }
│ │ │ │ +
131
│ │ │ │ + │ │ │ │ +
138 {
│ │ │ │ +
139 return t.df_;
│ │ │ │ +
140 }
│ │ │ │ +
141
│ │ │ │ +
142private:
│ │ │ │ +
143 F f_;
│ │ │ │ +
144 Derivative df_;
│ │ │ │ +
145};
│ │ │ │ +
146
│ │ │ │ +
147
│ │ │ │ +
162template<class Signature, template<class> class DerivativeTraits, class... F>
│ │ │ │ +
163DifferentiableFunctionFromCallables<Signature, DerivativeTraits, F...>
│ │ │ │ + │ │ │ │ +
165{
│ │ │ │ +
166 return DifferentiableFunctionFromCallables<Signature, DerivativeTraits, F...>(f...);
│ │ │ │ +
167}
│ │ │ │ +
168
│ │ │ │ +
169
│ │ │ │ +
170
│ │ │ │ +
171} // namespace Functions
│ │ │ │ +
172} // namespace Dune
│ │ │ │ +
173
│ │ │ │ +
174#endif //DUNE_FUNCTIONS_COMMON_DIFFEREENTIONABEFUNCTIONFROMCALLABLES_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
friend Derivative derivative(const DifferentiableFunctionFromCallables &t)
Get derivative of DifferentiableFunctionFromCallables.
Definition: differentiablefunctionfromcallables.hh:76
│ │ │ │ +
DifferentiableFunctionFromCallables< Signature, DerivativeTraits, F... > makeDifferentiableFunctionFromCallables(const SignatureTag< Signature, DerivativeTraits > &signatureTag, F &&... f)
Create a DifferentiableFunction from callables.
Definition: differentiablefunctionfromcallables.hh:164
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ - │ │ │ │ +
Definition: differentiablefunction.hh:29
│ │ │ │ +
Definition: differentiablefunctionfromcallables.hh:23
│ │ │ │ +
DifferentiableFunctionFromCallables(FF &&f)
Constructor copying the given function.
Definition: differentiablefunctionfromcallables.hh:61
│ │ │ │ +
typename SignatureTraits< Signature >::RawSignature RawSignature
Definition: differentiablefunctionfromcallables.hh:51
│ │ │ │ +
Range(Domain) Signature
Signature of function.
Definition: differentiablefunctionfromcallables.hh:49
│ │ │ │ +
typename DerivativeTraits< RawSignature >::Range(Domain) DerivativeSignature
Signature of derivative.
Definition: differentiablefunctionfromcallables.hh:54
│ │ │ │ +
typename DerivativeTraits< RawSignature >::Range(Domain) DerivativeSignature
Definition: differentiablefunctionfromcallables.hh:110
│ │ │ │ + │ │ │ │ +
typename SignatureTraits< Signature >::RawSignature RawSignature
Definition: differentiablefunctionfromcallables.hh:109
│ │ │ │ +
DifferentiableFunctionFromCallables(FF &&f, DFF &&df, DDFF &&... ddf)
Constructor copying the given functions.
Definition: differentiablefunctionfromcallables.hh:121
│ │ │ │ +
Helper class to deduce the signature of a callable.
Definition: signature.hh:56
│ │ │ │ +
Definition: signature.hh:102
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,76 +5,191 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -staticforloop.hh │ │ │ │ │ +differentiablefunctionfromcallables.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#ifndef DUNE_FUNCTIONS_COMMON_STATICFORLOOP_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_COMMON_STATICFORLOOP_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_COMMON_DIFFEREENTIONABEFUNCTIONFROMCALLABLES_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_COMMON_DIFFEREENTIONABEFUNCTIONFROMCALLABLES_HH │ │ │ │ │ 5 │ │ │ │ │ 6 │ │ │ │ │ - 7#include │ │ │ │ │ - 8 │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8#include │ │ │ │ │ + 9 │ │ │ │ │ + 10#include │ │ │ │ │ 11 │ │ │ │ │ - 12 │ │ │ │ │ - 13namespace Dune { │ │ │ │ │ - 14namespace Functions { │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14 │ │ │ │ │ 15 │ │ │ │ │ - 16namespace Imp { │ │ │ │ │ - 17 │ │ │ │ │ - 18template │ │ │ │ │ - 19struct StaticFindInRange │ │ │ │ │ - 20{ │ │ │ │ │ - 21 template │ │ │ │ │ - 22 static void apply(F&& f, Args&&... args) │ │ │ │ │ - 23 { │ │ │ │ │ - 24 if (f(std::integral_constant(), std::forward(args)...)) │ │ │ │ │ - 25 return; │ │ │ │ │ - 26 StaticFindInRange::apply(std::forward(f), std:: │ │ │ │ │ -forward(args)...); │ │ │ │ │ - 27 } │ │ │ │ │ - 28}; │ │ │ │ │ - 29 │ │ │ │ │ - 30template │ │ │ │ │ - 31struct StaticFindInRange │ │ │ │ │ - 32{ │ │ │ │ │ - 33 template │ │ │ │ │ - 34 static void apply(F&& f, Args&&...) │ │ │ │ │ - 35 {} │ │ │ │ │ - 36}; │ │ │ │ │ - 37 │ │ │ │ │ - 38} //end namespace Imp │ │ │ │ │ - 39 │ │ │ │ │ - 40 │ │ │ │ │ - 41 │ │ │ │ │ - 55template │ │ │ │ │ -56void staticFindInRange(F&& f, Args&&... args) │ │ │ │ │ - 57{ │ │ │ │ │ - 58 Imp::StaticFindInRange::apply(std::forward │ │ │ │ │ -(f), std::forward(args)...); │ │ │ │ │ - 59} │ │ │ │ │ - 60 │ │ │ │ │ - 61 │ │ │ │ │ - 62} // namespace Dune::Functions │ │ │ │ │ - 63} // namespace Dune │ │ │ │ │ + 16 │ │ │ │ │ + 17namespace Dune { │ │ │ │ │ + 18namespace Functions { │ │ │ │ │ + 19 │ │ │ │ │ + 20 │ │ │ │ │ + 21 │ │ │ │ │ + 22template class DerivativeTraits, class... │ │ │ │ │ +Callables> │ │ │ │ │ +23class DifferentiableFunctionFromCallables; │ │ │ │ │ + 24 │ │ │ │ │ + 25 │ │ │ │ │ + 26 │ │ │ │ │ + 43template class DerivativeTraits, │ │ │ │ │ +class F> │ │ │ │ │ +44class DifferentiableFunctionFromCallables │ │ │ │ │ + 45{ │ │ │ │ │ + 46public: │ │ │ │ │ + 47 │ │ │ │ │ +49 using Signature = Range(Domain); │ │ │ │ │ + 50 │ │ │ │ │ +51 using RawSignature = typename SignatureTraits::RawSignature; │ │ │ │ │ + 52 │ │ │ │ │ +54 using DerivativeSignature = typename DerivativeTraits::Range │ │ │ │ │ +(Domain); │ │ │ │ │ + 55 │ │ │ │ │ +57 using Derivative = DifferentiableFunction; │ │ │ │ │ + 58 │ │ │ │ │ + 60 template │ │ │ │ │ += 0> │ │ │ │ │ +61 DifferentiableFunctionFromCallables(FF&& f) : │ │ │ │ │ + 62 f_(std::forward(f)) │ │ │ │ │ + 63 {} │ │ │ │ │ 64 │ │ │ │ │ - 65 │ │ │ │ │ - 66 │ │ │ │ │ - 67#endif //DUNE_FUNCTIONS_COMMON_STATICFORLOOP_HH │ │ │ │ │ -type_traits.hh │ │ │ │ │ -Dune::Functions::staticFindInRange │ │ │ │ │ -void staticFindInRange(F &&f, Args &&... args) │ │ │ │ │ -Static find loop. │ │ │ │ │ -Definition: staticforloop.hh:56 │ │ │ │ │ +66 Range operator() (const Domain& x) const │ │ │ │ │ + 67 { │ │ │ │ │ + 68 return f_(x); │ │ │ │ │ + 69 } │ │ │ │ │ + 70 │ │ │ │ │ +76 friend Derivative derivative(const DifferentiableFunctionFromCallables& t) │ │ │ │ │ + 77 { │ │ │ │ │ + 78 DUNE_THROW(Dune::NotImplemented, "Derivative not implemented"); │ │ │ │ │ + 79 } │ │ │ │ │ + 80 │ │ │ │ │ + 81private: │ │ │ │ │ + 82 F f_; │ │ │ │ │ + 83}; │ │ │ │ │ + 84 │ │ │ │ │ + 85 │ │ │ │ │ + 86 │ │ │ │ │ + 103template class DerivativeTraits, │ │ │ │ │ +class F, class DF, class... Derivatives> │ │ │ │ │ +104class DifferentiableFunctionFromCallables │ │ │ │ │ + 105{ │ │ │ │ │ + 106public: │ │ │ │ │ + 107 │ │ │ │ │ +108 using Signature = Range(Domain); │ │ │ │ │ +109 using RawSignature = typename SignatureTraits::RawSignature; │ │ │ │ │ +110 using DerivativeSignature = typename DerivativeTraits::Range │ │ │ │ │ +(Domain); │ │ │ │ │ + 111 │ │ │ │ │ +112 using Derivative = DifferentiableFunctionFromCallables; │ │ │ │ │ + 113 │ │ │ │ │ + 120 template │ │ │ │ │ +121 DifferentiableFunctionFromCallables(FF&& f, DFF&& df, DDFF&&... ddf) : │ │ │ │ │ + 122 f_(std::forward(f)), │ │ │ │ │ + 123 df_(std::forward(df), std::forward(ddf)...) │ │ │ │ │ + 124 {} │ │ │ │ │ + 125 │ │ │ │ │ +127 Range operator() (const Domain& x) const │ │ │ │ │ + 128 { │ │ │ │ │ + 129 return f_(x); │ │ │ │ │ + 130 } │ │ │ │ │ + 131 │ │ │ │ │ +137 friend Derivative derivative(const DifferentiableFunctionFromCallables& t) │ │ │ │ │ + 138 { │ │ │ │ │ + 139 return t.df_; │ │ │ │ │ + 140 } │ │ │ │ │ + 141 │ │ │ │ │ + 142private: │ │ │ │ │ + 143 F f_; │ │ │ │ │ + 144 Derivative df_; │ │ │ │ │ + 145}; │ │ │ │ │ + 146 │ │ │ │ │ + 147 │ │ │ │ │ + 162template class DerivativeTraits, class... │ │ │ │ │ +F> │ │ │ │ │ + 163DifferentiableFunctionFromCallables │ │ │ │ │ +164 makeDifferentiableFunctionFromCallables(const SignatureTag& signatureTag, F&&... f) │ │ │ │ │ + 165{ │ │ │ │ │ + 166 return DifferentiableFunctionFromCallables(f...); │ │ │ │ │ + 167} │ │ │ │ │ + 168 │ │ │ │ │ + 169 │ │ │ │ │ + 170 │ │ │ │ │ + 171} // namespace Functions │ │ │ │ │ + 172} // namespace Dune │ │ │ │ │ + 173 │ │ │ │ │ + 174#endif //DUNE_FUNCTIONS_COMMON_DIFFEREENTIONABEFUNCTIONFROMCALLABLES_HH │ │ │ │ │ +functionconcepts.hh │ │ │ │ │ +signature.hh │ │ │ │ │ +differentiablefunction.hh │ │ │ │ │ +Dune::Functions::DifferentiableFunctionFromCallables<_Range(Domain), │ │ │ │ │ +DerivativeTraits,_F_>::derivative │ │ │ │ │ +friend Derivative derivative(const DifferentiableFunctionFromCallables &t) │ │ │ │ │ +Get derivative of DifferentiableFunctionFromCallables. │ │ │ │ │ +Definition: differentiablefunctionfromcallables.hh:76 │ │ │ │ │ +Dune::Functions::makeDifferentiableFunctionFromCallables │ │ │ │ │ +DifferentiableFunctionFromCallables< Signature, DerivativeTraits, F... > │ │ │ │ │ +makeDifferentiableFunctionFromCallables(const SignatureTag< Signature, │ │ │ │ │ +DerivativeTraits > &signatureTag, F &&... f) │ │ │ │ │ +Create a DifferentiableFunction from callables. │ │ │ │ │ +Definition: differentiablefunctionfromcallables.hh:164 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -concepts.hh │ │ │ │ │ +Dune::Functions::DifferentiableFunction │ │ │ │ │ +Definition: differentiablefunction.hh:29 │ │ │ │ │ +Dune::Functions::DifferentiableFunctionFromCallables │ │ │ │ │ +Definition: differentiablefunctionfromcallables.hh:23 │ │ │ │ │ +Dune::Functions::DifferentiableFunctionFromCallables<_Range(Domain), │ │ │ │ │ +DerivativeTraits,_F_>::DifferentiableFunctionFromCallables │ │ │ │ │ +DifferentiableFunctionFromCallables(FF &&f) │ │ │ │ │ +Constructor copying the given function. │ │ │ │ │ +Definition: differentiablefunctionfromcallables.hh:61 │ │ │ │ │ +Dune::Functions::DifferentiableFunctionFromCallables<_Range(Domain), │ │ │ │ │ +DerivativeTraits,_F_>::RawSignature │ │ │ │ │ +typename SignatureTraits< Signature >::RawSignature RawSignature │ │ │ │ │ +Definition: differentiablefunctionfromcallables.hh:51 │ │ │ │ │ +Dune::Functions::DifferentiableFunctionFromCallables<_Range(Domain), │ │ │ │ │ +DerivativeTraits,_F_>::Signature │ │ │ │ │ +Range(Domain) Signature │ │ │ │ │ +Signature of function. │ │ │ │ │ +Definition: differentiablefunctionfromcallables.hh:49 │ │ │ │ │ +Dune::Functions::DifferentiableFunctionFromCallables<_Range(Domain), │ │ │ │ │ +DerivativeTraits,_F_>::DerivativeSignature │ │ │ │ │ +typename DerivativeTraits< RawSignature >::Range(Domain) DerivativeSignature │ │ │ │ │ +Signature of derivative. │ │ │ │ │ +Definition: differentiablefunctionfromcallables.hh:54 │ │ │ │ │ +Dune::Functions::DifferentiableFunctionFromCallables<_Range(Domain), │ │ │ │ │ +DerivativeTraits,_F,_DF,_Derivatives..._>::DerivativeSignature │ │ │ │ │ +typename DerivativeTraits< RawSignature >::Range(Domain) DerivativeSignature │ │ │ │ │ +Definition: differentiablefunctionfromcallables.hh:110 │ │ │ │ │ +Dune::Functions::DifferentiableFunctionFromCallables<_Range(Domain), │ │ │ │ │ +DerivativeTraits,_F,_DF,_Derivatives..._>::Signature │ │ │ │ │ +Range(Domain) Signature │ │ │ │ │ +Definition: differentiablefunctionfromcallables.hh:108 │ │ │ │ │ +Dune::Functions::DifferentiableFunctionFromCallables<_Range(Domain), │ │ │ │ │ +DerivativeTraits,_F,_DF,_Derivatives..._>::RawSignature │ │ │ │ │ +typename SignatureTraits< Signature >::RawSignature RawSignature │ │ │ │ │ +Definition: differentiablefunctionfromcallables.hh:109 │ │ │ │ │ +Dune::Functions::DifferentiableFunctionFromCallables<_Range(Domain), │ │ │ │ │ +DerivativeTraits,_F,_DF,_Derivatives..._>::DifferentiableFunctionFromCallables │ │ │ │ │ +DifferentiableFunctionFromCallables(FF &&f, DFF &&df, DDFF &&... ddf) │ │ │ │ │ +Constructor copying the given functions. │ │ │ │ │ +Definition: differentiablefunctionfromcallables.hh:121 │ │ │ │ │ +Dune::Functions::SignatureTraits │ │ │ │ │ +Helper class to deduce the signature of a callable. │ │ │ │ │ +Definition: signature.hh:56 │ │ │ │ │ +Dune::Functions::SignatureTag │ │ │ │ │ +Definition: signature.hh:102 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00017.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: indexaccess.hh File Reference │ │ │ │ +dune-functions: signature.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,61 +63,52 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
indexaccess.hh File Reference
│ │ │ │ +
signature.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <utility>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/common/concept.hh>
│ │ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ │ -#include <dune/functions/common/utility.hh>
│ │ │ │ +
#include <type_traits>
│ │ │ │ +#include <tuple>
│ │ │ │ +#include <dune/functions/common/defaultderivativetraits.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ +Classes

struct  Dune::Functions::SignatureTraits< Signature, isCallable >
 Helper class to deduce the signature of a callable. More...
 
struct  Dune::Functions::SignatureTag< Range(Domain), DerivativeTraitsT >
 Tag-class to encapsulate signature information. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<class C , class I , class F , typename std::enable_if< Dune::models< Imp::Concept::HasDynamicIndexAccess< I >, C >(), int >::type = 0>
auto Dune::Functions::hybridIndexAccess (C &&c, const I &i, F &&f) -> decltype(f(c[i]))
 Provide operator[] index-access for containers. More...
 
template<class C , class I , class F , typename std::enable_if< not Dune::models< Imp::Concept::HasDynamicIndexAccess< I >, C >(), int >::type = 0>
decltype(auto) Dune::Functions::hybridIndexAccess (C &&c, const I &i, F &&f)
 Provide operator[] index-access for containers. More...
 
template<class Result , class C , class MultiIndex >
Result Dune::Functions::hybridMultiIndexAccess (C &&c, const MultiIndex &index)
 Provide multi-index access by chaining operator[]. More...
 
template<class C , class MultiIndex , class IsFinal >
constexpr decltype(auto) Dune::Functions::resolveDynamicMultiIndex (C &&c, const MultiIndex &multiIndex, const IsFinal &isFinal)
 Provide multi-index access by chaining operator[]. More...
 
template<class C , class MultiIndex >
constexpr decltype(auto) Dune::Functions::resolveDynamicMultiIndex (C &&c, const MultiIndex &multiIndex)
 Provide multi-index access by chaining operator[]. More...
 
template<class C , class MultiIndex >
constexpr decltype(auto) Dune::Functions::resolveStaticMultiIndex (C &&c, const MultiIndex &multiIndex)
 Provide multi-index access by chaining operator[]. More...
 
template<class Range , class Domain , template< class > class DerivativeTraits>
auto Dune::Functions::derivativeSignatureTag (SignatureTag< Range(Domain), DerivativeTraits > tag)
 Construct SignatureTag for derivative. More...
 
template<std::size_t maxOrder, class Signature , template< class > class DerivativeTraits>
auto Dune::Functions::derivativeSignatureTags (Dune::Functions::SignatureTag< Signature, DerivativeTraits > tag)
 Construct SignatureTags for derivatives. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,63 +5,41 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -Namespaces | Functions │ │ │ │ │ -indexaccess.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Functions │ │ │ │ │ +signature.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ + Classes │ │ │ │ │ +struct  Dune::Functions::SignatureTraits<_Signature,_isCallable_> │ │ │ │ │ +  Helper class to deduce the signature of a callable. More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::SignatureTag<_Range(Domain),_DerivativeTraitsT_> │ │ │ │ │ +  Tag-class to encapsulate signature information. More... │ │ │ │ │ +  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ -template, C >(), int >::type = 0> │ │ │ │ │ - auto Dune::Functions::hybridIndexAccess (C &&c, const I │ │ │ │ │ - &i, F &&f) -> decltype(f(c[i])) │ │ │ │ │ -  Provide operator[] index-access for containers. │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ -template, C >(), int >::type = 0> │ │ │ │ │ - decltype(auto) Dune::Functions::hybridIndexAccess (C &&c, const I │ │ │ │ │ - &i, F &&f) │ │ │ │ │ -  Provide operator[] index-access for containers. │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - Result Dune::Functions::hybridMultiIndexAccess (C &&c, const │ │ │ │ │ - MultiIndex &index) │ │ │ │ │ -  Provide multi-index access by chaining operator[]. │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -constexpr decltype(auto) Dune::Functions::resolveDynamicMultiIndex (C &&c, │ │ │ │ │ - const MultiIndex &multiIndex, const IsFinal &isFinal) │ │ │ │ │ -  Provide multi-index access by chaining operator[]. │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -constexpr decltype(auto) Dune::Functions::resolveDynamicMultiIndex (C &&c, │ │ │ │ │ - const MultiIndex &multiIndex) │ │ │ │ │ -  Provide multi-index access by chaining operator[]. │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -constexpr decltype(auto) Dune::Functions::resolveStaticMultiIndex (C &&c, │ │ │ │ │ - const MultiIndex &multiIndex) │ │ │ │ │ -  Provide multi-index access by chaining operator[]. │ │ │ │ │ - More... │ │ │ │ │ +template class │ │ │ │ │ +DerivativeTraits> │ │ │ │ │ +auto Dune::Functions::derivativeSignatureTag (SignatureTag< Range(Domain), │ │ │ │ │ + DerivativeTraits > tag) │ │ │ │ │ +  Construct SignatureTag for derivative. More... │ │ │ │ │ +  │ │ │ │ │ +template class │ │ │ │ │ +DerivativeTraits> │ │ │ │ │ +auto Dune::Functions::derivativeSignatureTags (Dune::Functions::SignatureTag< │ │ │ │ │ + Signature, DerivativeTraits > tag) │ │ │ │ │ +  Construct SignatureTags for derivatives. More... │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00017_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: indexaccess.hh Source File │ │ │ │ +dune-functions: signature.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,313 +62,158 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
indexaccess.hh
│ │ │ │ +
signature.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#ifndef DUNE_FUNCTIONS_COMMON_INDEX_ACCESS_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_COMMON_INDEX_ACCESS_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_COMMON_SIGNATURE_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_COMMON_SIGNATURE_HH
│ │ │ │
5
│ │ │ │ -
6
│ │ │ │ -
7#include <utility>
│ │ │ │ -
8#include <type_traits>
│ │ │ │ -
9
│ │ │ │ -
10#include <dune/common/typetraits.hh>
│ │ │ │ -
11#include <dune/common/concept.hh>
│ │ │ │ -
12#include <dune/common/hybridutilities.hh>
│ │ │ │ +
6#include <type_traits>
│ │ │ │ +
7#include <tuple>
│ │ │ │ +
8
│ │ │ │ + │ │ │ │ +
10
│ │ │ │ +
11namespace Dune {
│ │ │ │ +
12namespace Functions {
│ │ │ │
13
│ │ │ │ - │ │ │ │ -
15
│ │ │ │ -
16
│ │ │ │ -
17
│ │ │ │ -
18namespace Dune {
│ │ │ │ -
19namespace Functions {
│ │ │ │ -
20
│ │ │ │ +
19template<typename F>
│ │ │ │ + │ │ │ │
21
│ │ │ │ -
22namespace Imp {
│ │ │ │ -
23
│ │ │ │ -
24namespace Concept {
│ │ │ │ -
25
│ │ │ │ -
26template<class size_type>
│ │ │ │ -
27struct HasDynamicIndexAccess
│ │ │ │ -
28{
│ │ │ │ -
29 template<class C>
│ │ │ │ -
30 auto require(C&& c) -> decltype(
│ │ │ │ -
31 c[std::declval<size_type>()]
│ │ │ │ -
32 );
│ │ │ │ -
33};
│ │ │ │ -
34
│ │ │ │ -
35struct HasStaticIndexAccess
│ │ │ │ -
36{
│ │ │ │ -
37 template<class C>
│ │ │ │ -
38 auto require(C&& c) -> decltype(
│ │ │ │ -
39 c[Dune::Indices::_0]
│ │ │ │ -
40 );
│ │ │ │ +
22#ifndef DOXYGEN
│ │ │ │ +
23template<typename F>
│ │ │ │ +
24struct IsCallable
│ │ │ │ +
25{
│ │ │ │ +
26 struct yes { std::size_t dummy[2]; };
│ │ │ │ +
27 struct no { std::size_t dummy[1]; };
│ │ │ │ +
28
│ │ │ │ +
29 template<typename C>
│ │ │ │ +
30 static yes test(const decltype(&C::operator()) *);
│ │ │ │ +
31 template<typename C>
│ │ │ │ +
32 static no test(...);
│ │ │ │ +
33
│ │ │ │ +
34 enum { value = (sizeof(test<F>(0)) == sizeof(yes)) };
│ │ │ │ +
35};
│ │ │ │ +
36
│ │ │ │ +
37template<typename R, typename D>
│ │ │ │ +
38struct IsCallable<R(D)>
│ │ │ │ +
39{
│ │ │ │ +
40 enum { value = true };
│ │ │ │
41};
│ │ │ │
42
│ │ │ │ -
43} // namespace Concept
│ │ │ │ -
44
│ │ │ │ -
45} // namespace Imp
│ │ │ │ -
46
│ │ │ │ -
47
│ │ │ │ -
48
│ │ │ │ -
61template<class C, class I, class F,
│ │ │ │ -
62 typename std::enable_if< Dune::models<Imp::Concept::HasDynamicIndexAccess<I>, C>(), int>::type = 0>
│ │ │ │ -
63auto hybridIndexAccess(C&& c, const I& i, F&& f)
│ │ │ │ -
64 -> decltype(f(c[i]))
│ │ │ │ -
65{
│ │ │ │ -
66 return f(c[i]);
│ │ │ │ -
67}
│ │ │ │ -
68
│ │ │ │ -
86template<class C, class I, class F,
│ │ │ │ -
87 typename std::enable_if< not Dune::models<Imp::Concept::HasDynamicIndexAccess<I>, C>(), int>::type = 0>
│ │ │ │ -
88decltype(auto) hybridIndexAccess(C&& c, const I& i, F&& f)
│ │ │ │ -
89{
│ │ │ │ -
90 using Size = decltype(Hybrid::size(c));
│ │ │ │ -
91 return Hybrid::switchCases(std::make_index_sequence<Size::value>(), i,
│ │ │ │ -
92 [&](const auto& ii) -> decltype(auto){
│ │ │ │ -
93 return f(c[ii]);
│ │ │ │ -
94 }, [&]() -> decltype(auto){
│ │ │ │ -
95 return f(c[Dune::Indices::_0]);
│ │ │ │ -
96 });
│ │ │ │ -
97}
│ │ │ │ -
98
│ │ │ │ +
43template<typename R, typename D>
│ │ │ │ +
44struct IsCallable<R(*)(D)>
│ │ │ │ +
45{
│ │ │ │ +
46 enum { value = true };
│ │ │ │ +
47};
│ │ │ │ +
48#endif
│ │ │ │ +
49
│ │ │ │ +
55template<class Signature, bool isCallable = IsCallable<Signature>::value >
│ │ │ │ + │ │ │ │ +
57
│ │ │ │ +
58#ifndef DOXYGEN
│ │ │ │ +
60template<class T>
│ │ │ │ +
61struct SignatureTraits<T, true>
│ │ │ │ +
62 : public SignatureTraits<decltype(&T::operator()), true>
│ │ │ │ +
63{};
│ │ │ │ +
64
│ │ │ │ +
66template <typename C, typename R, typename D>
│ │ │ │ +
67struct SignatureTraits<R(C::*)(D) const, true>
│ │ │ │ +
68 : public SignatureTraits<R(D), true>
│ │ │ │ +
69{};
│ │ │ │ +
70
│ │ │ │ +
72template <typename C, typename R, typename D>
│ │ │ │ +
73struct SignatureTraits<R(C::*)(D), true>
│ │ │ │ +
74 : public SignatureTraits<R(D), true>
│ │ │ │ +
75{};
│ │ │ │ +
76
│ │ │ │ +
78template <typename R, typename D>
│ │ │ │ +
79struct SignatureTraits<R(*)(D), true>
│ │ │ │ +
80 : public SignatureTraits<R(D), true>
│ │ │ │ +
81{};
│ │ │ │ +
82
│ │ │ │ +
84template<class R, class D>
│ │ │ │ +
85struct SignatureTraits<R(D), true>
│ │ │ │ +
86{
│ │ │ │ +
87 using Range = R;
│ │ │ │ +
88 using Domain = D;
│ │ │ │ +
89
│ │ │ │ +
90 using RawRange = typename std::decay<Range>::type;
│ │ │ │ +
91 using RawDomain = typename std::decay<Domain>::type;
│ │ │ │ +
92
│ │ │ │ +
93 using RawSignature = RawRange(RawDomain);
│ │ │ │ +
94
│ │ │ │ +
95 template<template<class> class DerivativeTraits=DefaultDerivativeTraits>
│ │ │ │ +
96 using DerivativeSignature = typename DerivativeTraits<RawSignature>::Range(Domain);
│ │ │ │ +
97};
│ │ │ │ +
98#endif
│ │ │ │
99
│ │ │ │ -
100namespace Imp {
│ │ │ │ -
101
│ │ │ │ -
115 template<class Index, std::size_t offset=1>
│ │ │ │ -
116 class ShiftedDynamicMultiIndex
│ │ │ │ -
117 {
│ │ │ │ -
118 public:
│ │ │ │ -
119 ShiftedDynamicMultiIndex(const Index& index) :
│ │ │ │ -
120 index_(index)
│ │ │ │ -
121 {}
│ │ │ │ +
100
│ │ │ │ +
101template<class Signature, template<class> class DerivativeTraits=DefaultDerivativeTraits>
│ │ │ │ + │ │ │ │ +
103
│ │ │ │ +
113template<class Range, class Domain, template<class> class DerivativeTraitsT>
│ │ │ │ +
114struct SignatureTag<Range(Domain), DerivativeTraitsT>
│ │ │ │ +
115{
│ │ │ │ +
116 using Signature = Range(Domain);
│ │ │ │ +
117
│ │ │ │ +
118 template<class T>
│ │ │ │ +
119 using DerivativeTraits = DerivativeTraitsT<T>;
│ │ │ │ +
120};
│ │ │ │ +
121
│ │ │ │
122
│ │ │ │ -
123 std::size_t operator[](std::size_t position) const
│ │ │ │ -
124 {
│ │ │ │ -
125 if (position<size())
│ │ │ │ -
126 return index_[position+offset];
│ │ │ │ -
127 else
│ │ │ │ -
128 return 0;
│ │ │ │ -
129 }
│ │ │ │ -
130
│ │ │ │ -
134 ShiftedDynamicMultiIndex<Index, offset+1> pop() const
│ │ │ │ -
135 {
│ │ │ │ -
136 return {index_};
│ │ │ │ -
137 }
│ │ │ │ +
123
│ │ │ │ +
132template<class Range, class Domain, template<class> class DerivativeTraits>
│ │ │ │ +
133auto derivativeSignatureTag(SignatureTag<Range(Domain), DerivativeTraits> tag)
│ │ │ │ +
134{
│ │ │ │ +
135 using DerivativeRange = typename DerivativeTraits<Range(Domain)>::Range;
│ │ │ │ + │ │ │ │ +
137}
│ │ │ │
138
│ │ │ │ -
139 std::size_t size() const
│ │ │ │ -
140 {
│ │ │ │ -
141 if (offset < index_.size())
│ │ │ │ -
142 return index_.size() - offset;
│ │ │ │ -
143 else
│ │ │ │ -
144 return 0;
│ │ │ │ -
145 }
│ │ │ │ -
146
│ │ │ │ -
147 private:
│ │ │ │ -
148 const Index& index_;
│ │ │ │ -
149 };
│ │ │ │ -
150
│ │ │ │ -
151 template<class Index, std::size_t offset=1>
│ │ │ │ -
152 class ShiftedStaticMultiIndex
│ │ │ │ -
153 {
│ │ │ │ -
154 public:
│ │ │ │ -
155 ShiftedStaticMultiIndex(const Index& index) :
│ │ │ │ -
156 index_(index)
│ │ │ │ -
157 {}
│ │ │ │ -
158
│ │ │ │ -
159 template<std::size_t i>
│ │ │ │ -
160 auto operator[](Dune::index_constant<i>) const
│ │ │ │ -
161 {
│ │ │ │ -
162 if constexpr (i<size()) {
│ │ │ │ -
163 return index_[Dune::index_constant<i+offset>{}];
│ │ │ │ -
164 } else {
│ │ │ │ -
165 return Dune::index_constant<0>{};
│ │ │ │ -
166 }
│ │ │ │ -
167 }
│ │ │ │ -
168
│ │ │ │ -
172 ShiftedStaticMultiIndex<Index, offset+1> pop() const
│ │ │ │ -
173 {
│ │ │ │ -
174 return {index_};
│ │ │ │ -
175 }
│ │ │ │ +
139
│ │ │ │ +
140
│ │ │ │ +
154template<std::size_t maxOrder, class Signature, template<class> class DerivativeTraits>
│ │ │ │ + │ │ │ │ +
156{
│ │ │ │ +
157 if constexpr (maxOrder==0) {
│ │ │ │ +
158 // If maxOrder== 0 we just need the given SignatureTag
│ │ │ │ +
159 return std::make_tuple(tag);
│ │ │ │ +
160 } else {
│ │ │ │ +
161 // else we first construct the tail tuple with SignatureTags for derivatives
│ │ │ │ +
162 // of order 1 to maxOrder
│ │ │ │ +
163 auto tailTagsTuple = derivativeSignatureTags<std::size_t(maxOrder-1)>(derivativeSignatureTag(tag));
│ │ │ │ +
164 // and prepend this with the given SignatureTag.
│ │ │ │ +
165 // This is done by unpacking the tail tuple with apply().
│ │ │ │ +
166 return std::apply([&](auto&&... tailTags){
│ │ │ │ +
167 return std::make_tuple(tag, tailTags...);
│ │ │ │ +
168 }, tailTagsTuple);
│ │ │ │ +
169 }
│ │ │ │ +
170}
│ │ │ │ +
171
│ │ │ │ +
172
│ │ │ │ +
173
│ │ │ │ +
174} // namespace Functions
│ │ │ │ +
175} // namespace Dune
│ │ │ │
176
│ │ │ │ -
177 static constexpr std::size_t size()
│ │ │ │ -
178 {
│ │ │ │ -
179 auto fullSize = decltype(Hybrid::size(std::declval<Index>()))::value;
│ │ │ │ -
180 if (offset < fullSize)
│ │ │ │ -
181 return fullSize - offset;
│ │ │ │ -
182 else
│ │ │ │ -
183 return 0;
│ │ │ │ -
184 }
│ │ │ │ -
185
│ │ │ │ -
186 private:
│ │ │ │ -
187 const Index& index_;
│ │ │ │ -
188 };
│ │ │ │ -
189
│ │ │ │ -
195 template<std::size_t offset, class Index>
│ │ │ │ -
196 ShiftedDynamicMultiIndex<Index, offset> shiftedDynamicMultiIndex(const Index& index)
│ │ │ │ -
197 {
│ │ │ │ -
198 return {index};
│ │ │ │ -
199 }
│ │ │ │ -
200
│ │ │ │ -
201 template<std::size_t offset, class Index>
│ │ │ │ -
202 ShiftedStaticMultiIndex<Index, offset> shiftedStaticMultiIndex(const Index& index)
│ │ │ │ -
203 {
│ │ │ │ -
204 return {index};
│ │ │ │ -
205 }
│ │ │ │ -
206
│ │ │ │ -
207} // namespace Imp
│ │ │ │ -
208
│ │ │ │ -
209
│ │ │ │ -
210
│ │ │ │ -
211
│ │ │ │ -
212namespace Imp {
│ │ │ │ -
213
│ │ │ │ -
214template<class Result, class Index>
│ │ │ │ -
215struct MultiIndexResolver
│ │ │ │ -
216{
│ │ │ │ -
217 MultiIndexResolver(const Index& index) :
│ │ │ │ -
218 index_(index)
│ │ │ │ -
219 {}
│ │ │ │ -
220
│ │ │ │ -
221 template<class C,
│ │ │ │ -
222 typename std::enable_if<not std::is_convertible<C&, Result>::value, int>::type = 0>
│ │ │ │ -
223 Result operator()(C&& c)
│ │ │ │ -
224 {
│ │ │ │ -
225 auto&& subIndex = Imp::shiftedDynamicMultiIndex<1>(index_);
│ │ │ │ -
226 auto&& subIndexResolver = MultiIndexResolver<Result, decltype(subIndex)>(subIndex);
│ │ │ │ -
227 return (Result)(hybridIndexAccess(c, index_[Dune::Indices::_0], subIndexResolver));
│ │ │ │ -
228 }
│ │ │ │ -
229
│ │ │ │ -
230 template<class C,
│ │ │ │ -
231 typename std::enable_if<std::is_convertible<C&, Result>::value, int>::type = 0>
│ │ │ │ -
232 Result operator()(C&& c)
│ │ │ │ -
233 {
│ │ │ │ -
234 return (Result)(std::forward<C>(c));
│ │ │ │ -
235 }
│ │ │ │ -
236
│ │ │ │ -
237 const Index& index_;
│ │ │ │ -
238};
│ │ │ │ -
239
│ │ │ │ -
240} // namespace Imp
│ │ │ │ -
241
│ │ │ │ -
242
│ │ │ │ -
243
│ │ │ │ -
262template<class Result, class C, class MultiIndex>
│ │ │ │ -
263Result hybridMultiIndexAccess(C&& c, const MultiIndex& index)
│ │ │ │ -
264{
│ │ │ │ -
265
│ │ │ │ -
266 Imp::MultiIndexResolver<Result, MultiIndex> multiIndexResolver(index);
│ │ │ │ -
267 return multiIndexResolver(c);
│ │ │ │ -
268}
│ │ │ │ -
269
│ │ │ │ -
270
│ │ │ │ -
271
│ │ │ │ -
272
│ │ │ │ -
273
│ │ │ │ -
274
│ │ │ │ -
275namespace Imp {
│ │ │ │ -
276
│ │ │ │ -
277 template<class C, class MultiIndex, class IsFinal>
│ │ │ │ -
278 constexpr decltype(auto) resolveDynamicMultiIndex(C&& c, const MultiIndex& multiIndex, const IsFinal& isFinal)
│ │ │ │ -
279 {
│ │ │ │ -
280 // If c is already considered final simply return it,
│ │ │ │ -
281 // else resolve the next multiIndex entry.
│ │ │ │ -
282 return Hybrid::ifElse(isFinal(c), [&, c = forwardCapture(std::forward<C>(c))](auto) -> decltype(auto) {
│ │ │ │ -
283 assert(multiIndex.size() == 0);
│ │ │ │ -
284 return c.forward();
│ │ │ │ -
285 }, [&](auto) -> decltype(auto) {
│ │ │ │ -
286 auto hasDynamicAccess = callableCheck([](auto&& cc) -> std::void_t<decltype(cc[0])> {});
│ │ │ │ -
287
│ │ │ │ -
288 // Split multiIndex into first entry and remaining ones.
│ │ │ │ -
289 auto i = multiIndex[0];
│ │ │ │ -
290 auto tail = multiIndex.pop();
│ │ │ │ -
291
│ │ │ │ -
292 // Resolve first multiIndex entry by c[multiIndex[0]] and
│ │ │ │ -
293 // continue resolving with the remaining remaining ones.
│ │ │ │ -
294 // If c has a dynamic operator[] this is straight forward.
│ │ │ │ -
295 // Else the dynamic multiIndex[0] has to be translated into
│ │ │ │ -
296 // a static one using hybridIndexAccess.
│ │ │ │ -
297 return Hybrid::ifElse(hasDynamicAccess(c), [&](auto id) -> decltype(auto) {
│ │ │ │ -
298 return Imp::resolveDynamicMultiIndex(id(c)[i], tail, isFinal);
│ │ │ │ -
299 }, [&](auto id) -> decltype(auto) {
│ │ │ │ -
300 // auto indexRange = range(Hybrid::size(id(c)));
│ │ │ │ -
301 auto indexRange = typename decltype(range(Hybrid::size(id(c))))::integer_sequence();
│ │ │ │ -
302 return Hybrid::switchCases(indexRange, i, [&](auto static_i) -> decltype(auto){
│ │ │ │ -
303 // Do rescursion with static version of i
│ │ │ │ -
304 return Imp::resolveDynamicMultiIndex(id(c)[static_i], tail, isFinal);
│ │ │ │ -
305 }, [&]() -> decltype(auto){
│ │ │ │ -
306 // As fallback we use c[0] this is needed, because there must be one branch that matches.
│ │ │ │ -
307 return Imp::resolveDynamicMultiIndex(id(c)[Dune::Indices::_0], tail, isFinal);
│ │ │ │ -
308 });
│ │ │ │ -
309 });
│ │ │ │ -
310 });
│ │ │ │ -
311 }
│ │ │ │ -
312
│ │ │ │ -
313 template<class C, class MultiIndex>
│ │ │ │ -
314 constexpr decltype(auto) resolveStaticMultiIndex(C&& c, const MultiIndex& multiIndex)
│ │ │ │ -
315 {
│ │ │ │ -
316 auto isExhausted = Hybrid::equals(Hybrid::size(multiIndex), Dune::Indices::_0);
│ │ │ │ -
317 return Hybrid::ifElse(isExhausted, [&, c = forwardCapture(std::forward<C>(c))](auto) -> decltype(auto) {
│ │ │ │ -
318 return c.forward();
│ │ │ │ -
319 }, [&](auto id) -> decltype(auto) {
│ │ │ │ -
320 auto head = multiIndex[Dune::Indices::_0];
│ │ │ │ -
321 auto tail = multiIndex.pop();
│ │ │ │ -
322
│ │ │ │ -
323 return Imp::resolveStaticMultiIndex(id(c)[head], tail);
│ │ │ │ -
324 });
│ │ │ │ -
325 }
│ │ │ │ -
326
│ │ │ │ -
327} // namespace Imp
│ │ │ │ -
328
│ │ │ │ -
329
│ │ │ │ -
330
│ │ │ │ -
353template<class C, class MultiIndex, class IsFinal>
│ │ │ │ -
354constexpr decltype(auto) resolveDynamicMultiIndex(C&& c, const MultiIndex& multiIndex, const IsFinal& isFinal)
│ │ │ │ -
355{
│ │ │ │ -
356 return Imp::resolveDynamicMultiIndex(std::forward<C>(c), Imp::shiftedDynamicMultiIndex<0>(multiIndex), isFinal);
│ │ │ │ -
357}
│ │ │ │ -
358
│ │ │ │ -
375template<class C, class MultiIndex>
│ │ │ │ -
376constexpr decltype(auto) resolveDynamicMultiIndex(C&& c, const MultiIndex& multiIndex)
│ │ │ │ -
377{
│ │ │ │ -
378 auto hasNoIndexAccess = negatePredicate(callableCheck([](auto&& cc) -> std::void_t<decltype(cc[Dune::Indices::_0])> {}));
│ │ │ │ -
379 return Imp::resolveDynamicMultiIndex(std::forward<C>(c), Imp::shiftedDynamicMultiIndex<0>(multiIndex), hasNoIndexAccess);
│ │ │ │ -
380}
│ │ │ │ -
381
│ │ │ │ -
397template<class C, class MultiIndex>
│ │ │ │ -
398constexpr decltype(auto) resolveStaticMultiIndex(C&& c, const MultiIndex& multiIndex)
│ │ │ │ -
399{
│ │ │ │ -
400 return Imp::resolveStaticMultiIndex(std::forward<C>(c), Imp::shiftedStaticMultiIndex<0>(multiIndex));
│ │ │ │ -
401}
│ │ │ │ -
402
│ │ │ │ -
403
│ │ │ │ -
404
│ │ │ │ -
405} // namespace Dune::Functions
│ │ │ │ -
406} // namespace Dune
│ │ │ │ -
407
│ │ │ │ -
408
│ │ │ │ -
409
│ │ │ │ -
410#endif // DUNE_FUNCTIONS_COMMON_INDEX_ACCESS_HH
│ │ │ │ - │ │ │ │ -
auto hybridIndexAccess(C &&c, const I &i, F &&f) -> decltype(f(c[i]))
Provide operator[] index-access for containers.
Definition: indexaccess.hh:63
│ │ │ │ -
constexpr decltype(auto) resolveStaticMultiIndex(C &&c, const MultiIndex &multiIndex)
Provide multi-index access by chaining operator[].
Definition: indexaccess.hh:398
│ │ │ │ -
auto callableCheck(Expression f)
Create a predicate for checking validity of expressions.
Definition: utility.hh:279
│ │ │ │ -
constexpr decltype(auto) resolveDynamicMultiIndex(C &&c, const MultiIndex &multiIndex)
Provide multi-index access by chaining operator[].
Definition: indexaccess.hh:376
│ │ │ │ -
constexpr decltype(auto) resolveDynamicMultiIndex(C &&c, const MultiIndex &multiIndex, const IsFinal &isFinal)
Provide multi-index access by chaining operator[].
Definition: indexaccess.hh:354
│ │ │ │ -
Result hybridMultiIndexAccess(C &&c, const MultiIndex &index)
Provide multi-index access by chaining operator[].
Definition: indexaccess.hh:263
│ │ │ │ -
auto negatePredicate(Check check)
Negate given predicate.
Definition: utility.hh:304
│ │ │ │ +
177#endif // DUNE_FUNCTIONS_COMMON_SIGNATURE_HH
│ │ │ │ + │ │ │ │ +
auto derivativeSignatureTag(SignatureTag< Range(Domain), DerivativeTraits > tag)
Construct SignatureTag for derivative.
Definition: signature.hh:133
│ │ │ │ +
auto derivativeSignatureTags(Dune::Functions::SignatureTag< Signature, DerivativeTraits > tag)
Construct SignatureTags for derivatives.
Definition: signature.hh:155
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
auto forwardCapture(T &&t)
Create a capture object for perfect forwarding.
Definition: utility.hh:372
│ │ │ │ +
Helper class to check that F is callable.
Definition: signature.hh:20
│ │ │ │ +
Helper class to deduce the signature of a callable.
Definition: signature.hh:56
│ │ │ │ +
Definition: signature.hh:102
│ │ │ │ +
DerivativeTraitsT< T > DerivativeTraits
Definition: signature.hh:119
│ │ │ │ +
Range(Domain) Signature
Definition: signature.hh:116
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,362 +5,180 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -indexaccess.hh │ │ │ │ │ +signature.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#ifndef DUNE_FUNCTIONS_COMMON_INDEX_ACCESS_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_COMMON_INDEX_ACCESS_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_COMMON_SIGNATURE_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_COMMON_SIGNATURE_HH │ │ │ │ │ 5 │ │ │ │ │ - 6 │ │ │ │ │ - 7#include │ │ │ │ │ - 8#include │ │ │ │ │ - 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8 │ │ │ │ │ + 9#include │ │ │ │ │ + 10 │ │ │ │ │ + 11namespace Dune { │ │ │ │ │ + 12namespace Functions { │ │ │ │ │ 13 │ │ │ │ │ - 14#include │ │ │ │ │ - 15 │ │ │ │ │ - 16 │ │ │ │ │ - 17 │ │ │ │ │ - 18namespace Dune { │ │ │ │ │ - 19namespace Functions { │ │ │ │ │ - 20 │ │ │ │ │ + 19template │ │ │ │ │ +20struct IsCallable; │ │ │ │ │ 21 │ │ │ │ │ - 22namespace Imp { │ │ │ │ │ - 23 │ │ │ │ │ - 24namespace Concept { │ │ │ │ │ - 25 │ │ │ │ │ - 26template │ │ │ │ │ - 27struct HasDynamicIndexAccess │ │ │ │ │ - 28{ │ │ │ │ │ - 29 template │ │ │ │ │ - 30 auto require(C&& c) -> decltype( │ │ │ │ │ - 31 c[std::declval()] │ │ │ │ │ - 32 ); │ │ │ │ │ - 33}; │ │ │ │ │ - 34 │ │ │ │ │ - 35struct HasStaticIndexAccess │ │ │ │ │ - 36{ │ │ │ │ │ - 37 template │ │ │ │ │ - 38 auto require(C&& c) -> decltype( │ │ │ │ │ - 39 c[Dune::Indices::_0] │ │ │ │ │ - 40 ); │ │ │ │ │ + 22#ifndef DOXYGEN │ │ │ │ │ + 23template │ │ │ │ │ + 24struct IsCallable │ │ │ │ │ + 25{ │ │ │ │ │ + 26 struct yes { std::size_t dummy[2]; }; │ │ │ │ │ + 27 struct no { std::size_t dummy[1]; }; │ │ │ │ │ + 28 │ │ │ │ │ + 29 template │ │ │ │ │ + 30 static yes test(const decltype(&C::operator()) *); │ │ │ │ │ + 31 template │ │ │ │ │ + 32 static no test(...); │ │ │ │ │ + 33 │ │ │ │ │ + 34 enum { value = (sizeof(test(0)) == sizeof(yes)) }; │ │ │ │ │ + 35}; │ │ │ │ │ + 36 │ │ │ │ │ + 37template │ │ │ │ │ + 38struct IsCallable │ │ │ │ │ + 39{ │ │ │ │ │ + 40 enum { value = true }; │ │ │ │ │ 41}; │ │ │ │ │ 42 │ │ │ │ │ - 43} // namespace Concept │ │ │ │ │ - 44 │ │ │ │ │ - 45} // namespace Imp │ │ │ │ │ - 46 │ │ │ │ │ - 47 │ │ │ │ │ - 48 │ │ │ │ │ - 61template, C>(), int>::type = 0> │ │ │ │ │ -63auto hybridIndexAccess(C&& c, const I& i, F&& f) │ │ │ │ │ - 64 -> decltype(f(c[i])) │ │ │ │ │ - 65{ │ │ │ │ │ - 66 return f(c[i]); │ │ │ │ │ - 67} │ │ │ │ │ - 68 │ │ │ │ │ - 86template, C>(), int>::type = 0> │ │ │ │ │ -88decltype(auto) hybridIndexAccess(C&& c, const I& i, F&& f) │ │ │ │ │ - 89{ │ │ │ │ │ - 90 using Size = decltype(Hybrid::size(c)); │ │ │ │ │ - 91 return Hybrid::switchCases(std::make_index_sequence(), i, │ │ │ │ │ - 92 [&](const auto& ii) -> decltype(auto){ │ │ │ │ │ - 93 return f(c[ii]); │ │ │ │ │ - 94 }, [&]() -> decltype(auto){ │ │ │ │ │ - 95 return f(c[Dune::Indices::_0]); │ │ │ │ │ - 96 }); │ │ │ │ │ - 97} │ │ │ │ │ - 98 │ │ │ │ │ + 43template │ │ │ │ │ + 44struct IsCallable │ │ │ │ │ + 45{ │ │ │ │ │ + 46 enum { value = true }; │ │ │ │ │ + 47}; │ │ │ │ │ + 48#endif │ │ │ │ │ + 49 │ │ │ │ │ + 55template::value > │ │ │ │ │ +56struct SignatureTraits {}; │ │ │ │ │ + 57 │ │ │ │ │ + 58#ifndef DOXYGEN │ │ │ │ │ + 60template │ │ │ │ │ + 61struct SignatureTraits │ │ │ │ │ + 62 : public SignatureTraits │ │ │ │ │ + 63{}; │ │ │ │ │ + 64 │ │ │ │ │ + 66template │ │ │ │ │ + 67struct SignatureTraits │ │ │ │ │ + 68 : public SignatureTraits │ │ │ │ │ + 69{}; │ │ │ │ │ + 70 │ │ │ │ │ + 72template │ │ │ │ │ + 73struct SignatureTraits │ │ │ │ │ + 74 : public SignatureTraits │ │ │ │ │ + 75{}; │ │ │ │ │ + 76 │ │ │ │ │ + 78template │ │ │ │ │ + 79struct SignatureTraits │ │ │ │ │ + 80 : public SignatureTraits │ │ │ │ │ + 81{}; │ │ │ │ │ + 82 │ │ │ │ │ + 84template │ │ │ │ │ + 85struct SignatureTraits │ │ │ │ │ + 86{ │ │ │ │ │ + 87 using Range = R; │ │ │ │ │ + 88 using Domain = D; │ │ │ │ │ + 89 │ │ │ │ │ + 90 using RawRange = typename std::decay::type; │ │ │ │ │ + 91 using RawDomain = typename std::decay::type; │ │ │ │ │ + 92 │ │ │ │ │ + 93 using RawSignature = RawRange(RawDomain); │ │ │ │ │ + 94 │ │ │ │ │ + 95 template class DerivativeTraits=DefaultDerivativeTraits> │ │ │ │ │ + 96 using DerivativeSignature = typename DerivativeTraits::Range │ │ │ │ │ +(Domain); │ │ │ │ │ + 97}; │ │ │ │ │ + 98#endif │ │ │ │ │ 99 │ │ │ │ │ - 100namespace Imp { │ │ │ │ │ - 101 │ │ │ │ │ - 115 template │ │ │ │ │ - 116 class ShiftedDynamicMultiIndex │ │ │ │ │ - 117 { │ │ │ │ │ - 118 public: │ │ │ │ │ - 119 ShiftedDynamicMultiIndex(const Index& index) : │ │ │ │ │ - 120 index_(index) │ │ │ │ │ - 121 {} │ │ │ │ │ + 100 │ │ │ │ │ + 101template class │ │ │ │ │ +DerivativeTraits=DefaultDerivativeTraits> │ │ │ │ │ +102struct SignatureTag; │ │ │ │ │ + 103 │ │ │ │ │ + 113template class │ │ │ │ │ +DerivativeTraitsT> │ │ │ │ │ +114struct SignatureTag │ │ │ │ │ + 115{ │ │ │ │ │ +116 using Signature = Range(Domain); │ │ │ │ │ + 117 │ │ │ │ │ + 118 template │ │ │ │ │ +119 using DerivativeTraits = DerivativeTraitsT; │ │ │ │ │ + 120}; │ │ │ │ │ + 121 │ │ │ │ │ 122 │ │ │ │ │ - 123 std::size_t operator[](std::size_t position) const │ │ │ │ │ - 124 { │ │ │ │ │ - 125 if (position pop() const │ │ │ │ │ - 135 { │ │ │ │ │ - 136 return {index_}; │ │ │ │ │ - 137 } │ │ │ │ │ + 123 │ │ │ │ │ + 132template class DerivativeTraits> │ │ │ │ │ +133auto derivativeSignatureTag(SignatureTag │ │ │ │ │ +tag) │ │ │ │ │ + 134{ │ │ │ │ │ + 135 using DerivativeRange = typename DerivativeTraits::Range; │ │ │ │ │ + 136 return SignatureTag(); │ │ │ │ │ + 137} │ │ │ │ │ 138 │ │ │ │ │ - 139 std::size_t size() const │ │ │ │ │ - 140 { │ │ │ │ │ - 141 if (offset < index_.size()) │ │ │ │ │ - 142 return index_.size() - offset; │ │ │ │ │ - 143 else │ │ │ │ │ - 144 return 0; │ │ │ │ │ - 145 } │ │ │ │ │ - 146 │ │ │ │ │ - 147 private: │ │ │ │ │ - 148 const Index& index_; │ │ │ │ │ - 149 }; │ │ │ │ │ - 150 │ │ │ │ │ - 151 template │ │ │ │ │ - 152 class ShiftedStaticMultiIndex │ │ │ │ │ - 153 { │ │ │ │ │ - 154 public: │ │ │ │ │ - 155 ShiftedStaticMultiIndex(const Index& index) : │ │ │ │ │ - 156 index_(index) │ │ │ │ │ - 157 {} │ │ │ │ │ - 158 │ │ │ │ │ - 159 template │ │ │ │ │ - 160 auto operator[](Dune::index_constant) const │ │ │ │ │ - 161 { │ │ │ │ │ - 162 if constexpr (i{}]; │ │ │ │ │ - 164 } else { │ │ │ │ │ - 165 return Dune::index_constant<0>{}; │ │ │ │ │ - 166 } │ │ │ │ │ - 167 } │ │ │ │ │ - 168 │ │ │ │ │ - 172 ShiftedStaticMultiIndex pop() const │ │ │ │ │ - 173 { │ │ │ │ │ - 174 return {index_}; │ │ │ │ │ - 175 } │ │ │ │ │ + 139 │ │ │ │ │ + 140 │ │ │ │ │ + 154template class │ │ │ │ │ +DerivativeTraits> │ │ │ │ │ +155auto derivativeSignatureTags(Dune::Functions::SignatureTag tag) │ │ │ │ │ + 156{ │ │ │ │ │ + 157 if constexpr (maxOrder==0) { │ │ │ │ │ + 158 // If maxOrder== 0 we just need the given SignatureTag │ │ │ │ │ + 159 return std::make_tuple(tag); │ │ │ │ │ + 160 } else { │ │ │ │ │ + 161 // else we first construct the tail tuple with SignatureTags for │ │ │ │ │ +derivatives │ │ │ │ │ + 162 // of order 1 to maxOrder │ │ │ │ │ + 163 auto tailTagsTuple = derivativeSignatureTags │ │ │ │ │ +(derivativeSignatureTag(tag)); │ │ │ │ │ + 164 // and prepend this with the given SignatureTag. │ │ │ │ │ + 165 // This is done by unpacking the tail tuple with apply(). │ │ │ │ │ + 166 return std::apply([&](auto&&... tailTags){ │ │ │ │ │ + 167 return std::make_tuple(tag, tailTags...); │ │ │ │ │ + 168 }, tailTagsTuple); │ │ │ │ │ + 169 } │ │ │ │ │ + 170} │ │ │ │ │ + 171 │ │ │ │ │ + 172 │ │ │ │ │ + 173 │ │ │ │ │ + 174} // namespace Functions │ │ │ │ │ + 175} // namespace Dune │ │ │ │ │ 176 │ │ │ │ │ - 177 static constexpr std::size_t size() │ │ │ │ │ - 178 { │ │ │ │ │ - 179 auto fullSize = decltype(Hybrid::size(std::declval()))::value; │ │ │ │ │ - 180 if (offset < fullSize) │ │ │ │ │ - 181 return fullSize - offset; │ │ │ │ │ - 182 else │ │ │ │ │ - 183 return 0; │ │ │ │ │ - 184 } │ │ │ │ │ - 185 │ │ │ │ │ - 186 private: │ │ │ │ │ - 187 const Index& index_; │ │ │ │ │ - 188 }; │ │ │ │ │ - 189 │ │ │ │ │ - 195 template │ │ │ │ │ - 196 ShiftedDynamicMultiIndex shiftedDynamicMultiIndex(const │ │ │ │ │ -Index& index) │ │ │ │ │ - 197 { │ │ │ │ │ - 198 return {index}; │ │ │ │ │ - 199 } │ │ │ │ │ - 200 │ │ │ │ │ - 201 template │ │ │ │ │ - 202 ShiftedStaticMultiIndex shiftedStaticMultiIndex(const │ │ │ │ │ -Index& index) │ │ │ │ │ - 203 { │ │ │ │ │ - 204 return {index}; │ │ │ │ │ - 205 } │ │ │ │ │ - 206 │ │ │ │ │ - 207} // namespace Imp │ │ │ │ │ - 208 │ │ │ │ │ - 209 │ │ │ │ │ - 210 │ │ │ │ │ - 211 │ │ │ │ │ - 212namespace Imp { │ │ │ │ │ - 213 │ │ │ │ │ - 214template │ │ │ │ │ - 215struct MultiIndexResolver │ │ │ │ │ - 216{ │ │ │ │ │ - 217 MultiIndexResolver(const Index& index) : │ │ │ │ │ - 218 index_(index) │ │ │ │ │ - 219 {} │ │ │ │ │ - 220 │ │ │ │ │ - 221 template::value, int>:: │ │ │ │ │ -type = 0> │ │ │ │ │ - 223 Result operator()(C&& c) │ │ │ │ │ - 224 { │ │ │ │ │ - 225 auto&& subIndex = Imp::shiftedDynamicMultiIndex<1>(index_); │ │ │ │ │ - 226 auto&& subIndexResolver = MultiIndexResolver │ │ │ │ │ -(subIndex); │ │ │ │ │ - 227 return (Result)(hybridIndexAccess(c, index_[Dune::Indices::_0], │ │ │ │ │ -subIndexResolver)); │ │ │ │ │ - 228 } │ │ │ │ │ - 229 │ │ │ │ │ - 230 template::value, int>::type │ │ │ │ │ -= 0> │ │ │ │ │ - 232 Result operator()(C&& c) │ │ │ │ │ - 233 { │ │ │ │ │ - 234 return (Result)(std::forward(c)); │ │ │ │ │ - 235 } │ │ │ │ │ - 236 │ │ │ │ │ - 237 const Index& index_; │ │ │ │ │ - 238}; │ │ │ │ │ - 239 │ │ │ │ │ - 240} // namespace Imp │ │ │ │ │ - 241 │ │ │ │ │ - 242 │ │ │ │ │ - 243 │ │ │ │ │ - 262template │ │ │ │ │ -263Result hybridMultiIndexAccess(C&& c, const MultiIndex& index) │ │ │ │ │ - 264{ │ │ │ │ │ - 265 │ │ │ │ │ - 266 Imp::MultiIndexResolver multiIndexResolver(index); │ │ │ │ │ - 267 return multiIndexResolver(c); │ │ │ │ │ - 268} │ │ │ │ │ - 269 │ │ │ │ │ - 270 │ │ │ │ │ - 271 │ │ │ │ │ - 272 │ │ │ │ │ - 273 │ │ │ │ │ - 274 │ │ │ │ │ - 275namespace Imp { │ │ │ │ │ - 276 │ │ │ │ │ - 277 template │ │ │ │ │ - 278 constexpr decltype(auto) resolveDynamicMultiIndex(C&& c, const MultiIndex& │ │ │ │ │ -multiIndex, const IsFinal& isFinal) │ │ │ │ │ - 279 { │ │ │ │ │ - 280 // If c is already considered final simply return it, │ │ │ │ │ - 281 // else resolve the next multiIndex entry. │ │ │ │ │ - 282 return Hybrid::ifElse(isFinal(c), [&, c = forwardCapture(std::forward │ │ │ │ │ -(c))](auto) -> decltype(auto) { │ │ │ │ │ - 283 assert(multiIndex.size() == 0); │ │ │ │ │ - 284 return c.forward(); │ │ │ │ │ - 285 }, [&](auto) -> decltype(auto) { │ │ │ │ │ - 286 auto hasDynamicAccess = callableCheck([](auto&& cc) -> std:: │ │ │ │ │ -void_t {}); │ │ │ │ │ - 287 │ │ │ │ │ - 288 // Split multiIndex into first entry and remaining ones. │ │ │ │ │ - 289 auto i = multiIndex[0]; │ │ │ │ │ - 290 auto tail = multiIndex.pop(); │ │ │ │ │ - 291 │ │ │ │ │ - 292 // Resolve first multiIndex entry by c[multiIndex[0]] and │ │ │ │ │ - 293 // continue resolving with the remaining remaining ones. │ │ │ │ │ - 294 // If c has a dynamic operator[] this is straight forward. │ │ │ │ │ - 295 // Else the dynamic multiIndex[0] has to be translated into │ │ │ │ │ - 296 // a static one using hybridIndexAccess. │ │ │ │ │ - 297 return Hybrid::ifElse(hasDynamicAccess(c), [&](auto id) -> decltype(auto) │ │ │ │ │ -{ │ │ │ │ │ - 298 return Imp::resolveDynamicMultiIndex(id(c)[i], tail, isFinal); │ │ │ │ │ - 299 }, [&](auto id) -> decltype(auto) { │ │ │ │ │ - 300 // auto indexRange = range(Hybrid::size(id(c))); │ │ │ │ │ - 301 auto indexRange = typename decltype(range(Hybrid::size(id(c)))):: │ │ │ │ │ -integer_sequence(); │ │ │ │ │ - 302 return Hybrid::switchCases(indexRange, i, [&](auto static_i) -> decltype │ │ │ │ │ -(auto){ │ │ │ │ │ - 303 // Do rescursion with static version of i │ │ │ │ │ - 304 return Imp::resolveDynamicMultiIndex(id(c)[static_i], tail, isFinal); │ │ │ │ │ - 305 }, [&]() -> decltype(auto){ │ │ │ │ │ - 306 // As fallback we use c[0] this is needed, because there must be one │ │ │ │ │ -branch that matches. │ │ │ │ │ - 307 return Imp::resolveDynamicMultiIndex(id(c)[Dune::Indices::_0], tail, │ │ │ │ │ -isFinal); │ │ │ │ │ - 308 }); │ │ │ │ │ - 309 }); │ │ │ │ │ - 310 }); │ │ │ │ │ - 311 } │ │ │ │ │ - 312 │ │ │ │ │ - 313 template │ │ │ │ │ - 314 constexpr decltype(auto) resolveStaticMultiIndex(C&& c, const MultiIndex& │ │ │ │ │ -multiIndex) │ │ │ │ │ - 315 { │ │ │ │ │ - 316 auto isExhausted = Hybrid::equals(Hybrid::size(multiIndex), Dune:: │ │ │ │ │ -Indices::_0); │ │ │ │ │ - 317 return Hybrid::ifElse(isExhausted, [&, c = forwardCapture(std::forward │ │ │ │ │ -(c))](auto) -> decltype(auto) { │ │ │ │ │ - 318 return c.forward(); │ │ │ │ │ - 319 }, [&](auto id) -> decltype(auto) { │ │ │ │ │ - 320 auto head = multiIndex[Dune::Indices::_0]; │ │ │ │ │ - 321 auto tail = multiIndex.pop(); │ │ │ │ │ - 322 │ │ │ │ │ - 323 return Imp::resolveStaticMultiIndex(id(c)[head], tail); │ │ │ │ │ - 324 }); │ │ │ │ │ - 325 } │ │ │ │ │ - 326 │ │ │ │ │ - 327} // namespace Imp │ │ │ │ │ - 328 │ │ │ │ │ - 329 │ │ │ │ │ - 330 │ │ │ │ │ - 353template │ │ │ │ │ -354constexpr decltype(auto) resolveDynamicMultiIndex(C&& c, const MultiIndex& │ │ │ │ │ -multiIndex, const IsFinal& isFinal) │ │ │ │ │ - 355{ │ │ │ │ │ - 356 return Imp::resolveDynamicMultiIndex(std::forward(c), Imp:: │ │ │ │ │ -shiftedDynamicMultiIndex<0>(multiIndex), isFinal); │ │ │ │ │ - 357} │ │ │ │ │ - 358 │ │ │ │ │ - 375template │ │ │ │ │ -376constexpr decltype(auto) resolveDynamicMultiIndex(C&& c, const MultiIndex& │ │ │ │ │ -multiIndex) │ │ │ │ │ - 377{ │ │ │ │ │ - 378 auto hasNoIndexAccess = negatePredicate(callableCheck([](auto&& cc) - │ │ │ │ │ -> std::void_t {})); │ │ │ │ │ - 379 return Imp::resolveDynamicMultiIndex(std::forward(c), Imp:: │ │ │ │ │ -shiftedDynamicMultiIndex<0>(multiIndex), hasNoIndexAccess); │ │ │ │ │ - 380} │ │ │ │ │ - 381 │ │ │ │ │ - 397template │ │ │ │ │ -398constexpr decltype(auto) resolveStaticMultiIndex(C&& c, const MultiIndex& │ │ │ │ │ -multiIndex) │ │ │ │ │ - 399{ │ │ │ │ │ - 400 return Imp::resolveStaticMultiIndex(std::forward(c), Imp:: │ │ │ │ │ -shiftedStaticMultiIndex<0>(multiIndex)); │ │ │ │ │ - 401} │ │ │ │ │ - 402 │ │ │ │ │ - 403 │ │ │ │ │ - 404 │ │ │ │ │ - 405} // namespace Dune::Functions │ │ │ │ │ - 406} // namespace Dune │ │ │ │ │ - 407 │ │ │ │ │ - 408 │ │ │ │ │ - 409 │ │ │ │ │ - 410#endif // DUNE_FUNCTIONS_COMMON_INDEX_ACCESS_HH │ │ │ │ │ -utility.hh │ │ │ │ │ -Dune::Functions::hybridIndexAccess │ │ │ │ │ -auto hybridIndexAccess(C &&c, const I &i, F &&f) -> decltype(f(c[i])) │ │ │ │ │ -Provide operator[] index-access for containers. │ │ │ │ │ -Definition: indexaccess.hh:63 │ │ │ │ │ -Dune::Functions::resolveStaticMultiIndex │ │ │ │ │ -constexpr decltype(auto) resolveStaticMultiIndex(C &&c, const MultiIndex │ │ │ │ │ -&multiIndex) │ │ │ │ │ -Provide multi-index access by chaining operator[]. │ │ │ │ │ -Definition: indexaccess.hh:398 │ │ │ │ │ -Dune::Functions::callableCheck │ │ │ │ │ -auto callableCheck(Expression f) │ │ │ │ │ -Create a predicate for checking validity of expressions. │ │ │ │ │ -Definition: utility.hh:279 │ │ │ │ │ -Dune::Functions::resolveDynamicMultiIndex │ │ │ │ │ -constexpr decltype(auto) resolveDynamicMultiIndex(C &&c, const MultiIndex │ │ │ │ │ -&multiIndex) │ │ │ │ │ -Provide multi-index access by chaining operator[]. │ │ │ │ │ -Definition: indexaccess.hh:376 │ │ │ │ │ -Dune::Functions::resolveDynamicMultiIndex │ │ │ │ │ -constexpr decltype(auto) resolveDynamicMultiIndex(C &&c, const MultiIndex │ │ │ │ │ -&multiIndex, const IsFinal &isFinal) │ │ │ │ │ -Provide multi-index access by chaining operator[]. │ │ │ │ │ -Definition: indexaccess.hh:354 │ │ │ │ │ -Dune::Functions::hybridMultiIndexAccess │ │ │ │ │ -Result hybridMultiIndexAccess(C &&c, const MultiIndex &index) │ │ │ │ │ -Provide multi-index access by chaining operator[]. │ │ │ │ │ -Definition: indexaccess.hh:263 │ │ │ │ │ -Dune::Functions::negatePredicate │ │ │ │ │ -auto negatePredicate(Check check) │ │ │ │ │ -Negate given predicate. │ │ │ │ │ -Definition: utility.hh:304 │ │ │ │ │ + 177#endif // DUNE_FUNCTIONS_COMMON_SIGNATURE_HH │ │ │ │ │ +defaultderivativetraits.hh │ │ │ │ │ +Dune::Functions::derivativeSignatureTag │ │ │ │ │ +auto derivativeSignatureTag(SignatureTag< Range(Domain), DerivativeTraits > │ │ │ │ │ +tag) │ │ │ │ │ +Construct SignatureTag for derivative. │ │ │ │ │ +Definition: signature.hh:133 │ │ │ │ │ +Dune::Functions::derivativeSignatureTags │ │ │ │ │ +auto derivativeSignatureTags(Dune::Functions::SignatureTag< Signature, │ │ │ │ │ +DerivativeTraits > tag) │ │ │ │ │ +Construct SignatureTags for derivatives. │ │ │ │ │ +Definition: signature.hh:155 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::forwardCapture │ │ │ │ │ -auto forwardCapture(T &&t) │ │ │ │ │ -Create a capture object for perfect forwarding. │ │ │ │ │ -Definition: utility.hh:372 │ │ │ │ │ +Dune::Functions::IsCallable │ │ │ │ │ +Helper class to check that F is callable. │ │ │ │ │ +Definition: signature.hh:20 │ │ │ │ │ +Dune::Functions::SignatureTraits │ │ │ │ │ +Helper class to deduce the signature of a callable. │ │ │ │ │ +Definition: signature.hh:56 │ │ │ │ │ +Dune::Functions::SignatureTag │ │ │ │ │ +Definition: signature.hh:102 │ │ │ │ │ +Dune::Functions::SignatureTag<_Range(Domain),_DerivativeTraitsT_>:: │ │ │ │ │ +DerivativeTraits │ │ │ │ │ +DerivativeTraitsT< T > DerivativeTraits │ │ │ │ │ +Definition: signature.hh:119 │ │ │ │ │ +Dune::Functions::SignatureTag<_Range(Domain),_DerivativeTraitsT_>::Signature │ │ │ │ │ +Range(Domain) Signature │ │ │ │ │ +Definition: signature.hh:116 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00020.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: signature.hh File Reference │ │ │ │ +dune-functions: differentiablefunction_imp.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,52 +63,30 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
signature.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
differentiablefunction_imp.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ -#include <tuple>
│ │ │ │ -#include <dune/functions/common/defaultderivativetraits.hh>
│ │ │ │ +
#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/common/concept.hh>
│ │ │ │ +#include <dune/functions/common/type_traits.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

struct  Dune::Functions::SignatureTraits< Signature, isCallable >
 Helper class to deduce the signature of a callable. More...
 
struct  Dune::Functions::SignatureTag< Range(Domain), DerivativeTraitsT >
 Tag-class to encapsulate signature information. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<class Range , class Domain , template< class > class DerivativeTraits>
auto Dune::Functions::derivativeSignatureTag (SignatureTag< Range(Domain), DerivativeTraits > tag)
 Construct SignatureTag for derivative. More...
 
template<std::size_t maxOrder, class Signature , template< class > class DerivativeTraits>
auto Dune::Functions::derivativeSignatureTags (Dune::Functions::SignatureTag< Signature, DerivativeTraits > tag)
 Construct SignatureTags for derivatives. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,41 +5,21 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -Classes | Namespaces | Functions │ │ │ │ │ -signature.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Namespaces │ │ │ │ │ +differentiablefunction_imp.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ - Classes │ │ │ │ │ -struct  Dune::Functions::SignatureTraits<_Signature,_isCallable_> │ │ │ │ │ -  Helper class to deduce the signature of a callable. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::SignatureTag<_Range(Domain),_DerivativeTraitsT_> │ │ │ │ │ -  Tag-class to encapsulate signature information. More... │ │ │ │ │ -  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ - Functions │ │ │ │ │ -template class │ │ │ │ │ -DerivativeTraits> │ │ │ │ │ -auto Dune::Functions::derivativeSignatureTag (SignatureTag< Range(Domain), │ │ │ │ │ - DerivativeTraits > tag) │ │ │ │ │ -  Construct SignatureTag for derivative. More... │ │ │ │ │ -  │ │ │ │ │ -template class │ │ │ │ │ -DerivativeTraits> │ │ │ │ │ -auto Dune::Functions::derivativeSignatureTags (Dune::Functions::SignatureTag< │ │ │ │ │ - Signature, DerivativeTraits > tag) │ │ │ │ │ -  Construct SignatureTags for derivatives. More... │ │ │ │ │ -  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00020_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: signature.hh Source File │ │ │ │ +dune-functions: differentiablefunction_imp.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,158 +62,116 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
signature.hh
│ │ │ │ +
differentiablefunction_imp.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#ifndef DUNE_FUNCTIONS_COMMON_SIGNATURE_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_COMMON_SIGNATURE_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_IMP_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_IMP_HH
│ │ │ │
5
│ │ │ │ -
6#include <type_traits>
│ │ │ │ -
7#include <tuple>
│ │ │ │ +
6#include <dune/common/exceptions.hh>
│ │ │ │ +
7#include <dune/common/concept.hh>
│ │ │ │
8
│ │ │ │ - │ │ │ │ + │ │ │ │
10
│ │ │ │ -
11namespace Dune {
│ │ │ │ -
12namespace Functions {
│ │ │ │ -
13
│ │ │ │ -
19template<typename F>
│ │ │ │ - │ │ │ │ -
21
│ │ │ │ -
22#ifndef DOXYGEN
│ │ │ │ -
23template<typename F>
│ │ │ │ -
24struct IsCallable
│ │ │ │ -
25{
│ │ │ │ -
26 struct yes { std::size_t dummy[2]; };
│ │ │ │ -
27 struct no { std::size_t dummy[1]; };
│ │ │ │ +
11
│ │ │ │ +
12namespace Dune {
│ │ │ │ +
13namespace Functions {
│ │ │ │ +
14namespace Imp {
│ │ │ │ +
15
│ │ │ │ +
19struct HasFreeDerivative
│ │ │ │ +
20{
│ │ │ │ +
21 template<class F>
│ │ │ │ +
22 auto require(F&& f) -> decltype(
│ │ │ │ +
23 derivative(f)
│ │ │ │ +
24 );
│ │ │ │ +
25};
│ │ │ │ +
26
│ │ │ │ +
27
│ │ │ │
28
│ │ │ │ -
29 template<typename C>
│ │ │ │ -
30 static yes test(const decltype(&C::operator()) *);
│ │ │ │ -
31 template<typename C>
│ │ │ │ -
32 static no test(...);
│ │ │ │ -
33
│ │ │ │ -
34 enum { value = (sizeof(test<F>(0)) == sizeof(yes)) };
│ │ │ │ -
35};
│ │ │ │ +
29template<class Dummy, class F,
│ │ │ │ +
30 typename std::enable_if<
│ │ │ │ +
31 models< HasFreeDerivative, F>() , int>::type = 0>
│ │ │ │ +
32auto derivativeIfImplemented(const F& f) -> decltype(derivative(f))
│ │ │ │ +
33{
│ │ │ │ +
34 return derivative(f);
│ │ │ │ +
35}
│ │ │ │
36
│ │ │ │ -
37template<typename R, typename D>
│ │ │ │ -
38struct IsCallable<R(D)>
│ │ │ │ -
39{
│ │ │ │ -
40 enum { value = true };
│ │ │ │ -
41};
│ │ │ │ -
42
│ │ │ │ -
43template<typename R, typename D>
│ │ │ │ -
44struct IsCallable<R(*)(D)>
│ │ │ │ -
45{
│ │ │ │ -
46 enum { value = true };
│ │ │ │ -
47};
│ │ │ │ -
48#endif
│ │ │ │ -
49
│ │ │ │ -
55template<class Signature, bool isCallable = IsCallable<Signature>::value >
│ │ │ │ - │ │ │ │ -
57
│ │ │ │ -
58#ifndef DOXYGEN
│ │ │ │ -
60template<class T>
│ │ │ │ -
61struct SignatureTraits<T, true>
│ │ │ │ -
62 : public SignatureTraits<decltype(&T::operator()), true>
│ │ │ │ -
63{};
│ │ │ │ -
64
│ │ │ │ -
66template <typename C, typename R, typename D>
│ │ │ │ -
67struct SignatureTraits<R(C::*)(D) const, true>
│ │ │ │ -
68 : public SignatureTraits<R(D), true>
│ │ │ │ -
69{};
│ │ │ │ -
70
│ │ │ │ -
72template <typename C, typename R, typename D>
│ │ │ │ -
73struct SignatureTraits<R(C::*)(D), true>
│ │ │ │ -
74 : public SignatureTraits<R(D), true>
│ │ │ │ -
75{};
│ │ │ │ -
76
│ │ │ │ -
78template <typename R, typename D>
│ │ │ │ -
79struct SignatureTraits<R(*)(D), true>
│ │ │ │ -
80 : public SignatureTraits<R(D), true>
│ │ │ │ -
81{};
│ │ │ │ -
82
│ │ │ │ -
84template<class R, class D>
│ │ │ │ -
85struct SignatureTraits<R(D), true>
│ │ │ │ -
86{
│ │ │ │ -
87 using Range = R;
│ │ │ │ -
88 using Domain = D;
│ │ │ │ -
89
│ │ │ │ -
90 using RawRange = typename std::decay<Range>::type;
│ │ │ │ -
91 using RawDomain = typename std::decay<Domain>::type;
│ │ │ │ +
37
│ │ │ │ +
38
│ │ │ │ +
39template<class Dummy, class F,
│ │ │ │ +
40 typename std::enable_if<
│ │ │ │ +
41 not(models< HasFreeDerivative, F>()) , int>::type = 0>
│ │ │ │ +
42Dummy derivativeIfImplemented(const F& f)
│ │ │ │ +
43{
│ │ │ │ +
44 DUNE_THROW(Dune::NotImplemented, "Derivative not implemented");
│ │ │ │ +
45}
│ │ │ │ +
46
│ │ │ │ +
47
│ │ │ │ +
48
│ │ │ │ +
49template<class Signature, class DerivativeInterface>
│ │ │ │ +
50class DifferentiableFunctionWrapperInterface
│ │ │ │ +
51{};
│ │ │ │ +
52
│ │ │ │ +
53// Interface of type erasure wrapper
│ │ │ │ +
54//
│ │ │ │ +
55// Notice that the basic interface of polymorphic classes (destructor, clone, ...)
│ │ │ │ +
56// will be added by the type erasure foundation classes.
│ │ │ │ +
57template<class Range, class Domain, class DerivativeInterface>
│ │ │ │ +
58class DifferentiableFunctionWrapperInterface<Range(Domain), DerivativeInterface>
│ │ │ │ +
59{
│ │ │ │ +
60public:
│ │ │ │ +
61 virtual Range operator() (const Domain& x) const = 0;
│ │ │ │ +
62
│ │ │ │ +
63 virtual DerivativeInterface derivative() const = 0;
│ │ │ │ +
64};
│ │ │ │ +
65
│ │ │ │ +
66
│ │ │ │ +
67
│ │ │ │ +
68template<class Signature, class DerivativeInterface, class B>
│ │ │ │ +
69class DifferentiableFunctionWrapperImplementation
│ │ │ │ +
70{};
│ │ │ │ +
71
│ │ │ │ +
72// Implementation of type erasure wrapper
│ │ │ │ +
73template<class Range, class Domain, class DerivativeInterface, class B>
│ │ │ │ +
74class DifferentiableFunctionWrapperImplementation< Range(Domain), DerivativeInterface, B> :
│ │ │ │ +
75 public B
│ │ │ │ +
76{
│ │ │ │ +
77public:
│ │ │ │ +
78
│ │ │ │ +
79 using B::B;
│ │ │ │ +
80 using Wrapped = typename B::Wrapped;
│ │ │ │ +
81
│ │ │ │ +
82 virtual Range operator() (const Domain& x) const
│ │ │ │ +
83 {
│ │ │ │ +
84 return this->get()(x);
│ │ │ │ +
85 }
│ │ │ │ +
86
│ │ │ │ +
87 virtual DerivativeInterface derivative() const
│ │ │ │ +
88 {
│ │ │ │ +
89 return derivativeIfImplemented<DerivativeInterface, Wrapped>(this->get());
│ │ │ │ +
90 }
│ │ │ │ +
91};
│ │ │ │
92
│ │ │ │ -
93 using RawSignature = RawRange(RawDomain);
│ │ │ │ +
93
│ │ │ │
94
│ │ │ │ -
95 template<template<class> class DerivativeTraits=DefaultDerivativeTraits>
│ │ │ │ -
96 using DerivativeSignature = typename DerivativeTraits<RawSignature>::Range(Domain);
│ │ │ │ -
97};
│ │ │ │ -
98#endif
│ │ │ │ -
99
│ │ │ │ -
100
│ │ │ │ -
101template<class Signature, template<class> class DerivativeTraits=DefaultDerivativeTraits>
│ │ │ │ - │ │ │ │ -
103
│ │ │ │ -
113template<class Range, class Domain, template<class> class DerivativeTraitsT>
│ │ │ │ -
114struct SignatureTag<Range(Domain), DerivativeTraitsT>
│ │ │ │ -
115{
│ │ │ │ -
116 using Signature = Range(Domain);
│ │ │ │ -
117
│ │ │ │ -
118 template<class T>
│ │ │ │ -
119 using DerivativeTraits = DerivativeTraitsT<T>;
│ │ │ │ -
120};
│ │ │ │ -
121
│ │ │ │ -
122
│ │ │ │ -
123
│ │ │ │ -
132template<class Range, class Domain, template<class> class DerivativeTraits>
│ │ │ │ -
133auto derivativeSignatureTag(SignatureTag<Range(Domain), DerivativeTraits> tag)
│ │ │ │ -
134{
│ │ │ │ -
135 using DerivativeRange = typename DerivativeTraits<Range(Domain)>::Range;
│ │ │ │ - │ │ │ │ -
137}
│ │ │ │ -
138
│ │ │ │ -
139
│ │ │ │ -
140
│ │ │ │ -
154template<std::size_t maxOrder, class Signature, template<class> class DerivativeTraits>
│ │ │ │ - │ │ │ │ -
156{
│ │ │ │ -
157 if constexpr (maxOrder==0) {
│ │ │ │ -
158 // If maxOrder== 0 we just need the given SignatureTag
│ │ │ │ -
159 return std::make_tuple(tag);
│ │ │ │ -
160 } else {
│ │ │ │ -
161 // else we first construct the tail tuple with SignatureTags for derivatives
│ │ │ │ -
162 // of order 1 to maxOrder
│ │ │ │ -
163 auto tailTagsTuple = derivativeSignatureTags<std::size_t(maxOrder-1)>(derivativeSignatureTag(tag));
│ │ │ │ -
164 // and prepend this with the given SignatureTag.
│ │ │ │ -
165 // This is done by unpacking the tail tuple with apply().
│ │ │ │ -
166 return std::apply([&](auto&&... tailTags){
│ │ │ │ -
167 return std::make_tuple(tag, tailTags...);
│ │ │ │ -
168 }, tailTagsTuple);
│ │ │ │ -
169 }
│ │ │ │ -
170}
│ │ │ │ -
171
│ │ │ │ -
172
│ │ │ │ -
173
│ │ │ │ -
174} // namespace Functions
│ │ │ │ -
175} // namespace Dune
│ │ │ │ -
176
│ │ │ │ -
177#endif // DUNE_FUNCTIONS_COMMON_SIGNATURE_HH
│ │ │ │ - │ │ │ │ -
auto derivativeSignatureTag(SignatureTag< Range(Domain), DerivativeTraits > tag)
Construct SignatureTag for derivative.
Definition: signature.hh:133
│ │ │ │ -
auto derivativeSignatureTags(Dune::Functions::SignatureTag< Signature, DerivativeTraits > tag)
Construct SignatureTags for derivatives.
Definition: signature.hh:155
│ │ │ │ +
95}}} // namespace Dune::Functions::Imp
│ │ │ │ +
96
│ │ │ │ +
97
│ │ │ │ +
98
│ │ │ │ +
99#endif // DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_IMP_HH
│ │ │ │ + │ │ │ │ +
TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const TrigonometricFunction< K, sinFactor, cosFactor > &f)
Obtain derivative of TrigonometricFunction function.
Definition: trigonometricfunction.hh:39
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
Helper class to check that F is callable.
Definition: signature.hh:20
│ │ │ │ -
Helper class to deduce the signature of a callable.
Definition: signature.hh:56
│ │ │ │ -
Definition: signature.hh:102
│ │ │ │ -
DerivativeTraitsT< T > DerivativeTraits
Definition: signature.hh:119
│ │ │ │ -
Range(Domain) Signature
Definition: signature.hh:116
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,180 +5,119 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -signature.hh │ │ │ │ │ +differentiablefunction_imp.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#ifndef DUNE_FUNCTIONS_COMMON_SIGNATURE_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_COMMON_SIGNATURE_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_IMP_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_IMP_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ 8 │ │ │ │ │ - 9#include │ │ │ │ │ + 9#include │ │ │ │ │ 10 │ │ │ │ │ - 11namespace Dune { │ │ │ │ │ - 12namespace Functions { │ │ │ │ │ - 13 │ │ │ │ │ - 19template │ │ │ │ │ -20struct IsCallable; │ │ │ │ │ - 21 │ │ │ │ │ - 22#ifndef DOXYGEN │ │ │ │ │ - 23template │ │ │ │ │ - 24struct IsCallable │ │ │ │ │ - 25{ │ │ │ │ │ - 26 struct yes { std::size_t dummy[2]; }; │ │ │ │ │ - 27 struct no { std::size_t dummy[1]; }; │ │ │ │ │ + 11 │ │ │ │ │ + 12namespace Dune { │ │ │ │ │ + 13namespace Functions { │ │ │ │ │ + 14namespace Imp { │ │ │ │ │ + 15 │ │ │ │ │ + 19struct HasFreeDerivative │ │ │ │ │ + 20{ │ │ │ │ │ + 21 template │ │ │ │ │ + 22 auto require(F&& f) -> decltype( │ │ │ │ │ + 23 derivative(f) │ │ │ │ │ + 24 ); │ │ │ │ │ + 25}; │ │ │ │ │ + 26 │ │ │ │ │ + 27 │ │ │ │ │ 28 │ │ │ │ │ - 29 template │ │ │ │ │ - 30 static yes test(const decltype(&C::operator()) *); │ │ │ │ │ - 31 template │ │ │ │ │ - 32 static no test(...); │ │ │ │ │ - 33 │ │ │ │ │ - 34 enum { value = (sizeof(test(0)) == sizeof(yes)) }; │ │ │ │ │ - 35}; │ │ │ │ │ + 29template() , int>::type = 0> │ │ │ │ │ + 32auto derivativeIfImplemented(const F& f) -> decltype(derivative(f)) │ │ │ │ │ + 33{ │ │ │ │ │ + 34 return derivative(f); │ │ │ │ │ + 35} │ │ │ │ │ 36 │ │ │ │ │ - 37template │ │ │ │ │ - 38struct IsCallable │ │ │ │ │ - 39{ │ │ │ │ │ - 40 enum { value = true }; │ │ │ │ │ - 41}; │ │ │ │ │ - 42 │ │ │ │ │ - 43template │ │ │ │ │ - 44struct IsCallable │ │ │ │ │ - 45{ │ │ │ │ │ - 46 enum { value = true }; │ │ │ │ │ - 47}; │ │ │ │ │ - 48#endif │ │ │ │ │ - 49 │ │ │ │ │ - 55template::value > │ │ │ │ │ -56struct SignatureTraits {}; │ │ │ │ │ - 57 │ │ │ │ │ - 58#ifndef DOXYGEN │ │ │ │ │ - 60template │ │ │ │ │ - 61struct SignatureTraits │ │ │ │ │ - 62 : public SignatureTraits │ │ │ │ │ - 63{}; │ │ │ │ │ - 64 │ │ │ │ │ - 66template │ │ │ │ │ - 67struct SignatureTraits │ │ │ │ │ - 68 : public SignatureTraits │ │ │ │ │ - 69{}; │ │ │ │ │ - 70 │ │ │ │ │ - 72template │ │ │ │ │ - 73struct SignatureTraits │ │ │ │ │ - 74 : public SignatureTraits │ │ │ │ │ - 75{}; │ │ │ │ │ - 76 │ │ │ │ │ - 78template │ │ │ │ │ - 79struct SignatureTraits │ │ │ │ │ - 80 : public SignatureTraits │ │ │ │ │ - 81{}; │ │ │ │ │ - 82 │ │ │ │ │ - 84template │ │ │ │ │ - 85struct SignatureTraits │ │ │ │ │ - 86{ │ │ │ │ │ - 87 using Range = R; │ │ │ │ │ - 88 using Domain = D; │ │ │ │ │ - 89 │ │ │ │ │ - 90 using RawRange = typename std::decay::type; │ │ │ │ │ - 91 using RawDomain = typename std::decay::type; │ │ │ │ │ + 37 │ │ │ │ │ + 38 │ │ │ │ │ + 39template()) , int>::type = 0> │ │ │ │ │ + 42Dummy derivativeIfImplemented(const F& f) │ │ │ │ │ + 43{ │ │ │ │ │ + 44 DUNE_THROW(Dune::NotImplemented, "Derivative not implemented"); │ │ │ │ │ + 45} │ │ │ │ │ + 46 │ │ │ │ │ + 47 │ │ │ │ │ + 48 │ │ │ │ │ + 49template │ │ │ │ │ + 50class DifferentiableFunctionWrapperInterface │ │ │ │ │ + 51{}; │ │ │ │ │ + 52 │ │ │ │ │ + 53// Interface of type erasure wrapper │ │ │ │ │ + 54// │ │ │ │ │ + 55// Notice that the basic interface of polymorphic classes (destructor, │ │ │ │ │ +clone, ...) │ │ │ │ │ + 56// will be added by the type erasure foundation classes. │ │ │ │ │ + 57template │ │ │ │ │ + 58class DifferentiableFunctionWrapperInterface │ │ │ │ │ + 59{ │ │ │ │ │ + 60public: │ │ │ │ │ + 61 virtual Range operator() (const Domain& x) const = 0; │ │ │ │ │ + 62 │ │ │ │ │ + 63 virtual DerivativeInterface derivative() const = 0; │ │ │ │ │ + 64}; │ │ │ │ │ + 65 │ │ │ │ │ + 66 │ │ │ │ │ + 67 │ │ │ │ │ + 68template │ │ │ │ │ + 69class DifferentiableFunctionWrapperImplementation │ │ │ │ │ + 70{}; │ │ │ │ │ + 71 │ │ │ │ │ + 72// Implementation of type erasure wrapper │ │ │ │ │ + 73template │ │ │ │ │ + 74class DifferentiableFunctionWrapperImplementation< Range(Domain), │ │ │ │ │ +DerivativeInterface, B> : │ │ │ │ │ + 75 public B │ │ │ │ │ + 76{ │ │ │ │ │ + 77public: │ │ │ │ │ + 78 │ │ │ │ │ + 79 using B::B; │ │ │ │ │ + 80 using Wrapped = typename B::Wrapped; │ │ │ │ │ + 81 │ │ │ │ │ + 82 virtual Range operator() (const Domain& x) const │ │ │ │ │ + 83 { │ │ │ │ │ + 84 return this->get()(x); │ │ │ │ │ + 85 } │ │ │ │ │ + 86 │ │ │ │ │ + 87 virtual DerivativeInterface derivative() const │ │ │ │ │ + 88 { │ │ │ │ │ + 89 return derivativeIfImplemented(this->get()); │ │ │ │ │ + 90 } │ │ │ │ │ + 91}; │ │ │ │ │ 92 │ │ │ │ │ - 93 using RawSignature = RawRange(RawDomain); │ │ │ │ │ + 93 │ │ │ │ │ 94 │ │ │ │ │ - 95 template class DerivativeTraits=DefaultDerivativeTraits> │ │ │ │ │ - 96 using DerivativeSignature = typename DerivativeTraits::Range │ │ │ │ │ -(Domain); │ │ │ │ │ - 97}; │ │ │ │ │ - 98#endif │ │ │ │ │ - 99 │ │ │ │ │ - 100 │ │ │ │ │ - 101template class │ │ │ │ │ -DerivativeTraits=DefaultDerivativeTraits> │ │ │ │ │ -102struct SignatureTag; │ │ │ │ │ - 103 │ │ │ │ │ - 113template class │ │ │ │ │ -DerivativeTraitsT> │ │ │ │ │ -114struct SignatureTag │ │ │ │ │ - 115{ │ │ │ │ │ -116 using Signature = Range(Domain); │ │ │ │ │ - 117 │ │ │ │ │ - 118 template │ │ │ │ │ -119 using DerivativeTraits = DerivativeTraitsT; │ │ │ │ │ - 120}; │ │ │ │ │ - 121 │ │ │ │ │ - 122 │ │ │ │ │ - 123 │ │ │ │ │ - 132template class DerivativeTraits> │ │ │ │ │ -133auto derivativeSignatureTag(SignatureTag │ │ │ │ │ -tag) │ │ │ │ │ - 134{ │ │ │ │ │ - 135 using DerivativeRange = typename DerivativeTraits::Range; │ │ │ │ │ - 136 return SignatureTag(); │ │ │ │ │ - 137} │ │ │ │ │ - 138 │ │ │ │ │ - 139 │ │ │ │ │ - 140 │ │ │ │ │ - 154template class │ │ │ │ │ -DerivativeTraits> │ │ │ │ │ -155auto derivativeSignatureTags(Dune::Functions::SignatureTag tag) │ │ │ │ │ - 156{ │ │ │ │ │ - 157 if constexpr (maxOrder==0) { │ │ │ │ │ - 158 // If maxOrder== 0 we just need the given SignatureTag │ │ │ │ │ - 159 return std::make_tuple(tag); │ │ │ │ │ - 160 } else { │ │ │ │ │ - 161 // else we first construct the tail tuple with SignatureTags for │ │ │ │ │ -derivatives │ │ │ │ │ - 162 // of order 1 to maxOrder │ │ │ │ │ - 163 auto tailTagsTuple = derivativeSignatureTags │ │ │ │ │ -(derivativeSignatureTag(tag)); │ │ │ │ │ - 164 // and prepend this with the given SignatureTag. │ │ │ │ │ - 165 // This is done by unpacking the tail tuple with apply(). │ │ │ │ │ - 166 return std::apply([&](auto&&... tailTags){ │ │ │ │ │ - 167 return std::make_tuple(tag, tailTags...); │ │ │ │ │ - 168 }, tailTagsTuple); │ │ │ │ │ - 169 } │ │ │ │ │ - 170} │ │ │ │ │ - 171 │ │ │ │ │ - 172 │ │ │ │ │ - 173 │ │ │ │ │ - 174} // namespace Functions │ │ │ │ │ - 175} // namespace Dune │ │ │ │ │ - 176 │ │ │ │ │ - 177#endif // DUNE_FUNCTIONS_COMMON_SIGNATURE_HH │ │ │ │ │ -defaultderivativetraits.hh │ │ │ │ │ -Dune::Functions::derivativeSignatureTag │ │ │ │ │ -auto derivativeSignatureTag(SignatureTag< Range(Domain), DerivativeTraits > │ │ │ │ │ -tag) │ │ │ │ │ -Construct SignatureTag for derivative. │ │ │ │ │ -Definition: signature.hh:133 │ │ │ │ │ -Dune::Functions::derivativeSignatureTags │ │ │ │ │ -auto derivativeSignatureTags(Dune::Functions::SignatureTag< Signature, │ │ │ │ │ -DerivativeTraits > tag) │ │ │ │ │ -Construct SignatureTags for derivatives. │ │ │ │ │ -Definition: signature.hh:155 │ │ │ │ │ + 95}}} // namespace Dune::Functions::Imp │ │ │ │ │ + 96 │ │ │ │ │ + 97 │ │ │ │ │ + 98 │ │ │ │ │ + 99#endif // DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_IMP_HH │ │ │ │ │ +type_traits.hh │ │ │ │ │ +Dune::Functions::derivative │ │ │ │ │ +TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const │ │ │ │ │ +TrigonometricFunction< K, sinFactor, cosFactor > &f) │ │ │ │ │ +Obtain derivative of TrigonometricFunction function. │ │ │ │ │ +Definition: trigonometricfunction.hh:39 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::IsCallable │ │ │ │ │ -Helper class to check that F is callable. │ │ │ │ │ -Definition: signature.hh:20 │ │ │ │ │ -Dune::Functions::SignatureTraits │ │ │ │ │ -Helper class to deduce the signature of a callable. │ │ │ │ │ -Definition: signature.hh:56 │ │ │ │ │ -Dune::Functions::SignatureTag │ │ │ │ │ -Definition: signature.hh:102 │ │ │ │ │ -Dune::Functions::SignatureTag<_Range(Domain),_DerivativeTraitsT_>:: │ │ │ │ │ -DerivativeTraits │ │ │ │ │ -DerivativeTraitsT< T > DerivativeTraits │ │ │ │ │ -Definition: signature.hh:119 │ │ │ │ │ -Dune::Functions::SignatureTag<_Range(Domain),_DerivativeTraitsT_>::Signature │ │ │ │ │ -Range(Domain) Signature │ │ │ │ │ -Definition: signature.hh:116 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00023.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: localfunction_imp.hh File Reference │ │ │ │ +dune-functions: callable.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,29 +63,50 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Namespaces
│ │ │ │ -
localfunction_imp.hh File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
callable.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <dune/functions/common/type_traits.hh>
│ │ │ │ -#include <dune/functions/common/differentiablefunction_imp.hh>
│ │ │ │ +
#include <memory>
│ │ │ │ +#include <functional>
│ │ │ │ +#include <dune/common/function.hh>
│ │ │ │ +#include <dune/common/shared_ptr.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ +Classes

class  Dune::Functions::CallableFunctionWrapper< F >
 Wrap a Dune::VirtualFunction into a callable object. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<class F >
CallableFunctionWrapper< F > Dune::Functions::callable (const F &f)
 Create a callable object from some Dune::VirtualFunction. More...
 
template<class F >
CallableFunctionWrapper< F > Dune::Functions::callable (const std::shared_ptr< F > &fp)
 Create a callable object from std::shared_ptr<F> More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,20 +5,38 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -Namespaces │ │ │ │ │ -localfunction_imp.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Functions │ │ │ │ │ +callable.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ + Classes │ │ │ │ │ +class  Dune::Functions::CallableFunctionWrapper<_F_> │ │ │ │ │ +  Wrap a Dune::VirtualFunction into a callable object. More... │ │ │ │ │ +  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +CallableFunctionWrapper< F > Dune::Functions::callable (const F &f) │ │ │ │ │ +  Create a callable object from some Dune:: │ │ │ │ │ + VirtualFunction. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +CallableFunctionWrapper< F > Dune::Functions::callable (const std::shared_ptr< │ │ │ │ │ + F > &fp) │ │ │ │ │ +  Create a callable object from std::shared_ptr │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00023_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: localfunction_imp.hh Source File │ │ │ │ +dune-functions: callable.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,88 +62,90 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
localfunction_imp.hh
│ │ │ │ +
callable.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#ifndef DUNE_FUNCTIONS_COMMON_LOCALFUNCTION_FUNCTION_IMP_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_COMMON_LOCALFUNCTION_FUNCTION_IMP_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_COMMON_CALLABLE_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_COMMON_CALLABLE_HH
│ │ │ │
5
│ │ │ │ - │ │ │ │ - │ │ │ │ +
6#include <memory>
│ │ │ │ +
7#include <functional>
│ │ │ │
8
│ │ │ │ -
9
│ │ │ │ -
10
│ │ │ │ -
11namespace Dune {
│ │ │ │ -
12namespace Functions {
│ │ │ │ -
13namespace Imp {
│ │ │ │ -
14
│ │ │ │ -
15// Interface of type erasure wrapper
│ │ │ │ -
16//
│ │ │ │ -
17// Notice that the basic interface of polymorphic classes (destructor, clone, ...)
│ │ │ │ -
18// will be added by the type erasure foundation classes.
│ │ │ │ -
19template<class Signature, class DerivativeInterface, class LocalContext>
│ │ │ │ -
20class LocalFunctionWrapperInterface :
│ │ │ │ -
21 public DifferentiableFunctionWrapperInterface<Signature, DerivativeInterface>
│ │ │ │ -
22{
│ │ │ │ -
23public:
│ │ │ │ -
24 virtual void bind(const LocalContext&) = 0;
│ │ │ │ -
25
│ │ │ │ -
26 virtual void unbind() = 0;
│ │ │ │ -
27
│ │ │ │ -
28 virtual bool bound() const = 0;
│ │ │ │ -
29
│ │ │ │ -
30 virtual const LocalContext& localContext() const = 0;
│ │ │ │ -
31};
│ │ │ │ -
32
│ │ │ │ -
33
│ │ │ │ -
34// Implementation of type erasure wrapper
│ │ │ │ -
35template<class Signature, class DerivativeInterface, class LocalContext, class B>
│ │ │ │ -
36class LocalFunctionWrapperImplementation :
│ │ │ │ -
37 public DifferentiableFunctionWrapperImplementation<Signature, DerivativeInterface, B>
│ │ │ │ +
9#include <dune/common/function.hh>
│ │ │ │ +
10#include <dune/common/shared_ptr.hh>
│ │ │ │ +
11
│ │ │ │ +
12
│ │ │ │ +
13namespace Dune {
│ │ │ │ +
14namespace Functions {
│ │ │ │ +
15
│ │ │ │ +
16
│ │ │ │ +
17
│ │ │ │ +
18
│ │ │ │ +
36template<class F>
│ │ │ │ + │ │ │ │
38{
│ │ │ │ -
39 using Base = DifferentiableFunctionWrapperImplementation<Signature, DerivativeInterface, B>;
│ │ │ │ -
40public:
│ │ │ │ -
41 using Base::Base;
│ │ │ │ -
42
│ │ │ │ -
43 virtual void bind(const LocalContext& context)
│ │ │ │ -
44 {
│ │ │ │ -
45 this->get().bind(context);
│ │ │ │ -
46 }
│ │ │ │ -
47
│ │ │ │ -
48 virtual void unbind()
│ │ │ │ -
49 {
│ │ │ │ -
50 this->get().unbind();
│ │ │ │ -
51 }
│ │ │ │ -
52
│ │ │ │ -
53 virtual bool bound() const
│ │ │ │ -
54 {
│ │ │ │ -
55 return this->get().bound();
│ │ │ │ -
56 }
│ │ │ │ -
57
│ │ │ │ -
58 virtual const LocalContext& localContext() const
│ │ │ │ -
59 {
│ │ │ │ -
60 return this->get().localContext();
│ │ │ │ -
61 }
│ │ │ │ -
62};
│ │ │ │ -
63
│ │ │ │ -
64}}} // namespace Dune::Functions::Imp
│ │ │ │ -
65
│ │ │ │ -
66
│ │ │ │ -
67
│ │ │ │ -
68#endif // DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_IMP_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ +
39 using Range = typename F::RangeType;
│ │ │ │ +
40 using Domain = typename F::DomainType;
│ │ │ │ +
41
│ │ │ │ +
42 public:
│ │ │ │ +
43
│ │ │ │ + │ │ │ │ +
51 {
│ │ │ │ +
52 f_ = Dune::stackobject_to_shared_ptr(f);
│ │ │ │ +
53 }
│ │ │ │ +
54
│ │ │ │ +
61 CallableFunctionWrapper(const std::shared_ptr<const F>& f) :
│ │ │ │ +
62 f_(f)
│ │ │ │ +
63 {}
│ │ │ │ +
64
│ │ │ │ +
70 Range operator()(const Domain& x) const
│ │ │ │ +
71 {
│ │ │ │ +
72 Range y;
│ │ │ │ +
73 f_->evaluate(x, y);
│ │ │ │ +
74 return y;
│ │ │ │ +
75 }
│ │ │ │ +
76
│ │ │ │ +
77 private:
│ │ │ │ +
78 std::shared_ptr<const F> f_;
│ │ │ │ +
79};
│ │ │ │ +
80
│ │ │ │ +
81
│ │ │ │ +
82
│ │ │ │ +
104template<class F>
│ │ │ │ + │ │ │ │ +
106{
│ │ │ │ + │ │ │ │ +
108}
│ │ │ │ +
109
│ │ │ │ +
110
│ │ │ │ +
136template<class F>
│ │ │ │ +
137CallableFunctionWrapper<F> callable(const std::shared_ptr<F>& fp)
│ │ │ │ +
138{
│ │ │ │ + │ │ │ │ +
140}
│ │ │ │ +
141
│ │ │ │ +
142
│ │ │ │ +
143
│ │ │ │ +
144} // namespace Functions
│ │ │ │ +
145} // namespace Dune
│ │ │ │ +
146
│ │ │ │ +
147#endif //DUNE_FUNCTIONS_COMMON_CALLABLE_HH
│ │ │ │ +
CallableFunctionWrapper< F > callable(const F &f)
Create a callable object from some Dune::VirtualFunction.
Definition: callable.hh:105
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ +
Wrap a Dune::VirtualFunction into a callable object.
Definition: callable.hh:38
│ │ │ │ +
Range operator()(const Domain &x) const
Forward operator() to F::evaluate()
Definition: callable.hh:70
│ │ │ │ +
CallableFunctionWrapper(const F &f)
Instantiate from reference to f.
Definition: callable.hh:50
│ │ │ │ +
CallableFunctionWrapper(const std::shared_ptr< const F > &f)
Instantiate from std::shared_ptr to f.
Definition: callable.hh:61
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,89 +5,100 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -localfunction_imp.hh │ │ │ │ │ +callable.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#ifndef DUNE_FUNCTIONS_COMMON_LOCALFUNCTION_FUNCTION_IMP_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_COMMON_LOCALFUNCTION_FUNCTION_IMP_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_COMMON_CALLABLE_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_COMMON_CALLABLE_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ 8 │ │ │ │ │ - 9 │ │ │ │ │ - 10 │ │ │ │ │ - 11namespace Dune { │ │ │ │ │ - 12namespace Functions { │ │ │ │ │ - 13namespace Imp { │ │ │ │ │ - 14 │ │ │ │ │ - 15// Interface of type erasure wrapper │ │ │ │ │ - 16// │ │ │ │ │ - 17// Notice that the basic interface of polymorphic classes (destructor, │ │ │ │ │ -clone, ...) │ │ │ │ │ - 18// will be added by the type erasure foundation classes. │ │ │ │ │ - 19template │ │ │ │ │ - 20class LocalFunctionWrapperInterface : │ │ │ │ │ - 21 public DifferentiableFunctionWrapperInterface │ │ │ │ │ - 22{ │ │ │ │ │ - 23public: │ │ │ │ │ - 24 virtual void bind(const LocalContext&) = 0; │ │ │ │ │ - 25 │ │ │ │ │ - 26 virtual void unbind() = 0; │ │ │ │ │ - 27 │ │ │ │ │ - 28 virtual bool bound() const = 0; │ │ │ │ │ - 29 │ │ │ │ │ - 30 virtual const LocalContext& localContext() const = 0; │ │ │ │ │ - 31}; │ │ │ │ │ - 32 │ │ │ │ │ - 33 │ │ │ │ │ - 34// Implementation of type erasure wrapper │ │ │ │ │ - 35template │ │ │ │ │ - 36class LocalFunctionWrapperImplementation : │ │ │ │ │ - 37 public DifferentiableFunctionWrapperImplementation │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11 │ │ │ │ │ + 12 │ │ │ │ │ + 13namespace Dune { │ │ │ │ │ + 14namespace Functions { │ │ │ │ │ + 15 │ │ │ │ │ + 16 │ │ │ │ │ + 17 │ │ │ │ │ + 18 │ │ │ │ │ + 36template │ │ │ │ │ +37class CallableFunctionWrapper │ │ │ │ │ 38{ │ │ │ │ │ - 39 using Base = DifferentiableFunctionWrapperImplementation; │ │ │ │ │ - 40public: │ │ │ │ │ - 41 using Base::Base; │ │ │ │ │ - 42 │ │ │ │ │ - 43 virtual void bind(const LocalContext& context) │ │ │ │ │ - 44 { │ │ │ │ │ - 45 this->get().bind(context); │ │ │ │ │ - 46 } │ │ │ │ │ - 47 │ │ │ │ │ - 48 virtual void unbind() │ │ │ │ │ - 49 { │ │ │ │ │ - 50 this->get().unbind(); │ │ │ │ │ - 51 } │ │ │ │ │ - 52 │ │ │ │ │ - 53 virtual bool bound() const │ │ │ │ │ - 54 { │ │ │ │ │ - 55 return this->get().bound(); │ │ │ │ │ - 56 } │ │ │ │ │ - 57 │ │ │ │ │ - 58 virtual const LocalContext& localContext() const │ │ │ │ │ - 59 { │ │ │ │ │ - 60 return this->get().localContext(); │ │ │ │ │ - 61 } │ │ │ │ │ - 62}; │ │ │ │ │ - 63 │ │ │ │ │ - 64}}} // namespace Dune::Functions::Imp │ │ │ │ │ - 65 │ │ │ │ │ - 66 │ │ │ │ │ - 67 │ │ │ │ │ - 68#endif // DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_IMP_HH │ │ │ │ │ -type_traits.hh │ │ │ │ │ -differentiablefunction_imp.hh │ │ │ │ │ + 39 using Range = typename F::RangeType; │ │ │ │ │ + 40 using Domain = typename F::DomainType; │ │ │ │ │ + 41 │ │ │ │ │ + 42 public: │ │ │ │ │ + 43 │ │ │ │ │ +50 CallableFunctionWrapper(const F& f) │ │ │ │ │ + 51 { │ │ │ │ │ + 52 f_ = Dune::stackobject_to_shared_ptr(f); │ │ │ │ │ + 53 } │ │ │ │ │ + 54 │ │ │ │ │ +61 CallableFunctionWrapper(const std::shared_ptr& f) : │ │ │ │ │ + 62 f_(f) │ │ │ │ │ + 63 {} │ │ │ │ │ + 64 │ │ │ │ │ +70 Range operator()(const Domain& x) const │ │ │ │ │ + 71 { │ │ │ │ │ + 72 Range y; │ │ │ │ │ + 73 f_->evaluate(x, y); │ │ │ │ │ + 74 return y; │ │ │ │ │ + 75 } │ │ │ │ │ + 76 │ │ │ │ │ + 77 private: │ │ │ │ │ + 78 std::shared_ptr f_; │ │ │ │ │ + 79}; │ │ │ │ │ + 80 │ │ │ │ │ + 81 │ │ │ │ │ + 82 │ │ │ │ │ + 104template │ │ │ │ │ +105CallableFunctionWrapper callable(const F& f) │ │ │ │ │ + 106{ │ │ │ │ │ + 107 return CallableFunctionWrapper(f); │ │ │ │ │ + 108} │ │ │ │ │ + 109 │ │ │ │ │ + 110 │ │ │ │ │ + 136template │ │ │ │ │ +137CallableFunctionWrapper callable(const std::shared_ptr& fp) │ │ │ │ │ + 138{ │ │ │ │ │ + 139 return CallableFunctionWrapper(fp); │ │ │ │ │ + 140} │ │ │ │ │ + 141 │ │ │ │ │ + 142 │ │ │ │ │ + 143 │ │ │ │ │ + 144} // namespace Functions │ │ │ │ │ + 145} // namespace Dune │ │ │ │ │ + 146 │ │ │ │ │ + 147#endif //DUNE_FUNCTIONS_COMMON_CALLABLE_HH │ │ │ │ │ +Dune::Functions::callable │ │ │ │ │ +CallableFunctionWrapper< F > callable(const F &f) │ │ │ │ │ +Create a callable object from some Dune::VirtualFunction. │ │ │ │ │ +Definition: callable.hh:105 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ +Dune::Functions::CallableFunctionWrapper │ │ │ │ │ +Wrap a Dune::VirtualFunction into a callable object. │ │ │ │ │ +Definition: callable.hh:38 │ │ │ │ │ +Dune::Functions::CallableFunctionWrapper::operator() │ │ │ │ │ +Range operator()(const Domain &x) const │ │ │ │ │ +Forward operator() to F::evaluate() │ │ │ │ │ +Definition: callable.hh:70 │ │ │ │ │ +Dune::Functions::CallableFunctionWrapper::CallableFunctionWrapper │ │ │ │ │ +CallableFunctionWrapper(const F &f) │ │ │ │ │ +Instantiate from reference to f. │ │ │ │ │ +Definition: callable.hh:50 │ │ │ │ │ +Dune::Functions::CallableFunctionWrapper::CallableFunctionWrapper │ │ │ │ │ +CallableFunctionWrapper(const std::shared_ptr< const F > &f) │ │ │ │ │ +Instantiate from std::shared_ptr to f. │ │ │ │ │ +Definition: callable.hh:61 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00026.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: functionconcepts.hh File Reference │ │ │ │ +dune-functions: reserveddeque.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,123 +65,68 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Functions
│ │ │ │ -
functionconcepts.hh File Reference
│ │ │ │ +Macros
│ │ │ │ +
reserveddeque.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <dune/common/typelist.hh>
│ │ │ │ -#include <dune/common/concept.hh>
│ │ │ │ -#include <dune/functions/common/signature.hh>
│ │ │ │ -#include <dune/functions/gridfunctions/localderivativetraits.hh>
│ │ │ │ -#include <dune/functions/gridfunctions/gridviewentityset.hh>
│ │ │ │ + │ │ │ │ +

An stl-compliant double-ended queue which stores everything on the stack. │ │ │ │ +More...

│ │ │ │ +
#include <algorithm>
│ │ │ │ +#include <iostream>
│ │ │ │ +#include <cstddef>
│ │ │ │ +#include <initializer_list>
│ │ │ │ +#include <dune/common/genericiterator.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::Functions::Concept::Callable< Args >
 Concept objects that can be called with given argument list. More...
 
struct  Dune::Functions::Concept::Function< Range(Domain)>
 Concept for a function mapping Domain to Range. More...
 
struct  Dune::Functions::Concept::DifferentiableFunction< Range(Domain), DerivativeTraits >
 Concept for a differentiable function mapping Domain to Range. More...
 
struct  Dune::Functions::Concept::LocalFunction< Range(Domain), LocalContext >
 Concept for a local function mapping Domain to Range. More...
 
struct  Dune::Functions::Concept::DifferentiableLocalFunction< Range(Domain), LocalContext, DerivativeTraits >
 Concept for a differentiable local function mapping Domain to Range. More...
 
struct  Dune::Functions::Concept::EntitySet
 Concept for an entity set for a Concept::GridFunction<Range(Domain), EntitySet, DerivativeTraits> More...
 
struct  Dune::Functions::Concept::GridFunction< Range(Domain), EntitySet >
 Concept for a grid function mapping Domain to Range. More...
 
struct  Dune::Functions::Concept::DifferentiableGridFunction< Range(Domain), EntitySet, DerivativeTraits >
 Concept for a differentiable grid function mapping Domain to Range. More...
 
struct  Dune::Functions::Concept::GridViewFunction< Range(Domain), GridView >
 Concept for a grid view function mapping Domain to Range. More...
 
struct  Dune::Functions::Concept::DifferentiableGridViewFunction< Range(Domain), GridView, DerivativeTraits >
 Concept for a differentiable grid view function mapping Domain to Range. More...
class  Dune::Functions::ReservedDeque< T, n >
 A double-ended queue (deque) class with statically reserved memory. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
namespace  Dune::Functions::Concept
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Functions

template<class F , class... Args>
static constexpr auto Dune::Functions::Concept::isCallable ()
 Check if f is callable with given argument list. More...
 
template<class F , class... Args>
static constexpr auto Dune::Functions::Concept::isCallable (F &&, Args &&...)
 Check if f is callable with given argument list. More...
 
template<class F , class Signature >
static constexpr bool Dune::Functions::Concept::isFunction ()
 Check if F models the Function concept with given signature. More...
 
template<class F , class Signature , template< class > class DerivativeTraits>
static constexpr bool Dune::Functions::Concept::isFunction (F &&f, SignatureTag< Signature, DerivativeTraits >)
 Check if f models the Function concept with given signature. More...
 
template<class F , class Signature , template< class > class DerivativeTraits = DefaultDerivativeTraits>
static constexpr bool Dune::Functions::Concept::isDifferentiableFunction ()
 Check if F models the DifferentiableFunction concept with given signature. More...
 
template<class F , class Signature , template< class > class DerivativeTraits>
static constexpr bool Dune::Functions::Concept::isDifferentiableFunction (F &&f, SignatureTag< Signature, DerivativeTraits >)
 Check if f models the DifferentiableFunction concept with given signature. More...
 
template<class F , class Signature , class LocalContext >
static constexpr bool Dune::Functions::Concept::isLocalFunction ()
 Check if F models the LocalFunction concept with given signature and local context. More...
 
template<class F , class Signature , class LocalContext , template< class > class DerivativeTraits = DefaultDerivativeTraits>
static constexpr bool Dune::Functions::Concept::isDifferentiableLocalFunction ()
 Check if F models the DifferentiableLocalFunction concept with given signature and local context. More...
 
template<class E >
static constexpr bool Dune::Functions::Concept::isEntitySet ()
 Check if F models the GridFunction concept with given signature and entity set. More...
 
template<class F , class Signature , class EntitySet >
static constexpr bool Dune::Functions::Concept::isGridFunction ()
 Check if F models the GridFunction concept with given signature and entity set. More...
 
template<class F , class Signature , class EntitySet , template< class > class DerivativeTraits = DefaultDerivativeTraits>
static constexpr bool Dune::Functions::Concept::isDifferentiableGridFunction ()
 Check if F models the DifferentiableGridFunction concept with given signature and entity set. More...
 
template<class F , class Signature , class GridView >
static constexpr bool Dune::Functions::Concept::isGridViewFunction ()
 Check if F models the GridViewFunction concept with given signature. More...
 
template<class F , class Signature , class GridView , template< class > class DerivativeTraits = DefaultDerivativeTraits>
static constexpr bool Dune::Functions::Concept::isDifferentiableGridViewFunction ()
 Check if F models the DifferentiableGridViewFunction concept with given signature. More...
 

│ │ │ │ +Macros

#define CHECKSIZE(X)   {}
 
│ │ │ │ +

Detailed Description

│ │ │ │ +

An stl-compliant double-ended queue which stores everything on the stack.

│ │ │ │ +

Macro Definition Documentation

│ │ │ │ + │ │ │ │ +

◆ CHECKSIZE

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define CHECKSIZE( X)   {}
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,137 +5,38 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -Classes | Namespaces | Functions │ │ │ │ │ -functionconcepts.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Macros │ │ │ │ │ +reserveddeque.hh File Reference │ │ │ │ │ +An stl-compliant double-ended queue which stores everything on the stack. │ │ │ │ │ +More... │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -struct  Dune::Functions::Concept::Callable<_Args_> │ │ │ │ │ -  Concept objects that can be called with given argument list. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::Concept::Function<_Range(Domain)> │ │ │ │ │ -  Concept for a function mapping Domain to Range. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::Concept::DifferentiableFunction<_Range(Domain), │ │ │ │ │ - DerivativeTraits_> │ │ │ │ │ -  Concept for a differentiable function mapping Domain to Range. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::Concept::LocalFunction<_Range(Domain),_LocalContext_> │ │ │ │ │ -  Concept for a local function mapping Domain to Range. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::Concept::DifferentiableLocalFunction<_Range(Domain), │ │ │ │ │ - LocalContext,_DerivativeTraits_> │ │ │ │ │ -  Concept for a differentiable local function mapping Domain to Range. │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::Concept::EntitySet │ │ │ │ │ -  Concept for an entity set for a Concept::GridFunction More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::Concept::GridFunction<_Range(Domain),_EntitySet_> │ │ │ │ │ -  Concept for a grid function mapping Domain to Range. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::Concept::DifferentiableGridFunction<_Range(Domain), │ │ │ │ │ - EntitySet,_DerivativeTraits_> │ │ │ │ │ -  Concept for a differentiable grid function mapping Domain to Range. │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::Concept::GridViewFunction<_Range(Domain),_GridView_> │ │ │ │ │ -  Concept for a grid view function mapping Domain to Range. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::Concept::DifferentiableGridViewFunction<_Range │ │ │ │ │ - (Domain),_GridView,_DerivativeTraits_> │ │ │ │ │ -  Concept for a differentiable grid view function mapping Domain to │ │ │ │ │ - Range. More... │ │ │ │ │ +class  Dune::Functions::ReservedDeque<_T,_n_> │ │ │ │ │ +  A double-ended queue (deque) class with statically reserved memory. │ │ │ │ │ + More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ -namespace  Dune::Functions::Concept │ │ │ │ │ -  │ │ │ │ │ - Functions │ │ │ │ │ -template │ │ │ │ │ -static constexpr auto Dune::Functions::Concept::isCallable () │ │ │ │ │ -  Check if f is callable with given argument list. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -static constexpr auto Dune::Functions::Concept::isCallable (F &&, Args &&...) │ │ │ │ │ -  Check if f is callable with given argument list. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -static constexpr bool Dune::Functions::Concept::isFunction () │ │ │ │ │ -  Check if F models the Function concept with given │ │ │ │ │ - signature. More... │ │ │ │ │ -  │ │ │ │ │ -template class DerivativeTraits> │ │ │ │ │ -static constexpr bool Dune::Functions::Concept::isFunction (F &&f, │ │ │ │ │ - SignatureTag< Signature, DerivativeTraits >) │ │ │ │ │ -  Check if f models the Function concept with given │ │ │ │ │ - signature. More... │ │ │ │ │ -  │ │ │ │ │ -template class DerivativeTraits = │ │ │ │ │ -DefaultDerivativeTraits> │ │ │ │ │ -static constexpr bool Dune::Functions::Concept::isDifferentiableFunction () │ │ │ │ │ -  Check if F models the DifferentiableFunction concept │ │ │ │ │ - with given signature. More... │ │ │ │ │ -  │ │ │ │ │ -template class DerivativeTraits> │ │ │ │ │ -static constexpr bool Dune::Functions::Concept::isDifferentiableFunction (F │ │ │ │ │ - &&f, SignatureTag< Signature, DerivativeTraits >) │ │ │ │ │ -  Check if f models the DifferentiableFunction concept │ │ │ │ │ - with given signature. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -static constexpr bool Dune::Functions::Concept::isLocalFunction () │ │ │ │ │ -  Check if F models the LocalFunction concept with given │ │ │ │ │ - signature and local context. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -class DerivativeTraits = DefaultDerivativeTraits> │ │ │ │ │ -static constexpr bool Dune::Functions::Concept::isDifferentiableLocalFunction │ │ │ │ │ - () │ │ │ │ │ -  Check if F models the DifferentiableLocalFunction │ │ │ │ │ - concept with given signature and local context. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -static constexpr bool Dune::Functions::Concept::isEntitySet () │ │ │ │ │ -  Check if F models the GridFunction concept with given │ │ │ │ │ - signature and entity set. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -static constexpr bool Dune::Functions::Concept::isGridFunction () │ │ │ │ │ -  Check if F models the GridFunction concept with given │ │ │ │ │ - signature and entity set. More... │ │ │ │ │ -  │ │ │ │ │ -template class │ │ │ │ │ -DerivativeTraits = DefaultDerivativeTraits> │ │ │ │ │ -static constexpr bool Dune::Functions::Concept::isDifferentiableGridFunction │ │ │ │ │ - () │ │ │ │ │ -  Check if F models the DifferentiableGridFunction concept │ │ │ │ │ - with given signature and entity set. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -static constexpr bool Dune::Functions::Concept::isGridViewFunction () │ │ │ │ │ -  Check if F models the GridViewFunction concept with │ │ │ │ │ - given signature. More... │ │ │ │ │ -  │ │ │ │ │ -template class │ │ │ │ │ -DerivativeTraits = DefaultDerivativeTraits> │ │ │ │ │ -static constexpr bool Dune::Functions::Concept:: │ │ │ │ │ - isDifferentiableGridViewFunction () │ │ │ │ │ -  Check if F models the DifferentiableGridViewFunction │ │ │ │ │ - concept with given signature. More... │ │ │ │ │ + Macros │ │ │ │ │ +#define CHECKSIZE(X)   {} │ │ │ │ │   │ │ │ │ │ +***** Detailed Description ***** │ │ │ │ │ +An stl-compliant double-ended queue which stores everything on the stack. │ │ │ │ │ +***** Macro Definition Documentation ***** │ │ │ │ │ +***** ◆ CHECKSIZE ***** │ │ │ │ │ +#define CHECKSIZE (  X )    {} │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00026_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: functionconcepts.hh Source File │ │ │ │ +dune-functions: reserveddeque.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,320 +62,229 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
functionconcepts.hh
│ │ │ │ +
reserveddeque.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#ifndef DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_COMMON_RESERVEDDEQUE_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_COMMON_RESERVEDDEQUE_HH
│ │ │ │
5
│ │ │ │ -
6#include <dune/common/typelist.hh>
│ │ │ │ -
7#include <dune/common/concept.hh>
│ │ │ │ -
8
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
12
│ │ │ │ -
13namespace Dune {
│ │ │ │ -
14namespace Functions {
│ │ │ │ -
15namespace Concept {
│ │ │ │ +
10#include <algorithm>
│ │ │ │ +
11#include <iostream>
│ │ │ │ +
12#include <cstddef>
│ │ │ │ +
13#include <initializer_list>
│ │ │ │ +
14
│ │ │ │ +
15#include <dune/common/genericiterator.hh>
│ │ │ │
16
│ │ │ │ -
17using namespace Dune::Concept;
│ │ │ │ -
18
│ │ │ │ -
19
│ │ │ │ -
20
│ │ │ │ -
21// Callable concept ############################################################
│ │ │ │ +
17#ifdef CHECK_RESERVEDDEQUE
│ │ │ │ +
18#define CHECKSIZE(X) assert(X)
│ │ │ │ +
19#else
│ │ │ │ +
20#define CHECKSIZE(X) {}
│ │ │ │ +
21#endif
│ │ │ │
22
│ │ │ │ -
23
│ │ │ │ -
31template<class... Args>
│ │ │ │ - │ │ │ │ -
33{
│ │ │ │ -
34 template<class F>
│ │ │ │ -
35 auto require(F&& f) -> decltype(
│ │ │ │ -
36 f(std::declval<Args>()...)
│ │ │ │ -
37 );
│ │ │ │ -
38};
│ │ │ │ -
39
│ │ │ │ -
46template<class F, class... Args>
│ │ │ │ -
47static constexpr auto isCallable()
│ │ │ │ -
48{ return models<Concept::Callable<Args...>, F>(); }
│ │ │ │ -
49
│ │ │ │ -
56template<class F, class... Args>
│ │ │ │ -
57static constexpr auto isCallable(F&&, Args&&...)
│ │ │ │ -
58{
│ │ │ │ -
59 return models<Concept::Callable<Args&&...>, F>();
│ │ │ │ -
60}
│ │ │ │ -
61
│ │ │ │ -
62
│ │ │ │ -
63
│ │ │ │ -
64// Function concept ############################################################
│ │ │ │ -
65template<class Signature>
│ │ │ │ -
66struct Function;
│ │ │ │ -
67
│ │ │ │ -
76template<class Range, class Domain>
│ │ │ │ -
77struct Function<Range(Domain)> : Refines<Callable<Domain> >
│ │ │ │ -
78{
│ │ │ │ -
79 template<class F>
│ │ │ │ -
80 auto require(F&& f) -> decltype(
│ │ │ │ -
81 // F models Function<Range(Domain)> if the result of F(Domain) is implicitly convertible to Range
│ │ │ │ -
82 requireConvertible<Range>(f(std::declval<Domain>()))
│ │ │ │ -
83 );
│ │ │ │ -
84};
│ │ │ │ -
85
│ │ │ │ -
87template<class F, class Signature>
│ │ │ │ -
88static constexpr bool isFunction()
│ │ │ │ -
89{ return models<Concept::Function<Signature>, F>(); }
│ │ │ │ -
90
│ │ │ │ -
92template<class F, class Signature, template<class> class DerivativeTraits>
│ │ │ │ - │ │ │ │ -
94{ return models<Concept::Function<Signature>, F>(); }
│ │ │ │ -
95
│ │ │ │ -
96
│ │ │ │ -
97
│ │ │ │ -
98// DifferentiableFunction concept ##############################################
│ │ │ │ -
99template<class Signature, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ - │ │ │ │ +
23namespace Dune {
│ │ │ │ +
24namespace Functions {
│ │ │ │ +
25
│ │ │ │ +
43 template<class T, int n>
│ │ │ │ + │ │ │ │ +
45 {
│ │ │ │ +
46 public:
│ │ │ │ +
47
│ │ │ │ +
51 typedef T value_type;
│ │ │ │ +
53 typedef T* pointer;
│ │ │ │ +
55 typedef T& reference;
│ │ │ │ +
57 typedef const T& const_reference;
│ │ │ │ +
59 typedef size_t size_type;
│ │ │ │ +
61 typedef std::ptrdiff_t difference_type;
│ │ │ │ +
63 typedef Dune::GenericIterator<ReservedDeque, value_type> iterator;
│ │ │ │ +
65 typedef Dune::GenericIterator<const ReservedDeque, const value_type> const_iterator;
│ │ │ │ +
66
│ │ │ │ + │ │ │ │ +
73 size_(0),
│ │ │ │ +
74 first_(0)
│ │ │ │ +
75 {}
│ │ │ │ +
76
│ │ │ │ +
77 ReservedDeque(std::initializer_list<T> const &l)
│ │ │ │ +
78 {
│ │ │ │ +
79 assert(l.size() <= n);// Actually, this is not needed any more!
│ │ │ │ +
80 size_ = l.size();
│ │ │ │ +
81 std::copy_n(l.begin(), size_, data_);
│ │ │ │ +
82 }
│ │ │ │ +
83
│ │ │ │ +
89 void clear()
│ │ │ │ +
90 {
│ │ │ │ +
91 first_ = 0;
│ │ │ │ +
92 size_ = 0;
│ │ │ │ +
93 }
│ │ │ │ +
94
│ │ │ │ +
96 void resize(size_t s)
│ │ │ │ +
97 {
│ │ │ │ +
98 CHECKSIZE(s<=n);
│ │ │ │ +
99 size_ = s;
│ │ │ │ +
100 }
│ │ │ │
101
│ │ │ │ -
113template<class Range, class Domain, template<class> class DerivativeTraits>
│ │ │ │ -
114struct DifferentiableFunction<Range(Domain), DerivativeTraits> : Refines<Dune::Functions::Concept::Function<Range(Domain)> >
│ │ │ │ -
115{
│ │ │ │ - │ │ │ │ +
103 void push_back(const T& t)
│ │ │ │ +
104 {
│ │ │ │ +
105 CHECKSIZE(size_<n);
│ │ │ │ +
106 data_[size_++ % n] = t;
│ │ │ │ +
107 }
│ │ │ │ +
108
│ │ │ │ +
110 void push_front(const T& t)
│ │ │ │ +
111 {
│ │ │ │ +
112 CHECKSIZE(size_<n);
│ │ │ │ +
113 ++size_;
│ │ │ │ +
114 first_ = (first_+(n-1)) % n;
│ │ │ │ +
115 data_[first_] = t;
│ │ │ │ +
116 }
│ │ │ │
117
│ │ │ │ -
118 template<class F>
│ │ │ │ -
119 auto require(F&& f) -> decltype(
│ │ │ │ -
120 derivative(f),
│ │ │ │ -
121 requireConcept<Function<DerivativeSignature>>(derivative(f))
│ │ │ │ -
122 );
│ │ │ │ -
123};
│ │ │ │ +
119 void pop_back()
│ │ │ │ +
120 {
│ │ │ │ +
121 if (! empty())
│ │ │ │ +
122 size_--;
│ │ │ │ +
123 }
│ │ │ │
124
│ │ │ │ -
126template<class F, class Signature, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ -
127static constexpr bool isDifferentiableFunction()
│ │ │ │ -
128{ return models<Concept::DifferentiableFunction<Signature, DerivativeTraits>, F>(); }
│ │ │ │ -
129
│ │ │ │ -
131template<class F, class Signature, template<class> class DerivativeTraits>
│ │ │ │ - │ │ │ │ -
133{ return models<Concept::DifferentiableFunction<Signature, DerivativeTraits>, F>(); }
│ │ │ │ + │ │ │ │ +
127 {
│ │ │ │ +
128 if (! empty())
│ │ │ │ +
129 {
│ │ │ │ +
130 size_--;
│ │ │ │ +
131 first_ = (++first_) % n;
│ │ │ │ +
132 }
│ │ │ │ +
133 }
│ │ │ │
134
│ │ │ │ -
135
│ │ │ │ -
136
│ │ │ │ -
137// LocalFunction concept ##############################################
│ │ │ │ -
138template<class Signature, class LocalContext>
│ │ │ │ - │ │ │ │ -
140
│ │ │ │ -
150template<class Range, class Domain, class LocalContext>
│ │ │ │ -
151struct LocalFunction<Range(Domain), LocalContext> :
│ │ │ │ -
152 Refines<Dune::Functions::Concept::Function<Range(Domain)> >
│ │ │ │ -
153{
│ │ │ │ -
154 template<class F>
│ │ │ │ -
155 auto require(F&& f) -> decltype(
│ │ │ │ -
156 f.bind(std::declval<LocalContext>()),
│ │ │ │ -
157 f.unbind(),
│ │ │ │ -
158 requireConvertible<bool>(f.bound()),
│ │ │ │ -
159 f.localContext(),
│ │ │ │ -
160 requireConvertible<LocalContext>(f.localContext())
│ │ │ │ -
161 );
│ │ │ │ -
162};
│ │ │ │ -
163
│ │ │ │ -
165template<class F, class Signature, class LocalContext>
│ │ │ │ -
166static constexpr bool isLocalFunction()
│ │ │ │ -
167{ return models<Concept::LocalFunction<Signature, LocalContext>, F>(); }
│ │ │ │ + │ │ │ │ +
137 return iterator(*this, 0);
│ │ │ │ +
138 }
│ │ │ │ +
139
│ │ │ │ + │ │ │ │ +
142 return const_iterator(*this, 0);
│ │ │ │ +
143 }
│ │ │ │ +
144
│ │ │ │ + │ │ │ │ +
147 return iterator(*this, size_);
│ │ │ │ +
148 }
│ │ │ │ +
149
│ │ │ │ + │ │ │ │ +
152 return const_iterator(*this, size_);
│ │ │ │ +
153 }
│ │ │ │ +
154
│ │ │ │ + │ │ │ │ +
157 {
│ │ │ │ +
158 CHECKSIZE(size_>i);
│ │ │ │ +
159 return data_[(first_ + i) % n];
│ │ │ │ +
160 }
│ │ │ │ +
161
│ │ │ │ + │ │ │ │ +
164 {
│ │ │ │ +
165 CHECKSIZE(size_>i);
│ │ │ │ +
166 return data_[(first_ + i) % n];
│ │ │ │ +
167 }
│ │ │ │
168
│ │ │ │ -
169
│ │ │ │ -
170// DifferentiableLocalFunction concept ##############################################
│ │ │ │ -
171template<class Signature, class LocalContext, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ - │ │ │ │ -
173
│ │ │ │ -
186template<class Range, class Domain, class LocalContext, template<class> class DerivativeTraits>
│ │ │ │ -
187struct DifferentiableLocalFunction<Range(Domain), LocalContext, DerivativeTraits> :
│ │ │ │ -
188 Refines<
│ │ │ │ -
189 Dune::Functions::Concept::DifferentiableFunction<Range(Domain), DerivativeTraits>,
│ │ │ │ -
190 Dune::Functions::Concept::LocalFunction<Range(Domain),LocalContext>
│ │ │ │ -
191 >
│ │ │ │ -
192{
│ │ │ │ -
193 template<class F>
│ │ │ │ -
194 auto require(F&& f) -> decltype(
│ │ │ │ -
195 f.bind(std::declval<LocalContext>()),
│ │ │ │ -
196 f.unbind(),
│ │ │ │ -
197 f.localContext(),
│ │ │ │ -
198 requireConvertible<LocalContext>(f.localContext())
│ │ │ │ -
199 );
│ │ │ │ -
200};
│ │ │ │ -
201
│ │ │ │ -
203template<class F, class Signature, class LocalContext, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ -
204static constexpr bool isDifferentiableLocalFunction()
│ │ │ │ -
205{ return models<Concept::DifferentiableLocalFunction<Signature, LocalContext, DerivativeTraits>, F>(); }
│ │ │ │ + │ │ │ │ +
171 {
│ │ │ │ +
172 CHECKSIZE(size_>0);
│ │ │ │ +
173 return data_[first_];
│ │ │ │ +
174 }
│ │ │ │ +
175
│ │ │ │ + │ │ │ │ +
178 {
│ │ │ │ +
179 CHECKSIZE(size_>0);
│ │ │ │ +
180 return data_[first_];
│ │ │ │ +
181 }
│ │ │ │ +
182
│ │ │ │ + │ │ │ │ +
185 {
│ │ │ │ +
186 CHECKSIZE(size_>0);
│ │ │ │ +
187 return data_[(first_ + size_-1) % n];
│ │ │ │ +
188 }
│ │ │ │ +
189
│ │ │ │ + │ │ │ │ +
192 {
│ │ │ │ +
193 CHECKSIZE(size_>0);
│ │ │ │ +
194 return data_[(first_ + size_-1) % n];
│ │ │ │ +
195 }
│ │ │ │ +
196
│ │ │ │ + │ │ │ │ +
203 {
│ │ │ │ +
204 return size_;
│ │ │ │ +
205 }
│ │ │ │
206
│ │ │ │ -
207
│ │ │ │ -
208// EntitySet concept ##############################################
│ │ │ │ -
209
│ │ │ │ - │ │ │ │ -
220{
│ │ │ │ -
221 template<class E>
│ │ │ │ -
222 auto require(E&& f) -> decltype(
│ │ │ │ -
223 requireType<typename E::Element>(),
│ │ │ │ -
224 requireType<typename E::LocalCoordinate>(),
│ │ │ │ -
225 requireType<typename E::GlobalCoordinate>()
│ │ │ │ -
226 );
│ │ │ │ -
227};
│ │ │ │ -
228
│ │ │ │ -
230template<class E>
│ │ │ │ -
231static constexpr bool isEntitySet()
│ │ │ │ -
232{ return models<Concept::EntitySet, E>(); }
│ │ │ │ -
233
│ │ │ │ +
208 bool empty() const
│ │ │ │ +
209 {
│ │ │ │ +
210 return size_==0;
│ │ │ │ +
211 }
│ │ │ │ +
212
│ │ │ │ +
214 static constexpr size_type capacity()
│ │ │ │ +
215 {
│ │ │ │ +
216 return n;
│ │ │ │ +
217 }
│ │ │ │ +
218
│ │ │ │ +
220 static constexpr size_type max_size()
│ │ │ │ +
221 {
│ │ │ │ +
222 return n;
│ │ │ │ +
223 }
│ │ │ │ +
224
│ │ │ │ +
228 friend std::ostream& operator<< (std::ostream& s, const ReservedDeque& v)
│ │ │ │ +
229 {
│ │ │ │ +
230 for (size_t i=0; i<v.size(); i++)
│ │ │ │ +
231 s << v[i] << " ";
│ │ │ │ +
232 return s;
│ │ │ │ +
233 }
│ │ │ │
234
│ │ │ │ -
235
│ │ │ │ -
236// GridFunction concept ##############################################
│ │ │ │ -
237template<class Signature, class EntitySet>
│ │ │ │ - │ │ │ │ -
239
│ │ │ │ -
249template<class Range, class Domain, class EntitySet>
│ │ │ │ -
250struct GridFunction<Range(Domain), EntitySet> :
│ │ │ │ -
251 Refines<Dune::Functions::Concept::Function<Range(Domain)> >
│ │ │ │ -
252{
│ │ │ │ -
253 using LocalSignature = Range(typename EntitySet::LocalCoordinate);
│ │ │ │ -
254 using LocalContext = typename EntitySet::Element;
│ │ │ │ -
255
│ │ │ │ -
256 template<class F>
│ │ │ │ -
257 auto require(F&& f) -> decltype(
│ │ │ │ -
258 localFunction(f),
│ │ │ │ -
259 f.entitySet(),
│ │ │ │ -
260 requireConcept<LocalFunction<LocalSignature, LocalContext>>(localFunction(f)),
│ │ │ │ -
261 requireConcept<Concept::EntitySet, EntitySet>(),
│ │ │ │ -
262 requireConvertible<EntitySet>(f.entitySet()),
│ │ │ │ -
263 requireConvertible<typename EntitySet::GlobalCoordinate, Domain>()
│ │ │ │ -
264 );
│ │ │ │ -
265};
│ │ │ │ -
266
│ │ │ │ -
268template<class F, class Signature, class EntitySet>
│ │ │ │ -
269static constexpr bool isGridFunction()
│ │ │ │ -
270{ return models<Concept::GridFunction<Signature, EntitySet>, F>(); }
│ │ │ │ -
271
│ │ │ │ -
272
│ │ │ │ -
273// DifferentiableGridFunction concept ##############################################
│ │ │ │ -
274template<class Signature, class EntitySet, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ - │ │ │ │ -
276
│ │ │ │ -
289template<class Range, class Domain, class EntitySet, template<class> class DerivativeTraits>
│ │ │ │ -
290struct DifferentiableGridFunction<Range(Domain), EntitySet, DerivativeTraits> :
│ │ │ │ -
291 Refines<
│ │ │ │ -
292 Dune::Functions::Concept::DifferentiableFunction<Range(Domain), DerivativeTraits>,
│ │ │ │ -
293 Dune::Functions::Concept::GridFunction<Range(Domain),EntitySet>
│ │ │ │ -
294 >
│ │ │ │ -
295{
│ │ │ │ -
296 using LocalSignature = Range(typename EntitySet::LocalCoordinate);
│ │ │ │ -
297 using LocalContext = typename EntitySet::Element;
│ │ │ │ -
298
│ │ │ │ -
299 template<class R>
│ │ │ │ - │ │ │ │ -
301
│ │ │ │ -
302 template<class F>
│ │ │ │ -
303 auto require(F&& f) -> decltype(
│ │ │ │ -
304 requireConcept<DifferentiableLocalFunction<LocalSignature, LocalContext, LocalDerivativeTraits>>(localFunction(f))
│ │ │ │ -
305 );
│ │ │ │ -
306};
│ │ │ │ -
307
│ │ │ │ -
309template<class F, class Signature, class EntitySet, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ -
310static constexpr bool isDifferentiableGridFunction()
│ │ │ │ -
311{ return models<Concept::DifferentiableGridFunction<Signature, EntitySet, DerivativeTraits>, F>(); }
│ │ │ │ -
312
│ │ │ │ -
313
│ │ │ │ -
314
│ │ │ │ -
315// GridViewFunction concept ##############################################
│ │ │ │ -
316template<class Signature, class GridView>
│ │ │ │ - │ │ │ │ -
318
│ │ │ │ -
331template<class Range, class Domain, class GridView>
│ │ │ │ -
332struct GridViewFunction<Range(Domain), GridView> :
│ │ │ │ -
333 Refines<Dune::Functions::Concept::GridFunction<Range(Domain), GridViewEntitySet<GridView,0>>>
│ │ │ │ -
334{
│ │ │ │ -
335 template<class F>
│ │ │ │ -
336 auto require(F&& f) -> decltype(
│ │ │ │ -
337 0 // We don't need to check any further expressions, because a GridViewFunction is just a GridFunction with a special EntitySet
│ │ │ │ -
338 );
│ │ │ │ -
339};
│ │ │ │ -
340
│ │ │ │ -
342template<class F, class Signature, class GridView>
│ │ │ │ -
343static constexpr bool isGridViewFunction()
│ │ │ │ -
344{ return models<Concept::GridViewFunction<Signature, GridView>, F>(); }
│ │ │ │ -
345
│ │ │ │ -
346
│ │ │ │ -
347// DifferentiableGridViewFunction concept ##############################################
│ │ │ │ -
348template<class Signature, class GridView, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ - │ │ │ │ -
350
│ │ │ │ -
364template<class Range, class Domain, class GridView, template<class> class DerivativeTraits>
│ │ │ │ -
365struct DifferentiableGridViewFunction<Range(Domain), GridView, DerivativeTraits> :
│ │ │ │ -
366 Refines<Dune::Functions::Concept::DifferentiableGridFunction<Range(Domain), GridViewEntitySet<GridView,0>, DerivativeTraits>>
│ │ │ │ -
367{
│ │ │ │ -
368 template<class F>
│ │ │ │ -
369 auto require(F&& f) -> decltype(
│ │ │ │ -
370 0 // We don't need to check any further expressions, because a GridViewFunction is just a GridFunction with a special EntitySet
│ │ │ │ -
371 );
│ │ │ │ -
372};
│ │ │ │ -
373
│ │ │ │ -
375template<class F, class Signature, class GridView, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ -
376static constexpr bool isDifferentiableGridViewFunction()
│ │ │ │ -
377{ return models<Concept::DifferentiableGridViewFunction<Signature, GridView, DerivativeTraits>, F>(); }
│ │ │ │ -
378
│ │ │ │ -
379
│ │ │ │ -
380
│ │ │ │ -
381}}} // namespace Dune::Functions::Concept
│ │ │ │ -
382
│ │ │ │ -
383#endif // DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
static constexpr bool isGridFunction()
Check if F models the GridFunction concept with given signature and entity set.
Definition: functionconcepts.hh:269
│ │ │ │ -
static constexpr bool isDifferentiableLocalFunction()
Check if F models the DifferentiableLocalFunction concept with given signature and local context.
Definition: functionconcepts.hh:204
│ │ │ │ -
static constexpr bool isFunction()
Check if F models the Function concept with given signature.
Definition: functionconcepts.hh:88
│ │ │ │ -
static constexpr bool isDifferentiableGridViewFunction()
Check if F models the DifferentiableGridViewFunction concept with given signature.
Definition: functionconcepts.hh:376
│ │ │ │ -
static constexpr bool isDifferentiableFunction()
Check if F models the DifferentiableFunction concept with given signature.
Definition: functionconcepts.hh:127
│ │ │ │ -
static constexpr bool isGridViewFunction()
Check if F models the GridViewFunction concept with given signature.
Definition: functionconcepts.hh:343
│ │ │ │ -
static constexpr bool isEntitySet()
Check if F models the GridFunction concept with given signature and entity set.
Definition: functionconcepts.hh:231
│ │ │ │ -
static constexpr bool isDifferentiableGridFunction()
Check if F models the DifferentiableGridFunction concept with given signature and entity set.
Definition: functionconcepts.hh:310
│ │ │ │ -
static constexpr bool isLocalFunction()
Check if F models the LocalFunction concept with given signature and local context.
Definition: functionconcepts.hh:166
│ │ │ │ -
TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const TrigonometricFunction< K, sinFactor, cosFactor > &f)
Obtain derivative of TrigonometricFunction function.
Definition: trigonometricfunction.hh:39
│ │ │ │ -
static constexpr auto isCallable()
Check if f is callable with given argument list.
Definition: functionconcepts.hh:47
│ │ │ │ +
235 private:
│ │ │ │ +
236 T data_[n];
│ │ │ │ +
237 size_type first_;
│ │ │ │ +
238 size_type size_;
│ │ │ │ +
239 };
│ │ │ │ +
240
│ │ │ │ +
241} // end namespace Functions
│ │ │ │ +
242} // end namespace Dune
│ │ │ │ +
243
│ │ │ │ +
244#undef CHECKSIZE
│ │ │ │ +
245
│ │ │ │ +
246#endif // DUNE_FUNCTIONS_COMMON_RESERVEDDEQUE_HH
│ │ │ │ +
#define CHECKSIZE(X)
Definition: reserveddeque.hh:20
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
Default implementation for derivative traits.
Definition: defaultderivativetraits.hh:37
│ │ │ │ -
Concept objects that can be called with given argument list.
Definition: functionconcepts.hh:33
│ │ │ │ -
auto require(F &&f) -> decltype(f(std::declval< Args >()...))
│ │ │ │ -
Definition: functionconcepts.hh:66
│ │ │ │ -
auto require(F &&f) -> decltype(requireConvertible< Range >(f(std::declval< Domain >())))
│ │ │ │ -
Definition: functionconcepts.hh:100
│ │ │ │ -
typename SignatureTraits< Range(Domain)>::template DerivativeSignature< DerivativeTraits > DerivativeSignature
Definition: functionconcepts.hh:116
│ │ │ │ -
auto require(F &&f) -> decltype(derivative(f), requireConcept< Function< DerivativeSignature > >(derivative(f)))
│ │ │ │ -
Definition: functionconcepts.hh:139
│ │ │ │ -
auto require(F &&f) -> decltype(f.bind(std::declval< LocalContext >()), f.unbind(), requireConvertible< bool >(f.bound()), f.localContext(), requireConvertible< LocalContext >(f.localContext()))
│ │ │ │ - │ │ │ │ -
auto require(F &&f) -> decltype(f.bind(std::declval< LocalContext >()), f.unbind(), f.localContext(), requireConvertible< LocalContext >(f.localContext()))
│ │ │ │ -
Concept for an entity set for a Concept::GridFunction<Range(Domain), EntitySet, DerivativeTraits>
Definition: functionconcepts.hh:220
│ │ │ │ -
auto require(E &&f) -> decltype(requireType< typename E::Element >(), requireType< typename E::LocalCoordinate >(), requireType< typename E::GlobalCoordinate >())
│ │ │ │ -
Definition: functionconcepts.hh:238
│ │ │ │ -
typename EntitySet::Element LocalContext
Definition: functionconcepts.hh:254
│ │ │ │ -
Range(typename EntitySet::LocalCoordinate) LocalSignature
Definition: functionconcepts.hh:253
│ │ │ │ -
auto require(F &&f) -> decltype(localFunction(f), f.entitySet(), requireConcept< LocalFunction< LocalSignature, LocalContext > >(localFunction(f)), requireConcept< Concept::EntitySet, EntitySet >(), requireConvertible< EntitySet >(f.entitySet()), requireConvertible< typename EntitySet::GlobalCoordinate, Domain >())
│ │ │ │ -
Definition: functionconcepts.hh:275
│ │ │ │ -
typename Dune::Functions::LocalDerivativeTraits< EntitySet, DerivativeTraits >::template Traits< R > LocalDerivativeTraits
Definition: functionconcepts.hh:300
│ │ │ │ -
auto require(F &&f) -> decltype(requireConcept< DifferentiableLocalFunction< LocalSignature, LocalContext, LocalDerivativeTraits > >(localFunction(f)))
│ │ │ │ -
Range(typename EntitySet::LocalCoordinate) LocalSignature
Definition: functionconcepts.hh:296
│ │ │ │ -
typename EntitySet::Element LocalContext
Definition: functionconcepts.hh:297
│ │ │ │ -
Definition: functionconcepts.hh:317
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
Helper class to deduce the signature of a callable.
Definition: signature.hh:56
│ │ │ │ -
Definition: signature.hh:102
│ │ │ │ -
Derivative traits for local functions.
Definition: localderivativetraits.hh:28
│ │ │ │ +
A double-ended queue (deque) class with statically reserved memory.
Definition: reserveddeque.hh:45
│ │ │ │ +
void pop_front()
Erases the first element of the vector, O(1) time.
Definition: reserveddeque.hh:126
│ │ │ │ +
static constexpr size_type capacity()
Returns current capacity (allocated memory) of the vector.
Definition: reserveddeque.hh:214
│ │ │ │ +
void clear()
Erases all elements.
Definition: reserveddeque.hh:89
│ │ │ │ +
Dune::GenericIterator< ReservedDeque, value_type > iterator
Iterator used to iterate through a vector.
Definition: reserveddeque.hh:63
│ │ │ │ +
T value_type
The type of object, T, stored in the vector.
Definition: reserveddeque.hh:51
│ │ │ │ +
ReservedDeque()
Constructor.
Definition: reserveddeque.hh:72
│ │ │ │ +
bool empty() const
Returns true if vector has no elements.
Definition: reserveddeque.hh:208
│ │ │ │ +
const_reference back() const
Returns const reference to last element of vector.
Definition: reserveddeque.hh:191
│ │ │ │ +
friend std::ostream & operator<<(std::ostream &s, const ReservedDeque &v)
Send ReservedDeque to an output stream.
Definition: reserveddeque.hh:228
│ │ │ │ +
void push_front(const T &t)
Prepends an element to the begin of a deque if size<capacity, O(1) time.
Definition: reserveddeque.hh:110
│ │ │ │ +
reference operator[](size_type i)
Returns reference to the i'th element.
Definition: reserveddeque.hh:156
│ │ │ │ +
reference front()
Returns reference to first element of vector.
Definition: reserveddeque.hh:170
│ │ │ │ +
T * pointer
Pointer to T.
Definition: reserveddeque.hh:53
│ │ │ │ +
const_reference front() const
Returns const reference to first element of vector.
Definition: reserveddeque.hh:177
│ │ │ │ +
iterator end()
Returns an iterator pointing to the end of the vector.
Definition: reserveddeque.hh:146
│ │ │ │ +
reference back()
Returns reference to last element of vector.
Definition: reserveddeque.hh:184
│ │ │ │ +
void pop_back()
Erases the last element of the vector, O(1) time.
Definition: reserveddeque.hh:119
│ │ │ │ +
const T & const_reference
Const reference to T.
Definition: reserveddeque.hh:57
│ │ │ │ +
static constexpr size_type max_size()
Returns the maximum length of the vector.
Definition: reserveddeque.hh:220
│ │ │ │ +
std::ptrdiff_t difference_type
A signed integral type.
Definition: reserveddeque.hh:61
│ │ │ │ +
T & reference
Reference to T.
Definition: reserveddeque.hh:55
│ │ │ │ +
Dune::GenericIterator< const ReservedDeque, const value_type > const_iterator
Const iterator used to iterate through a vector.
Definition: reserveddeque.hh:65
│ │ │ │ +
size_type size() const
Returns number of elements in the vector.
Definition: reserveddeque.hh:202
│ │ │ │ +
const_iterator end() const
Returns a const_iterator pointing to the end of the vector.
Definition: reserveddeque.hh:151
│ │ │ │ +
void resize(size_t s)
Specifies a new size for the vector.
Definition: reserveddeque.hh:96
│ │ │ │ +
iterator begin()
Returns a iterator pointing to the beginning of the vector.
Definition: reserveddeque.hh:136
│ │ │ │ +
const_iterator begin() const
Returns a const_iterator pointing to the beginning of the vector.
Definition: reserveddeque.hh:141
│ │ │ │ +
ReservedDeque(std::initializer_list< T > const &l)
Definition: reserveddeque.hh:77
│ │ │ │ +
size_t size_type
An unsigned integral type.
Definition: reserveddeque.hh:59
│ │ │ │ +
void push_back(const T &t)
Appends an element to the end of a vector, up to the maximum size n, O(1) time.
Definition: reserveddeque.hh:103
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,460 +5,319 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -functionconcepts.hh │ │ │ │ │ +reserveddeque.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#ifndef DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_COMMON_RESERVEDDEQUE_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_COMMON_RESERVEDDEQUE_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ - 8 │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12 │ │ │ │ │ - 13namespace Dune { │ │ │ │ │ - 14namespace Functions { │ │ │ │ │ - 15namespace Concept { │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14 │ │ │ │ │ + 15#include │ │ │ │ │ 16 │ │ │ │ │ - 17using namespace Dune::Concept; │ │ │ │ │ - 18 │ │ │ │ │ - 19 │ │ │ │ │ - 20 │ │ │ │ │ - 21// Callable concept │ │ │ │ │ -############################################################ │ │ │ │ │ + 17#ifdef CHECK_RESERVEDDEQUE │ │ │ │ │ + 18#define CHECKSIZE(X) assert(X) │ │ │ │ │ + 19#else │ │ │ │ │ +20#define CHECKSIZE(X) {} │ │ │ │ │ + 21#endif │ │ │ │ │ 22 │ │ │ │ │ - 23 │ │ │ │ │ - 31template │ │ │ │ │ -32struct Callable │ │ │ │ │ - 33{ │ │ │ │ │ - 34 template │ │ │ │ │ -35 auto require(F&& f) -> decltype( │ │ │ │ │ - 36 f(std::declval()...) │ │ │ │ │ - 37 ); │ │ │ │ │ - 38}; │ │ │ │ │ - 39 │ │ │ │ │ - 46template │ │ │ │ │ -47static constexpr auto isCallable() │ │ │ │ │ - 48{ return models, F>(); } │ │ │ │ │ - 49 │ │ │ │ │ - 56template │ │ │ │ │ -57static constexpr auto isCallable(F&&, Args&&...) │ │ │ │ │ - 58{ │ │ │ │ │ - 59 return models, F>(); │ │ │ │ │ - 60} │ │ │ │ │ - 61 │ │ │ │ │ - 62 │ │ │ │ │ - 63 │ │ │ │ │ - 64// Function concept │ │ │ │ │ -############################################################ │ │ │ │ │ - 65template │ │ │ │ │ -66struct Function; │ │ │ │ │ - 67 │ │ │ │ │ - 76template │ │ │ │ │ -77struct Function : Refines > │ │ │ │ │ - 78{ │ │ │ │ │ - 79 template │ │ │ │ │ -80 auto require(F&& f) -> decltype( │ │ │ │ │ - 81 // F models Function if the result of F(Domain) is │ │ │ │ │ -implicitly convertible to Range │ │ │ │ │ - 82 requireConvertible(f(std::declval())) │ │ │ │ │ - 83 ); │ │ │ │ │ - 84}; │ │ │ │ │ - 85 │ │ │ │ │ - 87template │ │ │ │ │ -88static constexpr bool isFunction() │ │ │ │ │ - 89{ return models, F>(); } │ │ │ │ │ - 90 │ │ │ │ │ - 92template class DerivativeTraits> │ │ │ │ │ -93static constexpr bool isFunction(F&& f, SignatureTag) │ │ │ │ │ - 94{ return models, F>(); } │ │ │ │ │ - 95 │ │ │ │ │ - 96 │ │ │ │ │ - 97 │ │ │ │ │ - 98// DifferentiableFunction concept │ │ │ │ │ -############################################## │ │ │ │ │ - 99template class DerivativeTraits = │ │ │ │ │ -DefaultDerivativeTraits> │ │ │ │ │ -100struct DifferentiableFunction; │ │ │ │ │ + 23namespace Dune { │ │ │ │ │ + 24namespace Functions { │ │ │ │ │ + 25 │ │ │ │ │ + 43 template │ │ │ │ │ +44 class ReservedDeque │ │ │ │ │ + 45 { │ │ │ │ │ + 46 public: │ │ │ │ │ + 47 │ │ │ │ │ +51 typedef T value_type; │ │ │ │ │ +53 typedef T* pointer; │ │ │ │ │ +55 typedef T& reference; │ │ │ │ │ +57 typedef const T& const_reference; │ │ │ │ │ +59 typedef size_t size_type; │ │ │ │ │ +61 typedef std::ptrdiff_t difference_type; │ │ │ │ │ +63 typedef Dune::GenericIterator iterator; │ │ │ │ │ +65 typedef Dune::GenericIterator │ │ │ │ │ +const_iterator; │ │ │ │ │ + 66 │ │ │ │ │ +72 ReservedDeque() : │ │ │ │ │ + 73 size_(0), │ │ │ │ │ + 74 first_(0) │ │ │ │ │ + 75 {} │ │ │ │ │ + 76 │ │ │ │ │ +77 ReservedDeque(std::initializer_list const &l) │ │ │ │ │ + 78 { │ │ │ │ │ + 79 assert(l.size() <= n);// Actually, this is not needed any more! │ │ │ │ │ + 80 size_ = l.size(); │ │ │ │ │ + 81 std::copy_n(l.begin(), size_, data_); │ │ │ │ │ + 82 } │ │ │ │ │ + 83 │ │ │ │ │ +89 void clear() │ │ │ │ │ + 90 { │ │ │ │ │ + 91 first_ = 0; │ │ │ │ │ + 92 size_ = 0; │ │ │ │ │ + 93 } │ │ │ │ │ + 94 │ │ │ │ │ +96 void resize(size_t s) │ │ │ │ │ + 97 { │ │ │ │ │ + 98 CHECKSIZE(s<=n); │ │ │ │ │ + 99 size_ = s; │ │ │ │ │ + 100 } │ │ │ │ │ 101 │ │ │ │ │ - 113template class DerivativeTraits> │ │ │ │ │ -114struct DifferentiableFunction : │ │ │ │ │ -Refines > │ │ │ │ │ - 115{ │ │ │ │ │ -116 using DerivativeSignature = typename SignatureTraits:: │ │ │ │ │ -template DerivativeSignature; │ │ │ │ │ +103 void push_back(const T& t) │ │ │ │ │ + 104 { │ │ │ │ │ + 105 CHECKSIZE(size_ │ │ │ │ │ -119 auto require(F&& f) -> decltype( │ │ │ │ │ - 120 derivative(f), │ │ │ │ │ - 121 requireConcept>(derivative(f)) │ │ │ │ │ - 122 ); │ │ │ │ │ - 123}; │ │ │ │ │ +119 void pop_back() │ │ │ │ │ + 120 { │ │ │ │ │ + 121 if (! empty()) │ │ │ │ │ + 122 size_--; │ │ │ │ │ + 123 } │ │ │ │ │ 124 │ │ │ │ │ - 126template class DerivativeTraits = │ │ │ │ │ -DefaultDerivativeTraits> │ │ │ │ │ -127static constexpr bool isDifferentiableFunction() │ │ │ │ │ - 128{ return models, F>(); } │ │ │ │ │ - 129 │ │ │ │ │ - 131template class DerivativeTraits> │ │ │ │ │ -132static constexpr bool isDifferentiableFunction(F&& f, │ │ │ │ │ -SignatureTag) │ │ │ │ │ - 133{ return models, F>(); } │ │ │ │ │ +126 void pop_front() │ │ │ │ │ + 127 { │ │ │ │ │ + 128 if (! empty()) │ │ │ │ │ + 129 { │ │ │ │ │ + 130 size_--; │ │ │ │ │ + 131 first_ = (++first_) % n; │ │ │ │ │ + 132 } │ │ │ │ │ + 133 } │ │ │ │ │ 134 │ │ │ │ │ - 135 │ │ │ │ │ - 136 │ │ │ │ │ - 137// LocalFunction concept ############################################## │ │ │ │ │ - 138template │ │ │ │ │ -139struct LocalFunction; │ │ │ │ │ - 140 │ │ │ │ │ - 150template │ │ │ │ │ -151struct LocalFunction : │ │ │ │ │ - 152 Refines > │ │ │ │ │ - 153{ │ │ │ │ │ - 154 template │ │ │ │ │ -155 auto require(F&& f) -> decltype( │ │ │ │ │ - 156 f.bind(std::declval()), │ │ │ │ │ - 157 f.unbind(), │ │ │ │ │ - 158 requireConvertible(f.bound()), │ │ │ │ │ - 159 f.localContext(), │ │ │ │ │ - 160 requireConvertible(f.localContext()) │ │ │ │ │ - 161 ); │ │ │ │ │ - 162}; │ │ │ │ │ - 163 │ │ │ │ │ - 165template │ │ │ │ │ -166static constexpr bool isLocalFunction() │ │ │ │ │ - 167{ return models, F>(); } │ │ │ │ │ +136 iterator begin(){ │ │ │ │ │ + 137 return iterator(*this, 0); │ │ │ │ │ + 138 } │ │ │ │ │ + 139 │ │ │ │ │ +141 const_iterator begin() const { │ │ │ │ │ + 142 return const_iterator(*this, 0); │ │ │ │ │ + 143 } │ │ │ │ │ + 144 │ │ │ │ │ +146 iterator end(){ │ │ │ │ │ + 147 return iterator(*this, size_); │ │ │ │ │ + 148 } │ │ │ │ │ + 149 │ │ │ │ │ +151 const_iterator end() const { │ │ │ │ │ + 152 return const_iterator(*this, size_); │ │ │ │ │ + 153 } │ │ │ │ │ + 154 │ │ │ │ │ +156 reference operator[](size_type i) │ │ │ │ │ + 157 { │ │ │ │ │ + 158 CHECKSIZE(size_>i); │ │ │ │ │ + 159 return data_[(first_ + i) % n]; │ │ │ │ │ + 160 } │ │ │ │ │ + 161 │ │ │ │ │ +163 const_reference operator[](size_type i) const │ │ │ │ │ + 164 { │ │ │ │ │ + 165 CHECKSIZE(size_>i); │ │ │ │ │ + 166 return data_[(first_ + i) % n]; │ │ │ │ │ + 167 } │ │ │ │ │ 168 │ │ │ │ │ - 169 │ │ │ │ │ - 170// DifferentiableLocalFunction concept │ │ │ │ │ -############################################## │ │ │ │ │ - 171template class │ │ │ │ │ -DerivativeTraits = DefaultDerivativeTraits> │ │ │ │ │ -172struct DifferentiableLocalFunction; │ │ │ │ │ - 173 │ │ │ │ │ - 186template │ │ │ │ │ -class DerivativeTraits> │ │ │ │ │ -187struct DifferentiableLocalFunction : │ │ │ │ │ - 188 Refines< │ │ │ │ │ - 189 Dune::Functions::Concept::DifferentiableFunction, │ │ │ │ │ - 190 Dune::Functions::Concept::LocalFunction │ │ │ │ │ - 191 > │ │ │ │ │ - 192{ │ │ │ │ │ - 193 template │ │ │ │ │ -194 auto require(F&& f) -> decltype( │ │ │ │ │ - 195 f.bind(std::declval()), │ │ │ │ │ - 196 f.unbind(), │ │ │ │ │ - 197 f.localContext(), │ │ │ │ │ - 198 requireConvertible(f.localContext()) │ │ │ │ │ - 199 ); │ │ │ │ │ - 200}; │ │ │ │ │ - 201 │ │ │ │ │ - 203template │ │ │ │ │ -class DerivativeTraits = DefaultDerivativeTraits> │ │ │ │ │ -204static constexpr bool isDifferentiableLocalFunction() │ │ │ │ │ - 205{ return models, F>(); } │ │ │ │ │ +170 reference front() │ │ │ │ │ + 171 { │ │ │ │ │ + 172 CHECKSIZE(size_>0); │ │ │ │ │ + 173 return data_[first_]; │ │ │ │ │ + 174 } │ │ │ │ │ + 175 │ │ │ │ │ +177 const_reference front() const │ │ │ │ │ + 178 { │ │ │ │ │ + 179 CHECKSIZE(size_>0); │ │ │ │ │ + 180 return data_[first_]; │ │ │ │ │ + 181 } │ │ │ │ │ + 182 │ │ │ │ │ +184 reference back() │ │ │ │ │ + 185 { │ │ │ │ │ + 186 CHECKSIZE(size_>0); │ │ │ │ │ + 187 return data_[(first_ + size_-1) % n]; │ │ │ │ │ + 188 } │ │ │ │ │ + 189 │ │ │ │ │ +191 const_reference back() const │ │ │ │ │ + 192 { │ │ │ │ │ + 193 CHECKSIZE(size_>0); │ │ │ │ │ + 194 return data_[(first_ + size_-1) % n]; │ │ │ │ │ + 195 } │ │ │ │ │ + 196 │ │ │ │ │ +202 size_type size () const │ │ │ │ │ + 203 { │ │ │ │ │ + 204 return size_; │ │ │ │ │ + 205 } │ │ │ │ │ 206 │ │ │ │ │ - 207 │ │ │ │ │ - 208// EntitySet concept ############################################## │ │ │ │ │ - 209 │ │ │ │ │ -219struct EntitySet │ │ │ │ │ - 220{ │ │ │ │ │ - 221 template │ │ │ │ │ -222 auto require(E&& f) -> decltype( │ │ │ │ │ - 223 requireType(), │ │ │ │ │ - 224 requireType(), │ │ │ │ │ - 225 requireType() │ │ │ │ │ - 226 ); │ │ │ │ │ - 227}; │ │ │ │ │ - 228 │ │ │ │ │ - 230template │ │ │ │ │ -231static constexpr bool isEntitySet() │ │ │ │ │ - 232{ return models(); } │ │ │ │ │ - 233 │ │ │ │ │ +208 bool empty() const │ │ │ │ │ + 209 { │ │ │ │ │ + 210 return size_==0; │ │ │ │ │ + 211 } │ │ │ │ │ + 212 │ │ │ │ │ +214 static constexpr size_type capacity() │ │ │ │ │ + 215 { │ │ │ │ │ + 216 return n; │ │ │ │ │ + 217 } │ │ │ │ │ + 218 │ │ │ │ │ +220 static constexpr size_type max_size() │ │ │ │ │ + 221 { │ │ │ │ │ + 222 return n; │ │ │ │ │ + 223 } │ │ │ │ │ + 224 │ │ │ │ │ +228 friend std::ostream& operator<<(std::ostream& s, const ReservedDeque& v) │ │ │ │ │ + 229 { │ │ │ │ │ + 230 for (size_t i=0; i │ │ │ │ │ -238struct GridFunction; │ │ │ │ │ - 239 │ │ │ │ │ - 249template │ │ │ │ │ -250struct GridFunction : │ │ │ │ │ - 251 Refines > │ │ │ │ │ - 252{ │ │ │ │ │ -253 using LocalSignature = Range(typename EntitySet::LocalCoordinate); │ │ │ │ │ -254 using LocalContext = typename EntitySet::Element; │ │ │ │ │ - 255 │ │ │ │ │ - 256 template │ │ │ │ │ -257 auto require(F&& f) -> decltype( │ │ │ │ │ - 258 localFunction(f), │ │ │ │ │ - 259 f.entitySet(), │ │ │ │ │ - 260 requireConcept>(localFunction │ │ │ │ │ -(f)), │ │ │ │ │ - 261 requireConcept(), │ │ │ │ │ - 262 requireConvertible(f.entitySet()), │ │ │ │ │ - 263 requireConvertible() │ │ │ │ │ - 264 ); │ │ │ │ │ - 265}; │ │ │ │ │ - 266 │ │ │ │ │ - 268template │ │ │ │ │ -269static constexpr bool isGridFunction() │ │ │ │ │ - 270{ return models, F>(); } │ │ │ │ │ - 271 │ │ │ │ │ - 272 │ │ │ │ │ - 273// DifferentiableGridFunction concept │ │ │ │ │ -############################################## │ │ │ │ │ - 274template class │ │ │ │ │ -DerivativeTraits = DefaultDerivativeTraits> │ │ │ │ │ -275struct DifferentiableGridFunction; │ │ │ │ │ - 276 │ │ │ │ │ - 289template class │ │ │ │ │ -DerivativeTraits> │ │ │ │ │ -290struct DifferentiableGridFunction : │ │ │ │ │ - 291 Refines< │ │ │ │ │ - 292 Dune::Functions::Concept::DifferentiableFunction, │ │ │ │ │ - 293 Dune::Functions::Concept::GridFunction │ │ │ │ │ - 294 > │ │ │ │ │ - 295{ │ │ │ │ │ -296 using LocalSignature = Range(typename EntitySet::LocalCoordinate); │ │ │ │ │ -297 using LocalContext = typename EntitySet::Element; │ │ │ │ │ - 298 │ │ │ │ │ - 299 template │ │ │ │ │ -300 using LocalDerivativeTraits = typename Dune::Functions:: │ │ │ │ │ -LocalDerivativeTraits::template Traits; │ │ │ │ │ - 301 │ │ │ │ │ - 302 template │ │ │ │ │ -303 auto require(F&& f) -> decltype( │ │ │ │ │ - 304 requireConcept>(localFunction(f)) │ │ │ │ │ - 305 ); │ │ │ │ │ - 306}; │ │ │ │ │ - 307 │ │ │ │ │ - 309template class │ │ │ │ │ -DerivativeTraits = DefaultDerivativeTraits> │ │ │ │ │ -310static constexpr bool isDifferentiableGridFunction() │ │ │ │ │ - 311{ return models, F>(); } │ │ │ │ │ - 312 │ │ │ │ │ - 313 │ │ │ │ │ - 314 │ │ │ │ │ - 315// GridViewFunction concept ############################################## │ │ │ │ │ - 316template │ │ │ │ │ -317struct GridViewFunction; │ │ │ │ │ - 318 │ │ │ │ │ - 331template │ │ │ │ │ -332struct GridViewFunction : │ │ │ │ │ - 333 Refines>> │ │ │ │ │ - 334{ │ │ │ │ │ - 335 template │ │ │ │ │ -336 auto require(F&& f) -> decltype( │ │ │ │ │ - 337 0 // We don't need to check any further expressions, because a │ │ │ │ │ -GridViewFunction is just a GridFunction with a special EntitySet │ │ │ │ │ - 338 ); │ │ │ │ │ - 339}; │ │ │ │ │ - 340 │ │ │ │ │ - 342template │ │ │ │ │ -343static constexpr bool isGridViewFunction() │ │ │ │ │ - 344{ return models, F>(); } │ │ │ │ │ - 345 │ │ │ │ │ - 346 │ │ │ │ │ - 347// DifferentiableGridViewFunction concept │ │ │ │ │ -############################################## │ │ │ │ │ - 348template class │ │ │ │ │ -DerivativeTraits = DefaultDerivativeTraits> │ │ │ │ │ -349struct DifferentiableGridViewFunction; │ │ │ │ │ - 350 │ │ │ │ │ - 364template class │ │ │ │ │ -DerivativeTraits> │ │ │ │ │ -365struct DifferentiableGridViewFunction : │ │ │ │ │ - 366 Refines, DerivativeTraits>> │ │ │ │ │ - 367{ │ │ │ │ │ - 368 template │ │ │ │ │ -369 auto require(F&& f) -> decltype( │ │ │ │ │ - 370 0 // We don't need to check any further expressions, because a │ │ │ │ │ -GridViewFunction is just a GridFunction with a special EntitySet │ │ │ │ │ - 371 ); │ │ │ │ │ - 372}; │ │ │ │ │ - 373 │ │ │ │ │ - 375template class │ │ │ │ │ -DerivativeTraits = DefaultDerivativeTraits> │ │ │ │ │ -376static constexpr bool isDifferentiableGridViewFunction() │ │ │ │ │ - 377{ return models, F>(); } │ │ │ │ │ - 378 │ │ │ │ │ - 379 │ │ │ │ │ - 380 │ │ │ │ │ - 381}}} // namespace Dune::Functions::Concept │ │ │ │ │ - 382 │ │ │ │ │ - 383#endif // DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH │ │ │ │ │ -signature.hh │ │ │ │ │ -gridviewentityset.hh │ │ │ │ │ -localderivativetraits.hh │ │ │ │ │ -Dune::Functions::Concept::isGridFunction │ │ │ │ │ -static constexpr bool isGridFunction() │ │ │ │ │ -Check if F models the GridFunction concept with given signature and entity set. │ │ │ │ │ -Definition: functionconcepts.hh:269 │ │ │ │ │ -Dune::Functions::Concept::isDifferentiableLocalFunction │ │ │ │ │ -static constexpr bool isDifferentiableLocalFunction() │ │ │ │ │ -Check if F models the DifferentiableLocalFunction concept with given signature │ │ │ │ │ -and local context. │ │ │ │ │ -Definition: functionconcepts.hh:204 │ │ │ │ │ -Dune::Functions::Concept::isFunction │ │ │ │ │ -static constexpr bool isFunction() │ │ │ │ │ -Check if F models the Function concept with given signature. │ │ │ │ │ -Definition: functionconcepts.hh:88 │ │ │ │ │ -Dune::Functions::Concept::isDifferentiableGridViewFunction │ │ │ │ │ -static constexpr bool isDifferentiableGridViewFunction() │ │ │ │ │ -Check if F models the DifferentiableGridViewFunction concept with given │ │ │ │ │ -signature. │ │ │ │ │ -Definition: functionconcepts.hh:376 │ │ │ │ │ -Dune::Functions::Concept::isDifferentiableFunction │ │ │ │ │ -static constexpr bool isDifferentiableFunction() │ │ │ │ │ -Check if F models the DifferentiableFunction concept with given signature. │ │ │ │ │ -Definition: functionconcepts.hh:127 │ │ │ │ │ -Dune::Functions::Concept::isGridViewFunction │ │ │ │ │ -static constexpr bool isGridViewFunction() │ │ │ │ │ -Check if F models the GridViewFunction concept with given signature. │ │ │ │ │ -Definition: functionconcepts.hh:343 │ │ │ │ │ -Dune::Functions::Concept::isEntitySet │ │ │ │ │ -static constexpr bool isEntitySet() │ │ │ │ │ -Check if F models the GridFunction concept with given signature and entity set. │ │ │ │ │ -Definition: functionconcepts.hh:231 │ │ │ │ │ -Dune::Functions::Concept::isDifferentiableGridFunction │ │ │ │ │ -static constexpr bool isDifferentiableGridFunction() │ │ │ │ │ -Check if F models the DifferentiableGridFunction concept with given signature │ │ │ │ │ -and entity set. │ │ │ │ │ -Definition: functionconcepts.hh:310 │ │ │ │ │ -Dune::Functions::Concept::isLocalFunction │ │ │ │ │ -static constexpr bool isLocalFunction() │ │ │ │ │ -Check if F models the LocalFunction concept with given signature and local │ │ │ │ │ -context. │ │ │ │ │ -Definition: functionconcepts.hh:166 │ │ │ │ │ -Dune::Functions::derivative │ │ │ │ │ -TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const │ │ │ │ │ -TrigonometricFunction< K, sinFactor, cosFactor > &f) │ │ │ │ │ -Obtain derivative of TrigonometricFunction function. │ │ │ │ │ -Definition: trigonometricfunction.hh:39 │ │ │ │ │ -Dune::Functions::Concept::isCallable │ │ │ │ │ -static constexpr auto isCallable() │ │ │ │ │ -Check if f is callable with given argument list. │ │ │ │ │ -Definition: functionconcepts.hh:47 │ │ │ │ │ + 235 private: │ │ │ │ │ + 236 T data_[n]; │ │ │ │ │ + 237 size_type first_; │ │ │ │ │ + 238 size_type size_; │ │ │ │ │ + 239 }; │ │ │ │ │ + 240 │ │ │ │ │ + 241} // end namespace Functions │ │ │ │ │ + 242} // end namespace Dune │ │ │ │ │ + 243 │ │ │ │ │ + 244#undef CHECKSIZE │ │ │ │ │ + 245 │ │ │ │ │ + 246#endif // DUNE_FUNCTIONS_COMMON_RESERVEDDEQUE_HH │ │ │ │ │ +CHECKSIZE │ │ │ │ │ +#define CHECKSIZE(X) │ │ │ │ │ +Definition: reserveddeque.hh:20 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::DefaultDerivativeTraits │ │ │ │ │ -Default implementation for derivative traits. │ │ │ │ │ -Definition: defaultderivativetraits.hh:37 │ │ │ │ │ -Dune::Functions::Concept::Callable │ │ │ │ │ -Concept objects that can be called with given argument list. │ │ │ │ │ -Definition: functionconcepts.hh:33 │ │ │ │ │ -Dune::Functions::Concept::Callable::require │ │ │ │ │ -auto require(F &&f) -> decltype(f(std::declval< Args >()...)) │ │ │ │ │ -Dune::Functions::Concept::Function │ │ │ │ │ -Definition: functionconcepts.hh:66 │ │ │ │ │ -Dune::Functions::Concept::Function<_Range(Domain)>::require │ │ │ │ │ -auto require(F &&f) -> decltype(requireConvertible< Range >(f(std::declval< │ │ │ │ │ -Domain >()))) │ │ │ │ │ -Dune::Functions::Concept::DifferentiableFunction │ │ │ │ │ -Definition: functionconcepts.hh:100 │ │ │ │ │ -Dune::Functions::Concept::DifferentiableFunction<_Range(Domain), │ │ │ │ │ -DerivativeTraits_>::DerivativeSignature │ │ │ │ │ -typename SignatureTraits< Range(Domain)>::template DerivativeSignature< │ │ │ │ │ -DerivativeTraits > DerivativeSignature │ │ │ │ │ -Definition: functionconcepts.hh:116 │ │ │ │ │ -Dune::Functions::Concept::DifferentiableFunction<_Range(Domain), │ │ │ │ │ -DerivativeTraits_>::require │ │ │ │ │ -auto require(F &&f) -> decltype(derivative(f), requireConcept< Function< │ │ │ │ │ -DerivativeSignature > >(derivative(f))) │ │ │ │ │ -Dune::Functions::Concept::LocalFunction │ │ │ │ │ -Definition: functionconcepts.hh:139 │ │ │ │ │ -Dune::Functions::Concept::LocalFunction<_Range(Domain),_LocalContext_>::require │ │ │ │ │ -auto require(F &&f) -> decltype(f.bind(std::declval< LocalContext >()), │ │ │ │ │ -f.unbind(), requireConvertible< bool >(f.bound()), f.localContext(), │ │ │ │ │ -requireConvertible< LocalContext >(f.localContext())) │ │ │ │ │ -Dune::Functions::Concept::DifferentiableLocalFunction │ │ │ │ │ -Definition: functionconcepts.hh:172 │ │ │ │ │ -Dune::Functions::Concept::DifferentiableLocalFunction<_Range(Domain), │ │ │ │ │ -LocalContext,_DerivativeTraits_>::require │ │ │ │ │ -auto require(F &&f) -> decltype(f.bind(std::declval< LocalContext >()), │ │ │ │ │ -f.unbind(), f.localContext(), requireConvertible< LocalContext >(f.localContext │ │ │ │ │ -())) │ │ │ │ │ -Dune::Functions::Concept::EntitySet │ │ │ │ │ -Concept for an entity set for a Concept::GridFunction │ │ │ │ │ -Definition: functionconcepts.hh:220 │ │ │ │ │ -Dune::Functions::Concept::EntitySet::require │ │ │ │ │ -auto require(E &&f) -> decltype(requireType< typename E::Element >(), │ │ │ │ │ -requireType< typename E::LocalCoordinate >(), requireType< typename E:: │ │ │ │ │ -GlobalCoordinate >()) │ │ │ │ │ -Dune::Functions::Concept::GridFunction │ │ │ │ │ -Definition: functionconcepts.hh:238 │ │ │ │ │ -Dune::Functions::Concept::GridFunction<_Range(Domain),_EntitySet_>:: │ │ │ │ │ -LocalContext │ │ │ │ │ -typename EntitySet::Element LocalContext │ │ │ │ │ -Definition: functionconcepts.hh:254 │ │ │ │ │ -Dune::Functions::Concept::GridFunction<_Range(Domain),_EntitySet_>:: │ │ │ │ │ -LocalSignature │ │ │ │ │ -Range(typename EntitySet::LocalCoordinate) LocalSignature │ │ │ │ │ -Definition: functionconcepts.hh:253 │ │ │ │ │ -Dune::Functions::Concept::GridFunction<_Range(Domain),_EntitySet_>::require │ │ │ │ │ -auto require(F &&f) -> decltype(localFunction(f), f.entitySet(), │ │ │ │ │ -requireConcept< LocalFunction< LocalSignature, LocalContext > >(localFunction │ │ │ │ │ -(f)), requireConcept< Concept::EntitySet, EntitySet >(), requireConvertible< │ │ │ │ │ -EntitySet >(f.entitySet()), requireConvertible< typename EntitySet:: │ │ │ │ │ -GlobalCoordinate, Domain >()) │ │ │ │ │ -Dune::Functions::Concept::DifferentiableGridFunction │ │ │ │ │ -Definition: functionconcepts.hh:275 │ │ │ │ │ -Dune::Functions::Concept::DifferentiableGridFunction<_Range(Domain),_EntitySet, │ │ │ │ │ -DerivativeTraits_>::LocalDerivativeTraits │ │ │ │ │ -typename Dune::Functions::LocalDerivativeTraits< EntitySet, DerivativeTraits │ │ │ │ │ ->::template Traits< R > LocalDerivativeTraits │ │ │ │ │ -Definition: functionconcepts.hh:300 │ │ │ │ │ -Dune::Functions::Concept::DifferentiableGridFunction<_Range(Domain),_EntitySet, │ │ │ │ │ -DerivativeTraits_>::require │ │ │ │ │ -auto require(F &&f) -> decltype(requireConcept< DifferentiableLocalFunction< │ │ │ │ │ -LocalSignature, LocalContext, LocalDerivativeTraits > >(localFunction(f))) │ │ │ │ │ -Dune::Functions::Concept::DifferentiableGridFunction<_Range(Domain),_EntitySet, │ │ │ │ │ -DerivativeTraits_>::LocalSignature │ │ │ │ │ -Range(typename EntitySet::LocalCoordinate) LocalSignature │ │ │ │ │ -Definition: functionconcepts.hh:296 │ │ │ │ │ -Dune::Functions::Concept::DifferentiableGridFunction<_Range(Domain),_EntitySet, │ │ │ │ │ -DerivativeTraits_>::LocalContext │ │ │ │ │ -typename EntitySet::Element LocalContext │ │ │ │ │ -Definition: functionconcepts.hh:297 │ │ │ │ │ -Dune::Functions::Concept::GridViewFunction │ │ │ │ │ -Definition: functionconcepts.hh:317 │ │ │ │ │ -Dune::Functions::Concept::GridViewFunction<_Range(Domain),_GridView_>::require │ │ │ │ │ -auto require(F &&f) -> decltype(0) │ │ │ │ │ -Dune::Functions::Concept::DifferentiableGridViewFunction │ │ │ │ │ -Definition: functionconcepts.hh:349 │ │ │ │ │ -Dune::Functions::Concept::DifferentiableGridViewFunction<_Range(Domain), │ │ │ │ │ -GridView,_DerivativeTraits_>::require │ │ │ │ │ -auto require(F &&f) -> decltype(0) │ │ │ │ │ -Dune::Functions::SignatureTraits │ │ │ │ │ -Helper class to deduce the signature of a callable. │ │ │ │ │ -Definition: signature.hh:56 │ │ │ │ │ -Dune::Functions::SignatureTag │ │ │ │ │ -Definition: signature.hh:102 │ │ │ │ │ -Dune::Functions::LocalDerivativeTraits │ │ │ │ │ -Derivative traits for local functions. │ │ │ │ │ -Definition: localderivativetraits.hh:28 │ │ │ │ │ +Dune::Functions::ReservedDeque │ │ │ │ │ +A double-ended queue (deque) class with statically reserved memory. │ │ │ │ │ +Definition: reserveddeque.hh:45 │ │ │ │ │ +Dune::Functions::ReservedDeque::pop_front │ │ │ │ │ +void pop_front() │ │ │ │ │ +Erases the first element of the vector, O(1) time. │ │ │ │ │ +Definition: reserveddeque.hh:126 │ │ │ │ │ +Dune::Functions::ReservedDeque::capacity │ │ │ │ │ +static constexpr size_type capacity() │ │ │ │ │ +Returns current capacity (allocated memory) of the vector. │ │ │ │ │ +Definition: reserveddeque.hh:214 │ │ │ │ │ +Dune::Functions::ReservedDeque::clear │ │ │ │ │ +void clear() │ │ │ │ │ +Erases all elements. │ │ │ │ │ +Definition: reserveddeque.hh:89 │ │ │ │ │ +Dune::Functions::ReservedDeque::iterator │ │ │ │ │ +Dune::GenericIterator< ReservedDeque, value_type > iterator │ │ │ │ │ +Iterator used to iterate through a vector. │ │ │ │ │ +Definition: reserveddeque.hh:63 │ │ │ │ │ +Dune::Functions::ReservedDeque::value_type │ │ │ │ │ +T value_type │ │ │ │ │ +The type of object, T, stored in the vector. │ │ │ │ │ +Definition: reserveddeque.hh:51 │ │ │ │ │ +Dune::Functions::ReservedDeque::ReservedDeque │ │ │ │ │ +ReservedDeque() │ │ │ │ │ +Constructor. │ │ │ │ │ +Definition: reserveddeque.hh:72 │ │ │ │ │ +Dune::Functions::ReservedDeque::empty │ │ │ │ │ +bool empty() const │ │ │ │ │ +Returns true if vector has no elements. │ │ │ │ │ +Definition: reserveddeque.hh:208 │ │ │ │ │ +Dune::Functions::ReservedDeque::back │ │ │ │ │ +const_reference back() const │ │ │ │ │ +Returns const reference to last element of vector. │ │ │ │ │ +Definition: reserveddeque.hh:191 │ │ │ │ │ +Dune::Functions::ReservedDeque::operator<< │ │ │ │ │ +friend std::ostream & operator<<(std::ostream &s, const ReservedDeque &v) │ │ │ │ │ +Send ReservedDeque to an output stream. │ │ │ │ │ +Definition: reserveddeque.hh:228 │ │ │ │ │ +Dune::Functions::ReservedDeque::push_front │ │ │ │ │ +void push_front(const T &t) │ │ │ │ │ +Prepends an element to the begin of a deque if size const_iterator │ │ │ │ │ +Const iterator used to iterate through a vector. │ │ │ │ │ +Definition: reserveddeque.hh:65 │ │ │ │ │ +Dune::Functions::ReservedDeque::size │ │ │ │ │ +size_type size() const │ │ │ │ │ +Returns number of elements in the vector. │ │ │ │ │ +Definition: reserveddeque.hh:202 │ │ │ │ │ +Dune::Functions::ReservedDeque::end │ │ │ │ │ +const_iterator end() const │ │ │ │ │ +Returns a const_iterator pointing to the end of the vector. │ │ │ │ │ +Definition: reserveddeque.hh:151 │ │ │ │ │ +Dune::Functions::ReservedDeque::resize │ │ │ │ │ +void resize(size_t s) │ │ │ │ │ +Specifies a new size for the vector. │ │ │ │ │ +Definition: reserveddeque.hh:96 │ │ │ │ │ +Dune::Functions::ReservedDeque::begin │ │ │ │ │ +iterator begin() │ │ │ │ │ +Returns a iterator pointing to the beginning of the vector. │ │ │ │ │ +Definition: reserveddeque.hh:136 │ │ │ │ │ +Dune::Functions::ReservedDeque::begin │ │ │ │ │ +const_iterator begin() const │ │ │ │ │ +Returns a const_iterator pointing to the beginning of the vector. │ │ │ │ │ +Definition: reserveddeque.hh:141 │ │ │ │ │ +Dune::Functions::ReservedDeque::ReservedDeque │ │ │ │ │ +ReservedDeque(std::initializer_list< T > const &l) │ │ │ │ │ +Definition: reserveddeque.hh:77 │ │ │ │ │ +Dune::Functions::ReservedDeque::size_type │ │ │ │ │ +size_t size_type │ │ │ │ │ +An unsigned integral type. │ │ │ │ │ +Definition: reserveddeque.hh:59 │ │ │ │ │ +Dune::Functions::ReservedDeque::push_back │ │ │ │ │ +void push_back(const T &t) │ │ │ │ │ +Appends an element to the end of a vector, up to the maximum size n, O(1) time. │ │ │ │ │ +Definition: reserveddeque.hh:103 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00029.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: defaultderivativetraits.hh File Reference │ │ │ │ +dune-functions: typeerasure.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,43 +65,29 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
defaultderivativetraits.hh File Reference
│ │ │ │ +
typeerasure.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <dune/common/fvector.hh>
│ │ │ │ -#include <dune/common/fmatrix.hh>
│ │ │ │ +
#include <typeinfo>
│ │ │ │ +#include <dune/common/typeutilities.hh>
│ │ │ │ +#include <dune/functions/common/type_traits.hh>
│ │ │ │ +#include <dune/functions/common/interfaces.hh>
│ │ │ │ +#include <dune/functions/common/polymorphicsmallobject.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::InvalidRange
 Dummy range class to be used if no proper type is available. More...
 
struct  Dune::Functions::DefaultDerivativeTraits< Signature >
 Default implementation for derivative traits. More...
 
struct  Dune::Functions::DefaultDerivativeTraits< double(double) >
 Default implementation for derivative traits. More...
 
struct  Dune::Functions::DefaultDerivativeTraits< K(FieldVector< K, n >)>
 Default implementation for derivative traits. More...
 
struct  Dune::Functions::DefaultDerivativeTraits< FieldVector< K, m >(FieldVector< K, n >)>
 Default implementation for derivative traits. More...
 
struct  Dune::Functions::DefaultDerivativeTraits< FieldMatrix< K, 1, m >(FieldVector< K, n >)>
 Default implementation for derivative traits. More...
class  Dune::Functions::TypeErasureBase< Interface, Implementation, bufferSize >
 Base class for type-erased interface wrapper. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -6,40 +6,25 @@ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ Classes | Namespaces │ │ │ │ │ -defaultderivativetraits.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +typeerasure.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ - class  Dune::Functions::InvalidRange │ │ │ │ │ -  Dummy range class to be used if no proper type is available. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::DefaultDerivativeTraits<_Signature_> │ │ │ │ │ -  Default implementation for derivative traits. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::DefaultDerivativeTraits<_double(double)_> │ │ │ │ │ -  Default implementation for derivative traits. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::DefaultDerivativeTraits<_K(FieldVector<_K,_n_>)> │ │ │ │ │ -  Default implementation for derivative traits. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::DefaultDerivativeTraits<_FieldVector<_K,_m_> │ │ │ │ │ - (FieldVector<_K,_n_>)> │ │ │ │ │ -  Default implementation for derivative traits. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::DefaultDerivativeTraits<_FieldMatrix<_K,_1,_m_> │ │ │ │ │ - (FieldVector<_K,_n_>)> │ │ │ │ │ -  Default implementation for derivative traits. More... │ │ │ │ │ +class  Dune::Functions::TypeErasureBase<_Interface,_Implementation,_bufferSize │ │ │ │ │ + > │ │ │ │ │ +  Base class for type-erased interface wrapper. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00029_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: defaultderivativetraits.hh Source File │ │ │ │ +dune-functions: typeerasure.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,81 +62,159 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
defaultderivativetraits.hh
│ │ │ │ +
typeerasure.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#ifndef DUNE_FUNCTIONS_COMMON_DEFAULT_DERIVATIVE_TRAITS_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_COMMON_DEFAULT_DERIVATIVE_TRAITS_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_COMMON_TYPEERASURE_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_COMMON_TYPEERASURE_HH
│ │ │ │
5
│ │ │ │ -
6#include <type_traits>
│ │ │ │ -
7#include <utility>
│ │ │ │ -
8
│ │ │ │ -
9#include <dune/common/fvector.hh>
│ │ │ │ -
10#include <dune/common/fmatrix.hh>
│ │ │ │ -
11
│ │ │ │ -
12namespace Dune {
│ │ │ │ -
13namespace Functions {
│ │ │ │ -
14
│ │ │ │ -
15
│ │ │ │ -
16
│ │ │ │ - │ │ │ │ -
23{};
│ │ │ │ -
24
│ │ │ │ -
25
│ │ │ │ -
35template<class Signature>
│ │ │ │ - │ │ │ │ +
6#include <typeinfo>
│ │ │ │ +
7
│ │ │ │ +
8#include <dune/common/typeutilities.hh>
│ │ │ │ +
9
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
13
│ │ │ │ +
14namespace Dune {
│ │ │ │ +
15namespace Functions {
│ │ │ │ +
16namespace Imp {
│ │ │ │ +
17
│ │ │ │ +
18
│ │ │ │ +
19
│ │ │ │ +
33template<class Interface>
│ │ │ │ +
34class TypeErasureWrapperInterface :
│ │ │ │ +
35 public Interface,
│ │ │ │ +
36 public PolymorphicType<TypeErasureWrapperInterface<Interface>>
│ │ │ │
37{
│ │ │ │ - │ │ │ │ +
38public:
│ │ │ │ +
39 virtual const std::type_info& target_type() const = 0;
│ │ │ │
40};
│ │ │ │
41
│ │ │ │
42
│ │ │ │ -
50template<>
│ │ │ │ -
51struct DefaultDerivativeTraits< double(double) >
│ │ │ │ -
52{
│ │ │ │ -
54 typedef double Range;
│ │ │ │ -
55};
│ │ │ │ -
56
│ │ │ │ -
66template<typename K, int n>
│ │ │ │ -
67struct DefaultDerivativeTraits<K(FieldVector<K,n>)>
│ │ │ │ -
68{
│ │ │ │ -
70 typedef FieldVector<K,n> Range;
│ │ │ │ -
71};
│ │ │ │ -
72
│ │ │ │ -
82template<typename K, int n, int m>
│ │ │ │ -
83struct DefaultDerivativeTraits<FieldVector<K,m>(FieldVector<K,n>)>
│ │ │ │ -
84{
│ │ │ │ -
86 typedef FieldMatrix<K,m,n> Range;
│ │ │ │ -
87};
│ │ │ │ +
43
│ │ │ │ +
60template<class Interface, class T>
│ │ │ │ +
61class TypeErasureWrapperBase :
│ │ │ │ +
62 public TypeErasureWrapperInterface<Interface>
│ │ │ │ +
63{
│ │ │ │ +
64public:
│ │ │ │ +
65 template<class TT, disableCopyMove<TypeErasureWrapperBase, TT> = 0>
│ │ │ │ +
66 TypeErasureWrapperBase(TT&& t) :
│ │ │ │ +
67 wrapped_(std::forward<TT>(t))
│ │ │ │ +
68 {}
│ │ │ │ +
69
│ │ │ │ +
71 T& get()
│ │ │ │ +
72 {
│ │ │ │ +
73 return wrapped_;
│ │ │ │ +
74 }
│ │ │ │ +
75
│ │ │ │ +
77 const T& get() const
│ │ │ │ +
78 {
│ │ │ │ +
79 return wrapped_;
│ │ │ │ +
80 }
│ │ │ │ +
81
│ │ │ │ +
82protected:
│ │ │ │ +
83 using Wrapped = T;
│ │ │ │ +
84 Wrapped wrapped_;
│ │ │ │ +
85};
│ │ │ │ +
86
│ │ │ │ +
87
│ │ │ │
88
│ │ │ │ -
98template<typename K, int n, int m>
│ │ │ │ -
99struct DefaultDerivativeTraits<FieldMatrix<K,1,m>(FieldVector<K,n>)>
│ │ │ │ -
100{
│ │ │ │ -
102 typedef FieldMatrix<K,m,n> Range;
│ │ │ │ -
103};
│ │ │ │ -
104
│ │ │ │ -
105
│ │ │ │ -
106}} // namespace Dune::Functions
│ │ │ │ -
107
│ │ │ │ -
108
│ │ │ │ -
109#endif // DUNE_FUNCTIONS_COMMON_DEFAULT_DERIVATIVE_TRAITS_HH
│ │ │ │ +
112template<class Interface, template<class> class Implementation, class T>
│ │ │ │ +
113class TypeErasureWrapperImplementation :
│ │ │ │ +
114 public Implementation<TypeErasureWrapperBase<Interface, T> >
│ │ │ │ +
115{
│ │ │ │ +
116public:
│ │ │ │ +
117
│ │ │ │ +
119 template<class TT, disableCopyMove<TypeErasureWrapperImplementation, T> = 0>
│ │ │ │ +
120 TypeErasureWrapperImplementation(TT&& t) :
│ │ │ │ +
121 Implementation<TypeErasureWrapperBase<Interface, T> >(std::forward<TT>(t))
│ │ │ │ +
122 {}
│ │ │ │ +
123
│ │ │ │ +
125 virtual TypeErasureWrapperImplementation* clone() const
│ │ │ │ +
126 {
│ │ │ │ +
127 return new TypeErasureWrapperImplementation(*this);
│ │ │ │ +
128 }
│ │ │ │ +
129
│ │ │ │ +
131 virtual TypeErasureWrapperImplementation* clone(void* buffer) const
│ │ │ │ +
132 {
│ │ │ │ +
133 return new (buffer) TypeErasureWrapperImplementation(*this);
│ │ │ │ +
134 }
│ │ │ │ +
135
│ │ │ │ +
137 virtual TypeErasureWrapperImplementation* move(void* buffer)
│ │ │ │ +
138 {
│ │ │ │ +
139 return new (buffer) TypeErasureWrapperImplementation(std::move(*this));
│ │ │ │ +
140 }
│ │ │ │ +
141
│ │ │ │ +
143 virtual const std::type_info& target_type() const
│ │ │ │ +
144 {
│ │ │ │ +
145 return typeid(T);
│ │ │ │ +
146 }
│ │ │ │ +
147};
│ │ │ │ +
148
│ │ │ │ +
149} // namespace Dune::Functions::Imp
│ │ │ │ +
150
│ │ │ │ +
151
│ │ │ │ +
152
│ │ │ │ +
163template<class Interface, template<class> class Implementation, size_t bufferSize = 56>
│ │ │ │ + │ │ │ │ +
165{
│ │ │ │ +
166public:
│ │ │ │ +
167
│ │ │ │ +
169 template<class T, disableCopyMove<TypeErasureBase, T> = 0 >
│ │ │ │ + │ │ │ │ +
171 wrapped_(Imp::TypeErasureWrapperImplementation<Interface, Implementation, typename std::decay<T>::type>(std::forward<T>(t)))
│ │ │ │ +
172 {}
│ │ │ │ +
173
│ │ │ │ +
175 TypeErasureBase() = default;
│ │ │ │ +
176
│ │ │ │ +
178 Interface& asInterface()
│ │ │ │ +
179 {
│ │ │ │ +
180 return wrapped_.get();
│ │ │ │ +
181 }
│ │ │ │ +
182
│ │ │ │ +
184 const Interface& asInterface() const
│ │ │ │ +
185 {
│ │ │ │ +
186 return wrapped_.get();
│ │ │ │ +
187 }
│ │ │ │ +
188
│ │ │ │ +
190 const std::type_info& target_type() const
│ │ │ │ +
191 {
│ │ │ │ +
192 return wrapped_.get().target_type();
│ │ │ │ +
193 }
│ │ │ │ +
194
│ │ │ │ +
195protected:
│ │ │ │ + │ │ │ │ +
197};
│ │ │ │ +
198
│ │ │ │ +
199
│ │ │ │ +
200}} // namespace Dune::Functions
│ │ │ │ +
201
│ │ │ │ +
202
│ │ │ │ +
203
│ │ │ │ +
204#endif // DUNE_FUNCTIONS_COMMON_TYPEERASURE_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
Dummy range class to be used if no proper type is available.
Definition: defaultderivativetraits.hh:23
│ │ │ │ -
Default implementation for derivative traits.
Definition: defaultderivativetraits.hh:37
│ │ │ │ -
InvalidRange Range
Range of derivative for function with given signature.
Definition: defaultderivativetraits.hh:39
│ │ │ │ -
double Range
Range of derivative for function with given signature.
Definition: defaultderivativetraits.hh:54
│ │ │ │ -
FieldVector< K, n > Range
Range of derivative for function with given signature.
Definition: defaultderivativetraits.hh:70
│ │ │ │ -
FieldMatrix< K, m, n > Range
Range of derivative for function with given signature.
Definition: defaultderivativetraits.hh:86
│ │ │ │ -
FieldMatrix< K, m, n > Range
Range of derivative for function with given signature.
Definition: defaultderivativetraits.hh:102
│ │ │ │ +
A wrapper providing small object optimization with polymorphic types.
Definition: polymorphicsmallobject.hh:45
│ │ │ │ +
Base class for type-erased interface wrapper.
Definition: typeerasure.hh:165
│ │ │ │ +
const std::type_info & target_type() const
Get type of stored object.
Definition: typeerasure.hh:190
│ │ │ │ +
TypeErasureBase(T &&t)
Construct wrapper from object.
Definition: typeerasure.hh:170
│ │ │ │ +
PolymorphicSmallObject< Imp::TypeErasureWrapperInterface< Interface >, bufferSize > wrapped_
Definition: typeerasure.hh:196
│ │ │ │ +
TypeErasureBase()=default
Default constructor.
│ │ │ │ +
Interface & asInterface()
Get mutable reference to wrapped object.
Definition: typeerasure.hh:178
│ │ │ │ +
const Interface & asInterface() const
Get reference to wrapped object.
Definition: typeerasure.hh:184
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,98 +5,180 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -defaultderivativetraits.hh │ │ │ │ │ +typeerasure.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#ifndef DUNE_FUNCTIONS_COMMON_DEFAULT_DERIVATIVE_TRAITS_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_COMMON_DEFAULT_DERIVATIVE_TRAITS_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_COMMON_TYPEERASURE_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_COMMON_TYPEERASURE_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ - 8 │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11 │ │ │ │ │ - 12namespace Dune { │ │ │ │ │ - 13namespace Functions { │ │ │ │ │ - 14 │ │ │ │ │ - 15 │ │ │ │ │ - 16 │ │ │ │ │ -22class InvalidRange │ │ │ │ │ - 23{}; │ │ │ │ │ - 24 │ │ │ │ │ - 25 │ │ │ │ │ - 35template │ │ │ │ │ -36struct DefaultDerivativeTraits │ │ │ │ │ + 6#include │ │ │ │ │ + 7 │ │ │ │ │ + 8#include │ │ │ │ │ + 9 │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ + 13 │ │ │ │ │ + 14namespace Dune { │ │ │ │ │ + 15namespace Functions { │ │ │ │ │ + 16namespace Imp { │ │ │ │ │ + 17 │ │ │ │ │ + 18 │ │ │ │ │ + 19 │ │ │ │ │ + 33template │ │ │ │ │ + 34class TypeErasureWrapperInterface : │ │ │ │ │ + 35 public Interface, │ │ │ │ │ + 36 public PolymorphicType> │ │ │ │ │ 37{ │ │ │ │ │ -39 typedef InvalidRange Range; │ │ │ │ │ + 38public: │ │ │ │ │ + 39 virtual const std::type_info& target_type() const = 0; │ │ │ │ │ 40}; │ │ │ │ │ 41 │ │ │ │ │ 42 │ │ │ │ │ - 50template<> │ │ │ │ │ -51struct DefaultDerivativeTraits< double(double) > │ │ │ │ │ - 52{ │ │ │ │ │ -54 typedef double Range; │ │ │ │ │ - 55}; │ │ │ │ │ - 56 │ │ │ │ │ - 66template │ │ │ │ │ -67struct DefaultDerivativeTraits)> │ │ │ │ │ - 68{ │ │ │ │ │ -70 typedef FieldVector Range; │ │ │ │ │ - 71}; │ │ │ │ │ - 72 │ │ │ │ │ - 82template │ │ │ │ │ -83struct DefaultDerivativeTraits(FieldVector)> │ │ │ │ │ - 84{ │ │ │ │ │ -86 typedef FieldMatrix Range; │ │ │ │ │ - 87}; │ │ │ │ │ + 43 │ │ │ │ │ + 60template │ │ │ │ │ + 61class TypeErasureWrapperBase : │ │ │ │ │ + 62 public TypeErasureWrapperInterface │ │ │ │ │ + 63{ │ │ │ │ │ + 64public: │ │ │ │ │ + 65 template = 0> │ │ │ │ │ + 66 TypeErasureWrapperBase(TT&& t) : │ │ │ │ │ + 67 wrapped_(std::forward(t)) │ │ │ │ │ + 68 {} │ │ │ │ │ + 69 │ │ │ │ │ + 71 T& get() │ │ │ │ │ + 72 { │ │ │ │ │ + 73 return wrapped_; │ │ │ │ │ + 74 } │ │ │ │ │ + 75 │ │ │ │ │ + 77 const T& get() const │ │ │ │ │ + 78 { │ │ │ │ │ + 79 return wrapped_; │ │ │ │ │ + 80 } │ │ │ │ │ + 81 │ │ │ │ │ + 82protected: │ │ │ │ │ + 83 using Wrapped = T; │ │ │ │ │ + 84 Wrapped wrapped_; │ │ │ │ │ + 85}; │ │ │ │ │ + 86 │ │ │ │ │ + 87 │ │ │ │ │ 88 │ │ │ │ │ - 98template │ │ │ │ │ -99struct DefaultDerivativeTraits(FieldVector)> │ │ │ │ │ - 100{ │ │ │ │ │ -102 typedef FieldMatrix Range; │ │ │ │ │ - 103}; │ │ │ │ │ - 104 │ │ │ │ │ - 105 │ │ │ │ │ - 106}} // namespace Dune::Functions │ │ │ │ │ - 107 │ │ │ │ │ - 108 │ │ │ │ │ - 109#endif // DUNE_FUNCTIONS_COMMON_DEFAULT_DERIVATIVE_TRAITS_HH │ │ │ │ │ + 112template class Implementation, class T> │ │ │ │ │ + 113class TypeErasureWrapperImplementation : │ │ │ │ │ + 114 public Implementation > │ │ │ │ │ + 115{ │ │ │ │ │ + 116public: │ │ │ │ │ + 117 │ │ │ │ │ + 119 template = │ │ │ │ │ +0> │ │ │ │ │ + 120 TypeErasureWrapperImplementation(TT&& t) : │ │ │ │ │ + 121 Implementation >(std::forward(t)) │ │ │ │ │ + 122 {} │ │ │ │ │ + 123 │ │ │ │ │ + 125 virtual TypeErasureWrapperImplementation* clone() const │ │ │ │ │ + 126 { │ │ │ │ │ + 127 return new TypeErasureWrapperImplementation(*this); │ │ │ │ │ + 128 } │ │ │ │ │ + 129 │ │ │ │ │ + 131 virtual TypeErasureWrapperImplementation* clone(void* buffer) const │ │ │ │ │ + 132 { │ │ │ │ │ + 133 return new (buffer) TypeErasureWrapperImplementation(*this); │ │ │ │ │ + 134 } │ │ │ │ │ + 135 │ │ │ │ │ + 137 virtual TypeErasureWrapperImplementation* move(void* buffer) │ │ │ │ │ + 138 { │ │ │ │ │ + 139 return new (buffer) TypeErasureWrapperImplementation(std::move(*this)); │ │ │ │ │ + 140 } │ │ │ │ │ + 141 │ │ │ │ │ + 143 virtual const std::type_info& target_type() const │ │ │ │ │ + 144 { │ │ │ │ │ + 145 return typeid(T); │ │ │ │ │ + 146 } │ │ │ │ │ + 147}; │ │ │ │ │ + 148 │ │ │ │ │ + 149} // namespace Dune::Functions::Imp │ │ │ │ │ + 150 │ │ │ │ │ + 151 │ │ │ │ │ + 152 │ │ │ │ │ + 163template class Implementation, size_t │ │ │ │ │ +bufferSize = 56> │ │ │ │ │ +164class TypeErasureBase │ │ │ │ │ + 165{ │ │ │ │ │ + 166public: │ │ │ │ │ + 167 │ │ │ │ │ + 169 template = 0 > │ │ │ │ │ +170 TypeErasureBase(T&& t) : │ │ │ │ │ + 171 wrapped_(Imp::TypeErasureWrapperImplementation::type>(std::forward(t))) │ │ │ │ │ + 172 {} │ │ │ │ │ + 173 │ │ │ │ │ +175 TypeErasureBase() = default; │ │ │ │ │ + 176 │ │ │ │ │ +178 Interface& asInterface() │ │ │ │ │ + 179 { │ │ │ │ │ + 180 return wrapped_.get(); │ │ │ │ │ + 181 } │ │ │ │ │ + 182 │ │ │ │ │ +184 const Interface& asInterface() const │ │ │ │ │ + 185 { │ │ │ │ │ + 186 return wrapped_.get(); │ │ │ │ │ + 187 } │ │ │ │ │ + 188 │ │ │ │ │ +190 const std::type_info& target_type() const │ │ │ │ │ + 191 { │ │ │ │ │ + 192 return wrapped_.get().target_type(); │ │ │ │ │ + 193 } │ │ │ │ │ + 194 │ │ │ │ │ + 195protected: │ │ │ │ │ +196 PolymorphicSmallObject, │ │ │ │ │ +bufferSize > wrapped_; │ │ │ │ │ + 197}; │ │ │ │ │ + 198 │ │ │ │ │ + 199 │ │ │ │ │ + 200}} // namespace Dune::Functions │ │ │ │ │ + 201 │ │ │ │ │ + 202 │ │ │ │ │ + 203 │ │ │ │ │ + 204#endif // DUNE_FUNCTIONS_COMMON_TYPEERASURE_HH │ │ │ │ │ +type_traits.hh │ │ │ │ │ +interfaces.hh │ │ │ │ │ +polymorphicsmallobject.hh │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::InvalidRange │ │ │ │ │ -Dummy range class to be used if no proper type is available. │ │ │ │ │ -Definition: defaultderivativetraits.hh:23 │ │ │ │ │ -Dune::Functions::DefaultDerivativeTraits │ │ │ │ │ -Default implementation for derivative traits. │ │ │ │ │ -Definition: defaultderivativetraits.hh:37 │ │ │ │ │ -Dune::Functions::DefaultDerivativeTraits::Range │ │ │ │ │ -InvalidRange Range │ │ │ │ │ -Range of derivative for function with given signature. │ │ │ │ │ -Definition: defaultderivativetraits.hh:39 │ │ │ │ │ -Dune::Functions::DefaultDerivativeTraits<_double(double)_>::Range │ │ │ │ │ -double Range │ │ │ │ │ -Range of derivative for function with given signature. │ │ │ │ │ -Definition: defaultderivativetraits.hh:54 │ │ │ │ │ -Dune::Functions::DefaultDerivativeTraits<_K(FieldVector<_K,_n_>)>::Range │ │ │ │ │ -FieldVector< K, n > Range │ │ │ │ │ -Range of derivative for function with given signature. │ │ │ │ │ -Definition: defaultderivativetraits.hh:70 │ │ │ │ │ -Dune::Functions::DefaultDerivativeTraits<_FieldVector<_K,_m_>(FieldVector<_K,_n │ │ │ │ │ ->)>::Range │ │ │ │ │ -FieldMatrix< K, m, n > Range │ │ │ │ │ -Range of derivative for function with given signature. │ │ │ │ │ -Definition: defaultderivativetraits.hh:86 │ │ │ │ │ -Dune::Functions::DefaultDerivativeTraits<_FieldMatrix<_K,_1,_m_>(FieldVector< │ │ │ │ │ -K,_n_>)>::Range │ │ │ │ │ -FieldMatrix< K, m, n > Range │ │ │ │ │ -Range of derivative for function with given signature. │ │ │ │ │ -Definition: defaultderivativetraits.hh:102 │ │ │ │ │ +Dune::Functions::PolymorphicSmallObject │ │ │ │ │ +A wrapper providing small object optimization with polymorphic types. │ │ │ │ │ +Definition: polymorphicsmallobject.hh:45 │ │ │ │ │ +Dune::Functions::TypeErasureBase │ │ │ │ │ +Base class for type-erased interface wrapper. │ │ │ │ │ +Definition: typeerasure.hh:165 │ │ │ │ │ +Dune::Functions::TypeErasureBase::target_type │ │ │ │ │ +const std::type_info & target_type() const │ │ │ │ │ +Get type of stored object. │ │ │ │ │ +Definition: typeerasure.hh:190 │ │ │ │ │ +Dune::Functions::TypeErasureBase::TypeErasureBase │ │ │ │ │ +TypeErasureBase(T &&t) │ │ │ │ │ +Construct wrapper from object. │ │ │ │ │ +Definition: typeerasure.hh:170 │ │ │ │ │ +Dune::Functions::TypeErasureBase::wrapped_ │ │ │ │ │ +PolymorphicSmallObject< Imp::TypeErasureWrapperInterface< Interface >, │ │ │ │ │ +bufferSize > wrapped_ │ │ │ │ │ +Definition: typeerasure.hh:196 │ │ │ │ │ +Dune::Functions::TypeErasureBase::TypeErasureBase │ │ │ │ │ +TypeErasureBase()=default │ │ │ │ │ +Default constructor. │ │ │ │ │ +Dune::Functions::TypeErasureBase::asInterface │ │ │ │ │ +Interface & asInterface() │ │ │ │ │ +Get mutable reference to wrapped object. │ │ │ │ │ +Definition: typeerasure.hh:178 │ │ │ │ │ +Dune::Functions::TypeErasureBase::asInterface │ │ │ │ │ +const Interface & asInterface() const │ │ │ │ │ +Get reference to wrapped object. │ │ │ │ │ +Definition: typeerasure.hh:184 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00032.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: referencehelper.hh File Reference │ │ │ │ +dune-functions: indexaccess.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -64,52 +64,60 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Namespaces | │ │ │ │ -Typedefs | │ │ │ │ -Functions | │ │ │ │ -Variables
│ │ │ │ -
referencehelper.hh File Reference
│ │ │ │ +Functions
│ │ │ │ +
indexaccess.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ -#include <dune/common/referencehelper.hh>
│ │ │ │ +
#include <utility>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/common/concept.hh>
│ │ │ │ +#include <dune/common/hybridutilities.hh>
│ │ │ │ +#include <dune/functions/common/utility.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Typedefs

template<class T >
using Dune::Functions::ResolveRef_t = Dune::ResolveRef_t< T >
 This is an alias for Dune::ResolveRef_t. More...
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Functions

template<class T >
decltype(auto) Dune::Functions::resolveRef (T &&t)
 This is an alias for Dune::resolveRef. More...
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Variables

template<class T >
constexpr bool Dune::Functions::IsReferenceWrapper_v = Dune::IsReferenceWrapper_v<T>
 This is an alias for Dune::IsReferenceWrapper_v. More...
 
template<class C , class I , class F , typename std::enable_if< Dune::models< Imp::Concept::HasDynamicIndexAccess< I >, C >(), int >::type = 0>
auto Dune::Functions::hybridIndexAccess (C &&c, const I &i, F &&f) -> decltype(f(c[i]))
 Provide operator[] index-access for containers. More...
 
template<class C , class I , class F , typename std::enable_if< not Dune::models< Imp::Concept::HasDynamicIndexAccess< I >, C >(), int >::type = 0>
decltype(auto) Dune::Functions::hybridIndexAccess (C &&c, const I &i, F &&f)
 Provide operator[] index-access for containers. More...
 
template<class Result , class C , class MultiIndex >
Result Dune::Functions::hybridMultiIndexAccess (C &&c, const MultiIndex &index)
 Provide multi-index access by chaining operator[]. More...
 
template<class C , class MultiIndex , class IsFinal >
constexpr decltype(auto) Dune::Functions::resolveDynamicMultiIndex (C &&c, const MultiIndex &multiIndex, const IsFinal &isFinal)
 Provide multi-index access by chaining operator[]. More...
 
template<class C , class MultiIndex >
constexpr decltype(auto) Dune::Functions::resolveDynamicMultiIndex (C &&c, const MultiIndex &multiIndex)
 Provide multi-index access by chaining operator[]. More...
 
template<class C , class MultiIndex >
constexpr decltype(auto) Dune::Functions::resolveStaticMultiIndex (C &&c, const MultiIndex &multiIndex)
 Provide multi-index access by chaining operator[]. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,36 +5,63 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -Namespaces | Typedefs | Functions | Variables │ │ │ │ │ -referencehelper.hh File Reference │ │ │ │ │ +Namespaces | Functions │ │ │ │ │ +indexaccess.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ - Typedefs │ │ │ │ │ -template │ │ │ │ │ -using Dune::Functions::ResolveRef_t = Dune::ResolveRef_t< T > │ │ │ │ │ -  This is an alias for Dune::ResolveRef_t. More... │ │ │ │ │ -  │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ -decltype(auto) Dune::Functions::resolveRef (T &&t) │ │ │ │ │ -  This is an alias for Dune::resolveRef. More... │ │ │ │ │ -  │ │ │ │ │ - Variables │ │ │ │ │ -template │ │ │ │ │ -constexpr bool Dune::Functions::IsReferenceWrapper_v = Dune:: │ │ │ │ │ - IsReferenceWrapper_v │ │ │ │ │ -  This is an alias for Dune::IsReferenceWrapper_v. More... │ │ │ │ │ +template, C >(), int >::type = 0> │ │ │ │ │ + auto Dune::Functions::hybridIndexAccess (C &&c, const I │ │ │ │ │ + &i, F &&f) -> decltype(f(c[i])) │ │ │ │ │ +  Provide operator[] index-access for containers. │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ +template, C >(), int >::type = 0> │ │ │ │ │ + decltype(auto) Dune::Functions::hybridIndexAccess (C &&c, const I │ │ │ │ │ + &i, F &&f) │ │ │ │ │ +  Provide operator[] index-access for containers. │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + Result Dune::Functions::hybridMultiIndexAccess (C &&c, const │ │ │ │ │ + MultiIndex &index) │ │ │ │ │ +  Provide multi-index access by chaining operator[]. │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +constexpr decltype(auto) Dune::Functions::resolveDynamicMultiIndex (C &&c, │ │ │ │ │ + const MultiIndex &multiIndex, const IsFinal &isFinal) │ │ │ │ │ +  Provide multi-index access by chaining operator[]. │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +constexpr decltype(auto) Dune::Functions::resolveDynamicMultiIndex (C &&c, │ │ │ │ │ + const MultiIndex &multiIndex) │ │ │ │ │ +  Provide multi-index access by chaining operator[]. │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +constexpr decltype(auto) Dune::Functions::resolveStaticMultiIndex (C &&c, │ │ │ │ │ + const MultiIndex &multiIndex) │ │ │ │ │ +  Provide multi-index access by chaining operator[]. │ │ │ │ │ + More... │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00032_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: referencehelper.hh Source File │ │ │ │ +dune-functions: indexaccess.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,65 +62,313 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
referencehelper.hh
│ │ │ │ +
indexaccess.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#ifndef DUNE_FUNCTIONS_COMMON_REFERENCE_HELPER_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_COMMON_REFERENCE_HELPER_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_COMMON_INDEX_ACCESS_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_COMMON_INDEX_ACCESS_HH
│ │ │ │
5
│ │ │ │ -
6#warning The header dune/functions/common/referencehelper.hh is deprecated and will be removed after release 2.9. Include dune/common/referencehelper.hh instead.
│ │ │ │ -
7
│ │ │ │ +
6
│ │ │ │ +
7#include <utility>
│ │ │ │
8#include <type_traits>
│ │ │ │
9
│ │ │ │ -
10#include <dune/common/referencehelper.hh>
│ │ │ │ -
11
│ │ │ │ -
12
│ │ │ │ +
10#include <dune/common/typetraits.hh>
│ │ │ │ +
11#include <dune/common/concept.hh>
│ │ │ │ +
12#include <dune/common/hybridutilities.hh>
│ │ │ │
13
│ │ │ │ -
14
│ │ │ │ -
15namespace Dune {
│ │ │ │ -
16namespace Functions {
│ │ │ │ + │ │ │ │ +
15
│ │ │ │ +
16
│ │ │ │
17
│ │ │ │ -
18
│ │ │ │ -
23template<class T>
│ │ │ │ -
24[[deprecated("Use Dune::IsReferenceWrapper_v instead. Will be removed after release 2.9.")]]
│ │ │ │ -
25constexpr bool
│ │ │ │ -
26IsReferenceWrapper_v = Dune::IsReferenceWrapper_v<T>;
│ │ │ │ -
27
│ │ │ │ -
28
│ │ │ │ -
33template<class T>
│ │ │ │ -
34decltype(auto)
│ │ │ │ - │ │ │ │ -
36[[deprecated("Use Dune::resolveRef instead. Will be removed after release 2.9.")]]
│ │ │ │ -
37(T&& t)
│ │ │ │ -
38{
│ │ │ │ -
39 return Dune::resolveRef(std::forward<T>(t));
│ │ │ │ -
40}
│ │ │ │ -
41
│ │ │ │ -
46template<class T>
│ │ │ │ - │ │ │ │ -
48[[deprecated("Use Dune::ResolveRef_t instead. Will be removed after release 2.9.")]]
│ │ │ │ -
49 = Dune::ResolveRef_t<T>;
│ │ │ │ -
50
│ │ │ │ -
51
│ │ │ │ -
52}} // namespace Dune::Functions
│ │ │ │ -
53
│ │ │ │ -
54
│ │ │ │ -
55
│ │ │ │ -
56#endif // DUNE_FUNCTIONS_COMMON_REFERENCE_HELPER_HH
│ │ │ │ +
18namespace Dune {
│ │ │ │ +
19namespace Functions {
│ │ │ │ +
20
│ │ │ │ +
21
│ │ │ │ +
22namespace Imp {
│ │ │ │ +
23
│ │ │ │ +
24namespace Concept {
│ │ │ │ +
25
│ │ │ │ +
26template<class size_type>
│ │ │ │ +
27struct HasDynamicIndexAccess
│ │ │ │ +
28{
│ │ │ │ +
29 template<class C>
│ │ │ │ +
30 auto require(C&& c) -> decltype(
│ │ │ │ +
31 c[std::declval<size_type>()]
│ │ │ │ +
32 );
│ │ │ │ +
33};
│ │ │ │ +
34
│ │ │ │ +
35struct HasStaticIndexAccess
│ │ │ │ +
36{
│ │ │ │ +
37 template<class C>
│ │ │ │ +
38 auto require(C&& c) -> decltype(
│ │ │ │ +
39 c[Dune::Indices::_0]
│ │ │ │ +
40 );
│ │ │ │ +
41};
│ │ │ │ +
42
│ │ │ │ +
43} // namespace Concept
│ │ │ │ +
44
│ │ │ │ +
45} // namespace Imp
│ │ │ │ +
46
│ │ │ │ +
47
│ │ │ │ +
48
│ │ │ │ +
61template<class C, class I, class F,
│ │ │ │ +
62 typename std::enable_if< Dune::models<Imp::Concept::HasDynamicIndexAccess<I>, C>(), int>::type = 0>
│ │ │ │ +
63auto hybridIndexAccess(C&& c, const I& i, F&& f)
│ │ │ │ +
64 -> decltype(f(c[i]))
│ │ │ │ +
65{
│ │ │ │ +
66 return f(c[i]);
│ │ │ │ +
67}
│ │ │ │ +
68
│ │ │ │ +
86template<class C, class I, class F,
│ │ │ │ +
87 typename std::enable_if< not Dune::models<Imp::Concept::HasDynamicIndexAccess<I>, C>(), int>::type = 0>
│ │ │ │ +
88decltype(auto) hybridIndexAccess(C&& c, const I& i, F&& f)
│ │ │ │ +
89{
│ │ │ │ +
90 using Size = decltype(Hybrid::size(c));
│ │ │ │ +
91 return Hybrid::switchCases(std::make_index_sequence<Size::value>(), i,
│ │ │ │ +
92 [&](const auto& ii) -> decltype(auto){
│ │ │ │ +
93 return f(c[ii]);
│ │ │ │ +
94 }, [&]() -> decltype(auto){
│ │ │ │ +
95 return f(c[Dune::Indices::_0]);
│ │ │ │ +
96 });
│ │ │ │ +
97}
│ │ │ │ +
98
│ │ │ │ +
99
│ │ │ │ +
100namespace Imp {
│ │ │ │ +
101
│ │ │ │ +
115 template<class Index, std::size_t offset=1>
│ │ │ │ +
116 class ShiftedDynamicMultiIndex
│ │ │ │ +
117 {
│ │ │ │ +
118 public:
│ │ │ │ +
119 ShiftedDynamicMultiIndex(const Index& index) :
│ │ │ │ +
120 index_(index)
│ │ │ │ +
121 {}
│ │ │ │ +
122
│ │ │ │ +
123 std::size_t operator[](std::size_t position) const
│ │ │ │ +
124 {
│ │ │ │ +
125 if (position<size())
│ │ │ │ +
126 return index_[position+offset];
│ │ │ │ +
127 else
│ │ │ │ +
128 return 0;
│ │ │ │ +
129 }
│ │ │ │ +
130
│ │ │ │ +
134 ShiftedDynamicMultiIndex<Index, offset+1> pop() const
│ │ │ │ +
135 {
│ │ │ │ +
136 return {index_};
│ │ │ │ +
137 }
│ │ │ │ +
138
│ │ │ │ +
139 std::size_t size() const
│ │ │ │ +
140 {
│ │ │ │ +
141 if (offset < index_.size())
│ │ │ │ +
142 return index_.size() - offset;
│ │ │ │ +
143 else
│ │ │ │ +
144 return 0;
│ │ │ │ +
145 }
│ │ │ │ +
146
│ │ │ │ +
147 private:
│ │ │ │ +
148 const Index& index_;
│ │ │ │ +
149 };
│ │ │ │ +
150
│ │ │ │ +
151 template<class Index, std::size_t offset=1>
│ │ │ │ +
152 class ShiftedStaticMultiIndex
│ │ │ │ +
153 {
│ │ │ │ +
154 public:
│ │ │ │ +
155 ShiftedStaticMultiIndex(const Index& index) :
│ │ │ │ +
156 index_(index)
│ │ │ │ +
157 {}
│ │ │ │ +
158
│ │ │ │ +
159 template<std::size_t i>
│ │ │ │ +
160 auto operator[](Dune::index_constant<i>) const
│ │ │ │ +
161 {
│ │ │ │ +
162 if constexpr (i<size()) {
│ │ │ │ +
163 return index_[Dune::index_constant<i+offset>{}];
│ │ │ │ +
164 } else {
│ │ │ │ +
165 return Dune::index_constant<0>{};
│ │ │ │ +
166 }
│ │ │ │ +
167 }
│ │ │ │ +
168
│ │ │ │ +
172 ShiftedStaticMultiIndex<Index, offset+1> pop() const
│ │ │ │ +
173 {
│ │ │ │ +
174 return {index_};
│ │ │ │ +
175 }
│ │ │ │ +
176
│ │ │ │ +
177 static constexpr std::size_t size()
│ │ │ │ +
178 {
│ │ │ │ +
179 auto fullSize = decltype(Hybrid::size(std::declval<Index>()))::value;
│ │ │ │ +
180 if (offset < fullSize)
│ │ │ │ +
181 return fullSize - offset;
│ │ │ │ +
182 else
│ │ │ │ +
183 return 0;
│ │ │ │ +
184 }
│ │ │ │ +
185
│ │ │ │ +
186 private:
│ │ │ │ +
187 const Index& index_;
│ │ │ │ +
188 };
│ │ │ │ +
189
│ │ │ │ +
195 template<std::size_t offset, class Index>
│ │ │ │ +
196 ShiftedDynamicMultiIndex<Index, offset> shiftedDynamicMultiIndex(const Index& index)
│ │ │ │ +
197 {
│ │ │ │ +
198 return {index};
│ │ │ │ +
199 }
│ │ │ │ +
200
│ │ │ │ +
201 template<std::size_t offset, class Index>
│ │ │ │ +
202 ShiftedStaticMultiIndex<Index, offset> shiftedStaticMultiIndex(const Index& index)
│ │ │ │ +
203 {
│ │ │ │ +
204 return {index};
│ │ │ │ +
205 }
│ │ │ │ +
206
│ │ │ │ +
207} // namespace Imp
│ │ │ │ +
208
│ │ │ │ +
209
│ │ │ │ +
210
│ │ │ │ +
211
│ │ │ │ +
212namespace Imp {
│ │ │ │ +
213
│ │ │ │ +
214template<class Result, class Index>
│ │ │ │ +
215struct MultiIndexResolver
│ │ │ │ +
216{
│ │ │ │ +
217 MultiIndexResolver(const Index& index) :
│ │ │ │ +
218 index_(index)
│ │ │ │ +
219 {}
│ │ │ │ +
220
│ │ │ │ +
221 template<class C,
│ │ │ │ +
222 typename std::enable_if<not std::is_convertible<C&, Result>::value, int>::type = 0>
│ │ │ │ +
223 Result operator()(C&& c)
│ │ │ │ +
224 {
│ │ │ │ +
225 auto&& subIndex = Imp::shiftedDynamicMultiIndex<1>(index_);
│ │ │ │ +
226 auto&& subIndexResolver = MultiIndexResolver<Result, decltype(subIndex)>(subIndex);
│ │ │ │ +
227 return (Result)(hybridIndexAccess(c, index_[Dune::Indices::_0], subIndexResolver));
│ │ │ │ +
228 }
│ │ │ │ +
229
│ │ │ │ +
230 template<class C,
│ │ │ │ +
231 typename std::enable_if<std::is_convertible<C&, Result>::value, int>::type = 0>
│ │ │ │ +
232 Result operator()(C&& c)
│ │ │ │ +
233 {
│ │ │ │ +
234 return (Result)(std::forward<C>(c));
│ │ │ │ +
235 }
│ │ │ │ +
236
│ │ │ │ +
237 const Index& index_;
│ │ │ │ +
238};
│ │ │ │ +
239
│ │ │ │ +
240} // namespace Imp
│ │ │ │ +
241
│ │ │ │ +
242
│ │ │ │ +
243
│ │ │ │ +
262template<class Result, class C, class MultiIndex>
│ │ │ │ +
263Result hybridMultiIndexAccess(C&& c, const MultiIndex& index)
│ │ │ │ +
264{
│ │ │ │ +
265
│ │ │ │ +
266 Imp::MultiIndexResolver<Result, MultiIndex> multiIndexResolver(index);
│ │ │ │ +
267 return multiIndexResolver(c);
│ │ │ │ +
268}
│ │ │ │ +
269
│ │ │ │ +
270
│ │ │ │ +
271
│ │ │ │ +
272
│ │ │ │ +
273
│ │ │ │ +
274
│ │ │ │ +
275namespace Imp {
│ │ │ │ +
276
│ │ │ │ +
277 template<class C, class MultiIndex, class IsFinal>
│ │ │ │ +
278 constexpr decltype(auto) resolveDynamicMultiIndex(C&& c, const MultiIndex& multiIndex, const IsFinal& isFinal)
│ │ │ │ +
279 {
│ │ │ │ +
280 // If c is already considered final simply return it,
│ │ │ │ +
281 // else resolve the next multiIndex entry.
│ │ │ │ +
282 return Hybrid::ifElse(isFinal(c), [&, c = forwardCapture(std::forward<C>(c))](auto) -> decltype(auto) {
│ │ │ │ +
283 assert(multiIndex.size() == 0);
│ │ │ │ +
284 return c.forward();
│ │ │ │ +
285 }, [&](auto) -> decltype(auto) {
│ │ │ │ +
286 auto hasDynamicAccess = callableCheck([](auto&& cc) -> std::void_t<decltype(cc[0])> {});
│ │ │ │ +
287
│ │ │ │ +
288 // Split multiIndex into first entry and remaining ones.
│ │ │ │ +
289 auto i = multiIndex[0];
│ │ │ │ +
290 auto tail = multiIndex.pop();
│ │ │ │ +
291
│ │ │ │ +
292 // Resolve first multiIndex entry by c[multiIndex[0]] and
│ │ │ │ +
293 // continue resolving with the remaining remaining ones.
│ │ │ │ +
294 // If c has a dynamic operator[] this is straight forward.
│ │ │ │ +
295 // Else the dynamic multiIndex[0] has to be translated into
│ │ │ │ +
296 // a static one using hybridIndexAccess.
│ │ │ │ +
297 return Hybrid::ifElse(hasDynamicAccess(c), [&](auto id) -> decltype(auto) {
│ │ │ │ +
298 return Imp::resolveDynamicMultiIndex(id(c)[i], tail, isFinal);
│ │ │ │ +
299 }, [&](auto id) -> decltype(auto) {
│ │ │ │ +
300 // auto indexRange = range(Hybrid::size(id(c)));
│ │ │ │ +
301 auto indexRange = typename decltype(range(Hybrid::size(id(c))))::integer_sequence();
│ │ │ │ +
302 return Hybrid::switchCases(indexRange, i, [&](auto static_i) -> decltype(auto){
│ │ │ │ +
303 // Do rescursion with static version of i
│ │ │ │ +
304 return Imp::resolveDynamicMultiIndex(id(c)[static_i], tail, isFinal);
│ │ │ │ +
305 }, [&]() -> decltype(auto){
│ │ │ │ +
306 // As fallback we use c[0] this is needed, because there must be one branch that matches.
│ │ │ │ +
307 return Imp::resolveDynamicMultiIndex(id(c)[Dune::Indices::_0], tail, isFinal);
│ │ │ │ +
308 });
│ │ │ │ +
309 });
│ │ │ │ +
310 });
│ │ │ │ +
311 }
│ │ │ │ +
312
│ │ │ │ +
313 template<class C, class MultiIndex>
│ │ │ │ +
314 constexpr decltype(auto) resolveStaticMultiIndex(C&& c, const MultiIndex& multiIndex)
│ │ │ │ +
315 {
│ │ │ │ +
316 auto isExhausted = Hybrid::equals(Hybrid::size(multiIndex), Dune::Indices::_0);
│ │ │ │ +
317 return Hybrid::ifElse(isExhausted, [&, c = forwardCapture(std::forward<C>(c))](auto) -> decltype(auto) {
│ │ │ │ +
318 return c.forward();
│ │ │ │ +
319 }, [&](auto id) -> decltype(auto) {
│ │ │ │ +
320 auto head = multiIndex[Dune::Indices::_0];
│ │ │ │ +
321 auto tail = multiIndex.pop();
│ │ │ │ +
322
│ │ │ │ +
323 return Imp::resolveStaticMultiIndex(id(c)[head], tail);
│ │ │ │ +
324 });
│ │ │ │ +
325 }
│ │ │ │ +
326
│ │ │ │ +
327} // namespace Imp
│ │ │ │ +
328
│ │ │ │ +
329
│ │ │ │ +
330
│ │ │ │ +
353template<class C, class MultiIndex, class IsFinal>
│ │ │ │ +
354constexpr decltype(auto) resolveDynamicMultiIndex(C&& c, const MultiIndex& multiIndex, const IsFinal& isFinal)
│ │ │ │ +
355{
│ │ │ │ +
356 return Imp::resolveDynamicMultiIndex(std::forward<C>(c), Imp::shiftedDynamicMultiIndex<0>(multiIndex), isFinal);
│ │ │ │ +
357}
│ │ │ │ +
358
│ │ │ │ +
375template<class C, class MultiIndex>
│ │ │ │ +
376constexpr decltype(auto) resolveDynamicMultiIndex(C&& c, const MultiIndex& multiIndex)
│ │ │ │ +
377{
│ │ │ │ +
378 auto hasNoIndexAccess = negatePredicate(callableCheck([](auto&& cc) -> std::void_t<decltype(cc[Dune::Indices::_0])> {}));
│ │ │ │ +
379 return Imp::resolveDynamicMultiIndex(std::forward<C>(c), Imp::shiftedDynamicMultiIndex<0>(multiIndex), hasNoIndexAccess);
│ │ │ │ +
380}
│ │ │ │ +
381
│ │ │ │ +
397template<class C, class MultiIndex>
│ │ │ │ +
398constexpr decltype(auto) resolveStaticMultiIndex(C&& c, const MultiIndex& multiIndex)
│ │ │ │ +
399{
│ │ │ │ +
400 return Imp::resolveStaticMultiIndex(std::forward<C>(c), Imp::shiftedStaticMultiIndex<0>(multiIndex));
│ │ │ │ +
401}
│ │ │ │ +
402
│ │ │ │ +
403
│ │ │ │ +
404
│ │ │ │ +
405} // namespace Dune::Functions
│ │ │ │ +
406} // namespace Dune
│ │ │ │ +
407
│ │ │ │ +
408
│ │ │ │ +
409
│ │ │ │ +
410#endif // DUNE_FUNCTIONS_COMMON_INDEX_ACCESS_HH
│ │ │ │ + │ │ │ │ +
auto hybridIndexAccess(C &&c, const I &i, F &&f) -> decltype(f(c[i]))
Provide operator[] index-access for containers.
Definition: indexaccess.hh:63
│ │ │ │ +
constexpr decltype(auto) resolveStaticMultiIndex(C &&c, const MultiIndex &multiIndex)
Provide multi-index access by chaining operator[].
Definition: indexaccess.hh:398
│ │ │ │ +
auto callableCheck(Expression f)
Create a predicate for checking validity of expressions.
Definition: utility.hh:279
│ │ │ │ +
constexpr decltype(auto) resolveDynamicMultiIndex(C &&c, const MultiIndex &multiIndex)
Provide multi-index access by chaining operator[].
Definition: indexaccess.hh:376
│ │ │ │ +
constexpr decltype(auto) resolveDynamicMultiIndex(C &&c, const MultiIndex &multiIndex, const IsFinal &isFinal)
Provide multi-index access by chaining operator[].
Definition: indexaccess.hh:354
│ │ │ │ +
Result hybridMultiIndexAccess(C &&c, const MultiIndex &index)
Provide multi-index access by chaining operator[].
Definition: indexaccess.hh:263
│ │ │ │ +
auto negatePredicate(Check check)
Negate given predicate.
Definition: utility.hh:304
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
constexpr bool IsReferenceWrapper_v
This is an alias for Dune::IsReferenceWrapper_v.
Definition: referencehelper.hh:26
│ │ │ │ -
Dune::ResolveRef_t< T > ResolveRef_t
This is an alias for Dune::ResolveRef_t.
Definition: referencehelper.hh:49
│ │ │ │ -
decltype(auto) resolveRef(T &&t)
This is an alias for Dune::resolveRef.
Definition: referencehelper.hh:37
│ │ │ │ +
auto forwardCapture(T &&t)
Create a capture object for perfect forwarding.
Definition: utility.hh:372
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,75 +5,362 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -referencehelper.hh │ │ │ │ │ +indexaccess.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#ifndef DUNE_FUNCTIONS_COMMON_REFERENCE_HELPER_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_COMMON_REFERENCE_HELPER_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_COMMON_INDEX_ACCESS_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_COMMON_INDEX_ACCESS_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#warning The header dune/functions/common/referencehelper.hh is deprecated │ │ │ │ │ -and will be removed after release 2.9. Include dune/common/referencehelper.hh │ │ │ │ │ -instead. │ │ │ │ │ - 7 │ │ │ │ │ + 6 │ │ │ │ │ + 7#include │ │ │ │ │ 8#include │ │ │ │ │ 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11 │ │ │ │ │ - 12 │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ 13 │ │ │ │ │ - 14 │ │ │ │ │ - 15namespace Dune { │ │ │ │ │ - 16namespace Functions { │ │ │ │ │ + 14#include │ │ │ │ │ + 15 │ │ │ │ │ + 16 │ │ │ │ │ 17 │ │ │ │ │ - 18 │ │ │ │ │ - 23template │ │ │ │ │ - 24[[deprecated("Use Dune::IsReferenceWrapper_v instead. Will be removed after │ │ │ │ │ -release 2.9.")]] │ │ │ │ │ - 25constexpr bool │ │ │ │ │ -26IsReferenceWrapper_v = Dune::IsReferenceWrapper_v; │ │ │ │ │ - 27 │ │ │ │ │ - 28 │ │ │ │ │ - 33template │ │ │ │ │ - 34decltype(auto) │ │ │ │ │ -35resolveRef │ │ │ │ │ - 36[[deprecated("Use Dune::resolveRef instead. Will be removed after release │ │ │ │ │ -2.9.")]] │ │ │ │ │ - 37(T&& t) │ │ │ │ │ - 38{ │ │ │ │ │ - 39 return Dune::resolveRef(std::forward(t)); │ │ │ │ │ - 40} │ │ │ │ │ - 41 │ │ │ │ │ - 46template │ │ │ │ │ -47using ResolveRef_t │ │ │ │ │ - 48[[deprecated("Use Dune::ResolveRef_t instead. Will be removed after release │ │ │ │ │ -2.9.")]] │ │ │ │ │ - 49 = Dune::ResolveRef_t; │ │ │ │ │ - 50 │ │ │ │ │ - 51 │ │ │ │ │ - 52}} // namespace Dune::Functions │ │ │ │ │ - 53 │ │ │ │ │ - 54 │ │ │ │ │ - 55 │ │ │ │ │ - 56#endif // DUNE_FUNCTIONS_COMMON_REFERENCE_HELPER_HH │ │ │ │ │ + 18namespace Dune { │ │ │ │ │ + 19namespace Functions { │ │ │ │ │ + 20 │ │ │ │ │ + 21 │ │ │ │ │ + 22namespace Imp { │ │ │ │ │ + 23 │ │ │ │ │ + 24namespace Concept { │ │ │ │ │ + 25 │ │ │ │ │ + 26template │ │ │ │ │ + 27struct HasDynamicIndexAccess │ │ │ │ │ + 28{ │ │ │ │ │ + 29 template │ │ │ │ │ + 30 auto require(C&& c) -> decltype( │ │ │ │ │ + 31 c[std::declval()] │ │ │ │ │ + 32 ); │ │ │ │ │ + 33}; │ │ │ │ │ + 34 │ │ │ │ │ + 35struct HasStaticIndexAccess │ │ │ │ │ + 36{ │ │ │ │ │ + 37 template │ │ │ │ │ + 38 auto require(C&& c) -> decltype( │ │ │ │ │ + 39 c[Dune::Indices::_0] │ │ │ │ │ + 40 ); │ │ │ │ │ + 41}; │ │ │ │ │ + 42 │ │ │ │ │ + 43} // namespace Concept │ │ │ │ │ + 44 │ │ │ │ │ + 45} // namespace Imp │ │ │ │ │ + 46 │ │ │ │ │ + 47 │ │ │ │ │ + 48 │ │ │ │ │ + 61template, C>(), int>::type = 0> │ │ │ │ │ +63auto hybridIndexAccess(C&& c, const I& i, F&& f) │ │ │ │ │ + 64 -> decltype(f(c[i])) │ │ │ │ │ + 65{ │ │ │ │ │ + 66 return f(c[i]); │ │ │ │ │ + 67} │ │ │ │ │ + 68 │ │ │ │ │ + 86template, C>(), int>::type = 0> │ │ │ │ │ +88decltype(auto) hybridIndexAccess(C&& c, const I& i, F&& f) │ │ │ │ │ + 89{ │ │ │ │ │ + 90 using Size = decltype(Hybrid::size(c)); │ │ │ │ │ + 91 return Hybrid::switchCases(std::make_index_sequence(), i, │ │ │ │ │ + 92 [&](const auto& ii) -> decltype(auto){ │ │ │ │ │ + 93 return f(c[ii]); │ │ │ │ │ + 94 }, [&]() -> decltype(auto){ │ │ │ │ │ + 95 return f(c[Dune::Indices::_0]); │ │ │ │ │ + 96 }); │ │ │ │ │ + 97} │ │ │ │ │ + 98 │ │ │ │ │ + 99 │ │ │ │ │ + 100namespace Imp { │ │ │ │ │ + 101 │ │ │ │ │ + 115 template │ │ │ │ │ + 116 class ShiftedDynamicMultiIndex │ │ │ │ │ + 117 { │ │ │ │ │ + 118 public: │ │ │ │ │ + 119 ShiftedDynamicMultiIndex(const Index& index) : │ │ │ │ │ + 120 index_(index) │ │ │ │ │ + 121 {} │ │ │ │ │ + 122 │ │ │ │ │ + 123 std::size_t operator[](std::size_t position) const │ │ │ │ │ + 124 { │ │ │ │ │ + 125 if (position pop() const │ │ │ │ │ + 135 { │ │ │ │ │ + 136 return {index_}; │ │ │ │ │ + 137 } │ │ │ │ │ + 138 │ │ │ │ │ + 139 std::size_t size() const │ │ │ │ │ + 140 { │ │ │ │ │ + 141 if (offset < index_.size()) │ │ │ │ │ + 142 return index_.size() - offset; │ │ │ │ │ + 143 else │ │ │ │ │ + 144 return 0; │ │ │ │ │ + 145 } │ │ │ │ │ + 146 │ │ │ │ │ + 147 private: │ │ │ │ │ + 148 const Index& index_; │ │ │ │ │ + 149 }; │ │ │ │ │ + 150 │ │ │ │ │ + 151 template │ │ │ │ │ + 152 class ShiftedStaticMultiIndex │ │ │ │ │ + 153 { │ │ │ │ │ + 154 public: │ │ │ │ │ + 155 ShiftedStaticMultiIndex(const Index& index) : │ │ │ │ │ + 156 index_(index) │ │ │ │ │ + 157 {} │ │ │ │ │ + 158 │ │ │ │ │ + 159 template │ │ │ │ │ + 160 auto operator[](Dune::index_constant) const │ │ │ │ │ + 161 { │ │ │ │ │ + 162 if constexpr (i{}]; │ │ │ │ │ + 164 } else { │ │ │ │ │ + 165 return Dune::index_constant<0>{}; │ │ │ │ │ + 166 } │ │ │ │ │ + 167 } │ │ │ │ │ + 168 │ │ │ │ │ + 172 ShiftedStaticMultiIndex pop() const │ │ │ │ │ + 173 { │ │ │ │ │ + 174 return {index_}; │ │ │ │ │ + 175 } │ │ │ │ │ + 176 │ │ │ │ │ + 177 static constexpr std::size_t size() │ │ │ │ │ + 178 { │ │ │ │ │ + 179 auto fullSize = decltype(Hybrid::size(std::declval()))::value; │ │ │ │ │ + 180 if (offset < fullSize) │ │ │ │ │ + 181 return fullSize - offset; │ │ │ │ │ + 182 else │ │ │ │ │ + 183 return 0; │ │ │ │ │ + 184 } │ │ │ │ │ + 185 │ │ │ │ │ + 186 private: │ │ │ │ │ + 187 const Index& index_; │ │ │ │ │ + 188 }; │ │ │ │ │ + 189 │ │ │ │ │ + 195 template │ │ │ │ │ + 196 ShiftedDynamicMultiIndex shiftedDynamicMultiIndex(const │ │ │ │ │ +Index& index) │ │ │ │ │ + 197 { │ │ │ │ │ + 198 return {index}; │ │ │ │ │ + 199 } │ │ │ │ │ + 200 │ │ │ │ │ + 201 template │ │ │ │ │ + 202 ShiftedStaticMultiIndex shiftedStaticMultiIndex(const │ │ │ │ │ +Index& index) │ │ │ │ │ + 203 { │ │ │ │ │ + 204 return {index}; │ │ │ │ │ + 205 } │ │ │ │ │ + 206 │ │ │ │ │ + 207} // namespace Imp │ │ │ │ │ + 208 │ │ │ │ │ + 209 │ │ │ │ │ + 210 │ │ │ │ │ + 211 │ │ │ │ │ + 212namespace Imp { │ │ │ │ │ + 213 │ │ │ │ │ + 214template │ │ │ │ │ + 215struct MultiIndexResolver │ │ │ │ │ + 216{ │ │ │ │ │ + 217 MultiIndexResolver(const Index& index) : │ │ │ │ │ + 218 index_(index) │ │ │ │ │ + 219 {} │ │ │ │ │ + 220 │ │ │ │ │ + 221 template::value, int>:: │ │ │ │ │ +type = 0> │ │ │ │ │ + 223 Result operator()(C&& c) │ │ │ │ │ + 224 { │ │ │ │ │ + 225 auto&& subIndex = Imp::shiftedDynamicMultiIndex<1>(index_); │ │ │ │ │ + 226 auto&& subIndexResolver = MultiIndexResolver │ │ │ │ │ +(subIndex); │ │ │ │ │ + 227 return (Result)(hybridIndexAccess(c, index_[Dune::Indices::_0], │ │ │ │ │ +subIndexResolver)); │ │ │ │ │ + 228 } │ │ │ │ │ + 229 │ │ │ │ │ + 230 template::value, int>::type │ │ │ │ │ += 0> │ │ │ │ │ + 232 Result operator()(C&& c) │ │ │ │ │ + 233 { │ │ │ │ │ + 234 return (Result)(std::forward(c)); │ │ │ │ │ + 235 } │ │ │ │ │ + 236 │ │ │ │ │ + 237 const Index& index_; │ │ │ │ │ + 238}; │ │ │ │ │ + 239 │ │ │ │ │ + 240} // namespace Imp │ │ │ │ │ + 241 │ │ │ │ │ + 242 │ │ │ │ │ + 243 │ │ │ │ │ + 262template │ │ │ │ │ +263Result hybridMultiIndexAccess(C&& c, const MultiIndex& index) │ │ │ │ │ + 264{ │ │ │ │ │ + 265 │ │ │ │ │ + 266 Imp::MultiIndexResolver multiIndexResolver(index); │ │ │ │ │ + 267 return multiIndexResolver(c); │ │ │ │ │ + 268} │ │ │ │ │ + 269 │ │ │ │ │ + 270 │ │ │ │ │ + 271 │ │ │ │ │ + 272 │ │ │ │ │ + 273 │ │ │ │ │ + 274 │ │ │ │ │ + 275namespace Imp { │ │ │ │ │ + 276 │ │ │ │ │ + 277 template │ │ │ │ │ + 278 constexpr decltype(auto) resolveDynamicMultiIndex(C&& c, const MultiIndex& │ │ │ │ │ +multiIndex, const IsFinal& isFinal) │ │ │ │ │ + 279 { │ │ │ │ │ + 280 // If c is already considered final simply return it, │ │ │ │ │ + 281 // else resolve the next multiIndex entry. │ │ │ │ │ + 282 return Hybrid::ifElse(isFinal(c), [&, c = forwardCapture(std::forward │ │ │ │ │ +(c))](auto) -> decltype(auto) { │ │ │ │ │ + 283 assert(multiIndex.size() == 0); │ │ │ │ │ + 284 return c.forward(); │ │ │ │ │ + 285 }, [&](auto) -> decltype(auto) { │ │ │ │ │ + 286 auto hasDynamicAccess = callableCheck([](auto&& cc) -> std:: │ │ │ │ │ +void_t {}); │ │ │ │ │ + 287 │ │ │ │ │ + 288 // Split multiIndex into first entry and remaining ones. │ │ │ │ │ + 289 auto i = multiIndex[0]; │ │ │ │ │ + 290 auto tail = multiIndex.pop(); │ │ │ │ │ + 291 │ │ │ │ │ + 292 // Resolve first multiIndex entry by c[multiIndex[0]] and │ │ │ │ │ + 293 // continue resolving with the remaining remaining ones. │ │ │ │ │ + 294 // If c has a dynamic operator[] this is straight forward. │ │ │ │ │ + 295 // Else the dynamic multiIndex[0] has to be translated into │ │ │ │ │ + 296 // a static one using hybridIndexAccess. │ │ │ │ │ + 297 return Hybrid::ifElse(hasDynamicAccess(c), [&](auto id) -> decltype(auto) │ │ │ │ │ +{ │ │ │ │ │ + 298 return Imp::resolveDynamicMultiIndex(id(c)[i], tail, isFinal); │ │ │ │ │ + 299 }, [&](auto id) -> decltype(auto) { │ │ │ │ │ + 300 // auto indexRange = range(Hybrid::size(id(c))); │ │ │ │ │ + 301 auto indexRange = typename decltype(range(Hybrid::size(id(c)))):: │ │ │ │ │ +integer_sequence(); │ │ │ │ │ + 302 return Hybrid::switchCases(indexRange, i, [&](auto static_i) -> decltype │ │ │ │ │ +(auto){ │ │ │ │ │ + 303 // Do rescursion with static version of i │ │ │ │ │ + 304 return Imp::resolveDynamicMultiIndex(id(c)[static_i], tail, isFinal); │ │ │ │ │ + 305 }, [&]() -> decltype(auto){ │ │ │ │ │ + 306 // As fallback we use c[0] this is needed, because there must be one │ │ │ │ │ +branch that matches. │ │ │ │ │ + 307 return Imp::resolveDynamicMultiIndex(id(c)[Dune::Indices::_0], tail, │ │ │ │ │ +isFinal); │ │ │ │ │ + 308 }); │ │ │ │ │ + 309 }); │ │ │ │ │ + 310 }); │ │ │ │ │ + 311 } │ │ │ │ │ + 312 │ │ │ │ │ + 313 template │ │ │ │ │ + 314 constexpr decltype(auto) resolveStaticMultiIndex(C&& c, const MultiIndex& │ │ │ │ │ +multiIndex) │ │ │ │ │ + 315 { │ │ │ │ │ + 316 auto isExhausted = Hybrid::equals(Hybrid::size(multiIndex), Dune:: │ │ │ │ │ +Indices::_0); │ │ │ │ │ + 317 return Hybrid::ifElse(isExhausted, [&, c = forwardCapture(std::forward │ │ │ │ │ +(c))](auto) -> decltype(auto) { │ │ │ │ │ + 318 return c.forward(); │ │ │ │ │ + 319 }, [&](auto id) -> decltype(auto) { │ │ │ │ │ + 320 auto head = multiIndex[Dune::Indices::_0]; │ │ │ │ │ + 321 auto tail = multiIndex.pop(); │ │ │ │ │ + 322 │ │ │ │ │ + 323 return Imp::resolveStaticMultiIndex(id(c)[head], tail); │ │ │ │ │ + 324 }); │ │ │ │ │ + 325 } │ │ │ │ │ + 326 │ │ │ │ │ + 327} // namespace Imp │ │ │ │ │ + 328 │ │ │ │ │ + 329 │ │ │ │ │ + 330 │ │ │ │ │ + 353template │ │ │ │ │ +354constexpr decltype(auto) resolveDynamicMultiIndex(C&& c, const MultiIndex& │ │ │ │ │ +multiIndex, const IsFinal& isFinal) │ │ │ │ │ + 355{ │ │ │ │ │ + 356 return Imp::resolveDynamicMultiIndex(std::forward(c), Imp:: │ │ │ │ │ +shiftedDynamicMultiIndex<0>(multiIndex), isFinal); │ │ │ │ │ + 357} │ │ │ │ │ + 358 │ │ │ │ │ + 375template │ │ │ │ │ +376constexpr decltype(auto) resolveDynamicMultiIndex(C&& c, const MultiIndex& │ │ │ │ │ +multiIndex) │ │ │ │ │ + 377{ │ │ │ │ │ + 378 auto hasNoIndexAccess = negatePredicate(callableCheck([](auto&& cc) - │ │ │ │ │ +> std::void_t {})); │ │ │ │ │ + 379 return Imp::resolveDynamicMultiIndex(std::forward(c), Imp:: │ │ │ │ │ +shiftedDynamicMultiIndex<0>(multiIndex), hasNoIndexAccess); │ │ │ │ │ + 380} │ │ │ │ │ + 381 │ │ │ │ │ + 397template │ │ │ │ │ +398constexpr decltype(auto) resolveStaticMultiIndex(C&& c, const MultiIndex& │ │ │ │ │ +multiIndex) │ │ │ │ │ + 399{ │ │ │ │ │ + 400 return Imp::resolveStaticMultiIndex(std::forward(c), Imp:: │ │ │ │ │ +shiftedStaticMultiIndex<0>(multiIndex)); │ │ │ │ │ + 401} │ │ │ │ │ + 402 │ │ │ │ │ + 403 │ │ │ │ │ + 404 │ │ │ │ │ + 405} // namespace Dune::Functions │ │ │ │ │ + 406} // namespace Dune │ │ │ │ │ + 407 │ │ │ │ │ + 408 │ │ │ │ │ + 409 │ │ │ │ │ + 410#endif // DUNE_FUNCTIONS_COMMON_INDEX_ACCESS_HH │ │ │ │ │ +utility.hh │ │ │ │ │ +Dune::Functions::hybridIndexAccess │ │ │ │ │ +auto hybridIndexAccess(C &&c, const I &i, F &&f) -> decltype(f(c[i])) │ │ │ │ │ +Provide operator[] index-access for containers. │ │ │ │ │ +Definition: indexaccess.hh:63 │ │ │ │ │ +Dune::Functions::resolveStaticMultiIndex │ │ │ │ │ +constexpr decltype(auto) resolveStaticMultiIndex(C &&c, const MultiIndex │ │ │ │ │ +&multiIndex) │ │ │ │ │ +Provide multi-index access by chaining operator[]. │ │ │ │ │ +Definition: indexaccess.hh:398 │ │ │ │ │ +Dune::Functions::callableCheck │ │ │ │ │ +auto callableCheck(Expression f) │ │ │ │ │ +Create a predicate for checking validity of expressions. │ │ │ │ │ +Definition: utility.hh:279 │ │ │ │ │ +Dune::Functions::resolveDynamicMultiIndex │ │ │ │ │ +constexpr decltype(auto) resolveDynamicMultiIndex(C &&c, const MultiIndex │ │ │ │ │ +&multiIndex) │ │ │ │ │ +Provide multi-index access by chaining operator[]. │ │ │ │ │ +Definition: indexaccess.hh:376 │ │ │ │ │ +Dune::Functions::resolveDynamicMultiIndex │ │ │ │ │ +constexpr decltype(auto) resolveDynamicMultiIndex(C &&c, const MultiIndex │ │ │ │ │ +&multiIndex, const IsFinal &isFinal) │ │ │ │ │ +Provide multi-index access by chaining operator[]. │ │ │ │ │ +Definition: indexaccess.hh:354 │ │ │ │ │ +Dune::Functions::hybridMultiIndexAccess │ │ │ │ │ +Result hybridMultiIndexAccess(C &&c, const MultiIndex &index) │ │ │ │ │ +Provide multi-index access by chaining operator[]. │ │ │ │ │ +Definition: indexaccess.hh:263 │ │ │ │ │ +Dune::Functions::negatePredicate │ │ │ │ │ +auto negatePredicate(Check check) │ │ │ │ │ +Negate given predicate. │ │ │ │ │ +Definition: utility.hh:304 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::IsReferenceWrapper_v │ │ │ │ │ -constexpr bool IsReferenceWrapper_v │ │ │ │ │ -This is an alias for Dune::IsReferenceWrapper_v. │ │ │ │ │ -Definition: referencehelper.hh:26 │ │ │ │ │ -Dune::Functions::ResolveRef_t │ │ │ │ │ -Dune::ResolveRef_t< T > ResolveRef_t │ │ │ │ │ -This is an alias for Dune::ResolveRef_t. │ │ │ │ │ -Definition: referencehelper.hh:49 │ │ │ │ │ -Dune::Functions::resolveRef │ │ │ │ │ -decltype(auto) resolveRef(T &&t) │ │ │ │ │ -This is an alias for Dune::resolveRef. │ │ │ │ │ -Definition: referencehelper.hh:37 │ │ │ │ │ +Dune::Functions::forwardCapture │ │ │ │ │ +auto forwardCapture(T &&t) │ │ │ │ │ +Create a capture object for perfect forwarding. │ │ │ │ │ +Definition: utility.hh:372 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00035.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: polymorphicsmallobject.hh File Reference │ │ │ │ +dune-functions: defaultderivativetraits.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,26 +65,43 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
polymorphicsmallobject.hh File Reference
│ │ │ │ +
defaultderivativetraits.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <utility>
│ │ │ │ -#include <type_traits>
│ │ │ │ +
#include <type_traits>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <dune/common/fvector.hh>
│ │ │ │ +#include <dune/common/fmatrix.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::PolymorphicSmallObject< Base, bufferSize >
 A wrapper providing small object optimization with polymorphic types. More...
class  Dune::Functions::InvalidRange
 Dummy range class to be used if no proper type is available. More...
 
struct  Dune::Functions::DefaultDerivativeTraits< Signature >
 Default implementation for derivative traits. More...
 
struct  Dune::Functions::DefaultDerivativeTraits< double(double) >
 Default implementation for derivative traits. More...
 
struct  Dune::Functions::DefaultDerivativeTraits< K(FieldVector< K, n >)>
 Default implementation for derivative traits. More...
 
struct  Dune::Functions::DefaultDerivativeTraits< FieldVector< K, m >(FieldVector< K, n >)>
 Default implementation for derivative traits. More...
 
struct  Dune::Functions::DefaultDerivativeTraits< FieldMatrix< K, 1, m >(FieldVector< K, n >)>
 Default implementation for derivative traits. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -6,22 +6,40 @@ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ Classes | Namespaces │ │ │ │ │ -polymorphicsmallobject.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +defaultderivativetraits.hh File Reference │ │ │ │ │ #include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::PolymorphicSmallObject<_Base,_bufferSize_> │ │ │ │ │ -  A wrapper providing small object optimization with polymorphic types. │ │ │ │ │ - More... │ │ │ │ │ + class  Dune::Functions::InvalidRange │ │ │ │ │ +  Dummy range class to be used if no proper type is available. More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::DefaultDerivativeTraits<_Signature_> │ │ │ │ │ +  Default implementation for derivative traits. More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::DefaultDerivativeTraits<_double(double)_> │ │ │ │ │ +  Default implementation for derivative traits. More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::DefaultDerivativeTraits<_K(FieldVector<_K,_n_>)> │ │ │ │ │ +  Default implementation for derivative traits. More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::DefaultDerivativeTraits<_FieldVector<_K,_m_> │ │ │ │ │ + (FieldVector<_K,_n_>)> │ │ │ │ │ +  Default implementation for derivative traits. More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::DefaultDerivativeTraits<_FieldMatrix<_K,_1,_m_> │ │ │ │ │ + (FieldVector<_K,_n_>)> │ │ │ │ │ +  Default implementation for derivative traits. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00035_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: polymorphicsmallobject.hh Source File │ │ │ │ +dune-functions: defaultderivativetraits.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,164 +62,81 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
polymorphicsmallobject.hh
│ │ │ │ +
defaultderivativetraits.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#ifndef DUNE_FUNCTIONS_COMMON_POLYMORPHICSMALLOBJECT_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_COMMON_POLYMORPHICSMALLOBJECT_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_COMMON_DEFAULT_DERIVATIVE_TRAITS_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_COMMON_DEFAULT_DERIVATIVE_TRAITS_HH
│ │ │ │
5
│ │ │ │ -
6#include <utility>
│ │ │ │ -
7#include <type_traits>
│ │ │ │ +
6#include <type_traits>
│ │ │ │ +
7#include <utility>
│ │ │ │
8
│ │ │ │ -
9namespace Dune {
│ │ │ │ -
10namespace Functions {
│ │ │ │ +
9#include <dune/common/fvector.hh>
│ │ │ │ +
10#include <dune/common/fmatrix.hh>
│ │ │ │
11
│ │ │ │ -
12
│ │ │ │ -
43template<class Base, size_t bufferSize>
│ │ │ │ - │ │ │ │ -
45{
│ │ │ │ -
46public:
│ │ │ │ -
47
│ │ │ │ - │ │ │ │ -
50 p_(nullptr)
│ │ │ │ -
51 {}
│ │ │ │ -
52
│ │ │ │ -
59 template<class Derived,
│ │ │ │ -
60 typename std::enable_if<std::is_base_of<Base, std::remove_cv_t<
│ │ │ │ -
61 std::remove_reference_t<Derived>>>::value, int>::type = 0>
│ │ │ │ -
62 PolymorphicSmallObject(Derived&& derived)
│ │ │ │ -
63 {
│ │ │ │ -
64 constexpr bool useBuffer = sizeof(Derived) <= bufferSize;
│ │ │ │ -
65 if constexpr (useBuffer) {
│ │ │ │ -
66 p_ = new (&buffer_) Derived(std::forward<Derived>(derived));
│ │ │ │ -
67 } else {
│ │ │ │ -
68 p_ = new Derived(std::forward<Derived>(derived));
│ │ │ │ -
69 }
│ │ │ │ -
70 }
│ │ │ │ -
71
│ │ │ │ - │ │ │ │ -
74 {
│ │ │ │ -
75 moveToWrappedObject(std::move(other));
│ │ │ │ -
76 }
│ │ │ │ -
77
│ │ │ │ - │ │ │ │ -
80 {
│ │ │ │ -
81 copyToWrappedObject(other);
│ │ │ │ -
82 }
│ │ │ │ -
83
│ │ │ │ - │ │ │ │ -
86 {
│ │ │ │ -
87 destroyWrappedObject();
│ │ │ │ -
88 }
│ │ │ │ -
89
│ │ │ │ - │ │ │ │ -
92 {
│ │ │ │ -
93 if (&other!=this)
│ │ │ │ -
94 {
│ │ │ │ -
95 destroyWrappedObject();
│ │ │ │ -
96 copyToWrappedObject(other);
│ │ │ │ -
97 }
│ │ │ │ -
98 return *this;
│ │ │ │ -
99 }
│ │ │ │ -
100
│ │ │ │ - │ │ │ │ -
103 {
│ │ │ │ -
104 destroyWrappedObject();
│ │ │ │ -
105 moveToWrappedObject(std::move(other));
│ │ │ │ -
106 return *this;
│ │ │ │ -
107 }
│ │ │ │ +
12namespace Dune {
│ │ │ │ +
13namespace Functions {
│ │ │ │ +
14
│ │ │ │ +
15
│ │ │ │ +
16
│ │ │ │ + │ │ │ │ +
23{};
│ │ │ │ +
24
│ │ │ │ +
25
│ │ │ │ +
35template<class Signature>
│ │ │ │ + │ │ │ │ +
37{
│ │ │ │ + │ │ │ │ +
40};
│ │ │ │ +
41
│ │ │ │ +
42
│ │ │ │ +
50template<>
│ │ │ │ +
51struct DefaultDerivativeTraits< double(double) >
│ │ │ │ +
52{
│ │ │ │ +
54 typedef double Range;
│ │ │ │ +
55};
│ │ │ │ +
56
│ │ │ │ +
66template<typename K, int n>
│ │ │ │ +
67struct DefaultDerivativeTraits<K(FieldVector<K,n>)>
│ │ │ │ +
68{
│ │ │ │ +
70 typedef FieldVector<K,n> Range;
│ │ │ │ +
71};
│ │ │ │ +
72
│ │ │ │ +
82template<typename K, int n, int m>
│ │ │ │ +
83struct DefaultDerivativeTraits<FieldVector<K,m>(FieldVector<K,n>)>
│ │ │ │ +
84{
│ │ │ │ +
86 typedef FieldMatrix<K,m,n> Range;
│ │ │ │ +
87};
│ │ │ │ +
88
│ │ │ │ +
98template<typename K, int n, int m>
│ │ │ │ +
99struct DefaultDerivativeTraits<FieldMatrix<K,1,m>(FieldVector<K,n>)>
│ │ │ │ +
100{
│ │ │ │ +
102 typedef FieldMatrix<K,m,n> Range;
│ │ │ │ +
103};
│ │ │ │ +
104
│ │ │ │ +
105
│ │ │ │ +
106}} // namespace Dune::Functions
│ │ │ │ +
107
│ │ │ │
108
│ │ │ │ -
110 explicit operator bool() const
│ │ │ │ -
111 {
│ │ │ │ -
112 return p_;
│ │ │ │ -
113 }
│ │ │ │ -
114
│ │ │ │ -
116 bool bufferUsed() const
│ │ │ │ -
117 {
│ │ │ │ -
118 return ((void*) (p_) == (void*)(&buffer_));
│ │ │ │ -
119 }
│ │ │ │ -
120
│ │ │ │ -
122 const Base& get() const
│ │ │ │ -
123 {
│ │ │ │ -
124 return *p_;
│ │ │ │ -
125 }
│ │ │ │ -
126
│ │ │ │ -
128 Base& get()
│ │ │ │ -
129 {
│ │ │ │ -
130 return *p_;
│ │ │ │ -
131 }
│ │ │ │ -
132
│ │ │ │ -
133private:
│ │ │ │ -
134
│ │ │ │ -
135 void destroyWrappedObject() noexcept
│ │ │ │ -
136 {
│ │ │ │ -
137 if (operator bool())
│ │ │ │ -
138 {
│ │ │ │ -
139 if (bufferUsed())
│ │ │ │ -
140 p_->~Base();
│ │ │ │ -
141 else
│ │ │ │ -
142 delete p_;
│ │ │ │ -
143 }
│ │ │ │ -
144 }
│ │ │ │ -
145
│ │ │ │ -
146 void moveToWrappedObject(PolymorphicSmallObject&& other) noexcept
│ │ │ │ -
147 {
│ │ │ │ -
148 if (other.bufferUsed())
│ │ │ │ -
149 p_ = other.p_->move(&buffer_);
│ │ │ │ -
150 else
│ │ │ │ -
151 {
│ │ │ │ -
152 // We don't need to check for &other_!=this, because you can't
│ │ │ │ -
153 // have an rvalue to *this and call it's assignment/constructor
│ │ │ │ -
154 // at the same time. (Despite trying to shoot yourself in the foot
│ │ │ │ -
155 // with std::move explicitly.)
│ │ │ │ -
156
│ │ │ │ -
157 // Take ownership of allocated object
│ │ │ │ -
158 p_ = other.p_;
│ │ │ │ -
159
│ │ │ │ -
160 // Leave pointer in a clean state to avoid double freeing it.
│ │ │ │ -
161 other.p_ = 0;
│ │ │ │ -
162 }
│ │ │ │ -
163 }
│ │ │ │ -
164
│ │ │ │ -
165 void copyToWrappedObject(const PolymorphicSmallObject& other)
│ │ │ │ -
166 {
│ │ │ │ -
167 if (other.bufferUsed())
│ │ │ │ -
168 p_ = other.p_->clone(&buffer_);
│ │ │ │ -
169 else
│ │ │ │ -
170 p_ = other.p_->clone();
│ │ │ │ -
171 }
│ │ │ │ -
172
│ │ │ │ -
173 std::aligned_storage_t<bufferSize> buffer_;
│ │ │ │ -
174 Base* p_;
│ │ │ │ -
175};
│ │ │ │ -
176
│ │ │ │ -
177
│ │ │ │ -
178} // namespace Functions
│ │ │ │ -
179} // namespace Dune
│ │ │ │ -
180
│ │ │ │ -
181#endif // DUNE_FUNCTIONS_COMMON_POLYMORPHICSMALLOBJECT_HH
│ │ │ │ +
109#endif // DUNE_FUNCTIONS_COMMON_DEFAULT_DERIVATIVE_TRAITS_HH
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
A wrapper providing small object optimization with polymorphic types.
Definition: polymorphicsmallobject.hh:45
│ │ │ │ -
const Base & get() const
Obtain reference to stored object.
Definition: polymorphicsmallobject.hh:122
│ │ │ │ -
bool bufferUsed() const
Check if object is stored in internal stack buffer.
Definition: polymorphicsmallobject.hh:116
│ │ │ │ -
PolymorphicSmallObject(Derived &&derived)
Construct from object.
Definition: polymorphicsmallobject.hh:62
│ │ │ │ -
PolymorphicSmallObject(PolymorphicSmallObject &&other) noexcept
Move constructor from other PolymorphicSmallObject.
Definition: polymorphicsmallobject.hh:73
│ │ │ │ -
PolymorphicSmallObject & operator=(const PolymorphicSmallObject &other)
Copy assignment from other PolymorphicSmallObject.
Definition: polymorphicsmallobject.hh:91
│ │ │ │ -
PolymorphicSmallObject & operator=(PolymorphicSmallObject &&other) noexcept
Move assignment from other PolymorphicSmallObject.
Definition: polymorphicsmallobject.hh:102
│ │ │ │ -
PolymorphicSmallObject(const PolymorphicSmallObject &other)
Copy constructor from other PolymorphicSmallObject.
Definition: polymorphicsmallobject.hh:79
│ │ │ │ -
~PolymorphicSmallObject()
Destructor.
Definition: polymorphicsmallobject.hh:85
│ │ │ │ -
PolymorphicSmallObject()
Default constructor.
Definition: polymorphicsmallobject.hh:49
│ │ │ │ -
Base & get()
Obtain mutable reference to stored object.
Definition: polymorphicsmallobject.hh:128
│ │ │ │ +
Dummy range class to be used if no proper type is available.
Definition: defaultderivativetraits.hh:23
│ │ │ │ +
Default implementation for derivative traits.
Definition: defaultderivativetraits.hh:37
│ │ │ │ +
InvalidRange Range
Range of derivative for function with given signature.
Definition: defaultderivativetraits.hh:39
│ │ │ │ +
double Range
Range of derivative for function with given signature.
Definition: defaultderivativetraits.hh:54
│ │ │ │ +
FieldVector< K, n > Range
Range of derivative for function with given signature.
Definition: defaultderivativetraits.hh:70
│ │ │ │ +
FieldMatrix< K, m, n > Range
Range of derivative for function with given signature.
Definition: defaultderivativetraits.hh:86
│ │ │ │ +
FieldMatrix< K, m, n > Range
Range of derivative for function with given signature.
Definition: defaultderivativetraits.hh:102
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,192 +5,98 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -polymorphicsmallobject.hh │ │ │ │ │ +defaultderivativetraits.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#ifndef DUNE_FUNCTIONS_COMMON_POLYMORPHICSMALLOBJECT_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_COMMON_POLYMORPHICSMALLOBJECT_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_COMMON_DEFAULT_DERIVATIVE_TRAITS_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_COMMON_DEFAULT_DERIVATIVE_TRAITS_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ 8 │ │ │ │ │ - 9namespace Dune { │ │ │ │ │ - 10namespace Functions { │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ 11 │ │ │ │ │ - 12 │ │ │ │ │ - 43template │ │ │ │ │ -44class PolymorphicSmallObject │ │ │ │ │ - 45{ │ │ │ │ │ - 46public: │ │ │ │ │ - 47 │ │ │ │ │ -49 PolymorphicSmallObject() : │ │ │ │ │ - 50 p_(nullptr) │ │ │ │ │ - 51 {} │ │ │ │ │ - 52 │ │ │ │ │ - 59 template>>::value, int>::type = 0> │ │ │ │ │ -62 PolymorphicSmallObject(Derived&& derived) │ │ │ │ │ - 63 { │ │ │ │ │ - 64 constexpr bool useBuffer = sizeof(Derived) <= bufferSize; │ │ │ │ │ - 65 if constexpr (useBuffer) { │ │ │ │ │ - 66 p_ = new (&buffer_) Derived(std::forward(derived)); │ │ │ │ │ - 67 } else { │ │ │ │ │ - 68 p_ = new Derived(std::forward(derived)); │ │ │ │ │ - 69 } │ │ │ │ │ - 70 } │ │ │ │ │ - 71 │ │ │ │ │ -73 PolymorphicSmallObject(PolymorphicSmallObject&& other) noexcept │ │ │ │ │ - 74 { │ │ │ │ │ - 75 moveToWrappedObject(std::move(other)); │ │ │ │ │ - 76 } │ │ │ │ │ - 77 │ │ │ │ │ -79 PolymorphicSmallObject(const PolymorphicSmallObject& other) │ │ │ │ │ - 80 { │ │ │ │ │ - 81 copyToWrappedObject(other); │ │ │ │ │ - 82 } │ │ │ │ │ - 83 │ │ │ │ │ -85 ~PolymorphicSmallObject() │ │ │ │ │ - 86 { │ │ │ │ │ - 87 destroyWrappedObject(); │ │ │ │ │ - 88 } │ │ │ │ │ - 89 │ │ │ │ │ -91 PolymorphicSmallObject& operator=(const PolymorphicSmallObject& other) │ │ │ │ │ - 92 { │ │ │ │ │ - 93 if (&other!=this) │ │ │ │ │ - 94 { │ │ │ │ │ - 95 destroyWrappedObject(); │ │ │ │ │ - 96 copyToWrappedObject(other); │ │ │ │ │ - 97 } │ │ │ │ │ - 98 return *this; │ │ │ │ │ - 99 } │ │ │ │ │ - 100 │ │ │ │ │ -102 PolymorphicSmallObject& operator=(PolymorphicSmallObject&& other) noexcept │ │ │ │ │ - 103 { │ │ │ │ │ - 104 destroyWrappedObject(); │ │ │ │ │ - 105 moveToWrappedObject(std::move(other)); │ │ │ │ │ - 106 return *this; │ │ │ │ │ - 107 } │ │ │ │ │ + 12namespace Dune { │ │ │ │ │ + 13namespace Functions { │ │ │ │ │ + 14 │ │ │ │ │ + 15 │ │ │ │ │ + 16 │ │ │ │ │ +22class InvalidRange │ │ │ │ │ + 23{}; │ │ │ │ │ + 24 │ │ │ │ │ + 25 │ │ │ │ │ + 35template │ │ │ │ │ +36struct DefaultDerivativeTraits │ │ │ │ │ + 37{ │ │ │ │ │ +39 typedef InvalidRange Range; │ │ │ │ │ + 40}; │ │ │ │ │ + 41 │ │ │ │ │ + 42 │ │ │ │ │ + 50template<> │ │ │ │ │ +51struct DefaultDerivativeTraits< double(double) > │ │ │ │ │ + 52{ │ │ │ │ │ +54 typedef double Range; │ │ │ │ │ + 55}; │ │ │ │ │ + 56 │ │ │ │ │ + 66template │ │ │ │ │ +67struct DefaultDerivativeTraits)> │ │ │ │ │ + 68{ │ │ │ │ │ +70 typedef FieldVector Range; │ │ │ │ │ + 71}; │ │ │ │ │ + 72 │ │ │ │ │ + 82template │ │ │ │ │ +83struct DefaultDerivativeTraits(FieldVector)> │ │ │ │ │ + 84{ │ │ │ │ │ +86 typedef FieldMatrix Range; │ │ │ │ │ + 87}; │ │ │ │ │ + 88 │ │ │ │ │ + 98template │ │ │ │ │ +99struct DefaultDerivativeTraits(FieldVector)> │ │ │ │ │ + 100{ │ │ │ │ │ +102 typedef FieldMatrix Range; │ │ │ │ │ + 103}; │ │ │ │ │ + 104 │ │ │ │ │ + 105 │ │ │ │ │ + 106}} // namespace Dune::Functions │ │ │ │ │ + 107 │ │ │ │ │ 108 │ │ │ │ │ -110 explicit operator bool() const │ │ │ │ │ - 111 { │ │ │ │ │ - 112 return p_; │ │ │ │ │ - 113 } │ │ │ │ │ - 114 │ │ │ │ │ -116 bool bufferUsed() const │ │ │ │ │ - 117 { │ │ │ │ │ - 118 return ((void*) (p_) == (void*)(&buffer_)); │ │ │ │ │ - 119 } │ │ │ │ │ - 120 │ │ │ │ │ -122 const Base& get() const │ │ │ │ │ - 123 { │ │ │ │ │ - 124 return *p_; │ │ │ │ │ - 125 } │ │ │ │ │ - 126 │ │ │ │ │ -128 Base& get() │ │ │ │ │ - 129 { │ │ │ │ │ - 130 return *p_; │ │ │ │ │ - 131 } │ │ │ │ │ - 132 │ │ │ │ │ - 133private: │ │ │ │ │ - 134 │ │ │ │ │ - 135 void destroyWrappedObject() noexcept │ │ │ │ │ - 136 { │ │ │ │ │ - 137 if (operator bool()) │ │ │ │ │ - 138 { │ │ │ │ │ - 139 if (bufferUsed()) │ │ │ │ │ - 140 p_->~Base(); │ │ │ │ │ - 141 else │ │ │ │ │ - 142 delete p_; │ │ │ │ │ - 143 } │ │ │ │ │ - 144 } │ │ │ │ │ - 145 │ │ │ │ │ - 146 void moveToWrappedObject(PolymorphicSmallObject&& other) noexcept │ │ │ │ │ - 147 { │ │ │ │ │ - 148 if (other.bufferUsed()) │ │ │ │ │ - 149 p_ = other.p_->move(&buffer_); │ │ │ │ │ - 150 else │ │ │ │ │ - 151 { │ │ │ │ │ - 152 // We don't need to check for &other_!=this, because you can't │ │ │ │ │ - 153 // have an rvalue to *this and call it's assignment/constructor │ │ │ │ │ - 154 // at the same time. (Despite trying to shoot yourself in the foot │ │ │ │ │ - 155 // with std::move explicitly.) │ │ │ │ │ - 156 │ │ │ │ │ - 157 // Take ownership of allocated object │ │ │ │ │ - 158 p_ = other.p_; │ │ │ │ │ - 159 │ │ │ │ │ - 160 // Leave pointer in a clean state to avoid double freeing it. │ │ │ │ │ - 161 other.p_ = 0; │ │ │ │ │ - 162 } │ │ │ │ │ - 163 } │ │ │ │ │ - 164 │ │ │ │ │ - 165 void copyToWrappedObject(const PolymorphicSmallObject& other) │ │ │ │ │ - 166 { │ │ │ │ │ - 167 if (other.bufferUsed()) │ │ │ │ │ - 168 p_ = other.p_->clone(&buffer_); │ │ │ │ │ - 169 else │ │ │ │ │ - 170 p_ = other.p_->clone(); │ │ │ │ │ - 171 } │ │ │ │ │ - 172 │ │ │ │ │ - 173 std::aligned_storage_t buffer_; │ │ │ │ │ - 174 Base* p_; │ │ │ │ │ - 175}; │ │ │ │ │ - 176 │ │ │ │ │ - 177 │ │ │ │ │ - 178} // namespace Functions │ │ │ │ │ - 179} // namespace Dune │ │ │ │ │ - 180 │ │ │ │ │ - 181#endif // DUNE_FUNCTIONS_COMMON_POLYMORPHICSMALLOBJECT_HH │ │ │ │ │ + 109#endif // DUNE_FUNCTIONS_COMMON_DEFAULT_DERIVATIVE_TRAITS_HH │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::PolymorphicSmallObject │ │ │ │ │ -A wrapper providing small object optimization with polymorphic types. │ │ │ │ │ -Definition: polymorphicsmallobject.hh:45 │ │ │ │ │ -Dune::Functions::PolymorphicSmallObject::get │ │ │ │ │ -const Base & get() const │ │ │ │ │ -Obtain reference to stored object. │ │ │ │ │ -Definition: polymorphicsmallobject.hh:122 │ │ │ │ │ -Dune::Functions::PolymorphicSmallObject::bufferUsed │ │ │ │ │ -bool bufferUsed() const │ │ │ │ │ -Check if object is stored in internal stack buffer. │ │ │ │ │ -Definition: polymorphicsmallobject.hh:116 │ │ │ │ │ -Dune::Functions::PolymorphicSmallObject::PolymorphicSmallObject │ │ │ │ │ -PolymorphicSmallObject(Derived &&derived) │ │ │ │ │ -Construct from object. │ │ │ │ │ -Definition: polymorphicsmallobject.hh:62 │ │ │ │ │ -Dune::Functions::PolymorphicSmallObject::PolymorphicSmallObject │ │ │ │ │ -PolymorphicSmallObject(PolymorphicSmallObject &&other) noexcept │ │ │ │ │ -Move constructor from other PolymorphicSmallObject. │ │ │ │ │ -Definition: polymorphicsmallobject.hh:73 │ │ │ │ │ -Dune::Functions::PolymorphicSmallObject::operator= │ │ │ │ │ -PolymorphicSmallObject & operator=(const PolymorphicSmallObject &other) │ │ │ │ │ -Copy assignment from other PolymorphicSmallObject. │ │ │ │ │ -Definition: polymorphicsmallobject.hh:91 │ │ │ │ │ -Dune::Functions::PolymorphicSmallObject::operator= │ │ │ │ │ -PolymorphicSmallObject & operator=(PolymorphicSmallObject &&other) noexcept │ │ │ │ │ -Move assignment from other PolymorphicSmallObject. │ │ │ │ │ -Definition: polymorphicsmallobject.hh:102 │ │ │ │ │ -Dune::Functions::PolymorphicSmallObject::PolymorphicSmallObject │ │ │ │ │ -PolymorphicSmallObject(const PolymorphicSmallObject &other) │ │ │ │ │ -Copy constructor from other PolymorphicSmallObject. │ │ │ │ │ -Definition: polymorphicsmallobject.hh:79 │ │ │ │ │ -Dune::Functions::PolymorphicSmallObject::~PolymorphicSmallObject │ │ │ │ │ -~PolymorphicSmallObject() │ │ │ │ │ -Destructor. │ │ │ │ │ -Definition: polymorphicsmallobject.hh:85 │ │ │ │ │ -Dune::Functions::PolymorphicSmallObject::PolymorphicSmallObject │ │ │ │ │ -PolymorphicSmallObject() │ │ │ │ │ -Default constructor. │ │ │ │ │ -Definition: polymorphicsmallobject.hh:49 │ │ │ │ │ -Dune::Functions::PolymorphicSmallObject::get │ │ │ │ │ -Base & get() │ │ │ │ │ -Obtain mutable reference to stored object. │ │ │ │ │ -Definition: polymorphicsmallobject.hh:128 │ │ │ │ │ +Dune::Functions::InvalidRange │ │ │ │ │ +Dummy range class to be used if no proper type is available. │ │ │ │ │ +Definition: defaultderivativetraits.hh:23 │ │ │ │ │ +Dune::Functions::DefaultDerivativeTraits │ │ │ │ │ +Default implementation for derivative traits. │ │ │ │ │ +Definition: defaultderivativetraits.hh:37 │ │ │ │ │ +Dune::Functions::DefaultDerivativeTraits::Range │ │ │ │ │ +InvalidRange Range │ │ │ │ │ +Range of derivative for function with given signature. │ │ │ │ │ +Definition: defaultderivativetraits.hh:39 │ │ │ │ │ +Dune::Functions::DefaultDerivativeTraits<_double(double)_>::Range │ │ │ │ │ +double Range │ │ │ │ │ +Range of derivative for function with given signature. │ │ │ │ │ +Definition: defaultderivativetraits.hh:54 │ │ │ │ │ +Dune::Functions::DefaultDerivativeTraits<_K(FieldVector<_K,_n_>)>::Range │ │ │ │ │ +FieldVector< K, n > Range │ │ │ │ │ +Range of derivative for function with given signature. │ │ │ │ │ +Definition: defaultderivativetraits.hh:70 │ │ │ │ │ +Dune::Functions::DefaultDerivativeTraits<_FieldVector<_K,_m_>(FieldVector<_K,_n │ │ │ │ │ +>)>::Range │ │ │ │ │ +FieldMatrix< K, m, n > Range │ │ │ │ │ +Range of derivative for function with given signature. │ │ │ │ │ +Definition: defaultderivativetraits.hh:86 │ │ │ │ │ +Dune::Functions::DefaultDerivativeTraits<_FieldMatrix<_K,_1,_m_>(FieldVector< │ │ │ │ │ +K,_n_>)>::Range │ │ │ │ │ +FieldMatrix< K, m, n > Range │ │ │ │ │ +Range of derivative for function with given signature. │ │ │ │ │ +Definition: defaultderivativetraits.hh:102 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00038.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: overflowarray.hh File Reference │ │ │ │ +dune-functions: differentiablefunction.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,30 +65,34 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
overflowarray.hh File Reference
│ │ │ │ +
differentiablefunction.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <algorithm>
│ │ │ │ -#include <iostream>
│ │ │ │ -#include <cstddef>
│ │ │ │ -#include <array>
│ │ │ │ -#include <initializer_list>
│ │ │ │ -#include <dune/common/genericiterator.hh>
│ │ │ │ +
#include <type_traits>
│ │ │ │ +#include <dune/common/typeutilities.hh>
│ │ │ │ +#include <dune/functions/common/type_traits.hh>
│ │ │ │ +#include <dune/functions/common/defaultderivativetraits.hh>
│ │ │ │ +#include <dune/functions/common/differentiablefunction_imp.hh>
│ │ │ │ +#include <dune/functions/common/signature.hh>
│ │ │ │ +#include <dune/functions/common/typeerasure.hh>
│ │ │ │ +#include <dune/functions/common/functionconcepts.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Classes

class  Dune::Functions::OverflowArray< BA, maxSize >
 A dynamically sized array-like class with overflow. More...
class  Dune::Functions::DifferentiableFunction< Signature, DerivativeTraits, bufferSize >
 
class  Dune::Functions::DifferentiableFunction< Range(Domain), DerivativeTraits, bufferSize >
 Class storing differentiable functions using type erasure. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -6,25 +6,31 @@ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ Classes | Namespaces │ │ │ │ │ -overflowarray.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +differentiablefunction.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::OverflowArray<_BA,_maxSize_> │ │ │ │ │ -  A dynamically sized array-like class with overflow. More... │ │ │ │ │ +class  Dune::Functions::DifferentiableFunction<_Signature,_DerivativeTraits, │ │ │ │ │ + bufferSize_> │ │ │ │ │ +  │ │ │ │ │ +class  Dune::Functions::DifferentiableFunction<_Range(Domain), │ │ │ │ │ + DerivativeTraits,_bufferSize_> │ │ │ │ │ +  Class storing differentiable functions using type erasure. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00038_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: overflowarray.hh Source File │ │ │ │ +dune-functions: differentiablefunction.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,230 +62,128 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
overflowarray.hh
│ │ │ │ +
differentiablefunction.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#ifndef DUNE_FUNCTIONS_COMMON_OVERFLOWARRAY_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_COMMON_OVERFLOWARRAY_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH
│ │ │ │
5
│ │ │ │ -
6#include <algorithm>
│ │ │ │ -
7#include <iostream>
│ │ │ │ -
8#include <cstddef>
│ │ │ │ -
9#include <array>
│ │ │ │ -
10#include <initializer_list>
│ │ │ │ -
11
│ │ │ │ -
12#include <dune/common/genericiterator.hh>
│ │ │ │ -
13
│ │ │ │ -
14
│ │ │ │ -
15
│ │ │ │ -
16namespace Dune::Functions {
│ │ │ │ -
17
│ │ │ │ -
18
│ │ │ │ -
42template<class BA, std::size_t maxSize = std::tuple_size_v<BA>>
│ │ │ │ - │ │ │ │ -
44 public BA
│ │ │ │ -
45{
│ │ │ │ -
46 static constexpr std::size_t baseSize = std::tuple_size_v<BA>;
│ │ │ │ -
47
│ │ │ │ -
48public:
│ │ │ │ -
49 using BaseArray = BA;
│ │ │ │ -
50
│ │ │ │ -
51 using value_type = typename BaseArray::value_type;
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
55 using difference_type = std::ptrdiff_t;
│ │ │ │ -
56 using size_type = std::size_t;
│ │ │ │ -
57 using iterator = Dune::GenericIterator<OverflowArray, value_type>;
│ │ │ │ -
58 using const_iterator = Dune::GenericIterator<const OverflowArray, const value_type>;
│ │ │ │ -
59
│ │ │ │ -
60private:
│ │ │ │ -
61 using OverflowBuffer = std::array<value_type, maxSize-baseSize>;
│ │ │ │ -
62
│ │ │ │ -
63public:
│ │ │ │ +
6#include <type_traits>
│ │ │ │ +
7
│ │ │ │ +
8#include <dune/common/typeutilities.hh>
│ │ │ │ +
9
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
16
│ │ │ │ +
17namespace Dune {
│ │ │ │ +
18namespace Functions {
│ │ │ │ +
19
│ │ │ │ +
20
│ │ │ │ +
21
│ │ │ │ +
22/*
│ │ │ │ +
23 * Default implementation is empty
│ │ │ │ +
24 * The actual implementation is only given if Signature is an type
│ │ │ │ +
25 * describing a function signature as Range(Domain).
│ │ │ │ +
26 */
│ │ │ │ +
27template<class Signature, template<class> class DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56>
│ │ │ │ + │ │ │ │ +
29{};
│ │ │ │ +
30
│ │ │ │ +
31
│ │ │ │ +
32
│ │ │ │ +
33namespace Imp
│ │ │ │ +
34{
│ │ │ │ +
35
│ │ │ │ +
37 template<class S, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ +
38 struct DifferentiableFunctionTraits
│ │ │ │ +
39 {
│ │ │ │ +
41 using Signature = S;
│ │ │ │ +
42
│ │ │ │ +
44 using Range = typename SignatureTraits<Signature>::Range;
│ │ │ │ +
45
│ │ │ │ +
47 using Domain = typename SignatureTraits<Signature>::Domain;
│ │ │ │ +
48
│ │ │ │ +
50 using DerivativeSignature = typename SignatureTraits<Signature>::template DerivativeSignature<DerivativeTraits>;
│ │ │ │ +
51
│ │ │ │ + │ │ │ │ +
54
│ │ │ │ +
56 using Concept = DifferentiableFunctionWrapperInterface<Signature, DerivativeInterface>;
│ │ │ │ +
57
│ │ │ │ +
59 template<class B>
│ │ │ │ +
60 using Model = DifferentiableFunctionWrapperImplementation<Signature, DerivativeInterface, B>;
│ │ │ │ +
61 };
│ │ │ │ +
62}
│ │ │ │ +
63
│ │ │ │
64
│ │ │ │ -
65 OverflowArray() = default;
│ │ │ │ -
66
│ │ │ │ -
67 OverflowArray(const std::initializer_list<value_type>& l) {
│ │ │ │ -
68 assert(l.size() <= capacity());
│ │ │ │ -
69 size_ = l.size();
│ │ │ │ -
70 std::copy_n(l.begin(), size_, begin());
│ │ │ │ -
71 }
│ │ │ │ -
72
│ │ │ │ -
73 bool operator == (const OverflowArray& other) const {
│ │ │ │ -
74 if (size() != other.size())
│ │ │ │ -
75 return false;
│ │ │ │ -
76 for (size_type i=0; i<size(); ++i)
│ │ │ │ -
77 if ((*this)[i] != other[i])
│ │ │ │ -
78 return false;
│ │ │ │ -
79 return true;
│ │ │ │ -
80 }
│ │ │ │ -
81
│ │ │ │ -
83 void clear() {
│ │ │ │ -
84 size_ = 0;
│ │ │ │ -
85 }
│ │ │ │ -
86
│ │ │ │ -
93 void resize(size_type n) {
│ │ │ │ -
94 assert(n <= capacity());
│ │ │ │ -
95 size_ = n;
│ │ │ │ -
96 }
│ │ │ │ -
97
│ │ │ │ -
104 void push_back(const value_type& t) {
│ │ │ │ -
105 assert(size() < capacity());
│ │ │ │ -
106 (*this)[size_++] = t;
│ │ │ │ -
107 }
│ │ │ │ -
108
│ │ │ │ -
110 void pop_back() {
│ │ │ │ -
111 assert(size() > 0);
│ │ │ │ -
112 if (! empty())
│ │ │ │ -
113 size_--;
│ │ │ │ -
114 }
│ │ │ │ -
115
│ │ │ │ -
122 void push_front(const value_type& t) {
│ │ │ │ -
123 assert(size() < capacity());
│ │ │ │ -
124 for (size_type i=0; i<size(); i++)
│ │ │ │ -
125 (*this)[i+1] = (*this)[i];
│ │ │ │ -
126 (*this)[0] = t;
│ │ │ │ -
127 }
│ │ │ │ -
128
│ │ │ │ - │ │ │ │ -
131 return iterator(*this, 0);
│ │ │ │ -
132 }
│ │ │ │ -
133
│ │ │ │ - │ │ │ │ -
136 return const_iterator(*this, 0);
│ │ │ │ -
137 }
│ │ │ │ -
138
│ │ │ │ - │ │ │ │ -
141 return iterator(*this, size());
│ │ │ │ -
142 }
│ │ │ │ -
143
│ │ │ │ - │ │ │ │ -
146 return const_iterator(*this, size());
│ │ │ │ -
147 }
│ │ │ │ -
148
│ │ │ │ - │ │ │ │ -
151 assert(i < size());
│ │ │ │ -
152 // If there's no padding between the base class and the overflow_ member,
│ │ │ │ -
153 // the compiler should be able to optimize this to
│ │ │ │ -
154 // return *(&BaseArray::operator[](0) + i);
│ │ │ │ -
155 if (i<baseSize)
│ │ │ │ -
156 return BaseArray::operator[](i);
│ │ │ │ -
157 return overflow_[i-baseSize];
│ │ │ │ -
158 }
│ │ │ │ -
159
│ │ │ │ - │ │ │ │ -
162 assert(i < size());
│ │ │ │ -
163 // If there's no padding between the base class and the overflow_ member,
│ │ │ │ -
164 // the compiler should be able to optimize this to
│ │ │ │ -
165 // return *(&BaseArray::operator[](0) + i);
│ │ │ │ -
166 if (i<baseSize)
│ │ │ │ -
167 return BaseArray::operator[](i);
│ │ │ │ -
168 return overflow_[i-baseSize];
│ │ │ │ -
169 }
│ │ │ │ -
170
│ │ │ │ - │ │ │ │ -
173 assert(size() > 0);
│ │ │ │ -
174 return (*this)[0];
│ │ │ │ -
175 }
│ │ │ │ -
176
│ │ │ │ - │ │ │ │ -
179 assert(size() > 0);
│ │ │ │ -
180 return (*this)[0];
│ │ │ │ -
181 }
│ │ │ │ -
182
│ │ │ │ - │ │ │ │ -
185 assert(size() > 0);
│ │ │ │ -
186 return (*this)[size()-1];
│ │ │ │ -
187 }
│ │ │ │ -
188
│ │ │ │ - │ │ │ │ -
191 assert(size() > 0);
│ │ │ │ -
192 return (*this)[size()-1];
│ │ │ │ -
193 }
│ │ │ │ -
194
│ │ │ │ -
196 size_type size () const {
│ │ │ │ -
197 return size_;
│ │ │ │ -
198 }
│ │ │ │ -
199
│ │ │ │ -
201 bool empty() const {
│ │ │ │ -
202 return size() == 0;
│ │ │ │ -
203 }
│ │ │ │ -
204
│ │ │ │ -
206 static constexpr size_type capacity() {
│ │ │ │ -
207 return maxSize;
│ │ │ │ -
208 }
│ │ │ │ -
209
│ │ │ │ -
211 static constexpr size_type max_size() {
│ │ │ │ -
212 return maxSize;
│ │ │ │ -
213 }
│ │ │ │ -
214
│ │ │ │ -
216 inline friend std::size_t hash_value(const OverflowArray& v) noexcept {
│ │ │ │ -
217 return hash_range(v.begin(), v.end());
│ │ │ │ -
218 }
│ │ │ │ -
219
│ │ │ │ -
221 friend std::ostream& operator<< (std::ostream& s, const OverflowArray& c) {
│ │ │ │ -
222 for (const auto& ci : c)
│ │ │ │ -
223 s << ci << " ";
│ │ │ │ -
224 return s;
│ │ │ │ -
225 }
│ │ │ │ -
226
│ │ │ │ -
227private:
│ │ │ │ -
228 OverflowBuffer overflow_;
│ │ │ │ -
229 size_type size_ = 0;
│ │ │ │ -
230};
│ │ │ │ -
231
│ │ │ │ -
232
│ │ │ │ -
233
│ │ │ │ -
234} // namespace Dune::Functions
│ │ │ │ -
235
│ │ │ │ -
236
│ │ │ │ -
237
│ │ │ │ -
238#endif // DUNE_FUNCTIONS_COMMON_OVERFLOWARRAY_HH
│ │ │ │ -
Definition: polynomial.hh:11
│ │ │ │ -
A dynamically sized array-like class with overflow.
Definition: overflowarray.hh:45
│ │ │ │ -
const value_type & const_reference
Definition: overflowarray.hh:53
│ │ │ │ -
value_type & reference
Definition: overflowarray.hh:52
│ │ │ │ -
const_iterator end() const
Returns a const_iterator pointing to the end of the OverflowArray.
Definition: overflowarray.hh:145
│ │ │ │ -
bool operator==(const OverflowArray &other) const
Definition: overflowarray.hh:73
│ │ │ │ -
friend std::size_t hash_value(const OverflowArray &v) noexcept
Compute hash value.
Definition: overflowarray.hh:216
│ │ │ │ -
void push_back(const value_type &t)
Appends an element to the end of the OverflowArray,.
Definition: overflowarray.hh:104
│ │ │ │ -
friend std::ostream & operator<<(std::ostream &s, const OverflowArray &c)
Write container to an output stream.
Definition: overflowarray.hh:221
│ │ │ │ -
iterator begin()
Returns a iterator pointing to the beginning of the OverflowArray.
Definition: overflowarray.hh:130
│ │ │ │ -
bool empty() const
Returns true if OverflowArray has no elements.
Definition: overflowarray.hh:201
│ │ │ │ -
size_type size() const
Returns number of elements in the OverflowArray.
Definition: overflowarray.hh:196
│ │ │ │ -
typename BaseArray::value_type value_type
Definition: overflowarray.hh:51
│ │ │ │ -
void pop_back()
Erases the last element of the OverflowArray, O(1) time.
Definition: overflowarray.hh:110
│ │ │ │ -
Dune::GenericIterator< OverflowArray, value_type > iterator
Definition: overflowarray.hh:57
│ │ │ │ -
const_iterator begin() const
Returns a const_iterator pointing to the beginning of the OverflowArray.
Definition: overflowarray.hh:135
│ │ │ │ -
std::ptrdiff_t difference_type
Definition: overflowarray.hh:55
│ │ │ │ - │ │ │ │ -
BA BaseArray
Definition: overflowarray.hh:49
│ │ │ │ -
static constexpr size_type capacity()
Returns the capacity of the OverflowArray.
Definition: overflowarray.hh:206
│ │ │ │ -
static constexpr size_type max_size()
Returns the maximum length of the OverflowArray.
Definition: overflowarray.hh:211
│ │ │ │ -
const_reference front() const
Returns const reference to first element of OverflowArray.
Definition: overflowarray.hh:178
│ │ │ │ -
void clear()
Erases all elements.
Definition: overflowarray.hh:83
│ │ │ │ -
iterator end()
Returns an iterator pointing to the end of the OverflowArray.
Definition: overflowarray.hh:140
│ │ │ │ -
std::size_t size_type
Definition: overflowarray.hh:56
│ │ │ │ -
void resize(size_type n)
Specifies a new size for the OverflowArray.
Definition: overflowarray.hh:93
│ │ │ │ -
value_type * pointer
Definition: overflowarray.hh:54
│ │ │ │ -
Dune::GenericIterator< const OverflowArray, const value_type > const_iterator
Definition: overflowarray.hh:58
│ │ │ │ -
const_reference back() const
Returns const reference to last element of OverflowArray.
Definition: overflowarray.hh:190
│ │ │ │ -
OverflowArray(const std::initializer_list< value_type > &l)
Definition: overflowarray.hh:67
│ │ │ │ -
reference back()
Returns reference to last element of OverflowArray.
Definition: overflowarray.hh:184
│ │ │ │ -
void push_front(const value_type &t)
Inserts an element to the begin of the OverflowArray,.
Definition: overflowarray.hh:122
│ │ │ │ -
reference front()
Returns reference to first element of OverflowArray.
Definition: overflowarray.hh:172
│ │ │ │ -
reference operator[](size_type i)
Returns reference to the i'th element.
Definition: overflowarray.hh:150
│ │ │ │ +
65
│ │ │ │ +
80template<class Range, class Domain, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ +
81class DifferentiableFunction< Range(Domain), DerivativeTraits, bufferSize> :
│ │ │ │ +
82 public TypeErasureBase<
│ │ │ │ +
83 typename Imp::DifferentiableFunctionTraits<Range(Domain), DerivativeTraits, bufferSize>::Concept,
│ │ │ │ +
84 Imp::DifferentiableFunctionTraits<Range(Domain), DerivativeTraits, bufferSize>::template Model>
│ │ │ │ +
85{
│ │ │ │ +
86 using Traits = Imp::DifferentiableFunctionTraits<Range(Domain), DerivativeTraits, bufferSize>;
│ │ │ │ +
87
│ │ │ │ + │ │ │ │ +
89
│ │ │ │ +
90 using DerivativeInterface = typename Traits::DerivativeInterface;
│ │ │ │ +
91
│ │ │ │ +
92public:
│ │ │ │ +
93
│ │ │ │ +
105 template<class F, disableCopyMove<DifferentiableFunction, F> = 0 >
│ │ │ │ + │ │ │ │ +
107 Base(std::forward<F>(f))
│ │ │ │ +
108 {
│ │ │ │ +
109 static_assert(Dune::Functions::Concept::isFunction<F, Range(Domain)>(), "Trying to construct a DifferentiableFunction from type that does not model the Function concept");
│ │ │ │ +
110 }
│ │ │ │ +
111
│ │ │ │ + │ │ │ │ +
114
│ │ │ │ +
118 Range operator() (const Domain& x) const
│ │ │ │ +
119 {
│ │ │ │ +
120 return this->asInterface().operator()(x);
│ │ │ │ +
121 }
│ │ │ │ +
122
│ │ │ │ +
130 friend DerivativeInterface derivative(const DifferentiableFunction& t)
│ │ │ │ +
131 {
│ │ │ │ +
132 return t.asInterface().derivative();
│ │ │ │ +
133 }
│ │ │ │ +
134};
│ │ │ │ +
135
│ │ │ │ +
136
│ │ │ │ +
137
│ │ │ │ +
138}} // namespace Dune::Functions
│ │ │ │ +
139
│ │ │ │ +
140
│ │ │ │ +
141
│ │ │ │ +
142#endif // DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
friend DerivativeInterface derivative(const DifferentiableFunction &t)
Get derivative of wrapped function.
Definition: differentiablefunction.hh:130
│ │ │ │ +
Definition: polynomial.hh:10
│ │ │ │ +
Definition: differentiablefunction.hh:29
│ │ │ │ +
DifferentiableFunction(F &&f)
Construct from function.
Definition: differentiablefunction.hh:106
│ │ │ │ + │ │ │ │ +
Helper class to deduce the signature of a callable.
Definition: signature.hh:56
│ │ │ │ +
Base class for type-erased interface wrapper.
Definition: typeerasure.hh:165
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,312 +5,153 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -overflowarray.hh │ │ │ │ │ +differentiablefunction.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#ifndef DUNE_FUNCTIONS_COMMON_OVERFLOWARRAY_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_COMMON_OVERFLOWARRAY_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ - 8#include │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11 │ │ │ │ │ - 12#include │ │ │ │ │ - 13 │ │ │ │ │ - 14 │ │ │ │ │ - 15 │ │ │ │ │ - 16namespace Dune::Functions { │ │ │ │ │ - 17 │ │ │ │ │ - 18 │ │ │ │ │ - 42template> │ │ │ │ │ -43class OverflowArray : │ │ │ │ │ - 44 public BA │ │ │ │ │ - 45{ │ │ │ │ │ - 46 static constexpr std::size_t baseSize = std::tuple_size_v; │ │ │ │ │ - 47 │ │ │ │ │ - 48public: │ │ │ │ │ -49 using BaseArray = BA; │ │ │ │ │ - 50 │ │ │ │ │ -51 using value_type = typename BaseArray::value_type; │ │ │ │ │ -52 using reference = value_type&; │ │ │ │ │ -53 using const_reference = const value_type&; │ │ │ │ │ -54 using pointer = value_type*; │ │ │ │ │ -55 using difference_type = std::ptrdiff_t; │ │ │ │ │ -56 using size_type = std::size_t; │ │ │ │ │ -57 using iterator = Dune::GenericIterator; │ │ │ │ │ -58 using const_iterator = Dune::GenericIterator; │ │ │ │ │ - 59 │ │ │ │ │ - 60private: │ │ │ │ │ - 61 using OverflowBuffer = std::array; │ │ │ │ │ - 62 │ │ │ │ │ - 63public: │ │ │ │ │ + 6#include │ │ │ │ │ + 7 │ │ │ │ │ + 8#include │ │ │ │ │ + 9 │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14#include │ │ │ │ │ + 15#include │ │ │ │ │ + 16 │ │ │ │ │ + 17namespace Dune { │ │ │ │ │ + 18namespace Functions { │ │ │ │ │ + 19 │ │ │ │ │ + 20 │ │ │ │ │ + 21 │ │ │ │ │ + 22/* │ │ │ │ │ + 23 * Default implementation is empty │ │ │ │ │ + 24 * The actual implementation is only given if Signature is an type │ │ │ │ │ + 25 * describing a function signature as Range(Domain). │ │ │ │ │ + 26 */ │ │ │ │ │ + 27template class │ │ │ │ │ +DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56> │ │ │ │ │ +28class DifferentiableFunction │ │ │ │ │ + 29{}; │ │ │ │ │ + 30 │ │ │ │ │ + 31 │ │ │ │ │ + 32 │ │ │ │ │ + 33namespace Imp │ │ │ │ │ + 34{ │ │ │ │ │ + 35 │ │ │ │ │ + 37 template class DerivativeTraits, size_t │ │ │ │ │ +bufferSize> │ │ │ │ │ + 38 struct DifferentiableFunctionTraits │ │ │ │ │ + 39 { │ │ │ │ │ + 41 using Signature = S; │ │ │ │ │ + 42 │ │ │ │ │ + 44 using Range = typename SignatureTraits::Range; │ │ │ │ │ + 45 │ │ │ │ │ + 47 using Domain = typename SignatureTraits::Domain; │ │ │ │ │ + 48 │ │ │ │ │ + 50 using DerivativeSignature = typename SignatureTraits::template │ │ │ │ │ +DerivativeSignature; │ │ │ │ │ + 51 │ │ │ │ │ + 53 using DerivativeInterface = DifferentiableFunction; │ │ │ │ │ + 54 │ │ │ │ │ + 56 using Concept = DifferentiableFunctionWrapperInterface; │ │ │ │ │ + 57 │ │ │ │ │ + 59 template │ │ │ │ │ + 60 using Model = DifferentiableFunctionWrapperImplementation; │ │ │ │ │ + 61 }; │ │ │ │ │ + 62} │ │ │ │ │ + 63 │ │ │ │ │ 64 │ │ │ │ │ -65 OverflowArray() = default; │ │ │ │ │ - 66 │ │ │ │ │ -67 OverflowArray(const std::initializer_list& l) { │ │ │ │ │ - 68 assert(l.size() <= capacity()); │ │ │ │ │ - 69 size_ = l.size(); │ │ │ │ │ - 70 std::copy_n(l.begin(), size_, begin()); │ │ │ │ │ - 71 } │ │ │ │ │ - 72 │ │ │ │ │ -73 bool operator_==(const OverflowArray& other) const { │ │ │ │ │ - 74 if (size() != other.size()) │ │ │ │ │ - 75 return false; │ │ │ │ │ - 76 for (size_type i=0; i 0); │ │ │ │ │ - 112 if (! empty()) │ │ │ │ │ - 113 size_--; │ │ │ │ │ - 114 } │ │ │ │ │ - 115 │ │ │ │ │ -122 void push_front(const value_type& t) { │ │ │ │ │ - 123 assert(size() < capacity()); │ │ │ │ │ - 124 for (size_type i=0; i 0); │ │ │ │ │ - 174 return (*this)[0]; │ │ │ │ │ - 175 } │ │ │ │ │ - 176 │ │ │ │ │ -178 const_reference front() const { │ │ │ │ │ - 179 assert(size() > 0); │ │ │ │ │ - 180 return (*this)[0]; │ │ │ │ │ - 181 } │ │ │ │ │ - 182 │ │ │ │ │ -184 reference back() { │ │ │ │ │ - 185 assert(size() > 0); │ │ │ │ │ - 186 return (*this)[size()-1]; │ │ │ │ │ - 187 } │ │ │ │ │ - 188 │ │ │ │ │ -190 const_reference back() const { │ │ │ │ │ - 191 assert(size() > 0); │ │ │ │ │ - 192 return (*this)[size()-1]; │ │ │ │ │ - 193 } │ │ │ │ │ - 194 │ │ │ │ │ -196 size_type size () const { │ │ │ │ │ - 197 return size_; │ │ │ │ │ - 198 } │ │ │ │ │ - 199 │ │ │ │ │ -201 bool empty() const { │ │ │ │ │ - 202 return size() == 0; │ │ │ │ │ - 203 } │ │ │ │ │ - 204 │ │ │ │ │ -206 static constexpr size_type capacity() { │ │ │ │ │ - 207 return maxSize; │ │ │ │ │ - 208 } │ │ │ │ │ - 209 │ │ │ │ │ -211 static constexpr size_type max_size() { │ │ │ │ │ - 212 return maxSize; │ │ │ │ │ - 213 } │ │ │ │ │ - 214 │ │ │ │ │ -216 inline friend std::size_t hash_value(const OverflowArray& v) noexcept { │ │ │ │ │ - 217 return hash_range(v.begin(), v.end()); │ │ │ │ │ - 218 } │ │ │ │ │ - 219 │ │ │ │ │ -221 friend std::ostream& operator<<(std::ostream& s, const OverflowArray& c) { │ │ │ │ │ - 222 for (const auto& ci : c) │ │ │ │ │ - 223 s << ci << " "; │ │ │ │ │ - 224 return s; │ │ │ │ │ - 225 } │ │ │ │ │ - 226 │ │ │ │ │ - 227private: │ │ │ │ │ - 228 OverflowBuffer overflow_; │ │ │ │ │ - 229 size_type size_ = 0; │ │ │ │ │ - 230}; │ │ │ │ │ - 231 │ │ │ │ │ - 232 │ │ │ │ │ - 233 │ │ │ │ │ - 234} // namespace Dune::Functions │ │ │ │ │ - 235 │ │ │ │ │ - 236 │ │ │ │ │ - 237 │ │ │ │ │ - 238#endif // DUNE_FUNCTIONS_COMMON_OVERFLOWARRAY_HH │ │ │ │ │ -Dune::Functions │ │ │ │ │ -Definition: polynomial.hh:11 │ │ │ │ │ -Dune::Functions::OverflowArray │ │ │ │ │ -A dynamically sized array-like class with overflow. │ │ │ │ │ -Definition: overflowarray.hh:45 │ │ │ │ │ -Dune::Functions::OverflowArray::const_reference │ │ │ │ │ -const value_type & const_reference │ │ │ │ │ -Definition: overflowarray.hh:53 │ │ │ │ │ -Dune::Functions::OverflowArray::reference │ │ │ │ │ -value_type & reference │ │ │ │ │ -Definition: overflowarray.hh:52 │ │ │ │ │ -Dune::Functions::OverflowArray::end │ │ │ │ │ -const_iterator end() const │ │ │ │ │ -Returns a const_iterator pointing to the end of the OverflowArray. │ │ │ │ │ -Definition: overflowarray.hh:145 │ │ │ │ │ -Dune::Functions::OverflowArray::operator== │ │ │ │ │ -bool operator==(const OverflowArray &other) const │ │ │ │ │ -Definition: overflowarray.hh:73 │ │ │ │ │ -Dune::Functions::OverflowArray::hash_value │ │ │ │ │ -friend std::size_t hash_value(const OverflowArray &v) noexcept │ │ │ │ │ -Compute hash value. │ │ │ │ │ -Definition: overflowarray.hh:216 │ │ │ │ │ -Dune::Functions::OverflowArray::push_back │ │ │ │ │ -void push_back(const value_type &t) │ │ │ │ │ -Appends an element to the end of the OverflowArray,. │ │ │ │ │ -Definition: overflowarray.hh:104 │ │ │ │ │ -Dune::Functions::OverflowArray::operator<< │ │ │ │ │ -friend std::ostream & operator<<(std::ostream &s, const OverflowArray &c) │ │ │ │ │ -Write container to an output stream. │ │ │ │ │ -Definition: overflowarray.hh:221 │ │ │ │ │ -Dune::Functions::OverflowArray::begin │ │ │ │ │ -iterator begin() │ │ │ │ │ -Returns a iterator pointing to the beginning of the OverflowArray. │ │ │ │ │ -Definition: overflowarray.hh:130 │ │ │ │ │ -Dune::Functions::OverflowArray::empty │ │ │ │ │ -bool empty() const │ │ │ │ │ -Returns true if OverflowArray has no elements. │ │ │ │ │ -Definition: overflowarray.hh:201 │ │ │ │ │ -Dune::Functions::OverflowArray::size │ │ │ │ │ -size_type size() const │ │ │ │ │ -Returns number of elements in the OverflowArray. │ │ │ │ │ -Definition: overflowarray.hh:196 │ │ │ │ │ -Dune::Functions::OverflowArray::value_type │ │ │ │ │ -typename BaseArray::value_type value_type │ │ │ │ │ -Definition: overflowarray.hh:51 │ │ │ │ │ -Dune::Functions::OverflowArray::pop_back │ │ │ │ │ -void pop_back() │ │ │ │ │ -Erases the last element of the OverflowArray, O(1) time. │ │ │ │ │ -Definition: overflowarray.hh:110 │ │ │ │ │ -Dune::Functions::OverflowArray::iterator │ │ │ │ │ -Dune::GenericIterator< OverflowArray, value_type > iterator │ │ │ │ │ -Definition: overflowarray.hh:57 │ │ │ │ │ -Dune::Functions::OverflowArray::begin │ │ │ │ │ -const_iterator begin() const │ │ │ │ │ -Returns a const_iterator pointing to the beginning of the OverflowArray. │ │ │ │ │ -Definition: overflowarray.hh:135 │ │ │ │ │ -Dune::Functions::OverflowArray::difference_type │ │ │ │ │ -std::ptrdiff_t difference_type │ │ │ │ │ -Definition: overflowarray.hh:55 │ │ │ │ │ -Dune::Functions::OverflowArray::OverflowArray │ │ │ │ │ -OverflowArray()=default │ │ │ │ │ -Dune::Functions::OverflowArray::BaseArray │ │ │ │ │ -BA BaseArray │ │ │ │ │ -Definition: overflowarray.hh:49 │ │ │ │ │ -Dune::Functions::OverflowArray::capacity │ │ │ │ │ -static constexpr size_type capacity() │ │ │ │ │ -Returns the capacity of the OverflowArray. │ │ │ │ │ -Definition: overflowarray.hh:206 │ │ │ │ │ -Dune::Functions::OverflowArray::max_size │ │ │ │ │ -static constexpr size_type max_size() │ │ │ │ │ -Returns the maximum length of the OverflowArray. │ │ │ │ │ -Definition: overflowarray.hh:211 │ │ │ │ │ -Dune::Functions::OverflowArray::front │ │ │ │ │ -const_reference front() const │ │ │ │ │ -Returns const reference to first element of OverflowArray. │ │ │ │ │ -Definition: overflowarray.hh:178 │ │ │ │ │ -Dune::Functions::OverflowArray::clear │ │ │ │ │ -void clear() │ │ │ │ │ -Erases all elements. │ │ │ │ │ -Definition: overflowarray.hh:83 │ │ │ │ │ -Dune::Functions::OverflowArray::end │ │ │ │ │ -iterator end() │ │ │ │ │ -Returns an iterator pointing to the end of the OverflowArray. │ │ │ │ │ -Definition: overflowarray.hh:140 │ │ │ │ │ -Dune::Functions::OverflowArray::size_type │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Definition: overflowarray.hh:56 │ │ │ │ │ -Dune::Functions::OverflowArray::resize │ │ │ │ │ -void resize(size_type n) │ │ │ │ │ -Specifies a new size for the OverflowArray. │ │ │ │ │ -Definition: overflowarray.hh:93 │ │ │ │ │ -Dune::Functions::OverflowArray::pointer │ │ │ │ │ -value_type * pointer │ │ │ │ │ -Definition: overflowarray.hh:54 │ │ │ │ │ -Dune::Functions::OverflowArray::const_iterator │ │ │ │ │ -Dune::GenericIterator< const OverflowArray, const value_type > const_iterator │ │ │ │ │ -Definition: overflowarray.hh:58 │ │ │ │ │ -Dune::Functions::OverflowArray::back │ │ │ │ │ -const_reference back() const │ │ │ │ │ -Returns const reference to last element of OverflowArray. │ │ │ │ │ -Definition: overflowarray.hh:190 │ │ │ │ │ -Dune::Functions::OverflowArray::OverflowArray │ │ │ │ │ -OverflowArray(const std::initializer_list< value_type > &l) │ │ │ │ │ -Definition: overflowarray.hh:67 │ │ │ │ │ -Dune::Functions::OverflowArray::back │ │ │ │ │ -reference back() │ │ │ │ │ -Returns reference to last element of OverflowArray. │ │ │ │ │ -Definition: overflowarray.hh:184 │ │ │ │ │ -Dune::Functions::OverflowArray::push_front │ │ │ │ │ -void push_front(const value_type &t) │ │ │ │ │ -Inserts an element to the begin of the OverflowArray,. │ │ │ │ │ -Definition: overflowarray.hh:122 │ │ │ │ │ -Dune::Functions::OverflowArray::front │ │ │ │ │ -reference front() │ │ │ │ │ -Returns reference to first element of OverflowArray. │ │ │ │ │ -Definition: overflowarray.hh:172 │ │ │ │ │ -Dune::Functions::OverflowArray::operator[] │ │ │ │ │ -reference operator[](size_type i) │ │ │ │ │ -Returns reference to the i'th element. │ │ │ │ │ -Definition: overflowarray.hh:150 │ │ │ │ │ + 65 │ │ │ │ │ + 80template class DerivativeTraits, │ │ │ │ │ +size_t bufferSize> │ │ │ │ │ +81class DifferentiableFunction< Range(Domain), DerivativeTraits, bufferSize> : │ │ │ │ │ + 82 public TypeErasureBase< │ │ │ │ │ + 83 typename Imp::DifferentiableFunctionTraits::Concept, │ │ │ │ │ + 84 Imp::DifferentiableFunctionTraits::template Model> │ │ │ │ │ + 85{ │ │ │ │ │ + 86 using Traits = Imp::DifferentiableFunctionTraits; │ │ │ │ │ + 87 │ │ │ │ │ + 88 using Base = TypeErasureBase; │ │ │ │ │ + 89 │ │ │ │ │ + 90 using DerivativeInterface = typename Traits::DerivativeInterface; │ │ │ │ │ + 91 │ │ │ │ │ + 92public: │ │ │ │ │ + 93 │ │ │ │ │ + 105 template = 0 > │ │ │ │ │ +106 DifferentiableFunction(F&& f) : │ │ │ │ │ + 107 Base(std::forward(f)) │ │ │ │ │ + 108 { │ │ │ │ │ + 109 static_assert(Dune::Functions::Concept::isFunction(), │ │ │ │ │ +"Trying to construct a DifferentiableFunction from type that does not model the │ │ │ │ │ +Function concept"); │ │ │ │ │ + 110 } │ │ │ │ │ + 111 │ │ │ │ │ +113 DifferentiableFunction() = default; │ │ │ │ │ + 114 │ │ │ │ │ +118 Range operator() (const Domain& x) const │ │ │ │ │ + 119 { │ │ │ │ │ + 120 return this->asInterface().operator()(x); │ │ │ │ │ + 121 } │ │ │ │ │ + 122 │ │ │ │ │ +130 friend DerivativeInterface derivative(const DifferentiableFunction& t) │ │ │ │ │ + 131 { │ │ │ │ │ + 132 return t.asInterface().derivative(); │ │ │ │ │ + 133 } │ │ │ │ │ + 134}; │ │ │ │ │ + 135 │ │ │ │ │ + 136 │ │ │ │ │ + 137 │ │ │ │ │ + 138}} // namespace Dune::Functions │ │ │ │ │ + 139 │ │ │ │ │ + 140 │ │ │ │ │ + 141 │ │ │ │ │ + 142#endif // DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH │ │ │ │ │ +functionconcepts.hh │ │ │ │ │ +signature.hh │ │ │ │ │ +differentiablefunction_imp.hh │ │ │ │ │ +typeerasure.hh │ │ │ │ │ +defaultderivativetraits.hh │ │ │ │ │ +type_traits.hh │ │ │ │ │ +Dune::Functions::DifferentiableFunction<_Range(Domain),_DerivativeTraits, │ │ │ │ │ +bufferSize_>::derivative │ │ │ │ │ +friend DerivativeInterface derivative(const DifferentiableFunction &t) │ │ │ │ │ +Get derivative of wrapped function. │ │ │ │ │ +Definition: differentiablefunction.hh:130 │ │ │ │ │ +Dune │ │ │ │ │ +Definition: polynomial.hh:10 │ │ │ │ │ +Dune::Functions::DifferentiableFunction │ │ │ │ │ +Definition: differentiablefunction.hh:29 │ │ │ │ │ +Dune::Functions::DifferentiableFunction<_Range(Domain),_DerivativeTraits, │ │ │ │ │ +bufferSize_>::DifferentiableFunction │ │ │ │ │ +DifferentiableFunction(F &&f) │ │ │ │ │ +Construct from function. │ │ │ │ │ +Definition: differentiablefunction.hh:106 │ │ │ │ │ +Dune::Functions::DifferentiableFunction<_Range(Domain),_DerivativeTraits, │ │ │ │ │ +bufferSize_>::DifferentiableFunction │ │ │ │ │ +DifferentiableFunction()=default │ │ │ │ │ +Default constructor. │ │ │ │ │ +Dune::Functions::SignatureTraits │ │ │ │ │ +Helper class to deduce the signature of a callable. │ │ │ │ │ +Definition: signature.hh:56 │ │ │ │ │ +Dune::Functions::TypeErasureBase │ │ │ │ │ +Base class for type-erased interface wrapper. │ │ │ │ │ +Definition: typeerasure.hh:165 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00041.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: functionfromcallable.hh File Reference │ │ │ │ +dune-functions: treedata.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,26 +65,38 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
functionfromcallable.hh File Reference
│ │ │ │ +
treedata.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <dune/common/function.hh>
│ │ │ │ -#include <dune/functions/common/signature.hh>
│ │ │ │ +
#include <memory>
│ │ │ │ +#include <dune/common/shared_ptr.hh>
│ │ │ │ +#include <dune/typetree/pairtraversal.hh>
│ │ │ │ +#include <dune/functions/gridfunctions/gridviewentityset.hh>
│ │ │ │ +#include <dune/functions/gridfunctions/gridfunction.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Classes

class  Dune::Functions::FunctionFromCallable< Range(Domain), F, FunctionInterface >
 Wrap a callable object as Dune::Function or Dune::VirtualFunction. More...
struct  Dune::Functions::UniformNodeVisitor< SimpleNodeVisitorImp, leafOnly >
 Mixin for visitors that should apply the same action on all nodes. More...
 
class  Dune::Functions::TreeData< T, ND, LO >
 Container allowing to attach data to each node of a tree. More...
 
struct  Dune::Functions::TreeData< T, ND, LO >::InitVisitor
 
struct  Dune::Functions::TreeData< T, ND, LO >::DestroyVisitor
 
struct  Dune::Functions::TreeData< T, ND, LO >::CopyVisitor
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -6,23 +6,34 @@ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ Classes | Namespaces │ │ │ │ │ -functionfromcallable.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +treedata.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::FunctionFromCallable<_Range(Domain),_F, │ │ │ │ │ - FunctionInterface_> │ │ │ │ │ -  Wrap a callable object as Dune::Function or Dune::VirtualFunction. │ │ │ │ │ - More... │ │ │ │ │ +struct  Dune::Functions::UniformNodeVisitor<_SimpleNodeVisitorImp,_leafOnly_> │ │ │ │ │ +  Mixin for visitors that should apply the same action on all nodes. │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ + class  Dune::Functions::TreeData<_T,_ND,_LO_> │ │ │ │ │ +  Container allowing to attach data to each node of a tree. More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::TreeData<_T,_ND,_LO_>::InitVisitor │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::TreeData<_T,_ND,_LO_>::DestroyVisitor │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::TreeData<_T,_ND,_LO_>::CopyVisitor │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00041_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: functionfromcallable.hh Source File │ │ │ │ +dune-functions: treedata.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,73 +62,256 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
functionfromcallable.hh
│ │ │ │ +
treedata.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#ifndef DUNE_FUNCTIONS_COMMON_FUNCTION_FROM_CALLABLE_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_COMMON_FUNCTION_FROM_CALLABLE_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_COMMON_TREEDATA_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_COMMON_TREEDATA_HH
│ │ │ │
5
│ │ │ │ -
6#include <dune/common/function.hh>
│ │ │ │ -
7
│ │ │ │ - │ │ │ │ -
9
│ │ │ │ +
6
│ │ │ │ +
7#warning This file is deprecated. Please use TreeContainer from dune-typetree instead.
│ │ │ │ +
8
│ │ │ │ +
9#include <memory>
│ │ │ │
10
│ │ │ │ -
11namespace Dune {
│ │ │ │ -
12namespace Functions {
│ │ │ │ -
13
│ │ │ │ +
11#include <dune/common/shared_ptr.hh>
│ │ │ │ +
12
│ │ │ │ +
13#include <dune/typetree/pairtraversal.hh>
│ │ │ │
14
│ │ │ │ -
15
│ │ │ │ -
16template<class Signature, class F,
│ │ │ │ -
17 class FunctionInterface = typename Dune::VirtualFunction<
│ │ │ │ -
18 typename SignatureTraits<Signature>::RawDomain,
│ │ │ │ -
19 typename SignatureTraits<Signature>::RawRange> >
│ │ │ │ - │ │ │ │ -
21
│ │ │ │ -
37template<class Range, class Domain, class F, class FunctionInterface>
│ │ │ │ -
38class FunctionFromCallable<Range(Domain), F, FunctionInterface> :
│ │ │ │ -
39 public FunctionInterface
│ │ │ │ + │ │ │ │ + │ │ │ │ +
17
│ │ │ │ +
18namespace Dune {
│ │ │ │ +
19namespace Functions {
│ │ │ │ +
20
│ │ │ │ +
34template<class SimpleNodeVisitorImp, bool leafOnly>
│ │ │ │ +
35struct
│ │ │ │ +
36[[deprecated("This is an implementation detail of the deprecated class TreeDate and thus deprecated itself.")]]
│ │ │ │ + │ │ │ │ +
38 public TypeTree::TreeVisitor,
│ │ │ │ +
39 public TypeTree::DynamicTraversal
│ │ │ │
40{
│ │ │ │ -
41public:
│ │ │ │ -
42
│ │ │ │ - │ │ │ │ -
53 f_(f)
│ │ │ │ -
54 {}
│ │ │ │ +
41 // This is only enabled, if we want to incorporate inner nodes.
│ │ │ │ +
42 // Checking leafOnly would be sufficient, but for SFINAE the
│ │ │ │ +
43 // the enable_if condition must depend on the template parameter.
│ │ │ │ +
44 template<typename Node, typename TreePath,
│ │ │ │ +
45 typename std::enable_if<(not leafOnly) and (not Node::isLeaf), int>::type = 0>
│ │ │ │ +
46 void pre(Node& node, TreePath treePath)
│ │ │ │ +
47 {
│ │ │ │ +
48 static_cast<SimpleNodeVisitorImp*>(this)->apply(node, treePath);
│ │ │ │ +
49 }
│ │ │ │ +
50
│ │ │ │ +
51 template<typename Node, typename TreePath,
│ │ │ │ +
52 typename std::enable_if<(leafOnly) and (not Node::isLeaf), int>::type = 0>
│ │ │ │ +
53 void pre(Node& node, TreePath treePath)
│ │ │ │ +
54 {}
│ │ │ │
55
│ │ │ │ - │ │ │ │ -
65 f_(f)
│ │ │ │ -
66 {}
│ │ │ │ -
67
│ │ │ │ -
73 void evaluate(const Domain& x, Range&y) const
│ │ │ │ -
74 {
│ │ │ │ -
75 y = f_(x);
│ │ │ │ -
76 }
│ │ │ │ -
77
│ │ │ │ -
78private:
│ │ │ │ -
79 F f_;
│ │ │ │ -
80};
│ │ │ │ -
81
│ │ │ │ -
82
│ │ │ │ -
83
│ │ │ │ -
84} // namespace Functions
│ │ │ │ -
85} // namespace Dune
│ │ │ │ -
86
│ │ │ │ -
87#endif //DUNE_FUNCTIONS_COMMON_FUNCTION_FROM_CALLABLE_HH
│ │ │ │ - │ │ │ │ +
56 template<typename Node, typename TreePath>
│ │ │ │ +
57 void leaf(Node& node, TreePath treePath)
│ │ │ │ +
58 {
│ │ │ │ +
59 static_cast<SimpleNodeVisitorImp*>(this)->apply(node, treePath);
│ │ │ │ +
60 }
│ │ │ │ +
61};
│ │ │ │ +
62
│ │ │ │ +
63
│ │ │ │ +
64
│ │ │ │ +
91template<class T, template<class> class ND, bool LO>
│ │ │ │ +
92class
│ │ │ │ +
93[[deprecated("This class is deprecated. Please use TreeContainer from dune-typetree instead.")]]
│ │ │ │ + │ │ │ │ +
95{
│ │ │ │ +
96
│ │ │ │ +
97public:
│ │ │ │ +
98
│ │ │ │ +
100 using Tree = T;
│ │ │ │ +
101
│ │ │ │ +
103 using size_type = typename Tree::size_type;
│ │ │ │ +
104
│ │ │ │ +
106 static const bool leafOnly = LO;
│ │ │ │ +
107
│ │ │ │ +
109 template<class Node>
│ │ │ │ +
110 using NodeData = ND<Node>;
│ │ │ │ +
111
│ │ │ │ +
112protected:
│ │ │ │ +
113 using RawContainer = std::vector<void*>;
│ │ │ │ +
114
│ │ │ │ +
115
│ │ │ │ +
116 // Since we can generate the node data type only if
│ │ │ │ +
117 // we know the type of the node, we have to do
│ │ │ │ +
118 // initialization, copy, and destruction via a
│ │ │ │ +
119 // tree traversal. Once we can use C++14 this can
│ │ │ │ +
120 // be written in a much easier and more selfcontained
│ │ │ │ +
121 // ways using generic lambda functions.
│ │ │ │ +
122 // Until then we need explicit visitor classes for
│ │ │ │ +
123 // each operation.
│ │ │ │ +
124
│ │ │ │ +
125 struct InitVisitor :
│ │ │ │ +
126 public UniformNodeVisitor<InitVisitor, leafOnly>
│ │ │ │ +
127 {
│ │ │ │ + │ │ │ │ +
129 data_(data)
│ │ │ │ +
130 {}
│ │ │ │ +
131
│ │ │ │ +
132 template<typename Node, typename TreePath>
│ │ │ │ +
133 void apply(Node& node, TreePath treePath)
│ │ │ │ +
134 {
│ │ │ │ +
135 auto&& index = node.treeIndex();
│ │ │ │ +
136 if (data_.size() < index+1)
│ │ │ │ +
137 data_.resize(index+1, nullptr);
│ │ │ │ +
138 data_[index] = new NodeData<Node>;
│ │ │ │ +
139 }
│ │ │ │ +
140
│ │ │ │ +
141
│ │ │ │ + │ │ │ │ +
143 };
│ │ │ │ +
144
│ │ │ │ + │ │ │ │ +
146 public UniformNodeVisitor<DestroyVisitor, leafOnly>
│ │ │ │ +
147 {
│ │ │ │ + │ │ │ │ +
149 data_(data)
│ │ │ │ +
150 {}
│ │ │ │ +
151
│ │ │ │ +
152 template<typename Node, typename TreePath>
│ │ │ │ +
153 void apply(Node& node, TreePath treePath)
│ │ │ │ +
154 {
│ │ │ │ +
155 auto&& index = node.treeIndex();
│ │ │ │ +
156 auto p = (NodeData<Node>*)(data_[index]);
│ │ │ │ +
157 delete p;
│ │ │ │ +
158 data_[index] = nullptr;
│ │ │ │ +
159 }
│ │ │ │ +
160
│ │ │ │ + │ │ │ │ +
162 };
│ │ │ │ +
163
│ │ │ │ +
164 struct CopyVisitor :
│ │ │ │ +
165 public UniformNodeVisitor<CopyVisitor, leafOnly>
│ │ │ │ +
166 {
│ │ │ │ +
167 CopyVisitor(TreeData& thisTD, const TreeData& otherTD) :
│ │ │ │ +
168 thisTD_(thisTD),
│ │ │ │ +
169 otherTD_(otherTD)
│ │ │ │ +
170 {}
│ │ │ │ +
171
│ │ │ │ +
172 template<typename Node, typename TreePath>
│ │ │ │ +
173 void apply(Node& node, TreePath treePath)
│ │ │ │ +
174 {
│ │ │ │ +
175 thisTD_[node] = otherTD_[node];
│ │ │ │ +
176 }
│ │ │ │ +
177
│ │ │ │ + │ │ │ │ + │ │ │ │ +
180 };
│ │ │ │ +
181
│ │ │ │ +
182public:
│ │ │ │ +
183
│ │ │ │ + │ │ │ │ +
186 tree_(nullptr)
│ │ │ │ +
187 {}
│ │ │ │ +
188
│ │ │ │ +
196 void init(const Tree& tree)
│ │ │ │ +
197 {
│ │ │ │ +
198 if (tree_)
│ │ │ │ +
199 destroy();
│ │ │ │ +
200 tree_ = &tree;
│ │ │ │ +
201 TypeTree::applyToTree(*tree_, InitVisitor(data_));
│ │ │ │ +
202 }
│ │ │ │ +
203
│ │ │ │ +
205 TreeData(const TreeData& other) :
│ │ │ │ +
206 tree_(other.tree_)
│ │ │ │ +
207 {
│ │ │ │ +
208 TypeTree::applyToTree(*tree_, InitVisitor(data_));
│ │ │ │ +
209 TypeTree::applyToTree(*tree_, CopyVisitor(*this, other));
│ │ │ │ +
210 }
│ │ │ │ +
211
│ │ │ │ + │ │ │ │ +
214 {
│ │ │ │ +
215 if (tree_)
│ │ │ │ +
216 TypeTree::applyToTree(*tree_, DestroyVisitor(data_));
│ │ │ │ +
217 tree_ = other.tree_;
│ │ │ │ +
218 TypeTree::applyToTree(*tree_, CopyVisitor(*this, other));
│ │ │ │ +
219 return *this;
│ │ │ │ +
220 }
│ │ │ │ +
221
│ │ │ │ +
223 void destroy()
│ │ │ │ +
224 {
│ │ │ │ +
225 if (tree_)
│ │ │ │ +
226 TypeTree::applyToTree(*tree_, DestroyVisitor(data_));
│ │ │ │ +
227 tree_ = nullptr;
│ │ │ │ +
228 }
│ │ │ │ +
229
│ │ │ │ + │ │ │ │ +
232 {
│ │ │ │ +
233 if (tree_)
│ │ │ │ +
234 TypeTree::applyToTree(*tree_, DestroyVisitor(data_));
│ │ │ │ +
235 }
│ │ │ │ +
236
│ │ │ │ +
238 template<class Node>
│ │ │ │ +
239 NodeData<Node>& operator[](const Node& node)
│ │ │ │ +
240 {
│ │ │ │ +
241 return *(NodeData<Node>*)(data_[node.treeIndex()]);
│ │ │ │ +
242 }
│ │ │ │ +
243
│ │ │ │ +
245 template<class Node>
│ │ │ │ +
246 const NodeData<Node>& operator[](const Node& node) const
│ │ │ │ +
247 {
│ │ │ │ +
248 return *(NodeData<Node>*)(data_[node.treeIndex()]);
│ │ │ │ +
249 }
│ │ │ │ +
250
│ │ │ │ +
251protected:
│ │ │ │ +
252
│ │ │ │ +
253 const Tree* tree_;
│ │ │ │ + │ │ │ │ +
255};
│ │ │ │ +
256
│ │ │ │ +
257
│ │ │ │ +
258
│ │ │ │ +
259} // namespace Functions
│ │ │ │ +
260} // namespace Dune
│ │ │ │ +
261
│ │ │ │ +
262#endif // DUNE_FUNCTIONS_COMMON_TREEDATA_HH
│ │ │ │ + │ │ │ │ + │ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
Definition: functionfromcallable.hh:20
│ │ │ │ -
FunctionFromCallable(F &&f)
Create VirtualFunction from callable object.
Definition: functionfromcallable.hh:52
│ │ │ │ -
void evaluate(const Domain &x, Range &y) const
Evaluate function.
Definition: functionfromcallable.hh:73
│ │ │ │ -
FunctionFromCallable(const F &f)
Create VirtualFunction from callable object.
Definition: functionfromcallable.hh:64
│ │ │ │ +
Mixin for visitors that should apply the same action on all nodes.
Definition: treedata.hh:40
│ │ │ │ +
void pre(Node &node, TreePath treePath)
Definition: treedata.hh:46
│ │ │ │ +
void leaf(Node &node, TreePath treePath)
Definition: treedata.hh:57
│ │ │ │ +
Container allowing to attach data to each node of a tree.
Definition: treedata.hh:95
│ │ │ │ +
TreeData(const TreeData &other)
Copy constructor.
Definition: treedata.hh:205
│ │ │ │ +
void init(const Tree &tree)
Initialize from tree.
Definition: treedata.hh:196
│ │ │ │ +
T Tree
Type of tree the data is associated with.
Definition: treedata.hh:100
│ │ │ │ +
const Tree * tree_
Definition: treedata.hh:253
│ │ │ │ +
void destroy()
Destroy data.
Definition: treedata.hh:223
│ │ │ │ +
const NodeData< Node > & operator[](const Node &node) const
Get reference to data associated to given node.
Definition: treedata.hh:246
│ │ │ │ +
TreeData & operator=(const TreeData &other)
Copy assignment.
Definition: treedata.hh:213
│ │ │ │ +
~TreeData()
Destructor.
Definition: treedata.hh:231
│ │ │ │ +
ND< Node > NodeData
Template to determine the data type for given node type.
Definition: treedata.hh:110
│ │ │ │ +
TreeData()
Default constructor.
Definition: treedata.hh:185
│ │ │ │ +
std::vector< void * > RawContainer
Definition: treedata.hh:113
│ │ │ │ +
NodeData< Node > & operator[](const Node &node)
Get mutable reference to data associated to given node.
Definition: treedata.hh:239
│ │ │ │ +
typename Tree::size_type size_type
Type used for indices and size information.
Definition: treedata.hh:103
│ │ │ │ +
RawContainer data_
Definition: treedata.hh:254
│ │ │ │ +
Definition: treedata.hh:127
│ │ │ │ +
InitVisitor(RawContainer &data)
Definition: treedata.hh:128
│ │ │ │ +
void apply(Node &node, TreePath treePath)
Definition: treedata.hh:133
│ │ │ │ +
RawContainer & data_
Definition: treedata.hh:142
│ │ │ │ + │ │ │ │ +
RawContainer & data_
Definition: treedata.hh:161
│ │ │ │ +
DestroyVisitor(RawContainer &data)
Definition: treedata.hh:148
│ │ │ │ +
void apply(Node &node, TreePath treePath)
Definition: treedata.hh:153
│ │ │ │ +
Definition: treedata.hh:166
│ │ │ │ +
CopyVisitor(TreeData &thisTD, const TreeData &otherTD)
Definition: treedata.hh:167
│ │ │ │ +
void apply(Node &node, TreePath treePath)
Definition: treedata.hh:173
│ │ │ │ +
TreeData & thisTD_
Definition: treedata.hh:178
│ │ │ │ +
const TreeData & otherTD_
Definition: treedata.hh:179
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,82 +5,326 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -functionfromcallable.hh │ │ │ │ │ +treedata.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#ifndef DUNE_FUNCTIONS_COMMON_FUNCTION_FROM_CALLABLE_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_COMMON_FUNCTION_FROM_CALLABLE_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_COMMON_TREEDATA_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_COMMON_TREEDATA_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9 │ │ │ │ │ + 6 │ │ │ │ │ + 7#warning This file is deprecated. Please use TreeContainer from dune-typetree │ │ │ │ │ +instead. │ │ │ │ │ + 8 │ │ │ │ │ + 9#include │ │ │ │ │ 10 │ │ │ │ │ - 11namespace Dune { │ │ │ │ │ - 12namespace Functions { │ │ │ │ │ - 13 │ │ │ │ │ + 11#include │ │ │ │ │ + 12 │ │ │ │ │ + 13#include │ │ │ │ │ 14 │ │ │ │ │ - 15 │ │ │ │ │ - 16template::RawDomain, │ │ │ │ │ - 19 typename SignatureTraits::RawRange> > │ │ │ │ │ -20class FunctionFromCallable; │ │ │ │ │ - 21 │ │ │ │ │ - 37template │ │ │ │ │ -38class FunctionFromCallable : │ │ │ │ │ - 39 public FunctionInterface │ │ │ │ │ + 15#include │ │ │ │ │ + 16#include │ │ │ │ │ + 17 │ │ │ │ │ + 18namespace Dune { │ │ │ │ │ + 19namespace Functions { │ │ │ │ │ + 20 │ │ │ │ │ + 34template │ │ │ │ │ +35struct │ │ │ │ │ + 36[[deprecated("This is an implementation detail of the deprecated class │ │ │ │ │ +TreeDate and thus deprecated itself.")]] │ │ │ │ │ + 37UniformNodeVisitor : │ │ │ │ │ + 38 public TypeTree::TreeVisitor, │ │ │ │ │ + 39 public TypeTree::DynamicTraversal │ │ │ │ │ 40{ │ │ │ │ │ - 41public: │ │ │ │ │ - 42 │ │ │ │ │ -52 FunctionFromCallable(F&& f) : │ │ │ │ │ - 53 f_(f) │ │ │ │ │ + 41 // This is only enabled, if we want to incorporate inner nodes. │ │ │ │ │ + 42 // Checking leafOnly would be sufficient, but for SFINAE the │ │ │ │ │ + 43 // the enable_if condition must depend on the template parameter. │ │ │ │ │ + 44 template::type = │ │ │ │ │ +0> │ │ │ │ │ +46 void pre(Node& node, TreePath treePath) │ │ │ │ │ + 47 { │ │ │ │ │ + 48 static_cast(this)->apply(node, treePath); │ │ │ │ │ + 49 } │ │ │ │ │ + 50 │ │ │ │ │ + 51 template::type = 0> │ │ │ │ │ +53 void pre(Node& node, TreePath treePath) │ │ │ │ │ 54 {} │ │ │ │ │ 55 │ │ │ │ │ -64 FunctionFromCallable(const F& f) : │ │ │ │ │ - 65 f_(f) │ │ │ │ │ - 66 {} │ │ │ │ │ - 67 │ │ │ │ │ -73 void evaluate(const Domain& x, Range&y) const │ │ │ │ │ - 74 { │ │ │ │ │ - 75 y = f_(x); │ │ │ │ │ - 76 } │ │ │ │ │ - 77 │ │ │ │ │ - 78private: │ │ │ │ │ - 79 F f_; │ │ │ │ │ - 80}; │ │ │ │ │ - 81 │ │ │ │ │ - 82 │ │ │ │ │ - 83 │ │ │ │ │ - 84} // namespace Functions │ │ │ │ │ - 85} // namespace Dune │ │ │ │ │ - 86 │ │ │ │ │ - 87#endif //DUNE_FUNCTIONS_COMMON_FUNCTION_FROM_CALLABLE_HH │ │ │ │ │ -signature.hh │ │ │ │ │ + 56 template │ │ │ │ │ +57 void leaf(Node& node, TreePath treePath) │ │ │ │ │ + 58 { │ │ │ │ │ + 59 static_cast(this)->apply(node, treePath); │ │ │ │ │ + 60 } │ │ │ │ │ + 61}; │ │ │ │ │ + 62 │ │ │ │ │ + 63 │ │ │ │ │ + 64 │ │ │ │ │ + 91template class ND, bool LO> │ │ │ │ │ +92class │ │ │ │ │ + 93[[deprecated("This class is deprecated. Please use TreeContainer from dune- │ │ │ │ │ +typetree instead.")]] │ │ │ │ │ + 94TreeData │ │ │ │ │ + 95{ │ │ │ │ │ + 96 │ │ │ │ │ + 97public: │ │ │ │ │ + 98 │ │ │ │ │ +100 using Tree = T; │ │ │ │ │ + 101 │ │ │ │ │ +103 using size_type = typename Tree::size_type; │ │ │ │ │ + 104 │ │ │ │ │ +106 static const bool leafOnly = LO; │ │ │ │ │ + 107 │ │ │ │ │ + 109 template │ │ │ │ │ +110 using NodeData = ND; │ │ │ │ │ + 111 │ │ │ │ │ + 112protected: │ │ │ │ │ +113 using RawContainer = std::vector; │ │ │ │ │ + 114 │ │ │ │ │ + 115 │ │ │ │ │ + 116 // Since we can generate the node data type only if │ │ │ │ │ + 117 // we know the type of the node, we have to do │ │ │ │ │ + 118 // initialization, copy, and destruction via a │ │ │ │ │ + 119 // tree traversal. Once we can use C++14 this can │ │ │ │ │ + 120 // be written in a much easier and more selfcontained │ │ │ │ │ + 121 // ways using generic lambda functions. │ │ │ │ │ + 122 // Until then we need explicit visitor classes for │ │ │ │ │ + 123 // each operation. │ │ │ │ │ + 124 │ │ │ │ │ +125 struct InitVisitor : │ │ │ │ │ + 126 public UniformNodeVisitor │ │ │ │ │ + 127 { │ │ │ │ │ +128 InitVisitor(RawContainer& data) : │ │ │ │ │ + 129 data_(data) │ │ │ │ │ + 130 {} │ │ │ │ │ + 131 │ │ │ │ │ + 132 template │ │ │ │ │ +133 void apply(Node& node, TreePath treePath) │ │ │ │ │ + 134 { │ │ │ │ │ + 135 auto&& index = node.treeIndex(); │ │ │ │ │ + 136 if (data_.size() < index+1) │ │ │ │ │ + 137 data_.resize(index+1, nullptr); │ │ │ │ │ + 138 data_[index] = new NodeData; │ │ │ │ │ + 139 } │ │ │ │ │ + 140 │ │ │ │ │ + 141 │ │ │ │ │ +142 RawContainer& data_; │ │ │ │ │ + 143 }; │ │ │ │ │ + 144 │ │ │ │ │ +145 struct DestroyVisitor : │ │ │ │ │ + 146 public UniformNodeVisitor │ │ │ │ │ + 147 { │ │ │ │ │ +148 DestroyVisitor(RawContainer& data) : │ │ │ │ │ + 149 data_(data) │ │ │ │ │ + 150 {} │ │ │ │ │ + 151 │ │ │ │ │ + 152 template │ │ │ │ │ +153 void apply(Node& node, TreePath treePath) │ │ │ │ │ + 154 { │ │ │ │ │ + 155 auto&& index = node.treeIndex(); │ │ │ │ │ + 156 auto p = (NodeData*)(data_[index]); │ │ │ │ │ + 157 delete p; │ │ │ │ │ + 158 data_[index] = nullptr; │ │ │ │ │ + 159 } │ │ │ │ │ + 160 │ │ │ │ │ +161 RawContainer& data_; │ │ │ │ │ + 162 }; │ │ │ │ │ + 163 │ │ │ │ │ +164 struct CopyVisitor : │ │ │ │ │ + 165 public UniformNodeVisitor │ │ │ │ │ + 166 { │ │ │ │ │ +167 CopyVisitor(TreeData& thisTD, const TreeData& otherTD) : │ │ │ │ │ + 168 thisTD_(thisTD), │ │ │ │ │ + 169 otherTD_(otherTD) │ │ │ │ │ + 170 {} │ │ │ │ │ + 171 │ │ │ │ │ + 172 template │ │ │ │ │ +173 void apply(Node& node, TreePath treePath) │ │ │ │ │ + 174 { │ │ │ │ │ + 175 thisTD_[node] = otherTD_[node]; │ │ │ │ │ + 176 } │ │ │ │ │ + 177 │ │ │ │ │ +178 TreeData& thisTD_; │ │ │ │ │ +179 const TreeData& otherTD_; │ │ │ │ │ + 180 }; │ │ │ │ │ + 181 │ │ │ │ │ + 182public: │ │ │ │ │ + 183 │ │ │ │ │ +185 TreeData() : │ │ │ │ │ + 186 tree_(nullptr) │ │ │ │ │ + 187 {} │ │ │ │ │ + 188 │ │ │ │ │ +196 void init(const Tree& tree) │ │ │ │ │ + 197 { │ │ │ │ │ + 198 if (tree_) │ │ │ │ │ + 199 destroy(); │ │ │ │ │ + 200 tree_ = &tree; │ │ │ │ │ + 201 TypeTree::applyToTree(*tree_, InitVisitor(data_)); │ │ │ │ │ + 202 } │ │ │ │ │ + 203 │ │ │ │ │ +205 TreeData(const TreeData& other) : │ │ │ │ │ + 206 tree_(other.tree_) │ │ │ │ │ + 207 { │ │ │ │ │ + 208 TypeTree::applyToTree(*tree_, InitVisitor(data_)); │ │ │ │ │ + 209 TypeTree::applyToTree(*tree_, CopyVisitor(*this, other)); │ │ │ │ │ + 210 } │ │ │ │ │ + 211 │ │ │ │ │ +213 TreeData& operator=(const TreeData& other) │ │ │ │ │ + 214 { │ │ │ │ │ + 215 if (tree_) │ │ │ │ │ + 216 TypeTree::applyToTree(*tree_, DestroyVisitor(data_)); │ │ │ │ │ + 217 tree_ = other.tree_; │ │ │ │ │ + 218 TypeTree::applyToTree(*tree_, CopyVisitor(*this, other)); │ │ │ │ │ + 219 return *this; │ │ │ │ │ + 220 } │ │ │ │ │ + 221 │ │ │ │ │ +223 void destroy() │ │ │ │ │ + 224 { │ │ │ │ │ + 225 if (tree_) │ │ │ │ │ + 226 TypeTree::applyToTree(*tree_, DestroyVisitor(data_)); │ │ │ │ │ + 227 tree_ = nullptr; │ │ │ │ │ + 228 } │ │ │ │ │ + 229 │ │ │ │ │ +231 ~TreeData() │ │ │ │ │ + 232 { │ │ │ │ │ + 233 if (tree_) │ │ │ │ │ + 234 TypeTree::applyToTree(*tree_, DestroyVisitor(data_)); │ │ │ │ │ + 235 } │ │ │ │ │ + 236 │ │ │ │ │ + 238 template │ │ │ │ │ +239 NodeData& operator[](const Node& node) │ │ │ │ │ + 240 { │ │ │ │ │ + 241 return *(NodeData*)(data_[node.treeIndex()]); │ │ │ │ │ + 242 } │ │ │ │ │ + 243 │ │ │ │ │ + 245 template │ │ │ │ │ +246 const NodeData& operator[](const Node& node) const │ │ │ │ │ + 247 { │ │ │ │ │ + 248 return *(NodeData*)(data_[node.treeIndex()]); │ │ │ │ │ + 249 } │ │ │ │ │ + 250 │ │ │ │ │ + 251protected: │ │ │ │ │ + 252 │ │ │ │ │ +253 const Tree* tree_; │ │ │ │ │ +254 RawContainer data_; │ │ │ │ │ + 255}; │ │ │ │ │ + 256 │ │ │ │ │ + 257 │ │ │ │ │ + 258 │ │ │ │ │ + 259} // namespace Functions │ │ │ │ │ + 260} // namespace Dune │ │ │ │ │ + 261 │ │ │ │ │ + 262#endif // DUNE_FUNCTIONS_COMMON_TREEDATA_HH │ │ │ │ │ +gridfunction.hh │ │ │ │ │ +gridviewentityset.hh │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::FunctionFromCallable │ │ │ │ │ -Definition: functionfromcallable.hh:20 │ │ │ │ │ -Dune::Functions::FunctionFromCallable<_Range(Domain),_F,_FunctionInterface_>:: │ │ │ │ │ -FunctionFromCallable │ │ │ │ │ -FunctionFromCallable(F &&f) │ │ │ │ │ -Create VirtualFunction from callable object. │ │ │ │ │ -Definition: functionfromcallable.hh:52 │ │ │ │ │ -Dune::Functions::FunctionFromCallable<_Range(Domain),_F,_FunctionInterface_>:: │ │ │ │ │ -evaluate │ │ │ │ │ -void evaluate(const Domain &x, Range &y) const │ │ │ │ │ -Evaluate function. │ │ │ │ │ -Definition: functionfromcallable.hh:73 │ │ │ │ │ -Dune::Functions::FunctionFromCallable<_Range(Domain),_F,_FunctionInterface_>:: │ │ │ │ │ -FunctionFromCallable │ │ │ │ │ -FunctionFromCallable(const F &f) │ │ │ │ │ -Create VirtualFunction from callable object. │ │ │ │ │ -Definition: functionfromcallable.hh:64 │ │ │ │ │ +Dune::Functions::UniformNodeVisitor │ │ │ │ │ +Mixin for visitors that should apply the same action on all nodes. │ │ │ │ │ +Definition: treedata.hh:40 │ │ │ │ │ +Dune::Functions::UniformNodeVisitor::pre │ │ │ │ │ +void pre(Node &node, TreePath treePath) │ │ │ │ │ +Definition: treedata.hh:46 │ │ │ │ │ +Dune::Functions::UniformNodeVisitor::leaf │ │ │ │ │ +void leaf(Node &node, TreePath treePath) │ │ │ │ │ +Definition: treedata.hh:57 │ │ │ │ │ +Dune::Functions::TreeData │ │ │ │ │ +Container allowing to attach data to each node of a tree. │ │ │ │ │ +Definition: treedata.hh:95 │ │ │ │ │ +Dune::Functions::TreeData::TreeData │ │ │ │ │ +TreeData(const TreeData &other) │ │ │ │ │ +Copy constructor. │ │ │ │ │ +Definition: treedata.hh:205 │ │ │ │ │ +Dune::Functions::TreeData::init │ │ │ │ │ +void init(const Tree &tree) │ │ │ │ │ +Initialize from tree. │ │ │ │ │ +Definition: treedata.hh:196 │ │ │ │ │ +Dune::Functions::TreeData::Tree │ │ │ │ │ +T Tree │ │ │ │ │ +Type of tree the data is associated with. │ │ │ │ │ +Definition: treedata.hh:100 │ │ │ │ │ +Dune::Functions::TreeData::tree_ │ │ │ │ │ +const Tree * tree_ │ │ │ │ │ +Definition: treedata.hh:253 │ │ │ │ │ +Dune::Functions::TreeData::destroy │ │ │ │ │ +void destroy() │ │ │ │ │ +Destroy data. │ │ │ │ │ +Definition: treedata.hh:223 │ │ │ │ │ +Dune::Functions::TreeData::operator[] │ │ │ │ │ +const NodeData< Node > & operator[](const Node &node) const │ │ │ │ │ +Get reference to data associated to given node. │ │ │ │ │ +Definition: treedata.hh:246 │ │ │ │ │ +Dune::Functions::TreeData::operator= │ │ │ │ │ +TreeData & operator=(const TreeData &other) │ │ │ │ │ +Copy assignment. │ │ │ │ │ +Definition: treedata.hh:213 │ │ │ │ │ +Dune::Functions::TreeData::~TreeData │ │ │ │ │ +~TreeData() │ │ │ │ │ +Destructor. │ │ │ │ │ +Definition: treedata.hh:231 │ │ │ │ │ +Dune::Functions::TreeData::NodeData │ │ │ │ │ +ND< Node > NodeData │ │ │ │ │ +Template to determine the data type for given node type. │ │ │ │ │ +Definition: treedata.hh:110 │ │ │ │ │ +Dune::Functions::TreeData::TreeData │ │ │ │ │ +TreeData() │ │ │ │ │ +Default constructor. │ │ │ │ │ +Definition: treedata.hh:185 │ │ │ │ │ +Dune::Functions::TreeData::RawContainer │ │ │ │ │ +std::vector< void * > RawContainer │ │ │ │ │ +Definition: treedata.hh:113 │ │ │ │ │ +Dune::Functions::TreeData::operator[] │ │ │ │ │ +NodeData< Node > & operator[](const Node &node) │ │ │ │ │ +Get mutable reference to data associated to given node. │ │ │ │ │ +Definition: treedata.hh:239 │ │ │ │ │ +Dune::Functions::TreeData::size_type │ │ │ │ │ +typename Tree::size_type size_type │ │ │ │ │ +Type used for indices and size information. │ │ │ │ │ +Definition: treedata.hh:103 │ │ │ │ │ +Dune::Functions::TreeData::data_ │ │ │ │ │ +RawContainer data_ │ │ │ │ │ +Definition: treedata.hh:254 │ │ │ │ │ +Dune::Functions::TreeData::InitVisitor │ │ │ │ │ +Definition: treedata.hh:127 │ │ │ │ │ +Dune::Functions::TreeData::InitVisitor::InitVisitor │ │ │ │ │ +InitVisitor(RawContainer &data) │ │ │ │ │ +Definition: treedata.hh:128 │ │ │ │ │ +Dune::Functions::TreeData::InitVisitor::apply │ │ │ │ │ +void apply(Node &node, TreePath treePath) │ │ │ │ │ +Definition: treedata.hh:133 │ │ │ │ │ +Dune::Functions::TreeData::InitVisitor::data_ │ │ │ │ │ +RawContainer & data_ │ │ │ │ │ +Definition: treedata.hh:142 │ │ │ │ │ +Dune::Functions::TreeData::DestroyVisitor │ │ │ │ │ +Definition: treedata.hh:147 │ │ │ │ │ +Dune::Functions::TreeData::DestroyVisitor::data_ │ │ │ │ │ +RawContainer & data_ │ │ │ │ │ +Definition: treedata.hh:161 │ │ │ │ │ +Dune::Functions::TreeData::DestroyVisitor::DestroyVisitor │ │ │ │ │ +DestroyVisitor(RawContainer &data) │ │ │ │ │ +Definition: treedata.hh:148 │ │ │ │ │ +Dune::Functions::TreeData::DestroyVisitor::apply │ │ │ │ │ +void apply(Node &node, TreePath treePath) │ │ │ │ │ +Definition: treedata.hh:153 │ │ │ │ │ +Dune::Functions::TreeData::CopyVisitor │ │ │ │ │ +Definition: treedata.hh:166 │ │ │ │ │ +Dune::Functions::TreeData::CopyVisitor::CopyVisitor │ │ │ │ │ +CopyVisitor(TreeData &thisTD, const TreeData &otherTD) │ │ │ │ │ +Definition: treedata.hh:167 │ │ │ │ │ +Dune::Functions::TreeData::CopyVisitor::apply │ │ │ │ │ +void apply(Node &node, TreePath treePath) │ │ │ │ │ +Definition: treedata.hh:173 │ │ │ │ │ +Dune::Functions::TreeData::CopyVisitor::thisTD_ │ │ │ │ │ +TreeData & thisTD_ │ │ │ │ │ +Definition: treedata.hh:178 │ │ │ │ │ +Dune::Functions::TreeData::CopyVisitor::otherTD_ │ │ │ │ │ +const TreeData & otherTD_ │ │ │ │ │ +Definition: treedata.hh:179 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00044.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: utility.hh File Reference │ │ │ │ +dune-functions: type_traits.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,90 +65,45 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Typedefs | │ │ │ │ -Functions
│ │ │ │ -
utility.hh File Reference
│ │ │ │ +Typedefs
│ │ │ │ +
type_traits.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <utility>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <dune/common/overloadset.hh>
│ │ │ │ -#include <dune/common/indices.hh>
│ │ │ │ -#include <dune/functions/common/functionconcepts.hh>
│ │ │ │ +
#include <type_traits>
│ │ │ │ +#include <dune/common/typeutilities.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Classes

struct  Dune::Functions::LastType< T >
 Get last entry of type list. More...
struct  Dune::Functions::HasStaticSize< T >
 Check if type is a statically sized container. More...
 
struct  Dune::Functions::RotateTuple< T >
 Rotate type list by one, such that last entry is moved to first position. More...
struct  Dune::Functions::StaticSize< T >
 Obtain size of statically sized container. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Typedefs

template<template< class... > class T, class ArgTuple >
using Dune::Functions::ExpandTuple = typename Imp::ExpandTupleHelper< T, ArgTuple >::Type
 Expand tuple arguments as template arguments. More...
 
template<template< class... > class F, class... Tuples>
using Dune::Functions::TransformTuple = typename Imp::TransformTupleHelper< F, Tuples... >::Type
 Transform tuple types argument using type-functor. More...
 
template<class IntegerSequence >
using Dune::Functions::IntegerSequenceTuple = typename Imp::IntegerSequenceTupleHelper< IntegerSequence >::Type
 Transform integer_sequence<I,k...> to tuple<integral_constant<I,k>...> More...
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Functions

template<class F , class size_type , size_type firstValue, class... Args>
auto Dune::Functions::forwardAsStaticInteger (std::integer_sequence< size_type, firstValue > values, const size_type &i, F &&f, Args &&... args) -> decltype(f(std::integral_constant< size_type, firstValue >(), std::forward< Args >(args)...))
 
template<class F , class size_type , size_type firstValue, size_type secondValue, size_type... otherValues, class... Args>
auto Dune::Functions::forwardAsStaticInteger (std::integer_sequence< size_type, firstValue, secondValue, otherValues... > values, const size_type i, F &&f, Args &&... args) -> decltype(f(std::integral_constant< size_type, firstValue >(), std::forward< Args >(args)...))
 
template<std::size_t end, class F , class size_type , class... Args>
auto Dune::Functions::forwardAsStaticIndex (const size_type &i, F &&f, Args &&... args) -> decltype(f(Dune::Indices::_0, std::forward< Args >(args)...))
 Transform dynamic index to static index_constant. More...
 
template<class F , class... T>
auto Dune::Functions::transformTuple (F &&f, const std::tuple< T... > &tuple) -> decltype(Imp::transformTupleHelper(std::forward< F >(f), tuple, std::index_sequence_for< T... >{}))
 Transform tuple value using a functor. More...
 
template<class F , class... T1, class... T2>
auto Dune::Functions::transformTuple (F &&f, const std::tuple< T1... > &tuple1, const std::tuple< T2... > &tuple2) -> decltype(Imp::transformTupleHelper(std::forward< F >(f), tuple1, tuple2, std::index_sequence_for< T1... >{}))
 Transform tuple value using a binary functor. More...
 
template<class Expression >
auto Dune::Functions::callableCheck (Expression f)
 Create a predicate for checking validity of expressions. More...
 
template<class Check >
auto Dune::Functions::negatePredicate (Check check)
 Negate given predicate. More...
 
template<class T >
auto Dune::Functions::forwardCapture (T &&t)
 Create a capture object for perfect forwarding. More...
 
template<class T , class... Args>
using Dune::Functions::enableIfConstructible = typename std::enable_if< std::is_constructible< T, Args... >::value, int >::type
 Helper to constrain forwarding constructors. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,94 +5,33 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -Classes | Namespaces | Typedefs | Functions │ │ │ │ │ -utility.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Typedefs │ │ │ │ │ +type_traits.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -struct  Dune::Functions::LastType<_T_> │ │ │ │ │ -  Get last entry of type list. More... │ │ │ │ │ +struct  Dune::Functions::HasStaticSize<_T_> │ │ │ │ │ +  Check if type is a statically sized container. More... │ │ │ │ │   │ │ │ │ │ -struct  Dune::Functions::RotateTuple<_T_> │ │ │ │ │ -  Rotate type list by one, such that last entry is moved to first │ │ │ │ │ - position. More... │ │ │ │ │ +struct  Dune::Functions::StaticSize<_T_> │ │ │ │ │ +  Obtain size of statically sized container. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ Typedefs │ │ │ │ │ -template class T, class ArgTuple > │ │ │ │ │ -using Dune::Functions::ExpandTuple = typename Imp::ExpandTupleHelper< T, │ │ │ │ │ - ArgTuple >::Type │ │ │ │ │ -  Expand tuple arguments as template arguments. More... │ │ │ │ │ -  │ │ │ │ │ -template class F, class... Tuples> │ │ │ │ │ -using Dune::Functions::TransformTuple = typename Imp::TransformTupleHelper< F, │ │ │ │ │ - Tuples... >::Type │ │ │ │ │ -  Transform tuple types argument using type-functor. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -using Dune::Functions::IntegerSequenceTuple = typename Imp:: │ │ │ │ │ - IntegerSequenceTupleHelper< IntegerSequence >::Type │ │ │ │ │ -  Transform integer_sequence to tuple...> │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ - Functions │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::forwardAsStaticInteger (std::integer_sequence< │ │ │ │ │ - size_type, firstValue > values, const size_type &i, F &&f, Args &&... │ │ │ │ │ - args) -> decltype(f(std::integral_constant< size_type, firstValue >(), │ │ │ │ │ - std::forward< Args >(args)...)) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::forwardAsStaticInteger (std::integer_sequence< │ │ │ │ │ - size_type, firstValue, secondValue, otherValues... > values, const │ │ │ │ │ - size_type i, F &&f, Args &&... args) -> decltype(f(std:: │ │ │ │ │ - integral_constant< size_type, firstValue >(), std::forward< Args > │ │ │ │ │ - (args)...)) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::forwardAsStaticIndex (const size_type &i, F &&f, Args │ │ │ │ │ - &&... args) -> decltype(f(Dune::Indices::_0, std::forward< Args > │ │ │ │ │ - (args)...)) │ │ │ │ │ -  Transform dynamic index to static index_constant. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::transformTuple (F &&f, const std::tuple< T... > &tuple) │ │ │ │ │ - -> decltype(Imp::transformTupleHelper(std::forward< F >(f), tuple, std:: │ │ │ │ │ - index_sequence_for< T... >{})) │ │ │ │ │ -  Transform tuple value using a functor. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::transformTuple (F &&f, const std::tuple< T1... > │ │ │ │ │ - &tuple1, const std::tuple< T2... > &tuple2) -> decltype(Imp:: │ │ │ │ │ - transformTupleHelper(std::forward< F >(f), tuple1, tuple2, std:: │ │ │ │ │ - index_sequence_for< T1... >{})) │ │ │ │ │ -  Transform tuple value using a binary functor. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::callableCheck (Expression f) │ │ │ │ │ -  Create a predicate for checking validity of expressions. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::negatePredicate (Check check) │ │ │ │ │ -  Negate given predicate. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::forwardCapture (T &&t) │ │ │ │ │ -  Create a capture object for perfect forwarding. More... │ │ │ │ │ +template │ │ │ │ │ +using Dune::Functions::enableIfConstructible = typename std::enable_if< std:: │ │ │ │ │ + is_constructible< T, Args... >::value, int >::type │ │ │ │ │ +  Helper to constrain forwarding constructors. More... │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00044_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: utility.hh Source File │ │ │ │ +dune-functions: type_traits.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,284 +62,100 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
utility.hh
│ │ │ │ +
type_traits.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#ifndef DUNE_FUNCTIONS_COMMON_UTILITY_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_COMMON_UTILITY_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_COMMON_TYPE_TRAITS_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_COMMON_TYPE_TRAITS_HH
│ │ │ │
5
│ │ │ │ -
6
│ │ │ │ -
7#include <utility>
│ │ │ │ -
8#include <type_traits>
│ │ │ │ +
6#include <type_traits>
│ │ │ │ +
7
│ │ │ │ +
8#include <dune/common/typeutilities.hh>
│ │ │ │
9
│ │ │ │ -
10#include <dune/common/overloadset.hh>
│ │ │ │ -
11#include <dune/common/indices.hh>
│ │ │ │ +
10namespace Dune {
│ │ │ │ +
11namespace Functions {
│ │ │ │
12
│ │ │ │ - │ │ │ │ -
14
│ │ │ │ -
15namespace Dune {
│ │ │ │ -
16namespace Functions {
│ │ │ │ -
17
│ │ │ │ -
18
│ │ │ │ -
19
│ │ │ │ -
20template<class F, class size_type, size_type firstValue, class... Args>
│ │ │ │ -
21auto forwardAsStaticInteger(std::integer_sequence<size_type, firstValue> values, const size_type& i, F&& f, Args&&... args)
│ │ │ │ -
22 ->decltype(f(std::integral_constant<size_type, firstValue>(), std::forward<Args>(args)...))
│ │ │ │ -
23{
│ │ │ │ -
24 return f(std::integral_constant<size_type, firstValue>(), std::forward<Args>(args)...);
│ │ │ │ -
25}
│ │ │ │ -
26
│ │ │ │ -
27template<class F, class size_type, size_type firstValue, size_type secondValue, size_type... otherValues, class... Args>
│ │ │ │ -
28auto forwardAsStaticInteger(std::integer_sequence<size_type, firstValue, secondValue, otherValues...> values, const size_type i, F&& f, Args&&... args)
│ │ │ │ -
29 ->decltype(f(std::integral_constant<size_type, firstValue>(), std::forward<Args>(args)...))
│ │ │ │ -
30{
│ │ │ │ -
31 if (i==firstValue)
│ │ │ │ -
32 return f(std::integral_constant<size_type, firstValue>(), std::forward<Args>(args)...);
│ │ │ │ -
33 return forwardAsStaticInteger(std::integer_sequence<size_type, secondValue, otherValues...>(), i, std::forward<F>(f), std::forward<Args>(args)...);
│ │ │ │ -
34}
│ │ │ │ -
35
│ │ │ │ -
36
│ │ │ │ -
37
│ │ │ │ -
59template<std::size_t end, class F, class size_type, class... Args>
│ │ │ │ -
60auto forwardAsStaticIndex(const size_type& i, F&& f, Args&&... args)
│ │ │ │ -
61 ->decltype(f(Dune::Indices::_0, std::forward<Args>(args)...))
│ │ │ │ -
62{
│ │ │ │ -
63 return forwardAsStaticInteger(std::make_index_sequence<end>{}, i, std::forward<F>(f), std::forward<Args>(args)...);
│ │ │ │ -
64}
│ │ │ │ -
65
│ │ │ │ -
66
│ │ │ │ -
67
│ │ │ │ -
68namespace Imp {
│ │ │ │ -
69
│ │ │ │ -
70 template<template<class...> class T, class List>
│ │ │ │ -
71 struct ExpandTupleHelper
│ │ │ │ -
72 {};
│ │ │ │ -
73
│ │ │ │ -
74 template<template<class...> class T, template<class...> class ListType, class... Args>
│ │ │ │ -
75 struct ExpandTupleHelper<T, ListType<Args...>>
│ │ │ │ -
76 {
│ │ │ │ -
77 using Type = T<Args...>;
│ │ │ │ -
78 };
│ │ │ │ -
79
│ │ │ │ -
80} // end namespace Imp
│ │ │ │ -
81
│ │ │ │ -
93template<template<class...> class T, class ArgTuple>
│ │ │ │ -
94using ExpandTuple = typename Imp::ExpandTupleHelper<T, ArgTuple>::Type;
│ │ │ │ -
95
│ │ │ │ -
96
│ │ │ │ -
97
│ │ │ │ -
98namespace Imp {
│ │ │ │ +
13
│ │ │ │ +
24template<class T, class... Args>
│ │ │ │ +
25using enableIfConstructible = typename std::enable_if<
│ │ │ │ +
26 std::is_constructible<T, Args...>::value, int>::type;
│ │ │ │ +
27
│ │ │ │ +
28
│ │ │ │ +
29
│ │ │ │ +
30namespace Imp {
│ │ │ │ +
31
│ │ │ │ +
32 // As a last resort try if there's a static constexpr size()
│ │ │ │ +
33 template<class T>
│ │ │ │ +
34 constexpr auto staticSize(const T*, const PriorityTag<0>&)
│ │ │ │ +
35 -> decltype(std::integral_constant<std::size_t,T::size()>())
│ │ │ │ +
36 {
│ │ │ │ +
37 return {};
│ │ │ │ +
38 }
│ │ │ │ +
39
│ │ │ │ +
40 // Try if class has constexpr default constructor and size method
│ │ │ │ +
41 template<class T>
│ │ │ │ +
42 constexpr auto staticSize(const T*, const PriorityTag<1>&)
│ │ │ │ +
43 -> decltype(std::integral_constant<std::size_t,T().size()>())
│ │ │ │ +
44 {
│ │ │ │ +
45 return {};
│ │ │ │ +
46 }
│ │ │ │ +
47
│ │ │ │ +
48 // Try if tuple_size is implemented for class
│ │ │ │ +
49 template<class T>
│ │ │ │ +
50 constexpr auto staticSize(const T*, const PriorityTag<2>&)
│ │ │ │ +
51 -> decltype(std::integral_constant<std::size_t,std::tuple_size<T>::value>())
│ │ │ │ +
52 {
│ │ │ │ +
53 return {};
│ │ │ │ +
54 }
│ │ │ │ +
55
│ │ │ │ +
56 template<class T>
│ │ │ │ +
57 constexpr std::false_type hasStaticSize(const T* t, const PriorityTag<0>& p)
│ │ │ │ +
58 {
│ │ │ │ +
59 return {};
│ │ │ │ +
60 }
│ │ │ │ +
61
│ │ │ │ +
62 template<class T>
│ │ │ │ +
63 constexpr auto hasStaticSize(const T* t, const PriorityTag<1>& p)
│ │ │ │ +
64 -> decltype(staticSize(t ,PriorityTag<42>()), std::true_type())
│ │ │ │ +
65 {
│ │ │ │ +
66 return {};
│ │ │ │ +
67 }
│ │ │ │ +
68
│ │ │ │ +
69}
│ │ │ │ +
70
│ │ │ │ +
71
│ │ │ │ +
72
│ │ │ │ +
80template<class T>
│ │ │ │ + │ │ │ │ +
82 public decltype(Imp::hasStaticSize((typename std::decay<T>::type*)(nullptr), PriorityTag<42>()))
│ │ │ │ +
83{};
│ │ │ │ +
84
│ │ │ │ +
85
│ │ │ │ +
86
│ │ │ │ +
94template<class T>
│ │ │ │ +
95struct StaticSize :
│ │ │ │ +
96 public decltype(Imp::staticSize((typename std::decay<T>::type*)(nullptr), PriorityTag<42>()))
│ │ │ │ +
97{};
│ │ │ │ +
98
│ │ │ │
99
│ │ │ │ -
100 template<template<class...> class T, class... Tuple>
│ │ │ │ -
101 struct TransformTupleHelper
│ │ │ │ -
102 {};
│ │ │ │ -
103
│ │ │ │ -
104 template<template<class...> class T, class... Args1>
│ │ │ │ -
105 struct TransformTupleHelper<T, typename std::tuple<Args1...>>
│ │ │ │ -
106 {
│ │ │ │ -
107 using Type = std::tuple<T<Args1>...>;
│ │ │ │ -
108 };
│ │ │ │ -
109
│ │ │ │ -
110 template<template<class...> class T, class... Args1, class... Args2>
│ │ │ │ -
111 struct TransformTupleHelper<T, typename std::tuple<Args1...>, typename std::tuple<Args2...>>
│ │ │ │ -
112 {
│ │ │ │ -
113 using Type = std::tuple<T<Args1, Args2>...>;
│ │ │ │ -
114 };
│ │ │ │ -
115
│ │ │ │ -
116} // end namespace Imp
│ │ │ │ -
117
│ │ │ │ -
130template<template<class...> class F, class... Tuples>
│ │ │ │ -
131using TransformTuple = typename Imp::TransformTupleHelper<F, Tuples...>::Type;
│ │ │ │ -
132
│ │ │ │ -
133
│ │ │ │ -
134
│ │ │ │ -
135namespace Imp {
│ │ │ │ -
136
│ │ │ │ -
137 template<class F, class... T, std::size_t... k>
│ │ │ │ -
138 auto transformTupleHelper(F&& f, const std::tuple<T...>& tuple, std::index_sequence<k...>)
│ │ │ │ -
139 -> decltype(std::make_tuple(f(std::get<k>(tuple))...))
│ │ │ │ -
140 {
│ │ │ │ -
141 return std::make_tuple(f(std::get<k>(tuple))...);
│ │ │ │ -
142 }
│ │ │ │ -
143
│ │ │ │ -
144 template<class F, class... T1, class...T2, std::size_t... k>
│ │ │ │ -
145 auto transformTupleHelper(F&& f, const std::tuple<T1...>& tuple1, const std::tuple<T2...>& tuple2, std::index_sequence<k...>)
│ │ │ │ -
146 -> decltype(std::make_tuple(f(std::get<k>(tuple1), std::get<k>(tuple2))...))
│ │ │ │ -
147 {
│ │ │ │ -
148 return std::make_tuple(f(std::get<k>(tuple1), std::get<k>(tuple2))...);
│ │ │ │ -
149 }
│ │ │ │ -
150
│ │ │ │ -
151} // end namespace Imp
│ │ │ │ -
152
│ │ │ │ -
164template<class F, class... T>
│ │ │ │ -
165auto transformTuple(F&& f, const std::tuple<T...>& tuple)
│ │ │ │ -
166 -> decltype(Imp::transformTupleHelper(std::forward<F>(f), tuple, std::index_sequence_for<T...>{}))
│ │ │ │ -
167{
│ │ │ │ -
168 return Imp::transformTupleHelper(std::forward<F>(f), tuple, std::index_sequence_for<T...>{});
│ │ │ │ -
169}
│ │ │ │ -
170
│ │ │ │ -
184template<class F, class... T1, class... T2>
│ │ │ │ -
185auto transformTuple(F&& f, const std::tuple<T1...>& tuple1, const std::tuple<T2...>& tuple2)
│ │ │ │ -
186 -> decltype(Imp::transformTupleHelper(std::forward<F>(f), tuple1, tuple2, std::index_sequence_for<T1...>{}))
│ │ │ │ -
187{
│ │ │ │ -
188 return Imp::transformTupleHelper(std::forward<F>(f), tuple1, tuple2, std::index_sequence_for<T1...>{});
│ │ │ │ -
189}
│ │ │ │ -
190
│ │ │ │ -
191
│ │ │ │ -
192
│ │ │ │ -
193namespace Imp {
│ │ │ │ -
194
│ │ │ │ -
195 template<class IntegerSequence>
│ │ │ │ -
196 struct IntegerSequenceTupleHelper
│ │ │ │ -
197 {};
│ │ │ │ -
198
│ │ │ │ -
199 template<class I, I... k>
│ │ │ │ -
200 struct IntegerSequenceTupleHelper<std::integer_sequence<I, k...>>
│ │ │ │ -
201 {
│ │ │ │ -
202 using Type = std::tuple<std::integral_constant<I, k>...>;
│ │ │ │ -
203 };
│ │ │ │ -
204
│ │ │ │ -
205} // end namespace Imp
│ │ │ │ -
206
│ │ │ │ -
210template<class IntegerSequence>
│ │ │ │ -
211using IntegerSequenceTuple= typename Imp::IntegerSequenceTupleHelper<IntegerSequence>::Type;
│ │ │ │ -
212
│ │ │ │ -
213
│ │ │ │ -
214
│ │ │ │ -
220template<class... T>
│ │ │ │ - │ │ │ │ -
222{
│ │ │ │ -
223 using type = typename std::tuple_element<sizeof...(T)-1, std::tuple<T...>>::type;
│ │ │ │ -
224};
│ │ │ │ -
225
│ │ │ │ -
226
│ │ │ │ -
227
│ │ │ │ -
228namespace Imp {
│ │ │ │ -
229
│ │ │ │ -
230template<class T, class I>
│ │ │ │ -
231struct RotateHelper;
│ │ │ │ -
232
│ │ │ │ -
233template<class... T, std::size_t... I>
│ │ │ │ -
234struct RotateHelper<std::tuple<T...>, std::index_sequence<I...> >
│ │ │ │ -
235{
│ │ │ │ -
236 using type = typename std::tuple<typename LastType<T...>::type, typename std::tuple_element<I,std::tuple<T...>>::type...>;
│ │ │ │ -
237};
│ │ │ │ -
238
│ │ │ │ -
239} // end namespace Imp
│ │ │ │ -
240
│ │ │ │ -
241
│ │ │ │ -
249template<class... T>
│ │ │ │ - │ │ │ │ -
251{
│ │ │ │ -
252 using type = typename Imp::RotateHelper<std::tuple<T...>, std::make_index_sequence<sizeof...(T)-1>>::type;
│ │ │ │ -
253};
│ │ │ │ -
254
│ │ │ │ -
255
│ │ │ │ -
256
│ │ │ │ -
278template<class Expression>
│ │ │ │ -
279auto callableCheck(Expression f)
│ │ │ │ -
280{
│ │ │ │ -
281 return [f](auto&&... args){
│ │ │ │ -
282 return Functions::Concept::isCallable(f, std::forward<decltype(args)>(args)...);
│ │ │ │ -
283 };
│ │ │ │ -
284}
│ │ │ │ -
285
│ │ │ │ -
286
│ │ │ │ -
287
│ │ │ │ -
303template<class Check>
│ │ │ │ -
304auto negatePredicate(Check check)
│ │ │ │ -
305{
│ │ │ │ -
306 return [check](auto&&... args){
│ │ │ │ -
307 auto negate = overload(
│ │ │ │ -
308 [](std::true_type) { return std::false_type{};},
│ │ │ │ -
309 [](std::false_type) { return std::true_type{};},
│ │ │ │ -
310 [](bool v) { return not v;});
│ │ │ │ -
311 return negate(check(std::forward<decltype(args)>(args)...));
│ │ │ │ -
312 };
│ │ │ │ -
313}
│ │ │ │ -
314
│ │ │ │ -
315
│ │ │ │ -
316namespace Impl {
│ │ │ │ -
317
│ │ │ │ -
318 // Wrapper to capture values in a lambda for perfect forwarding.
│ │ │ │ -
319 // This captures value types by value and reference types by reference.
│ │ │ │ -
320 template <typename T>
│ │ │ │ -
321 struct ForwardCaptureWrapper;
│ │ │ │ -
322
│ │ │ │ -
323 template <typename T>
│ │ │ │ -
324 struct ForwardCaptureWrapper
│ │ │ │ -
325 {
│ │ │ │ -
326 template <typename TT>
│ │ │ │ -
327 ForwardCaptureWrapper(TT&& t) : t_{std::forward<TT>(t)} {}
│ │ │ │ -
328
│ │ │ │ -
329 auto forward() const { return std::move(t_); }
│ │ │ │ -
330
│ │ │ │ -
331 T t_;
│ │ │ │ -
332 };
│ │ │ │ -
333
│ │ │ │ -
334 template <typename T>
│ │ │ │ -
335 struct ForwardCaptureWrapper<T&>
│ │ │ │ -
336 {
│ │ │ │ -
337 ForwardCaptureWrapper(T& t) : t_{t} {}
│ │ │ │ -
338
│ │ │ │ -
339 T& forward() const { return t_; };
│ │ │ │ -
340
│ │ │ │ -
341 T& t_;
│ │ │ │ -
342 };
│ │ │ │ -
343
│ │ │ │ -
344 template <typename T>
│ │ │ │ -
345 struct ForwardCaptureWrapper<const T&>
│ │ │ │ -
346 {
│ │ │ │ -
347 ForwardCaptureWrapper(const T& t) : t_{t} {}
│ │ │ │ -
348
│ │ │ │ -
349 const T& forward() const { return t_; };
│ │ │ │ -
350
│ │ │ │ -
351 const T& t_;
│ │ │ │ -
352 };
│ │ │ │ -
353
│ │ │ │ -
354} // end namespace Dune::Functions::Impl
│ │ │ │ -
355
│ │ │ │ -
356
│ │ │ │ -
357
│ │ │ │ -
371template <class T>
│ │ │ │ -
372auto forwardCapture(T&& t)
│ │ │ │ -
373{
│ │ │ │ -
374 return Impl::ForwardCaptureWrapper<T>(std::forward<T>(t));
│ │ │ │ -
375}
│ │ │ │ -
376
│ │ │ │ -
377
│ │ │ │ -
378
│ │ │ │ -
379} // namespace Dune::Functions
│ │ │ │ -
380} // namespace Dune
│ │ │ │ -
381
│ │ │ │ -
382
│ │ │ │ -
383#endif // DUNE_FUNCTIONS_COMMON_UTILITY_HH
│ │ │ │ - │ │ │ │ -
typename Imp::ExpandTupleHelper< T, ArgTuple >::Type ExpandTuple
Expand tuple arguments as template arguments.
Definition: utility.hh:94
│ │ │ │ -
typename Imp::TransformTupleHelper< F, Tuples... >::Type TransformTuple
Transform tuple types argument using type-functor.
Definition: utility.hh:131
│ │ │ │ -
static constexpr auto isCallable()
Check if f is callable with given argument list.
Definition: functionconcepts.hh:47
│ │ │ │ -
auto transformTuple(F &&f, const std::tuple< T... > &tuple) -> decltype(Imp::transformTupleHelper(std::forward< F >(f), tuple, std::index_sequence_for< T... >{}))
Transform tuple value using a functor.
Definition: utility.hh:165
│ │ │ │ -
auto callableCheck(Expression f)
Create a predicate for checking validity of expressions.
Definition: utility.hh:279
│ │ │ │ -
auto forwardAsStaticIndex(const size_type &i, F &&f, Args &&... args) -> decltype(f(Dune::Indices::_0, std::forward< Args >(args)...))
Transform dynamic index to static index_constant.
Definition: utility.hh:60
│ │ │ │ -
auto negatePredicate(Check check)
Negate given predicate.
Definition: utility.hh:304
│ │ │ │ +
100
│ │ │ │ +
101}} // namespace Dune::Functions
│ │ │ │ +
102
│ │ │ │ +
103#endif // DUNE_FUNCTIONS_COMMON_TYPE_TRAITS_HH
│ │ │ │ +
typename std::enable_if< std::is_constructible< T, Args... >::value, int >::type enableIfConstructible
Helper to constrain forwarding constructors.
Definition: type_traits.hh:26
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
auto forwardCapture(T &&t)
Create a capture object for perfect forwarding.
Definition: utility.hh:372
│ │ │ │ -
auto forwardAsStaticInteger(std::integer_sequence< size_type, firstValue > values, const size_type &i, F &&f, Args &&... args) -> decltype(f(std::integral_constant< size_type, firstValue >(), std::forward< Args >(args)...))
Definition: utility.hh:21
│ │ │ │ -
typename Imp::IntegerSequenceTupleHelper< IntegerSequence >::Type IntegerSequenceTuple
Transform integer_sequence<I,k...> to tuple<integral_constant<I,k>...>
Definition: utility.hh:211
│ │ │ │ -
Get last entry of type list.
Definition: utility.hh:222
│ │ │ │ -
typename std::tuple_element< sizeof...(T) -1, std::tuple< T... > >::type type
Definition: utility.hh:223
│ │ │ │ -
Rotate type list by one, such that last entry is moved to first position.
Definition: utility.hh:251
│ │ │ │ -
typename Imp::RotateHelper< std::tuple< T... >, std::make_index_sequence< sizeof...(T) -1 > >::type type
Definition: utility.hh:252
│ │ │ │ +
Check if type is a statically sized container.
Definition: type_traits.hh:83
│ │ │ │ +
Obtain size of statically sized container.
Definition: type_traits.hh:97
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,349 +5,108 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -utility.hh │ │ │ │ │ +type_traits.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#ifndef DUNE_FUNCTIONS_COMMON_UTILITY_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_COMMON_UTILITY_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_COMMON_TYPE_TRAITS_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_COMMON_TYPE_TRAITS_HH │ │ │ │ │ 5 │ │ │ │ │ - 6 │ │ │ │ │ - 7#include │ │ │ │ │ - 8#include │ │ │ │ │ + 6#include │ │ │ │ │ + 7 │ │ │ │ │ + 8#include │ │ │ │ │ 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ + 10namespace Dune { │ │ │ │ │ + 11namespace Functions { │ │ │ │ │ 12 │ │ │ │ │ - 13#include │ │ │ │ │ - 14 │ │ │ │ │ - 15namespace Dune { │ │ │ │ │ - 16namespace Functions { │ │ │ │ │ - 17 │ │ │ │ │ - 18 │ │ │ │ │ - 19 │ │ │ │ │ - 20template │ │ │ │ │ -21auto forwardAsStaticInteger(std::integer_sequence │ │ │ │ │ -values, const size_type& i, F&& f, Args&&... args) │ │ │ │ │ - 22 ->decltype(f(std::integral_constant(), std:: │ │ │ │ │ -forward(args)...)) │ │ │ │ │ - 23{ │ │ │ │ │ - 24 return f(std::integral_constant(), std:: │ │ │ │ │ -forward(args)...); │ │ │ │ │ - 25} │ │ │ │ │ - 26 │ │ │ │ │ - 27template │ │ │ │ │ -28auto forwardAsStaticInteger(std::integer_sequence values, const size_type i, F&& f, Args&&... args) │ │ │ │ │ - 29 ->decltype(f(std::integral_constant(), std:: │ │ │ │ │ -forward(args)...)) │ │ │ │ │ - 30{ │ │ │ │ │ - 31 if (i==firstValue) │ │ │ │ │ - 32 return f(std::integral_constant(), std:: │ │ │ │ │ -forward(args)...); │ │ │ │ │ - 33 return forwardAsStaticInteger(std::integer_sequence(), i, std::forward(f), std::forward(args)...); │ │ │ │ │ - 34} │ │ │ │ │ - 35 │ │ │ │ │ - 36 │ │ │ │ │ - 37 │ │ │ │ │ - 59template │ │ │ │ │ -60auto forwardAsStaticIndex(const size_type& i, F&& f, Args&&... args) │ │ │ │ │ - 61 ->decltype(f(Dune::Indices::_0, std::forward(args)...)) │ │ │ │ │ - 62{ │ │ │ │ │ - 63 return forwardAsStaticInteger(std::make_index_sequence{}, i, std:: │ │ │ │ │ -forward(f), std::forward(args)...); │ │ │ │ │ - 64} │ │ │ │ │ - 65 │ │ │ │ │ - 66 │ │ │ │ │ - 67 │ │ │ │ │ - 68namespace Imp { │ │ │ │ │ - 69 │ │ │ │ │ - 70 template class T, class List> │ │ │ │ │ - 71 struct ExpandTupleHelper │ │ │ │ │ - 72 {}; │ │ │ │ │ - 73 │ │ │ │ │ - 74 template class T, template class ListType, │ │ │ │ │ -class... Args> │ │ │ │ │ - 75 struct ExpandTupleHelper> │ │ │ │ │ - 76 { │ │ │ │ │ - 77 using Type = T; │ │ │ │ │ - 78 }; │ │ │ │ │ - 79 │ │ │ │ │ - 80} // end namespace Imp │ │ │ │ │ - 81 │ │ │ │ │ - 93template class T, class ArgTuple> │ │ │ │ │ -94using ExpandTuple = typename Imp::ExpandTupleHelper::Type; │ │ │ │ │ - 95 │ │ │ │ │ - 96 │ │ │ │ │ - 97 │ │ │ │ │ - 98namespace Imp { │ │ │ │ │ + 13 │ │ │ │ │ + 24template │ │ │ │ │ +25using enableIfConstructible = typename std::enable_if< │ │ │ │ │ + 26 std::is_constructible::value, int>::type; │ │ │ │ │ + 27 │ │ │ │ │ + 28 │ │ │ │ │ + 29 │ │ │ │ │ + 30namespace Imp { │ │ │ │ │ + 31 │ │ │ │ │ + 32 // As a last resort try if there's a static constexpr size() │ │ │ │ │ + 33 template │ │ │ │ │ + 34 constexpr auto staticSize(const T*, const PriorityTag<0>&) │ │ │ │ │ + 35 -> decltype(std::integral_constant()) │ │ │ │ │ + 36 { │ │ │ │ │ + 37 return {}; │ │ │ │ │ + 38 } │ │ │ │ │ + 39 │ │ │ │ │ + 40 // Try if class has constexpr default constructor and size method │ │ │ │ │ + 41 template │ │ │ │ │ + 42 constexpr auto staticSize(const T*, const PriorityTag<1>&) │ │ │ │ │ + 43 -> decltype(std::integral_constant()) │ │ │ │ │ + 44 { │ │ │ │ │ + 45 return {}; │ │ │ │ │ + 46 } │ │ │ │ │ + 47 │ │ │ │ │ + 48 // Try if tuple_size is implemented for class │ │ │ │ │ + 49 template │ │ │ │ │ + 50 constexpr auto staticSize(const T*, const PriorityTag<2>&) │ │ │ │ │ + 51 -> decltype(std::integral_constant::value> │ │ │ │ │ +()) │ │ │ │ │ + 52 { │ │ │ │ │ + 53 return {}; │ │ │ │ │ + 54 } │ │ │ │ │ + 55 │ │ │ │ │ + 56 template │ │ │ │ │ + 57 constexpr std::false_type hasStaticSize(const T* t, const PriorityTag<0>& │ │ │ │ │ +p) │ │ │ │ │ + 58 { │ │ │ │ │ + 59 return {}; │ │ │ │ │ + 60 } │ │ │ │ │ + 61 │ │ │ │ │ + 62 template │ │ │ │ │ + 63 constexpr auto hasStaticSize(const T* t, const PriorityTag<1>& p) │ │ │ │ │ + 64 -> decltype(staticSize(t ,PriorityTag<42>()), std::true_type()) │ │ │ │ │ + 65 { │ │ │ │ │ + 66 return {}; │ │ │ │ │ + 67 } │ │ │ │ │ + 68 │ │ │ │ │ + 69} │ │ │ │ │ + 70 │ │ │ │ │ + 71 │ │ │ │ │ + 72 │ │ │ │ │ + 80template │ │ │ │ │ +81struct HasStaticSize : │ │ │ │ │ + 82 public decltype(Imp::hasStaticSize((typename std::decay::type*) │ │ │ │ │ +(nullptr), PriorityTag<42>())) │ │ │ │ │ + 83{}; │ │ │ │ │ + 84 │ │ │ │ │ + 85 │ │ │ │ │ + 86 │ │ │ │ │ + 94template │ │ │ │ │ +95struct StaticSize : │ │ │ │ │ + 96 public decltype(Imp::staticSize((typename std::decay::type*)(nullptr), │ │ │ │ │ +PriorityTag<42>())) │ │ │ │ │ + 97{}; │ │ │ │ │ + 98 │ │ │ │ │ 99 │ │ │ │ │ - 100 template class T, class... Tuple> │ │ │ │ │ - 101 struct TransformTupleHelper │ │ │ │ │ - 102 {}; │ │ │ │ │ - 103 │ │ │ │ │ - 104 template class T, class... Args1> │ │ │ │ │ - 105 struct TransformTupleHelper> │ │ │ │ │ - 106 { │ │ │ │ │ - 107 using Type = std::tuple...>; │ │ │ │ │ - 108 }; │ │ │ │ │ - 109 │ │ │ │ │ - 110 template class T, class... Args1, class... Args2> │ │ │ │ │ - 111 struct TransformTupleHelper, typename │ │ │ │ │ -std::tuple> │ │ │ │ │ - 112 { │ │ │ │ │ - 113 using Type = std::tuple...>; │ │ │ │ │ - 114 }; │ │ │ │ │ - 115 │ │ │ │ │ - 116} // end namespace Imp │ │ │ │ │ - 117 │ │ │ │ │ - 130template class F, class... Tuples> │ │ │ │ │ -131using TransformTuple = typename Imp::TransformTupleHelper:: │ │ │ │ │ -Type; │ │ │ │ │ - 132 │ │ │ │ │ - 133 │ │ │ │ │ - 134 │ │ │ │ │ - 135namespace Imp { │ │ │ │ │ - 136 │ │ │ │ │ - 137 template │ │ │ │ │ - 138 auto transformTupleHelper(F&& f, const std::tuple& tuple, std:: │ │ │ │ │ -index_sequence) │ │ │ │ │ - 139 -> decltype(std::make_tuple(f(std::get(tuple))...)) │ │ │ │ │ - 140 { │ │ │ │ │ - 141 return std::make_tuple(f(std::get(tuple))...); │ │ │ │ │ - 142 } │ │ │ │ │ - 143 │ │ │ │ │ - 144 template │ │ │ │ │ - 145 auto transformTupleHelper(F&& f, const std::tuple& tuple1, const │ │ │ │ │ -std::tuple& tuple2, std::index_sequence) │ │ │ │ │ - 146 -> decltype(std::make_tuple(f(std::get(tuple1), std::get │ │ │ │ │ -(tuple2))...)) │ │ │ │ │ - 147 { │ │ │ │ │ - 148 return std::make_tuple(f(std::get(tuple1), std::get(tuple2))...); │ │ │ │ │ - 149 } │ │ │ │ │ - 150 │ │ │ │ │ - 151} // end namespace Imp │ │ │ │ │ - 152 │ │ │ │ │ - 164template │ │ │ │ │ -165auto transformTuple(F&& f, const std::tuple& tuple) │ │ │ │ │ - 166 -> decltype(Imp::transformTupleHelper(std::forward(f), tuple, std:: │ │ │ │ │ -index_sequence_for{})) │ │ │ │ │ - 167{ │ │ │ │ │ - 168 return Imp::transformTupleHelper(std::forward(f), tuple, std:: │ │ │ │ │ -index_sequence_for{}); │ │ │ │ │ - 169} │ │ │ │ │ - 170 │ │ │ │ │ - 184template │ │ │ │ │ -185auto transformTuple(F&& f, const std::tuple& tuple1, const std:: │ │ │ │ │ -tuple& tuple2) │ │ │ │ │ - 186 -> decltype(Imp::transformTupleHelper(std::forward(f), tuple1, tuple2, │ │ │ │ │ -std::index_sequence_for{})) │ │ │ │ │ - 187{ │ │ │ │ │ - 188 return Imp::transformTupleHelper(std::forward(f), tuple1, tuple2, std:: │ │ │ │ │ -index_sequence_for{}); │ │ │ │ │ - 189} │ │ │ │ │ - 190 │ │ │ │ │ - 191 │ │ │ │ │ - 192 │ │ │ │ │ - 193namespace Imp { │ │ │ │ │ - 194 │ │ │ │ │ - 195 template │ │ │ │ │ - 196 struct IntegerSequenceTupleHelper │ │ │ │ │ - 197 {}; │ │ │ │ │ - 198 │ │ │ │ │ - 199 template │ │ │ │ │ - 200 struct IntegerSequenceTupleHelper> │ │ │ │ │ - 201 { │ │ │ │ │ - 202 using Type = std::tuple...>; │ │ │ │ │ - 203 }; │ │ │ │ │ - 204 │ │ │ │ │ - 205} // end namespace Imp │ │ │ │ │ - 206 │ │ │ │ │ - 210template │ │ │ │ │ -211using IntegerSequenceTuple= typename Imp:: │ │ │ │ │ -IntegerSequenceTupleHelper::Type; │ │ │ │ │ - 212 │ │ │ │ │ - 213 │ │ │ │ │ - 214 │ │ │ │ │ - 220template │ │ │ │ │ -221struct LastType │ │ │ │ │ - 222{ │ │ │ │ │ -223 using type = typename std::tuple_element>::type; │ │ │ │ │ - 224}; │ │ │ │ │ - 225 │ │ │ │ │ - 226 │ │ │ │ │ - 227 │ │ │ │ │ - 228namespace Imp { │ │ │ │ │ - 229 │ │ │ │ │ - 230template │ │ │ │ │ - 231struct RotateHelper; │ │ │ │ │ - 232 │ │ │ │ │ - 233template │ │ │ │ │ - 234struct RotateHelper, std::index_sequence > │ │ │ │ │ - 235{ │ │ │ │ │ - 236 using type = typename std::tuple::type, typename │ │ │ │ │ -std::tuple_element>::type...>; │ │ │ │ │ - 237}; │ │ │ │ │ - 238 │ │ │ │ │ - 239} // end namespace Imp │ │ │ │ │ - 240 │ │ │ │ │ - 241 │ │ │ │ │ - 249template │ │ │ │ │ -250struct RotateTuple │ │ │ │ │ - 251{ │ │ │ │ │ -252 using type = typename Imp::RotateHelper, std:: │ │ │ │ │ -make_index_sequence>::type; │ │ │ │ │ - 253}; │ │ │ │ │ - 254 │ │ │ │ │ - 255 │ │ │ │ │ - 256 │ │ │ │ │ - 278template │ │ │ │ │ -279auto callableCheck(Expression f) │ │ │ │ │ - 280{ │ │ │ │ │ - 281 return [f](auto&&... args){ │ │ │ │ │ - 282 return Functions::Concept::isCallable(f, std::forward │ │ │ │ │ -(args)...); │ │ │ │ │ - 283 }; │ │ │ │ │ - 284} │ │ │ │ │ - 285 │ │ │ │ │ - 286 │ │ │ │ │ - 287 │ │ │ │ │ - 303template │ │ │ │ │ -304auto negatePredicate(Check check) │ │ │ │ │ - 305{ │ │ │ │ │ - 306 return [check](auto&&... args){ │ │ │ │ │ - 307 auto negate = overload( │ │ │ │ │ - 308 [](std::true_type) { return std::false_type{};}, │ │ │ │ │ - 309 [](std::false_type) { return std::true_type{};}, │ │ │ │ │ - 310 [](bool v) { return not v;}); │ │ │ │ │ - 311 return negate(check(std::forward(args)...)); │ │ │ │ │ - 312 }; │ │ │ │ │ - 313} │ │ │ │ │ - 314 │ │ │ │ │ - 315 │ │ │ │ │ - 316namespace Impl { │ │ │ │ │ - 317 │ │ │ │ │ - 318 // Wrapper to capture values in a lambda for perfect forwarding. │ │ │ │ │ - 319 // This captures value types by value and reference types by reference. │ │ │ │ │ - 320 template │ │ │ │ │ - 321 struct ForwardCaptureWrapper; │ │ │ │ │ - 322 │ │ │ │ │ - 323 template │ │ │ │ │ - 324 struct ForwardCaptureWrapper │ │ │ │ │ - 325 { │ │ │ │ │ - 326 template │ │ │ │ │ - 327 ForwardCaptureWrapper(TT&& t) : t_{std::forward(t)} {} │ │ │ │ │ - 328 │ │ │ │ │ - 329 auto forward() const { return std::move(t_); } │ │ │ │ │ - 330 │ │ │ │ │ - 331 T t_; │ │ │ │ │ - 332 }; │ │ │ │ │ - 333 │ │ │ │ │ - 334 template │ │ │ │ │ - 335 struct ForwardCaptureWrapper │ │ │ │ │ - 336 { │ │ │ │ │ - 337 ForwardCaptureWrapper(T& t) : t_{t} {} │ │ │ │ │ - 338 │ │ │ │ │ - 339 T& forward() const { return t_; }; │ │ │ │ │ - 340 │ │ │ │ │ - 341 T& t_; │ │ │ │ │ - 342 }; │ │ │ │ │ - 343 │ │ │ │ │ - 344 template │ │ │ │ │ - 345 struct ForwardCaptureWrapper │ │ │ │ │ - 346 { │ │ │ │ │ - 347 ForwardCaptureWrapper(const T& t) : t_{t} {} │ │ │ │ │ - 348 │ │ │ │ │ - 349 const T& forward() const { return t_; }; │ │ │ │ │ - 350 │ │ │ │ │ - 351 const T& t_; │ │ │ │ │ - 352 }; │ │ │ │ │ - 353 │ │ │ │ │ - 354} // end namespace Dune::Functions::Impl │ │ │ │ │ - 355 │ │ │ │ │ - 356 │ │ │ │ │ - 357 │ │ │ │ │ - 371template │ │ │ │ │ -372auto forwardCapture(T&& t) │ │ │ │ │ - 373{ │ │ │ │ │ - 374 return Impl::ForwardCaptureWrapper(std::forward(t)); │ │ │ │ │ - 375} │ │ │ │ │ - 376 │ │ │ │ │ - 377 │ │ │ │ │ - 378 │ │ │ │ │ - 379} // namespace Dune::Functions │ │ │ │ │ - 380} // namespace Dune │ │ │ │ │ - 381 │ │ │ │ │ - 382 │ │ │ │ │ - 383#endif // DUNE_FUNCTIONS_COMMON_UTILITY_HH │ │ │ │ │ -functionconcepts.hh │ │ │ │ │ -Dune::Functions::ExpandTuple │ │ │ │ │ -typename Imp::ExpandTupleHelper< T, ArgTuple >::Type ExpandTuple │ │ │ │ │ -Expand tuple arguments as template arguments. │ │ │ │ │ -Definition: utility.hh:94 │ │ │ │ │ -Dune::Functions::TransformTuple │ │ │ │ │ -typename Imp::TransformTupleHelper< F, Tuples... >::Type TransformTuple │ │ │ │ │ -Transform tuple types argument using type-functor. │ │ │ │ │ -Definition: utility.hh:131 │ │ │ │ │ -Dune::Functions::Concept::isCallable │ │ │ │ │ -static constexpr auto isCallable() │ │ │ │ │ -Check if f is callable with given argument list. │ │ │ │ │ -Definition: functionconcepts.hh:47 │ │ │ │ │ -Dune::Functions::transformTuple │ │ │ │ │ -auto transformTuple(F &&f, const std::tuple< T... > &tuple) -> decltype(Imp:: │ │ │ │ │ -transformTupleHelper(std::forward< F >(f), tuple, std::index_sequence_for< T... │ │ │ │ │ ->{})) │ │ │ │ │ -Transform tuple value using a functor. │ │ │ │ │ -Definition: utility.hh:165 │ │ │ │ │ -Dune::Functions::callableCheck │ │ │ │ │ -auto callableCheck(Expression f) │ │ │ │ │ -Create a predicate for checking validity of expressions. │ │ │ │ │ -Definition: utility.hh:279 │ │ │ │ │ -Dune::Functions::forwardAsStaticIndex │ │ │ │ │ -auto forwardAsStaticIndex(const size_type &i, F &&f, Args &&... args) - │ │ │ │ │ -> decltype(f(Dune::Indices::_0, std::forward< Args >(args)...)) │ │ │ │ │ -Transform dynamic index to static index_constant. │ │ │ │ │ -Definition: utility.hh:60 │ │ │ │ │ -Dune::Functions::negatePredicate │ │ │ │ │ -auto negatePredicate(Check check) │ │ │ │ │ -Negate given predicate. │ │ │ │ │ -Definition: utility.hh:304 │ │ │ │ │ + 100 │ │ │ │ │ + 101}} // namespace Dune::Functions │ │ │ │ │ + 102 │ │ │ │ │ + 103#endif // DUNE_FUNCTIONS_COMMON_TYPE_TRAITS_HH │ │ │ │ │ +Dune::Functions::enableIfConstructible │ │ │ │ │ +typename std::enable_if< std::is_constructible< T, Args... >::value, int >:: │ │ │ │ │ +type enableIfConstructible │ │ │ │ │ +Helper to constrain forwarding constructors. │ │ │ │ │ +Definition: type_traits.hh:26 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::forwardCapture │ │ │ │ │ -auto forwardCapture(T &&t) │ │ │ │ │ -Create a capture object for perfect forwarding. │ │ │ │ │ -Definition: utility.hh:372 │ │ │ │ │ -Dune::Functions::forwardAsStaticInteger │ │ │ │ │ -auto forwardAsStaticInteger(std::integer_sequence< size_type, firstValue > │ │ │ │ │ -values, const size_type &i, F &&f, Args &&... args) -> decltype(f(std:: │ │ │ │ │ -integral_constant< size_type, firstValue >(), std::forward< Args >(args)...)) │ │ │ │ │ -Definition: utility.hh:21 │ │ │ │ │ -Dune::Functions::IntegerSequenceTuple │ │ │ │ │ -typename Imp::IntegerSequenceTupleHelper< IntegerSequence >::Type │ │ │ │ │ -IntegerSequenceTuple │ │ │ │ │ -Transform integer_sequence to tuple...> │ │ │ │ │ -Definition: utility.hh:211 │ │ │ │ │ -Dune::Functions::LastType │ │ │ │ │ -Get last entry of type list. │ │ │ │ │ -Definition: utility.hh:222 │ │ │ │ │ -Dune::Functions::LastType::type │ │ │ │ │ -typename std::tuple_element< sizeof...(T) -1, std::tuple< T... > >::type type │ │ │ │ │ -Definition: utility.hh:223 │ │ │ │ │ -Dune::Functions::RotateTuple │ │ │ │ │ -Rotate type list by one, such that last entry is moved to first position. │ │ │ │ │ -Definition: utility.hh:251 │ │ │ │ │ -Dune::Functions::RotateTuple::type │ │ │ │ │ -typename Imp::RotateHelper< std::tuple< T... >, std::make_index_sequence< │ │ │ │ │ -sizeof...(T) -1 > >::type type │ │ │ │ │ -Definition: utility.hh:252 │ │ │ │ │ +Dune::Functions::HasStaticSize │ │ │ │ │ +Check if type is a statically sized container. │ │ │ │ │ +Definition: type_traits.hh:83 │ │ │ │ │ +Dune::Functions::StaticSize │ │ │ │ │ +Obtain size of statically sized container. │ │ │ │ │ +Definition: type_traits.hh:97 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00047.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: interfaces.hh File Reference │ │ │ │ +dune-functions: utility.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -64,34 +64,91 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
interfaces.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Typedefs | │ │ │ │ +Functions
│ │ │ │ +
utility.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ +
#include <utility>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <dune/common/overloadset.hh>
│ │ │ │ +#include <dune/common/indices.hh>
│ │ │ │ +#include <dune/functions/common/functionconcepts.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::PolymorphicType< Interface >
 Base class with polymorphic type boiler plate code. More...
struct  Dune::Functions::LastType< T >
 Get last entry of type list. More...
 
struct  Dune::Functions::RotateTuple< T >
 Rotate type list by one, such that last entry is moved to first position. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Typedefs

template<template< class... > class T, class ArgTuple >
using Dune::Functions::ExpandTuple = typename Imp::ExpandTupleHelper< T, ArgTuple >::Type
 Expand tuple arguments as template arguments. More...
 
template<template< class... > class F, class... Tuples>
using Dune::Functions::TransformTuple = typename Imp::TransformTupleHelper< F, Tuples... >::Type
 Transform tuple types argument using type-functor. More...
 
template<class IntegerSequence >
using Dune::Functions::IntegerSequenceTuple = typename Imp::IntegerSequenceTupleHelper< IntegerSequence >::Type
 Transform integer_sequence<I,k...> to tuple<integral_constant<I,k>...> More...
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<class F , class size_type , size_type firstValue, class... Args>
auto Dune::Functions::forwardAsStaticInteger (std::integer_sequence< size_type, firstValue > values, const size_type &i, F &&f, Args &&... args) -> decltype(f(std::integral_constant< size_type, firstValue >(), std::forward< Args >(args)...))
 
template<class F , class size_type , size_type firstValue, size_type secondValue, size_type... otherValues, class... Args>
auto Dune::Functions::forwardAsStaticInteger (std::integer_sequence< size_type, firstValue, secondValue, otherValues... > values, const size_type i, F &&f, Args &&... args) -> decltype(f(std::integral_constant< size_type, firstValue >(), std::forward< Args >(args)...))
 
template<std::size_t end, class F , class size_type , class... Args>
auto Dune::Functions::forwardAsStaticIndex (const size_type &i, F &&f, Args &&... args) -> decltype(f(Dune::Indices::_0, std::forward< Args >(args)...))
 Transform dynamic index to static index_constant. More...
 
template<class F , class... T>
auto Dune::Functions::transformTuple (F &&f, const std::tuple< T... > &tuple) -> decltype(Imp::transformTupleHelper(std::forward< F >(f), tuple, std::index_sequence_for< T... >{}))
 Transform tuple value using a functor. More...
 
template<class F , class... T1, class... T2>
auto Dune::Functions::transformTuple (F &&f, const std::tuple< T1... > &tuple1, const std::tuple< T2... > &tuple2) -> decltype(Imp::transformTupleHelper(std::forward< F >(f), tuple1, tuple2, std::index_sequence_for< T1... >{}))
 Transform tuple value using a binary functor. More...
 
template<class Expression >
auto Dune::Functions::callableCheck (Expression f)
 Create a predicate for checking validity of expressions. More...
 
template<class Check >
auto Dune::Functions::negatePredicate (Check check)
 Negate given predicate. More...
 
template<class T >
auto Dune::Functions::forwardCapture (T &&t)
 Create a capture object for perfect forwarding. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,23 +5,94 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -Classes | Namespaces │ │ │ │ │ -interfaces.hh File Reference │ │ │ │ │ +Classes | Namespaces | Typedefs | Functions │ │ │ │ │ +utility.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::PolymorphicType<_Interface_> │ │ │ │ │ -  Base class with polymorphic type boiler plate code. More... │ │ │ │ │ +struct  Dune::Functions::LastType<_T_> │ │ │ │ │ +  Get last entry of type list. More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::RotateTuple<_T_> │ │ │ │ │ +  Rotate type list by one, such that last entry is moved to first │ │ │ │ │ + position. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ + Typedefs │ │ │ │ │ +template class T, class ArgTuple > │ │ │ │ │ +using Dune::Functions::ExpandTuple = typename Imp::ExpandTupleHelper< T, │ │ │ │ │ + ArgTuple >::Type │ │ │ │ │ +  Expand tuple arguments as template arguments. More... │ │ │ │ │ +  │ │ │ │ │ +template class F, class... Tuples> │ │ │ │ │ +using Dune::Functions::TransformTuple = typename Imp::TransformTupleHelper< F, │ │ │ │ │ + Tuples... >::Type │ │ │ │ │ +  Transform tuple types argument using type-functor. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +using Dune::Functions::IntegerSequenceTuple = typename Imp:: │ │ │ │ │ + IntegerSequenceTupleHelper< IntegerSequence >::Type │ │ │ │ │ +  Transform integer_sequence to tuple...> │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::forwardAsStaticInteger (std::integer_sequence< │ │ │ │ │ + size_type, firstValue > values, const size_type &i, F &&f, Args &&... │ │ │ │ │ + args) -> decltype(f(std::integral_constant< size_type, firstValue >(), │ │ │ │ │ + std::forward< Args >(args)...)) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::forwardAsStaticInteger (std::integer_sequence< │ │ │ │ │ + size_type, firstValue, secondValue, otherValues... > values, const │ │ │ │ │ + size_type i, F &&f, Args &&... args) -> decltype(f(std:: │ │ │ │ │ + integral_constant< size_type, firstValue >(), std::forward< Args > │ │ │ │ │ + (args)...)) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::forwardAsStaticIndex (const size_type &i, F &&f, Args │ │ │ │ │ + &&... args) -> decltype(f(Dune::Indices::_0, std::forward< Args > │ │ │ │ │ + (args)...)) │ │ │ │ │ +  Transform dynamic index to static index_constant. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::transformTuple (F &&f, const std::tuple< T... > &tuple) │ │ │ │ │ + -> decltype(Imp::transformTupleHelper(std::forward< F >(f), tuple, std:: │ │ │ │ │ + index_sequence_for< T... >{})) │ │ │ │ │ +  Transform tuple value using a functor. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::transformTuple (F &&f, const std::tuple< T1... > │ │ │ │ │ + &tuple1, const std::tuple< T2... > &tuple2) -> decltype(Imp:: │ │ │ │ │ + transformTupleHelper(std::forward< F >(f), tuple1, tuple2, std:: │ │ │ │ │ + index_sequence_for< T1... >{})) │ │ │ │ │ +  Transform tuple value using a binary functor. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::callableCheck (Expression f) │ │ │ │ │ +  Create a predicate for checking validity of expressions. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::negatePredicate (Check check) │ │ │ │ │ +  Negate given predicate. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::forwardCapture (T &&t) │ │ │ │ │ +  Create a capture object for perfect forwarding. More... │ │ │ │ │ +  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00047_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: interfaces.hh Source File │ │ │ │ +dune-functions: utility.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,56 +62,284 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
interfaces.hh
│ │ │ │ +
utility.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#ifndef DUNE_FUNCTIONS_COMMON_INTERFACES_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_COMMON_INTERFACES_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_COMMON_UTILITY_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_COMMON_UTILITY_HH
│ │ │ │
5
│ │ │ │ -
6#include <type_traits>
│ │ │ │ -
7
│ │ │ │ -
8
│ │ │ │ -
9namespace Dune {
│ │ │ │ -
10namespace Functions {
│ │ │ │ -
11
│ │ │ │ +
6
│ │ │ │ +
7#include <utility>
│ │ │ │ +
8#include <type_traits>
│ │ │ │ +
9
│ │ │ │ +
10#include <dune/common/overloadset.hh>
│ │ │ │ +
11#include <dune/common/indices.hh>
│ │ │ │
12
│ │ │ │ -
13
│ │ │ │ -
23template<class Interface>
│ │ │ │ - │ │ │ │ -
25{
│ │ │ │ -
26public:
│ │ │ │ -
27
│ │ │ │ - │ │ │ │ -
30 {}
│ │ │ │ -
31
│ │ │ │ -
40 virtual Interface* clone() const = 0;
│ │ │ │ -
41
│ │ │ │ -
51 virtual Interface* clone(void* buffer) const = 0;
│ │ │ │ -
52
│ │ │ │ -
62 virtual Interface* move(void* buffer) = 0;
│ │ │ │ -
63};
│ │ │ │ -
64
│ │ │ │ + │ │ │ │ +
14
│ │ │ │ +
15namespace Dune {
│ │ │ │ +
16namespace Functions {
│ │ │ │ +
17
│ │ │ │ +
18
│ │ │ │ +
19
│ │ │ │ +
20template<class F, class size_type, size_type firstValue, class... Args>
│ │ │ │ +
21auto forwardAsStaticInteger(std::integer_sequence<size_type, firstValue> values, const size_type& i, F&& f, Args&&... args)
│ │ │ │ +
22 ->decltype(f(std::integral_constant<size_type, firstValue>(), std::forward<Args>(args)...))
│ │ │ │ +
23{
│ │ │ │ +
24 return f(std::integral_constant<size_type, firstValue>(), std::forward<Args>(args)...);
│ │ │ │ +
25}
│ │ │ │ +
26
│ │ │ │ +
27template<class F, class size_type, size_type firstValue, size_type secondValue, size_type... otherValues, class... Args>
│ │ │ │ +
28auto forwardAsStaticInteger(std::integer_sequence<size_type, firstValue, secondValue, otherValues...> values, const size_type i, F&& f, Args&&... args)
│ │ │ │ +
29 ->decltype(f(std::integral_constant<size_type, firstValue>(), std::forward<Args>(args)...))
│ │ │ │ +
30{
│ │ │ │ +
31 if (i==firstValue)
│ │ │ │ +
32 return f(std::integral_constant<size_type, firstValue>(), std::forward<Args>(args)...);
│ │ │ │ +
33 return forwardAsStaticInteger(std::integer_sequence<size_type, secondValue, otherValues...>(), i, std::forward<F>(f), std::forward<Args>(args)...);
│ │ │ │ +
34}
│ │ │ │ +
35
│ │ │ │ +
36
│ │ │ │ +
37
│ │ │ │ +
59template<std::size_t end, class F, class size_type, class... Args>
│ │ │ │ +
60auto forwardAsStaticIndex(const size_type& i, F&& f, Args&&... args)
│ │ │ │ +
61 ->decltype(f(Dune::Indices::_0, std::forward<Args>(args)...))
│ │ │ │ +
62{
│ │ │ │ +
63 return forwardAsStaticInteger(std::make_index_sequence<end>{}, i, std::forward<F>(f), std::forward<Args>(args)...);
│ │ │ │ +
64}
│ │ │ │
65
│ │ │ │
66
│ │ │ │ -
67}} // namespace Dune::Functions
│ │ │ │ -
68
│ │ │ │ -
69#endif // DUNE_FUNCTIONS_COMMON_EXTENDED_CLONEABLE_HH
│ │ │ │ +
67
│ │ │ │ +
68namespace Imp {
│ │ │ │ +
69
│ │ │ │ +
70 template<template<class...> class T, class List>
│ │ │ │ +
71 struct ExpandTupleHelper
│ │ │ │ +
72 {};
│ │ │ │ +
73
│ │ │ │ +
74 template<template<class...> class T, template<class...> class ListType, class... Args>
│ │ │ │ +
75 struct ExpandTupleHelper<T, ListType<Args...>>
│ │ │ │ +
76 {
│ │ │ │ +
77 using Type = T<Args...>;
│ │ │ │ +
78 };
│ │ │ │ +
79
│ │ │ │ +
80} // end namespace Imp
│ │ │ │ +
81
│ │ │ │ +
93template<template<class...> class T, class ArgTuple>
│ │ │ │ +
94using ExpandTuple = typename Imp::ExpandTupleHelper<T, ArgTuple>::Type;
│ │ │ │ +
95
│ │ │ │ +
96
│ │ │ │ +
97
│ │ │ │ +
98namespace Imp {
│ │ │ │ +
99
│ │ │ │ +
100 template<template<class...> class T, class... Tuple>
│ │ │ │ +
101 struct TransformTupleHelper
│ │ │ │ +
102 {};
│ │ │ │ +
103
│ │ │ │ +
104 template<template<class...> class T, class... Args1>
│ │ │ │ +
105 struct TransformTupleHelper<T, typename std::tuple<Args1...>>
│ │ │ │ +
106 {
│ │ │ │ +
107 using Type = std::tuple<T<Args1>...>;
│ │ │ │ +
108 };
│ │ │ │ +
109
│ │ │ │ +
110 template<template<class...> class T, class... Args1, class... Args2>
│ │ │ │ +
111 struct TransformTupleHelper<T, typename std::tuple<Args1...>, typename std::tuple<Args2...>>
│ │ │ │ +
112 {
│ │ │ │ +
113 using Type = std::tuple<T<Args1, Args2>...>;
│ │ │ │ +
114 };
│ │ │ │ +
115
│ │ │ │ +
116} // end namespace Imp
│ │ │ │ +
117
│ │ │ │ +
130template<template<class...> class F, class... Tuples>
│ │ │ │ +
131using TransformTuple = typename Imp::TransformTupleHelper<F, Tuples...>::Type;
│ │ │ │ +
132
│ │ │ │ +
133
│ │ │ │ +
134
│ │ │ │ +
135namespace Imp {
│ │ │ │ +
136
│ │ │ │ +
137 template<class F, class... T, std::size_t... k>
│ │ │ │ +
138 auto transformTupleHelper(F&& f, const std::tuple<T...>& tuple, std::index_sequence<k...>)
│ │ │ │ +
139 -> decltype(std::make_tuple(f(std::get<k>(tuple))...))
│ │ │ │ +
140 {
│ │ │ │ +
141 return std::make_tuple(f(std::get<k>(tuple))...);
│ │ │ │ +
142 }
│ │ │ │ +
143
│ │ │ │ +
144 template<class F, class... T1, class...T2, std::size_t... k>
│ │ │ │ +
145 auto transformTupleHelper(F&& f, const std::tuple<T1...>& tuple1, const std::tuple<T2...>& tuple2, std::index_sequence<k...>)
│ │ │ │ +
146 -> decltype(std::make_tuple(f(std::get<k>(tuple1), std::get<k>(tuple2))...))
│ │ │ │ +
147 {
│ │ │ │ +
148 return std::make_tuple(f(std::get<k>(tuple1), std::get<k>(tuple2))...);
│ │ │ │ +
149 }
│ │ │ │ +
150
│ │ │ │ +
151} // end namespace Imp
│ │ │ │ +
152
│ │ │ │ +
164template<class F, class... T>
│ │ │ │ +
165auto transformTuple(F&& f, const std::tuple<T...>& tuple)
│ │ │ │ +
166 -> decltype(Imp::transformTupleHelper(std::forward<F>(f), tuple, std::index_sequence_for<T...>{}))
│ │ │ │ +
167{
│ │ │ │ +
168 return Imp::transformTupleHelper(std::forward<F>(f), tuple, std::index_sequence_for<T...>{});
│ │ │ │ +
169}
│ │ │ │ +
170
│ │ │ │ +
184template<class F, class... T1, class... T2>
│ │ │ │ +
185auto transformTuple(F&& f, const std::tuple<T1...>& tuple1, const std::tuple<T2...>& tuple2)
│ │ │ │ +
186 -> decltype(Imp::transformTupleHelper(std::forward<F>(f), tuple1, tuple2, std::index_sequence_for<T1...>{}))
│ │ │ │ +
187{
│ │ │ │ +
188 return Imp::transformTupleHelper(std::forward<F>(f), tuple1, tuple2, std::index_sequence_for<T1...>{});
│ │ │ │ +
189}
│ │ │ │ +
190
│ │ │ │ +
191
│ │ │ │ +
192
│ │ │ │ +
193namespace Imp {
│ │ │ │ +
194
│ │ │ │ +
195 template<class IntegerSequence>
│ │ │ │ +
196 struct IntegerSequenceTupleHelper
│ │ │ │ +
197 {};
│ │ │ │ +
198
│ │ │ │ +
199 template<class I, I... k>
│ │ │ │ +
200 struct IntegerSequenceTupleHelper<std::integer_sequence<I, k...>>
│ │ │ │ +
201 {
│ │ │ │ +
202 using Type = std::tuple<std::integral_constant<I, k>...>;
│ │ │ │ +
203 };
│ │ │ │ +
204
│ │ │ │ +
205} // end namespace Imp
│ │ │ │ +
206
│ │ │ │ +
210template<class IntegerSequence>
│ │ │ │ +
211using IntegerSequenceTuple= typename Imp::IntegerSequenceTupleHelper<IntegerSequence>::Type;
│ │ │ │ +
212
│ │ │ │ +
213
│ │ │ │ +
214
│ │ │ │ +
220template<class... T>
│ │ │ │ + │ │ │ │ +
222{
│ │ │ │ +
223 using type = typename std::tuple_element<sizeof...(T)-1, std::tuple<T...>>::type;
│ │ │ │ +
224};
│ │ │ │ +
225
│ │ │ │ +
226
│ │ │ │ +
227
│ │ │ │ +
228namespace Imp {
│ │ │ │ +
229
│ │ │ │ +
230template<class T, class I>
│ │ │ │ +
231struct RotateHelper;
│ │ │ │ +
232
│ │ │ │ +
233template<class... T, std::size_t... I>
│ │ │ │ +
234struct RotateHelper<std::tuple<T...>, std::index_sequence<I...> >
│ │ │ │ +
235{
│ │ │ │ +
236 using type = typename std::tuple<typename LastType<T...>::type, typename std::tuple_element<I,std::tuple<T...>>::type...>;
│ │ │ │ +
237};
│ │ │ │ +
238
│ │ │ │ +
239} // end namespace Imp
│ │ │ │ +
240
│ │ │ │ +
241
│ │ │ │ +
249template<class... T>
│ │ │ │ + │ │ │ │ +
251{
│ │ │ │ +
252 using type = typename Imp::RotateHelper<std::tuple<T...>, std::make_index_sequence<sizeof...(T)-1>>::type;
│ │ │ │ +
253};
│ │ │ │ +
254
│ │ │ │ +
255
│ │ │ │ +
256
│ │ │ │ +
278template<class Expression>
│ │ │ │ +
279auto callableCheck(Expression f)
│ │ │ │ +
280{
│ │ │ │ +
281 return [f](auto&&... args){
│ │ │ │ +
282 return Functions::Concept::isCallable(f, std::forward<decltype(args)>(args)...);
│ │ │ │ +
283 };
│ │ │ │ +
284}
│ │ │ │ +
285
│ │ │ │ +
286
│ │ │ │ +
287
│ │ │ │ +
303template<class Check>
│ │ │ │ +
304auto negatePredicate(Check check)
│ │ │ │ +
305{
│ │ │ │ +
306 return [check](auto&&... args){
│ │ │ │ +
307 auto negate = overload(
│ │ │ │ +
308 [](std::true_type) { return std::false_type{};},
│ │ │ │ +
309 [](std::false_type) { return std::true_type{};},
│ │ │ │ +
310 [](bool v) { return not v;});
│ │ │ │ +
311 return negate(check(std::forward<decltype(args)>(args)...));
│ │ │ │ +
312 };
│ │ │ │ +
313}
│ │ │ │ +
314
│ │ │ │ +
315
│ │ │ │ +
316namespace Impl {
│ │ │ │ +
317
│ │ │ │ +
318 // Wrapper to capture values in a lambda for perfect forwarding.
│ │ │ │ +
319 // This captures value types by value and reference types by reference.
│ │ │ │ +
320 template <typename T>
│ │ │ │ +
321 struct ForwardCaptureWrapper;
│ │ │ │ +
322
│ │ │ │ +
323 template <typename T>
│ │ │ │ +
324 struct ForwardCaptureWrapper
│ │ │ │ +
325 {
│ │ │ │ +
326 template <typename TT>
│ │ │ │ +
327 ForwardCaptureWrapper(TT&& t) : t_{std::forward<TT>(t)} {}
│ │ │ │ +
328
│ │ │ │ +
329 auto forward() const { return std::move(t_); }
│ │ │ │ +
330
│ │ │ │ +
331 T t_;
│ │ │ │ +
332 };
│ │ │ │ +
333
│ │ │ │ +
334 template <typename T>
│ │ │ │ +
335 struct ForwardCaptureWrapper<T&>
│ │ │ │ +
336 {
│ │ │ │ +
337 ForwardCaptureWrapper(T& t) : t_{t} {}
│ │ │ │ +
338
│ │ │ │ +
339 T& forward() const { return t_; };
│ │ │ │ +
340
│ │ │ │ +
341 T& t_;
│ │ │ │ +
342 };
│ │ │ │ +
343
│ │ │ │ +
344 template <typename T>
│ │ │ │ +
345 struct ForwardCaptureWrapper<const T&>
│ │ │ │ +
346 {
│ │ │ │ +
347 ForwardCaptureWrapper(const T& t) : t_{t} {}
│ │ │ │ +
348
│ │ │ │ +
349 const T& forward() const { return t_; };
│ │ │ │ +
350
│ │ │ │ +
351 const T& t_;
│ │ │ │ +
352 };
│ │ │ │ +
353
│ │ │ │ +
354} // end namespace Dune::Functions::Impl
│ │ │ │ +
355
│ │ │ │ +
356
│ │ │ │ +
357
│ │ │ │ +
371template <class T>
│ │ │ │ +
372auto forwardCapture(T&& t)
│ │ │ │ +
373{
│ │ │ │ +
374 return Impl::ForwardCaptureWrapper<T>(std::forward<T>(t));
│ │ │ │ +
375}
│ │ │ │ +
376
│ │ │ │ +
377
│ │ │ │ +
378
│ │ │ │ +
379} // namespace Dune::Functions
│ │ │ │ +
380} // namespace Dune
│ │ │ │ +
381
│ │ │ │ +
382
│ │ │ │ +
383#endif // DUNE_FUNCTIONS_COMMON_UTILITY_HH
│ │ │ │ + │ │ │ │ +
typename Imp::ExpandTupleHelper< T, ArgTuple >::Type ExpandTuple
Expand tuple arguments as template arguments.
Definition: utility.hh:94
│ │ │ │ +
typename Imp::TransformTupleHelper< F, Tuples... >::Type TransformTuple
Transform tuple types argument using type-functor.
Definition: utility.hh:131
│ │ │ │ +
static constexpr auto isCallable()
Check if f is callable with given argument list.
Definition: functionconcepts.hh:47
│ │ │ │ +
auto transformTuple(F &&f, const std::tuple< T... > &tuple) -> decltype(Imp::transformTupleHelper(std::forward< F >(f), tuple, std::index_sequence_for< T... >{}))
Transform tuple value using a functor.
Definition: utility.hh:165
│ │ │ │ +
auto callableCheck(Expression f)
Create a predicate for checking validity of expressions.
Definition: utility.hh:279
│ │ │ │ +
auto forwardAsStaticIndex(const size_type &i, F &&f, Args &&... args) -> decltype(f(Dune::Indices::_0, std::forward< Args >(args)...))
Transform dynamic index to static index_constant.
Definition: utility.hh:60
│ │ │ │ +
auto negatePredicate(Check check)
Negate given predicate.
Definition: utility.hh:304
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
Base class with polymorphic type boiler plate code.
Definition: interfaces.hh:25
│ │ │ │ -
virtual Interface * clone(void *buffer) const =0
Clones the object into buffer.
│ │ │ │ -
virtual Interface * clone() const =0
Clones the object.
│ │ │ │ -
virtual Interface * move(void *buffer)=0
Move object into buffer.
│ │ │ │ -
virtual ~PolymorphicType()
Destructor.
Definition: interfaces.hh:29
│ │ │ │ +
auto forwardCapture(T &&t)
Create a capture object for perfect forwarding.
Definition: utility.hh:372
│ │ │ │ +
auto forwardAsStaticInteger(std::integer_sequence< size_type, firstValue > values, const size_type &i, F &&f, Args &&... args) -> decltype(f(std::integral_constant< size_type, firstValue >(), std::forward< Args >(args)...))
Definition: utility.hh:21
│ │ │ │ +
typename Imp::IntegerSequenceTupleHelper< IntegerSequence >::Type IntegerSequenceTuple
Transform integer_sequence<I,k...> to tuple<integral_constant<I,k>...>
Definition: utility.hh:211
│ │ │ │ +
Get last entry of type list.
Definition: utility.hh:222
│ │ │ │ +
typename std::tuple_element< sizeof...(T) -1, std::tuple< T... > >::type type
Definition: utility.hh:223
│ │ │ │ +
Rotate type list by one, such that last entry is moved to first position.
Definition: utility.hh:251
│ │ │ │ +
typename Imp::RotateHelper< std::tuple< T... >, std::make_index_sequence< sizeof...(T) -1 > >::type type
Definition: utility.hh:252
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,63 +5,349 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -interfaces.hh │ │ │ │ │ +utility.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#ifndef DUNE_FUNCTIONS_COMMON_INTERFACES_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_COMMON_INTERFACES_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_COMMON_UTILITY_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_COMMON_UTILITY_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7 │ │ │ │ │ - 8 │ │ │ │ │ - 9namespace Dune { │ │ │ │ │ - 10namespace Functions { │ │ │ │ │ - 11 │ │ │ │ │ + 6 │ │ │ │ │ + 7#include │ │ │ │ │ + 8#include │ │ │ │ │ + 9 │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ 12 │ │ │ │ │ - 13 │ │ │ │ │ - 23template │ │ │ │ │ -24class PolymorphicType │ │ │ │ │ - 25{ │ │ │ │ │ - 26public: │ │ │ │ │ - 27 │ │ │ │ │ -29 virtual ~PolymorphicType() │ │ │ │ │ - 30 {} │ │ │ │ │ - 31 │ │ │ │ │ -40 virtual Interface* clone() const = 0; │ │ │ │ │ - 41 │ │ │ │ │ -51 virtual Interface* clone(void* buffer) const = 0; │ │ │ │ │ - 52 │ │ │ │ │ -62 virtual Interface* move(void* buffer) = 0; │ │ │ │ │ - 63}; │ │ │ │ │ - 64 │ │ │ │ │ + 13#include │ │ │ │ │ + 14 │ │ │ │ │ + 15namespace Dune { │ │ │ │ │ + 16namespace Functions { │ │ │ │ │ + 17 │ │ │ │ │ + 18 │ │ │ │ │ + 19 │ │ │ │ │ + 20template │ │ │ │ │ +21auto forwardAsStaticInteger(std::integer_sequence │ │ │ │ │ +values, const size_type& i, F&& f, Args&&... args) │ │ │ │ │ + 22 ->decltype(f(std::integral_constant(), std:: │ │ │ │ │ +forward(args)...)) │ │ │ │ │ + 23{ │ │ │ │ │ + 24 return f(std::integral_constant(), std:: │ │ │ │ │ +forward(args)...); │ │ │ │ │ + 25} │ │ │ │ │ + 26 │ │ │ │ │ + 27template │ │ │ │ │ +28auto forwardAsStaticInteger(std::integer_sequence values, const size_type i, F&& f, Args&&... args) │ │ │ │ │ + 29 ->decltype(f(std::integral_constant(), std:: │ │ │ │ │ +forward(args)...)) │ │ │ │ │ + 30{ │ │ │ │ │ + 31 if (i==firstValue) │ │ │ │ │ + 32 return f(std::integral_constant(), std:: │ │ │ │ │ +forward(args)...); │ │ │ │ │ + 33 return forwardAsStaticInteger(std::integer_sequence(), i, std::forward(f), std::forward(args)...); │ │ │ │ │ + 34} │ │ │ │ │ + 35 │ │ │ │ │ + 36 │ │ │ │ │ + 37 │ │ │ │ │ + 59template │ │ │ │ │ +60auto forwardAsStaticIndex(const size_type& i, F&& f, Args&&... args) │ │ │ │ │ + 61 ->decltype(f(Dune::Indices::_0, std::forward(args)...)) │ │ │ │ │ + 62{ │ │ │ │ │ + 63 return forwardAsStaticInteger(std::make_index_sequence{}, i, std:: │ │ │ │ │ +forward(f), std::forward(args)...); │ │ │ │ │ + 64} │ │ │ │ │ 65 │ │ │ │ │ 66 │ │ │ │ │ - 67}} // namespace Dune::Functions │ │ │ │ │ - 68 │ │ │ │ │ - 69#endif // DUNE_FUNCTIONS_COMMON_EXTENDED_CLONEABLE_HH │ │ │ │ │ + 67 │ │ │ │ │ + 68namespace Imp { │ │ │ │ │ + 69 │ │ │ │ │ + 70 template class T, class List> │ │ │ │ │ + 71 struct ExpandTupleHelper │ │ │ │ │ + 72 {}; │ │ │ │ │ + 73 │ │ │ │ │ + 74 template class T, template class ListType, │ │ │ │ │ +class... Args> │ │ │ │ │ + 75 struct ExpandTupleHelper> │ │ │ │ │ + 76 { │ │ │ │ │ + 77 using Type = T; │ │ │ │ │ + 78 }; │ │ │ │ │ + 79 │ │ │ │ │ + 80} // end namespace Imp │ │ │ │ │ + 81 │ │ │ │ │ + 93template class T, class ArgTuple> │ │ │ │ │ +94using ExpandTuple = typename Imp::ExpandTupleHelper::Type; │ │ │ │ │ + 95 │ │ │ │ │ + 96 │ │ │ │ │ + 97 │ │ │ │ │ + 98namespace Imp { │ │ │ │ │ + 99 │ │ │ │ │ + 100 template class T, class... Tuple> │ │ │ │ │ + 101 struct TransformTupleHelper │ │ │ │ │ + 102 {}; │ │ │ │ │ + 103 │ │ │ │ │ + 104 template class T, class... Args1> │ │ │ │ │ + 105 struct TransformTupleHelper> │ │ │ │ │ + 106 { │ │ │ │ │ + 107 using Type = std::tuple...>; │ │ │ │ │ + 108 }; │ │ │ │ │ + 109 │ │ │ │ │ + 110 template class T, class... Args1, class... Args2> │ │ │ │ │ + 111 struct TransformTupleHelper, typename │ │ │ │ │ +std::tuple> │ │ │ │ │ + 112 { │ │ │ │ │ + 113 using Type = std::tuple...>; │ │ │ │ │ + 114 }; │ │ │ │ │ + 115 │ │ │ │ │ + 116} // end namespace Imp │ │ │ │ │ + 117 │ │ │ │ │ + 130template class F, class... Tuples> │ │ │ │ │ +131using TransformTuple = typename Imp::TransformTupleHelper:: │ │ │ │ │ +Type; │ │ │ │ │ + 132 │ │ │ │ │ + 133 │ │ │ │ │ + 134 │ │ │ │ │ + 135namespace Imp { │ │ │ │ │ + 136 │ │ │ │ │ + 137 template │ │ │ │ │ + 138 auto transformTupleHelper(F&& f, const std::tuple& tuple, std:: │ │ │ │ │ +index_sequence) │ │ │ │ │ + 139 -> decltype(std::make_tuple(f(std::get(tuple))...)) │ │ │ │ │ + 140 { │ │ │ │ │ + 141 return std::make_tuple(f(std::get(tuple))...); │ │ │ │ │ + 142 } │ │ │ │ │ + 143 │ │ │ │ │ + 144 template │ │ │ │ │ + 145 auto transformTupleHelper(F&& f, const std::tuple& tuple1, const │ │ │ │ │ +std::tuple& tuple2, std::index_sequence) │ │ │ │ │ + 146 -> decltype(std::make_tuple(f(std::get(tuple1), std::get │ │ │ │ │ +(tuple2))...)) │ │ │ │ │ + 147 { │ │ │ │ │ + 148 return std::make_tuple(f(std::get(tuple1), std::get(tuple2))...); │ │ │ │ │ + 149 } │ │ │ │ │ + 150 │ │ │ │ │ + 151} // end namespace Imp │ │ │ │ │ + 152 │ │ │ │ │ + 164template │ │ │ │ │ +165auto transformTuple(F&& f, const std::tuple& tuple) │ │ │ │ │ + 166 -> decltype(Imp::transformTupleHelper(std::forward(f), tuple, std:: │ │ │ │ │ +index_sequence_for{})) │ │ │ │ │ + 167{ │ │ │ │ │ + 168 return Imp::transformTupleHelper(std::forward(f), tuple, std:: │ │ │ │ │ +index_sequence_for{}); │ │ │ │ │ + 169} │ │ │ │ │ + 170 │ │ │ │ │ + 184template │ │ │ │ │ +185auto transformTuple(F&& f, const std::tuple& tuple1, const std:: │ │ │ │ │ +tuple& tuple2) │ │ │ │ │ + 186 -> decltype(Imp::transformTupleHelper(std::forward(f), tuple1, tuple2, │ │ │ │ │ +std::index_sequence_for{})) │ │ │ │ │ + 187{ │ │ │ │ │ + 188 return Imp::transformTupleHelper(std::forward(f), tuple1, tuple2, std:: │ │ │ │ │ +index_sequence_for{}); │ │ │ │ │ + 189} │ │ │ │ │ + 190 │ │ │ │ │ + 191 │ │ │ │ │ + 192 │ │ │ │ │ + 193namespace Imp { │ │ │ │ │ + 194 │ │ │ │ │ + 195 template │ │ │ │ │ + 196 struct IntegerSequenceTupleHelper │ │ │ │ │ + 197 {}; │ │ │ │ │ + 198 │ │ │ │ │ + 199 template │ │ │ │ │ + 200 struct IntegerSequenceTupleHelper> │ │ │ │ │ + 201 { │ │ │ │ │ + 202 using Type = std::tuple...>; │ │ │ │ │ + 203 }; │ │ │ │ │ + 204 │ │ │ │ │ + 205} // end namespace Imp │ │ │ │ │ + 206 │ │ │ │ │ + 210template │ │ │ │ │ +211using IntegerSequenceTuple= typename Imp:: │ │ │ │ │ +IntegerSequenceTupleHelper::Type; │ │ │ │ │ + 212 │ │ │ │ │ + 213 │ │ │ │ │ + 214 │ │ │ │ │ + 220template │ │ │ │ │ +221struct LastType │ │ │ │ │ + 222{ │ │ │ │ │ +223 using type = typename std::tuple_element>::type; │ │ │ │ │ + 224}; │ │ │ │ │ + 225 │ │ │ │ │ + 226 │ │ │ │ │ + 227 │ │ │ │ │ + 228namespace Imp { │ │ │ │ │ + 229 │ │ │ │ │ + 230template │ │ │ │ │ + 231struct RotateHelper; │ │ │ │ │ + 232 │ │ │ │ │ + 233template │ │ │ │ │ + 234struct RotateHelper, std::index_sequence > │ │ │ │ │ + 235{ │ │ │ │ │ + 236 using type = typename std::tuple::type, typename │ │ │ │ │ +std::tuple_element>::type...>; │ │ │ │ │ + 237}; │ │ │ │ │ + 238 │ │ │ │ │ + 239} // end namespace Imp │ │ │ │ │ + 240 │ │ │ │ │ + 241 │ │ │ │ │ + 249template │ │ │ │ │ +250struct RotateTuple │ │ │ │ │ + 251{ │ │ │ │ │ +252 using type = typename Imp::RotateHelper, std:: │ │ │ │ │ +make_index_sequence>::type; │ │ │ │ │ + 253}; │ │ │ │ │ + 254 │ │ │ │ │ + 255 │ │ │ │ │ + 256 │ │ │ │ │ + 278template │ │ │ │ │ +279auto callableCheck(Expression f) │ │ │ │ │ + 280{ │ │ │ │ │ + 281 return [f](auto&&... args){ │ │ │ │ │ + 282 return Functions::Concept::isCallable(f, std::forward │ │ │ │ │ +(args)...); │ │ │ │ │ + 283 }; │ │ │ │ │ + 284} │ │ │ │ │ + 285 │ │ │ │ │ + 286 │ │ │ │ │ + 287 │ │ │ │ │ + 303template │ │ │ │ │ +304auto negatePredicate(Check check) │ │ │ │ │ + 305{ │ │ │ │ │ + 306 return [check](auto&&... args){ │ │ │ │ │ + 307 auto negate = overload( │ │ │ │ │ + 308 [](std::true_type) { return std::false_type{};}, │ │ │ │ │ + 309 [](std::false_type) { return std::true_type{};}, │ │ │ │ │ + 310 [](bool v) { return not v;}); │ │ │ │ │ + 311 return negate(check(std::forward(args)...)); │ │ │ │ │ + 312 }; │ │ │ │ │ + 313} │ │ │ │ │ + 314 │ │ │ │ │ + 315 │ │ │ │ │ + 316namespace Impl { │ │ │ │ │ + 317 │ │ │ │ │ + 318 // Wrapper to capture values in a lambda for perfect forwarding. │ │ │ │ │ + 319 // This captures value types by value and reference types by reference. │ │ │ │ │ + 320 template │ │ │ │ │ + 321 struct ForwardCaptureWrapper; │ │ │ │ │ + 322 │ │ │ │ │ + 323 template │ │ │ │ │ + 324 struct ForwardCaptureWrapper │ │ │ │ │ + 325 { │ │ │ │ │ + 326 template │ │ │ │ │ + 327 ForwardCaptureWrapper(TT&& t) : t_{std::forward(t)} {} │ │ │ │ │ + 328 │ │ │ │ │ + 329 auto forward() const { return std::move(t_); } │ │ │ │ │ + 330 │ │ │ │ │ + 331 T t_; │ │ │ │ │ + 332 }; │ │ │ │ │ + 333 │ │ │ │ │ + 334 template │ │ │ │ │ + 335 struct ForwardCaptureWrapper │ │ │ │ │ + 336 { │ │ │ │ │ + 337 ForwardCaptureWrapper(T& t) : t_{t} {} │ │ │ │ │ + 338 │ │ │ │ │ + 339 T& forward() const { return t_; }; │ │ │ │ │ + 340 │ │ │ │ │ + 341 T& t_; │ │ │ │ │ + 342 }; │ │ │ │ │ + 343 │ │ │ │ │ + 344 template │ │ │ │ │ + 345 struct ForwardCaptureWrapper │ │ │ │ │ + 346 { │ │ │ │ │ + 347 ForwardCaptureWrapper(const T& t) : t_{t} {} │ │ │ │ │ + 348 │ │ │ │ │ + 349 const T& forward() const { return t_; }; │ │ │ │ │ + 350 │ │ │ │ │ + 351 const T& t_; │ │ │ │ │ + 352 }; │ │ │ │ │ + 353 │ │ │ │ │ + 354} // end namespace Dune::Functions::Impl │ │ │ │ │ + 355 │ │ │ │ │ + 356 │ │ │ │ │ + 357 │ │ │ │ │ + 371template │ │ │ │ │ +372auto forwardCapture(T&& t) │ │ │ │ │ + 373{ │ │ │ │ │ + 374 return Impl::ForwardCaptureWrapper(std::forward(t)); │ │ │ │ │ + 375} │ │ │ │ │ + 376 │ │ │ │ │ + 377 │ │ │ │ │ + 378 │ │ │ │ │ + 379} // namespace Dune::Functions │ │ │ │ │ + 380} // namespace Dune │ │ │ │ │ + 381 │ │ │ │ │ + 382 │ │ │ │ │ + 383#endif // DUNE_FUNCTIONS_COMMON_UTILITY_HH │ │ │ │ │ +functionconcepts.hh │ │ │ │ │ +Dune::Functions::ExpandTuple │ │ │ │ │ +typename Imp::ExpandTupleHelper< T, ArgTuple >::Type ExpandTuple │ │ │ │ │ +Expand tuple arguments as template arguments. │ │ │ │ │ +Definition: utility.hh:94 │ │ │ │ │ +Dune::Functions::TransformTuple │ │ │ │ │ +typename Imp::TransformTupleHelper< F, Tuples... >::Type TransformTuple │ │ │ │ │ +Transform tuple types argument using type-functor. │ │ │ │ │ +Definition: utility.hh:131 │ │ │ │ │ +Dune::Functions::Concept::isCallable │ │ │ │ │ +static constexpr auto isCallable() │ │ │ │ │ +Check if f is callable with given argument list. │ │ │ │ │ +Definition: functionconcepts.hh:47 │ │ │ │ │ +Dune::Functions::transformTuple │ │ │ │ │ +auto transformTuple(F &&f, const std::tuple< T... > &tuple) -> decltype(Imp:: │ │ │ │ │ +transformTupleHelper(std::forward< F >(f), tuple, std::index_sequence_for< T... │ │ │ │ │ +>{})) │ │ │ │ │ +Transform tuple value using a functor. │ │ │ │ │ +Definition: utility.hh:165 │ │ │ │ │ +Dune::Functions::callableCheck │ │ │ │ │ +auto callableCheck(Expression f) │ │ │ │ │ +Create a predicate for checking validity of expressions. │ │ │ │ │ +Definition: utility.hh:279 │ │ │ │ │ +Dune::Functions::forwardAsStaticIndex │ │ │ │ │ +auto forwardAsStaticIndex(const size_type &i, F &&f, Args &&... args) - │ │ │ │ │ +> decltype(f(Dune::Indices::_0, std::forward< Args >(args)...)) │ │ │ │ │ +Transform dynamic index to static index_constant. │ │ │ │ │ +Definition: utility.hh:60 │ │ │ │ │ +Dune::Functions::negatePredicate │ │ │ │ │ +auto negatePredicate(Check check) │ │ │ │ │ +Negate given predicate. │ │ │ │ │ +Definition: utility.hh:304 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::PolymorphicType │ │ │ │ │ -Base class with polymorphic type boiler plate code. │ │ │ │ │ -Definition: interfaces.hh:25 │ │ │ │ │ -Dune::Functions::PolymorphicType::clone │ │ │ │ │ -virtual Interface * clone(void *buffer) const =0 │ │ │ │ │ -Clones the object into buffer. │ │ │ │ │ -Dune::Functions::PolymorphicType::clone │ │ │ │ │ -virtual Interface * clone() const =0 │ │ │ │ │ -Clones the object. │ │ │ │ │ -Dune::Functions::PolymorphicType::move │ │ │ │ │ -virtual Interface * move(void *buffer)=0 │ │ │ │ │ -Move object into buffer. │ │ │ │ │ -Dune::Functions::PolymorphicType::~PolymorphicType │ │ │ │ │ -virtual ~PolymorphicType() │ │ │ │ │ -Destructor. │ │ │ │ │ -Definition: interfaces.hh:29 │ │ │ │ │ +Dune::Functions::forwardCapture │ │ │ │ │ +auto forwardCapture(T &&t) │ │ │ │ │ +Create a capture object for perfect forwarding. │ │ │ │ │ +Definition: utility.hh:372 │ │ │ │ │ +Dune::Functions::forwardAsStaticInteger │ │ │ │ │ +auto forwardAsStaticInteger(std::integer_sequence< size_type, firstValue > │ │ │ │ │ +values, const size_type &i, F &&f, Args &&... args) -> decltype(f(std:: │ │ │ │ │ +integral_constant< size_type, firstValue >(), std::forward< Args >(args)...)) │ │ │ │ │ +Definition: utility.hh:21 │ │ │ │ │ +Dune::Functions::IntegerSequenceTuple │ │ │ │ │ +typename Imp::IntegerSequenceTupleHelper< IntegerSequence >::Type │ │ │ │ │ +IntegerSequenceTuple │ │ │ │ │ +Transform integer_sequence to tuple...> │ │ │ │ │ +Definition: utility.hh:211 │ │ │ │ │ +Dune::Functions::LastType │ │ │ │ │ +Get last entry of type list. │ │ │ │ │ +Definition: utility.hh:222 │ │ │ │ │ +Dune::Functions::LastType::type │ │ │ │ │ +typename std::tuple_element< sizeof...(T) -1, std::tuple< T... > >::type type │ │ │ │ │ +Definition: utility.hh:223 │ │ │ │ │ +Dune::Functions::RotateTuple │ │ │ │ │ +Rotate type list by one, such that last entry is moved to first position. │ │ │ │ │ +Definition: utility.hh:251 │ │ │ │ │ +Dune::Functions::RotateTuple::type │ │ │ │ │ +typename Imp::RotateHelper< std::tuple< T... >, std::make_index_sequence< │ │ │ │ │ +sizeof...(T) -1 > >::type type │ │ │ │ │ +Definition: utility.hh:252 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00050.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: differentiablefunction.hh File Reference │ │ │ │ +dune-functions: staticforloop.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,44 +63,38 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces
│ │ │ │ -
differentiablefunction.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
staticforloop.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ -#include <dune/common/typeutilities.hh>
│ │ │ │ -#include <dune/functions/common/type_traits.hh>
│ │ │ │ -#include <dune/functions/common/defaultderivativetraits.hh>
│ │ │ │ -#include <dune/functions/common/differentiablefunction_imp.hh>
│ │ │ │ -#include <dune/functions/common/signature.hh>
│ │ │ │ -#include <dune/functions/common/typeerasure.hh>
│ │ │ │ -#include <dune/functions/common/functionconcepts.hh>
│ │ │ │ +
#include <dune/common/concept.hh>
│ │ │ │ +#include <dune/functions/common/type_traits.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::Functions::DifferentiableFunction< Signature, DerivativeTraits, bufferSize >
 
class  Dune::Functions::DifferentiableFunction< Range(Domain), DerivativeTraits, bufferSize >
 Class storing differentiable functions using type erasure. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<std::size_t begin_t, std::size_t end_t, class F , class... Args>
void Dune::Functions::staticFindInRange (F &&f, Args &&... args)
 Static find loop. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,34 +5,26 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -Classes | Namespaces │ │ │ │ │ -differentiablefunction.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Namespaces | Functions │ │ │ │ │ +staticforloop.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ - Classes │ │ │ │ │ -class  Dune::Functions::DifferentiableFunction<_Signature,_DerivativeTraits, │ │ │ │ │ - bufferSize_> │ │ │ │ │ -  │ │ │ │ │ -class  Dune::Functions::DifferentiableFunction<_Range(Domain), │ │ │ │ │ - DerivativeTraits,_bufferSize_> │ │ │ │ │ -  Class storing differentiable functions using type erasure. More... │ │ │ │ │ -  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +void Dune::Functions::staticFindInRange (F &&f, Args &&... args) │ │ │ │ │ +  Static find loop. More... │ │ │ │ │ +  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00050_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: differentiablefunction.hh Source File │ │ │ │ +dune-functions: staticforloop.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,128 +62,75 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
differentiablefunction.hh
│ │ │ │ +
staticforloop.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#ifndef DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_COMMON_STATICFORLOOP_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_COMMON_STATICFORLOOP_HH
│ │ │ │
5
│ │ │ │ -
6#include <type_traits>
│ │ │ │ -
7
│ │ │ │ -
8#include <dune/common/typeutilities.hh>
│ │ │ │ -
9
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
16
│ │ │ │ -
17namespace Dune {
│ │ │ │ -
18namespace Functions {
│ │ │ │ -
19
│ │ │ │ -
20
│ │ │ │ -
21
│ │ │ │ -
22/*
│ │ │ │ -
23 * Default implementation is empty
│ │ │ │ -
24 * The actual implementation is only given if Signature is an type
│ │ │ │ -
25 * describing a function signature as Range(Domain).
│ │ │ │ -
26 */
│ │ │ │ -
27template<class Signature, template<class> class DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56>
│ │ │ │ - │ │ │ │ -
29{};
│ │ │ │ -
30
│ │ │ │ -
31
│ │ │ │ -
32
│ │ │ │ -
33namespace Imp
│ │ │ │ -
34{
│ │ │ │ -
35
│ │ │ │ -
37 template<class S, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ -
38 struct DifferentiableFunctionTraits
│ │ │ │ -
39 {
│ │ │ │ -
41 using Signature = S;
│ │ │ │ -
42
│ │ │ │ -
44 using Range = typename SignatureTraits<Signature>::Range;
│ │ │ │ -
45
│ │ │ │ -
47 using Domain = typename SignatureTraits<Signature>::Domain;
│ │ │ │ -
48
│ │ │ │ -
50 using DerivativeSignature = typename SignatureTraits<Signature>::template DerivativeSignature<DerivativeTraits>;
│ │ │ │ -
51
│ │ │ │ - │ │ │ │ -
54
│ │ │ │ -
56 using Concept = DifferentiableFunctionWrapperInterface<Signature, DerivativeInterface>;
│ │ │ │ -
57
│ │ │ │ -
59 template<class B>
│ │ │ │ -
60 using Model = DifferentiableFunctionWrapperImplementation<Signature, DerivativeInterface, B>;
│ │ │ │ -
61 };
│ │ │ │ -
62}
│ │ │ │ -
63
│ │ │ │ +
6
│ │ │ │ +
7#include <dune/common/concept.hh>
│ │ │ │ +
8
│ │ │ │ + │ │ │ │ + │ │ │ │ +
11
│ │ │ │ +
12
│ │ │ │ +
13namespace Dune {
│ │ │ │ +
14namespace Functions {
│ │ │ │ +
15
│ │ │ │ +
16namespace Imp {
│ │ │ │ +
17
│ │ │ │ +
18template<class ST, ST begin, ST end>
│ │ │ │ +
19struct StaticFindInRange
│ │ │ │ +
20{
│ │ │ │ +
21 template<class F, class...Args>
│ │ │ │ +
22 static void apply(F&& f, Args&&... args)
│ │ │ │ +
23 {
│ │ │ │ +
24 if (f(std::integral_constant<ST, begin>(), std::forward<Args>(args)...))
│ │ │ │ +
25 return;
│ │ │ │ +
26 StaticFindInRange<ST, begin+1, end>::apply(std::forward<F>(f), std::forward<Args>(args)...);
│ │ │ │ +
27 }
│ │ │ │ +
28};
│ │ │ │ +
29
│ │ │ │ +
30template<class ST, ST end>
│ │ │ │ +
31struct StaticFindInRange<ST, end, end>
│ │ │ │ +
32{
│ │ │ │ +
33 template<class F, class...Args>
│ │ │ │ +
34 static void apply(F&& f, Args&&...)
│ │ │ │ +
35 {}
│ │ │ │ +
36};
│ │ │ │ +
37
│ │ │ │ +
38} //end namespace Imp
│ │ │ │ +
39
│ │ │ │ +
40
│ │ │ │ +
41
│ │ │ │ +
55template<std::size_t begin_t, std::size_t end_t, class F, class... Args>
│ │ │ │ +
56void staticFindInRange(F&& f, Args&&... args)
│ │ │ │ +
57{
│ │ │ │ +
58 Imp::StaticFindInRange<std::size_t, begin_t, end_t>::apply(std::forward<F>(f), std::forward<Args>(args)...);
│ │ │ │ +
59}
│ │ │ │ +
60
│ │ │ │ +
61
│ │ │ │ +
62} // namespace Dune::Functions
│ │ │ │ +
63} // namespace Dune
│ │ │ │
64
│ │ │ │
65
│ │ │ │ -
80template<class Range, class Domain, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ -
81class DifferentiableFunction< Range(Domain), DerivativeTraits, bufferSize> :
│ │ │ │ -
82 public TypeErasureBase<
│ │ │ │ -
83 typename Imp::DifferentiableFunctionTraits<Range(Domain), DerivativeTraits, bufferSize>::Concept,
│ │ │ │ -
84 Imp::DifferentiableFunctionTraits<Range(Domain), DerivativeTraits, bufferSize>::template Model>
│ │ │ │ -
85{
│ │ │ │ -
86 using Traits = Imp::DifferentiableFunctionTraits<Range(Domain), DerivativeTraits, bufferSize>;
│ │ │ │ -
87
│ │ │ │ - │ │ │ │ -
89
│ │ │ │ -
90 using DerivativeInterface = typename Traits::DerivativeInterface;
│ │ │ │ -
91
│ │ │ │ -
92public:
│ │ │ │ -
93
│ │ │ │ -
105 template<class F, disableCopyMove<DifferentiableFunction, F> = 0 >
│ │ │ │ - │ │ │ │ -
107 Base(std::forward<F>(f))
│ │ │ │ -
108 {
│ │ │ │ -
109 static_assert(Dune::Functions::Concept::isFunction<F, Range(Domain)>(), "Trying to construct a DifferentiableFunction from type that does not model the Function concept");
│ │ │ │ -
110 }
│ │ │ │ -
111
│ │ │ │ - │ │ │ │ -
114
│ │ │ │ -
118 Range operator() (const Domain& x) const
│ │ │ │ -
119 {
│ │ │ │ -
120 return this->asInterface().operator()(x);
│ │ │ │ -
121 }
│ │ │ │ -
122
│ │ │ │ -
130 friend DerivativeInterface derivative(const DifferentiableFunction& t)
│ │ │ │ -
131 {
│ │ │ │ -
132 return t.asInterface().derivative();
│ │ │ │ -
133 }
│ │ │ │ -
134};
│ │ │ │ -
135
│ │ │ │ -
136
│ │ │ │ -
137
│ │ │ │ -
138}} // namespace Dune::Functions
│ │ │ │ -
139
│ │ │ │ -
140
│ │ │ │ -
141
│ │ │ │ -
142#endif // DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
friend DerivativeInterface derivative(const DifferentiableFunction &t)
Get derivative of wrapped function.
Definition: differentiablefunction.hh:130
│ │ │ │ +
66
│ │ │ │ +
67#endif //DUNE_FUNCTIONS_COMMON_STATICFORLOOP_HH
│ │ │ │ + │ │ │ │ +
void staticFindInRange(F &&f, Args &&... args)
Static find loop.
Definition: staticforloop.hh:56
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
Definition: differentiablefunction.hh:29
│ │ │ │ -
DifferentiableFunction(F &&f)
Construct from function.
Definition: differentiablefunction.hh:106
│ │ │ │ - │ │ │ │ -
Helper class to deduce the signature of a callable.
Definition: signature.hh:56
│ │ │ │ -
Base class for type-erased interface wrapper.
Definition: typeerasure.hh:165
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,153 +5,76 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -differentiablefunction.hh │ │ │ │ │ +staticforloop.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#ifndef DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_COMMON_STATICFORLOOP_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_COMMON_STATICFORLOOP_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ - 16 │ │ │ │ │ - 17namespace Dune { │ │ │ │ │ - 18namespace Functions { │ │ │ │ │ - 19 │ │ │ │ │ - 20 │ │ │ │ │ - 21 │ │ │ │ │ - 22/* │ │ │ │ │ - 23 * Default implementation is empty │ │ │ │ │ - 24 * The actual implementation is only given if Signature is an type │ │ │ │ │ - 25 * describing a function signature as Range(Domain). │ │ │ │ │ - 26 */ │ │ │ │ │ - 27template class │ │ │ │ │ -DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56> │ │ │ │ │ -28class DifferentiableFunction │ │ │ │ │ - 29{}; │ │ │ │ │ - 30 │ │ │ │ │ - 31 │ │ │ │ │ - 32 │ │ │ │ │ - 33namespace Imp │ │ │ │ │ - 34{ │ │ │ │ │ - 35 │ │ │ │ │ - 37 template class DerivativeTraits, size_t │ │ │ │ │ -bufferSize> │ │ │ │ │ - 38 struct DifferentiableFunctionTraits │ │ │ │ │ - 39 { │ │ │ │ │ - 41 using Signature = S; │ │ │ │ │ - 42 │ │ │ │ │ - 44 using Range = typename SignatureTraits::Range; │ │ │ │ │ - 45 │ │ │ │ │ - 47 using Domain = typename SignatureTraits::Domain; │ │ │ │ │ - 48 │ │ │ │ │ - 50 using DerivativeSignature = typename SignatureTraits::template │ │ │ │ │ -DerivativeSignature; │ │ │ │ │ - 51 │ │ │ │ │ - 53 using DerivativeInterface = DifferentiableFunction; │ │ │ │ │ - 54 │ │ │ │ │ - 56 using Concept = DifferentiableFunctionWrapperInterface; │ │ │ │ │ - 57 │ │ │ │ │ - 59 template │ │ │ │ │ - 60 using Model = DifferentiableFunctionWrapperImplementation; │ │ │ │ │ - 61 }; │ │ │ │ │ - 62} │ │ │ │ │ - 63 │ │ │ │ │ + 6 │ │ │ │ │ + 7#include │ │ │ │ │ + 8 │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11 │ │ │ │ │ + 12 │ │ │ │ │ + 13namespace Dune { │ │ │ │ │ + 14namespace Functions { │ │ │ │ │ + 15 │ │ │ │ │ + 16namespace Imp { │ │ │ │ │ + 17 │ │ │ │ │ + 18template │ │ │ │ │ + 19struct StaticFindInRange │ │ │ │ │ + 20{ │ │ │ │ │ + 21 template │ │ │ │ │ + 22 static void apply(F&& f, Args&&... args) │ │ │ │ │ + 23 { │ │ │ │ │ + 24 if (f(std::integral_constant(), std::forward(args)...)) │ │ │ │ │ + 25 return; │ │ │ │ │ + 26 StaticFindInRange::apply(std::forward(f), std:: │ │ │ │ │ +forward(args)...); │ │ │ │ │ + 27 } │ │ │ │ │ + 28}; │ │ │ │ │ + 29 │ │ │ │ │ + 30template │ │ │ │ │ + 31struct StaticFindInRange │ │ │ │ │ + 32{ │ │ │ │ │ + 33 template │ │ │ │ │ + 34 static void apply(F&& f, Args&&...) │ │ │ │ │ + 35 {} │ │ │ │ │ + 36}; │ │ │ │ │ + 37 │ │ │ │ │ + 38} //end namespace Imp │ │ │ │ │ + 39 │ │ │ │ │ + 40 │ │ │ │ │ + 41 │ │ │ │ │ + 55template │ │ │ │ │ +56void staticFindInRange(F&& f, Args&&... args) │ │ │ │ │ + 57{ │ │ │ │ │ + 58 Imp::StaticFindInRange::apply(std::forward │ │ │ │ │ +(f), std::forward(args)...); │ │ │ │ │ + 59} │ │ │ │ │ + 60 │ │ │ │ │ + 61 │ │ │ │ │ + 62} // namespace Dune::Functions │ │ │ │ │ + 63} // namespace Dune │ │ │ │ │ 64 │ │ │ │ │ 65 │ │ │ │ │ - 80template class DerivativeTraits, │ │ │ │ │ -size_t bufferSize> │ │ │ │ │ -81class DifferentiableFunction< Range(Domain), DerivativeTraits, bufferSize> : │ │ │ │ │ - 82 public TypeErasureBase< │ │ │ │ │ - 83 typename Imp::DifferentiableFunctionTraits::Concept, │ │ │ │ │ - 84 Imp::DifferentiableFunctionTraits::template Model> │ │ │ │ │ - 85{ │ │ │ │ │ - 86 using Traits = Imp::DifferentiableFunctionTraits; │ │ │ │ │ - 87 │ │ │ │ │ - 88 using Base = TypeErasureBase; │ │ │ │ │ - 89 │ │ │ │ │ - 90 using DerivativeInterface = typename Traits::DerivativeInterface; │ │ │ │ │ - 91 │ │ │ │ │ - 92public: │ │ │ │ │ - 93 │ │ │ │ │ - 105 template = 0 > │ │ │ │ │ -106 DifferentiableFunction(F&& f) : │ │ │ │ │ - 107 Base(std::forward(f)) │ │ │ │ │ - 108 { │ │ │ │ │ - 109 static_assert(Dune::Functions::Concept::isFunction(), │ │ │ │ │ -"Trying to construct a DifferentiableFunction from type that does not model the │ │ │ │ │ -Function concept"); │ │ │ │ │ - 110 } │ │ │ │ │ - 111 │ │ │ │ │ -113 DifferentiableFunction() = default; │ │ │ │ │ - 114 │ │ │ │ │ -118 Range operator() (const Domain& x) const │ │ │ │ │ - 119 { │ │ │ │ │ - 120 return this->asInterface().operator()(x); │ │ │ │ │ - 121 } │ │ │ │ │ - 122 │ │ │ │ │ -130 friend DerivativeInterface derivative(const DifferentiableFunction& t) │ │ │ │ │ - 131 { │ │ │ │ │ - 132 return t.asInterface().derivative(); │ │ │ │ │ - 133 } │ │ │ │ │ - 134}; │ │ │ │ │ - 135 │ │ │ │ │ - 136 │ │ │ │ │ - 137 │ │ │ │ │ - 138}} // namespace Dune::Functions │ │ │ │ │ - 139 │ │ │ │ │ - 140 │ │ │ │ │ - 141 │ │ │ │ │ - 142#endif // DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH │ │ │ │ │ -typeerasure.hh │ │ │ │ │ + 66 │ │ │ │ │ + 67#endif //DUNE_FUNCTIONS_COMMON_STATICFORLOOP_HH │ │ │ │ │ type_traits.hh │ │ │ │ │ -differentiablefunction_imp.hh │ │ │ │ │ -signature.hh │ │ │ │ │ -functionconcepts.hh │ │ │ │ │ -defaultderivativetraits.hh │ │ │ │ │ -Dune::Functions::DifferentiableFunction<_Range(Domain),_DerivativeTraits, │ │ │ │ │ -bufferSize_>::derivative │ │ │ │ │ -friend DerivativeInterface derivative(const DifferentiableFunction &t) │ │ │ │ │ -Get derivative of wrapped function. │ │ │ │ │ -Definition: differentiablefunction.hh:130 │ │ │ │ │ +Dune::Functions::staticFindInRange │ │ │ │ │ +void staticFindInRange(F &&f, Args &&... args) │ │ │ │ │ +Static find loop. │ │ │ │ │ +Definition: staticforloop.hh:56 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::DifferentiableFunction │ │ │ │ │ -Definition: differentiablefunction.hh:29 │ │ │ │ │ -Dune::Functions::DifferentiableFunction<_Range(Domain),_DerivativeTraits, │ │ │ │ │ -bufferSize_>::DifferentiableFunction │ │ │ │ │ -DifferentiableFunction(F &&f) │ │ │ │ │ -Construct from function. │ │ │ │ │ -Definition: differentiablefunction.hh:106 │ │ │ │ │ -Dune::Functions::DifferentiableFunction<_Range(Domain),_DerivativeTraits, │ │ │ │ │ -bufferSize_>::DifferentiableFunction │ │ │ │ │ -DifferentiableFunction()=default │ │ │ │ │ -Default constructor. │ │ │ │ │ -Dune::Functions::SignatureTraits │ │ │ │ │ -Helper class to deduce the signature of a callable. │ │ │ │ │ -Definition: signature.hh:56 │ │ │ │ │ -Dune::Functions::TypeErasureBase │ │ │ │ │ -Base class for type-erased interface wrapper. │ │ │ │ │ -Definition: typeerasure.hh:165 │ │ │ │ │ +concepts.hh │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00053.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: treedata.hh File Reference │ │ │ │ +dune-functions: interfaces.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,38 +65,25 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
treedata.hh File Reference
│ │ │ │ +
interfaces.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <memory>
│ │ │ │ -#include <dune/common/shared_ptr.hh>
│ │ │ │ -#include <dune/typetree/pairtraversal.hh>
│ │ │ │ -#include <dune/functions/gridfunctions/gridviewentityset.hh>
│ │ │ │ -#include <dune/functions/gridfunctions/gridfunction.hh>
│ │ │ │ +
#include <type_traits>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::Functions::UniformNodeVisitor< SimpleNodeVisitorImp, leafOnly >
 Mixin for visitors that should apply the same action on all nodes. More...
 
class  Dune::Functions::TreeData< T, ND, LO >
 Container allowing to attach data to each node of a tree. More...
 
struct  Dune::Functions::TreeData< T, ND, LO >::InitVisitor
 
struct  Dune::Functions::TreeData< T, ND, LO >::DestroyVisitor
 
struct  Dune::Functions::TreeData< T, ND, LO >::CopyVisitor
class  Dune::Functions::PolymorphicType< Interface >
 Base class with polymorphic type boiler plate code. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -6,34 +6,20 @@ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ Classes | Namespaces │ │ │ │ │ -treedata.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +interfaces.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -struct  Dune::Functions::UniformNodeVisitor<_SimpleNodeVisitorImp,_leafOnly_> │ │ │ │ │ -  Mixin for visitors that should apply the same action on all nodes. │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ - class  Dune::Functions::TreeData<_T,_ND,_LO_> │ │ │ │ │ -  Container allowing to attach data to each node of a tree. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::TreeData<_T,_ND,_LO_>::InitVisitor │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::TreeData<_T,_ND,_LO_>::DestroyVisitor │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::TreeData<_T,_ND,_LO_>::CopyVisitor │ │ │ │ │ +class  Dune::Functions::PolymorphicType<_Interface_> │ │ │ │ │ +  Base class with polymorphic type boiler plate code. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00053_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: treedata.hh Source File │ │ │ │ +dune-functions: interfaces.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,256 +62,56 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
treedata.hh
│ │ │ │ +
interfaces.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#ifndef DUNE_FUNCTIONS_COMMON_TREEDATA_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_COMMON_TREEDATA_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_COMMON_INTERFACES_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_COMMON_INTERFACES_HH
│ │ │ │
5
│ │ │ │ -
6
│ │ │ │ -
7#warning This file is deprecated. Please use TreeContainer from dune-typetree instead.
│ │ │ │ +
6#include <type_traits>
│ │ │ │ +
7
│ │ │ │
8
│ │ │ │ -
9#include <memory>
│ │ │ │ -
10
│ │ │ │ -
11#include <dune/common/shared_ptr.hh>
│ │ │ │ +
9namespace Dune {
│ │ │ │ +
10namespace Functions {
│ │ │ │ +
11
│ │ │ │
12
│ │ │ │ -
13#include <dune/typetree/pairtraversal.hh>
│ │ │ │ -
14
│ │ │ │ - │ │ │ │ - │ │ │ │ -
17
│ │ │ │ -
18namespace Dune {
│ │ │ │ -
19namespace Functions {
│ │ │ │ -
20
│ │ │ │ -
34template<class SimpleNodeVisitorImp, bool leafOnly>
│ │ │ │ -
35struct
│ │ │ │ -
36[[deprecated("This is an implementation detail of the deprecated class TreeDate and thus deprecated itself.")]]
│ │ │ │ - │ │ │ │ -
38 public TypeTree::TreeVisitor,
│ │ │ │ -
39 public TypeTree::DynamicTraversal
│ │ │ │ -
40{
│ │ │ │ -
41 // This is only enabled, if we want to incorporate inner nodes.
│ │ │ │ -
42 // Checking leafOnly would be sufficient, but for SFINAE the
│ │ │ │ -
43 // the enable_if condition must depend on the template parameter.
│ │ │ │ -
44 template<typename Node, typename TreePath,
│ │ │ │ -
45 typename std::enable_if<(not leafOnly) and (not Node::isLeaf), int>::type = 0>
│ │ │ │ -
46 void pre(Node& node, TreePath treePath)
│ │ │ │ -
47 {
│ │ │ │ -
48 static_cast<SimpleNodeVisitorImp*>(this)->apply(node, treePath);
│ │ │ │ -
49 }
│ │ │ │ -
50
│ │ │ │ -
51 template<typename Node, typename TreePath,
│ │ │ │ -
52 typename std::enable_if<(leafOnly) and (not Node::isLeaf), int>::type = 0>
│ │ │ │ -
53 void pre(Node& node, TreePath treePath)
│ │ │ │ -
54 {}
│ │ │ │ -
55
│ │ │ │ -
56 template<typename Node, typename TreePath>
│ │ │ │ -
57 void leaf(Node& node, TreePath treePath)
│ │ │ │ -
58 {
│ │ │ │ -
59 static_cast<SimpleNodeVisitorImp*>(this)->apply(node, treePath);
│ │ │ │ -
60 }
│ │ │ │ -
61};
│ │ │ │ -
62
│ │ │ │ -
63
│ │ │ │ +
13
│ │ │ │ +
23template<class Interface>
│ │ │ │ + │ │ │ │ +
25{
│ │ │ │ +
26public:
│ │ │ │ +
27
│ │ │ │ + │ │ │ │ +
30 {}
│ │ │ │ +
31
│ │ │ │ +
40 virtual Interface* clone() const = 0;
│ │ │ │ +
41
│ │ │ │ +
51 virtual Interface* clone(void* buffer) const = 0;
│ │ │ │ +
52
│ │ │ │ +
62 virtual Interface* move(void* buffer) = 0;
│ │ │ │ +
63};
│ │ │ │
64
│ │ │ │ -
91template<class T, template<class> class ND, bool LO>
│ │ │ │ -
92class
│ │ │ │ -
93[[deprecated("This class is deprecated. Please use TreeContainer from dune-typetree instead.")]]
│ │ │ │ - │ │ │ │ -
95{
│ │ │ │ -
96
│ │ │ │ -
97public:
│ │ │ │ -
98
│ │ │ │ -
100 using Tree = T;
│ │ │ │ -
101
│ │ │ │ -
103 using size_type = typename Tree::size_type;
│ │ │ │ -
104
│ │ │ │ -
106 static const bool leafOnly = LO;
│ │ │ │ -
107
│ │ │ │ -
109 template<class Node>
│ │ │ │ -
110 using NodeData = ND<Node>;
│ │ │ │ -
111
│ │ │ │ -
112protected:
│ │ │ │ -
113 using RawContainer = std::vector<void*>;
│ │ │ │ -
114
│ │ │ │ -
115
│ │ │ │ -
116 // Since we can generate the node data type only if
│ │ │ │ -
117 // we know the type of the node, we have to do
│ │ │ │ -
118 // initialization, copy, and destruction via a
│ │ │ │ -
119 // tree traversal. Once we can use C++14 this can
│ │ │ │ -
120 // be written in a much easier and more selfcontained
│ │ │ │ -
121 // ways using generic lambda functions.
│ │ │ │ -
122 // Until then we need explicit visitor classes for
│ │ │ │ -
123 // each operation.
│ │ │ │ -
124
│ │ │ │ -
125 struct InitVisitor :
│ │ │ │ -
126 public UniformNodeVisitor<InitVisitor, leafOnly>
│ │ │ │ -
127 {
│ │ │ │ - │ │ │ │ -
129 data_(data)
│ │ │ │ -
130 {}
│ │ │ │ -
131
│ │ │ │ -
132 template<typename Node, typename TreePath>
│ │ │ │ -
133 void apply(Node& node, TreePath treePath)
│ │ │ │ -
134 {
│ │ │ │ -
135 auto&& index = node.treeIndex();
│ │ │ │ -
136 if (data_.size() < index+1)
│ │ │ │ -
137 data_.resize(index+1, nullptr);
│ │ │ │ -
138 data_[index] = new NodeData<Node>;
│ │ │ │ -
139 }
│ │ │ │ -
140
│ │ │ │ -
141
│ │ │ │ - │ │ │ │ -
143 };
│ │ │ │ -
144
│ │ │ │ - │ │ │ │ -
146 public UniformNodeVisitor<DestroyVisitor, leafOnly>
│ │ │ │ -
147 {
│ │ │ │ - │ │ │ │ -
149 data_(data)
│ │ │ │ -
150 {}
│ │ │ │ -
151
│ │ │ │ -
152 template<typename Node, typename TreePath>
│ │ │ │ -
153 void apply(Node& node, TreePath treePath)
│ │ │ │ -
154 {
│ │ │ │ -
155 auto&& index = node.treeIndex();
│ │ │ │ -
156 auto p = (NodeData<Node>*)(data_[index]);
│ │ │ │ -
157 delete p;
│ │ │ │ -
158 data_[index] = nullptr;
│ │ │ │ -
159 }
│ │ │ │ -
160
│ │ │ │ - │ │ │ │ -
162 };
│ │ │ │ -
163
│ │ │ │ -
164 struct CopyVisitor :
│ │ │ │ -
165 public UniformNodeVisitor<CopyVisitor, leafOnly>
│ │ │ │ -
166 {
│ │ │ │ -
167 CopyVisitor(TreeData& thisTD, const TreeData& otherTD) :
│ │ │ │ -
168 thisTD_(thisTD),
│ │ │ │ -
169 otherTD_(otherTD)
│ │ │ │ -
170 {}
│ │ │ │ -
171
│ │ │ │ -
172 template<typename Node, typename TreePath>
│ │ │ │ -
173 void apply(Node& node, TreePath treePath)
│ │ │ │ -
174 {
│ │ │ │ -
175 thisTD_[node] = otherTD_[node];
│ │ │ │ -
176 }
│ │ │ │ -
177
│ │ │ │ - │ │ │ │ - │ │ │ │ -
180 };
│ │ │ │ -
181
│ │ │ │ -
182public:
│ │ │ │ -
183
│ │ │ │ - │ │ │ │ -
186 tree_(nullptr)
│ │ │ │ -
187 {}
│ │ │ │ -
188
│ │ │ │ -
196 void init(const Tree& tree)
│ │ │ │ -
197 {
│ │ │ │ -
198 if (tree_)
│ │ │ │ -
199 destroy();
│ │ │ │ -
200 tree_ = &tree;
│ │ │ │ -
201 TypeTree::applyToTree(*tree_, InitVisitor(data_));
│ │ │ │ -
202 }
│ │ │ │ -
203
│ │ │ │ -
205 TreeData(const TreeData& other) :
│ │ │ │ -
206 tree_(other.tree_)
│ │ │ │ -
207 {
│ │ │ │ -
208 TypeTree::applyToTree(*tree_, InitVisitor(data_));
│ │ │ │ -
209 TypeTree::applyToTree(*tree_, CopyVisitor(*this, other));
│ │ │ │ -
210 }
│ │ │ │ -
211
│ │ │ │ - │ │ │ │ -
214 {
│ │ │ │ -
215 if (tree_)
│ │ │ │ -
216 TypeTree::applyToTree(*tree_, DestroyVisitor(data_));
│ │ │ │ -
217 tree_ = other.tree_;
│ │ │ │ -
218 TypeTree::applyToTree(*tree_, CopyVisitor(*this, other));
│ │ │ │ -
219 return *this;
│ │ │ │ -
220 }
│ │ │ │ -
221
│ │ │ │ -
223 void destroy()
│ │ │ │ -
224 {
│ │ │ │ -
225 if (tree_)
│ │ │ │ -
226 TypeTree::applyToTree(*tree_, DestroyVisitor(data_));
│ │ │ │ -
227 tree_ = nullptr;
│ │ │ │ -
228 }
│ │ │ │ -
229
│ │ │ │ - │ │ │ │ -
232 {
│ │ │ │ -
233 if (tree_)
│ │ │ │ -
234 TypeTree::applyToTree(*tree_, DestroyVisitor(data_));
│ │ │ │ -
235 }
│ │ │ │ -
236
│ │ │ │ -
238 template<class Node>
│ │ │ │ -
239 NodeData<Node>& operator[](const Node& node)
│ │ │ │ -
240 {
│ │ │ │ -
241 return *(NodeData<Node>*)(data_[node.treeIndex()]);
│ │ │ │ -
242 }
│ │ │ │ -
243
│ │ │ │ -
245 template<class Node>
│ │ │ │ -
246 const NodeData<Node>& operator[](const Node& node) const
│ │ │ │ -
247 {
│ │ │ │ -
248 return *(NodeData<Node>*)(data_[node.treeIndex()]);
│ │ │ │ -
249 }
│ │ │ │ -
250
│ │ │ │ -
251protected:
│ │ │ │ -
252
│ │ │ │ -
253 const Tree* tree_;
│ │ │ │ - │ │ │ │ -
255};
│ │ │ │ -
256
│ │ │ │ -
257
│ │ │ │ -
258
│ │ │ │ -
259} // namespace Functions
│ │ │ │ -
260} // namespace Dune
│ │ │ │ -
261
│ │ │ │ -
262#endif // DUNE_FUNCTIONS_COMMON_TREEDATA_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ +
65
│ │ │ │ +
66
│ │ │ │ +
67}} // namespace Dune::Functions
│ │ │ │ +
68
│ │ │ │ +
69#endif // DUNE_FUNCTIONS_COMMON_EXTENDED_CLONEABLE_HH
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
Mixin for visitors that should apply the same action on all nodes.
Definition: treedata.hh:40
│ │ │ │ -
void pre(Node &node, TreePath treePath)
Definition: treedata.hh:46
│ │ │ │ -
void leaf(Node &node, TreePath treePath)
Definition: treedata.hh:57
│ │ │ │ -
Container allowing to attach data to each node of a tree.
Definition: treedata.hh:95
│ │ │ │ -
TreeData(const TreeData &other)
Copy constructor.
Definition: treedata.hh:205
│ │ │ │ -
void init(const Tree &tree)
Initialize from tree.
Definition: treedata.hh:196
│ │ │ │ -
T Tree
Type of tree the data is associated with.
Definition: treedata.hh:100
│ │ │ │ -
const Tree * tree_
Definition: treedata.hh:253
│ │ │ │ -
void destroy()
Destroy data.
Definition: treedata.hh:223
│ │ │ │ -
const NodeData< Node > & operator[](const Node &node) const
Get reference to data associated to given node.
Definition: treedata.hh:246
│ │ │ │ -
TreeData & operator=(const TreeData &other)
Copy assignment.
Definition: treedata.hh:213
│ │ │ │ -
~TreeData()
Destructor.
Definition: treedata.hh:231
│ │ │ │ -
ND< Node > NodeData
Template to determine the data type for given node type.
Definition: treedata.hh:110
│ │ │ │ -
TreeData()
Default constructor.
Definition: treedata.hh:185
│ │ │ │ -
std::vector< void * > RawContainer
Definition: treedata.hh:113
│ │ │ │ -
NodeData< Node > & operator[](const Node &node)
Get mutable reference to data associated to given node.
Definition: treedata.hh:239
│ │ │ │ -
typename Tree::size_type size_type
Type used for indices and size information.
Definition: treedata.hh:103
│ │ │ │ -
RawContainer data_
Definition: treedata.hh:254
│ │ │ │ -
Definition: treedata.hh:127
│ │ │ │ -
InitVisitor(RawContainer &data)
Definition: treedata.hh:128
│ │ │ │ -
void apply(Node &node, TreePath treePath)
Definition: treedata.hh:133
│ │ │ │ -
RawContainer & data_
Definition: treedata.hh:142
│ │ │ │ - │ │ │ │ -
RawContainer & data_
Definition: treedata.hh:161
│ │ │ │ -
DestroyVisitor(RawContainer &data)
Definition: treedata.hh:148
│ │ │ │ -
void apply(Node &node, TreePath treePath)
Definition: treedata.hh:153
│ │ │ │ -
Definition: treedata.hh:166
│ │ │ │ -
CopyVisitor(TreeData &thisTD, const TreeData &otherTD)
Definition: treedata.hh:167
│ │ │ │ -
void apply(Node &node, TreePath treePath)
Definition: treedata.hh:173
│ │ │ │ -
TreeData & thisTD_
Definition: treedata.hh:178
│ │ │ │ -
const TreeData & otherTD_
Definition: treedata.hh:179
│ │ │ │ +
Base class with polymorphic type boiler plate code.
Definition: interfaces.hh:25
│ │ │ │ +
virtual Interface * clone(void *buffer) const =0
Clones the object into buffer.
│ │ │ │ +
virtual Interface * clone() const =0
Clones the object.
│ │ │ │ +
virtual Interface * move(void *buffer)=0
Move object into buffer.
│ │ │ │ +
virtual ~PolymorphicType()
Destructor.
Definition: interfaces.hh:29
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,326 +5,63 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -treedata.hh │ │ │ │ │ +interfaces.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#ifndef DUNE_FUNCTIONS_COMMON_TREEDATA_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_COMMON_TREEDATA_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_COMMON_INTERFACES_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_COMMON_INTERFACES_HH │ │ │ │ │ 5 │ │ │ │ │ - 6 │ │ │ │ │ - 7#warning This file is deprecated. Please use TreeContainer from dune-typetree │ │ │ │ │ -instead. │ │ │ │ │ + 6#include │ │ │ │ │ + 7 │ │ │ │ │ 8 │ │ │ │ │ - 9#include │ │ │ │ │ - 10 │ │ │ │ │ - 11#include │ │ │ │ │ + 9namespace Dune { │ │ │ │ │ + 10namespace Functions { │ │ │ │ │ + 11 │ │ │ │ │ 12 │ │ │ │ │ - 13#include │ │ │ │ │ - 14 │ │ │ │ │ - 15#include │ │ │ │ │ - 16#include │ │ │ │ │ - 17 │ │ │ │ │ - 18namespace Dune { │ │ │ │ │ - 19namespace Functions { │ │ │ │ │ - 20 │ │ │ │ │ - 34template │ │ │ │ │ -35struct │ │ │ │ │ - 36[[deprecated("This is an implementation detail of the deprecated class │ │ │ │ │ -TreeDate and thus deprecated itself.")]] │ │ │ │ │ - 37UniformNodeVisitor : │ │ │ │ │ - 38 public TypeTree::TreeVisitor, │ │ │ │ │ - 39 public TypeTree::DynamicTraversal │ │ │ │ │ - 40{ │ │ │ │ │ - 41 // This is only enabled, if we want to incorporate inner nodes. │ │ │ │ │ - 42 // Checking leafOnly would be sufficient, but for SFINAE the │ │ │ │ │ - 43 // the enable_if condition must depend on the template parameter. │ │ │ │ │ - 44 template::type = │ │ │ │ │ -0> │ │ │ │ │ -46 void pre(Node& node, TreePath treePath) │ │ │ │ │ - 47 { │ │ │ │ │ - 48 static_cast(this)->apply(node, treePath); │ │ │ │ │ - 49 } │ │ │ │ │ - 50 │ │ │ │ │ - 51 template::type = 0> │ │ │ │ │ -53 void pre(Node& node, TreePath treePath) │ │ │ │ │ - 54 {} │ │ │ │ │ - 55 │ │ │ │ │ - 56 template │ │ │ │ │ -57 void leaf(Node& node, TreePath treePath) │ │ │ │ │ - 58 { │ │ │ │ │ - 59 static_cast(this)->apply(node, treePath); │ │ │ │ │ - 60 } │ │ │ │ │ - 61}; │ │ │ │ │ - 62 │ │ │ │ │ - 63 │ │ │ │ │ + 13 │ │ │ │ │ + 23template │ │ │ │ │ +24class PolymorphicType │ │ │ │ │ + 25{ │ │ │ │ │ + 26public: │ │ │ │ │ + 27 │ │ │ │ │ +29 virtual ~PolymorphicType() │ │ │ │ │ + 30 {} │ │ │ │ │ + 31 │ │ │ │ │ +40 virtual Interface* clone() const = 0; │ │ │ │ │ + 41 │ │ │ │ │ +51 virtual Interface* clone(void* buffer) const = 0; │ │ │ │ │ + 52 │ │ │ │ │ +62 virtual Interface* move(void* buffer) = 0; │ │ │ │ │ + 63}; │ │ │ │ │ 64 │ │ │ │ │ - 91template class ND, bool LO> │ │ │ │ │ -92class │ │ │ │ │ - 93[[deprecated("This class is deprecated. Please use TreeContainer from dune- │ │ │ │ │ -typetree instead.")]] │ │ │ │ │ - 94TreeData │ │ │ │ │ - 95{ │ │ │ │ │ - 96 │ │ │ │ │ - 97public: │ │ │ │ │ - 98 │ │ │ │ │ -100 using Tree = T; │ │ │ │ │ - 101 │ │ │ │ │ -103 using size_type = typename Tree::size_type; │ │ │ │ │ - 104 │ │ │ │ │ -106 static const bool leafOnly = LO; │ │ │ │ │ - 107 │ │ │ │ │ - 109 template │ │ │ │ │ -110 using NodeData = ND; │ │ │ │ │ - 111 │ │ │ │ │ - 112protected: │ │ │ │ │ -113 using RawContainer = std::vector; │ │ │ │ │ - 114 │ │ │ │ │ - 115 │ │ │ │ │ - 116 // Since we can generate the node data type only if │ │ │ │ │ - 117 // we know the type of the node, we have to do │ │ │ │ │ - 118 // initialization, copy, and destruction via a │ │ │ │ │ - 119 // tree traversal. Once we can use C++14 this can │ │ │ │ │ - 120 // be written in a much easier and more selfcontained │ │ │ │ │ - 121 // ways using generic lambda functions. │ │ │ │ │ - 122 // Until then we need explicit visitor classes for │ │ │ │ │ - 123 // each operation. │ │ │ │ │ - 124 │ │ │ │ │ -125 struct InitVisitor : │ │ │ │ │ - 126 public UniformNodeVisitor │ │ │ │ │ - 127 { │ │ │ │ │ -128 InitVisitor(RawContainer& data) : │ │ │ │ │ - 129 data_(data) │ │ │ │ │ - 130 {} │ │ │ │ │ - 131 │ │ │ │ │ - 132 template │ │ │ │ │ -133 void apply(Node& node, TreePath treePath) │ │ │ │ │ - 134 { │ │ │ │ │ - 135 auto&& index = node.treeIndex(); │ │ │ │ │ - 136 if (data_.size() < index+1) │ │ │ │ │ - 137 data_.resize(index+1, nullptr); │ │ │ │ │ - 138 data_[index] = new NodeData; │ │ │ │ │ - 139 } │ │ │ │ │ - 140 │ │ │ │ │ - 141 │ │ │ │ │ -142 RawContainer& data_; │ │ │ │ │ - 143 }; │ │ │ │ │ - 144 │ │ │ │ │ -145 struct DestroyVisitor : │ │ │ │ │ - 146 public UniformNodeVisitor │ │ │ │ │ - 147 { │ │ │ │ │ -148 DestroyVisitor(RawContainer& data) : │ │ │ │ │ - 149 data_(data) │ │ │ │ │ - 150 {} │ │ │ │ │ - 151 │ │ │ │ │ - 152 template │ │ │ │ │ -153 void apply(Node& node, TreePath treePath) │ │ │ │ │ - 154 { │ │ │ │ │ - 155 auto&& index = node.treeIndex(); │ │ │ │ │ - 156 auto p = (NodeData*)(data_[index]); │ │ │ │ │ - 157 delete p; │ │ │ │ │ - 158 data_[index] = nullptr; │ │ │ │ │ - 159 } │ │ │ │ │ - 160 │ │ │ │ │ -161 RawContainer& data_; │ │ │ │ │ - 162 }; │ │ │ │ │ - 163 │ │ │ │ │ -164 struct CopyVisitor : │ │ │ │ │ - 165 public UniformNodeVisitor │ │ │ │ │ - 166 { │ │ │ │ │ -167 CopyVisitor(TreeData& thisTD, const TreeData& otherTD) : │ │ │ │ │ - 168 thisTD_(thisTD), │ │ │ │ │ - 169 otherTD_(otherTD) │ │ │ │ │ - 170 {} │ │ │ │ │ - 171 │ │ │ │ │ - 172 template │ │ │ │ │ -173 void apply(Node& node, TreePath treePath) │ │ │ │ │ - 174 { │ │ │ │ │ - 175 thisTD_[node] = otherTD_[node]; │ │ │ │ │ - 176 } │ │ │ │ │ - 177 │ │ │ │ │ -178 TreeData& thisTD_; │ │ │ │ │ -179 const TreeData& otherTD_; │ │ │ │ │ - 180 }; │ │ │ │ │ - 181 │ │ │ │ │ - 182public: │ │ │ │ │ - 183 │ │ │ │ │ -185 TreeData() : │ │ │ │ │ - 186 tree_(nullptr) │ │ │ │ │ - 187 {} │ │ │ │ │ - 188 │ │ │ │ │ -196 void init(const Tree& tree) │ │ │ │ │ - 197 { │ │ │ │ │ - 198 if (tree_) │ │ │ │ │ - 199 destroy(); │ │ │ │ │ - 200 tree_ = &tree; │ │ │ │ │ - 201 TypeTree::applyToTree(*tree_, InitVisitor(data_)); │ │ │ │ │ - 202 } │ │ │ │ │ - 203 │ │ │ │ │ -205 TreeData(const TreeData& other) : │ │ │ │ │ - 206 tree_(other.tree_) │ │ │ │ │ - 207 { │ │ │ │ │ - 208 TypeTree::applyToTree(*tree_, InitVisitor(data_)); │ │ │ │ │ - 209 TypeTree::applyToTree(*tree_, CopyVisitor(*this, other)); │ │ │ │ │ - 210 } │ │ │ │ │ - 211 │ │ │ │ │ -213 TreeData& operator=(const TreeData& other) │ │ │ │ │ - 214 { │ │ │ │ │ - 215 if (tree_) │ │ │ │ │ - 216 TypeTree::applyToTree(*tree_, DestroyVisitor(data_)); │ │ │ │ │ - 217 tree_ = other.tree_; │ │ │ │ │ - 218 TypeTree::applyToTree(*tree_, CopyVisitor(*this, other)); │ │ │ │ │ - 219 return *this; │ │ │ │ │ - 220 } │ │ │ │ │ - 221 │ │ │ │ │ -223 void destroy() │ │ │ │ │ - 224 { │ │ │ │ │ - 225 if (tree_) │ │ │ │ │ - 226 TypeTree::applyToTree(*tree_, DestroyVisitor(data_)); │ │ │ │ │ - 227 tree_ = nullptr; │ │ │ │ │ - 228 } │ │ │ │ │ - 229 │ │ │ │ │ -231 ~TreeData() │ │ │ │ │ - 232 { │ │ │ │ │ - 233 if (tree_) │ │ │ │ │ - 234 TypeTree::applyToTree(*tree_, DestroyVisitor(data_)); │ │ │ │ │ - 235 } │ │ │ │ │ - 236 │ │ │ │ │ - 238 template │ │ │ │ │ -239 NodeData& operator[](const Node& node) │ │ │ │ │ - 240 { │ │ │ │ │ - 241 return *(NodeData*)(data_[node.treeIndex()]); │ │ │ │ │ - 242 } │ │ │ │ │ - 243 │ │ │ │ │ - 245 template │ │ │ │ │ -246 const NodeData& operator[](const Node& node) const │ │ │ │ │ - 247 { │ │ │ │ │ - 248 return *(NodeData*)(data_[node.treeIndex()]); │ │ │ │ │ - 249 } │ │ │ │ │ - 250 │ │ │ │ │ - 251protected: │ │ │ │ │ - 252 │ │ │ │ │ -253 const Tree* tree_; │ │ │ │ │ -254 RawContainer data_; │ │ │ │ │ - 255}; │ │ │ │ │ - 256 │ │ │ │ │ - 257 │ │ │ │ │ - 258 │ │ │ │ │ - 259} // namespace Functions │ │ │ │ │ - 260} // namespace Dune │ │ │ │ │ - 261 │ │ │ │ │ - 262#endif // DUNE_FUNCTIONS_COMMON_TREEDATA_HH │ │ │ │ │ -gridviewentityset.hh │ │ │ │ │ -gridfunction.hh │ │ │ │ │ + 65 │ │ │ │ │ + 66 │ │ │ │ │ + 67}} // namespace Dune::Functions │ │ │ │ │ + 68 │ │ │ │ │ + 69#endif // DUNE_FUNCTIONS_COMMON_EXTENDED_CLONEABLE_HH │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::UniformNodeVisitor │ │ │ │ │ -Mixin for visitors that should apply the same action on all nodes. │ │ │ │ │ -Definition: treedata.hh:40 │ │ │ │ │ -Dune::Functions::UniformNodeVisitor::pre │ │ │ │ │ -void pre(Node &node, TreePath treePath) │ │ │ │ │ -Definition: treedata.hh:46 │ │ │ │ │ -Dune::Functions::UniformNodeVisitor::leaf │ │ │ │ │ -void leaf(Node &node, TreePath treePath) │ │ │ │ │ -Definition: treedata.hh:57 │ │ │ │ │ -Dune::Functions::TreeData │ │ │ │ │ -Container allowing to attach data to each node of a tree. │ │ │ │ │ -Definition: treedata.hh:95 │ │ │ │ │ -Dune::Functions::TreeData::TreeData │ │ │ │ │ -TreeData(const TreeData &other) │ │ │ │ │ -Copy constructor. │ │ │ │ │ -Definition: treedata.hh:205 │ │ │ │ │ -Dune::Functions::TreeData::init │ │ │ │ │ -void init(const Tree &tree) │ │ │ │ │ -Initialize from tree. │ │ │ │ │ -Definition: treedata.hh:196 │ │ │ │ │ -Dune::Functions::TreeData::Tree │ │ │ │ │ -T Tree │ │ │ │ │ -Type of tree the data is associated with. │ │ │ │ │ -Definition: treedata.hh:100 │ │ │ │ │ -Dune::Functions::TreeData::tree_ │ │ │ │ │ -const Tree * tree_ │ │ │ │ │ -Definition: treedata.hh:253 │ │ │ │ │ -Dune::Functions::TreeData::destroy │ │ │ │ │ -void destroy() │ │ │ │ │ -Destroy data. │ │ │ │ │ -Definition: treedata.hh:223 │ │ │ │ │ -Dune::Functions::TreeData::operator[] │ │ │ │ │ -const NodeData< Node > & operator[](const Node &node) const │ │ │ │ │ -Get reference to data associated to given node. │ │ │ │ │ -Definition: treedata.hh:246 │ │ │ │ │ -Dune::Functions::TreeData::operator= │ │ │ │ │ -TreeData & operator=(const TreeData &other) │ │ │ │ │ -Copy assignment. │ │ │ │ │ -Definition: treedata.hh:213 │ │ │ │ │ -Dune::Functions::TreeData::~TreeData │ │ │ │ │ -~TreeData() │ │ │ │ │ +Dune::Functions::PolymorphicType │ │ │ │ │ +Base class with polymorphic type boiler plate code. │ │ │ │ │ +Definition: interfaces.hh:25 │ │ │ │ │ +Dune::Functions::PolymorphicType::clone │ │ │ │ │ +virtual Interface * clone(void *buffer) const =0 │ │ │ │ │ +Clones the object into buffer. │ │ │ │ │ +Dune::Functions::PolymorphicType::clone │ │ │ │ │ +virtual Interface * clone() const =0 │ │ │ │ │ +Clones the object. │ │ │ │ │ +Dune::Functions::PolymorphicType::move │ │ │ │ │ +virtual Interface * move(void *buffer)=0 │ │ │ │ │ +Move object into buffer. │ │ │ │ │ +Dune::Functions::PolymorphicType::~PolymorphicType │ │ │ │ │ +virtual ~PolymorphicType() │ │ │ │ │ Destructor. │ │ │ │ │ -Definition: treedata.hh:231 │ │ │ │ │ -Dune::Functions::TreeData::NodeData │ │ │ │ │ -ND< Node > NodeData │ │ │ │ │ -Template to determine the data type for given node type. │ │ │ │ │ -Definition: treedata.hh:110 │ │ │ │ │ -Dune::Functions::TreeData::TreeData │ │ │ │ │ -TreeData() │ │ │ │ │ -Default constructor. │ │ │ │ │ -Definition: treedata.hh:185 │ │ │ │ │ -Dune::Functions::TreeData::RawContainer │ │ │ │ │ -std::vector< void * > RawContainer │ │ │ │ │ -Definition: treedata.hh:113 │ │ │ │ │ -Dune::Functions::TreeData::operator[] │ │ │ │ │ -NodeData< Node > & operator[](const Node &node) │ │ │ │ │ -Get mutable reference to data associated to given node. │ │ │ │ │ -Definition: treedata.hh:239 │ │ │ │ │ -Dune::Functions::TreeData::size_type │ │ │ │ │ -typename Tree::size_type size_type │ │ │ │ │ -Type used for indices and size information. │ │ │ │ │ -Definition: treedata.hh:103 │ │ │ │ │ -Dune::Functions::TreeData::data_ │ │ │ │ │ -RawContainer data_ │ │ │ │ │ -Definition: treedata.hh:254 │ │ │ │ │ -Dune::Functions::TreeData::InitVisitor │ │ │ │ │ -Definition: treedata.hh:127 │ │ │ │ │ -Dune::Functions::TreeData::InitVisitor::InitVisitor │ │ │ │ │ -InitVisitor(RawContainer &data) │ │ │ │ │ -Definition: treedata.hh:128 │ │ │ │ │ -Dune::Functions::TreeData::InitVisitor::apply │ │ │ │ │ -void apply(Node &node, TreePath treePath) │ │ │ │ │ -Definition: treedata.hh:133 │ │ │ │ │ -Dune::Functions::TreeData::InitVisitor::data_ │ │ │ │ │ -RawContainer & data_ │ │ │ │ │ -Definition: treedata.hh:142 │ │ │ │ │ -Dune::Functions::TreeData::DestroyVisitor │ │ │ │ │ -Definition: treedata.hh:147 │ │ │ │ │ -Dune::Functions::TreeData::DestroyVisitor::data_ │ │ │ │ │ -RawContainer & data_ │ │ │ │ │ -Definition: treedata.hh:161 │ │ │ │ │ -Dune::Functions::TreeData::DestroyVisitor::DestroyVisitor │ │ │ │ │ -DestroyVisitor(RawContainer &data) │ │ │ │ │ -Definition: treedata.hh:148 │ │ │ │ │ -Dune::Functions::TreeData::DestroyVisitor::apply │ │ │ │ │ -void apply(Node &node, TreePath treePath) │ │ │ │ │ -Definition: treedata.hh:153 │ │ │ │ │ -Dune::Functions::TreeData::CopyVisitor │ │ │ │ │ -Definition: treedata.hh:166 │ │ │ │ │ -Dune::Functions::TreeData::CopyVisitor::CopyVisitor │ │ │ │ │ -CopyVisitor(TreeData &thisTD, const TreeData &otherTD) │ │ │ │ │ -Definition: treedata.hh:167 │ │ │ │ │ -Dune::Functions::TreeData::CopyVisitor::apply │ │ │ │ │ -void apply(Node &node, TreePath treePath) │ │ │ │ │ -Definition: treedata.hh:173 │ │ │ │ │ -Dune::Functions::TreeData::CopyVisitor::thisTD_ │ │ │ │ │ -TreeData & thisTD_ │ │ │ │ │ -Definition: treedata.hh:178 │ │ │ │ │ -Dune::Functions::TreeData::CopyVisitor::otherTD_ │ │ │ │ │ -const TreeData & otherTD_ │ │ │ │ │ -Definition: treedata.hh:179 │ │ │ │ │ +Definition: interfaces.hh:29 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00056.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: callable.hh File Reference │ │ │ │ +dune-functions: multiindex.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -66,47 +66,47 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
callable.hh File Reference
│ │ │ │ +
multiindex.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <memory>
│ │ │ │ -#include <functional>
│ │ │ │ -#include <dune/common/function.hh>
│ │ │ │ -#include <dune/common/shared_ptr.hh>
│ │ │ │ +
#include <cstddef>
│ │ │ │ +#include <array>
│ │ │ │ +#include <iostream>
│ │ │ │ +#include <dune/common/hash.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Classes

class  Dune::Functions::CallableFunctionWrapper< F >
 Wrap a Dune::VirtualFunction into a callable object. More...
class  Dune::Functions::StaticMultiIndex< size_type, n >
 A statically sized MultiIndex type. More...
 
class  Dune::Functions::StaticMultiIndex< size_type, 1 >
 A statically sized MultiIndex type. More...
 
struct  std::tuple_size< Dune::Functions::StaticMultiIndex< size_type, n > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<class F >
CallableFunctionWrapper< F > Dune::Functions::callable (const F &f)
 Create a callable object from some Dune::VirtualFunction. More...
 
template<class F >
CallableFunctionWrapper< F > Dune::Functions::callable (const std::shared_ptr< F > &fp)
 Create a callable object from std::shared_ptr<F> More...
 
template<typename Stream , class size_type , std::size_t n>
Stream & Dune::Functions::operator<< (Stream &stream, const StaticMultiIndex< size_type, n > &c)
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -6,37 +6,35 @@ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ Classes | Namespaces | Functions │ │ │ │ │ -callable.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +multiindex.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::CallableFunctionWrapper<_F_> │ │ │ │ │ -  Wrap a Dune::VirtualFunction into a callable object. More... │ │ │ │ │ + class  Dune::Functions::StaticMultiIndex<_size_type,_n_> │ │ │ │ │ +  A statically sized MultiIndex type. More... │ │ │ │ │ +  │ │ │ │ │ + class  Dune::Functions::StaticMultiIndex<_size_type,_1_> │ │ │ │ │ +  A statically sized MultiIndex type. More... │ │ │ │ │ +  │ │ │ │ │ +struct  std::tuple_size<_Dune::Functions::StaticMultiIndex<_size_type,_n_>_> │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ -CallableFunctionWrapper< F > Dune::Functions::callable (const F &f) │ │ │ │ │ -  Create a callable object from some Dune:: │ │ │ │ │ - VirtualFunction. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -CallableFunctionWrapper< F > Dune::Functions::callable (const std::shared_ptr< │ │ │ │ │ - F > &fp) │ │ │ │ │ -  Create a callable object from std::shared_ptr │ │ │ │ │ - More... │ │ │ │ │ +template │ │ │ │ │ +Stream & Dune::Functions::operator<< (Stream &stream, const StaticMultiIndex< │ │ │ │ │ + size_type, n > &c) │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00056_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: callable.hh Source File │ │ │ │ +dune-functions: multiindex.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,90 +62,98 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
callable.hh
│ │ │ │ +
multiindex.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#ifndef DUNE_FUNCTIONS_COMMON_CALLABLE_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_COMMON_CALLABLE_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_COMMON_MULTIINDEX_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_COMMON_MULTIINDEX_HH
│ │ │ │
5
│ │ │ │ -
6#include <memory>
│ │ │ │ -
7#include <functional>
│ │ │ │ -
8
│ │ │ │ -
9#include <dune/common/function.hh>
│ │ │ │ -
10#include <dune/common/shared_ptr.hh>
│ │ │ │ +
6#include <cstddef>
│ │ │ │ +
7#include <array>
│ │ │ │ +
8#include <iostream>
│ │ │ │ +
9
│ │ │ │ +
10#include <dune/common/hash.hh>
│ │ │ │
11
│ │ │ │
12
│ │ │ │ -
13namespace Dune {
│ │ │ │ -
14namespace Functions {
│ │ │ │ +
13namespace Dune::Functions {
│ │ │ │ +
14
│ │ │ │
15
│ │ │ │
16
│ │ │ │ -
17
│ │ │ │ -
18
│ │ │ │ -
36template<class F>
│ │ │ │ - │ │ │ │ -
38{
│ │ │ │ -
39 using Range = typename F::RangeType;
│ │ │ │ -
40 using Domain = typename F::DomainType;
│ │ │ │ -
41
│ │ │ │ -
42 public:
│ │ │ │ -
43
│ │ │ │ - │ │ │ │ -
51 {
│ │ │ │ -
52 f_ = Dune::stackobject_to_shared_ptr(f);
│ │ │ │ -
53 }
│ │ │ │ -
54
│ │ │ │ -
61 CallableFunctionWrapper(const std::shared_ptr<const F>& f) :
│ │ │ │ -
62 f_(f)
│ │ │ │ -
63 {}
│ │ │ │ -
64
│ │ │ │ -
70 Range operator()(const Domain& x) const
│ │ │ │ -
71 {
│ │ │ │ -
72 Range y;
│ │ │ │ -
73 f_->evaluate(x, y);
│ │ │ │ -
74 return y;
│ │ │ │ -
75 }
│ │ │ │ +
22template<class size_type, std::size_t n>
│ │ │ │ + │ │ │ │ +
24 public std::array<size_type, n>
│ │ │ │ +
25{
│ │ │ │ +
26public:
│ │ │ │ +
27 static constexpr std::size_t size() { return n; }
│ │ │ │ +
28
│ │ │ │ +
29 inline friend std::size_t hash_value(const StaticMultiIndex& v) noexcept {
│ │ │ │ +
30 return hash_range(v.begin(), v.end());
│ │ │ │ +
31 }
│ │ │ │ +
32
│ │ │ │ +
33};
│ │ │ │ +
34
│ │ │ │ +
35
│ │ │ │ +
36
│ │ │ │ +
46template<class size_type>
│ │ │ │ +
47class StaticMultiIndex<size_type,1> :
│ │ │ │ +
48 public std::array<size_type, 1>
│ │ │ │ +
49{
│ │ │ │ +
50public:
│ │ │ │ +
51
│ │ │ │ +
52 static constexpr std::size_t size() { return 1; }
│ │ │ │ +
53
│ │ │ │ +
54 operator const size_type& () const {
│ │ │ │ +
55 return (*this)[0];
│ │ │ │ +
56 }
│ │ │ │ +
57
│ │ │ │ +
58 inline friend std::size_t hash_value(const StaticMultiIndex& v) noexcept {
│ │ │ │ +
59 return hash_range(v.begin(), v.end());
│ │ │ │ +
60 }
│ │ │ │ +
61
│ │ │ │ +
62 operator size_type& () {
│ │ │ │ +
63 return (*this)[0];
│ │ │ │ +
64 }
│ │ │ │ +
65
│ │ │ │ +
66};
│ │ │ │ +
67
│ │ │ │ +
68
│ │ │ │ +
69
│ │ │ │ +
70template<typename Stream, class size_type, std::size_t n>
│ │ │ │ +
71inline Stream& operator<<(Stream& stream, const StaticMultiIndex<size_type,n>& c) {
│ │ │ │ +
72 for (const auto& ci : c)
│ │ │ │ +
73 stream << ci << " ";
│ │ │ │ +
74 return stream;
│ │ │ │ +
75}
│ │ │ │
76
│ │ │ │ -
77 private:
│ │ │ │ -
78 std::shared_ptr<const F> f_;
│ │ │ │ -
79};
│ │ │ │ +
77
│ │ │ │ +
78
│ │ │ │ +
79} // namespace Dune::Functions
│ │ │ │
80
│ │ │ │ -
81
│ │ │ │ -
82
│ │ │ │ -
104template<class F>
│ │ │ │ - │ │ │ │ -
106{
│ │ │ │ - │ │ │ │ -
108}
│ │ │ │ -
109
│ │ │ │ -
110
│ │ │ │ -
136template<class F>
│ │ │ │ -
137CallableFunctionWrapper<F> callable(const std::shared_ptr<F>& fp)
│ │ │ │ -
138{
│ │ │ │ - │ │ │ │ -
140}
│ │ │ │ -
141
│ │ │ │ -
142
│ │ │ │ -
143
│ │ │ │ -
144} // namespace Functions
│ │ │ │ -
145} // namespace Dune
│ │ │ │ -
146
│ │ │ │ -
147#endif //DUNE_FUNCTIONS_COMMON_CALLABLE_HH
│ │ │ │ -
CallableFunctionWrapper< F > callable(const F &f)
Create a callable object from some Dune::VirtualFunction.
Definition: callable.hh:105
│ │ │ │ +
81template<class size_type, std::size_t n>
│ │ │ │ +
82struct std::tuple_size< Dune::Functions::StaticMultiIndex<size_type,n> >
│ │ │ │ +
83 : std::integral_constant<std::size_t, n> { };
│ │ │ │ +
84
│ │ │ │ +
85DUNE_DEFINE_HASH(DUNE_HASH_TEMPLATE_ARGS(typename size_type, std::size_t n),DUNE_HASH_TYPE(Dune::Functions::StaticMultiIndex<size_type,n>))
│ │ │ │ +
86
│ │ │ │ +
87#endif // DUNE_FUNCTIONS_COMMON_MULTIINDEX_HH
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
Wrap a Dune::VirtualFunction into a callable object.
Definition: callable.hh:38
│ │ │ │ -
Range operator()(const Domain &x) const
Forward operator() to F::evaluate()
Definition: callable.hh:70
│ │ │ │ -
CallableFunctionWrapper(const F &f)
Instantiate from reference to f.
Definition: callable.hh:50
│ │ │ │ -
CallableFunctionWrapper(const std::shared_ptr< const F > &f)
Instantiate from std::shared_ptr to f.
Definition: callable.hh:61
│ │ │ │ +
Definition: polynomial.hh:11
│ │ │ │ +
Stream & operator<<(Stream &stream, const StaticMultiIndex< size_type, n > &c)
Definition: multiindex.hh:71
│ │ │ │ +
A statically sized MultiIndex type.
Definition: multiindex.hh:25
│ │ │ │ +
static constexpr std::size_t size()
Definition: multiindex.hh:27
│ │ │ │ +
friend std::size_t hash_value(const StaticMultiIndex &v) noexcept
Definition: multiindex.hh:29
│ │ │ │ +
static constexpr std::size_t size()
Definition: multiindex.hh:52
│ │ │ │ +
friend std::size_t hash_value(const StaticMultiIndex &v) noexcept
Definition: multiindex.hh:58
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,100 +5,109 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -callable.hh │ │ │ │ │ +multiindex.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#ifndef DUNE_FUNCTIONS_COMMON_CALLABLE_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_COMMON_CALLABLE_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_COMMON_MULTIINDEX_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_COMMON_MULTIINDEX_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ - 8 │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8#include │ │ │ │ │ + 9 │ │ │ │ │ + 10#include │ │ │ │ │ 11 │ │ │ │ │ 12 │ │ │ │ │ - 13namespace Dune { │ │ │ │ │ - 14namespace Functions { │ │ │ │ │ + 13namespace Dune::Functions { │ │ │ │ │ + 14 │ │ │ │ │ 15 │ │ │ │ │ 16 │ │ │ │ │ - 17 │ │ │ │ │ - 18 │ │ │ │ │ - 36template │ │ │ │ │ -37class CallableFunctionWrapper │ │ │ │ │ - 38{ │ │ │ │ │ - 39 using Range = typename F::RangeType; │ │ │ │ │ - 40 using Domain = typename F::DomainType; │ │ │ │ │ - 41 │ │ │ │ │ - 42 public: │ │ │ │ │ - 43 │ │ │ │ │ -50 CallableFunctionWrapper(const F& f) │ │ │ │ │ - 51 { │ │ │ │ │ - 52 f_ = Dune::stackobject_to_shared_ptr(f); │ │ │ │ │ - 53 } │ │ │ │ │ - 54 │ │ │ │ │ -61 CallableFunctionWrapper(const std::shared_ptr& f) : │ │ │ │ │ - 62 f_(f) │ │ │ │ │ - 63 {} │ │ │ │ │ - 64 │ │ │ │ │ -70 Range operator()(const Domain& x) const │ │ │ │ │ - 71 { │ │ │ │ │ - 72 Range y; │ │ │ │ │ - 73 f_->evaluate(x, y); │ │ │ │ │ - 74 return y; │ │ │ │ │ - 75 } │ │ │ │ │ + 22template │ │ │ │ │ +23class StaticMultiIndex : │ │ │ │ │ + 24 public std::array │ │ │ │ │ + 25{ │ │ │ │ │ + 26public: │ │ │ │ │ +27 static constexpr std::size_t size() { return n; } │ │ │ │ │ + 28 │ │ │ │ │ +29 inline friend std::size_t hash_value(const StaticMultiIndex& v) noexcept { │ │ │ │ │ + 30 return hash_range(v.begin(), v.end()); │ │ │ │ │ + 31 } │ │ │ │ │ + 32 │ │ │ │ │ + 33}; │ │ │ │ │ + 34 │ │ │ │ │ + 35 │ │ │ │ │ + 36 │ │ │ │ │ + 46template │ │ │ │ │ +47class StaticMultiIndex : │ │ │ │ │ + 48 public std::array │ │ │ │ │ + 49{ │ │ │ │ │ + 50public: │ │ │ │ │ + 51 │ │ │ │ │ +52 static constexpr std::size_t size() { return 1; } │ │ │ │ │ + 53 │ │ │ │ │ +54 operator const size_type& () const { │ │ │ │ │ + 55 return (*this)[0]; │ │ │ │ │ + 56 } │ │ │ │ │ + 57 │ │ │ │ │ +58 inline friend std::size_t hash_value(const StaticMultiIndex& v) noexcept { │ │ │ │ │ + 59 return hash_range(v.begin(), v.end()); │ │ │ │ │ + 60 } │ │ │ │ │ + 61 │ │ │ │ │ +62 operator size_type& () { │ │ │ │ │ + 63 return (*this)[0]; │ │ │ │ │ + 64 } │ │ │ │ │ + 65 │ │ │ │ │ + 66}; │ │ │ │ │ + 67 │ │ │ │ │ + 68 │ │ │ │ │ + 69 │ │ │ │ │ + 70template │ │ │ │ │ +71inline Stream& operator<<(Stream& stream, const │ │ │ │ │ +StaticMultiIndex& c) { │ │ │ │ │ + 72 for (const auto& ci : c) │ │ │ │ │ + 73 stream << ci << " "; │ │ │ │ │ + 74 return stream; │ │ │ │ │ + 75} │ │ │ │ │ 76 │ │ │ │ │ - 77 private: │ │ │ │ │ - 78 std::shared_ptr f_; │ │ │ │ │ - 79}; │ │ │ │ │ + 77 │ │ │ │ │ + 78 │ │ │ │ │ + 79} // namespace Dune::Functions │ │ │ │ │ 80 │ │ │ │ │ - 81 │ │ │ │ │ - 82 │ │ │ │ │ - 104template │ │ │ │ │ -105CallableFunctionWrapper callable(const F& f) │ │ │ │ │ - 106{ │ │ │ │ │ - 107 return CallableFunctionWrapper(f); │ │ │ │ │ - 108} │ │ │ │ │ - 109 │ │ │ │ │ - 110 │ │ │ │ │ - 136template │ │ │ │ │ -137CallableFunctionWrapper callable(const std::shared_ptr& fp) │ │ │ │ │ - 138{ │ │ │ │ │ - 139 return CallableFunctionWrapper(fp); │ │ │ │ │ - 140} │ │ │ │ │ - 141 │ │ │ │ │ - 142 │ │ │ │ │ - 143 │ │ │ │ │ - 144} // namespace Functions │ │ │ │ │ - 145} // namespace Dune │ │ │ │ │ - 146 │ │ │ │ │ - 147#endif //DUNE_FUNCTIONS_COMMON_CALLABLE_HH │ │ │ │ │ -Dune::Functions::callable │ │ │ │ │ -CallableFunctionWrapper< F > callable(const F &f) │ │ │ │ │ -Create a callable object from some Dune::VirtualFunction. │ │ │ │ │ -Definition: callable.hh:105 │ │ │ │ │ + 81template │ │ │ │ │ +82struct std::tuple_size< Dune::Functions::StaticMultiIndex > │ │ │ │ │ + 83 : std::integral_constant { }; │ │ │ │ │ + 84 │ │ │ │ │ + 85DUNE_DEFINE_HASH(DUNE_HASH_TEMPLATE_ARGS(typename size_type, std::size_t │ │ │ │ │ +n),DUNE_HASH_TYPE(Dune::Functions::StaticMultiIndex)) │ │ │ │ │ + 86 │ │ │ │ │ + 87#endif // DUNE_FUNCTIONS_COMMON_MULTIINDEX_HH │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::CallableFunctionWrapper │ │ │ │ │ -Wrap a Dune::VirtualFunction into a callable object. │ │ │ │ │ -Definition: callable.hh:38 │ │ │ │ │ -Dune::Functions::CallableFunctionWrapper::operator() │ │ │ │ │ -Range operator()(const Domain &x) const │ │ │ │ │ -Forward operator() to F::evaluate() │ │ │ │ │ -Definition: callable.hh:70 │ │ │ │ │ -Dune::Functions::CallableFunctionWrapper::CallableFunctionWrapper │ │ │ │ │ -CallableFunctionWrapper(const F &f) │ │ │ │ │ -Instantiate from reference to f. │ │ │ │ │ -Definition: callable.hh:50 │ │ │ │ │ -Dune::Functions::CallableFunctionWrapper::CallableFunctionWrapper │ │ │ │ │ -CallableFunctionWrapper(const std::shared_ptr< const F > &f) │ │ │ │ │ -Instantiate from std::shared_ptr to f. │ │ │ │ │ -Definition: callable.hh:61 │ │ │ │ │ +Dune::Functions │ │ │ │ │ +Definition: polynomial.hh:11 │ │ │ │ │ +Dune::Functions::operator<< │ │ │ │ │ +Stream & operator<<(Stream &stream, const StaticMultiIndex< size_type, n > &c) │ │ │ │ │ +Definition: multiindex.hh:71 │ │ │ │ │ +Dune::Functions::StaticMultiIndex │ │ │ │ │ +A statically sized MultiIndex type. │ │ │ │ │ +Definition: multiindex.hh:25 │ │ │ │ │ +Dune::Functions::StaticMultiIndex::size │ │ │ │ │ +static constexpr std::size_t size() │ │ │ │ │ +Definition: multiindex.hh:27 │ │ │ │ │ +Dune::Functions::StaticMultiIndex::hash_value │ │ │ │ │ +friend std::size_t hash_value(const StaticMultiIndex &v) noexcept │ │ │ │ │ +Definition: multiindex.hh:29 │ │ │ │ │ +Dune::Functions::StaticMultiIndex<_size_type,_1_>::size │ │ │ │ │ +static constexpr std::size_t size() │ │ │ │ │ +Definition: multiindex.hh:52 │ │ │ │ │ +Dune::Functions::StaticMultiIndex<_size_type,_1_>::hash_value │ │ │ │ │ +friend std::size_t hash_value(const StaticMultiIndex &v) noexcept │ │ │ │ │ +Definition: multiindex.hh:58 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00059.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: multiindex.hh File Reference │ │ │ │ +dune-functions: functionfromcallable.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -64,49 +64,35 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
multiindex.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
functionfromcallable.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <cstddef>
│ │ │ │ -#include <array>
│ │ │ │ -#include <iostream>
│ │ │ │ -#include <dune/common/hash.hh>
│ │ │ │ +
#include <dune/common/function.hh>
│ │ │ │ +#include <dune/functions/common/signature.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::StaticMultiIndex< size_type, n >
 A statically sized MultiIndex type. More...
 
class  Dune::Functions::StaticMultiIndex< size_type, 1 >
 A statically sized MultiIndex type. More...
 
struct  std::tuple_size< Dune::Functions::StaticMultiIndex< size_type, n > >
class  Dune::Functions::FunctionFromCallable< Range(Domain), F, FunctionInterface >
 Wrap a callable object as Dune::Function or Dune::VirtualFunction. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<typename Stream , class size_type , std::size_t n>
Stream & Dune::Functions::operator<< (Stream &stream, const StaticMultiIndex< size_type, n > &c)
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,36 +5,26 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -Classes | Namespaces | Functions │ │ │ │ │ -multiindex.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces │ │ │ │ │ +functionfromcallable.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ - class  Dune::Functions::StaticMultiIndex<_size_type,_n_> │ │ │ │ │ -  A statically sized MultiIndex type. More... │ │ │ │ │ -  │ │ │ │ │ - class  Dune::Functions::StaticMultiIndex<_size_type,_1_> │ │ │ │ │ -  A statically sized MultiIndex type. More... │ │ │ │ │ -  │ │ │ │ │ -struct  std::tuple_size<_Dune::Functions::StaticMultiIndex<_size_type,_n_>_> │ │ │ │ │ +class  Dune::Functions::FunctionFromCallable<_Range(Domain),_F, │ │ │ │ │ + FunctionInterface_> │ │ │ │ │ +  Wrap a callable object as Dune::Function or Dune::VirtualFunction. │ │ │ │ │ + More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ - Functions │ │ │ │ │ -template │ │ │ │ │ -Stream & Dune::Functions::operator<< (Stream &stream, const StaticMultiIndex< │ │ │ │ │ - size_type, n > &c) │ │ │ │ │ -  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00059_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: multiindex.hh Source File │ │ │ │ +dune-functions: functionfromcallable.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,98 +62,73 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
multiindex.hh
│ │ │ │ +
functionfromcallable.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#ifndef DUNE_FUNCTIONS_COMMON_MULTIINDEX_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_COMMON_MULTIINDEX_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_COMMON_FUNCTION_FROM_CALLABLE_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_COMMON_FUNCTION_FROM_CALLABLE_HH
│ │ │ │
5
│ │ │ │ -
6#include <cstddef>
│ │ │ │ -
7#include <array>
│ │ │ │ -
8#include <iostream>
│ │ │ │ +
6#include <dune/common/function.hh>
│ │ │ │ +
7
│ │ │ │ + │ │ │ │
9
│ │ │ │ -
10#include <dune/common/hash.hh>
│ │ │ │ -
11
│ │ │ │ -
12
│ │ │ │ -
13namespace Dune::Functions {
│ │ │ │ +
10
│ │ │ │ +
11namespace Dune {
│ │ │ │ +
12namespace Functions {
│ │ │ │ +
13
│ │ │ │
14
│ │ │ │
15
│ │ │ │ -
16
│ │ │ │ -
22template<class size_type, std::size_t n>
│ │ │ │ - │ │ │ │ -
24 public std::array<size_type, n>
│ │ │ │ -
25{
│ │ │ │ -
26public:
│ │ │ │ -
27 static constexpr std::size_t size() { return n; }
│ │ │ │ -
28
│ │ │ │ -
29 inline friend std::size_t hash_value(const StaticMultiIndex& v) noexcept {
│ │ │ │ -
30 return hash_range(v.begin(), v.end());
│ │ │ │ -
31 }
│ │ │ │ -
32
│ │ │ │ -
33};
│ │ │ │ -
34
│ │ │ │ -
35
│ │ │ │ -
36
│ │ │ │ -
46template<class size_type>
│ │ │ │ -
47class StaticMultiIndex<size_type,1> :
│ │ │ │ -
48 public std::array<size_type, 1>
│ │ │ │ -
49{
│ │ │ │ -
50public:
│ │ │ │ -
51
│ │ │ │ -
52 static constexpr std::size_t size() { return 1; }
│ │ │ │ -
53
│ │ │ │ -
54 operator const size_type& () const {
│ │ │ │ -
55 return (*this)[0];
│ │ │ │ -
56 }
│ │ │ │ -
57
│ │ │ │ -
58 inline friend std::size_t hash_value(const StaticMultiIndex& v) noexcept {
│ │ │ │ -
59 return hash_range(v.begin(), v.end());
│ │ │ │ -
60 }
│ │ │ │ -
61
│ │ │ │ -
62 operator size_type& () {
│ │ │ │ -
63 return (*this)[0];
│ │ │ │ -
64 }
│ │ │ │ -
65
│ │ │ │ -
66};
│ │ │ │ +
16template<class Signature, class F,
│ │ │ │ +
17 class FunctionInterface = typename Dune::VirtualFunction<
│ │ │ │ +
18 typename SignatureTraits<Signature>::RawDomain,
│ │ │ │ +
19 typename SignatureTraits<Signature>::RawRange> >
│ │ │ │ + │ │ │ │ +
21
│ │ │ │ +
37template<class Range, class Domain, class F, class FunctionInterface>
│ │ │ │ +
38class FunctionFromCallable<Range(Domain), F, FunctionInterface> :
│ │ │ │ +
39 public FunctionInterface
│ │ │ │ +
40{
│ │ │ │ +
41public:
│ │ │ │ +
42
│ │ │ │ + │ │ │ │ +
53 f_(f)
│ │ │ │ +
54 {}
│ │ │ │ +
55
│ │ │ │ + │ │ │ │ +
65 f_(f)
│ │ │ │ +
66 {}
│ │ │ │
67
│ │ │ │ -
68
│ │ │ │ -
69
│ │ │ │ -
70template<typename Stream, class size_type, std::size_t n>
│ │ │ │ -
71inline Stream& operator<<(Stream& stream, const StaticMultiIndex<size_type,n>& c) {
│ │ │ │ -
72 for (const auto& ci : c)
│ │ │ │ -
73 stream << ci << " ";
│ │ │ │ -
74 return stream;
│ │ │ │ -
75}
│ │ │ │ -
76
│ │ │ │ +
73 void evaluate(const Domain& x, Range&y) const
│ │ │ │ +
74 {
│ │ │ │ +
75 y = f_(x);
│ │ │ │ +
76 }
│ │ │ │
77
│ │ │ │ -
78
│ │ │ │ -
79} // namespace Dune::Functions
│ │ │ │ -
80
│ │ │ │ -
81template<class size_type, std::size_t n>
│ │ │ │ -
82struct std::tuple_size< Dune::Functions::StaticMultiIndex<size_type,n> >
│ │ │ │ -
83 : std::integral_constant<std::size_t, n> { };
│ │ │ │ -
84
│ │ │ │ -
85DUNE_DEFINE_HASH(DUNE_HASH_TEMPLATE_ARGS(typename size_type, std::size_t n),DUNE_HASH_TYPE(Dune::Functions::StaticMultiIndex<size_type,n>))
│ │ │ │ +
78private:
│ │ │ │ +
79 F f_;
│ │ │ │ +
80};
│ │ │ │ +
81
│ │ │ │ +
82
│ │ │ │ +
83
│ │ │ │ +
84} // namespace Functions
│ │ │ │ +
85} // namespace Dune
│ │ │ │
86
│ │ │ │ -
87#endif // DUNE_FUNCTIONS_COMMON_MULTIINDEX_HH
│ │ │ │ +
87#endif //DUNE_FUNCTIONS_COMMON_FUNCTION_FROM_CALLABLE_HH
│ │ │ │ + │ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
Definition: polynomial.hh:11
│ │ │ │ -
Stream & operator<<(Stream &stream, const StaticMultiIndex< size_type, n > &c)
Definition: multiindex.hh:71
│ │ │ │ -
A statically sized MultiIndex type.
Definition: multiindex.hh:25
│ │ │ │ -
static constexpr std::size_t size()
Definition: multiindex.hh:27
│ │ │ │ -
friend std::size_t hash_value(const StaticMultiIndex &v) noexcept
Definition: multiindex.hh:29
│ │ │ │ -
static constexpr std::size_t size()
Definition: multiindex.hh:52
│ │ │ │ -
friend std::size_t hash_value(const StaticMultiIndex &v) noexcept
Definition: multiindex.hh:58
│ │ │ │ +
Definition: functionfromcallable.hh:20
│ │ │ │ +
FunctionFromCallable(F &&f)
Create VirtualFunction from callable object.
Definition: functionfromcallable.hh:52
│ │ │ │ +
void evaluate(const Domain &x, Range &y) const
Evaluate function.
Definition: functionfromcallable.hh:73
│ │ │ │ +
FunctionFromCallable(const F &f)
Create VirtualFunction from callable object.
Definition: functionfromcallable.hh:64
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,109 +5,82 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -multiindex.hh │ │ │ │ │ +functionfromcallable.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#ifndef DUNE_FUNCTIONS_COMMON_MULTIINDEX_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_COMMON_MULTIINDEX_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_COMMON_FUNCTION_FROM_CALLABLE_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_COMMON_FUNCTION_FROM_CALLABLE_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ - 8#include │ │ │ │ │ + 6#include │ │ │ │ │ + 7 │ │ │ │ │ + 8#include │ │ │ │ │ 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11 │ │ │ │ │ - 12 │ │ │ │ │ - 13namespace Dune::Functions { │ │ │ │ │ + 10 │ │ │ │ │ + 11namespace Dune { │ │ │ │ │ + 12namespace Functions { │ │ │ │ │ + 13 │ │ │ │ │ 14 │ │ │ │ │ 15 │ │ │ │ │ - 16 │ │ │ │ │ - 22template │ │ │ │ │ -23class StaticMultiIndex : │ │ │ │ │ - 24 public std::array │ │ │ │ │ - 25{ │ │ │ │ │ - 26public: │ │ │ │ │ -27 static constexpr std::size_t size() { return n; } │ │ │ │ │ - 28 │ │ │ │ │ -29 inline friend std::size_t hash_value(const StaticMultiIndex& v) noexcept { │ │ │ │ │ - 30 return hash_range(v.begin(), v.end()); │ │ │ │ │ - 31 } │ │ │ │ │ - 32 │ │ │ │ │ - 33}; │ │ │ │ │ - 34 │ │ │ │ │ - 35 │ │ │ │ │ - 36 │ │ │ │ │ - 46template │ │ │ │ │ -47class StaticMultiIndex : │ │ │ │ │ - 48 public std::array │ │ │ │ │ - 49{ │ │ │ │ │ - 50public: │ │ │ │ │ - 51 │ │ │ │ │ -52 static constexpr std::size_t size() { return 1; } │ │ │ │ │ - 53 │ │ │ │ │ -54 operator const size_type& () const { │ │ │ │ │ - 55 return (*this)[0]; │ │ │ │ │ - 56 } │ │ │ │ │ - 57 │ │ │ │ │ -58 inline friend std::size_t hash_value(const StaticMultiIndex& v) noexcept { │ │ │ │ │ - 59 return hash_range(v.begin(), v.end()); │ │ │ │ │ - 60 } │ │ │ │ │ - 61 │ │ │ │ │ -62 operator size_type& () { │ │ │ │ │ - 63 return (*this)[0]; │ │ │ │ │ - 64 } │ │ │ │ │ - 65 │ │ │ │ │ - 66}; │ │ │ │ │ + 16template::RawDomain, │ │ │ │ │ + 19 typename SignatureTraits::RawRange> > │ │ │ │ │ +20class FunctionFromCallable; │ │ │ │ │ + 21 │ │ │ │ │ + 37template │ │ │ │ │ +38class FunctionFromCallable : │ │ │ │ │ + 39 public FunctionInterface │ │ │ │ │ + 40{ │ │ │ │ │ + 41public: │ │ │ │ │ + 42 │ │ │ │ │ +52 FunctionFromCallable(F&& f) : │ │ │ │ │ + 53 f_(f) │ │ │ │ │ + 54 {} │ │ │ │ │ + 55 │ │ │ │ │ +64 FunctionFromCallable(const F& f) : │ │ │ │ │ + 65 f_(f) │ │ │ │ │ + 66 {} │ │ │ │ │ 67 │ │ │ │ │ - 68 │ │ │ │ │ - 69 │ │ │ │ │ - 70template │ │ │ │ │ -71inline Stream& operator<<(Stream& stream, const │ │ │ │ │ -StaticMultiIndex& c) { │ │ │ │ │ - 72 for (const auto& ci : c) │ │ │ │ │ - 73 stream << ci << " "; │ │ │ │ │ - 74 return stream; │ │ │ │ │ - 75} │ │ │ │ │ - 76 │ │ │ │ │ +73 void evaluate(const Domain& x, Range&y) const │ │ │ │ │ + 74 { │ │ │ │ │ + 75 y = f_(x); │ │ │ │ │ + 76 } │ │ │ │ │ 77 │ │ │ │ │ - 78 │ │ │ │ │ - 79} // namespace Dune::Functions │ │ │ │ │ - 80 │ │ │ │ │ - 81template │ │ │ │ │ -82struct std::tuple_size< Dune::Functions::StaticMultiIndex > │ │ │ │ │ - 83 : std::integral_constant { }; │ │ │ │ │ - 84 │ │ │ │ │ - 85DUNE_DEFINE_HASH(DUNE_HASH_TEMPLATE_ARGS(typename size_type, std::size_t │ │ │ │ │ -n),DUNE_HASH_TYPE(Dune::Functions::StaticMultiIndex)) │ │ │ │ │ + 78private: │ │ │ │ │ + 79 F f_; │ │ │ │ │ + 80}; │ │ │ │ │ + 81 │ │ │ │ │ + 82 │ │ │ │ │ + 83 │ │ │ │ │ + 84} // namespace Functions │ │ │ │ │ + 85} // namespace Dune │ │ │ │ │ 86 │ │ │ │ │ - 87#endif // DUNE_FUNCTIONS_COMMON_MULTIINDEX_HH │ │ │ │ │ + 87#endif //DUNE_FUNCTIONS_COMMON_FUNCTION_FROM_CALLABLE_HH │ │ │ │ │ +signature.hh │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions │ │ │ │ │ -Definition: polynomial.hh:11 │ │ │ │ │ -Dune::Functions::operator<< │ │ │ │ │ -Stream & operator<<(Stream &stream, const StaticMultiIndex< size_type, n > &c) │ │ │ │ │ -Definition: multiindex.hh:71 │ │ │ │ │ -Dune::Functions::StaticMultiIndex │ │ │ │ │ -A statically sized MultiIndex type. │ │ │ │ │ -Definition: multiindex.hh:25 │ │ │ │ │ -Dune::Functions::StaticMultiIndex::size │ │ │ │ │ -static constexpr std::size_t size() │ │ │ │ │ -Definition: multiindex.hh:27 │ │ │ │ │ -Dune::Functions::StaticMultiIndex::hash_value │ │ │ │ │ -friend std::size_t hash_value(const StaticMultiIndex &v) noexcept │ │ │ │ │ -Definition: multiindex.hh:29 │ │ │ │ │ -Dune::Functions::StaticMultiIndex<_size_type,_1_>::size │ │ │ │ │ -static constexpr std::size_t size() │ │ │ │ │ -Definition: multiindex.hh:52 │ │ │ │ │ -Dune::Functions::StaticMultiIndex<_size_type,_1_>::hash_value │ │ │ │ │ -friend std::size_t hash_value(const StaticMultiIndex &v) noexcept │ │ │ │ │ -Definition: multiindex.hh:58 │ │ │ │ │ +Dune::Functions::FunctionFromCallable │ │ │ │ │ +Definition: functionfromcallable.hh:20 │ │ │ │ │ +Dune::Functions::FunctionFromCallable<_Range(Domain),_F,_FunctionInterface_>:: │ │ │ │ │ +FunctionFromCallable │ │ │ │ │ +FunctionFromCallable(F &&f) │ │ │ │ │ +Create VirtualFunction from callable object. │ │ │ │ │ +Definition: functionfromcallable.hh:52 │ │ │ │ │ +Dune::Functions::FunctionFromCallable<_Range(Domain),_F,_FunctionInterface_>:: │ │ │ │ │ +evaluate │ │ │ │ │ +void evaluate(const Domain &x, Range &y) const │ │ │ │ │ +Evaluate function. │ │ │ │ │ +Definition: functionfromcallable.hh:73 │ │ │ │ │ +Dune::Functions::FunctionFromCallable<_Range(Domain),_F,_FunctionInterface_>:: │ │ │ │ │ +FunctionFromCallable │ │ │ │ │ +FunctionFromCallable(const F &f) │ │ │ │ │ +Create VirtualFunction from callable object. │ │ │ │ │ +Definition: functionfromcallable.hh:64 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00062.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: localfunction.hh File Reference │ │ │ │ +dune-functions: polymorphicsmallobject.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,33 +65,26 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
localfunction.hh File Reference
│ │ │ │ +
polymorphicsmallobject.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ -#include <dune/common/typeutilities.hh>
│ │ │ │ -#include <dune/functions/common/defaultderivativetraits.hh>
│ │ │ │ -#include <dune/functions/common/differentiablefunction.hh>
│ │ │ │ -#include <dune/functions/common/localfunction_imp.hh>
│ │ │ │ -#include <dune/functions/common/typeerasure.hh>
│ │ │ │ -#include <dune/functions/common/functionconcepts.hh>
│ │ │ │ +
#include <utility>
│ │ │ │ +#include <type_traits>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::LocalFunction< Signature, LocalContext, DerivativeTraits, bufferSize >
 
class  Dune::Functions::LocalFunction< Range(Domain), LocalContext, DerivativeTraits, bufferSize >
 Class storing local functions using type erasure. More...
class  Dune::Functions::PolymorphicSmallObject< Base, bufferSize >
 A wrapper providing small object optimization with polymorphic types. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -6,30 +6,22 @@ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ Classes | Namespaces │ │ │ │ │ -localfunction.hh File Reference │ │ │ │ │ +polymorphicsmallobject.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::LocalFunction<_Signature,_LocalContext, │ │ │ │ │ - DerivativeTraits,_bufferSize_> │ │ │ │ │ -  │ │ │ │ │ -class  Dune::Functions::LocalFunction<_Range(Domain),_LocalContext, │ │ │ │ │ - DerivativeTraits,_bufferSize_> │ │ │ │ │ -  Class storing local functions using type erasure. More... │ │ │ │ │ +class  Dune::Functions::PolymorphicSmallObject<_Base,_bufferSize_> │ │ │ │ │ +  A wrapper providing small object optimization with polymorphic types. │ │ │ │ │ + More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00062_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: localfunction.hh Source File │ │ │ │ +dune-functions: polymorphicsmallobject.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,152 +62,164 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
localfunction.hh
│ │ │ │ +
polymorphicsmallobject.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#ifndef DUNE_FUNCTIONS_COMMON_LOCAL_FUNCTION_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_COMMON_LOCAL_FUNCTION_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_COMMON_POLYMORPHICSMALLOBJECT_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_COMMON_POLYMORPHICSMALLOBJECT_HH
│ │ │ │
5
│ │ │ │ -
6#include <type_traits>
│ │ │ │ -
7
│ │ │ │ -
8#include <dune/common/typeutilities.hh>
│ │ │ │ -
9
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
15
│ │ │ │ -
16
│ │ │ │ -
17
│ │ │ │ -
18namespace Dune {
│ │ │ │ -
19namespace Functions {
│ │ │ │ -
20
│ │ │ │ -
21
│ │ │ │ -
22
│ │ │ │ -
23/*
│ │ │ │ -
24 * Default implementation is empty
│ │ │ │ -
25 * The actual implementation is only given if Signature is an type
│ │ │ │ -
26 * describing a function signature as Range(Domain).
│ │ │ │ -
27 */
│ │ │ │ -
28template<class Signature, class LocalContext, template<class> class DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56>
│ │ │ │ - │ │ │ │ -
30{};
│ │ │ │ -
31
│ │ │ │ -
32
│ │ │ │ -
33
│ │ │ │ -
34namespace Imp
│ │ │ │ -
35{
│ │ │ │ -
36
│ │ │ │ -
38 template<class S, class L, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ -
39 struct LocalFunctionTraits :
│ │ │ │ -
40 DifferentiableFunctionTraits<S, DerivativeTraits, bufferSize>
│ │ │ │ -
41 {
│ │ │ │ -
42 protected:
│ │ │ │ -
43 using Base=DifferentiableFunctionTraits<S, DerivativeTraits, bufferSize>;
│ │ │ │ -
44
│ │ │ │ -
45 public:
│ │ │ │ -
47 using LocalContext = L;
│ │ │ │ -
48
│ │ │ │ -
50 using DerivativeSignature = typename Base::DerivativeSignature;
│ │ │ │ -
51
│ │ │ │ - │ │ │ │ -
54
│ │ │ │ -
56 using Concept = LocalFunctionWrapperInterface<S, DerivativeInterface, L>;
│ │ │ │ -
57
│ │ │ │ -
59 template<class B>
│ │ │ │ -
60 using Model = LocalFunctionWrapperImplementation<S, DerivativeInterface, L, B>;
│ │ │ │ -
61 };
│ │ │ │ -
62}
│ │ │ │ -
63
│ │ │ │ -
64
│ │ │ │ -
65
│ │ │ │ -
86template<class Range, class Domain, class LocalContext, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ -
87class LocalFunction< Range(Domain), LocalContext, DerivativeTraits, bufferSize> :
│ │ │ │ -
88 public TypeErasureBase<
│ │ │ │ -
89 typename Imp::LocalFunctionTraits<Range(Domain), LocalContext, DerivativeTraits, bufferSize>::Concept,
│ │ │ │ -
90 Imp::LocalFunctionTraits<Range(Domain), LocalContext, DerivativeTraits, bufferSize>::template Model>
│ │ │ │ -
91{
│ │ │ │ -
92 using Traits = Imp::LocalFunctionTraits<Range(Domain), LocalContext, DerivativeTraits, bufferSize>;
│ │ │ │ -
93
│ │ │ │ - │ │ │ │ -
95
│ │ │ │ -
96 using DerivativeInterface = typename Traits::DerivativeInterface;
│ │ │ │ -
97
│ │ │ │ -
98public:
│ │ │ │ -
99
│ │ │ │ -
111 template<class F, disableCopyMove<LocalFunction, F> = 0 >
│ │ │ │ - │ │ │ │ -
113 Base(std::forward<F>(f))
│ │ │ │ -
114 {
│ │ │ │ -
115 static_assert(Dune::Functions::Concept::isLocalFunction<F, Range(Domain), LocalContext>(), "Trying to construct a LocalFunction from type that does not model the LocalFunction concept");
│ │ │ │ -
116 }
│ │ │ │ -
117
│ │ │ │ -
118 LocalFunction() = default;
│ │ │ │ -
119
│ │ │ │ -
123 Range operator() (const Domain& x) const
│ │ │ │ -
124 {
│ │ │ │ -
125 return this->asInterface().operator()(x);
│ │ │ │ -
126 }
│ │ │ │ -
127
│ │ │ │ -
135 friend DerivativeInterface derivative(const LocalFunction& t)
│ │ │ │ +
6#include <utility>
│ │ │ │ +
7#include <type_traits>
│ │ │ │ +
8
│ │ │ │ +
9namespace Dune {
│ │ │ │ +
10namespace Functions {
│ │ │ │ +
11
│ │ │ │ +
12
│ │ │ │ +
43template<class Base, size_t bufferSize>
│ │ │ │ + │ │ │ │ +
45{
│ │ │ │ +
46public:
│ │ │ │ +
47
│ │ │ │ + │ │ │ │ +
50 p_(nullptr)
│ │ │ │ +
51 {}
│ │ │ │ +
52
│ │ │ │ +
59 template<class Derived,
│ │ │ │ +
60 typename std::enable_if<std::is_base_of<Base, std::remove_cv_t<
│ │ │ │ +
61 std::remove_reference_t<Derived>>>::value, int>::type = 0>
│ │ │ │ +
62 PolymorphicSmallObject(Derived&& derived)
│ │ │ │ +
63 {
│ │ │ │ +
64 constexpr bool useBuffer = sizeof(Derived) <= bufferSize;
│ │ │ │ +
65 if constexpr (useBuffer) {
│ │ │ │ +
66 p_ = new (&buffer_) Derived(std::forward<Derived>(derived));
│ │ │ │ +
67 } else {
│ │ │ │ +
68 p_ = new Derived(std::forward<Derived>(derived));
│ │ │ │ +
69 }
│ │ │ │ +
70 }
│ │ │ │ +
71
│ │ │ │ + │ │ │ │ +
74 {
│ │ │ │ +
75 moveToWrappedObject(std::move(other));
│ │ │ │ +
76 }
│ │ │ │ +
77
│ │ │ │ + │ │ │ │ +
80 {
│ │ │ │ +
81 copyToWrappedObject(other);
│ │ │ │ +
82 }
│ │ │ │ +
83
│ │ │ │ + │ │ │ │ +
86 {
│ │ │ │ +
87 destroyWrappedObject();
│ │ │ │ +
88 }
│ │ │ │ +
89
│ │ │ │ + │ │ │ │ +
92 {
│ │ │ │ +
93 if (&other!=this)
│ │ │ │ +
94 {
│ │ │ │ +
95 destroyWrappedObject();
│ │ │ │ +
96 copyToWrappedObject(other);
│ │ │ │ +
97 }
│ │ │ │ +
98 return *this;
│ │ │ │ +
99 }
│ │ │ │ +
100
│ │ │ │ + │ │ │ │ +
103 {
│ │ │ │ +
104 destroyWrappedObject();
│ │ │ │ +
105 moveToWrappedObject(std::move(other));
│ │ │ │ +
106 return *this;
│ │ │ │ +
107 }
│ │ │ │ +
108
│ │ │ │ +
110 explicit operator bool() const
│ │ │ │ +
111 {
│ │ │ │ +
112 return p_;
│ │ │ │ +
113 }
│ │ │ │ +
114
│ │ │ │ +
116 bool bufferUsed() const
│ │ │ │ +
117 {
│ │ │ │ +
118 return ((void*) (p_) == (void*)(&buffer_));
│ │ │ │ +
119 }
│ │ │ │ +
120
│ │ │ │ +
122 const Base& get() const
│ │ │ │ +
123 {
│ │ │ │ +
124 return *p_;
│ │ │ │ +
125 }
│ │ │ │ +
126
│ │ │ │ +
128 Base& get()
│ │ │ │ +
129 {
│ │ │ │ +
130 return *p_;
│ │ │ │ +
131 }
│ │ │ │ +
132
│ │ │ │ +
133private:
│ │ │ │ +
134
│ │ │ │ +
135 void destroyWrappedObject() noexcept
│ │ │ │
136 {
│ │ │ │ -
137 return t.asInterface().derivative();
│ │ │ │ -
138 }
│ │ │ │ -
139
│ │ │ │ -
146 void bind(const LocalContext& context)
│ │ │ │ +
137 if (operator bool())
│ │ │ │ +
138 {
│ │ │ │ +
139 if (bufferUsed())
│ │ │ │ +
140 p_->~Base();
│ │ │ │ +
141 else
│ │ │ │ +
142 delete p_;
│ │ │ │ +
143 }
│ │ │ │ +
144 }
│ │ │ │ +
145
│ │ │ │ +
146 void moveToWrappedObject(PolymorphicSmallObject&& other) noexcept
│ │ │ │
147 {
│ │ │ │ -
148 this->asInterface().bind(context);
│ │ │ │ -
149 }
│ │ │ │ -
150
│ │ │ │ -
154 void unbind()
│ │ │ │ -
155 {
│ │ │ │ -
156 this->asInterface().unbind();
│ │ │ │ -
157 }
│ │ │ │ -
158
│ │ │ │ -
161 bool bound() const
│ │ │ │ -
162 {
│ │ │ │ -
163 return this->asInterface().bound();
│ │ │ │ -
164 }
│ │ │ │ -
165
│ │ │ │ -
169 const LocalContext& localContext() const
│ │ │ │ -
170 {
│ │ │ │ -
171 return this->asInterface().localContext();
│ │ │ │ -
172 }
│ │ │ │ -
173};
│ │ │ │ -
174
│ │ │ │ -
175
│ │ │ │ +
148 if (other.bufferUsed())
│ │ │ │ +
149 p_ = other.p_->move(&buffer_);
│ │ │ │ +
150 else
│ │ │ │ +
151 {
│ │ │ │ +
152 // We don't need to check for &other_!=this, because you can't
│ │ │ │ +
153 // have an rvalue to *this and call it's assignment/constructor
│ │ │ │ +
154 // at the same time. (Despite trying to shoot yourself in the foot
│ │ │ │ +
155 // with std::move explicitly.)
│ │ │ │ +
156
│ │ │ │ +
157 // Take ownership of allocated object
│ │ │ │ +
158 p_ = other.p_;
│ │ │ │ +
159
│ │ │ │ +
160 // Leave pointer in a clean state to avoid double freeing it.
│ │ │ │ +
161 other.p_ = 0;
│ │ │ │ +
162 }
│ │ │ │ +
163 }
│ │ │ │ +
164
│ │ │ │ +
165 void copyToWrappedObject(const PolymorphicSmallObject& other)
│ │ │ │ +
166 {
│ │ │ │ +
167 if (other.bufferUsed())
│ │ │ │ +
168 p_ = other.p_->clone(&buffer_);
│ │ │ │ +
169 else
│ │ │ │ +
170 p_ = other.p_->clone();
│ │ │ │ +
171 }
│ │ │ │ +
172
│ │ │ │ +
173 std::aligned_storage_t<bufferSize> buffer_;
│ │ │ │ +
174 Base* p_;
│ │ │ │ +
175};
│ │ │ │
176
│ │ │ │ -
177}} // namespace Dune::Functions
│ │ │ │ -
178
│ │ │ │ -
179
│ │ │ │ +
177
│ │ │ │ +
178} // namespace Functions
│ │ │ │ +
179} // namespace Dune
│ │ │ │
180
│ │ │ │ -
181#endif // DUNE_FUNCTIONS_COMMON_LOCAL_FUNCTION_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
friend DerivativeInterface derivative(const LocalFunction &t)
Get derivative of wrapped function.
Definition: localfunction.hh:135
│ │ │ │ +
181#endif // DUNE_FUNCTIONS_COMMON_POLYMORPHICSMALLOBJECT_HH
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
Definition: localfunction.hh:30
│ │ │ │ -
const LocalContext & localContext() const
Obtain local context this LocalFunction is bound to.
Definition: localfunction.hh:169
│ │ │ │ -
LocalFunction(F &&f)
Construct from function.
Definition: localfunction.hh:112
│ │ │ │ -
void unbind()
Unbind from local context.
Definition: localfunction.hh:154
│ │ │ │ -
bool bound() const
Return if the local function is bound to a grid element.
Definition: localfunction.hh:161
│ │ │ │ -
void bind(const LocalContext &context)
Bind function to a local context.
Definition: localfunction.hh:146
│ │ │ │ - │ │ │ │ -
Base class for type-erased interface wrapper.
Definition: typeerasure.hh:165
│ │ │ │ +
A wrapper providing small object optimization with polymorphic types.
Definition: polymorphicsmallobject.hh:45
│ │ │ │ +
const Base & get() const
Obtain reference to stored object.
Definition: polymorphicsmallobject.hh:122
│ │ │ │ +
bool bufferUsed() const
Check if object is stored in internal stack buffer.
Definition: polymorphicsmallobject.hh:116
│ │ │ │ +
PolymorphicSmallObject(Derived &&derived)
Construct from object.
Definition: polymorphicsmallobject.hh:62
│ │ │ │ +
PolymorphicSmallObject(PolymorphicSmallObject &&other) noexcept
Move constructor from other PolymorphicSmallObject.
Definition: polymorphicsmallobject.hh:73
│ │ │ │ +
PolymorphicSmallObject & operator=(const PolymorphicSmallObject &other)
Copy assignment from other PolymorphicSmallObject.
Definition: polymorphicsmallobject.hh:91
│ │ │ │ +
PolymorphicSmallObject & operator=(PolymorphicSmallObject &&other) noexcept
Move assignment from other PolymorphicSmallObject.
Definition: polymorphicsmallobject.hh:102
│ │ │ │ +
PolymorphicSmallObject(const PolymorphicSmallObject &other)
Copy constructor from other PolymorphicSmallObject.
Definition: polymorphicsmallobject.hh:79
│ │ │ │ +
~PolymorphicSmallObject()
Destructor.
Definition: polymorphicsmallobject.hh:85
│ │ │ │ +
PolymorphicSmallObject()
Default constructor.
Definition: polymorphicsmallobject.hh:49
│ │ │ │ +
Base & get()
Obtain mutable reference to stored object.
Definition: polymorphicsmallobject.hh:128
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,189 +5,192 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -localfunction.hh │ │ │ │ │ +polymorphicsmallobject.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#ifndef DUNE_FUNCTIONS_COMMON_LOCAL_FUNCTION_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_COMMON_LOCAL_FUNCTION_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_COMMON_POLYMORPHICSMALLOBJECT_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_COMMON_POLYMORPHICSMALLOBJECT_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include │ │ │ │ │ - 15 │ │ │ │ │ - 16 │ │ │ │ │ - 17 │ │ │ │ │ - 18namespace Dune { │ │ │ │ │ - 19namespace Functions { │ │ │ │ │ - 20 │ │ │ │ │ - 21 │ │ │ │ │ - 22 │ │ │ │ │ - 23/* │ │ │ │ │ - 24 * Default implementation is empty │ │ │ │ │ - 25 * The actual implementation is only given if Signature is an type │ │ │ │ │ - 26 * describing a function signature as Range(Domain). │ │ │ │ │ - 27 */ │ │ │ │ │ - 28template class │ │ │ │ │ -DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56> │ │ │ │ │ -29class LocalFunction │ │ │ │ │ - 30{}; │ │ │ │ │ - 31 │ │ │ │ │ - 32 │ │ │ │ │ - 33 │ │ │ │ │ - 34namespace Imp │ │ │ │ │ - 35{ │ │ │ │ │ - 36 │ │ │ │ │ - 38 template class DerivativeTraits, size_t │ │ │ │ │ -bufferSize> │ │ │ │ │ - 39 struct LocalFunctionTraits : │ │ │ │ │ - 40 DifferentiableFunctionTraits │ │ │ │ │ - 41 { │ │ │ │ │ - 42 protected: │ │ │ │ │ - 43 using Base=DifferentiableFunctionTraits; │ │ │ │ │ - 44 │ │ │ │ │ - 45 public: │ │ │ │ │ - 47 using LocalContext = L; │ │ │ │ │ - 48 │ │ │ │ │ - 50 using DerivativeSignature = typename Base::DerivativeSignature; │ │ │ │ │ - 51 │ │ │ │ │ - 53 using DerivativeInterface = LocalFunction; │ │ │ │ │ - 54 │ │ │ │ │ - 56 using Concept = LocalFunctionWrapperInterface; │ │ │ │ │ - 57 │ │ │ │ │ - 59 template │ │ │ │ │ - 60 using Model = LocalFunctionWrapperImplementation; │ │ │ │ │ - 61 }; │ │ │ │ │ - 62} │ │ │ │ │ - 63 │ │ │ │ │ - 64 │ │ │ │ │ - 65 │ │ │ │ │ - 86template │ │ │ │ │ -class DerivativeTraits, size_t bufferSize> │ │ │ │ │ -87class LocalFunction< Range(Domain), LocalContext, DerivativeTraits, │ │ │ │ │ -bufferSize> : │ │ │ │ │ - 88 public TypeErasureBase< │ │ │ │ │ - 89 typename Imp::LocalFunctionTraits::Concept, │ │ │ │ │ - 90 Imp::LocalFunctionTraits::template Model> │ │ │ │ │ - 91{ │ │ │ │ │ - 92 using Traits = Imp::LocalFunctionTraits; │ │ │ │ │ - 93 │ │ │ │ │ - 94 using Base = TypeErasureBase; │ │ │ │ │ - 95 │ │ │ │ │ - 96 using DerivativeInterface = typename Traits::DerivativeInterface; │ │ │ │ │ - 97 │ │ │ │ │ - 98public: │ │ │ │ │ - 99 │ │ │ │ │ - 111 template = 0 > │ │ │ │ │ -112 LocalFunction(F&& f) : │ │ │ │ │ - 113 Base(std::forward(f)) │ │ │ │ │ - 114 { │ │ │ │ │ - 115 static_assert(Dune::Functions::Concept::isLocalFunction(), "Trying to construct a LocalFunction from type that does not │ │ │ │ │ -model the LocalFunction concept"); │ │ │ │ │ - 116 } │ │ │ │ │ - 117 │ │ │ │ │ -118 LocalFunction() = default; │ │ │ │ │ - 119 │ │ │ │ │ -123 Range operator() (const Domain& x) const │ │ │ │ │ - 124 { │ │ │ │ │ - 125 return this->asInterface().operator()(x); │ │ │ │ │ - 126 } │ │ │ │ │ - 127 │ │ │ │ │ -135 friend DerivativeInterface derivative(const LocalFunction& t) │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8 │ │ │ │ │ + 9namespace Dune { │ │ │ │ │ + 10namespace Functions { │ │ │ │ │ + 11 │ │ │ │ │ + 12 │ │ │ │ │ + 43template │ │ │ │ │ +44class PolymorphicSmallObject │ │ │ │ │ + 45{ │ │ │ │ │ + 46public: │ │ │ │ │ + 47 │ │ │ │ │ +49 PolymorphicSmallObject() : │ │ │ │ │ + 50 p_(nullptr) │ │ │ │ │ + 51 {} │ │ │ │ │ + 52 │ │ │ │ │ + 59 template>>::value, int>::type = 0> │ │ │ │ │ +62 PolymorphicSmallObject(Derived&& derived) │ │ │ │ │ + 63 { │ │ │ │ │ + 64 constexpr bool useBuffer = sizeof(Derived) <= bufferSize; │ │ │ │ │ + 65 if constexpr (useBuffer) { │ │ │ │ │ + 66 p_ = new (&buffer_) Derived(std::forward(derived)); │ │ │ │ │ + 67 } else { │ │ │ │ │ + 68 p_ = new Derived(std::forward(derived)); │ │ │ │ │ + 69 } │ │ │ │ │ + 70 } │ │ │ │ │ + 71 │ │ │ │ │ +73 PolymorphicSmallObject(PolymorphicSmallObject&& other) noexcept │ │ │ │ │ + 74 { │ │ │ │ │ + 75 moveToWrappedObject(std::move(other)); │ │ │ │ │ + 76 } │ │ │ │ │ + 77 │ │ │ │ │ +79 PolymorphicSmallObject(const PolymorphicSmallObject& other) │ │ │ │ │ + 80 { │ │ │ │ │ + 81 copyToWrappedObject(other); │ │ │ │ │ + 82 } │ │ │ │ │ + 83 │ │ │ │ │ +85 ~PolymorphicSmallObject() │ │ │ │ │ + 86 { │ │ │ │ │ + 87 destroyWrappedObject(); │ │ │ │ │ + 88 } │ │ │ │ │ + 89 │ │ │ │ │ +91 PolymorphicSmallObject& operator=(const PolymorphicSmallObject& other) │ │ │ │ │ + 92 { │ │ │ │ │ + 93 if (&other!=this) │ │ │ │ │ + 94 { │ │ │ │ │ + 95 destroyWrappedObject(); │ │ │ │ │ + 96 copyToWrappedObject(other); │ │ │ │ │ + 97 } │ │ │ │ │ + 98 return *this; │ │ │ │ │ + 99 } │ │ │ │ │ + 100 │ │ │ │ │ +102 PolymorphicSmallObject& operator=(PolymorphicSmallObject&& other) noexcept │ │ │ │ │ + 103 { │ │ │ │ │ + 104 destroyWrappedObject(); │ │ │ │ │ + 105 moveToWrappedObject(std::move(other)); │ │ │ │ │ + 106 return *this; │ │ │ │ │ + 107 } │ │ │ │ │ + 108 │ │ │ │ │ +110 explicit operator bool() const │ │ │ │ │ + 111 { │ │ │ │ │ + 112 return p_; │ │ │ │ │ + 113 } │ │ │ │ │ + 114 │ │ │ │ │ +116 bool bufferUsed() const │ │ │ │ │ + 117 { │ │ │ │ │ + 118 return ((void*) (p_) == (void*)(&buffer_)); │ │ │ │ │ + 119 } │ │ │ │ │ + 120 │ │ │ │ │ +122 const Base& get() const │ │ │ │ │ + 123 { │ │ │ │ │ + 124 return *p_; │ │ │ │ │ + 125 } │ │ │ │ │ + 126 │ │ │ │ │ +128 Base& get() │ │ │ │ │ + 129 { │ │ │ │ │ + 130 return *p_; │ │ │ │ │ + 131 } │ │ │ │ │ + 132 │ │ │ │ │ + 133private: │ │ │ │ │ + 134 │ │ │ │ │ + 135 void destroyWrappedObject() noexcept │ │ │ │ │ 136 { │ │ │ │ │ - 137 return t.asInterface().derivative(); │ │ │ │ │ - 138 } │ │ │ │ │ - 139 │ │ │ │ │ -146 void bind(const LocalContext& context) │ │ │ │ │ + 137 if (operator bool()) │ │ │ │ │ + 138 { │ │ │ │ │ + 139 if (bufferUsed()) │ │ │ │ │ + 140 p_->~Base(); │ │ │ │ │ + 141 else │ │ │ │ │ + 142 delete p_; │ │ │ │ │ + 143 } │ │ │ │ │ + 144 } │ │ │ │ │ + 145 │ │ │ │ │ + 146 void moveToWrappedObject(PolymorphicSmallObject&& other) noexcept │ │ │ │ │ 147 { │ │ │ │ │ - 148 this->asInterface().bind(context); │ │ │ │ │ - 149 } │ │ │ │ │ - 150 │ │ │ │ │ -154 void unbind() │ │ │ │ │ - 155 { │ │ │ │ │ - 156 this->asInterface().unbind(); │ │ │ │ │ - 157 } │ │ │ │ │ - 158 │ │ │ │ │ -161 bool bound() const │ │ │ │ │ - 162 { │ │ │ │ │ - 163 return this->asInterface().bound(); │ │ │ │ │ - 164 } │ │ │ │ │ - 165 │ │ │ │ │ -169 const LocalContext& localContext() const │ │ │ │ │ - 170 { │ │ │ │ │ - 171 return this->asInterface().localContext(); │ │ │ │ │ - 172 } │ │ │ │ │ - 173}; │ │ │ │ │ - 174 │ │ │ │ │ - 175 │ │ │ │ │ + 148 if (other.bufferUsed()) │ │ │ │ │ + 149 p_ = other.p_->move(&buffer_); │ │ │ │ │ + 150 else │ │ │ │ │ + 151 { │ │ │ │ │ + 152 // We don't need to check for &other_!=this, because you can't │ │ │ │ │ + 153 // have an rvalue to *this and call it's assignment/constructor │ │ │ │ │ + 154 // at the same time. (Despite trying to shoot yourself in the foot │ │ │ │ │ + 155 // with std::move explicitly.) │ │ │ │ │ + 156 │ │ │ │ │ + 157 // Take ownership of allocated object │ │ │ │ │ + 158 p_ = other.p_; │ │ │ │ │ + 159 │ │ │ │ │ + 160 // Leave pointer in a clean state to avoid double freeing it. │ │ │ │ │ + 161 other.p_ = 0; │ │ │ │ │ + 162 } │ │ │ │ │ + 163 } │ │ │ │ │ + 164 │ │ │ │ │ + 165 void copyToWrappedObject(const PolymorphicSmallObject& other) │ │ │ │ │ + 166 { │ │ │ │ │ + 167 if (other.bufferUsed()) │ │ │ │ │ + 168 p_ = other.p_->clone(&buffer_); │ │ │ │ │ + 169 else │ │ │ │ │ + 170 p_ = other.p_->clone(); │ │ │ │ │ + 171 } │ │ │ │ │ + 172 │ │ │ │ │ + 173 std::aligned_storage_t buffer_; │ │ │ │ │ + 174 Base* p_; │ │ │ │ │ + 175}; │ │ │ │ │ 176 │ │ │ │ │ - 177}} // namespace Dune::Functions │ │ │ │ │ - 178 │ │ │ │ │ - 179 │ │ │ │ │ + 177 │ │ │ │ │ + 178} // namespace Functions │ │ │ │ │ + 179} // namespace Dune │ │ │ │ │ 180 │ │ │ │ │ - 181#endif // DUNE_FUNCTIONS_COMMON_LOCAL_FUNCTION_HH │ │ │ │ │ -typeerasure.hh │ │ │ │ │ -localfunction_imp.hh │ │ │ │ │ -functionconcepts.hh │ │ │ │ │ -defaultderivativetraits.hh │ │ │ │ │ -differentiablefunction.hh │ │ │ │ │ -Dune::Functions::LocalFunction<_Range(Domain),_LocalContext,_DerivativeTraits, │ │ │ │ │ -bufferSize_>::derivative │ │ │ │ │ -friend DerivativeInterface derivative(const LocalFunction &t) │ │ │ │ │ -Get derivative of wrapped function. │ │ │ │ │ -Definition: localfunction.hh:135 │ │ │ │ │ + 181#endif // DUNE_FUNCTIONS_COMMON_POLYMORPHICSMALLOBJECT_HH │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::LocalFunction │ │ │ │ │ -Definition: localfunction.hh:30 │ │ │ │ │ -Dune::Functions::LocalFunction<_Range(Domain),_LocalContext,_DerivativeTraits, │ │ │ │ │ -bufferSize_>::localContext │ │ │ │ │ -const LocalContext & localContext() const │ │ │ │ │ -Obtain local context this LocalFunction is bound to. │ │ │ │ │ -Definition: localfunction.hh:169 │ │ │ │ │ -Dune::Functions::LocalFunction<_Range(Domain),_LocalContext,_DerivativeTraits, │ │ │ │ │ -bufferSize_>::LocalFunction │ │ │ │ │ -LocalFunction(F &&f) │ │ │ │ │ -Construct from function. │ │ │ │ │ -Definition: localfunction.hh:112 │ │ │ │ │ -Dune::Functions::LocalFunction<_Range(Domain),_LocalContext,_DerivativeTraits, │ │ │ │ │ -bufferSize_>::unbind │ │ │ │ │ -void unbind() │ │ │ │ │ -Unbind from local context. │ │ │ │ │ -Definition: localfunction.hh:154 │ │ │ │ │ -Dune::Functions::LocalFunction<_Range(Domain),_LocalContext,_DerivativeTraits, │ │ │ │ │ -bufferSize_>::bound │ │ │ │ │ -bool bound() const │ │ │ │ │ -Return if the local function is bound to a grid element. │ │ │ │ │ -Definition: localfunction.hh:161 │ │ │ │ │ -Dune::Functions::LocalFunction<_Range(Domain),_LocalContext,_DerivativeTraits, │ │ │ │ │ -bufferSize_>::bind │ │ │ │ │ -void bind(const LocalContext &context) │ │ │ │ │ -Bind function to a local context. │ │ │ │ │ -Definition: localfunction.hh:146 │ │ │ │ │ -Dune::Functions::LocalFunction<_Range(Domain),_LocalContext,_DerivativeTraits, │ │ │ │ │ -bufferSize_>::LocalFunction │ │ │ │ │ -LocalFunction()=default │ │ │ │ │ -Dune::Functions::TypeErasureBase │ │ │ │ │ -Base class for type-erased interface wrapper. │ │ │ │ │ -Definition: typeerasure.hh:165 │ │ │ │ │ +Dune::Functions::PolymorphicSmallObject │ │ │ │ │ +A wrapper providing small object optimization with polymorphic types. │ │ │ │ │ +Definition: polymorphicsmallobject.hh:45 │ │ │ │ │ +Dune::Functions::PolymorphicSmallObject::get │ │ │ │ │ +const Base & get() const │ │ │ │ │ +Obtain reference to stored object. │ │ │ │ │ +Definition: polymorphicsmallobject.hh:122 │ │ │ │ │ +Dune::Functions::PolymorphicSmallObject::bufferUsed │ │ │ │ │ +bool bufferUsed() const │ │ │ │ │ +Check if object is stored in internal stack buffer. │ │ │ │ │ +Definition: polymorphicsmallobject.hh:116 │ │ │ │ │ +Dune::Functions::PolymorphicSmallObject::PolymorphicSmallObject │ │ │ │ │ +PolymorphicSmallObject(Derived &&derived) │ │ │ │ │ +Construct from object. │ │ │ │ │ +Definition: polymorphicsmallobject.hh:62 │ │ │ │ │ +Dune::Functions::PolymorphicSmallObject::PolymorphicSmallObject │ │ │ │ │ +PolymorphicSmallObject(PolymorphicSmallObject &&other) noexcept │ │ │ │ │ +Move constructor from other PolymorphicSmallObject. │ │ │ │ │ +Definition: polymorphicsmallobject.hh:73 │ │ │ │ │ +Dune::Functions::PolymorphicSmallObject::operator= │ │ │ │ │ +PolymorphicSmallObject & operator=(const PolymorphicSmallObject &other) │ │ │ │ │ +Copy assignment from other PolymorphicSmallObject. │ │ │ │ │ +Definition: polymorphicsmallobject.hh:91 │ │ │ │ │ +Dune::Functions::PolymorphicSmallObject::operator= │ │ │ │ │ +PolymorphicSmallObject & operator=(PolymorphicSmallObject &&other) noexcept │ │ │ │ │ +Move assignment from other PolymorphicSmallObject. │ │ │ │ │ +Definition: polymorphicsmallobject.hh:102 │ │ │ │ │ +Dune::Functions::PolymorphicSmallObject::PolymorphicSmallObject │ │ │ │ │ +PolymorphicSmallObject(const PolymorphicSmallObject &other) │ │ │ │ │ +Copy constructor from other PolymorphicSmallObject. │ │ │ │ │ +Definition: polymorphicsmallobject.hh:79 │ │ │ │ │ +Dune::Functions::PolymorphicSmallObject::~PolymorphicSmallObject │ │ │ │ │ +~PolymorphicSmallObject() │ │ │ │ │ +Destructor. │ │ │ │ │ +Definition: polymorphicsmallobject.hh:85 │ │ │ │ │ +Dune::Functions::PolymorphicSmallObject::PolymorphicSmallObject │ │ │ │ │ +PolymorphicSmallObject() │ │ │ │ │ +Default constructor. │ │ │ │ │ +Definition: polymorphicsmallobject.hh:49 │ │ │ │ │ +Dune::Functions::PolymorphicSmallObject::get │ │ │ │ │ +Base & get() │ │ │ │ │ +Obtain mutable reference to stored object. │ │ │ │ │ +Definition: polymorphicsmallobject.hh:128 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00065.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: reserveddeque.hh File Reference │ │ │ │ +dune-functions: overflowarray.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -64,69 +64,40 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Macros
│ │ │ │ -
reserveddeque.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
overflowarray.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

An stl-compliant double-ended queue which stores everything on the stack. │ │ │ │ -More...

│ │ │ │
#include <algorithm>
│ │ │ │ #include <iostream>
│ │ │ │ #include <cstddef>
│ │ │ │ +#include <array>
│ │ │ │ #include <initializer_list>
│ │ │ │ #include <dune/common/genericiterator.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Classes

class  Dune::Functions::ReservedDeque< T, n >
 A double-ended queue (deque) class with statically reserved memory. More...
class  Dune::Functions::OverflowArray< BA, maxSize >
 A dynamically sized array-like class with overflow. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Macros

#define CHECKSIZE(X)   {}
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

An stl-compliant double-ended queue which stores everything on the stack.

│ │ │ │ -

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ CHECKSIZE

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
#define CHECKSIZE( X)   {}
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,38 +5,28 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -Classes | Namespaces | Macros │ │ │ │ │ -reserveddeque.hh File Reference │ │ │ │ │ -An stl-compliant double-ended queue which stores everything on the stack. │ │ │ │ │ -More... │ │ │ │ │ +Classes | Namespaces │ │ │ │ │ +overflowarray.hh File Reference │ │ │ │ │ #include │ │ │ │ │ #include │ │ │ │ │ #include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ #include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::ReservedDeque<_T,_n_> │ │ │ │ │ -  A double-ended queue (deque) class with statically reserved memory. │ │ │ │ │ - More... │ │ │ │ │ +class  Dune::Functions::OverflowArray<_BA,_maxSize_> │ │ │ │ │ +  A dynamically sized array-like class with overflow. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ - Macros │ │ │ │ │ -#define CHECKSIZE(X)   {} │ │ │ │ │ -  │ │ │ │ │ -***** Detailed Description ***** │ │ │ │ │ -An stl-compliant double-ended queue which stores everything on the stack. │ │ │ │ │ -***** Macro Definition Documentation ***** │ │ │ │ │ -***** ◆ CHECKSIZE ***** │ │ │ │ │ -#define CHECKSIZE (  X )    {} │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00065_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: reserveddeque.hh Source File │ │ │ │ +dune-functions: overflowarray.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,229 +62,230 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
reserveddeque.hh
│ │ │ │ +
overflowarray.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#ifndef DUNE_FUNCTIONS_COMMON_RESERVEDDEQUE_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_COMMON_RESERVEDDEQUE_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_COMMON_OVERFLOWARRAY_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_COMMON_OVERFLOWARRAY_HH
│ │ │ │
5
│ │ │ │ -
10#include <algorithm>
│ │ │ │ -
11#include <iostream>
│ │ │ │ -
12#include <cstddef>
│ │ │ │ -
13#include <initializer_list>
│ │ │ │ +
6#include <algorithm>
│ │ │ │ +
7#include <iostream>
│ │ │ │ +
8#include <cstddef>
│ │ │ │ +
9#include <array>
│ │ │ │ +
10#include <initializer_list>
│ │ │ │ +
11
│ │ │ │ +
12#include <dune/common/genericiterator.hh>
│ │ │ │ +
13
│ │ │ │
14
│ │ │ │ -
15#include <dune/common/genericiterator.hh>
│ │ │ │ -
16
│ │ │ │ -
17#ifdef CHECK_RESERVEDDEQUE
│ │ │ │ -
18#define CHECKSIZE(X) assert(X)
│ │ │ │ -
19#else
│ │ │ │ -
20#define CHECKSIZE(X) {}
│ │ │ │ -
21#endif
│ │ │ │ -
22
│ │ │ │ -
23namespace Dune {
│ │ │ │ -
24namespace Functions {
│ │ │ │ -
25
│ │ │ │ -
43 template<class T, int n>
│ │ │ │ - │ │ │ │ -
45 {
│ │ │ │ -
46 public:
│ │ │ │ +
15
│ │ │ │ +
16namespace Dune::Functions {
│ │ │ │ +
17
│ │ │ │ +
18
│ │ │ │ +
42template<class BA, std::size_t maxSize = std::tuple_size_v<BA>>
│ │ │ │ + │ │ │ │ +
44 public BA
│ │ │ │ +
45{
│ │ │ │ +
46 static constexpr std::size_t baseSize = std::tuple_size_v<BA>;
│ │ │ │
47
│ │ │ │ -
51 typedef T value_type;
│ │ │ │ -
53 typedef T* pointer;
│ │ │ │ -
55 typedef T& reference;
│ │ │ │ -
57 typedef const T& const_reference;
│ │ │ │ -
59 typedef size_t size_type;
│ │ │ │ -
61 typedef std::ptrdiff_t difference_type;
│ │ │ │ -
63 typedef Dune::GenericIterator<ReservedDeque, value_type> iterator;
│ │ │ │ -
65 typedef Dune::GenericIterator<const ReservedDeque, const value_type> const_iterator;
│ │ │ │ +
48public:
│ │ │ │ +
49 using BaseArray = BA;
│ │ │ │ +
50
│ │ │ │ +
51 using value_type = typename BaseArray::value_type;
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
55 using difference_type = std::ptrdiff_t;
│ │ │ │ +
56 using size_type = std::size_t;
│ │ │ │ +
57 using iterator = Dune::GenericIterator<OverflowArray, value_type>;
│ │ │ │ +
58 using const_iterator = Dune::GenericIterator<const OverflowArray, const value_type>;
│ │ │ │ +
59
│ │ │ │ +
60private:
│ │ │ │ +
61 using OverflowBuffer = std::array<value_type, maxSize-baseSize>;
│ │ │ │ +
62
│ │ │ │ +
63public:
│ │ │ │ +
64
│ │ │ │ +
65 OverflowArray() = default;
│ │ │ │
66
│ │ │ │ - │ │ │ │ -
73 size_(0),
│ │ │ │ -
74 first_(0)
│ │ │ │ -
75 {}
│ │ │ │ -
76
│ │ │ │ -
77 ReservedDeque(std::initializer_list<T> const &l)
│ │ │ │ -
78 {
│ │ │ │ -
79 assert(l.size() <= n);// Actually, this is not needed any more!
│ │ │ │ -
80 size_ = l.size();
│ │ │ │ -
81 std::copy_n(l.begin(), size_, data_);
│ │ │ │ -
82 }
│ │ │ │ -
83
│ │ │ │ -
89 void clear()
│ │ │ │ -
90 {
│ │ │ │ -
91 first_ = 0;
│ │ │ │ -
92 size_ = 0;
│ │ │ │ -
93 }
│ │ │ │ -
94
│ │ │ │ -
96 void resize(size_t s)
│ │ │ │ -
97 {
│ │ │ │ -
98 CHECKSIZE(s<=n);
│ │ │ │ -
99 size_ = s;
│ │ │ │ -
100 }
│ │ │ │ -
101
│ │ │ │ -
103 void push_back(const T& t)
│ │ │ │ -
104 {
│ │ │ │ -
105 CHECKSIZE(size_<n);
│ │ │ │ -
106 data_[size_++ % n] = t;
│ │ │ │ -
107 }
│ │ │ │ +
67 OverflowArray(const std::initializer_list<value_type>& l) {
│ │ │ │ +
68 assert(l.size() <= capacity());
│ │ │ │ +
69 size_ = l.size();
│ │ │ │ +
70 std::copy_n(l.begin(), size_, begin());
│ │ │ │ +
71 }
│ │ │ │ +
72
│ │ │ │ +
73 bool operator == (const OverflowArray& other) const {
│ │ │ │ +
74 if (size() != other.size())
│ │ │ │ +
75 return false;
│ │ │ │ +
76 for (size_type i=0; i<size(); ++i)
│ │ │ │ +
77 if ((*this)[i] != other[i])
│ │ │ │ +
78 return false;
│ │ │ │ +
79 return true;
│ │ │ │ +
80 }
│ │ │ │ +
81
│ │ │ │ +
83 void clear() {
│ │ │ │ +
84 size_ = 0;
│ │ │ │ +
85 }
│ │ │ │ +
86
│ │ │ │ +
93 void resize(size_type n) {
│ │ │ │ +
94 assert(n <= capacity());
│ │ │ │ +
95 size_ = n;
│ │ │ │ +
96 }
│ │ │ │ +
97
│ │ │ │ +
104 void push_back(const value_type& t) {
│ │ │ │ +
105 assert(size() < capacity());
│ │ │ │ +
106 (*this)[size_++] = t;
│ │ │ │ +
107 }
│ │ │ │
108
│ │ │ │ -
110 void push_front(const T& t)
│ │ │ │ -
111 {
│ │ │ │ -
112 CHECKSIZE(size_<n);
│ │ │ │ -
113 ++size_;
│ │ │ │ -
114 first_ = (first_+(n-1)) % n;
│ │ │ │ -
115 data_[first_] = t;
│ │ │ │ -
116 }
│ │ │ │ -
117
│ │ │ │ -
119 void pop_back()
│ │ │ │ -
120 {
│ │ │ │ -
121 if (! empty())
│ │ │ │ -
122 size_--;
│ │ │ │ -
123 }
│ │ │ │ -
124
│ │ │ │ - │ │ │ │ -
127 {
│ │ │ │ -
128 if (! empty())
│ │ │ │ -
129 {
│ │ │ │ -
130 size_--;
│ │ │ │ -
131 first_ = (++first_) % n;
│ │ │ │ -
132 }
│ │ │ │ -
133 }
│ │ │ │ -
134
│ │ │ │ - │ │ │ │ -
137 return iterator(*this, 0);
│ │ │ │ -
138 }
│ │ │ │ -
139
│ │ │ │ - │ │ │ │ -
142 return const_iterator(*this, 0);
│ │ │ │ -
143 }
│ │ │ │ -
144
│ │ │ │ - │ │ │ │ -
147 return iterator(*this, size_);
│ │ │ │ -
148 }
│ │ │ │ -
149
│ │ │ │ - │ │ │ │ -
152 return const_iterator(*this, size_);
│ │ │ │ -
153 }
│ │ │ │ -
154
│ │ │ │ - │ │ │ │ -
157 {
│ │ │ │ -
158 CHECKSIZE(size_>i);
│ │ │ │ -
159 return data_[(first_ + i) % n];
│ │ │ │ -
160 }
│ │ │ │ -
161
│ │ │ │ - │ │ │ │ -
164 {
│ │ │ │ -
165 CHECKSIZE(size_>i);
│ │ │ │ -
166 return data_[(first_ + i) % n];
│ │ │ │ -
167 }
│ │ │ │ -
168
│ │ │ │ - │ │ │ │ -
171 {
│ │ │ │ -
172 CHECKSIZE(size_>0);
│ │ │ │ -
173 return data_[first_];
│ │ │ │ -
174 }
│ │ │ │ -
175
│ │ │ │ - │ │ │ │ -
178 {
│ │ │ │ -
179 CHECKSIZE(size_>0);
│ │ │ │ -
180 return data_[first_];
│ │ │ │ -
181 }
│ │ │ │ +
110 void pop_back() {
│ │ │ │ +
111 assert(size() > 0);
│ │ │ │ +
112 if (! empty())
│ │ │ │ +
113 size_--;
│ │ │ │ +
114 }
│ │ │ │ +
115
│ │ │ │ +
122 void push_front(const value_type& t) {
│ │ │ │ +
123 assert(size() < capacity());
│ │ │ │ +
124 for (size_type i=0; i<size(); i++)
│ │ │ │ +
125 (*this)[i+1] = (*this)[i];
│ │ │ │ +
126 (*this)[0] = t;
│ │ │ │ +
127 }
│ │ │ │ +
128
│ │ │ │ + │ │ │ │ +
131 return iterator(*this, 0);
│ │ │ │ +
132 }
│ │ │ │ +
133
│ │ │ │ + │ │ │ │ +
136 return const_iterator(*this, 0);
│ │ │ │ +
137 }
│ │ │ │ +
138
│ │ │ │ + │ │ │ │ +
141 return iterator(*this, size());
│ │ │ │ +
142 }
│ │ │ │ +
143
│ │ │ │ + │ │ │ │ +
146 return const_iterator(*this, size());
│ │ │ │ +
147 }
│ │ │ │ +
148
│ │ │ │ + │ │ │ │ +
151 assert(i < size());
│ │ │ │ +
152 // If there's no padding between the base class and the overflow_ member,
│ │ │ │ +
153 // the compiler should be able to optimize this to
│ │ │ │ +
154 // return *(&BaseArray::operator[](0) + i);
│ │ │ │ +
155 if (i<baseSize)
│ │ │ │ +
156 return BaseArray::operator[](i);
│ │ │ │ +
157 return overflow_[i-baseSize];
│ │ │ │ +
158 }
│ │ │ │ +
159
│ │ │ │ + │ │ │ │ +
162 assert(i < size());
│ │ │ │ +
163 // If there's no padding between the base class and the overflow_ member,
│ │ │ │ +
164 // the compiler should be able to optimize this to
│ │ │ │ +
165 // return *(&BaseArray::operator[](0) + i);
│ │ │ │ +
166 if (i<baseSize)
│ │ │ │ +
167 return BaseArray::operator[](i);
│ │ │ │ +
168 return overflow_[i-baseSize];
│ │ │ │ +
169 }
│ │ │ │ +
170
│ │ │ │ + │ │ │ │ +
173 assert(size() > 0);
│ │ │ │ +
174 return (*this)[0];
│ │ │ │ +
175 }
│ │ │ │ +
176
│ │ │ │ + │ │ │ │ +
179 assert(size() > 0);
│ │ │ │ +
180 return (*this)[0];
│ │ │ │ +
181 }
│ │ │ │
182
│ │ │ │ - │ │ │ │ -
185 {
│ │ │ │ -
186 CHECKSIZE(size_>0);
│ │ │ │ -
187 return data_[(first_ + size_-1) % n];
│ │ │ │ -
188 }
│ │ │ │ -
189
│ │ │ │ - │ │ │ │ -
192 {
│ │ │ │ -
193 CHECKSIZE(size_>0);
│ │ │ │ -
194 return data_[(first_ + size_-1) % n];
│ │ │ │ -
195 }
│ │ │ │ -
196
│ │ │ │ - │ │ │ │ -
203 {
│ │ │ │ -
204 return size_;
│ │ │ │ -
205 }
│ │ │ │ -
206
│ │ │ │ -
208 bool empty() const
│ │ │ │ -
209 {
│ │ │ │ -
210 return size_==0;
│ │ │ │ -
211 }
│ │ │ │ -
212
│ │ │ │ -
214 static constexpr size_type capacity()
│ │ │ │ -
215 {
│ │ │ │ -
216 return n;
│ │ │ │ -
217 }
│ │ │ │ -
218
│ │ │ │ -
220 static constexpr size_type max_size()
│ │ │ │ -
221 {
│ │ │ │ -
222 return n;
│ │ │ │ -
223 }
│ │ │ │ -
224
│ │ │ │ -
228 friend std::ostream& operator<< (std::ostream& s, const ReservedDeque& v)
│ │ │ │ -
229 {
│ │ │ │ -
230 for (size_t i=0; i<v.size(); i++)
│ │ │ │ -
231 s << v[i] << " ";
│ │ │ │ -
232 return s;
│ │ │ │ -
233 }
│ │ │ │ -
234
│ │ │ │ -
235 private:
│ │ │ │ -
236 T data_[n];
│ │ │ │ -
237 size_type first_;
│ │ │ │ -
238 size_type size_;
│ │ │ │ -
239 };
│ │ │ │ -
240
│ │ │ │ -
241} // end namespace Functions
│ │ │ │ -
242} // end namespace Dune
│ │ │ │ -
243
│ │ │ │ -
244#undef CHECKSIZE
│ │ │ │ -
245
│ │ │ │ -
246#endif // DUNE_FUNCTIONS_COMMON_RESERVEDDEQUE_HH
│ │ │ │ -
#define CHECKSIZE(X)
Definition: reserveddeque.hh:20
│ │ │ │ -
Definition: polynomial.hh:10
│ │ │ │ -
A double-ended queue (deque) class with statically reserved memory.
Definition: reserveddeque.hh:45
│ │ │ │ -
void pop_front()
Erases the first element of the vector, O(1) time.
Definition: reserveddeque.hh:126
│ │ │ │ -
static constexpr size_type capacity()
Returns current capacity (allocated memory) of the vector.
Definition: reserveddeque.hh:214
│ │ │ │ -
void clear()
Erases all elements.
Definition: reserveddeque.hh:89
│ │ │ │ -
Dune::GenericIterator< ReservedDeque, value_type > iterator
Iterator used to iterate through a vector.
Definition: reserveddeque.hh:63
│ │ │ │ -
T value_type
The type of object, T, stored in the vector.
Definition: reserveddeque.hh:51
│ │ │ │ -
ReservedDeque()
Constructor.
Definition: reserveddeque.hh:72
│ │ │ │ -
bool empty() const
Returns true if vector has no elements.
Definition: reserveddeque.hh:208
│ │ │ │ -
const_reference back() const
Returns const reference to last element of vector.
Definition: reserveddeque.hh:191
│ │ │ │ -
friend std::ostream & operator<<(std::ostream &s, const ReservedDeque &v)
Send ReservedDeque to an output stream.
Definition: reserveddeque.hh:228
│ │ │ │ -
void push_front(const T &t)
Prepends an element to the begin of a deque if size<capacity, O(1) time.
Definition: reserveddeque.hh:110
│ │ │ │ -
reference operator[](size_type i)
Returns reference to the i'th element.
Definition: reserveddeque.hh:156
│ │ │ │ -
reference front()
Returns reference to first element of vector.
Definition: reserveddeque.hh:170
│ │ │ │ -
T * pointer
Pointer to T.
Definition: reserveddeque.hh:53
│ │ │ │ -
const_reference front() const
Returns const reference to first element of vector.
Definition: reserveddeque.hh:177
│ │ │ │ -
iterator end()
Returns an iterator pointing to the end of the vector.
Definition: reserveddeque.hh:146
│ │ │ │ -
reference back()
Returns reference to last element of vector.
Definition: reserveddeque.hh:184
│ │ │ │ -
void pop_back()
Erases the last element of the vector, O(1) time.
Definition: reserveddeque.hh:119
│ │ │ │ -
const T & const_reference
Const reference to T.
Definition: reserveddeque.hh:57
│ │ │ │ -
static constexpr size_type max_size()
Returns the maximum length of the vector.
Definition: reserveddeque.hh:220
│ │ │ │ -
std::ptrdiff_t difference_type
A signed integral type.
Definition: reserveddeque.hh:61
│ │ │ │ -
T & reference
Reference to T.
Definition: reserveddeque.hh:55
│ │ │ │ -
Dune::GenericIterator< const ReservedDeque, const value_type > const_iterator
Const iterator used to iterate through a vector.
Definition: reserveddeque.hh:65
│ │ │ │ -
size_type size() const
Returns number of elements in the vector.
Definition: reserveddeque.hh:202
│ │ │ │ -
const_iterator end() const
Returns a const_iterator pointing to the end of the vector.
Definition: reserveddeque.hh:151
│ │ │ │ -
void resize(size_t s)
Specifies a new size for the vector.
Definition: reserveddeque.hh:96
│ │ │ │ -
iterator begin()
Returns a iterator pointing to the beginning of the vector.
Definition: reserveddeque.hh:136
│ │ │ │ -
const_iterator begin() const
Returns a const_iterator pointing to the beginning of the vector.
Definition: reserveddeque.hh:141
│ │ │ │ -
ReservedDeque(std::initializer_list< T > const &l)
Definition: reserveddeque.hh:77
│ │ │ │ -
size_t size_type
An unsigned integral type.
Definition: reserveddeque.hh:59
│ │ │ │ -
void push_back(const T &t)
Appends an element to the end of a vector, up to the maximum size n, O(1) time.
Definition: reserveddeque.hh:103
│ │ │ │ + │ │ │ │ +
185 assert(size() > 0);
│ │ │ │ +
186 return (*this)[size()-1];
│ │ │ │ +
187 }
│ │ │ │ +
188
│ │ │ │ + │ │ │ │ +
191 assert(size() > 0);
│ │ │ │ +
192 return (*this)[size()-1];
│ │ │ │ +
193 }
│ │ │ │ +
194
│ │ │ │ +
196 size_type size () const {
│ │ │ │ +
197 return size_;
│ │ │ │ +
198 }
│ │ │ │ +
199
│ │ │ │ +
201 bool empty() const {
│ │ │ │ +
202 return size() == 0;
│ │ │ │ +
203 }
│ │ │ │ +
204
│ │ │ │ +
206 static constexpr size_type capacity() {
│ │ │ │ +
207 return maxSize;
│ │ │ │ +
208 }
│ │ │ │ +
209
│ │ │ │ +
211 static constexpr size_type max_size() {
│ │ │ │ +
212 return maxSize;
│ │ │ │ +
213 }
│ │ │ │ +
214
│ │ │ │ +
216 inline friend std::size_t hash_value(const OverflowArray& v) noexcept {
│ │ │ │ +
217 return hash_range(v.begin(), v.end());
│ │ │ │ +
218 }
│ │ │ │ +
219
│ │ │ │ +
221 friend std::ostream& operator<< (std::ostream& s, const OverflowArray& c) {
│ │ │ │ +
222 for (const auto& ci : c)
│ │ │ │ +
223 s << ci << " ";
│ │ │ │ +
224 return s;
│ │ │ │ +
225 }
│ │ │ │ +
226
│ │ │ │ +
227private:
│ │ │ │ +
228 OverflowBuffer overflow_;
│ │ │ │ +
229 size_type size_ = 0;
│ │ │ │ +
230};
│ │ │ │ +
231
│ │ │ │ +
232
│ │ │ │ +
233
│ │ │ │ +
234} // namespace Dune::Functions
│ │ │ │ +
235
│ │ │ │ +
236
│ │ │ │ +
237
│ │ │ │ +
238#endif // DUNE_FUNCTIONS_COMMON_OVERFLOWARRAY_HH
│ │ │ │ +
Definition: polynomial.hh:11
│ │ │ │ +
A dynamically sized array-like class with overflow.
Definition: overflowarray.hh:45
│ │ │ │ +
const value_type & const_reference
Definition: overflowarray.hh:53
│ │ │ │ +
value_type & reference
Definition: overflowarray.hh:52
│ │ │ │ +
const_iterator end() const
Returns a const_iterator pointing to the end of the OverflowArray.
Definition: overflowarray.hh:145
│ │ │ │ +
bool operator==(const OverflowArray &other) const
Definition: overflowarray.hh:73
│ │ │ │ +
friend std::size_t hash_value(const OverflowArray &v) noexcept
Compute hash value.
Definition: overflowarray.hh:216
│ │ │ │ +
void push_back(const value_type &t)
Appends an element to the end of the OverflowArray,.
Definition: overflowarray.hh:104
│ │ │ │ +
friend std::ostream & operator<<(std::ostream &s, const OverflowArray &c)
Write container to an output stream.
Definition: overflowarray.hh:221
│ │ │ │ +
iterator begin()
Returns a iterator pointing to the beginning of the OverflowArray.
Definition: overflowarray.hh:130
│ │ │ │ +
bool empty() const
Returns true if OverflowArray has no elements.
Definition: overflowarray.hh:201
│ │ │ │ +
size_type size() const
Returns number of elements in the OverflowArray.
Definition: overflowarray.hh:196
│ │ │ │ +
typename BaseArray::value_type value_type
Definition: overflowarray.hh:51
│ │ │ │ +
void pop_back()
Erases the last element of the OverflowArray, O(1) time.
Definition: overflowarray.hh:110
│ │ │ │ +
Dune::GenericIterator< OverflowArray, value_type > iterator
Definition: overflowarray.hh:57
│ │ │ │ +
const_iterator begin() const
Returns a const_iterator pointing to the beginning of the OverflowArray.
Definition: overflowarray.hh:135
│ │ │ │ +
std::ptrdiff_t difference_type
Definition: overflowarray.hh:55
│ │ │ │ + │ │ │ │ +
BA BaseArray
Definition: overflowarray.hh:49
│ │ │ │ +
static constexpr size_type capacity()
Returns the capacity of the OverflowArray.
Definition: overflowarray.hh:206
│ │ │ │ +
static constexpr size_type max_size()
Returns the maximum length of the OverflowArray.
Definition: overflowarray.hh:211
│ │ │ │ +
const_reference front() const
Returns const reference to first element of OverflowArray.
Definition: overflowarray.hh:178
│ │ │ │ +
void clear()
Erases all elements.
Definition: overflowarray.hh:83
│ │ │ │ +
iterator end()
Returns an iterator pointing to the end of the OverflowArray.
Definition: overflowarray.hh:140
│ │ │ │ +
std::size_t size_type
Definition: overflowarray.hh:56
│ │ │ │ +
void resize(size_type n)
Specifies a new size for the OverflowArray.
Definition: overflowarray.hh:93
│ │ │ │ +
value_type * pointer
Definition: overflowarray.hh:54
│ │ │ │ +
Dune::GenericIterator< const OverflowArray, const value_type > const_iterator
Definition: overflowarray.hh:58
│ │ │ │ +
const_reference back() const
Returns const reference to last element of OverflowArray.
Definition: overflowarray.hh:190
│ │ │ │ +
OverflowArray(const std::initializer_list< value_type > &l)
Definition: overflowarray.hh:67
│ │ │ │ +
reference back()
Returns reference to last element of OverflowArray.
Definition: overflowarray.hh:184
│ │ │ │ +
void push_front(const value_type &t)
Inserts an element to the begin of the OverflowArray,.
Definition: overflowarray.hh:122
│ │ │ │ +
reference front()
Returns reference to first element of OverflowArray.
Definition: overflowarray.hh:172
│ │ │ │ +
reference operator[](size_type i)
Returns reference to the i'th element.
Definition: overflowarray.hh:150
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,319 +5,312 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * common │ │ │ │ │ -reserveddeque.hh │ │ │ │ │ +overflowarray.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#ifndef DUNE_FUNCTIONS_COMMON_RESERVEDDEQUE_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_COMMON_RESERVEDDEQUE_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_COMMON_OVERFLOWARRAY_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_COMMON_OVERFLOWARRAY_HH │ │ │ │ │ 5 │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8#include │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11 │ │ │ │ │ + 12#include │ │ │ │ │ + 13 │ │ │ │ │ 14 │ │ │ │ │ - 15#include │ │ │ │ │ - 16 │ │ │ │ │ - 17#ifdef CHECK_RESERVEDDEQUE │ │ │ │ │ - 18#define CHECKSIZE(X) assert(X) │ │ │ │ │ - 19#else │ │ │ │ │ -20#define CHECKSIZE(X) {} │ │ │ │ │ - 21#endif │ │ │ │ │ - 22 │ │ │ │ │ - 23namespace Dune { │ │ │ │ │ - 24namespace Functions { │ │ │ │ │ - 25 │ │ │ │ │ - 43 template │ │ │ │ │ -44 class ReservedDeque │ │ │ │ │ - 45 { │ │ │ │ │ - 46 public: │ │ │ │ │ + 15 │ │ │ │ │ + 16namespace Dune::Functions { │ │ │ │ │ + 17 │ │ │ │ │ + 18 │ │ │ │ │ + 42template> │ │ │ │ │ +43class OverflowArray : │ │ │ │ │ + 44 public BA │ │ │ │ │ + 45{ │ │ │ │ │ + 46 static constexpr std::size_t baseSize = std::tuple_size_v; │ │ │ │ │ 47 │ │ │ │ │ -51 typedef T value_type; │ │ │ │ │ -53 typedef T* pointer; │ │ │ │ │ -55 typedef T& reference; │ │ │ │ │ -57 typedef const T& const_reference; │ │ │ │ │ -59 typedef size_t size_type; │ │ │ │ │ -61 typedef std::ptrdiff_t difference_type; │ │ │ │ │ -63 typedef Dune::GenericIterator iterator; │ │ │ │ │ -65 typedef Dune::GenericIterator │ │ │ │ │ -const_iterator; │ │ │ │ │ + 48public: │ │ │ │ │ +49 using BaseArray = BA; │ │ │ │ │ + 50 │ │ │ │ │ +51 using value_type = typename BaseArray::value_type; │ │ │ │ │ +52 using reference = value_type&; │ │ │ │ │ +53 using const_reference = const value_type&; │ │ │ │ │ +54 using pointer = value_type*; │ │ │ │ │ +55 using difference_type = std::ptrdiff_t; │ │ │ │ │ +56 using size_type = std::size_t; │ │ │ │ │ +57 using iterator = Dune::GenericIterator; │ │ │ │ │ +58 using const_iterator = Dune::GenericIterator; │ │ │ │ │ + 59 │ │ │ │ │ + 60private: │ │ │ │ │ + 61 using OverflowBuffer = std::array; │ │ │ │ │ + 62 │ │ │ │ │ + 63public: │ │ │ │ │ + 64 │ │ │ │ │ +65 OverflowArray() = default; │ │ │ │ │ 66 │ │ │ │ │ -72 ReservedDeque() : │ │ │ │ │ - 73 size_(0), │ │ │ │ │ - 74 first_(0) │ │ │ │ │ - 75 {} │ │ │ │ │ - 76 │ │ │ │ │ -77 ReservedDeque(std::initializer_list const &l) │ │ │ │ │ - 78 { │ │ │ │ │ - 79 assert(l.size() <= n);// Actually, this is not needed any more! │ │ │ │ │ - 80 size_ = l.size(); │ │ │ │ │ - 81 std::copy_n(l.begin(), size_, data_); │ │ │ │ │ - 82 } │ │ │ │ │ - 83 │ │ │ │ │ -89 void clear() │ │ │ │ │ - 90 { │ │ │ │ │ - 91 first_ = 0; │ │ │ │ │ - 92 size_ = 0; │ │ │ │ │ - 93 } │ │ │ │ │ - 94 │ │ │ │ │ -96 void resize(size_t s) │ │ │ │ │ - 97 { │ │ │ │ │ - 98 CHECKSIZE(s<=n); │ │ │ │ │ - 99 size_ = s; │ │ │ │ │ - 100 } │ │ │ │ │ - 101 │ │ │ │ │ -103 void push_back(const T& t) │ │ │ │ │ - 104 { │ │ │ │ │ - 105 CHECKSIZE(size_& l) { │ │ │ │ │ + 68 assert(l.size() <= capacity()); │ │ │ │ │ + 69 size_ = l.size(); │ │ │ │ │ + 70 std::copy_n(l.begin(), size_, begin()); │ │ │ │ │ + 71 } │ │ │ │ │ + 72 │ │ │ │ │ +73 bool operator_==(const OverflowArray& other) const { │ │ │ │ │ + 74 if (size() != other.size()) │ │ │ │ │ + 75 return false; │ │ │ │ │ + 76 for (size_type i=0; i 0); │ │ │ │ │ + 112 if (! empty()) │ │ │ │ │ + 113 size_--; │ │ │ │ │ + 114 } │ │ │ │ │ + 115 │ │ │ │ │ +122 void push_front(const value_type& t) { │ │ │ │ │ + 123 assert(size() < capacity()); │ │ │ │ │ + 124 for (size_type i=0; ii); │ │ │ │ │ - 159 return data_[(first_ + i) % n]; │ │ │ │ │ - 160 } │ │ │ │ │ - 161 │ │ │ │ │ -163 const_reference operator[](size_type i) const │ │ │ │ │ - 164 { │ │ │ │ │ - 165 CHECKSIZE(size_>i); │ │ │ │ │ - 166 return data_[(first_ + i) % n]; │ │ │ │ │ - 167 } │ │ │ │ │ - 168 │ │ │ │ │ -170 reference front() │ │ │ │ │ - 171 { │ │ │ │ │ - 172 CHECKSIZE(size_>0); │ │ │ │ │ - 173 return data_[first_]; │ │ │ │ │ - 174 } │ │ │ │ │ - 175 │ │ │ │ │ -177 const_reference front() const │ │ │ │ │ - 178 { │ │ │ │ │ - 179 CHECKSIZE(size_>0); │ │ │ │ │ - 180 return data_[first_]; │ │ │ │ │ + 133 │ │ │ │ │ +135 const_iterator begin() const { │ │ │ │ │ + 136 return const_iterator(*this, 0); │ │ │ │ │ + 137 } │ │ │ │ │ + 138 │ │ │ │ │ +140 iterator end() { │ │ │ │ │ + 141 return iterator(*this, size()); │ │ │ │ │ + 142 } │ │ │ │ │ + 143 │ │ │ │ │ +145 const_iterator end() const { │ │ │ │ │ + 146 return const_iterator(*this, size()); │ │ │ │ │ + 147 } │ │ │ │ │ + 148 │ │ │ │ │ +150 reference operator[](size_type i) { │ │ │ │ │ + 151 assert(i < size()); │ │ │ │ │ + 152 // If there's no padding between the base class and the overflow_ member, │ │ │ │ │ + 153 // the compiler should be able to optimize this to │ │ │ │ │ + 154 // return *(&BaseArray::operator[](0) + i); │ │ │ │ │ + 155 if (i 0); │ │ │ │ │ + 174 return (*this)[0]; │ │ │ │ │ + 175 } │ │ │ │ │ + 176 │ │ │ │ │ +178 const_reference front() const { │ │ │ │ │ + 179 assert(size() > 0); │ │ │ │ │ + 180 return (*this)[0]; │ │ │ │ │ 181 } │ │ │ │ │ 182 │ │ │ │ │ -184 reference back() │ │ │ │ │ - 185 { │ │ │ │ │ - 186 CHECKSIZE(size_>0); │ │ │ │ │ - 187 return data_[(first_ + size_-1) % n]; │ │ │ │ │ - 188 } │ │ │ │ │ - 189 │ │ │ │ │ -191 const_reference back() const │ │ │ │ │ - 192 { │ │ │ │ │ - 193 CHECKSIZE(size_>0); │ │ │ │ │ - 194 return data_[(first_ + size_-1) % n]; │ │ │ │ │ - 195 } │ │ │ │ │ - 196 │ │ │ │ │ -202 size_type size () const │ │ │ │ │ - 203 { │ │ │ │ │ - 204 return size_; │ │ │ │ │ - 205 } │ │ │ │ │ - 206 │ │ │ │ │ -208 bool empty() const │ │ │ │ │ - 209 { │ │ │ │ │ - 210 return size_==0; │ │ │ │ │ - 211 } │ │ │ │ │ - 212 │ │ │ │ │ -214 static constexpr size_type capacity() │ │ │ │ │ - 215 { │ │ │ │ │ - 216 return n; │ │ │ │ │ - 217 } │ │ │ │ │ - 218 │ │ │ │ │ -220 static constexpr size_type max_size() │ │ │ │ │ - 221 { │ │ │ │ │ - 222 return n; │ │ │ │ │ - 223 } │ │ │ │ │ - 224 │ │ │ │ │ -228 friend std::ostream& operator<<(std::ostream& s, const ReservedDeque& v) │ │ │ │ │ - 229 { │ │ │ │ │ - 230 for (size_t i=0; i 0); │ │ │ │ │ + 186 return (*this)[size()-1]; │ │ │ │ │ + 187 } │ │ │ │ │ + 188 │ │ │ │ │ +190 const_reference back() const { │ │ │ │ │ + 191 assert(size() > 0); │ │ │ │ │ + 192 return (*this)[size()-1]; │ │ │ │ │ + 193 } │ │ │ │ │ + 194 │ │ │ │ │ +196 size_type size () const { │ │ │ │ │ + 197 return size_; │ │ │ │ │ + 198 } │ │ │ │ │ + 199 │ │ │ │ │ +201 bool empty() const { │ │ │ │ │ + 202 return size() == 0; │ │ │ │ │ + 203 } │ │ │ │ │ + 204 │ │ │ │ │ +206 static constexpr size_type capacity() { │ │ │ │ │ + 207 return maxSize; │ │ │ │ │ + 208 } │ │ │ │ │ + 209 │ │ │ │ │ +211 static constexpr size_type max_size() { │ │ │ │ │ + 212 return maxSize; │ │ │ │ │ + 213 } │ │ │ │ │ + 214 │ │ │ │ │ +216 inline friend std::size_t hash_value(const OverflowArray& v) noexcept { │ │ │ │ │ + 217 return hash_range(v.begin(), v.end()); │ │ │ │ │ + 218 } │ │ │ │ │ + 219 │ │ │ │ │ +221 friend std::ostream& operator<<(std::ostream& s, const OverflowArray& c) { │ │ │ │ │ + 222 for (const auto& ci : c) │ │ │ │ │ + 223 s << ci << " "; │ │ │ │ │ + 224 return s; │ │ │ │ │ + 225 } │ │ │ │ │ + 226 │ │ │ │ │ + 227private: │ │ │ │ │ + 228 OverflowBuffer overflow_; │ │ │ │ │ + 229 size_type size_ = 0; │ │ │ │ │ + 230}; │ │ │ │ │ + 231 │ │ │ │ │ + 232 │ │ │ │ │ + 233 │ │ │ │ │ + 234} // namespace Dune::Functions │ │ │ │ │ + 235 │ │ │ │ │ + 236 │ │ │ │ │ + 237 │ │ │ │ │ + 238#endif // DUNE_FUNCTIONS_COMMON_OVERFLOWARRAY_HH │ │ │ │ │ +Dune::Functions │ │ │ │ │ +Definition: polynomial.hh:11 │ │ │ │ │ +Dune::Functions::OverflowArray │ │ │ │ │ +A dynamically sized array-like class with overflow. │ │ │ │ │ +Definition: overflowarray.hh:45 │ │ │ │ │ +Dune::Functions::OverflowArray::const_reference │ │ │ │ │ +const value_type & const_reference │ │ │ │ │ +Definition: overflowarray.hh:53 │ │ │ │ │ +Dune::Functions::OverflowArray::reference │ │ │ │ │ +value_type & reference │ │ │ │ │ +Definition: overflowarray.hh:52 │ │ │ │ │ +Dune::Functions::OverflowArray::end │ │ │ │ │ +const_iterator end() const │ │ │ │ │ +Returns a const_iterator pointing to the end of the OverflowArray. │ │ │ │ │ +Definition: overflowarray.hh:145 │ │ │ │ │ +Dune::Functions::OverflowArray::operator== │ │ │ │ │ +bool operator==(const OverflowArray &other) const │ │ │ │ │ +Definition: overflowarray.hh:73 │ │ │ │ │ +Dune::Functions::OverflowArray::hash_value │ │ │ │ │ +friend std::size_t hash_value(const OverflowArray &v) noexcept │ │ │ │ │ +Compute hash value. │ │ │ │ │ +Definition: overflowarray.hh:216 │ │ │ │ │ +Dune::Functions::OverflowArray::push_back │ │ │ │ │ +void push_back(const value_type &t) │ │ │ │ │ +Appends an element to the end of the OverflowArray,. │ │ │ │ │ +Definition: overflowarray.hh:104 │ │ │ │ │ +Dune::Functions::OverflowArray::operator<< │ │ │ │ │ +friend std::ostream & operator<<(std::ostream &s, const OverflowArray &c) │ │ │ │ │ +Write container to an output stream. │ │ │ │ │ +Definition: overflowarray.hh:221 │ │ │ │ │ +Dune::Functions::OverflowArray::begin │ │ │ │ │ +iterator begin() │ │ │ │ │ +Returns a iterator pointing to the beginning of the OverflowArray. │ │ │ │ │ +Definition: overflowarray.hh:130 │ │ │ │ │ +Dune::Functions::OverflowArray::empty │ │ │ │ │ +bool empty() const │ │ │ │ │ +Returns true if OverflowArray has no elements. │ │ │ │ │ +Definition: overflowarray.hh:201 │ │ │ │ │ +Dune::Functions::OverflowArray::size │ │ │ │ │ +size_type size() const │ │ │ │ │ +Returns number of elements in the OverflowArray. │ │ │ │ │ +Definition: overflowarray.hh:196 │ │ │ │ │ +Dune::Functions::OverflowArray::value_type │ │ │ │ │ +typename BaseArray::value_type value_type │ │ │ │ │ +Definition: overflowarray.hh:51 │ │ │ │ │ +Dune::Functions::OverflowArray::pop_back │ │ │ │ │ +void pop_back() │ │ │ │ │ +Erases the last element of the OverflowArray, O(1) time. │ │ │ │ │ +Definition: overflowarray.hh:110 │ │ │ │ │ +Dune::Functions::OverflowArray::iterator │ │ │ │ │ +Dune::GenericIterator< OverflowArray, value_type > iterator │ │ │ │ │ +Definition: overflowarray.hh:57 │ │ │ │ │ +Dune::Functions::OverflowArray::begin │ │ │ │ │ +const_iterator begin() const │ │ │ │ │ +Returns a const_iterator pointing to the beginning of the OverflowArray. │ │ │ │ │ +Definition: overflowarray.hh:135 │ │ │ │ │ +Dune::Functions::OverflowArray::difference_type │ │ │ │ │ +std::ptrdiff_t difference_type │ │ │ │ │ +Definition: overflowarray.hh:55 │ │ │ │ │ +Dune::Functions::OverflowArray::OverflowArray │ │ │ │ │ +OverflowArray()=default │ │ │ │ │ +Dune::Functions::OverflowArray::BaseArray │ │ │ │ │ +BA BaseArray │ │ │ │ │ +Definition: overflowarray.hh:49 │ │ │ │ │ +Dune::Functions::OverflowArray::capacity │ │ │ │ │ static constexpr size_type capacity() │ │ │ │ │ -Returns current capacity (allocated memory) of the vector. │ │ │ │ │ -Definition: reserveddeque.hh:214 │ │ │ │ │ -Dune::Functions::ReservedDeque::clear │ │ │ │ │ +Returns the capacity of the OverflowArray. │ │ │ │ │ +Definition: overflowarray.hh:206 │ │ │ │ │ +Dune::Functions::OverflowArray::max_size │ │ │ │ │ +static constexpr size_type max_size() │ │ │ │ │ +Returns the maximum length of the OverflowArray. │ │ │ │ │ +Definition: overflowarray.hh:211 │ │ │ │ │ +Dune::Functions::OverflowArray::front │ │ │ │ │ +const_reference front() const │ │ │ │ │ +Returns const reference to first element of OverflowArray. │ │ │ │ │ +Definition: overflowarray.hh:178 │ │ │ │ │ +Dune::Functions::OverflowArray::clear │ │ │ │ │ void clear() │ │ │ │ │ Erases all elements. │ │ │ │ │ -Definition: reserveddeque.hh:89 │ │ │ │ │ -Dune::Functions::ReservedDeque::iterator │ │ │ │ │ -Dune::GenericIterator< ReservedDeque, value_type > iterator │ │ │ │ │ -Iterator used to iterate through a vector. │ │ │ │ │ -Definition: reserveddeque.hh:63 │ │ │ │ │ -Dune::Functions::ReservedDeque::value_type │ │ │ │ │ -T value_type │ │ │ │ │ -The type of object, T, stored in the vector. │ │ │ │ │ -Definition: reserveddeque.hh:51 │ │ │ │ │ -Dune::Functions::ReservedDeque::ReservedDeque │ │ │ │ │ -ReservedDeque() │ │ │ │ │ -Constructor. │ │ │ │ │ -Definition: reserveddeque.hh:72 │ │ │ │ │ -Dune::Functions::ReservedDeque::empty │ │ │ │ │ -bool empty() const │ │ │ │ │ -Returns true if vector has no elements. │ │ │ │ │ -Definition: reserveddeque.hh:208 │ │ │ │ │ -Dune::Functions::ReservedDeque::back │ │ │ │ │ +Definition: overflowarray.hh:83 │ │ │ │ │ +Dune::Functions::OverflowArray::end │ │ │ │ │ +iterator end() │ │ │ │ │ +Returns an iterator pointing to the end of the OverflowArray. │ │ │ │ │ +Definition: overflowarray.hh:140 │ │ │ │ │ +Dune::Functions::OverflowArray::size_type │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +Definition: overflowarray.hh:56 │ │ │ │ │ +Dune::Functions::OverflowArray::resize │ │ │ │ │ +void resize(size_type n) │ │ │ │ │ +Specifies a new size for the OverflowArray. │ │ │ │ │ +Definition: overflowarray.hh:93 │ │ │ │ │ +Dune::Functions::OverflowArray::pointer │ │ │ │ │ +value_type * pointer │ │ │ │ │ +Definition: overflowarray.hh:54 │ │ │ │ │ +Dune::Functions::OverflowArray::const_iterator │ │ │ │ │ +Dune::GenericIterator< const OverflowArray, const value_type > const_iterator │ │ │ │ │ +Definition: overflowarray.hh:58 │ │ │ │ │ +Dune::Functions::OverflowArray::back │ │ │ │ │ const_reference back() const │ │ │ │ │ -Returns const reference to last element of vector. │ │ │ │ │ -Definition: reserveddeque.hh:191 │ │ │ │ │ -Dune::Functions::ReservedDeque::operator<< │ │ │ │ │ -friend std::ostream & operator<<(std::ostream &s, const ReservedDeque &v) │ │ │ │ │ -Send ReservedDeque to an output stream. │ │ │ │ │ -Definition: reserveddeque.hh:228 │ │ │ │ │ -Dune::Functions::ReservedDeque::push_front │ │ │ │ │ -void push_front(const T &t) │ │ │ │ │ -Prepends an element to the begin of a deque if size &l) │ │ │ │ │ +Definition: overflowarray.hh:67 │ │ │ │ │ +Dune::Functions::OverflowArray::back │ │ │ │ │ +reference back() │ │ │ │ │ +Returns reference to last element of OverflowArray. │ │ │ │ │ +Definition: overflowarray.hh:184 │ │ │ │ │ +Dune::Functions::OverflowArray::push_front │ │ │ │ │ +void push_front(const value_type &t) │ │ │ │ │ +Inserts an element to the begin of the OverflowArray,. │ │ │ │ │ +Definition: overflowarray.hh:122 │ │ │ │ │ +Dune::Functions::OverflowArray::front │ │ │ │ │ +reference front() │ │ │ │ │ +Returns reference to first element of OverflowArray. │ │ │ │ │ +Definition: overflowarray.hh:172 │ │ │ │ │ +Dune::Functions::OverflowArray::operator[] │ │ │ │ │ reference operator[](size_type i) │ │ │ │ │ Returns reference to the i'th element. │ │ │ │ │ -Definition: reserveddeque.hh:156 │ │ │ │ │ -Dune::Functions::ReservedDeque::front │ │ │ │ │ -reference front() │ │ │ │ │ -Returns reference to first element of vector. │ │ │ │ │ -Definition: reserveddeque.hh:170 │ │ │ │ │ -Dune::Functions::ReservedDeque::pointer │ │ │ │ │ -T * pointer │ │ │ │ │ -Pointer to T. │ │ │ │ │ -Definition: reserveddeque.hh:53 │ │ │ │ │ -Dune::Functions::ReservedDeque::front │ │ │ │ │ -const_reference front() const │ │ │ │ │ -Returns const reference to first element of vector. │ │ │ │ │ -Definition: reserveddeque.hh:177 │ │ │ │ │ -Dune::Functions::ReservedDeque::end │ │ │ │ │ -iterator end() │ │ │ │ │ -Returns an iterator pointing to the end of the vector. │ │ │ │ │ -Definition: reserveddeque.hh:146 │ │ │ │ │ -Dune::Functions::ReservedDeque::back │ │ │ │ │ -reference back() │ │ │ │ │ -Returns reference to last element of vector. │ │ │ │ │ -Definition: reserveddeque.hh:184 │ │ │ │ │ -Dune::Functions::ReservedDeque::pop_back │ │ │ │ │ -void pop_back() │ │ │ │ │ -Erases the last element of the vector, O(1) time. │ │ │ │ │ -Definition: reserveddeque.hh:119 │ │ │ │ │ -Dune::Functions::ReservedDeque::const_reference │ │ │ │ │ -const T & const_reference │ │ │ │ │ -Const reference to T. │ │ │ │ │ -Definition: reserveddeque.hh:57 │ │ │ │ │ -Dune::Functions::ReservedDeque::max_size │ │ │ │ │ -static constexpr size_type max_size() │ │ │ │ │ -Returns the maximum length of the vector. │ │ │ │ │ -Definition: reserveddeque.hh:220 │ │ │ │ │ -Dune::Functions::ReservedDeque::difference_type │ │ │ │ │ -std::ptrdiff_t difference_type │ │ │ │ │ -A signed integral type. │ │ │ │ │ -Definition: reserveddeque.hh:61 │ │ │ │ │ -Dune::Functions::ReservedDeque::reference │ │ │ │ │ -T & reference │ │ │ │ │ -Reference to T. │ │ │ │ │ -Definition: reserveddeque.hh:55 │ │ │ │ │ -Dune::Functions::ReservedDeque::const_iterator │ │ │ │ │ -Dune::GenericIterator< const ReservedDeque, const value_type > const_iterator │ │ │ │ │ -Const iterator used to iterate through a vector. │ │ │ │ │ -Definition: reserveddeque.hh:65 │ │ │ │ │ -Dune::Functions::ReservedDeque::size │ │ │ │ │ -size_type size() const │ │ │ │ │ -Returns number of elements in the vector. │ │ │ │ │ -Definition: reserveddeque.hh:202 │ │ │ │ │ -Dune::Functions::ReservedDeque::end │ │ │ │ │ -const_iterator end() const │ │ │ │ │ -Returns a const_iterator pointing to the end of the vector. │ │ │ │ │ -Definition: reserveddeque.hh:151 │ │ │ │ │ -Dune::Functions::ReservedDeque::resize │ │ │ │ │ -void resize(size_t s) │ │ │ │ │ -Specifies a new size for the vector. │ │ │ │ │ -Definition: reserveddeque.hh:96 │ │ │ │ │ -Dune::Functions::ReservedDeque::begin │ │ │ │ │ -iterator begin() │ │ │ │ │ -Returns a iterator pointing to the beginning of the vector. │ │ │ │ │ -Definition: reserveddeque.hh:136 │ │ │ │ │ -Dune::Functions::ReservedDeque::begin │ │ │ │ │ -const_iterator begin() const │ │ │ │ │ -Returns a const_iterator pointing to the beginning of the vector. │ │ │ │ │ -Definition: reserveddeque.hh:141 │ │ │ │ │ -Dune::Functions::ReservedDeque::ReservedDeque │ │ │ │ │ -ReservedDeque(std::initializer_list< T > const &l) │ │ │ │ │ -Definition: reserveddeque.hh:77 │ │ │ │ │ -Dune::Functions::ReservedDeque::size_type │ │ │ │ │ -size_t size_type │ │ │ │ │ -An unsigned integral type. │ │ │ │ │ -Definition: reserveddeque.hh:59 │ │ │ │ │ -Dune::Functions::ReservedDeque::push_back │ │ │ │ │ -void push_back(const T &t) │ │ │ │ │ -Appends an element to the end of a vector, up to the maximum size n, O(1) time. │ │ │ │ │ -Definition: reserveddeque.hh:103 │ │ │ │ │ +Definition: overflowarray.hh:150 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00068.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: trigonometricfunction.hh File Reference │ │ │ │ +dune-functions: defaultnodetorangemap.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,48 +58,55 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
trigonometricfunction.hh File Reference
│ │ │ │ +
defaultnodetorangemap.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <cmath>
│ │ │ │ +
#include <dune/common/concept.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │ +#include <dune/typetree/traversal.hh>
│ │ │ │ +#include <dune/typetree/visitor.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::TrigonometricFunction< K, sinFactor, cosFactor >
 A linear combination of trigonomic functions. More...
struct  Dune::Functions::DefaultNodeToRangeMap< Tree >
 A simple node to range map using lexicographic ordering. More...
 
struct  Dune::Functions::DefaultNodeToRangeMap< Tree >::Visitor
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<class K , int sinFactor, int cosFactor>
TrigonometricFunction< K, -cosFactor, sinFactor > Dune::Functions::derivative (const TrigonometricFunction< K, sinFactor, cosFactor > &f)
 Obtain derivative of TrigonometricFunction function. More...
 
template<class Tree >
DefaultNodeToRangeMap< Tree > Dune::Functions::makeDefaultNodeToRangeMap (const Tree &tree)
 
template<class Basis , class TreePath >
auto Dune::Functions::makeDefaultNodeToRangeMap (const Basis &basis, TreePath &&treePath) -> decltype(makeDefaultNodeToRangeMap(TypeTree::child(basis.localView().tree(), treePath)))
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,32 +4,40 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * analyticfunctions │ │ │ │ │ + * functionspacebases │ │ │ │ │ Classes | Namespaces | Functions │ │ │ │ │ -trigonometricfunction.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +defaultnodetorangemap.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::TrigonometricFunction<_K,_sinFactor,_cosFactor_> │ │ │ │ │ -  A linear combination of trigonomic functions. More... │ │ │ │ │ +struct  Dune::Functions::DefaultNodeToRangeMap<_Tree_> │ │ │ │ │ +  A simple node to range map using lexicographic ordering. More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::DefaultNodeToRangeMap<_Tree_>::Visitor │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ -TrigonometricFunction< K, -cosFactor, Dune::Functions::derivative (const │ │ │ │ │ - sinFactor > TrigonometricFunction< K, sinFactor, │ │ │ │ │ - cosFactor > &f) │ │ │ │ │ -  Obtain derivative of │ │ │ │ │ - TrigonometricFunction function. More... │ │ │ │ │ +template │ │ │ │ │ +DefaultNodeToRangeMap< Tree > Dune::Functions::makeDefaultNodeToRangeMap │ │ │ │ │ + (const Tree &tree) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::Functions::makeDefaultNodeToRangeMap │ │ │ │ │ + (const Basis &basis, TreePath &&treePath) - │ │ │ │ │ + > decltype(makeDefaultNodeToRangeMap(TypeTree:: │ │ │ │ │ + child(basis.localView().tree(), treePath))) │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00068_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: trigonometricfunction.hh Source File │ │ │ │ +dune-functions: defaultnodetorangemap.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,61 +58,131 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
trigonometricfunction.hh
│ │ │ │ +
defaultnodetorangemap.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#ifndef DUNE_FUNCTIONS_ANALYTICFUNCTIONS_TRIGONOMETRICFUNCTION_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_ANALYTICFUNCTIONS_TRIGONOMETRICFUNCTION_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTNODETORANGEMAP_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTNODETORANGEMAP_HH
│ │ │ │
5
│ │ │ │ -
6#include <cmath>
│ │ │ │ -
7
│ │ │ │ -
8namespace Dune {
│ │ │ │ -
9namespace Functions {
│ │ │ │ +
6
│ │ │ │ +
7#include <dune/common/concept.hh>
│ │ │ │ +
8
│ │ │ │ + │ │ │ │
10
│ │ │ │ -
11
│ │ │ │ -
12
│ │ │ │ -
25template<class K, int sinFactor, int cosFactor>
│ │ │ │ - │ │ │ │ -
27{
│ │ │ │ -
28public:
│ │ │ │ -
30 K operator () (const K& x) const
│ │ │ │ -
31 {
│ │ │ │ -
32 return sinFactor * std::sin(x) + cosFactor * std::cos(x);
│ │ │ │ -
33 }
│ │ │ │ -
34};
│ │ │ │ -
35
│ │ │ │ -
36
│ │ │ │ -
38template<class K, int sinFactor, int cosFactor>
│ │ │ │ - │ │ │ │ -
40{
│ │ │ │ -
41 return TrigonometricFunction<K, -cosFactor, sinFactor>();
│ │ │ │ -
42}
│ │ │ │ -
43
│ │ │ │ -
44
│ │ │ │ -
45
│ │ │ │ -
46}} // namespace Dune::Functions
│ │ │ │ -
47
│ │ │ │ -
48
│ │ │ │ -
49
│ │ │ │ -
50#endif // DUNE_FUNCTIONS_ANALYTICFUNCTIONS_TRIGONOMETRICFUNCTION_HH
│ │ │ │ -
TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const TrigonometricFunction< K, sinFactor, cosFactor > &f)
Obtain derivative of TrigonometricFunction function.
Definition: trigonometricfunction.hh:39
│ │ │ │ +
11#include <dune/typetree/traversal.hh>
│ │ │ │ +
12#include <dune/typetree/visitor.hh>
│ │ │ │ +
13
│ │ │ │ +
14
│ │ │ │ +
15namespace Dune {
│ │ │ │ +
16namespace Functions {
│ │ │ │ +
17
│ │ │ │ +
18
│ │ │ │ +
19
│ │ │ │ +
37template<class Tree>
│ │ │ │ + │ │ │ │ +
39{
│ │ │ │ +
40
│ │ │ │ +
41 // A simple visitor for computing lexicographic
│ │ │ │ +
42 // subtree indices. To identify a leaf node
│ │ │ │ +
43 // we use its treeIndex() which is unique
│ │ │ │ +
44 // wrt the whole tree and store the computed
│ │ │ │ +
45 // index in a vector indexed by the tree indices.
│ │ │ │ +
46 struct Visitor
│ │ │ │ +
47 : public TypeTree::TreeVisitor
│ │ │ │ +
48 , public TypeTree::DynamicTraversal
│ │ │ │ +
49 {
│ │ │ │ +
50 Visitor(std::vector<std::size_t>& indices) :
│ │ │ │ +
51 indices_(indices),
│ │ │ │ +
52 counter_(0)
│ │ │ │ +
53 {}
│ │ │ │ +
54
│ │ │ │ +
55 template<typename Node, typename TreePath>
│ │ │ │ +
56 void leaf(Node& node, TreePath treePath)
│ │ │ │ +
57 {
│ │ │ │ +
58 if (indices_.size() < node.treeIndex()+1)
│ │ │ │ +
59 indices_.resize(node.treeIndex()+1);
│ │ │ │ +
60 indices_[node.treeIndex()] = counter_;
│ │ │ │ +
61 ++counter_;
│ │ │ │ +
62 }
│ │ │ │ +
63
│ │ │ │ +
64 std::vector<std::size_t>& indices_;
│ │ │ │ +
65 std::size_t counter_;
│ │ │ │ +
66 };
│ │ │ │ +
67
│ │ │ │ +
78 DefaultNodeToRangeMap(const Tree& tree)
│ │ │ │ +
79 {
│ │ │ │ +
80 TypeTree::applyToTree(tree, Visitor(indices_));
│ │ │ │ +
81 }
│ │ │ │ +
82
│ │ │ │ +
83 template<class Node, class TreePath, class Range,
│ │ │ │ +
84 std::enable_if_t<models<Concept::HasIndexAccess, Range, decltype(std::declval<Node>().treeIndex())>() and not Tree::isLeaf, int> = 0>
│ │ │ │ +
85 decltype(auto) operator()(const Node& node, const TreePath& treePath, Range&& y) const
│ │ │ │ +
86 {
│ │ │ │ +
87 return y[indices_[node.treeIndex()]];
│ │ │ │ +
88 }
│ │ │ │ +
89
│ │ │ │ +
90 template<class Node, class TreePath, class Range,
│ │ │ │ +
91 std::enable_if_t< not models<Concept::HasIndexAccess, Range, decltype(std::declval<Node>().treeIndex())>() or Tree::isLeaf, int> = 0>
│ │ │ │ +
92 decltype(auto) operator()(const Node& node, const TreePath& treePath, Range&& y) const
│ │ │ │ +
93 {
│ │ │ │ +
94 return std::forward<Range>(y);
│ │ │ │ +
95 }
│ │ │ │ +
96
│ │ │ │ +
97 std::vector<std::size_t> indices_;
│ │ │ │ +
98};
│ │ │ │ +
99
│ │ │ │ +
100
│ │ │ │ +
101
│ │ │ │ +
102template<class Tree>
│ │ │ │ + │ │ │ │ +
104{
│ │ │ │ +
105 return DefaultNodeToRangeMap<Tree>(tree);
│ │ │ │ +
106}
│ │ │ │ +
107
│ │ │ │ +
108
│ │ │ │ +
109
│ │ │ │ +
110template<class Basis, class TreePath>
│ │ │ │ +
111auto makeDefaultNodeToRangeMap(const Basis& basis, TreePath&& treePath)
│ │ │ │ +
112 -> decltype(makeDefaultNodeToRangeMap(TypeTree::child(basis.localView().tree(),treePath)))
│ │ │ │ +
113{
│ │ │ │ +
114 auto&& localView = basis.localView();
│ │ │ │ +
115 localView.bind(*basis.gridView().template begin<0>());
│ │ │ │ +
116 auto&& tree = TypeTree::child(localView.tree(),treePath);
│ │ │ │ +
117 return makeDefaultNodeToRangeMap(tree);
│ │ │ │ +
118}
│ │ │ │ +
119
│ │ │ │ +
120
│ │ │ │ +
121
│ │ │ │ +
122} // namespace Dune::Functions
│ │ │ │ +
123} // namespace Dune
│ │ │ │ +
124
│ │ │ │ +
125
│ │ │ │ +
126#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTNODETORANGEMAP_HH
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
A linear combination of trigonomic functions.
Definition: trigonometricfunction.hh:27
│ │ │ │ -
K operator()(const K &x) const
Evaluate function.
Definition: trigonometricfunction.hh:30
│ │ │ │ +
DefaultNodeToRangeMap< Tree > makeDefaultNodeToRangeMap(const Tree &tree)
Definition: defaultnodetorangemap.hh:103
│ │ │ │ +
A simple node to range map using lexicographic ordering.
Definition: defaultnodetorangemap.hh:39
│ │ │ │ +
std::vector< std::size_t > indices_
Definition: defaultnodetorangemap.hh:97
│ │ │ │ +
DefaultNodeToRangeMap(const Tree &tree)
Construct DefaultNodeToRangeMap.
Definition: defaultnodetorangemap.hh:78
│ │ │ │ +
Definition: defaultnodetorangemap.hh:49
│ │ │ │ +
Visitor(std::vector< std::size_t > &indices)
Definition: defaultnodetorangemap.hh:50
│ │ │ │ +
void leaf(Node &node, TreePath treePath)
Definition: defaultnodetorangemap.hh:56
│ │ │ │ +
std::size_t counter_
Definition: defaultnodetorangemap.hh:65
│ │ │ │ +
std::vector< std::size_t > & indices_
Definition: defaultnodetorangemap.hh:64
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,64 +4,147 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * analyticfunctions │ │ │ │ │ -trigonometricfunction.hh │ │ │ │ │ + * functionspacebases │ │ │ │ │ +defaultnodetorangemap.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#ifndef DUNE_FUNCTIONS_ANALYTICFUNCTIONS_TRIGONOMETRICFUNCTION_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_ANALYTICFUNCTIONS_TRIGONOMETRICFUNCTION_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTNODETORANGEMAP_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTNODETORANGEMAP_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7 │ │ │ │ │ - 8namespace Dune { │ │ │ │ │ - 9namespace Functions { │ │ │ │ │ + 6 │ │ │ │ │ + 7#include │ │ │ │ │ + 8 │ │ │ │ │ + 9#include │ │ │ │ │ 10 │ │ │ │ │ - 11 │ │ │ │ │ - 12 │ │ │ │ │ - 25template │ │ │ │ │ -26class TrigonometricFunction │ │ │ │ │ - 27{ │ │ │ │ │ - 28public: │ │ │ │ │ -30 K operator_()(const K& x) const │ │ │ │ │ - 31 { │ │ │ │ │ - 32 return sinFactor * std::sin(x) + cosFactor * std::cos(x); │ │ │ │ │ - 33 } │ │ │ │ │ - 34}; │ │ │ │ │ - 35 │ │ │ │ │ - 36 │ │ │ │ │ - 38template │ │ │ │ │ -39TrigonometricFunction derivative(const │ │ │ │ │ -TrigonometricFunction& f) │ │ │ │ │ - 40{ │ │ │ │ │ - 41 return TrigonometricFunction(); │ │ │ │ │ - 42} │ │ │ │ │ - 43 │ │ │ │ │ - 44 │ │ │ │ │ - 45 │ │ │ │ │ - 46}} // namespace Dune::Functions │ │ │ │ │ - 47 │ │ │ │ │ - 48 │ │ │ │ │ - 49 │ │ │ │ │ - 50#endif // DUNE_FUNCTIONS_ANALYTICFUNCTIONS_TRIGONOMETRICFUNCTION_HH │ │ │ │ │ -Dune::Functions::derivative │ │ │ │ │ -TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const │ │ │ │ │ -TrigonometricFunction< K, sinFactor, cosFactor > &f) │ │ │ │ │ -Obtain derivative of TrigonometricFunction function. │ │ │ │ │ -Definition: trigonometricfunction.hh:39 │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ + 13 │ │ │ │ │ + 14 │ │ │ │ │ + 15namespace Dune { │ │ │ │ │ + 16namespace Functions { │ │ │ │ │ + 17 │ │ │ │ │ + 18 │ │ │ │ │ + 19 │ │ │ │ │ + 37template │ │ │ │ │ +38struct DefaultNodeToRangeMap │ │ │ │ │ + 39{ │ │ │ │ │ + 40 │ │ │ │ │ + 41 // A simple visitor for computing lexicographic │ │ │ │ │ + 42 // subtree indices. To identify a leaf node │ │ │ │ │ + 43 // we use its treeIndex() which is unique │ │ │ │ │ + 44 // wrt the whole tree and store the computed │ │ │ │ │ + 45 // index in a vector indexed by the tree indices. │ │ │ │ │ +46 struct Visitor │ │ │ │ │ + 47 : public TypeTree::TreeVisitor │ │ │ │ │ + 48 , public TypeTree::DynamicTraversal │ │ │ │ │ + 49 { │ │ │ │ │ +50 Visitor(std::vector& indices) : │ │ │ │ │ + 51 indices_(indices), │ │ │ │ │ + 52 counter_(0) │ │ │ │ │ + 53 {} │ │ │ │ │ + 54 │ │ │ │ │ + 55 template │ │ │ │ │ +56 void leaf(Node& node, TreePath treePath) │ │ │ │ │ + 57 { │ │ │ │ │ + 58 if (indices_.size() < node.treeIndex()+1) │ │ │ │ │ + 59 indices_.resize(node.treeIndex()+1); │ │ │ │ │ + 60 indices_[node.treeIndex()] = counter_; │ │ │ │ │ + 61 ++counter_; │ │ │ │ │ + 62 } │ │ │ │ │ + 63 │ │ │ │ │ +64 std::vector& indices_; │ │ │ │ │ +65 std::size_t counter_; │ │ │ │ │ + 66 }; │ │ │ │ │ + 67 │ │ │ │ │ +78 DefaultNodeToRangeMap(const Tree& tree) │ │ │ │ │ + 79 { │ │ │ │ │ + 80 TypeTree::applyToTree(tree, Visitor(indices_)); │ │ │ │ │ + 81 } │ │ │ │ │ + 82 │ │ │ │ │ + 83 template().treeIndex())>() and not Tree::isLeaf, int> = 0> │ │ │ │ │ +85 decltype(auto) operator()(const Node& node, const TreePath& treePath, │ │ │ │ │ +Range&& y) const │ │ │ │ │ + 86 { │ │ │ │ │ + 87 return y[indices_[node.treeIndex()]]; │ │ │ │ │ + 88 } │ │ │ │ │ + 89 │ │ │ │ │ + 90 template().treeIndex())>() or Tree::isLeaf, int> = 0> │ │ │ │ │ +92 decltype(auto) operator()(const Node& node, const TreePath& treePath, │ │ │ │ │ +Range&& y) const │ │ │ │ │ + 93 { │ │ │ │ │ + 94 return std::forward(y); │ │ │ │ │ + 95 } │ │ │ │ │ + 96 │ │ │ │ │ +97 std::vector indices_; │ │ │ │ │ + 98}; │ │ │ │ │ + 99 │ │ │ │ │ + 100 │ │ │ │ │ + 101 │ │ │ │ │ + 102template │ │ │ │ │ +103DefaultNodeToRangeMap makeDefaultNodeToRangeMap(const Tree& tree) │ │ │ │ │ + 104{ │ │ │ │ │ + 105 return DefaultNodeToRangeMap(tree); │ │ │ │ │ + 106} │ │ │ │ │ + 107 │ │ │ │ │ + 108 │ │ │ │ │ + 109 │ │ │ │ │ + 110template │ │ │ │ │ +111auto makeDefaultNodeToRangeMap(const Basis& basis, TreePath&& treePath) │ │ │ │ │ + 112 -> decltype(makeDefaultNodeToRangeMap(TypeTree::child(basis.localView │ │ │ │ │ +().tree(),treePath))) │ │ │ │ │ + 113{ │ │ │ │ │ + 114 auto&& localView = basis.localView(); │ │ │ │ │ + 115 localView.bind(*basis.gridView().template begin<0>()); │ │ │ │ │ + 116 auto&& tree = TypeTree::child(localView.tree(),treePath); │ │ │ │ │ + 117 return makeDefaultNodeToRangeMap(tree); │ │ │ │ │ + 118} │ │ │ │ │ + 119 │ │ │ │ │ + 120 │ │ │ │ │ + 121 │ │ │ │ │ + 122} // namespace Dune::Functions │ │ │ │ │ + 123} // namespace Dune │ │ │ │ │ + 124 │ │ │ │ │ + 125 │ │ │ │ │ + 126#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTNODETORANGEMAP_HH │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::TrigonometricFunction │ │ │ │ │ -A linear combination of trigonomic functions. │ │ │ │ │ -Definition: trigonometricfunction.hh:27 │ │ │ │ │ -Dune::Functions::TrigonometricFunction::operator() │ │ │ │ │ -K operator()(const K &x) const │ │ │ │ │ -Evaluate function. │ │ │ │ │ -Definition: trigonometricfunction.hh:30 │ │ │ │ │ +Dune::Functions::makeDefaultNodeToRangeMap │ │ │ │ │ +DefaultNodeToRangeMap< Tree > makeDefaultNodeToRangeMap(const Tree &tree) │ │ │ │ │ +Definition: defaultnodetorangemap.hh:103 │ │ │ │ │ +Dune::Functions::DefaultNodeToRangeMap │ │ │ │ │ +A simple node to range map using lexicographic ordering. │ │ │ │ │ +Definition: defaultnodetorangemap.hh:39 │ │ │ │ │ +Dune::Functions::DefaultNodeToRangeMap::indices_ │ │ │ │ │ +std::vector< std::size_t > indices_ │ │ │ │ │ +Definition: defaultnodetorangemap.hh:97 │ │ │ │ │ +Dune::Functions::DefaultNodeToRangeMap::DefaultNodeToRangeMap │ │ │ │ │ +DefaultNodeToRangeMap(const Tree &tree) │ │ │ │ │ +Construct DefaultNodeToRangeMap. │ │ │ │ │ +Definition: defaultnodetorangemap.hh:78 │ │ │ │ │ +Dune::Functions::DefaultNodeToRangeMap::Visitor │ │ │ │ │ +Definition: defaultnodetorangemap.hh:49 │ │ │ │ │ +Dune::Functions::DefaultNodeToRangeMap::Visitor::Visitor │ │ │ │ │ +Visitor(std::vector< std::size_t > &indices) │ │ │ │ │ +Definition: defaultnodetorangemap.hh:50 │ │ │ │ │ +Dune::Functions::DefaultNodeToRangeMap::Visitor::leaf │ │ │ │ │ +void leaf(Node &node, TreePath treePath) │ │ │ │ │ +Definition: defaultnodetorangemap.hh:56 │ │ │ │ │ +Dune::Functions::DefaultNodeToRangeMap::Visitor::counter_ │ │ │ │ │ +std::size_t counter_ │ │ │ │ │ +Definition: defaultnodetorangemap.hh:65 │ │ │ │ │ +Dune::Functions::DefaultNodeToRangeMap::Visitor::indices_ │ │ │ │ │ +std::vector< std::size_t > & indices_ │ │ │ │ │ +Definition: defaultnodetorangemap.hh:64 │ │ │ │ │ +concepts.hh │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00074.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: istlvectorbackend.hh File Reference │ │ │ │ +dune-functions: boundarydofs.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,61 +58,42 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
istlvectorbackend.hh File Reference
│ │ │ │ +
boundarydofs.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <cstddef>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <dune/common/std/type_traits.hh>
│ │ │ │ -#include <dune/common/indices.hh>
│ │ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ │ -#include <dune/common/concept.hh>
│ │ │ │ -#include <dune/functions/common/indexaccess.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │ +
#include <utility>
│ │ │ │ +#include <dune/functions/functionspacebases/subentitydofs.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<class V >
constexpr auto Dune::Functions::fieldTypes ()
 Generate list of field types in container. More...
 
template<class V >
constexpr bool Dune::Functions::hasUniqueFieldType ()
 Check if container has a unique field type. More...
 
template<class Vector >
auto Dune::Functions::istlVectorBackend (Vector &v)
 Return a vector backend wrapping non-const ISTL like containers. More...
 
template<class Vector >
auto Dune::Functions::istlVectorBackend (const Vector &v)
 Return a vector backend wrapping const ISTL like containers. More...
 
template<class Basis , class F , decltype(std::declval< std::decay_t< F > >()(0, std::declval< typename Basis::LocalView >(), std::declval< typename Basis::GridView::Intersection >()), 0) = 0>
void Dune::Functions::forEachBoundaryDOF (const Basis &basis, F &&f)
 Loop over all DOFs on the boundary. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,47 +4,28 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * backends │ │ │ │ │ + * functionspacebases │ │ │ │ │ Namespaces | Functions │ │ │ │ │ -istlvectorbackend.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +boundarydofs.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ -constexpr auto Dune::Functions::fieldTypes () │ │ │ │ │ -  Generate list of field types in container. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -constexpr bool Dune::Functions::hasUniqueFieldType () │ │ │ │ │ -  Check if container has a unique field type. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - auto Dune::Functions::istlVectorBackend (Vector &v) │ │ │ │ │ -  Return a vector backend wrapping non-const ISTL like │ │ │ │ │ - containers. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - auto Dune::Functions::istlVectorBackend (const Vector &v) │ │ │ │ │ -  Return a vector backend wrapping const ISTL like containers. │ │ │ │ │ - More... │ │ │ │ │ +template >() │ │ │ │ │ +(0, std::declval< typename Basis::LocalView >(), std::declval< typename │ │ │ │ │ +Basis::GridView::Intersection >()), 0) = 0> │ │ │ │ │ +void Dune::Functions::forEachBoundaryDOF (const Basis &basis, F &&f) │ │ │ │ │ +  Loop over all DOFs on the boundary. More... │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00074_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: istlvectorbackend.hh Source File │ │ │ │ +dune-functions: boundarydofs.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,339 +58,103 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
istlvectorbackend.hh
│ │ │ │ +
boundarydofs.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_ISTLVECTORBACKEND_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_ISTLVECTORBACKEND_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BOUNDARYDOFS_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BOUNDARYDOFS_HH
│ │ │ │
5
│ │ │ │ -
6#include <cstddef>
│ │ │ │ -
7#include <utility>
│ │ │ │ -
8#include <type_traits>
│ │ │ │ +
6#include <utility>
│ │ │ │ +
7
│ │ │ │ + │ │ │ │
9
│ │ │ │ -
10#include <dune/common/std/type_traits.hh>
│ │ │ │ -
11#include <dune/common/indices.hh>
│ │ │ │ -
12#include <dune/common/hybridutilities.hh>
│ │ │ │ -
13#include <dune/common/concept.hh>
│ │ │ │ +
10namespace Dune {
│ │ │ │ +
11namespace Functions {
│ │ │ │ +
12
│ │ │ │ +
13
│ │ │ │
14
│ │ │ │ - │ │ │ │ - │ │ │ │ -
17
│ │ │ │ -
18
│ │ │ │ -
19namespace Dune {
│ │ │ │ -
20namespace Functions {
│ │ │ │ -
21
│ │ │ │ -
22namespace Impl {
│ │ │ │ -
23
│ │ │ │ -
24template<class V,
│ │ │ │ -
25 std::enable_if_t<not Dune::models<Imp::Concept::HasStaticIndexAccess, V>() , int> = 0>
│ │ │ │ -
26auto fieldTypes(V&& /*v*/)
│ │ │ │ -
27{
│ │ │ │ -
28 return TypeList<V>{};
│ │ │ │ -
29}
│ │ │ │ -
30
│ │ │ │ -
31template<class V,
│ │ │ │ -
32 std::enable_if_t<Dune::models<Imp::Concept::HasStaticIndexAccess, V>(), int> = 0>
│ │ │ │ -
33auto fieldTypes(V&& v)
│ │ │ │ -
34{
│ │ │ │ -
35 if constexpr (Dune::models<Imp::Concept::HasDynamicIndexAccess<std::size_t>, V>())
│ │ │ │ -
36 return fieldTypes(v[std::size_t{0}]);
│ │ │ │ -
37 else
│ │ │ │ -
38 {
│ │ │ │ -
39 auto indexRange = typename decltype(range(Hybrid::size(v)))::integer_sequence();
│ │ │ │ -
40 return unpackIntegerSequence([&](auto... i) {
│ │ │ │ -
41 return uniqueTypeList(std::tuple_cat(fieldTypes(v[i])...));
│ │ │ │ -
42 }, indexRange);
│ │ │ │ -
43 }
│ │ │ │ -
44}
│ │ │ │ -
45
│ │ │ │ -
46} // namespace Impl
│ │ │ │ -
47
│ │ │ │ -
48
│ │ │ │ -
49
│ │ │ │ -
62template<class V>
│ │ │ │ -
63constexpr auto fieldTypes()
│ │ │ │ -
64{
│ │ │ │ -
65 return decltype(Impl::fieldTypes(std::declval<V>())){};
│ │ │ │ -
66}
│ │ │ │ -
67
│ │ │ │ -
73template<class V>
│ │ │ │ -
74constexpr bool hasUniqueFieldType()
│ │ │ │ -
75{
│ │ │ │ -
76 return std::tuple_size<std::decay_t<decltype(fieldTypes<V>())>>::value==1;
│ │ │ │ -
77}
│ │ │ │ -
78
│ │ │ │ -
79
│ │ │ │ -
80
│ │ │ │ -
81namespace Impl {
│ │ │ │ -
82
│ │ │ │ -
83/*
│ │ │ │ -
84 * \brief A wrapper providing multi-index access to vector entries
│ │ │ │ -
85 *
│ │ │ │ -
86 * The wrapped vector type should be an istl like random
│ │ │ │ -
87 * access container providing operator[] and size() methods.
│ │ │ │ -
88 * For classical containers this should support indices
│ │ │ │ -
89 * of type std::size_t. For multi-type containers indices
│ │ │ │ -
90 * of the form Dune::index_constant<i> should be supported
│ │ │ │ -
91 * while size() should be a static constexpr method.
│ │ │ │ -
92 *
│ │ │ │ -
93 * When resolving multi-indices the backend appends indices
│ │ │ │ -
94 * using operator[] as long as the result is not a scalar.
│ │ │ │ -
95 * If this exhausts the digits of the multi-index, additional
│ │ │ │ -
96 * zero`s are appended.
│ │ │ │ -
97 *
│ │ │ │ -
98 * \tparam V Type of the raw wrapper vector
│ │ │ │ -
99 */
│ │ │ │ -
100template<class V>
│ │ │ │ -
101class ISTLVectorBackend
│ │ │ │ -
102{
│ │ │ │ -
103
│ │ │ │ -
104 // Template aliases for using detection idiom.
│ │ │ │ -
105 template<class C>
│ │ │ │ -
106 using dynamicIndexAccess_t = decltype(std::declval<C>()[0]);
│ │ │ │ -
107
│ │ │ │ -
108 template<class C>
│ │ │ │ -
109 using staticIndexAccess_t = decltype(std::declval<C>()[Dune::Indices::_0]);
│ │ │ │ -
110
│ │ │ │ -
111 template<class C>
│ │ │ │ -
112 using resizeMethod_t = decltype(std::declval<C>().resize(0));
│ │ │ │ -
113
│ │ │ │ -
114
│ │ │ │ -
115
│ │ │ │ -
116 // Short cuts for feature detection
│ │ │ │ -
117 template<class C>
│ │ │ │ -
118 using hasDynamicIndexAccess = Dune::Std::is_detected<dynamicIndexAccess_t, std::remove_reference_t<C>>;
│ │ │ │ -
119
│ │ │ │ -
120 template<class C>
│ │ │ │ -
121 using hasStaticIndexAccess = Dune::Std::is_detected<staticIndexAccess_t, std::remove_reference_t<C>>;
│ │ │ │ -
122
│ │ │ │ -
123 template<class C>
│ │ │ │ -
124 using hasResizeMethod = Dune::Std::is_detected<resizeMethod_t, std::remove_reference_t<C>>;
│ │ │ │ +
34template<class Basis, class F,
│ │ │ │ +
35 decltype(std::declval<std::decay_t<F>>()(0, std::declval<typename Basis::LocalView>(),std::declval<typename Basis::GridView::Intersection>()), 0) = 0>
│ │ │ │ +
36void forEachBoundaryDOF(const Basis& basis, F&& f)
│ │ │ │ +
37{
│ │ │ │ +
38 auto localView = basis.localView();
│ │ │ │ +
39 auto seDOFs = subEntityDOFs(basis);
│ │ │ │ +
40 const auto& gridView = basis.gridView();
│ │ │ │ +
41 for(auto&& element : elements(gridView))
│ │ │ │ +
42 if (element.hasBoundaryIntersections())
│ │ │ │ +
43 {
│ │ │ │ +
44 localView.bind(element);
│ │ │ │ +
45 for(const auto& intersection: intersections(gridView, element))
│ │ │ │ +
46 if (intersection.boundary())
│ │ │ │ +
47 for(auto localIndex: seDOFs.bind(localView,intersection))
│ │ │ │ +
48 f(localIndex, localView, intersection);
│ │ │ │ +
49 }
│ │ │ │ +
50}
│ │ │ │ +
51
│ │ │ │ +
52
│ │ │ │ +
53
│ │ │ │ +
71template<class Basis, class F,
│ │ │ │ +
72 decltype(std::declval<std::decay_t<F>>()(0, std::declval<typename Basis::LocalView>()),0) = 0>
│ │ │ │ +
73void forEachBoundaryDOF(const Basis& basis, F&& f)
│ │ │ │ +
74{
│ │ │ │ +
75 auto localView = basis.localView();
│ │ │ │ +
76 auto seDOFs = subEntityDOFs(basis);
│ │ │ │ +
77 const auto& gridView = basis.gridView();
│ │ │ │ +
78 for(auto&& element : elements(gridView))
│ │ │ │ +
79 if (element.hasBoundaryIntersections())
│ │ │ │ +
80 {
│ │ │ │ +
81 localView.bind(element);
│ │ │ │ +
82 for(const auto& intersection: intersections(gridView, element))
│ │ │ │ +
83 if (intersection.boundary())
│ │ │ │ +
84 for(auto localIndex: seDOFs.bind(localView,intersection))
│ │ │ │ +
85 f(localIndex, localView);
│ │ │ │ +
86 }
│ │ │ │ +
87}
│ │ │ │ +
88
│ │ │ │ +
89
│ │ │ │ +
90
│ │ │ │ +
107template<class Basis, class F,
│ │ │ │ +
108 decltype(std::declval<std::decay_t<F>>()(std::declval<typename Basis::MultiIndex>()),0) = 0>
│ │ │ │ +
109void forEachBoundaryDOF(const Basis& basis, F&& f)
│ │ │ │ +
110{
│ │ │ │ +
111 auto localView = basis.localView();
│ │ │ │ +
112 auto seDOFs = subEntityDOFs(basis);
│ │ │ │ +
113 const auto& gridView = basis.gridView();
│ │ │ │ +
114 for(auto&& element : elements(gridView))
│ │ │ │ +
115 if (element.hasBoundaryIntersections())
│ │ │ │ +
116 {
│ │ │ │ +
117 localView.bind(element);
│ │ │ │ +
118 for(const auto& intersection: intersections(gridView, element))
│ │ │ │ +
119 if (intersection.boundary())
│ │ │ │ +
120 for(auto localIndex: seDOFs.bind(localView,intersection))
│ │ │ │ +
121 f(localView.index(localIndex));
│ │ │ │ +
122 }
│ │ │ │ +
123}
│ │ │ │ +
124
│ │ │ │
125
│ │ │ │ -
126 template<class C>
│ │ │ │ -
127 using isDynamicVector = Dune::Std::is_detected<dynamicIndexAccess_t, std::remove_reference_t<C>>;
│ │ │ │ -
128
│ │ │ │ -
129 template<class C>
│ │ │ │ -
130 using isStaticVector = Dune::Std::bool_constant<
│ │ │ │ -
131 Dune::Std::is_detected_v<staticIndexAccess_t, std::remove_reference_t<C>>
│ │ │ │ -
132 and not Dune::Std::is_detected_v<dynamicIndexAccess_t, std::remove_reference_t<C>>>;
│ │ │ │ -
133
│ │ │ │ -
134 template<class C>
│ │ │ │ -
135 using isScalar = Dune::Std::bool_constant<not Dune::Std::is_detected_v<staticIndexAccess_t, std::remove_reference_t<C>>>;
│ │ │ │ -
136
│ │ │ │ -
137 template<class C>
│ │ │ │ -
138 using isVector = Dune::Std::bool_constant<Dune::Std::is_detected_v<staticIndexAccess_t, std::remove_reference_t<C>>>;
│ │ │ │ -
139
│ │ │ │ -
140
│ │ │ │ -
141
│ │ │ │ -
142 template<class... Args>
│ │ │ │ -
143 static void forwardToResize(Args&&... args)
│ │ │ │ -
144 {
│ │ │ │ -
145 resize(std::forward<Args>(args)...);
│ │ │ │ -
146 }
│ │ │ │ -
147
│ │ │ │ -
148
│ │ │ │ -
149 template<class C, class SizeProvider,
│ │ │ │ -
150 std::enable_if_t<hasResizeMethod<C>::value, int> = 0>
│ │ │ │ -
151 static void resize(C&& c, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ -
152 {
│ │ │ │ -
153 auto size = sizeProvider.size(prefix);
│ │ │ │ -
154 if (size==0)
│ │ │ │ -
155 {
│ │ │ │ -
156 // If size==0 this prefix refers to a single coefficient c.
│ │ │ │ -
157 // But being in this overload means that c is not a scalar
│ │ │ │ -
158 // because is has a resize() method. Since operator[] deliberately
│ │ │ │ -
159 // supports implicit padding of multi-indices by as many
│ │ │ │ -
160 // [0]'s as needed to resolve a scalar entry, we should also
│ │ │ │ -
161 // except a non-scalar c here. However, this requires that
│ │ │ │ -
162 // we silently believe that whatever size c already has is
│ │ │ │ -
163 // intended by the user. The only exception is c.size()==0
│ │ │ │ -
164 // which is not acceptable but we also cannot know the desired size.
│ │ │ │ -
165 if (c.size()==0)
│ │ │ │ -
166 DUNE_THROW(RangeError, "The vector entry v[" << prefix << "] should refer to a "
│ │ │ │ -
167 << "scalar coefficient, but is a dynamically sized vector of size==0");
│ │ │ │ -
168 else
│ │ │ │ -
169 // Accept non-zero sized coefficients to avoid that resize(basis)
│ │ │ │ -
170 // fails for a vector that works with operator[] and already
│ │ │ │ -
171 // has the appropriate size.
│ │ │ │ -
172 return;
│ │ │ │ -
173 }
│ │ │ │ -
174 c.resize(size);
│ │ │ │ -
175 prefix.push_back(0);
│ │ │ │ -
176 for(std::size_t i=0; i<size; ++i)
│ │ │ │ -
177 {
│ │ │ │ -
178 prefix.back() = i;
│ │ │ │ -
179 resize(c[i], sizeProvider, prefix);
│ │ │ │ -
180 }
│ │ │ │ -
181 }
│ │ │ │ -
182
│ │ │ │ -
183 template<class C, class SizeProvider,
│ │ │ │ -
184 std::enable_if_t<not hasResizeMethod<C>::value, int> = 0,
│ │ │ │ -
185 std::enable_if_t<isVector<C>::value, int> = 0>
│ │ │ │ -
186 static void resize(C&& c, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ -
187 {
│ │ │ │ -
188 auto size = sizeProvider.size(prefix);
│ │ │ │ -
189 // If size == 0 there's nothing to do:
│ │ │ │ -
190 // We can't resize c and it's already
│ │ │ │ -
191 // large enough anyway.
│ │ │ │ -
192 if (size == 0)
│ │ │ │ -
193 return;
│ │ │ │ -
194
│ │ │ │ -
195 // If size>0 but c does not have the appropriate
│ │ │ │ -
196 // size we throw an exception.
│ │ │ │ -
197 //
│ │ │ │ -
198 // We could perhaps also allow c.size()>size.
│ │ │ │ -
199 // But then looping the loop below gets complicated:
│ │ │ │ -
200 // We're not allowed to loop until c.size(). But
│ │ │ │ -
201 // we also cannot use size for termination,
│ │ │ │ -
202 // because this fails if c is a static vector.
│ │ │ │ -
203 if (c.size() != size)
│ │ │ │ -
204 DUNE_THROW(RangeError, "Can't resize non-resizable entry v[" << prefix << "] of size " << c.size() << " to size(" << prefix << ")=" << size);
│ │ │ │ -
205
│ │ │ │ -
206 // Recursively resize all entries of c now.
│ │ │ │ -
207 using namespace Dune::Hybrid;
│ │ │ │ -
208 prefix.push_back(0);
│ │ │ │ -
209 forEach(integralRange(Hybrid::size(c)), [&](auto&& i) {
│ │ │ │ -
210 prefix.back() = i;
│ │ │ │ -
211 // Here we'd simply like to call resize(c[i], sizeProvider, prefix);
│ │ │ │ -
212 // but even gcc-7 does not except this bus reports
│ │ │ │ -
213 // "error: ‘this’ was not captured for this lambda function"
│ │ │ │ -
214 // although there's no 'this' because we're in a static method.
│ │ │ │ -
215 // Bypassing this by and additional method that does perfect
│ │ │ │ -
216 // forwarding allows to workaround this.
│ │ │ │ -
217 ISTLVectorBackend<V>::forwardToResize(c[i], sizeProvider, prefix);
│ │ │ │ -
218 });
│ │ │ │ -
219 }
│ │ │ │ -
220
│ │ │ │ -
221 template<class C, class SizeProvider,
│ │ │ │ -
222 std::enable_if_t<not hasResizeMethod<C>::value, int> = 0,
│ │ │ │ -
223 std::enable_if_t<isScalar<C>::value, int> = 0>
│ │ │ │ -
224 static void resize(C&&, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ -
225 {
│ │ │ │ -
226 auto size = sizeProvider.size(prefix);
│ │ │ │ -
227 if (size != 0)
│ │ │ │ -
228 DUNE_THROW(RangeError, "Can't resize scalar vector entry v[" << prefix << "] to size(" << prefix << ")=" << size);
│ │ │ │ -
229 }
│ │ │ │ -
230
│ │ │ │ -
231 template<class C, class T,
│ │ │ │ -
232 std::enable_if_t<std::is_assignable<C&,T>::value, int> = 0>
│ │ │ │ -
233 void recursiveAssign(C& c, const T& t)
│ │ │ │ -
234 {
│ │ │ │ -
235 c = t;
│ │ │ │ -
236 }
│ │ │ │ -
237
│ │ │ │ -
238 template<class C, class T,
│ │ │ │ -
239 std::enable_if_t<not std::is_assignable<C&,T>::value, int> = 0>
│ │ │ │ -
240 void recursiveAssign(C& c, const T& t)
│ │ │ │ -
241 {
│ │ │ │ -
242 Dune::Hybrid::forEach(c, [&](auto&& ci) {
│ │ │ │ -
243 recursiveAssign(ci, t);
│ │ │ │ -
244 });
│ │ │ │ -
245 }
│ │ │ │ -
246
│ │ │ │ -
247public:
│ │ │ │ -
248
│ │ │ │ -
249 using Vector = V;
│ │ │ │ -
250
│ │ │ │ -
251 ISTLVectorBackend(Vector& vector) :
│ │ │ │ -
252 vector_(&vector)
│ │ │ │ -
253 {}
│ │ │ │ -
254
│ │ │ │ -
255 template<class SizeProvider>
│ │ │ │ -
256 void resize(const SizeProvider& sizeProvider)
│ │ │ │ -
257 {
│ │ │ │ -
258 auto prefix = typename SizeProvider::SizePrefix();
│ │ │ │ -
259 prefix.resize(0);
│ │ │ │ -
260 resize(*vector_, sizeProvider, prefix);
│ │ │ │ -
261 }
│ │ │ │ -
262
│ │ │ │ -
263 template<class MultiIndex>
│ │ │ │ -
264 decltype(auto) operator[](const MultiIndex& index) const
│ │ │ │ -
265 {
│ │ │ │ -
266 return resolveDynamicMultiIndex(*vector_, index);
│ │ │ │ -
267 }
│ │ │ │ -
268
│ │ │ │ -
269 template<class MultiIndex>
│ │ │ │ -
270 decltype(auto) operator[](const MultiIndex& index)
│ │ │ │ -
271 {
│ │ │ │ -
272 return resolveDynamicMultiIndex(*vector_, index);
│ │ │ │ -
273 }
│ │ │ │ -
274
│ │ │ │ -
283 template<typename T>
│ │ │ │ -
284 void operator= (const T& other)
│ │ │ │ -
285 {
│ │ │ │ -
286 recursiveAssign(vector(), other);
│ │ │ │ -
287 }
│ │ │ │ -
288
│ │ │ │ -
289 template<typename T>
│ │ │ │ -
290 void operator= (const ISTLVectorBackend<T>& other)
│ │ │ │ -
291 {
│ │ │ │ -
292 vector() = other.vector();
│ │ │ │ -
293 }
│ │ │ │ -
294
│ │ │ │ -
295 const Vector& vector() const
│ │ │ │ -
296 {
│ │ │ │ -
297 return *vector_;
│ │ │ │ -
298 }
│ │ │ │ -
299
│ │ │ │ -
300 Vector& vector()
│ │ │ │ -
301 {
│ │ │ │ -
302 return *vector_;
│ │ │ │ -
303 }
│ │ │ │ -
304
│ │ │ │ -
305private:
│ │ │ │ -
306
│ │ │ │ -
307 Vector* vector_;
│ │ │ │ -
308};
│ │ │ │ -
309
│ │ │ │ -
310} // end namespace Impl
│ │ │ │ -
311
│ │ │ │ -
312
│ │ │ │ -
313
│ │ │ │ -
345template<class Vector>
│ │ │ │ -
346auto istlVectorBackend(Vector& v)
│ │ │ │ -
347{
│ │ │ │ -
348 static_assert(hasUniqueFieldType<Vector&>(), "Vector type passed to istlVectorBackend() does not have a unique field type.");
│ │ │ │ -
349 return Impl::ISTLVectorBackend<Vector>(v);
│ │ │ │ -
350}
│ │ │ │ -
351
│ │ │ │ -
352
│ │ │ │ -
353
│ │ │ │ -
383template<class Vector>
│ │ │ │ -
384auto istlVectorBackend(const Vector& v)
│ │ │ │ -
385{
│ │ │ │ -
386 static_assert(hasUniqueFieldType<const Vector&>(), "Vector type passed to istlVectorBackend() does not have a unique field type.");
│ │ │ │ -
387 return Impl::ISTLVectorBackend<const Vector>(v);
│ │ │ │ -
388}
│ │ │ │ -
389
│ │ │ │ -
390
│ │ │ │ -
391
│ │ │ │ -
392} // namespace Functions
│ │ │ │ -
393} // namespace Dune
│ │ │ │ -
394
│ │ │ │ -
395
│ │ │ │ -
396#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_ISTLVECTORBACKEND_HH
│ │ │ │ - │ │ │ │ -
auto istlVectorBackend(Vector &v)
Return a vector backend wrapping non-const ISTL like containers.
Definition: istlvectorbackend.hh:346
│ │ │ │ -
constexpr decltype(auto) resolveDynamicMultiIndex(C &&c, const MultiIndex &multiIndex, const IsFinal &isFinal)
Provide multi-index access by chaining operator[].
Definition: indexaccess.hh:354
│ │ │ │ +
126
│ │ │ │ +
127} // namespace Functions
│ │ │ │ +
128} // namespace Dune
│ │ │ │ +
129
│ │ │ │ +
130#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BOUNDARYDOFS_HH
│ │ │ │ + │ │ │ │ +
auto subEntityDOFs(const T &)
Create SubEntityDOFs object.
Definition: subentitydofs.hh:160
│ │ │ │ +
void forEachBoundaryDOF(const Basis &basis, F &&f)
Loop over all DOFs on the boundary.
Definition: boundarydofs.hh:36
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
constexpr auto fieldTypes()
Generate list of field types in container.
Definition: istlvectorbackend.hh:63
│ │ │ │ -
constexpr bool hasUniqueFieldType()
Check if container has a unique field type.
Definition: istlvectorbackend.hh:74
│ │ │ │ - │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -utf-8 │ │ │ │ │ +us-ascii │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,365 +4,105 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * backends │ │ │ │ │ -istlvectorbackend.hh │ │ │ │ │ + * functionspacebases │ │ │ │ │ +boundarydofs.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_ISTLVECTORBACKEND_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_ISTLVECTORBACKEND_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BOUNDARYDOFS_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BOUNDARYDOFS_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ - 8#include │ │ │ │ │ + 6#include │ │ │ │ │ + 7 │ │ │ │ │ + 8#include │ │ │ │ │ 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ + 10namespace Dune { │ │ │ │ │ + 11namespace Functions { │ │ │ │ │ + 12 │ │ │ │ │ + 13 │ │ │ │ │ 14 │ │ │ │ │ - 15#include │ │ │ │ │ - 16#include │ │ │ │ │ - 17 │ │ │ │ │ - 18 │ │ │ │ │ - 19namespace Dune { │ │ │ │ │ - 20namespace Functions { │ │ │ │ │ - 21 │ │ │ │ │ - 22namespace Impl { │ │ │ │ │ - 23 │ │ │ │ │ - 24template() │ │ │ │ │ -, int> = 0> │ │ │ │ │ - 26auto fieldTypes(V&& /*v*/) │ │ │ │ │ - 27{ │ │ │ │ │ - 28 return TypeList{}; │ │ │ │ │ - 29} │ │ │ │ │ - 30 │ │ │ │ │ - 31template(), │ │ │ │ │ -int> = 0> │ │ │ │ │ - 33auto fieldTypes(V&& v) │ │ │ │ │ - 34{ │ │ │ │ │ - 35 if constexpr (Dune::models, V>()) │ │ │ │ │ - 36 return fieldTypes(v[std::size_t{0}]); │ │ │ │ │ - 37 else │ │ │ │ │ - 38 { │ │ │ │ │ - 39 auto indexRange = typename decltype(range(Hybrid::size(v))):: │ │ │ │ │ -integer_sequence(); │ │ │ │ │ - 40 return unpackIntegerSequence([&](auto... i) { │ │ │ │ │ - 41 return uniqueTypeList(std::tuple_cat(fieldTypes(v[i])...)); │ │ │ │ │ - 42 }, indexRange); │ │ │ │ │ - 43 } │ │ │ │ │ - 44} │ │ │ │ │ - 45 │ │ │ │ │ - 46} // namespace Impl │ │ │ │ │ - 47 │ │ │ │ │ - 48 │ │ │ │ │ - 49 │ │ │ │ │ - 62template │ │ │ │ │ -63constexpr auto fieldTypes() │ │ │ │ │ - 64{ │ │ │ │ │ - 65 return decltype(Impl::fieldTypes(std::declval())){}; │ │ │ │ │ - 66} │ │ │ │ │ - 67 │ │ │ │ │ - 73template │ │ │ │ │ -74constexpr bool hasUniqueFieldType() │ │ │ │ │ - 75{ │ │ │ │ │ - 76 return std::tuple_size())>>::value==1; │ │ │ │ │ - 77} │ │ │ │ │ - 78 │ │ │ │ │ - 79 │ │ │ │ │ - 80 │ │ │ │ │ - 81namespace Impl { │ │ │ │ │ - 82 │ │ │ │ │ - 83/* │ │ │ │ │ - 84 * \brief A wrapper providing multi-index access to vector entries │ │ │ │ │ - 85 * │ │ │ │ │ - 86 * The wrapped vector type should be an istl like random │ │ │ │ │ - 87 * access container providing operator[] and size() methods. │ │ │ │ │ - 88 * For classical containers this should support indices │ │ │ │ │ - 89 * of type std::size_t. For multi-type containers indices │ │ │ │ │ - 90 * of the form Dune::index_constant should be supported │ │ │ │ │ - 91 * while size() should be a static constexpr method. │ │ │ │ │ - 92 * │ │ │ │ │ - 93 * When resolving multi-indices the backend appends indices │ │ │ │ │ - 94 * using operator[] as long as the result is not a scalar. │ │ │ │ │ - 95 * If this exhausts the digits of the multi-index, additional │ │ │ │ │ - 96 * zero`s are appended. │ │ │ │ │ - 97 * │ │ │ │ │ - 98 * \tparam V Type of the raw wrapper vector │ │ │ │ │ - 99 */ │ │ │ │ │ - 100template │ │ │ │ │ - 101class ISTLVectorBackend │ │ │ │ │ - 102{ │ │ │ │ │ - 103 │ │ │ │ │ - 104 // Template aliases for using detection idiom. │ │ │ │ │ - 105 template │ │ │ │ │ - 106 using dynamicIndexAccess_t = decltype(std::declval()[0]); │ │ │ │ │ - 107 │ │ │ │ │ - 108 template │ │ │ │ │ - 109 using staticIndexAccess_t = decltype(std::declval()[Dune::Indices:: │ │ │ │ │ -_0]); │ │ │ │ │ - 110 │ │ │ │ │ - 111 template │ │ │ │ │ - 112 using resizeMethod_t = decltype(std::declval().resize(0)); │ │ │ │ │ - 113 │ │ │ │ │ - 114 │ │ │ │ │ - 115 │ │ │ │ │ - 116 // Short cuts for feature detection │ │ │ │ │ - 117 template │ │ │ │ │ - 118 using hasDynamicIndexAccess = Dune::Std::is_detected>; │ │ │ │ │ - 119 │ │ │ │ │ - 120 template │ │ │ │ │ - 121 using hasStaticIndexAccess = Dune::Std::is_detected>; │ │ │ │ │ - 122 │ │ │ │ │ - 123 template │ │ │ │ │ - 124 using hasResizeMethod = Dune::Std::is_detected>; │ │ │ │ │ + 34template>()(0, std::declval(),std::declval()), 0) = 0> │ │ │ │ │ +36void forEachBoundaryDOF(const Basis& basis, F&& f) │ │ │ │ │ + 37{ │ │ │ │ │ + 38 auto localView = basis.localView(); │ │ │ │ │ + 39 auto seDOFs = subEntityDOFs(basis); │ │ │ │ │ + 40 const auto& gridView = basis.gridView(); │ │ │ │ │ + 41 for(auto&& element : elements(gridView)) │ │ │ │ │ + 42 if (element.hasBoundaryIntersections()) │ │ │ │ │ + 43 { │ │ │ │ │ + 44 localView.bind(element); │ │ │ │ │ + 45 for(const auto& intersection: intersections(gridView, element)) │ │ │ │ │ + 46 if (intersection.boundary()) │ │ │ │ │ + 47 for(auto localIndex: seDOFs.bind(localView,intersection)) │ │ │ │ │ + 48 f(localIndex, localView, intersection); │ │ │ │ │ + 49 } │ │ │ │ │ + 50} │ │ │ │ │ + 51 │ │ │ │ │ + 52 │ │ │ │ │ + 53 │ │ │ │ │ + 71template>()(0, std::declval()),0) = 0> │ │ │ │ │ + 73void forEachBoundaryDOF(const Basis& basis, F&& f) │ │ │ │ │ + 74{ │ │ │ │ │ + 75 auto localView = basis.localView(); │ │ │ │ │ + 76 auto seDOFs = subEntityDOFs(basis); │ │ │ │ │ + 77 const auto& gridView = basis.gridView(); │ │ │ │ │ + 78 for(auto&& element : elements(gridView)) │ │ │ │ │ + 79 if (element.hasBoundaryIntersections()) │ │ │ │ │ + 80 { │ │ │ │ │ + 81 localView.bind(element); │ │ │ │ │ + 82 for(const auto& intersection: intersections(gridView, element)) │ │ │ │ │ + 83 if (intersection.boundary()) │ │ │ │ │ + 84 for(auto localIndex: seDOFs.bind(localView,intersection)) │ │ │ │ │ + 85 f(localIndex, localView); │ │ │ │ │ + 86 } │ │ │ │ │ + 87} │ │ │ │ │ + 88 │ │ │ │ │ + 89 │ │ │ │ │ + 90 │ │ │ │ │ + 107template>()(std::declval()),0) = 0> │ │ │ │ │ + 109void forEachBoundaryDOF(const Basis& basis, F&& f) │ │ │ │ │ + 110{ │ │ │ │ │ + 111 auto localView = basis.localView(); │ │ │ │ │ + 112 auto seDOFs = subEntityDOFs(basis); │ │ │ │ │ + 113 const auto& gridView = basis.gridView(); │ │ │ │ │ + 114 for(auto&& element : elements(gridView)) │ │ │ │ │ + 115 if (element.hasBoundaryIntersections()) │ │ │ │ │ + 116 { │ │ │ │ │ + 117 localView.bind(element); │ │ │ │ │ + 118 for(const auto& intersection: intersections(gridView, element)) │ │ │ │ │ + 119 if (intersection.boundary()) │ │ │ │ │ + 120 for(auto localIndex: seDOFs.bind(localView,intersection)) │ │ │ │ │ + 121 f(localView.index(localIndex)); │ │ │ │ │ + 122 } │ │ │ │ │ + 123} │ │ │ │ │ + 124 │ │ │ │ │ 125 │ │ │ │ │ - 126 template │ │ │ │ │ - 127 using isDynamicVector = Dune::Std::is_detected>; │ │ │ │ │ - 128 │ │ │ │ │ - 129 template │ │ │ │ │ - 130 using isStaticVector = Dune::Std::bool_constant< │ │ │ │ │ - 131 Dune::Std::is_detected_v> │ │ │ │ │ - 132 and not Dune::Std::is_detected_v>>; │ │ │ │ │ - 133 │ │ │ │ │ - 134 template │ │ │ │ │ - 135 using isScalar = Dune::Std::bool_constant>>; │ │ │ │ │ - 136 │ │ │ │ │ - 137 template │ │ │ │ │ - 138 using isVector = Dune::Std::bool_constant>>; │ │ │ │ │ - 139 │ │ │ │ │ - 140 │ │ │ │ │ - 141 │ │ │ │ │ - 142 template │ │ │ │ │ - 143 static void forwardToResize(Args&&... args) │ │ │ │ │ - 144 { │ │ │ │ │ - 145 resize(std::forward(args)...); │ │ │ │ │ - 146 } │ │ │ │ │ - 147 │ │ │ │ │ - 148 │ │ │ │ │ - 149 template::value, int> = 0> │ │ │ │ │ - 151 static void resize(C&& c, const SizeProvider& sizeProvider, typename │ │ │ │ │ -SizeProvider::SizePrefix prefix) │ │ │ │ │ - 152 { │ │ │ │ │ - 153 auto size = sizeProvider.size(prefix); │ │ │ │ │ - 154 if (size==0) │ │ │ │ │ - 155 { │ │ │ │ │ - 156 // If size==0 this prefix refers to a single coefficient c. │ │ │ │ │ - 157 // But being in this overload means that c is not a scalar │ │ │ │ │ - 158 // because is has a resize() method. Since operator[] deliberately │ │ │ │ │ - 159 // supports implicit padding of multi-indices by as many │ │ │ │ │ - 160 // [0]'s as needed to resolve a scalar entry, we should also │ │ │ │ │ - 161 // except a non-scalar c here. However, this requires that │ │ │ │ │ - 162 // we silently believe that whatever size c already has is │ │ │ │ │ - 163 // intended by the user. The only exception is c.size()==0 │ │ │ │ │ - 164 // which is not acceptable but we also cannot know the desired size. │ │ │ │ │ - 165 if (c.size()==0) │ │ │ │ │ - 166 DUNE_THROW(RangeError, "The vector entry v[" << prefix << "] should refer │ │ │ │ │ -to a " │ │ │ │ │ - 167 << "scalar coefficient, but is a dynamically sized vector of size==0"); │ │ │ │ │ - 168 else │ │ │ │ │ - 169 // Accept non-zero sized coefficients to avoid that resize(basis) │ │ │ │ │ - 170 // fails for a vector that works with operator[] and already │ │ │ │ │ - 171 // has the appropriate size. │ │ │ │ │ - 172 return; │ │ │ │ │ - 173 } │ │ │ │ │ - 174 c.resize(size); │ │ │ │ │ - 175 prefix.push_back(0); │ │ │ │ │ - 176 for(std::size_t i=0; i::value, int> = 0, │ │ │ │ │ - 185 std::enable_if_t::value, int> = 0> │ │ │ │ │ - 186 static void resize(C&& c, const SizeProvider& sizeProvider, typename │ │ │ │ │ -SizeProvider::SizePrefix prefix) │ │ │ │ │ - 187 { │ │ │ │ │ - 188 auto size = sizeProvider.size(prefix); │ │ │ │ │ - 189 // If size == 0 there's nothing to do: │ │ │ │ │ - 190 // We can't resize c and it's already │ │ │ │ │ - 191 // large enough anyway. │ │ │ │ │ - 192 if (size == 0) │ │ │ │ │ - 193 return; │ │ │ │ │ - 194 │ │ │ │ │ - 195 // If size>0 but c does not have the appropriate │ │ │ │ │ - 196 // size we throw an exception. │ │ │ │ │ - 197 // │ │ │ │ │ - 198 // We could perhaps also allow c.size()>size. │ │ │ │ │ - 199 // But then looping the loop below gets complicated: │ │ │ │ │ - 200 // We're not allowed to loop until c.size(). But │ │ │ │ │ - 201 // we also cannot use size for termination, │ │ │ │ │ - 202 // because this fails if c is a static vector. │ │ │ │ │ - 203 if (c.size() != size) │ │ │ │ │ - 204 DUNE_THROW(RangeError, "Can't resize non-resizable entry v[" << prefix << │ │ │ │ │ -"] of size " << c.size() << " to size(" << prefix << ")=" << size); │ │ │ │ │ - 205 │ │ │ │ │ - 206 // Recursively resize all entries of c now. │ │ │ │ │ - 207 using namespace Dune::Hybrid; │ │ │ │ │ - 208 prefix.push_back(0); │ │ │ │ │ - 209 forEach(integralRange(Hybrid::size(c)), [&](auto&& i) { │ │ │ │ │ - 210 prefix.back() = i; │ │ │ │ │ - 211 // Here we'd simply like to call resize(c[i], sizeProvider, prefix); │ │ │ │ │ - 212 // but even gcc-7 does not except this bus reports │ │ │ │ │ - 213 // "error: ‘this’ was not captured for this lambda function" │ │ │ │ │ - 214 // although there's no 'this' because we're in a static method. │ │ │ │ │ - 215 // Bypassing this by and additional method that does perfect │ │ │ │ │ - 216 // forwarding allows to workaround this. │ │ │ │ │ - 217 ISTLVectorBackend::forwardToResize(c[i], sizeProvider, prefix); │ │ │ │ │ - 218 }); │ │ │ │ │ - 219 } │ │ │ │ │ - 220 │ │ │ │ │ - 221 template::value, int> = 0, │ │ │ │ │ - 223 std::enable_if_t::value, int> = 0> │ │ │ │ │ - 224 static void resize(C&&, const SizeProvider& sizeProvider, typename │ │ │ │ │ -SizeProvider::SizePrefix prefix) │ │ │ │ │ - 225 { │ │ │ │ │ - 226 auto size = sizeProvider.size(prefix); │ │ │ │ │ - 227 if (size != 0) │ │ │ │ │ - 228 DUNE_THROW(RangeError, "Can't resize scalar vector entry v[" << prefix << │ │ │ │ │ -"] to size(" << prefix << ")=" << size); │ │ │ │ │ - 229 } │ │ │ │ │ - 230 │ │ │ │ │ - 231 template::value, int> = 0> │ │ │ │ │ - 233 void recursiveAssign(C& c, const T& t) │ │ │ │ │ - 234 { │ │ │ │ │ - 235 c = t; │ │ │ │ │ - 236 } │ │ │ │ │ - 237 │ │ │ │ │ - 238 template::value, int> = 0> │ │ │ │ │ - 240 void recursiveAssign(C& c, const T& t) │ │ │ │ │ - 241 { │ │ │ │ │ - 242 Dune::Hybrid::forEach(c, [&](auto&& ci) { │ │ │ │ │ - 243 recursiveAssign(ci, t); │ │ │ │ │ - 244 }); │ │ │ │ │ - 245 } │ │ │ │ │ - 246 │ │ │ │ │ - 247public: │ │ │ │ │ - 248 │ │ │ │ │ - 249 using Vector = V; │ │ │ │ │ - 250 │ │ │ │ │ - 251 ISTLVectorBackend(Vector& vector) : │ │ │ │ │ - 252 vector_(&vector) │ │ │ │ │ - 253 {} │ │ │ │ │ - 254 │ │ │ │ │ - 255 template │ │ │ │ │ - 256 void resize(const SizeProvider& sizeProvider) │ │ │ │ │ - 257 { │ │ │ │ │ - 258 auto prefix = typename SizeProvider::SizePrefix(); │ │ │ │ │ - 259 prefix.resize(0); │ │ │ │ │ - 260 resize(*vector_, sizeProvider, prefix); │ │ │ │ │ - 261 } │ │ │ │ │ - 262 │ │ │ │ │ - 263 template │ │ │ │ │ - 264 decltype(auto) operator[](const MultiIndex& index) const │ │ │ │ │ - 265 { │ │ │ │ │ - 266 return resolveDynamicMultiIndex(*vector_, index); │ │ │ │ │ - 267 } │ │ │ │ │ - 268 │ │ │ │ │ - 269 template │ │ │ │ │ - 270 decltype(auto) operator[](const MultiIndex& index) │ │ │ │ │ - 271 { │ │ │ │ │ - 272 return resolveDynamicMultiIndex(*vector_, index); │ │ │ │ │ - 273 } │ │ │ │ │ - 274 │ │ │ │ │ - 283 template │ │ │ │ │ - 284 void operator= (const T& other) │ │ │ │ │ - 285 { │ │ │ │ │ - 286 recursiveAssign(vector(), other); │ │ │ │ │ - 287 } │ │ │ │ │ - 288 │ │ │ │ │ - 289 template │ │ │ │ │ - 290 void operator= (const ISTLVectorBackend& other) │ │ │ │ │ - 291 { │ │ │ │ │ - 292 vector() = other.vector(); │ │ │ │ │ - 293 } │ │ │ │ │ - 294 │ │ │ │ │ - 295 const Vector& vector() const │ │ │ │ │ - 296 { │ │ │ │ │ - 297 return *vector_; │ │ │ │ │ - 298 } │ │ │ │ │ - 299 │ │ │ │ │ - 300 Vector& vector() │ │ │ │ │ - 301 { │ │ │ │ │ - 302 return *vector_; │ │ │ │ │ - 303 } │ │ │ │ │ - 304 │ │ │ │ │ - 305private: │ │ │ │ │ - 306 │ │ │ │ │ - 307 Vector* vector_; │ │ │ │ │ - 308}; │ │ │ │ │ - 309 │ │ │ │ │ - 310} // end namespace Impl │ │ │ │ │ - 311 │ │ │ │ │ - 312 │ │ │ │ │ - 313 │ │ │ │ │ - 345template │ │ │ │ │ -346auto istlVectorBackend(Vector& v) │ │ │ │ │ - 347{ │ │ │ │ │ - 348 static_assert(hasUniqueFieldType(), "Vector type passed to │ │ │ │ │ -istlVectorBackend() does not have a unique field type."); │ │ │ │ │ - 349 return Impl::ISTLVectorBackend(v); │ │ │ │ │ - 350} │ │ │ │ │ - 351 │ │ │ │ │ - 352 │ │ │ │ │ - 353 │ │ │ │ │ - 383template │ │ │ │ │ -384auto istlVectorBackend(const Vector& v) │ │ │ │ │ - 385{ │ │ │ │ │ - 386 static_assert(hasUniqueFieldType(), "Vector type passed to │ │ │ │ │ -istlVectorBackend() does not have a unique field type."); │ │ │ │ │ - 387 return Impl::ISTLVectorBackend(v); │ │ │ │ │ - 388} │ │ │ │ │ - 389 │ │ │ │ │ - 390 │ │ │ │ │ - 391 │ │ │ │ │ - 392} // namespace Functions │ │ │ │ │ - 393} // namespace Dune │ │ │ │ │ - 394 │ │ │ │ │ - 395 │ │ │ │ │ - 396#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_ISTLVECTORBACKEND_HH │ │ │ │ │ -indexaccess.hh │ │ │ │ │ -Dune::Functions::istlVectorBackend │ │ │ │ │ -auto istlVectorBackend(Vector &v) │ │ │ │ │ -Return a vector backend wrapping non-const ISTL like containers. │ │ │ │ │ -Definition: istlvectorbackend.hh:346 │ │ │ │ │ -Dune::Functions::resolveDynamicMultiIndex │ │ │ │ │ -constexpr decltype(auto) resolveDynamicMultiIndex(C &&c, const MultiIndex │ │ │ │ │ -&multiIndex, const IsFinal &isFinal) │ │ │ │ │ -Provide multi-index access by chaining operator[]. │ │ │ │ │ -Definition: indexaccess.hh:354 │ │ │ │ │ + 126 │ │ │ │ │ + 127} // namespace Functions │ │ │ │ │ + 128} // namespace Dune │ │ │ │ │ + 129 │ │ │ │ │ + 130#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BOUNDARYDOFS_HH │ │ │ │ │ +subentitydofs.hh │ │ │ │ │ +Dune::Functions::subEntityDOFs │ │ │ │ │ +auto subEntityDOFs(const T &) │ │ │ │ │ +Create SubEntityDOFs object. │ │ │ │ │ +Definition: subentitydofs.hh:160 │ │ │ │ │ +Dune::Functions::forEachBoundaryDOF │ │ │ │ │ +void forEachBoundaryDOF(const Basis &basis, F &&f) │ │ │ │ │ +Loop over all DOFs on the boundary. │ │ │ │ │ +Definition: boundarydofs.hh:36 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::fieldTypes │ │ │ │ │ -constexpr auto fieldTypes() │ │ │ │ │ -Generate list of field types in container. │ │ │ │ │ -Definition: istlvectorbackend.hh:63 │ │ │ │ │ -Dune::Functions::hasUniqueFieldType │ │ │ │ │ -constexpr bool hasUniqueFieldType() │ │ │ │ │ -Check if container has a unique field type. │ │ │ │ │ -Definition: istlvectorbackend.hh:74 │ │ │ │ │ -concepts.hh │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00080.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: gridviewentityset.hh File Reference │ │ │ │ +dune-functions: interpolate.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,40 +58,62 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces
│ │ │ │ -
gridviewentityset.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
interpolate.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │
#include <memory>
│ │ │ │ +#include <vector>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/common/bitsetvector.hh>
│ │ │ │ +#include <dune/typetree/childextraction.hh>
│ │ │ │ +#include <dune/functions/gridfunctions/gridviewfunction.hh>
│ │ │ │ +#include <dune/functions/common/functionconcepts.hh>
│ │ │ │ +#include <dune/functions/backends/concepts.hh>
│ │ │ │ +#include <dune/functions/backends/istlvectorbackend.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/sizeinfo.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/flatvectorview.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/hierarchicnodetorangemap.hh>
│ │ │ │ +#include <dune/typetree/traversal.hh>
│ │ │ │ +#include <dune/typetree/visitor.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::Functions::GridViewEntitySet< GV, cd >
 An entity set for all entities of given codim in a grid view. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<class B , class C , class F , class BV , class NTRE >
void Dune::Functions::interpolate (const B &basis, C &&coeff, const F &f, const BV &bv, const NTRE &nodeToRangeEntry)
 Interpolate given function in discrete function space. More...
 
template<class B , class C , class F , class BV >
void Dune::Functions::interpolate (const B &basis, C &&coeff, const F &f, const BV &bitVector)
 Interpolate given function in discrete function space. More...
 
template<class B , class C , class F >
void Dune::Functions::interpolate (const B &basis, C &&coeff, const F &f)
 Interpolate given function in discrete function space. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,24 +4,48 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * gridfunctions │ │ │ │ │ -Classes | Namespaces │ │ │ │ │ -gridviewentityset.hh File Reference │ │ │ │ │ + * functionspacebases │ │ │ │ │ +Namespaces | Functions │ │ │ │ │ +interpolate.hh File Reference │ │ │ │ │ #include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ - Classes │ │ │ │ │ -class  Dune::Functions::GridViewEntitySet<_GV,_cd_> │ │ │ │ │ -  An entity set for all entities of given codim in a grid view. More... │ │ │ │ │ -  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +void Dune::Functions::interpolate (const B &basis, C &&coeff, const F &f, │ │ │ │ │ + const BV &bv, const NTRE &nodeToRangeEntry) │ │ │ │ │ +  Interpolate given function in discrete function space. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void Dune::Functions::interpolate (const B &basis, C &&coeff, const F &f, │ │ │ │ │ + const BV &bitVector) │ │ │ │ │ +  Interpolate given function in discrete function space. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void Dune::Functions::interpolate (const B &basis, C &&coeff, const F &f) │ │ │ │ │ +  Interpolate given function in discrete function space. More... │ │ │ │ │ +  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00080_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: gridviewentityset.hh Source File │ │ │ │ +dune-functions: interpolate.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,109 +58,290 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
gridviewentityset.hh
│ │ │ │ +
interpolate.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#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWENTITYSET_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWENTITYSET_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_INTERPOLATE_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_INTERPOLATE_HH
│ │ │ │
5
│ │ │ │
6#include <memory>
│ │ │ │ -
7
│ │ │ │ +
7#include <vector>
│ │ │ │
8
│ │ │ │ -
9namespace Dune {
│ │ │ │ -
10
│ │ │ │ -
11namespace Functions {
│ │ │ │ -
12
│ │ │ │ +
9#include <dune/common/exceptions.hh>
│ │ │ │ +
10#include <dune/common/bitsetvector.hh>
│ │ │ │ +
11
│ │ │ │ +
12#include <dune/typetree/childextraction.hh>
│ │ │ │
13
│ │ │ │ -
21template<class GV, int cd>
│ │ │ │ - │ │ │ │ -
23{
│ │ │ │ -
24public:
│ │ │ │ + │ │ │ │ + │ │ │ │ +
16
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
22
│ │ │ │ +
23#include <dune/typetree/traversal.hh>
│ │ │ │ +
24#include <dune/typetree/visitor.hh>
│ │ │ │
25
│ │ │ │ -
26 typedef GV GridView;
│ │ │ │ -
27 enum {
│ │ │ │ -
28 codim = cd
│ │ │ │ -
29 };
│ │ │ │ +
26namespace Dune {
│ │ │ │ +
27namespace Functions {
│ │ │ │ +
28
│ │ │ │ +
29namespace Imp {
│ │ │ │
30
│ │ │ │ -
32 typedef typename GridView::template Codim<codim>::Entity Element;
│ │ │ │ -
33
│ │ │ │ -
35 typedef typename Element::Geometry::LocalCoordinate LocalCoordinate;
│ │ │ │ -
36 typedef typename Element::Geometry::GlobalCoordinate GlobalCoordinate;
│ │ │ │ +
31struct AllTrueBitSetVector
│ │ │ │ +
32{
│ │ │ │ +
33 struct AllTrueBitSet
│ │ │ │ +
34 {
│ │ │ │ +
35 bool test(int) const { return true; }
│ │ │ │ +
36 } allTrue_;
│ │ │ │
37
│ │ │ │ - │ │ │ │ -
39
│ │ │ │ -
41 typedef typename GridView::template Codim<codim>::Iterator const_iterator;
│ │ │ │ +
38 operator bool() const
│ │ │ │ +
39 {
│ │ │ │ +
40 return true;
│ │ │ │ +
41 }
│ │ │ │
42
│ │ │ │ - │ │ │ │ -
45
│ │ │ │ - │ │ │ │ -
48 gv_(gv)
│ │ │ │ -
49 {}
│ │ │ │ -
50
│ │ │ │ -
52 bool contains(const Element& e) const
│ │ │ │ -
53 {
│ │ │ │ -
54 return gv_.contains(e);
│ │ │ │ -
55 }
│ │ │ │ +
43 template<class I>
│ │ │ │ +
44 const AllTrueBitSetVector& operator[](const I&) const
│ │ │ │ +
45 {
│ │ │ │ +
46 return *this;
│ │ │ │ +
47 }
│ │ │ │ +
48
│ │ │ │ +
49 template<class SP>
│ │ │ │ +
50 void resize(const SP&) const
│ │ │ │ +
51 {}
│ │ │ │ +
52
│ │ │ │ +
53};
│ │ │ │ +
54
│ │ │ │ +
55
│ │ │ │
56
│ │ │ │ -
58 size_t size() const
│ │ │ │ -
59 {
│ │ │ │ -
60 return gv_.size(codim);
│ │ │ │ -
61 }
│ │ │ │ +
57template <class B, class T, class NTRE, class HV, class LF, class HBV>
│ │ │ │ +
58class LocalInterpolateVisitor
│ │ │ │ +
59 : public TypeTree::TreeVisitor
│ │ │ │ +
60 , public TypeTree::DynamicTraversal
│ │ │ │ +
61{
│ │ │ │
62
│ │ │ │ - │ │ │ │ -
65 {
│ │ │ │ -
66 return gv_.template begin<codim>();
│ │ │ │ -
67 }
│ │ │ │ +
63public:
│ │ │ │ +
64
│ │ │ │ +
65 using Basis = B;
│ │ │ │ +
66 using LocalView = typename B::LocalView;
│ │ │ │ +
67 using MultiIndex = typename LocalView::MultiIndex;
│ │ │ │
68
│ │ │ │ - │ │ │ │ -
71 {
│ │ │ │ -
72 return gv_.template end<codim>();
│ │ │ │ -
73 }
│ │ │ │ -
74
│ │ │ │ -
76 const GridView& gridView() const
│ │ │ │ -
77 {
│ │ │ │ -
78 return gv_;
│ │ │ │ -
79 }
│ │ │ │ +
69 using LocalFunction = LF;
│ │ │ │ +
70
│ │ │ │ +
71 using Tree = T;
│ │ │ │ +
72
│ │ │ │ +
73 using VectorBackend = HV;
│ │ │ │ +
74 using BitVectorBackend = HBV;
│ │ │ │ +
75
│ │ │ │ +
76 using NodeToRangeEntry = NTRE;
│ │ │ │ +
77
│ │ │ │ +
78 using GridView = typename Basis::GridView;
│ │ │ │ +
79 using Element = typename GridView::template Codim<0>::Entity;
│ │ │ │
80
│ │ │ │ -
81private:
│ │ │ │ -
82 GridView gv_;
│ │ │ │ -
83};
│ │ │ │ +
81 using LocalDomain = typename Element::Geometry::LocalCoordinate;
│ │ │ │ +
82
│ │ │ │ +
83 using GlobalDomain = typename Element::Geometry::GlobalCoordinate;
│ │ │ │
84
│ │ │ │ -
85
│ │ │ │ -
86} // end of namespace Dune::Functions
│ │ │ │ -
87} // end of namespace Dune
│ │ │ │ -
88
│ │ │ │ -
89#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWENTITYSET_HH
│ │ │ │ +
85 LocalInterpolateVisitor(const B& /*basis*/, HV& coeff, const HBV& bitVector, const LF& localF, const LocalView& localView, const NodeToRangeEntry& nodeToRangeEntry) :
│ │ │ │ +
86 vector_(coeff),
│ │ │ │ +
87 localF_(localF),
│ │ │ │ +
88 bitVector_(bitVector),
│ │ │ │ +
89 localView_(localView),
│ │ │ │ +
90 nodeToRangeEntry_(nodeToRangeEntry)
│ │ │ │ +
91 {
│ │ │ │ +
92 static_assert(Dune::Functions::Concept::isCallable<LocalFunction, LocalDomain>(), "Function passed to LocalInterpolateVisitor does not model the Callable<LocalCoordinate> concept");
│ │ │ │ +
93 }
│ │ │ │ +
94
│ │ │ │ +
95 template<typename Node, typename TreePath>
│ │ │ │ +
96 void pre(Node&, TreePath)
│ │ │ │ +
97 {}
│ │ │ │ +
98
│ │ │ │ +
99 template<typename Node, typename TreePath>
│ │ │ │ +
100 void post(Node&, TreePath)
│ │ │ │ +
101 {}
│ │ │ │ +
102
│ │ │ │ +
103 template<typename Node, typename TreePath>
│ │ │ │ +
104 void leaf(Node& node, TreePath treePath)
│ │ │ │ +
105 {
│ │ │ │ +
106 using FiniteElement = typename Node::FiniteElement;
│ │ │ │ +
107 using FiniteElementRange = typename FiniteElement::Traits::LocalBasisType::Traits::RangeType;
│ │ │ │ +
108 using FiniteElementRangeField = typename FiniteElement::Traits::LocalBasisType::Traits::RangeFieldType;
│ │ │ │ +
109
│ │ │ │ +
110 auto interpolationCoefficients = std::vector<FiniteElementRangeField>();
│ │ │ │ +
111 auto&& fe = node.finiteElement();
│ │ │ │ +
112
│ │ │ │ +
113 // backward compatibility: for scalar basis functions and possibly vector valued coefficients
│ │ │ │ +
114 // (like used in dune-fufem for power bases) loop over the components
│ │ │ │ +
115 // of the coefficients
│ │ │ │ +
116 if constexpr ( FiniteElement::Traits::LocalBasisType::Traits::dimRange == 1 )
│ │ │ │ +
117 {
│ │ │ │ +
118 // Note that we capture j by reference. Hence we can switch
│ │ │ │ +
119 // the selected component later on by modifying j. Maybe we
│ │ │ │ +
120 // should avoid this naughty statefull lambda hack in favor
│ │ │ │ +
121 // of a separate helper class.
│ │ │ │ +
122 std::size_t j=0;
│ │ │ │ +
123 auto localFj = [&](const LocalDomain& x){
│ │ │ │ +
124 const auto& y = localF_(x);
│ │ │ │ +
125 return FiniteElementRange(flatVectorView(nodeToRangeEntry_(node, treePath, y))[j]);
│ │ │ │ +
126 };
│ │ │ │ +
127
│ │ │ │ +
128 // We loop over j defined above and thus over the components of the
│ │ │ │ +
129 // range type of localF_.
│ │ │ │ +
130
│ │ │ │ +
131 auto blockSize = flatVectorView(vector_[localView_.index(0)]).size();
│ │ │ │ +
132
│ │ │ │ +
133 for(j=0; j<blockSize; ++j)
│ │ │ │ +
134 {
│ │ │ │ +
135 fe.localInterpolation().interpolate(localFj, interpolationCoefficients);
│ │ │ │ +
136 for (size_t i=0; i<fe.localBasis().size(); ++i)
│ │ │ │ +
137 {
│ │ │ │ +
138 auto multiIndex = localView_.index(node.localIndex(i));
│ │ │ │ +
139 auto bitVectorBlock = flatVectorView(bitVector_[multiIndex]);
│ │ │ │ +
140 if (bitVectorBlock[j])
│ │ │ │ +
141 {
│ │ │ │ +
142 auto vectorBlock = flatVectorView(vector_[multiIndex]);
│ │ │ │ +
143 vectorBlock[j] = interpolationCoefficients[i];
│ │ │ │ +
144 }
│ │ │ │ +
145 }
│ │ │ │ +
146 }
│ │ │ │ +
147 }
│ │ │ │ +
148 else // ( FiniteElement::Traits::LocalBasisType::Traits::dimRange != 1 )
│ │ │ │ +
149 {
│ │ │ │ +
150 // for all other finite elements: use the FiniteElementRange directly for the interpolation
│ │ │ │ +
151 auto localF = [&](const LocalDomain& x){
│ │ │ │ +
152 const auto& y = localF_(x);
│ │ │ │ +
153 return FiniteElementRange(nodeToRangeEntry_(node, treePath, y));
│ │ │ │ +
154 };
│ │ │ │ +
155
│ │ │ │ +
156 fe.localInterpolation().interpolate(localF, interpolationCoefficients);
│ │ │ │ +
157 for (size_t i=0; i<fe.localBasis().size(); ++i)
│ │ │ │ +
158 {
│ │ │ │ +
159 auto multiIndex = localView_.index(node.localIndex(i));
│ │ │ │ +
160 if ( bitVector_[multiIndex] )
│ │ │ │ +
161 {
│ │ │ │ +
162 vector_[multiIndex] = interpolationCoefficients[i];
│ │ │ │ +
163 }
│ │ │ │ +
164 }
│ │ │ │ +
165 }
│ │ │ │ +
166 }
│ │ │ │ +
167
│ │ │ │ +
168
│ │ │ │ +
169protected:
│ │ │ │ +
170
│ │ │ │ +
171 VectorBackend& vector_;
│ │ │ │ +
172 const LocalFunction& localF_;
│ │ │ │ +
173 const BitVectorBackend& bitVector_;
│ │ │ │ +
174 const LocalView& localView_;
│ │ │ │ +
175 const NodeToRangeEntry& nodeToRangeEntry_;
│ │ │ │ +
176};
│ │ │ │ +
177
│ │ │ │ +
178
│ │ │ │ +
179} // namespace Imp
│ │ │ │ +
180
│ │ │ │ +
181
│ │ │ │ +
182
│ │ │ │ +
183
│ │ │ │ +
201template <class B, class C, class F, class BV, class NTRE>
│ │ │ │ +
202void interpolate(const B& basis, C&& coeff, const F& f, const BV& bv, const NTRE& nodeToRangeEntry)
│ │ │ │ +
203{
│ │ │ │ +
204 using GridView = typename B::GridView;
│ │ │ │ +
205 using Element = typename GridView::template Codim<0>::Entity;
│ │ │ │ +
206
│ │ │ │ +
207 using Tree = typename B::LocalView::Tree;
│ │ │ │ +
208
│ │ │ │ +
209 using GlobalDomain = typename Element::Geometry::GlobalCoordinate;
│ │ │ │ +
210
│ │ │ │ +
211 static_assert(Dune::Functions::Concept::isCallable<F, GlobalDomain>(), "Function passed to interpolate does not model the Callable<GlobalCoordinate> concept");
│ │ │ │ +
212
│ │ │ │ +
213 auto&& gridView = basis.gridView();
│ │ │ │ +
214
│ │ │ │ +
215 // Small helper functions to wrap vectors using istlVectorBackend
│ │ │ │ +
216 // if they do not already satisfy the VectorBackend interface.
│ │ │ │ +
217 auto toVectorBackend = [&](auto& v) -> decltype(auto) {
│ │ │ │ +
218 if constexpr (models<Concept::VectorBackend<B>, decltype(v)>()) {
│ │ │ │ +
219 return v;
│ │ │ │ +
220 } else {
│ │ │ │ +
221 return istlVectorBackend(v);
│ │ │ │ +
222 }
│ │ │ │ +
223 };
│ │ │ │ +
224
│ │ │ │ +
225 auto toConstVectorBackend = [&](auto& v) -> decltype(auto) {
│ │ │ │ +
226 if constexpr (models<Concept::ConstVectorBackend<B>, decltype(v)>()) {
│ │ │ │ +
227 return v;
│ │ │ │ +
228 } else {
│ │ │ │ +
229 return istlVectorBackend(v);
│ │ │ │ +
230 }
│ │ │ │ +
231 };
│ │ │ │ +
232
│ │ │ │ +
233 auto&& bitVector = toConstVectorBackend(bv);
│ │ │ │ +
234 auto&& vector = toVectorBackend(coeff);
│ │ │ │ +
235 vector.resize(sizeInfo(basis));
│ │ │ │ +
236
│ │ │ │ +
237
│ │ │ │ +
238
│ │ │ │ +
239 // Make a grid function supporting local evaluation out of f
│ │ │ │ +
240 auto gf = makeGridViewFunction(f, gridView);
│ │ │ │ +
241
│ │ │ │ +
242 // Obtain a local view of f
│ │ │ │ +
243 auto localF = localFunction(gf);
│ │ │ │ +
244
│ │ │ │ +
245 auto localView = basis.localView();
│ │ │ │ +
246
│ │ │ │ +
247 for (const auto& e : elements(gridView))
│ │ │ │ +
248 {
│ │ │ │ +
249 localView.bind(e);
│ │ │ │ +
250 localF.bind(e);
│ │ │ │ +
251
│ │ │ │ +
252 Imp::LocalInterpolateVisitor<B, Tree, NTRE, decltype(vector), decltype(localF), decltype(bitVector)> localInterpolateVisitor(basis, vector, bitVector, localF, localView, nodeToRangeEntry);
│ │ │ │ +
253 TypeTree::applyToTree(localView.tree(),localInterpolateVisitor);
│ │ │ │ +
254 }
│ │ │ │ +
255}
│ │ │ │ +
256
│ │ │ │ +
273template <class B, class C, class F, class BV>
│ │ │ │ +
274void interpolate(const B& basis, C&& coeff, const F& f, const BV& bitVector)
│ │ │ │ +
275{
│ │ │ │ +
276 interpolate(basis, coeff, f, bitVector, HierarchicNodeToRangeMap());
│ │ │ │ +
277}
│ │ │ │ +
278
│ │ │ │ +
293template <class B, class C, class F>
│ │ │ │ +
294void interpolate(const B& basis, C&& coeff, const F& f)
│ │ │ │ +
295{
│ │ │ │ +
296 interpolate (basis, coeff, f, Imp::AllTrueBitSetVector(), HierarchicNodeToRangeMap());
│ │ │ │ +
297}
│ │ │ │ +
298
│ │ │ │ +
299} // namespace Functions
│ │ │ │ +
300} // namespace Dune
│ │ │ │ +
301
│ │ │ │ +
302#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_INTERPOLATE_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
auto istlVectorBackend(Vector &v)
Return a vector backend wrapping non-const ISTL like containers.
Definition: istlvectorbackend.hh:346
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
An entity set for all entities of given codim in a grid view.
Definition: gridviewentityset.hh:23
│ │ │ │ -
GridViewEntitySet(const GridView &gv)
Construct GridViewEntitySet for a GridView.
Definition: gridviewentityset.hh:47
│ │ │ │ -
GV GridView
Definition: gridviewentityset.hh:26
│ │ │ │ -
GridView::template Codim< codim >::Entity Element
Type of Elements contained in this EntitySet.
Definition: gridviewentityset.hh:32
│ │ │ │ -
const_iterator end() const
Create an end iterator.
Definition: gridviewentityset.hh:70
│ │ │ │ -
const GridView & gridView() const
Return the associated GridView.
Definition: gridviewentityset.hh:76
│ │ │ │ -
Element value_type
Definition: gridviewentityset.hh:38
│ │ │ │ -
const_iterator begin() const
Create a begin iterator.
Definition: gridviewentityset.hh:64
│ │ │ │ -
GridView::template Codim< codim >::Iterator const_iterator
A forward iterator.
Definition: gridviewentityset.hh:41
│ │ │ │ -
Element::Geometry::LocalCoordinate LocalCoordinate
Type of local coordinates with respect to the Element.
Definition: gridviewentityset.hh:35
│ │ │ │ -
size_t size() const
Return number of Elements visited by an iterator.
Definition: gridviewentityset.hh:58
│ │ │ │ -
Element::Geometry::GlobalCoordinate GlobalCoordinate
Definition: gridviewentityset.hh:36
│ │ │ │ -
@ codim
Definition: gridviewentityset.hh:28
│ │ │ │ -
bool contains(const Element &e) const
Return true if e is contained in the EntitySet.
Definition: gridviewentityset.hh:52
│ │ │ │ -
const_iterator iterator
Same as const_iterator.
Definition: gridviewentityset.hh:44
│ │ │ │ +
void interpolate(const B &basis, C &&coeff, const F &f, const BV &bv, const NTRE &nodeToRangeEntry)
Interpolate given function in discrete function space.
Definition: interpolate.hh:202
│ │ │ │ +
std::decay< F >::type makeGridViewFunction(F &&f, const GridView &gridView)
Construct a function modeling GridViewFunction from function and grid view.
Definition: gridviewfunction.hh:68
│ │ │ │ +
SizeInfo< Basis > sizeInfo(const Basis &basis)
Definition: sizeinfo.hh:69
│ │ │ │ +
auto flatVectorView(T &t)
Create flat vector view of passed mutable container.
Definition: flatvectorview.hh:179
│ │ │ │ +
A simple node to range map using the nested tree indices.
Definition: hierarchicnodetorangemap.hh:30
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,142 +4,316 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * gridfunctions │ │ │ │ │ -gridviewentityset.hh │ │ │ │ │ + * functionspacebases │ │ │ │ │ +interpolate.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#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWENTITYSET_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWENTITYSET_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_INTERPOLATE_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_INTERPOLATE_HH │ │ │ │ │ 5 │ │ │ │ │ 6#include │ │ │ │ │ - 7 │ │ │ │ │ + 7#include │ │ │ │ │ 8 │ │ │ │ │ - 9namespace Dune { │ │ │ │ │ - 10 │ │ │ │ │ - 11namespace Functions { │ │ │ │ │ - 12 │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11 │ │ │ │ │ + 12#include │ │ │ │ │ 13 │ │ │ │ │ - 21template │ │ │ │ │ -22class GridViewEntitySet │ │ │ │ │ - 23{ │ │ │ │ │ - 24public: │ │ │ │ │ + 14#include │ │ │ │ │ + 15#include │ │ │ │ │ + 16 │ │ │ │ │ + 17#include │ │ │ │ │ + 18#include │ │ │ │ │ + 19#include │ │ │ │ │ + 20#include │ │ │ │ │ + 21#include │ │ │ │ │ + 22 │ │ │ │ │ + 23#include │ │ │ │ │ + 24#include │ │ │ │ │ 25 │ │ │ │ │ -26 typedef GV GridView; │ │ │ │ │ - 27 enum { │ │ │ │ │ - 28 codim = cd │ │ │ │ │ -29 }; │ │ │ │ │ + 26namespace Dune { │ │ │ │ │ + 27namespace Functions { │ │ │ │ │ + 28 │ │ │ │ │ + 29namespace Imp { │ │ │ │ │ 30 │ │ │ │ │ -32 typedef typename GridView::template Codim::Entity Element; │ │ │ │ │ - 33 │ │ │ │ │ -35 typedef typename Element::Geometry::LocalCoordinate LocalCoordinate; │ │ │ │ │ -36 typedef typename Element::Geometry::GlobalCoordinate GlobalCoordinate; │ │ │ │ │ + 31struct AllTrueBitSetVector │ │ │ │ │ + 32{ │ │ │ │ │ + 33 struct AllTrueBitSet │ │ │ │ │ + 34 { │ │ │ │ │ + 35 bool test(int) const { return true; } │ │ │ │ │ + 36 } allTrue_; │ │ │ │ │ 37 │ │ │ │ │ -38 typedef Element value_type; │ │ │ │ │ - 39 │ │ │ │ │ -41 typedef typename GridView::template Codim::Iterator const_iterator; │ │ │ │ │ + 38 operator bool() const │ │ │ │ │ + 39 { │ │ │ │ │ + 40 return true; │ │ │ │ │ + 41 } │ │ │ │ │ 42 │ │ │ │ │ -44 typedef const_iterator iterator; │ │ │ │ │ - 45 │ │ │ │ │ -47 GridViewEntitySet(const GridView& gv) : │ │ │ │ │ - 48 gv_(gv) │ │ │ │ │ - 49 {} │ │ │ │ │ - 50 │ │ │ │ │ -52 bool contains(const Element& e) const │ │ │ │ │ - 53 { │ │ │ │ │ - 54 return gv_.contains(e); │ │ │ │ │ - 55 } │ │ │ │ │ + 43 template │ │ │ │ │ + 44 const AllTrueBitSetVector& operator[](const I&) const │ │ │ │ │ + 45 { │ │ │ │ │ + 46 return *this; │ │ │ │ │ + 47 } │ │ │ │ │ + 48 │ │ │ │ │ + 49 template │ │ │ │ │ + 50 void resize(const SP&) const │ │ │ │ │ + 51 {} │ │ │ │ │ + 52 │ │ │ │ │ + 53}; │ │ │ │ │ + 54 │ │ │ │ │ + 55 │ │ │ │ │ 56 │ │ │ │ │ -58 size_t size() const │ │ │ │ │ - 59 { │ │ │ │ │ - 60 return gv_.size(codim); │ │ │ │ │ - 61 } │ │ │ │ │ + 57template │ │ │ │ │ + 58class LocalInterpolateVisitor │ │ │ │ │ + 59 : public TypeTree::TreeVisitor │ │ │ │ │ + 60 , public TypeTree::DynamicTraversal │ │ │ │ │ + 61{ │ │ │ │ │ 62 │ │ │ │ │ -64 const_iterator begin() const │ │ │ │ │ - 65 { │ │ │ │ │ - 66 return gv_.template begin(); │ │ │ │ │ - 67 } │ │ │ │ │ + 63public: │ │ │ │ │ + 64 │ │ │ │ │ + 65 using Basis = B; │ │ │ │ │ + 66 using LocalView = typename B::LocalView; │ │ │ │ │ + 67 using MultiIndex = typename LocalView::MultiIndex; │ │ │ │ │ 68 │ │ │ │ │ -70 const_iterator end() const │ │ │ │ │ - 71 { │ │ │ │ │ - 72 return gv_.template end(); │ │ │ │ │ - 73 } │ │ │ │ │ - 74 │ │ │ │ │ -76 const GridView& gridView() const │ │ │ │ │ - 77 { │ │ │ │ │ - 78 return gv_; │ │ │ │ │ - 79 } │ │ │ │ │ + 69 using LocalFunction = LF; │ │ │ │ │ + 70 │ │ │ │ │ + 71 using Tree = T; │ │ │ │ │ + 72 │ │ │ │ │ + 73 using VectorBackend = HV; │ │ │ │ │ + 74 using BitVectorBackend = HBV; │ │ │ │ │ + 75 │ │ │ │ │ + 76 using NodeToRangeEntry = NTRE; │ │ │ │ │ + 77 │ │ │ │ │ + 78 using GridView = typename Basis::GridView; │ │ │ │ │ + 79 using Element = typename GridView::template Codim<0>::Entity; │ │ │ │ │ 80 │ │ │ │ │ - 81private: │ │ │ │ │ - 82 GridView gv_; │ │ │ │ │ - 83}; │ │ │ │ │ + 81 using LocalDomain = typename Element::Geometry::LocalCoordinate; │ │ │ │ │ + 82 │ │ │ │ │ + 83 using GlobalDomain = typename Element::Geometry::GlobalCoordinate; │ │ │ │ │ 84 │ │ │ │ │ - 85 │ │ │ │ │ - 86} // end of namespace Dune::Functions │ │ │ │ │ - 87} // end of namespace Dune │ │ │ │ │ - 88 │ │ │ │ │ - 89#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWENTITYSET_HH │ │ │ │ │ + 85 LocalInterpolateVisitor(const B& /*basis*/, HV& coeff, const HBV& │ │ │ │ │ +bitVector, const LF& localF, const LocalView& localView, const │ │ │ │ │ +NodeToRangeEntry& nodeToRangeEntry) : │ │ │ │ │ + 86 vector_(coeff), │ │ │ │ │ + 87 localF_(localF), │ │ │ │ │ + 88 bitVector_(bitVector), │ │ │ │ │ + 89 localView_(localView), │ │ │ │ │ + 90 nodeToRangeEntry_(nodeToRangeEntry) │ │ │ │ │ + 91 { │ │ │ │ │ + 92 static_assert(Dune::Functions::Concept::isCallable(), "Function passed to LocalInterpolateVisitor does not model the │ │ │ │ │ +Callable concept"); │ │ │ │ │ + 93 } │ │ │ │ │ + 94 │ │ │ │ │ + 95 template │ │ │ │ │ + 96 void pre(Node&, TreePath) │ │ │ │ │ + 97 {} │ │ │ │ │ + 98 │ │ │ │ │ + 99 template │ │ │ │ │ + 100 void post(Node&, TreePath) │ │ │ │ │ + 101 {} │ │ │ │ │ + 102 │ │ │ │ │ + 103 template │ │ │ │ │ + 104 void leaf(Node& node, TreePath treePath) │ │ │ │ │ + 105 { │ │ │ │ │ + 106 using FiniteElement = typename Node::FiniteElement; │ │ │ │ │ + 107 using FiniteElementRange = typename FiniteElement::Traits:: │ │ │ │ │ +LocalBasisType::Traits::RangeType; │ │ │ │ │ + 108 using FiniteElementRangeField = typename FiniteElement::Traits:: │ │ │ │ │ +LocalBasisType::Traits::RangeFieldType; │ │ │ │ │ + 109 │ │ │ │ │ + 110 auto interpolationCoefficients = std::vector(); │ │ │ │ │ + 111 auto&& fe = node.finiteElement(); │ │ │ │ │ + 112 │ │ │ │ │ + 113 // backward compatibility: for scalar basis functions and possibly vector │ │ │ │ │ +valued coefficients │ │ │ │ │ + 114 // (like used in dune-fufem for power bases) loop over the components │ │ │ │ │ + 115 // of the coefficients │ │ │ │ │ + 116 if constexpr ( FiniteElement::Traits::LocalBasisType::Traits::dimRange == │ │ │ │ │ +1 ) │ │ │ │ │ + 117 { │ │ │ │ │ + 118 // Note that we capture j by reference. Hence we can switch │ │ │ │ │ + 119 // the selected component later on by modifying j. Maybe we │ │ │ │ │ + 120 // should avoid this naughty statefull lambda hack in favor │ │ │ │ │ + 121 // of a separate helper class. │ │ │ │ │ + 122 std::size_t j=0; │ │ │ │ │ + 123 auto localFj = [&](const LocalDomain& x){ │ │ │ │ │ + 124 const auto& y = localF_(x); │ │ │ │ │ + 125 return FiniteElementRange(flatVectorView(nodeToRangeEntry_(node, treePath, │ │ │ │ │ +y))[j]); │ │ │ │ │ + 126 }; │ │ │ │ │ + 127 │ │ │ │ │ + 128 // We loop over j defined above and thus over the components of the │ │ │ │ │ + 129 // range type of localF_. │ │ │ │ │ + 130 │ │ │ │ │ + 131 auto blockSize = flatVectorView(vector_[localView_.index(0)]).size(); │ │ │ │ │ + 132 │ │ │ │ │ + 133 for(j=0; j │ │ │ │ │ +202void interpolate(const B& basis, C&& coeff, const F& f, const BV& bv, const │ │ │ │ │ +NTRE& nodeToRangeEntry) │ │ │ │ │ + 203{ │ │ │ │ │ + 204 using GridView = typename B::GridView; │ │ │ │ │ + 205 using Element = typename GridView::template Codim<0>::Entity; │ │ │ │ │ + 206 │ │ │ │ │ + 207 using Tree = typename B::LocalView::Tree; │ │ │ │ │ + 208 │ │ │ │ │ + 209 using GlobalDomain = typename Element::Geometry::GlobalCoordinate; │ │ │ │ │ + 210 │ │ │ │ │ + 211 static_assert(Dune::Functions::Concept::isCallable(), │ │ │ │ │ +"Function passed to interpolate does not model the Callable │ │ │ │ │ +concept"); │ │ │ │ │ + 212 │ │ │ │ │ + 213 auto&& gridView = basis.gridView(); │ │ │ │ │ + 214 │ │ │ │ │ + 215 // Small helper functions to wrap vectors using istlVectorBackend │ │ │ │ │ + 216 // if they do not already satisfy the VectorBackend interface. │ │ │ │ │ + 217 auto toVectorBackend = [&](auto& v) -> decltype(auto) { │ │ │ │ │ + 218 if constexpr (models, decltype(v)>()) { │ │ │ │ │ + 219 return v; │ │ │ │ │ + 220 } else { │ │ │ │ │ + 221 return istlVectorBackend(v); │ │ │ │ │ + 222 } │ │ │ │ │ + 223 }; │ │ │ │ │ + 224 │ │ │ │ │ + 225 auto toConstVectorBackend = [&](auto& v) -> decltype(auto) { │ │ │ │ │ + 226 if constexpr (models, decltype(v)>()) { │ │ │ │ │ + 227 return v; │ │ │ │ │ + 228 } else { │ │ │ │ │ + 229 return istlVectorBackend(v); │ │ │ │ │ + 230 } │ │ │ │ │ + 231 }; │ │ │ │ │ + 232 │ │ │ │ │ + 233 auto&& bitVector = toConstVectorBackend(bv); │ │ │ │ │ + 234 auto&& vector = toVectorBackend(coeff); │ │ │ │ │ + 235 vector.resize(sizeInfo(basis)); │ │ │ │ │ + 236 │ │ │ │ │ + 237 │ │ │ │ │ + 238 │ │ │ │ │ + 239 // Make a grid function supporting local evaluation out of f │ │ │ │ │ + 240 auto gf = makeGridViewFunction(f, gridView); │ │ │ │ │ + 241 │ │ │ │ │ + 242 // Obtain a local view of f │ │ │ │ │ + 243 auto localF = localFunction(gf); │ │ │ │ │ + 244 │ │ │ │ │ + 245 auto localView = basis.localView(); │ │ │ │ │ + 246 │ │ │ │ │ + 247 for (const auto& e : elements(gridView)) │ │ │ │ │ + 248 { │ │ │ │ │ + 249 localView.bind(e); │ │ │ │ │ + 250 localF.bind(e); │ │ │ │ │ + 251 │ │ │ │ │ + 252 Imp::LocalInterpolateVisitor localInterpolateVisitor(basis, vector, │ │ │ │ │ +bitVector, localF, localView, nodeToRangeEntry); │ │ │ │ │ + 253 TypeTree::applyToTree(localView.tree(),localInterpolateVisitor); │ │ │ │ │ + 254 } │ │ │ │ │ + 255} │ │ │ │ │ + 256 │ │ │ │ │ + 273template │ │ │ │ │ +274void interpolate(const B& basis, C&& coeff, const F& f, const BV& bitVector) │ │ │ │ │ + 275{ │ │ │ │ │ + 276 interpolate(basis, coeff, f, bitVector, HierarchicNodeToRangeMap()); │ │ │ │ │ + 277} │ │ │ │ │ + 278 │ │ │ │ │ + 293template │ │ │ │ │ +294void interpolate(const B& basis, C&& coeff, const F& f) │ │ │ │ │ + 295{ │ │ │ │ │ + 296 interpolate (basis, coeff, f, Imp::AllTrueBitSetVector(), │ │ │ │ │ +HierarchicNodeToRangeMap()); │ │ │ │ │ + 297} │ │ │ │ │ + 298 │ │ │ │ │ + 299} // namespace Functions │ │ │ │ │ + 300} // namespace Dune │ │ │ │ │ + 301 │ │ │ │ │ + 302#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_INTERPOLATE_HH │ │ │ │ │ +functionconcepts.hh │ │ │ │ │ +flatvectorview.hh │ │ │ │ │ +sizeinfo.hh │ │ │ │ │ +hierarchicnodetorangemap.hh │ │ │ │ │ +istlvectorbackend.hh │ │ │ │ │ +gridviewfunction.hh │ │ │ │ │ +Dune::Functions::istlVectorBackend │ │ │ │ │ +auto istlVectorBackend(Vector &v) │ │ │ │ │ +Return a vector backend wrapping non-const ISTL like containers. │ │ │ │ │ +Definition: istlvectorbackend.hh:346 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::GridViewEntitySet │ │ │ │ │ -An entity set for all entities of given codim in a grid view. │ │ │ │ │ -Definition: gridviewentityset.hh:23 │ │ │ │ │ -Dune::Functions::GridViewEntitySet::GridViewEntitySet │ │ │ │ │ -GridViewEntitySet(const GridView &gv) │ │ │ │ │ -Construct GridViewEntitySet for a GridView. │ │ │ │ │ -Definition: gridviewentityset.hh:47 │ │ │ │ │ -Dune::Functions::GridViewEntitySet::GridView │ │ │ │ │ -GV GridView │ │ │ │ │ -Definition: gridviewentityset.hh:26 │ │ │ │ │ -Dune::Functions::GridViewEntitySet::Element │ │ │ │ │ -GridView::template Codim< codim >::Entity Element │ │ │ │ │ -Type of Elements contained in this EntitySet. │ │ │ │ │ -Definition: gridviewentityset.hh:32 │ │ │ │ │ -Dune::Functions::GridViewEntitySet::end │ │ │ │ │ -const_iterator end() const │ │ │ │ │ -Create an end iterator. │ │ │ │ │ -Definition: gridviewentityset.hh:70 │ │ │ │ │ -Dune::Functions::GridViewEntitySet::gridView │ │ │ │ │ -const GridView & gridView() const │ │ │ │ │ -Return the associated GridView. │ │ │ │ │ -Definition: gridviewentityset.hh:76 │ │ │ │ │ -Dune::Functions::GridViewEntitySet::value_type │ │ │ │ │ -Element value_type │ │ │ │ │ -Definition: gridviewentityset.hh:38 │ │ │ │ │ -Dune::Functions::GridViewEntitySet::begin │ │ │ │ │ -const_iterator begin() const │ │ │ │ │ -Create a begin iterator. │ │ │ │ │ -Definition: gridviewentityset.hh:64 │ │ │ │ │ -Dune::Functions::GridViewEntitySet::const_iterator │ │ │ │ │ -GridView::template Codim< codim >::Iterator const_iterator │ │ │ │ │ -A forward iterator. │ │ │ │ │ -Definition: gridviewentityset.hh:41 │ │ │ │ │ -Dune::Functions::GridViewEntitySet::LocalCoordinate │ │ │ │ │ -Element::Geometry::LocalCoordinate LocalCoordinate │ │ │ │ │ -Type of local coordinates with respect to the Element. │ │ │ │ │ -Definition: gridviewentityset.hh:35 │ │ │ │ │ -Dune::Functions::GridViewEntitySet::size │ │ │ │ │ -size_t size() const │ │ │ │ │ -Return number of Elements visited by an iterator. │ │ │ │ │ -Definition: gridviewentityset.hh:58 │ │ │ │ │ -Dune::Functions::GridViewEntitySet::GlobalCoordinate │ │ │ │ │ -Element::Geometry::GlobalCoordinate GlobalCoordinate │ │ │ │ │ -Definition: gridviewentityset.hh:36 │ │ │ │ │ -Dune::Functions::GridViewEntitySet::codim │ │ │ │ │ -@ codim │ │ │ │ │ -Definition: gridviewentityset.hh:28 │ │ │ │ │ -Dune::Functions::GridViewEntitySet::contains │ │ │ │ │ -bool contains(const Element &e) const │ │ │ │ │ -Return true if e is contained in the EntitySet. │ │ │ │ │ -Definition: gridviewentityset.hh:52 │ │ │ │ │ -Dune::Functions::GridViewEntitySet::iterator │ │ │ │ │ -const_iterator iterator │ │ │ │ │ -Same as const_iterator. │ │ │ │ │ -Definition: gridviewentityset.hh:44 │ │ │ │ │ +Dune::Functions::interpolate │ │ │ │ │ +void interpolate(const B &basis, C &&coeff, const F &f, const BV &bv, const │ │ │ │ │ +NTRE &nodeToRangeEntry) │ │ │ │ │ +Interpolate given function in discrete function space. │ │ │ │ │ +Definition: interpolate.hh:202 │ │ │ │ │ +Dune::Functions::makeGridViewFunction │ │ │ │ │ +std::decay< F >::type makeGridViewFunction(F &&f, const GridView &gridView) │ │ │ │ │ +Construct a function modeling GridViewFunction from function and grid view. │ │ │ │ │ +Definition: gridviewfunction.hh:68 │ │ │ │ │ +Dune::Functions::sizeInfo │ │ │ │ │ +SizeInfo< Basis > sizeInfo(const Basis &basis) │ │ │ │ │ +Definition: sizeinfo.hh:69 │ │ │ │ │ +Dune::Functions::flatVectorView │ │ │ │ │ +auto flatVectorView(T &t) │ │ │ │ │ +Create flat vector view of passed mutable container. │ │ │ │ │ +Definition: flatvectorview.hh:179 │ │ │ │ │ +Dune::Functions::HierarchicNodeToRangeMap │ │ │ │ │ +A simple node to range map using the nested tree indices. │ │ │ │ │ +Definition: hierarchicnodetorangemap.hh:30 │ │ │ │ │ +concepts.hh │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00083.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: gridfunction_imp.hh File Reference │ │ │ │ +dune-functions: bsplinebasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,36 +58,86 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Namespaces
│ │ │ │ -
gridfunction_imp.hh File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces | │ │ │ │ +Typedefs | │ │ │ │ +Functions
│ │ │ │ +
bsplinebasis.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <dune/functions/common/type_traits.hh>
│ │ │ │ -#include <dune/functions/common/interfaces.hh>
│ │ │ │ -#include <dune/functions/common/differentiablefunction_imp.hh>
│ │ │ │ + │ │ │ │ +

The B-spline global function space basis. │ │ │ │ +More...

│ │ │ │ +
#include <array>
│ │ │ │ +#include <numeric>
│ │ │ │ +#include <dune/common/dynmatrix.hh>
│ │ │ │ +#include <dune/localfunctions/common/localbasis.hh>
│ │ │ │ +#include <dune/common/diagonalmatrix.hh>
│ │ │ │ +#include <dune/localfunctions/common/localkey.hh>
│ │ │ │ +#include <dune/localfunctions/common/localfiniteelementtraits.hh>
│ │ │ │ +#include <dune/geometry/type.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ +Classes

class  Dune::Functions::BSplineLocalBasis< GV, R >
 LocalBasis class in the sense of dune-localfunctions, presenting the restriction of a B-spline patch to a knot span. More...
 
class  Dune::Functions::BSplineLocalCoefficients< dim >
 Attaches a shape function to an entity. More...
 
class  Dune::Functions::BSplineLocalInterpolation< dim, LB >
 Local interpolation in the sense of dune-localfunctions, for the B-spline basis on tensor-product grids. More...
 
class  Dune::Functions::BSplineLocalFiniteElement< GV, R >
 LocalFiniteElement in the sense of dune-localfunctions, for the B-spline basis on tensor-product grids. More...
 
class  Dune::Functions::BSplinePreBasis< GV >
 Pre-basis for B-spline basis. More...
 
class  Dune::Functions::BSplineNode< GV >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
namespace  Dune::Functions::BasisFactory
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Typedefs

template<typename GV >
using Dune::Functions::BSplineBasis = DefaultGlobalBasis< BSplinePreBasis< GV > >
 A global B-spline basis. More...
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

auto Dune::Functions::BasisFactory::bSpline (const std::vector< double > &knotVector, unsigned int order, bool makeOpen=true)
 Create a pre-basis factory that can create a B-spline pre-basis. More...
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

The B-spline global function space basis.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,22 +4,66 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * gridfunctions │ │ │ │ │ -Namespaces │ │ │ │ │ -gridfunction_imp.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * functionspacebases │ │ │ │ │ +Classes | Namespaces | Typedefs | Functions │ │ │ │ │ +bsplinebasis.hh File Reference │ │ │ │ │ +The B-spline global function space basis. More... │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ + Classes │ │ │ │ │ +class  Dune::Functions::BSplineLocalBasis<_GV,_R_> │ │ │ │ │ +  LocalBasis class in the sense of dune-localfunctions, presenting the │ │ │ │ │ + restriction of a B-spline patch to a knot span. More... │ │ │ │ │ +  │ │ │ │ │ +class  Dune::Functions::BSplineLocalCoefficients<_dim_> │ │ │ │ │ +  Attaches a shape function to an entity. More... │ │ │ │ │ +  │ │ │ │ │ +class  Dune::Functions::BSplineLocalInterpolation<_dim,_LB_> │ │ │ │ │ +  Local interpolation in the sense of dune-localfunctions, for the B- │ │ │ │ │ + spline basis on tensor-product grids. More... │ │ │ │ │ +  │ │ │ │ │ +class  Dune::Functions::BSplineLocalFiniteElement<_GV,_R_> │ │ │ │ │ +  LocalFiniteElement in the sense of dune-localfunctions, for the B- │ │ │ │ │ + spline basis on tensor-product grids. More... │ │ │ │ │ +  │ │ │ │ │ +class  Dune::Functions::BSplinePreBasis<_GV_> │ │ │ │ │ +  Pre-basis for B-spline basis. More... │ │ │ │ │ +  │ │ │ │ │ +class  Dune::Functions::BSplineNode<_GV_> │ │ │ │ │ +  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ +namespace  Dune::Functions::BasisFactory │ │ │ │ │ +  │ │ │ │ │ + Typedefs │ │ │ │ │ +template │ │ │ │ │ +using Dune::Functions::BSplineBasis = DefaultGlobalBasis< BSplinePreBasis< GV │ │ │ │ │ + > > │ │ │ │ │ +  A global B-spline basis. More... │ │ │ │ │ +  │ │ │ │ │ + Functions │ │ │ │ │ +auto Dune::Functions::BasisFactory::bSpline (const std::vector< double > │ │ │ │ │ + &knotVector, unsigned int order, bool makeOpen=true) │ │ │ │ │ +  Create a pre-basis factory that can create a B-spline pre-basis. More... │ │ │ │ │ +  │ │ │ │ │ +***** Detailed Description ***** │ │ │ │ │ +The B-spline global function space basis. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00083_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: gridfunction_imp.hh Source File │ │ │ │ +dune-functions: bsplinebasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,92 +58,1213 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
gridfunction_imp.hh
│ │ │ │ +
bsplinebasis.hh
│ │ │ │
│ │ │ │
│ │ │ │ -Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │ +Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
3#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_IMP_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_IMP_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BSPLINEBASIS_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BSPLINEBASIS_HH
│ │ │ │
5
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
9
│ │ │ │ -
10
│ │ │ │ -
11
│ │ │ │ -
12namespace Dune {
│ │ │ │ -
13namespace Functions {
│ │ │ │ -
14namespace Imp {
│ │ │ │ +
10#include <array>
│ │ │ │ +
11#include <numeric>
│ │ │ │ +
12
│ │ │ │ +
14#include <dune/common/dynmatrix.hh>
│ │ │ │
15
│ │ │ │ -
19struct HasFreeLocalFunction
│ │ │ │ -
20{
│ │ │ │ -
21 template<class F>
│ │ │ │ -
22 auto require(F&& f) -> decltype(
│ │ │ │ -
23 localFunction(f)
│ │ │ │ -
24 );
│ │ │ │ -
25};
│ │ │ │ -
26
│ │ │ │ +
16#include <dune/localfunctions/common/localbasis.hh>
│ │ │ │ +
17#include <dune/common/diagonalmatrix.hh>
│ │ │ │ +
18#include <dune/localfunctions/common/localkey.hh>
│ │ │ │ +
19#include <dune/localfunctions/common/localfiniteelementtraits.hh>
│ │ │ │ +
20#include <dune/geometry/type.hh>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
23
│ │ │ │ +
24namespace Dune
│ │ │ │ +
25{
│ │ │ │ +
26namespace Functions {
│ │ │ │
27
│ │ │ │ -
28
│ │ │ │ -
29// Interface of type erasure wrapper
│ │ │ │ -
30//
│ │ │ │ -
31// Notice that the basic interface of polymorphic classes (destructor, clone, ...)
│ │ │ │ -
32// will be added by the type erasure foundation classes.
│ │ │ │ -
33template<class Signature, class DerivativeInterface, class LocalFunctionInterface, class EntitySet>
│ │ │ │ -
34class GridFunctionWrapperInterface :
│ │ │ │ -
35 public DifferentiableFunctionWrapperInterface<Signature, DerivativeInterface>
│ │ │ │ -
36{
│ │ │ │ -
37public:
│ │ │ │ -
38 virtual LocalFunctionInterface wrappedLocalFunction() const = 0;
│ │ │ │ -
39
│ │ │ │ -
40 virtual const EntitySet& wrappedEntitySet() const = 0;
│ │ │ │ -
41};
│ │ │ │ -
42
│ │ │ │ -
43
│ │ │ │ -
44// Implementation of type erasure wrapper
│ │ │ │ -
45template<class Signature, class DerivativeInterface, class LocalFunctionInterface, class EntitySet, class B>
│ │ │ │ -
46class GridFunctionWrapperImplementation :
│ │ │ │ -
47 public DifferentiableFunctionWrapperImplementation<Signature, DerivativeInterface, B>
│ │ │ │ -
48{
│ │ │ │ -
49 using Base = DifferentiableFunctionWrapperImplementation<Signature, DerivativeInterface, B>;
│ │ │ │ -
50public:
│ │ │ │ -
51 using Base::Base;
│ │ │ │ +
28// A maze of dependencies between the different parts of this. We need a few forward declarations
│ │ │ │ +
29template<typename GV, typename R>
│ │ │ │ + │ │ │ │ +
31
│ │ │ │ +
32template<typename GV>
│ │ │ │ +
33class BSplinePreBasis;
│ │ │ │ +
34
│ │ │ │ +
35
│ │ │ │ +
44template<class GV, class R>
│ │ │ │ + │ │ │ │ +
46{
│ │ │ │ +
47 friend class BSplineLocalFiniteElement<GV,R>;
│ │ │ │ +
48
│ │ │ │ +
49 typedef typename GV::ctype D;
│ │ │ │ +
50 enum {dim = GV::dimension};
│ │ │ │ +
51public:
│ │ │ │
52
│ │ │ │ -
53 virtual LocalFunctionInterface wrappedLocalFunction() const
│ │ │ │ -
54 {
│ │ │ │ -
55 return localFunction(this->get());
│ │ │ │ -
56 }
│ │ │ │ -
57
│ │ │ │ -
58 virtual const EntitySet& wrappedEntitySet() const
│ │ │ │ -
59 {
│ │ │ │ -
60 return this->get().entitySet();
│ │ │ │ -
61 }
│ │ │ │ -
62};
│ │ │ │ -
63
│ │ │ │ -
64
│ │ │ │ -
65
│ │ │ │ -
66}}} // namespace Dune::Functions::Imp
│ │ │ │ -
67
│ │ │ │ -
68
│ │ │ │ -
69
│ │ │ │ -
70#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_IMP_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +
54 typedef LocalBasisTraits<D,dim,FieldVector<D,dim>,R,1,FieldVector<R,1>,
│ │ │ │ +
55 FieldMatrix<R,1,dim> > Traits;
│ │ │ │ +
56
│ │ │ │ + │ │ │ │ + │ │ │ │ +
63 : preBasis_(preBasis),
│ │ │ │ +
64 lFE_(lFE)
│ │ │ │ +
65 {}
│ │ │ │ +
66
│ │ │ │ +
70 void evaluateFunction (const FieldVector<D,dim>& in,
│ │ │ │ +
71 std::vector<FieldVector<R,1> >& out) const
│ │ │ │ +
72 {
│ │ │ │ +
73 FieldVector<D,dim> globalIn = offset_;
│ │ │ │ +
74 scaling_.umv(in,globalIn);
│ │ │ │ +
75
│ │ │ │ +
76 preBasis_.evaluateFunction(globalIn, out, lFE_.currentKnotSpan_);
│ │ │ │ +
77 }
│ │ │ │ +
78
│ │ │ │ +
82 void evaluateJacobian (const FieldVector<D,dim>& in,
│ │ │ │ +
83 std::vector<FieldMatrix<D,1,dim> >& out) const
│ │ │ │ +
84 {
│ │ │ │ +
85 FieldVector<D,dim> globalIn = offset_;
│ │ │ │ +
86 scaling_.umv(in,globalIn);
│ │ │ │ +
87
│ │ │ │ +
88 preBasis_.evaluateJacobian(globalIn, out, lFE_.currentKnotSpan_);
│ │ │ │ +
89
│ │ │ │ +
90 for (size_t i=0; i<out.size(); i++)
│ │ │ │ +
91 for (int j=0; j<dim; j++)
│ │ │ │ +
92 out[i][0][j] *= scaling_[j][j];
│ │ │ │ +
93 }
│ │ │ │ +
94
│ │ │ │ +
96 template<size_t k>
│ │ │ │ +
97 inline void evaluate (const typename std::array<int,k>& directions,
│ │ │ │ +
98 const typename Traits::DomainType& in,
│ │ │ │ +
99 std::vector<typename Traits::RangeType>& out) const
│ │ │ │ +
100 {
│ │ │ │ +
101 switch(k)
│ │ │ │ +
102 {
│ │ │ │ +
103 case 0:
│ │ │ │ +
104 evaluateFunction(in, out);
│ │ │ │ +
105 break;
│ │ │ │ +
106 case 1:
│ │ │ │ +
107 {
│ │ │ │ +
108 FieldVector<D,dim> globalIn = offset_;
│ │ │ │ +
109 scaling_.umv(in,globalIn);
│ │ │ │ +
110
│ │ │ │ +
111 preBasis_.evaluate(directions, globalIn, out, lFE_.currentKnotSpan_);
│ │ │ │ +
112
│ │ │ │ +
113 for (size_t i=0; i<out.size(); i++)
│ │ │ │ +
114 out[i][0] *= scaling_[directions[0]][directions[0]];
│ │ │ │ +
115 break;
│ │ │ │ +
116 }
│ │ │ │ +
117 case 2:
│ │ │ │ +
118 {
│ │ │ │ +
119 FieldVector<D,dim> globalIn = offset_;
│ │ │ │ +
120 scaling_.umv(in,globalIn);
│ │ │ │ +
121
│ │ │ │ +
122 preBasis_.evaluate(directions, globalIn, out, lFE_.currentKnotSpan_);
│ │ │ │ +
123
│ │ │ │ +
124 for (size_t i=0; i<out.size(); i++)
│ │ │ │ +
125 out[i][0] *= scaling_[directions[0]][directions[0]]*scaling_[directions[1]][directions[1]];
│ │ │ │ +
126 break;
│ │ │ │ +
127 }
│ │ │ │ +
128 default:
│ │ │ │ +
129 DUNE_THROW(NotImplemented, "B-Spline derivatives of order " << k << " not implemented yet!");
│ │ │ │ +
130 }
│ │ │ │ +
131 }
│ │ │ │ +
132
│ │ │ │ +
140 unsigned int order () const
│ │ │ │ +
141 {
│ │ │ │ +
142 return *std::max_element(preBasis_.order_.begin(), preBasis_.order_.end());
│ │ │ │ +
143 }
│ │ │ │ +
144
│ │ │ │ +
147 std::size_t size() const
│ │ │ │ +
148 {
│ │ │ │ +
149 return lFE_.size();
│ │ │ │ +
150 }
│ │ │ │ +
151
│ │ │ │ +
152private:
│ │ │ │ +
153 const BSplinePreBasis<GV>& preBasis_;
│ │ │ │ +
154
│ │ │ │ + │ │ │ │ +
156
│ │ │ │ +
157 // Coordinates in a single knot span differ from coordinates on the B-spline patch
│ │ │ │ +
158 // by an affine transformation. This transformation is stored in offset_ and scaling_.
│ │ │ │ +
159 FieldVector<D,dim> offset_;
│ │ │ │ +
160 DiagonalMatrix<D,dim> scaling_;
│ │ │ │ +
161};
│ │ │ │ +
162
│ │ │ │ +
176template<int dim>
│ │ │ │ + │ │ │ │ +
178{
│ │ │ │ +
179 // Return i as a d-digit number in the (k+1)-nary system
│ │ │ │ +
180 std::array<unsigned int,dim> multiindex (unsigned int i) const
│ │ │ │ +
181 {
│ │ │ │ +
182 std::array<unsigned int,dim> alpha;
│ │ │ │ +
183 for (int j=0; j<dim; j++)
│ │ │ │ +
184 {
│ │ │ │ +
185 alpha[j] = i % sizes_[j];
│ │ │ │ +
186 i = i/sizes_[j];
│ │ │ │ +
187 }
│ │ │ │ +
188 return alpha;
│ │ │ │ +
189 }
│ │ │ │ +
190
│ │ │ │ +
192 void setup1d(std::vector<unsigned int>& subEntity)
│ │ │ │ +
193 {
│ │ │ │ +
194 if (sizes_[0]==1)
│ │ │ │ +
195 {
│ │ │ │ +
196 subEntity[0] = 0;
│ │ │ │ +
197 return;
│ │ │ │ +
198 }
│ │ │ │ +
199
│ │ │ │ +
200 /* edge and vertex numbering
│ │ │ │ +
201 0----0----1
│ │ │ │ +
202 */
│ │ │ │ +
203 unsigned lastIndex=0;
│ │ │ │ +
204 subEntity[lastIndex++] = 0; // corner 0
│ │ │ │ +
205 for (unsigned i = 0; i < sizes_[0] - 2; ++i)
│ │ │ │ +
206 subEntity[lastIndex++] = 0; // inner dofs of element (0)
│ │ │ │ +
207
│ │ │ │ +
208 subEntity[lastIndex++] = 1; // corner 1
│ │ │ │ +
209
│ │ │ │ +
210 assert(size()==lastIndex);
│ │ │ │ +
211 }
│ │ │ │ +
212
│ │ │ │ +
213 void setup2d(std::vector<unsigned int>& subEntity)
│ │ │ │ +
214 {
│ │ │ │ +
215 unsigned lastIndex=0;
│ │ │ │ +
216
│ │ │ │ +
217 // LocalKey: entity number , entity codim, dof indices within each entity
│ │ │ │ +
218 /* edge and vertex numbering
│ │ │ │ +
219 2----3----3
│ │ │ │ +
220 | |
│ │ │ │ +
221 | |
│ │ │ │ +
222 0 1
│ │ │ │ +
223 | |
│ │ │ │ +
224 | |
│ │ │ │ +
225 0----2----1
│ │ │ │ +
226 */
│ │ │ │ +
227
│ │ │ │ +
228 // lower edge (2)
│ │ │ │ +
229 subEntity[lastIndex++] = 0; // corner 0
│ │ │ │ +
230 for (unsigned i = 0; i < sizes_[0]-2; ++i)
│ │ │ │ +
231 subEntity[lastIndex++] = 2; // inner dofs of lower edge (2)
│ │ │ │ +
232
│ │ │ │ +
233 subEntity[lastIndex++] = 1; // corner 1
│ │ │ │ +
234
│ │ │ │ +
235 // iterate from bottom to top over inner edge dofs
│ │ │ │ +
236 for (unsigned e = 0; e < sizes_[1]-2; ++e)
│ │ │ │ +
237 {
│ │ │ │ +
238 subEntity[lastIndex++] = 0; // left edge (0)
│ │ │ │ +
239 for (unsigned i = 0; i < sizes_[0]-2; ++i)
│ │ │ │ +
240 subEntity[lastIndex++] = 0; // face dofs
│ │ │ │ +
241 subEntity[lastIndex++] = 1; // right edge (1)
│ │ │ │ +
242 }
│ │ │ │ +
243
│ │ │ │ +
244 // upper edge (3)
│ │ │ │ +
245 subEntity[lastIndex++] = 2; // corner 2
│ │ │ │ +
246 for (unsigned i = 0; i < sizes_[0]-2; ++i)
│ │ │ │ +
247 subEntity[lastIndex++] = 3; // inner dofs of upper edge (3)
│ │ │ │ +
248
│ │ │ │ +
249 subEntity[lastIndex++] = 3; // corner 3
│ │ │ │ +
250
│ │ │ │ +
251 assert(size()==lastIndex);
│ │ │ │ +
252 }
│ │ │ │ +
253
│ │ │ │ +
254
│ │ │ │ +
255public:
│ │ │ │ +
256 void init(const std::array<unsigned,dim>& sizes)
│ │ │ │ +
257 {
│ │ │ │ +
258 sizes_ = sizes;
│ │ │ │ +
259
│ │ │ │ +
260 li_.resize(size());
│ │ │ │ +
261
│ │ │ │ +
262 // Set up array of codimension-per-dof-number
│ │ │ │ +
263 std::vector<unsigned int> codim(li_.size());
│ │ │ │ +
264
│ │ │ │ +
265 for (std::size_t i=0; i<codim.size(); i++)
│ │ │ │ +
266 {
│ │ │ │ +
267 codim[i] = 0;
│ │ │ │ +
268 // Codimension gets increased by 1 for each coordinate direction
│ │ │ │ +
269 // where dof is on boundary
│ │ │ │ +
270 std::array<unsigned int,dim> mIdx = multiindex(i);
│ │ │ │ +
271 for (int j=0; j<dim; j++)
│ │ │ │ +
272 if (mIdx[j]==0 or mIdx[j]==sizes[j]-1)
│ │ │ │ +
273 codim[i]++;
│ │ │ │ +
274 }
│ │ │ │ +
275
│ │ │ │ +
276 // Set up index vector (the index of the dof in the set of dofs of a given subentity)
│ │ │ │ +
277 // Algorithm: the 'index' has the same ordering as the dof number 'i'.
│ │ │ │ +
278 // To make it consecutive we interpret 'i' in the (k+1)-adic system, omit all digits
│ │ │ │ +
279 // that correspond to axes where the dof is on the element boundary, and transform the
│ │ │ │ +
280 // rest to the (k-1)-adic system.
│ │ │ │ +
281 std::vector<unsigned int> index(size());
│ │ │ │ +
282
│ │ │ │ +
283 for (std::size_t i=0; i<index.size(); i++)
│ │ │ │ +
284 {
│ │ │ │ +
285 index[i] = 0;
│ │ │ │ +
286
│ │ │ │ +
287 std::array<unsigned int,dim> mIdx = multiindex(i);
│ │ │ │ +
288
│ │ │ │ +
289 for (int j=dim-1; j>=0; j--)
│ │ │ │ +
290 if (mIdx[j]>0 and mIdx[j]<sizes[j]-1)
│ │ │ │ +
291 index[i] = (sizes[j]-1)*index[i] + (mIdx[j]-1);
│ │ │ │ +
292 }
│ │ │ │ +
293
│ │ │ │ +
294 // Set up entity and dof numbers for each (supported) dimension separately
│ │ │ │ +
295 std::vector<unsigned int> subEntity(li_.size());
│ │ │ │ +
296
│ │ │ │ +
297 if (subEntity.size() > 0)
│ │ │ │ +
298 {
│ │ │ │ +
299 if (dim==1) {
│ │ │ │ +
300
│ │ │ │ +
301 setup1d(subEntity);
│ │ │ │ +
302
│ │ │ │ +
303 } else if (dim==2 and sizes_[0]>1 and sizes_[1]>1) {
│ │ │ │ +
304
│ │ │ │ +
305 setup2d(subEntity);
│ │ │ │ +
306
│ │ │ │ +
307 }
│ │ │ │ +
308 }
│ │ │ │ +
309
│ │ │ │ +
310 for (size_t i=0; i<li_.size(); i++)
│ │ │ │ +
311 li_[i] = LocalKey(subEntity[i], codim[i], index[i]);
│ │ │ │ +
312 }
│ │ │ │ +
313
│ │ │ │ +
315 std::size_t size () const
│ │ │ │ +
316 {
│ │ │ │ +
317 return std::accumulate(sizes_.begin(), sizes_.end(), 1, std::multiplies<unsigned int>());
│ │ │ │ +
318 }
│ │ │ │ +
319
│ │ │ │ +
321 const LocalKey& localKey (std::size_t i) const
│ │ │ │ +
322 {
│ │ │ │ +
323 return li_[i];
│ │ │ │ +
324 }
│ │ │ │ +
325
│ │ │ │ +
326private:
│ │ │ │ +
327
│ │ │ │ +
328 // Number of shape functions on this element per coordinate direction
│ │ │ │ +
329 std::array<unsigned, dim> sizes_;
│ │ │ │ +
330
│ │ │ │ +
331 std::vector<LocalKey> li_;
│ │ │ │ +
332};
│ │ │ │ +
333
│ │ │ │ +
338template<int dim, class LB>
│ │ │ │ + │ │ │ │ +
340{
│ │ │ │ +
341public:
│ │ │ │ +
343 template<typename F, typename C>
│ │ │ │ +
344 void interpolate (const F& f, std::vector<C>& out) const
│ │ │ │ +
345 {
│ │ │ │ +
346 DUNE_THROW(NotImplemented, "BSplineLocalInterpolation::interpolate");
│ │ │ │ +
347 }
│ │ │ │ +
348
│ │ │ │ +
349};
│ │ │ │ +
350
│ │ │ │ +
360template<class GV, class R>
│ │ │ │ + │ │ │ │ +
362{
│ │ │ │ +
363 typedef typename GV::ctype D;
│ │ │ │ +
364 enum {dim = GV::dimension};
│ │ │ │ +
365 friend class BSplineLocalBasis<GV,R>;
│ │ │ │ +
366public:
│ │ │ │ +
367
│ │ │ │ +
370 typedef LocalFiniteElementTraits<BSplineLocalBasis<GV,R>,
│ │ │ │ + │ │ │ │ + │ │ │ │ +
373
│ │ │ │ + │ │ │ │ +
377 : preBasis_(preBasis),
│ │ │ │ +
378 localBasis_(preBasis,*this)
│ │ │ │ +
379 {}
│ │ │ │ +
380
│ │ │ │ + │ │ │ │ +
384 : preBasis_(other.preBasis_),
│ │ │ │ + │ │ │ │ +
386 {}
│ │ │ │ +
387
│ │ │ │ +
394 void bind(const std::array<unsigned,dim>& elementIdx)
│ │ │ │ +
395 {
│ │ │ │ +
396 /* \todo In the long run we need to precompute a table for this */
│ │ │ │ +
397 for (size_t i=0; i<elementIdx.size(); i++)
│ │ │ │ +
398 {
│ │ │ │ +
399 currentKnotSpan_[i] = 0;
│ │ │ │ +
400
│ │ │ │ +
401 // Skip over degenerate knot spans
│ │ │ │ +
402 while (preBasis_.knotVectors_[i][currentKnotSpan_[i]+1] < preBasis_.knotVectors_[i][currentKnotSpan_[i]]+1e-8)
│ │ │ │ +
403 currentKnotSpan_[i]++;
│ │ │ │ +
404
│ │ │ │ +
405 for (size_t j=0; j<elementIdx[i]; j++)
│ │ │ │ +
406 {
│ │ │ │ +
407 currentKnotSpan_[i]++;
│ │ │ │ +
408
│ │ │ │ +
409 // Skip over degenerate knot spans
│ │ │ │ +
410 while (preBasis_.knotVectors_[i][currentKnotSpan_[i]+1] < preBasis_.knotVectors_[i][currentKnotSpan_[i]]+1e-8)
│ │ │ │ +
411 currentKnotSpan_[i]++;
│ │ │ │ +
412 }
│ │ │ │ +
413
│ │ │ │ +
414 // Compute the geometric transformation from knotspan-local to global coordinates
│ │ │ │ +
415 localBasis_.offset_[i] = preBasis_.knotVectors_[i][currentKnotSpan_[i]];
│ │ │ │ +
416 localBasis_.scaling_[i][i] = preBasis_.knotVectors_[i][currentKnotSpan_[i]+1] - preBasis_.knotVectors_[i][currentKnotSpan_[i]];
│ │ │ │ +
417 }
│ │ │ │ +
418
│ │ │ │ +
419 // Set up the LocalCoefficients object
│ │ │ │ +
420 std::array<unsigned int, dim> sizes;
│ │ │ │ +
421 for (size_t i=0; i<dim; i++)
│ │ │ │ +
422 sizes[i] = size(i);
│ │ │ │ +
423 localCoefficients_.init(sizes);
│ │ │ │ +
424 }
│ │ │ │ +
425
│ │ │ │ + │ │ │ │ +
428 {
│ │ │ │ +
429 return localBasis_;
│ │ │ │ +
430 }
│ │ │ │ +
431
│ │ │ │ + │ │ │ │ +
434 {
│ │ │ │ +
435 return localCoefficients_;
│ │ │ │ +
436 }
│ │ │ │ +
437
│ │ │ │ + │ │ │ │ +
440 {
│ │ │ │ +
441 return localInterpolation_;
│ │ │ │ +
442 }
│ │ │ │ +
443
│ │ │ │ +
445 unsigned size () const
│ │ │ │ +
446 {
│ │ │ │ +
447 std::size_t r = 1;
│ │ │ │ +
448 for (int i=0; i<dim; i++)
│ │ │ │ +
449 r *= size(i);
│ │ │ │ +
450 return r;
│ │ │ │ +
451 }
│ │ │ │ +
452
│ │ │ │ +
455 GeometryType type () const
│ │ │ │ +
456 {
│ │ │ │ +
457 return GeometryTypes::cube(dim);
│ │ │ │ +
458 }
│ │ │ │ +
459
│ │ │ │ +
460//private:
│ │ │ │ +
461
│ │ │ │ +
463 unsigned int size(int i) const
│ │ │ │ +
464 {
│ │ │ │ +
465 const auto& order = preBasis_.order_;
│ │ │ │ +
466 unsigned int r = order[i]+1; // The 'normal' value
│ │ │ │ +
467 if (currentKnotSpan_[i]<order[i]) // Less near the left end of the knot vector
│ │ │ │ +
468 r -= (order[i] - currentKnotSpan_[i]);
│ │ │ │ +
469 if ( order[i] > (preBasis_.knotVectors_[i].size() - currentKnotSpan_[i] - 2) )
│ │ │ │ +
470 r -= order[i] - (preBasis_.knotVectors_[i].size() - currentKnotSpan_[i] - 2);
│ │ │ │ +
471 return r;
│ │ │ │ +
472 }
│ │ │ │ +
473
│ │ │ │ + │ │ │ │ +
475
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
479
│ │ │ │ +
480 // The knot span we are bound to
│ │ │ │ +
481 std::array<unsigned,dim> currentKnotSpan_;
│ │ │ │ +
482};
│ │ │ │ +
483
│ │ │ │ +
484
│ │ │ │ +
485template<typename GV>
│ │ │ │ +
486class BSplineNode;
│ │ │ │ +
487
│ │ │ │ +
497template<typename GV>
│ │ │ │ + │ │ │ │ +
499{
│ │ │ │ +
500 static const int dim = GV::dimension;
│ │ │ │ +
501
│ │ │ │ +
503 class MultiDigitCounter
│ │ │ │ +
504 {
│ │ │ │ +
505 public:
│ │ │ │ +
506
│ │ │ │ +
510 MultiDigitCounter(const std::array<unsigned int,dim>& limits)
│ │ │ │ +
511 : limits_(limits)
│ │ │ │ +
512 {
│ │ │ │ +
513 std::fill(counter_.begin(), counter_.end(), 0);
│ │ │ │ +
514 }
│ │ │ │ +
515
│ │ │ │ +
517 MultiDigitCounter& operator++()
│ │ │ │ +
518 {
│ │ │ │ +
519 for (int i=0; i<dim; i++)
│ │ │ │ +
520 {
│ │ │ │ +
521 ++counter_[i];
│ │ │ │ +
522
│ │ │ │ +
523 // no overflow?
│ │ │ │ +
524 if (counter_[i] < limits_[i])
│ │ │ │ +
525 break;
│ │ │ │ +
526
│ │ │ │ +
527 counter_[i] = 0;
│ │ │ │ +
528 }
│ │ │ │ +
529 return *this;
│ │ │ │ +
530 }
│ │ │ │ +
531
│ │ │ │ +
533 const unsigned int& operator[](int i) const
│ │ │ │ +
534 {
│ │ │ │ +
535 return counter_[i];
│ │ │ │ +
536 }
│ │ │ │ +
537
│ │ │ │ +
539 unsigned int cycle() const
│ │ │ │ +
540 {
│ │ │ │ +
541 unsigned int r = 1;
│ │ │ │ +
542 for (int i=0; i<dim; i++)
│ │ │ │ +
543 r *= limits_[i];
│ │ │ │ +
544 return r;
│ │ │ │ +
545 }
│ │ │ │ +
546
│ │ │ │ +
547 private:
│ │ │ │ +
548
│ │ │ │ +
550 const std::array<unsigned int,dim> limits_;
│ │ │ │ +
551
│ │ │ │ +
553 std::array<unsigned int,dim> counter_;
│ │ │ │ +
554
│ │ │ │ +
555 };
│ │ │ │ +
556
│ │ │ │ +
557public:
│ │ │ │ +
558
│ │ │ │ +
560 using GridView = GV;
│ │ │ │ +
561 using size_type = std::size_t;
│ │ │ │ +
562
│ │ │ │ + │ │ │ │ +
564
│ │ │ │ +
565 static constexpr size_type maxMultiIndexSize = 1;
│ │ │ │ +
566 static constexpr size_type minMultiIndexSize = 1;
│ │ │ │ +
567 static constexpr size_type multiIndexBufferSize = 1;
│ │ │ │ +
568
│ │ │ │ +
569 // Type used for function values
│ │ │ │ +
570 using R = double;
│ │ │ │ +
571
│ │ │ │ + │ │ │ │ +
591 const std::vector<double>& knotVector,
│ │ │ │ +
592 unsigned int order,
│ │ │ │ +
593 bool makeOpen = true)
│ │ │ │ + │ │ │ │ +
595 {
│ │ │ │ +
596 // \todo Detection of duplicate knots
│ │ │ │ +
597 std::fill(elements_.begin(), elements_.end(), knotVector.size()-1);
│ │ │ │ +
598
│ │ │ │ +
599 // Mediocre sanity check: we don't know the number of grid elements in each direction.
│ │ │ │ +
600 // but at least we know the total number of elements.
│ │ │ │ +
601 assert( std::accumulate(elements_.begin(), elements_.end(), 1, std::multiplies<unsigned>()) == gridView_.size(0) );
│ │ │ │ +
602
│ │ │ │ +
603 for (int i=0; i<dim; i++)
│ │ │ │ +
604 {
│ │ │ │ +
605 // Prepend the correct number of additional knots to open the knot vector
│ │ │ │ +
607 if (makeOpen)
│ │ │ │ +
608 for (unsigned int j=0; j<order; j++)
│ │ │ │ +
609 knotVectors_[i].push_back(knotVector[0]);
│ │ │ │ +
610
│ │ │ │ +
611 knotVectors_[i].insert(knotVectors_[i].end(), knotVector.begin(), knotVector.end());
│ │ │ │ +
612
│ │ │ │ +
613 if (makeOpen)
│ │ │ │ +
614 for (unsigned int j=0; j<order; j++)
│ │ │ │ +
615 knotVectors_[i].push_back(knotVector.back());
│ │ │ │ +
616 }
│ │ │ │ +
617
│ │ │ │ +
618 std::fill(order_.begin(), order_.end(), order);
│ │ │ │ +
619 }
│ │ │ │ +
620
│ │ │ │ + │ │ │ │ +
643 const FieldVector<double,dim>& lowerLeft,
│ │ │ │ +
644 const FieldVector<double,dim>& upperRight,
│ │ │ │ +
645 const std::array<unsigned int,dim>& elements,
│ │ │ │ +
646 unsigned int order,
│ │ │ │ +
647 bool makeOpen = true)
│ │ │ │ +
648 : elements_(elements),
│ │ │ │ + │ │ │ │ +
650 {
│ │ │ │ +
651 // Mediocre sanity check: we don't know the number of grid elements in each direction.
│ │ │ │ +
652 // but at least we know the total number of elements.
│ │ │ │ +
653 assert( std::accumulate(elements_.begin(), elements_.end(), 1, std::multiplies<unsigned>()) == gridView_.size(0) );
│ │ │ │ +
654
│ │ │ │ +
655 for (int i=0; i<dim; i++)
│ │ │ │ +
656 {
│ │ │ │ +
657 // Prepend the correct number of additional knots to open the knot vector
│ │ │ │ +
659 if (makeOpen)
│ │ │ │ +
660 for (unsigned int j=0; j<order; j++)
│ │ │ │ +
661 knotVectors_[i].push_back(lowerLeft[i]);
│ │ │ │ +
662
│ │ │ │ +
663 // Construct the actual knot vector
│ │ │ │ +
664 for (size_t j=0; j<elements[i]+1; j++)
│ │ │ │ +
665 knotVectors_[i].push_back(lowerLeft[i] + j*(upperRight[i]-lowerLeft[i]) / elements[i]);
│ │ │ │ +
666
│ │ │ │ +
667 if (makeOpen)
│ │ │ │ +
668 for (unsigned int j=0; j<order; j++)
│ │ │ │ +
669 knotVectors_[i].push_back(upperRight[i]);
│ │ │ │ +
670 }
│ │ │ │ +
671
│ │ │ │ +
672 std::fill(order_.begin(), order_.end(), order);
│ │ │ │ +
673 }
│ │ │ │ +
674
│ │ │ │ + │ │ │ │ +
677 {}
│ │ │ │ +
678
│ │ │ │ +
680 const GridView& gridView() const
│ │ │ │ +
681 {
│ │ │ │ +
682 return gridView_;
│ │ │ │ +
683 }
│ │ │ │ +
684
│ │ │ │ +
686 void update(const GridView& gv)
│ │ │ │ +
687 {
│ │ │ │ +
688 gridView_ = gv;
│ │ │ │ +
689 }
│ │ │ │ +
690
│ │ │ │ + │ │ │ │ +
695 {
│ │ │ │ +
696 return Node{this};
│ │ │ │ +
697 }
│ │ │ │ +
698
│ │ │ │ +
699 // Ideally this method should be implemented as
│ │ │ │ +
700 //
│ │ │ │ +
701 // template<class SizePrefix>
│ │ │ │ +
702 // size_type size(const SizePrefix& prefix) const
│ │ │ │ +
703 //
│ │ │ │ +
704 // But leads to ambiguity with the other size method:
│ │ │ │ +
705 //
│ │ │ │ +
706 // unsigned int size (size_t d) const
│ │ │ │ +
707 //
│ │ │ │ +
708 // Once the latter is removed, this implementation should be changed.
│ │ │ │ +
709
│ │ │ │ +
711 template<class ST, int i>
│ │ │ │ +
712 size_type size(const Dune::ReservedVector<ST, i>& prefix) const
│ │ │ │ +
713 {
│ │ │ │ +
714 assert(prefix.size() == 0 || prefix.size() == 1);
│ │ │ │ +
715 return (prefix.size() == 0) ? size() : 0;
│ │ │ │ +
716 }
│ │ │ │ +
717
│ │ │ │ + │ │ │ │ +
720 {
│ │ │ │ +
721 return size();
│ │ │ │ +
722 }
│ │ │ │ +
723
│ │ │ │ + │ │ │ │ +
726 {
│ │ │ │ +
727 size_type result = 1;
│ │ │ │ +
728 for (int i=0; i<dim; i++)
│ │ │ │ +
729 result *= order_[i]+1;
│ │ │ │ +
730 return result;
│ │ │ │ +
731 }
│ │ │ │ +
732
│ │ │ │ +
734 template<typename It>
│ │ │ │ +
735 It indices(const Node& node, It it) const
│ │ │ │ +
736 {
│ │ │ │ +
737 // Local degrees of freedom are arranged in a lattice.
│ │ │ │ +
738 // We need the lattice dimensions to be able to compute lattice coordinates from a local index
│ │ │ │ +
739 std::array<unsigned int, dim> localSizes;
│ │ │ │ +
740 for (int i=0; i<dim; i++)
│ │ │ │ +
741 localSizes[i] = node.finiteElement().size(i);
│ │ │ │ +
742 for (size_type i = 0, end = node.size() ; i < end ; ++i, ++it)
│ │ │ │ +
743 {
│ │ │ │ +
744 std::array<unsigned int,dim> localIJK = getIJK(i, localSizes);
│ │ │ │ +
745
│ │ │ │ +
746 const auto currentKnotSpan = node.finiteElement().currentKnotSpan_;
│ │ │ │ +
747 const auto order = order_;
│ │ │ │ +
748
│ │ │ │ +
749 std::array<unsigned int,dim> globalIJK;
│ │ │ │ +
750 for (int i=0; i<dim; i++)
│ │ │ │ +
751 globalIJK[i] = std::max((int)currentKnotSpan[i] - (int)order[i], 0) + localIJK[i]; // needs to be a signed type!
│ │ │ │ +
752
│ │ │ │ +
753 // Make one global flat index from the globalIJK tuple
│ │ │ │ +
754 size_type globalIdx = globalIJK[dim-1];
│ │ │ │ +
755
│ │ │ │ +
756 for (int i=dim-2; i>=0; i--)
│ │ │ │ +
757 globalIdx = globalIdx * size(i) + globalIJK[i];
│ │ │ │ +
758
│ │ │ │ +
759 *it = {{globalIdx}};
│ │ │ │ +
760 }
│ │ │ │ +
761 return it;
│ │ │ │ +
762 }
│ │ │ │ +
763
│ │ │ │ +
765 unsigned int size () const
│ │ │ │ +
766 {
│ │ │ │ +
767 unsigned int result = 1;
│ │ │ │ +
768 for (size_t i=0; i<dim; i++)
│ │ │ │ +
769 result *= size(i);
│ │ │ │ +
770 return result;
│ │ │ │ +
771 }
│ │ │ │ +
772
│ │ │ │ +
774 unsigned int size (size_t d) const
│ │ │ │ +
775 {
│ │ │ │ +
776 return knotVectors_[d].size() - order_[d] - 1;
│ │ │ │ +
777 }
│ │ │ │ +
778
│ │ │ │ +
781 void evaluateFunction (const FieldVector<typename GV::ctype,dim>& in,
│ │ │ │ +
782 std::vector<FieldVector<R,1> >& out,
│ │ │ │ +
783 const std::array<unsigned,dim>& currentKnotSpan) const
│ │ │ │ +
784 {
│ │ │ │ +
785 // Evaluate
│ │ │ │ +
786 std::array<std::vector<R>, dim> oneDValues;
│ │ │ │ +
787
│ │ │ │ +
788 for (size_t i=0; i<dim; i++)
│ │ │ │ +
789 evaluateFunction(in[i], oneDValues[i], knotVectors_[i], order_[i], currentKnotSpan[i]);
│ │ │ │ +
790
│ │ │ │ +
791 std::array<unsigned int, dim> limits;
│ │ │ │ +
792 for (int i=0; i<dim; i++)
│ │ │ │ +
793 limits[i] = oneDValues[i].size();
│ │ │ │ +
794
│ │ │ │ +
795 MultiDigitCounter ijkCounter(limits);
│ │ │ │ +
796
│ │ │ │ +
797 out.resize(ijkCounter.cycle());
│ │ │ │ +
798
│ │ │ │ +
799 for (size_t i=0; i<out.size(); i++, ++ijkCounter)
│ │ │ │ +
800 {
│ │ │ │ +
801 out[i] = R(1.0);
│ │ │ │ +
802 for (size_t j=0; j<dim; j++)
│ │ │ │ +
803 out[i] *= oneDValues[j][ijkCounter[j]];
│ │ │ │ +
804 }
│ │ │ │ +
805 }
│ │ │ │ +
806
│ │ │ │ +
812 void evaluateJacobian (const FieldVector<typename GV::ctype,dim>& in,
│ │ │ │ +
813 std::vector<FieldMatrix<R,1,dim> >& out,
│ │ │ │ +
814 const std::array<unsigned,dim>& currentKnotSpan) const
│ │ │ │ +
815 {
│ │ │ │ +
816 // How many shape functions to we have in each coordinate direction?
│ │ │ │ +
817 std::array<unsigned int, dim> limits;
│ │ │ │ +
818 for (int i=0; i<dim; i++)
│ │ │ │ +
819 {
│ │ │ │ +
820 limits[i] = order_[i]+1; // The 'standard' value away from the boundaries of the knot vector
│ │ │ │ +
821 if (currentKnotSpan[i]<order_[i])
│ │ │ │ +
822 limits[i] -= (order_[i] - currentKnotSpan[i]);
│ │ │ │ +
823 if ( order_[i] > (knotVectors_[i].size() - currentKnotSpan[i] - 2) )
│ │ │ │ +
824 limits[i] -= order_[i] - (knotVectors_[i].size() - currentKnotSpan[i] - 2);
│ │ │ │ +
825 }
│ │ │ │ +
826
│ │ │ │ +
827 // The lowest knot spans that we need values from
│ │ │ │ +
828 std::array<unsigned int, dim> offset;
│ │ │ │ +
829 for (int i=0; i<dim; i++)
│ │ │ │ +
830 offset[i] = std::max((int)(currentKnotSpan[i] - order_[i]),0);
│ │ │ │ +
831
│ │ │ │ +
832 // Evaluate 1d function values (needed for the product rule)
│ │ │ │ +
833 std::array<std::vector<R>, dim> oneDValues;
│ │ │ │ +
834
│ │ │ │ +
835 // Evaluate 1d function values of one order lower (needed for the derivative formula)
│ │ │ │ +
836 std::array<std::vector<R>, dim> lowOrderOneDValues;
│ │ │ │ +
837
│ │ │ │ +
838 std::array<DynamicMatrix<R>, dim> values;
│ │ │ │ +
839
│ │ │ │ +
840 for (size_t i=0; i<dim; i++)
│ │ │ │ +
841 {
│ │ │ │ +
842 evaluateFunctionFull(in[i], values[i], knotVectors_[i], order_[i], currentKnotSpan[i]);
│ │ │ │ +
843 oneDValues[i].resize(knotVectors_[i].size()-order_[i]-1);
│ │ │ │ +
844 for (size_t j=0; j<oneDValues[i].size(); j++)
│ │ │ │ +
845 oneDValues[i][j] = values[i][order_[i]][j];
│ │ │ │ +
846
│ │ │ │ +
847 if (order_[i]!=0)
│ │ │ │ +
848 {
│ │ │ │ +
849 lowOrderOneDValues[i].resize(knotVectors_[i].size()-(order_[i]-1)-1);
│ │ │ │ +
850 for (size_t j=0; j<lowOrderOneDValues[i].size(); j++)
│ │ │ │ +
851 lowOrderOneDValues[i][j] = values[i][order_[i]-1][j];
│ │ │ │ +
852 }
│ │ │ │ +
853 }
│ │ │ │ +
854
│ │ │ │ +
855
│ │ │ │ +
856 // Evaluate 1d function derivatives
│ │ │ │ +
857 std::array<std::vector<R>, dim> oneDDerivatives;
│ │ │ │ +
858 for (size_t i=0; i<dim; i++)
│ │ │ │ +
859 {
│ │ │ │ +
860 oneDDerivatives[i].resize(limits[i]);
│ │ │ │ +
861
│ │ │ │ +
862 if (order_[i]==0) // order-zero functions are piecewise constant, hence all derivatives are zero
│ │ │ │ +
863 std::fill(oneDDerivatives[i].begin(), oneDDerivatives[i].end(), R(0.0));
│ │ │ │ +
864 else
│ │ │ │ +
865 {
│ │ │ │ +
866 for (size_t j=offset[i]; j<offset[i]+limits[i]; j++)
│ │ │ │ +
867 {
│ │ │ │ +
868 R derivativeAddend1 = lowOrderOneDValues[i][j] / (knotVectors_[i][j+order_[i]]-knotVectors_[i][j]);
│ │ │ │ +
869 R derivativeAddend2 = lowOrderOneDValues[i][j+1] / (knotVectors_[i][j+order_[i]+1]-knotVectors_[i][j+1]);
│ │ │ │ +
870 // The two previous terms may evaluate as 0/0. This is to be interpreted as 0.
│ │ │ │ +
871 if (std::isnan(derivativeAddend1))
│ │ │ │ +
872 derivativeAddend1 = 0;
│ │ │ │ +
873 if (std::isnan(derivativeAddend2))
│ │ │ │ +
874 derivativeAddend2 = 0;
│ │ │ │ +
875 oneDDerivatives[i][j-offset[i]] = order_[i] * ( derivativeAddend1 - derivativeAddend2 );
│ │ │ │ +
876 }
│ │ │ │ +
877 }
│ │ │ │ +
878 }
│ │ │ │ +
879
│ │ │ │ +
880 // Working towards computing only the parts that we really need:
│ │ │ │ +
881 // Let's copy them out into a separate array
│ │ │ │ +
882 std::array<std::vector<R>, dim> oneDValuesShort;
│ │ │ │ +
883
│ │ │ │ +
884 for (int i=0; i<dim; i++)
│ │ │ │ +
885 {
│ │ │ │ +
886 oneDValuesShort[i].resize(limits[i]);
│ │ │ │ +
887
│ │ │ │ +
888 for (size_t j=0; j<limits[i]; j++)
│ │ │ │ +
889 oneDValuesShort[i][j] = oneDValues[i][offset[i] + j];
│ │ │ │ +
890 }
│ │ │ │ +
891
│ │ │ │ +
892
│ │ │ │ +
893
│ │ │ │ +
894 // Set up a multi-index to go from consecutive indices to integer coordinates
│ │ │ │ +
895 MultiDigitCounter ijkCounter(limits);
│ │ │ │ +
896
│ │ │ │ +
897 out.resize(ijkCounter.cycle());
│ │ │ │ +
898
│ │ │ │ +
899 // Complete Jacobian is given by the product rule
│ │ │ │ +
900 for (size_t i=0; i<out.size(); i++, ++ijkCounter)
│ │ │ │ +
901 for (int j=0; j<dim; j++)
│ │ │ │ +
902 {
│ │ │ │ +
903 out[i][0][j] = 1.0;
│ │ │ │ +
904 for (int k=0; k<dim; k++)
│ │ │ │ +
905 out[i][0][j] *= (j==k) ? oneDDerivatives[k][ijkCounter[k]]
│ │ │ │ +
906 : oneDValuesShort[k][ijkCounter[k]];
│ │ │ │ +
907 }
│ │ │ │ +
908
│ │ │ │ +
909 }
│ │ │ │ +
910
│ │ │ │ +
912 template <size_type k>
│ │ │ │ +
913 void evaluate(const typename std::array<int,k>& directions,
│ │ │ │ +
914 const FieldVector<typename GV::ctype,dim>& in,
│ │ │ │ +
915 std::vector<FieldVector<R,1> >& out,
│ │ │ │ +
916 const std::array<unsigned,dim>& currentKnotSpan) const
│ │ │ │ +
917 {
│ │ │ │ +
918 if (k != 1 && k != 2)
│ │ │ │ +
919 DUNE_THROW(RangeError, "Differentiation order greater than 2 is not supported!");
│ │ │ │ +
920
│ │ │ │ +
921 // Evaluate 1d function values (needed for the product rule)
│ │ │ │ +
922 std::array<std::vector<R>, dim> oneDValues;
│ │ │ │ +
923 std::array<std::vector<R>, dim> oneDDerivatives;
│ │ │ │ +
924 std::array<std::vector<R>, dim> oneDSecondDerivatives;
│ │ │ │ +
925
│ │ │ │ +
926 // Evaluate 1d function derivatives
│ │ │ │ +
927 if (k==1)
│ │ │ │ +
928 for (size_t i=0; i<dim; i++)
│ │ │ │ +
929 evaluateAll(in[i], oneDValues[i], true, oneDDerivatives[i], false, oneDSecondDerivatives[i], knotVectors_[i], order_[i], currentKnotSpan[i]);
│ │ │ │ +
930 else
│ │ │ │ +
931 for (size_t i=0; i<dim; i++)
│ │ │ │ +
932 evaluateAll(in[i], oneDValues[i], true, oneDDerivatives[i], true, oneDSecondDerivatives[i], knotVectors_[i], order_[i], currentKnotSpan[i]);
│ │ │ │ +
933
│ │ │ │ +
934 // The lowest knot spans that we need values from
│ │ │ │ +
935 std::array<unsigned int, dim> offset;
│ │ │ │ +
936 for (int i=0; i<dim; i++)
│ │ │ │ +
937 offset[i] = std::max((int)(currentKnotSpan[i] - order_[i]),0);
│ │ │ │ +
938
│ │ │ │ +
939 // Set up a multi-index to go from consecutive indices to integer coordinates
│ │ │ │ +
940 std::array<unsigned int, dim> limits;
│ │ │ │ +
941 for (int i=0; i<dim; i++)
│ │ │ │ +
942 {
│ │ │ │ +
943 // In a proper implementation, the following line would do
│ │ │ │ +
944 //limits[i] = oneDValues[i].size();
│ │ │ │ +
945 limits[i] = order_[i]+1; // The 'standard' value away from the boundaries of the knot vector
│ │ │ │ +
946 if (currentKnotSpan[i]<order_[i])
│ │ │ │ +
947 limits[i] -= (order_[i] - currentKnotSpan[i]);
│ │ │ │ +
948 if ( order_[i] > (knotVectors_[i].size() - currentKnotSpan[i] - 2) )
│ │ │ │ +
949 limits[i] -= order_[i] - (knotVectors_[i].size() - currentKnotSpan[i] - 2);
│ │ │ │ +
950 }
│ │ │ │ +
951
│ │ │ │ +
952 // Working towards computing only the parts that we really need:
│ │ │ │ +
953 // Let's copy them out into a separate array
│ │ │ │ +
954 std::array<std::vector<R>, dim> oneDValuesShort;
│ │ │ │ +
955
│ │ │ │ +
956 for (int i=0; i<dim; i++)
│ │ │ │ +
957 {
│ │ │ │ +
958 oneDValuesShort[i].resize(limits[i]);
│ │ │ │ +
959
│ │ │ │ +
960 for (size_t j=0; j<limits[i]; j++)
│ │ │ │ +
961 oneDValuesShort[i][j] = oneDValues[i][offset[i] + j];
│ │ │ │ +
962 }
│ │ │ │ +
963
│ │ │ │ +
964
│ │ │ │ +
965 MultiDigitCounter ijkCounter(limits);
│ │ │ │ +
966
│ │ │ │ +
967 out.resize(ijkCounter.cycle());
│ │ │ │ +
968
│ │ │ │ +
969 if (k == 1)
│ │ │ │ +
970 {
│ │ │ │ +
971 // Complete Jacobian is given by the product rule
│ │ │ │ +
972 for (size_t i=0; i<out.size(); i++, ++ijkCounter)
│ │ │ │ +
973 {
│ │ │ │ +
974 out[i][0] = 1.0;
│ │ │ │ +
975 for (int l=0; l<dim; l++)
│ │ │ │ +
976 out[i][0] *= (directions[0]==l) ? oneDDerivatives[l][ijkCounter[l]]
│ │ │ │ +
977 : oneDValuesShort[l][ijkCounter[l]];
│ │ │ │ +
978 }
│ │ │ │ +
979 }
│ │ │ │ +
980
│ │ │ │ +
981 if (k == 2)
│ │ │ │ +
982 {
│ │ │ │ +
983 // Complete derivation by deriving the tensor product
│ │ │ │ +
984 for (size_t i=0; i<out.size(); i++, ++ijkCounter)
│ │ │ │ +
985 {
│ │ │ │ +
986 out[i][0] = 1.0;
│ │ │ │ +
987 for (int j=0; j<dim; j++)
│ │ │ │ +
988 {
│ │ │ │ +
989 if (directions[0] != directions[1]) //derivation in two different variables
│ │ │ │ +
990 if (directions[0] == j || directions[1] == j) //the spline has to be derived (once) in this direction
│ │ │ │ +
991 out[i][0] *= oneDDerivatives[j][ijkCounter[j]];
│ │ │ │ +
992 else //no derivation in this direction
│ │ │ │ +
993 out[i][0] *= oneDValuesShort[j][ijkCounter[j]];
│ │ │ │ +
994 else //spline is derived two times in the same direction
│ │ │ │ +
995 if (directions[0] == j) //the spline is derived two times in this direction
│ │ │ │ +
996 out[i][0] *= oneDSecondDerivatives[j][ijkCounter[j]];
│ │ │ │ +
997 else //no derivation in this direction
│ │ │ │ +
998 out[i][0] *= oneDValuesShort[j][ijkCounter[j]];
│ │ │ │ +
999 }
│ │ │ │ +
1000 }
│ │ │ │ +
1001 }
│ │ │ │ +
1002 }
│ │ │ │ +
1003
│ │ │ │ +
1004
│ │ │ │ +
1009 static std::array<unsigned int,dim> getIJK(typename GridView::IndexSet::IndexType idx, std::array<unsigned int,dim> elements)
│ │ │ │ +
1010 {
│ │ │ │ +
1011 std::array<unsigned,dim> result;
│ │ │ │ +
1012 for (int i=0; i<dim; i++)
│ │ │ │ +
1013 {
│ │ │ │ +
1014 result[i] = idx%elements[i];
│ │ │ │ +
1015 idx /= elements[i];
│ │ │ │ +
1016 }
│ │ │ │ +
1017 return result;
│ │ │ │ +
1018 }
│ │ │ │ +
1019
│ │ │ │ +
1028 static void evaluateFunction (const typename GV::ctype& in, std::vector<R>& out,
│ │ │ │ +
1029 const std::vector<R>& knotVector,
│ │ │ │ +
1030 unsigned int order,
│ │ │ │ +
1031 unsigned int currentKnotSpan)
│ │ │ │ +
1032 {
│ │ │ │ +
1033 std::size_t outSize = order+1; // The 'standard' value away from the boundaries of the knot vector
│ │ │ │ +
1034 if (currentKnotSpan<order) // Less near the left end of the knot vector
│ │ │ │ +
1035 outSize -= (order - currentKnotSpan);
│ │ │ │ +
1036 if ( order > (knotVector.size() - currentKnotSpan - 2) )
│ │ │ │ +
1037 outSize -= order - (knotVector.size() - currentKnotSpan - 2);
│ │ │ │ +
1038 out.resize(outSize);
│ │ │ │ +
1039
│ │ │ │ +
1040 // It's not really a matrix that is needed here, a plain 2d array would do
│ │ │ │ +
1041 DynamicMatrix<R> N(order+1, knotVector.size()-1);
│ │ │ │ +
1042
│ │ │ │ +
1043 // The text books on splines use the following geometric condition here to fill the array N
│ │ │ │ +
1044 // (see for example Cottrell, Hughes, Bazilevs, Formula (2.1). However, this condition
│ │ │ │ +
1045 // only works if splines are never evaluated exactly on the knots.
│ │ │ │ +
1046 //
│ │ │ │ +
1047 // for (size_t i=0; i<knotVector.size()-1; i++)
│ │ │ │ +
1048 // N[0][i] = (knotVector[i] <= in) and (in < knotVector[i+1]);
│ │ │ │ +
1049 for (size_t i=0; i<knotVector.size()-1; i++)
│ │ │ │ +
1050 N[0][i] = (i == currentKnotSpan);
│ │ │ │ +
1051
│ │ │ │ +
1052 for (size_t r=1; r<=order; r++)
│ │ │ │ +
1053 for (size_t i=0; i<knotVector.size()-r-1; i++)
│ │ │ │ +
1054 {
│ │ │ │ +
1055 R factor1 = ((knotVector[i+r] - knotVector[i]) > 1e-10)
│ │ │ │ +
1056 ? (in - knotVector[i]) / (knotVector[i+r] - knotVector[i])
│ │ │ │ +
1057 : 0;
│ │ │ │ +
1058 R factor2 = ((knotVector[i+r+1] - knotVector[i+1]) > 1e-10)
│ │ │ │ +
1059 ? (knotVector[i+r+1] - in) / (knotVector[i+r+1] - knotVector[i+1])
│ │ │ │ +
1060 : 0;
│ │ │ │ +
1061 N[r][i] = factor1 * N[r-1][i] + factor2 * N[r-1][i+1];
│ │ │ │ +
1062 }
│ │ │ │ +
1063
│ │ │ │ +
1068 for (size_t i=0; i<out.size(); i++) {
│ │ │ │ +
1069 out[i] = N[order][std::max((int)(currentKnotSpan - order),0) + i];
│ │ │ │ +
1070 }
│ │ │ │ +
1071 }
│ │ │ │ +
1072
│ │ │ │ +
1085 static void evaluateFunctionFull(const typename GV::ctype& in,
│ │ │ │ +
1086 DynamicMatrix<R>& out,
│ │ │ │ +
1087 const std::vector<R>& knotVector,
│ │ │ │ +
1088 unsigned int order,
│ │ │ │ +
1089 unsigned int currentKnotSpan)
│ │ │ │ +
1090 {
│ │ │ │ +
1091 // It's not really a matrix that is needed here, a plain 2d array would do
│ │ │ │ +
1092 DynamicMatrix<R>& N = out;
│ │ │ │ +
1093
│ │ │ │ +
1094 N.resize(order+1, knotVector.size()-1);
│ │ │ │ +
1095
│ │ │ │ +
1096 // The text books on splines use the following geometric condition here to fill the array N
│ │ │ │ +
1097 // (see for example Cottrell, Hughes, Bazilevs, Formula (2.1). However, this condition
│ │ │ │ +
1098 // only works if splines are never evaluated exactly on the knots.
│ │ │ │ +
1099 //
│ │ │ │ +
1100 // for (size_t i=0; i<knotVector.size()-1; i++)
│ │ │ │ +
1101 // N[0][i] = (knotVector[i] <= in) and (in < knotVector[i+1]);
│ │ │ │ +
1102 for (size_t i=0; i<knotVector.size()-1; i++)
│ │ │ │ +
1103 N[0][i] = (i == currentKnotSpan);
│ │ │ │ +
1104
│ │ │ │ +
1105 for (size_t r=1; r<=order; r++)
│ │ │ │ +
1106 for (size_t i=0; i<knotVector.size()-r-1; i++)
│ │ │ │ +
1107 {
│ │ │ │ +
1108 R factor1 = ((knotVector[i+r] - knotVector[i]) > 1e-10)
│ │ │ │ +
1109 ? (in - knotVector[i]) / (knotVector[i+r] - knotVector[i])
│ │ │ │ +
1110 : 0;
│ │ │ │ +
1111 R factor2 = ((knotVector[i+r+1] - knotVector[i+1]) > 1e-10)
│ │ │ │ +
1112 ? (knotVector[i+r+1] - in) / (knotVector[i+r+1] - knotVector[i+1])
│ │ │ │ +
1113 : 0;
│ │ │ │ +
1114 N[r][i] = factor1 * N[r-1][i] + factor2 * N[r-1][i+1];
│ │ │ │ +
1115 }
│ │ │ │ +
1116 }
│ │ │ │ +
1117
│ │ │ │ +
1118
│ │ │ │ +
1128 static void evaluateAll(const typename GV::ctype& in,
│ │ │ │ +
1129 std::vector<R>& out,
│ │ │ │ +
1130 bool evaluateJacobian, std::vector<R>& outJac,
│ │ │ │ +
1131 bool evaluateHessian, std::vector<R>& outHess,
│ │ │ │ +
1132 const std::vector<R>& knotVector,
│ │ │ │ +
1133 unsigned int order,
│ │ │ │ +
1134 unsigned int currentKnotSpan)
│ │ │ │ +
1135 {
│ │ │ │ +
1136 // How many shape functions to we have in each coordinate direction?
│ │ │ │ +
1137 unsigned int limit;
│ │ │ │ +
1138 limit = order+1; // The 'standard' value away from the boundaries of the knot vector
│ │ │ │ +
1139 if (currentKnotSpan<order)
│ │ │ │ +
1140 limit -= (order - currentKnotSpan);
│ │ │ │ +
1141 if ( order > (knotVector.size() - currentKnotSpan - 2) )
│ │ │ │ +
1142 limit -= order - (knotVector.size() - currentKnotSpan - 2);
│ │ │ │ +
1143
│ │ │ │ +
1144 // The lowest knot spans that we need values from
│ │ │ │ +
1145 unsigned int offset;
│ │ │ │ +
1146 offset = std::max((int)(currentKnotSpan - order),0);
│ │ │ │ +
1147
│ │ │ │ +
1148 // Evaluate 1d function values (needed for the product rule)
│ │ │ │ +
1149 DynamicMatrix<R> values;
│ │ │ │ +
1150
│ │ │ │ +
1151 evaluateFunctionFull(in, values, knotVector, order, currentKnotSpan);
│ │ │ │ +
1152
│ │ │ │ +
1153 out.resize(knotVector.size()-order-1);
│ │ │ │ +
1154 for (size_t j=0; j<out.size(); j++)
│ │ │ │ +
1155 out[j] = values[order][j];
│ │ │ │ +
1156
│ │ │ │ +
1157 // Evaluate 1d function values of one order lower (needed for the derivative formula)
│ │ │ │ +
1158 std::vector<R> lowOrderOneDValues;
│ │ │ │ +
1159
│ │ │ │ +
1160 if (order!=0)
│ │ │ │ +
1161 {
│ │ │ │ +
1162 lowOrderOneDValues.resize(knotVector.size()-(order-1)-1);
│ │ │ │ +
1163 for (size_t j=0; j<lowOrderOneDValues.size(); j++)
│ │ │ │ +
1164 lowOrderOneDValues[j] = values[order-1][j];
│ │ │ │ +
1165 }
│ │ │ │ +
1166
│ │ │ │ +
1167 // Evaluate 1d function values of two order lower (needed for the (second) derivative formula)
│ │ │ │ +
1168 std::vector<R> lowOrderTwoDValues;
│ │ │ │ +
1169
│ │ │ │ +
1170 if (order>1 && evaluateHessian)
│ │ │ │ +
1171 {
│ │ │ │ +
1172 lowOrderTwoDValues.resize(knotVector.size()-(order-2)-1);
│ │ │ │ +
1173 for (size_t j=0; j<lowOrderTwoDValues.size(); j++)
│ │ │ │ +
1174 lowOrderTwoDValues[j] = values[order-2][j];
│ │ │ │ +
1175 }
│ │ │ │ +
1176
│ │ │ │ +
1177 // Evaluate 1d function derivatives
│ │ │ │ +
1178 if (evaluateJacobian)
│ │ │ │ +
1179 {
│ │ │ │ +
1180 outJac.resize(limit);
│ │ │ │ +
1181
│ │ │ │ +
1182 if (order==0) // order-zero functions are piecewise constant, hence all derivatives are zero
│ │ │ │ +
1183 std::fill(outJac.begin(), outJac.end(), R(0.0));
│ │ │ │ +
1184 else
│ │ │ │ +
1185 {
│ │ │ │ +
1186 for (size_t j=offset; j<offset+limit; j++)
│ │ │ │ +
1187 {
│ │ │ │ +
1188 R derivativeAddend1 = lowOrderOneDValues[j] / (knotVector[j+order]-knotVector[j]);
│ │ │ │ +
1189 R derivativeAddend2 = lowOrderOneDValues[j+1] / (knotVector[j+order+1]-knotVector[j+1]);
│ │ │ │ +
1190 // The two previous terms may evaluate as 0/0. This is to be interpreted as 0.
│ │ │ │ +
1191 if (std::isnan(derivativeAddend1))
│ │ │ │ +
1192 derivativeAddend1 = 0;
│ │ │ │ +
1193 if (std::isnan(derivativeAddend2))
│ │ │ │ +
1194 derivativeAddend2 = 0;
│ │ │ │ +
1195 outJac[j-offset] = order * ( derivativeAddend1 - derivativeAddend2 );
│ │ │ │ +
1196 }
│ │ │ │ +
1197 }
│ │ │ │ +
1198 }
│ │ │ │ +
1199
│ │ │ │ +
1200 // Evaluate 1d function second derivatives
│ │ │ │ +
1201 if (evaluateHessian)
│ │ │ │ +
1202 {
│ │ │ │ +
1203 outHess.resize(limit);
│ │ │ │ +
1204
│ │ │ │ +
1205 if (order<2) // order-zero functions are piecewise constant, hence all derivatives are zero
│ │ │ │ +
1206 std::fill(outHess.begin(), outHess.end(), R(0.0));
│ │ │ │ +
1207 else
│ │ │ │ +
1208 {
│ │ │ │ +
1209 for (size_t j=offset; j<offset+limit; j++)
│ │ │ │ +
1210 {
│ │ │ │ +
1211 assert(j+2 < lowOrderTwoDValues.size());
│ │ │ │ +
1212 R derivativeAddend1 = lowOrderTwoDValues[j] / (knotVector[j+order]-knotVector[j]) / (knotVector[j+order-1]-knotVector[j]);
│ │ │ │ +
1213 R derivativeAddend2 = lowOrderTwoDValues[j+1] / (knotVector[j+order]-knotVector[j]) / (knotVector[j+order]-knotVector[j+1]);
│ │ │ │ +
1214 R derivativeAddend3 = lowOrderTwoDValues[j+1] / (knotVector[j+order+1]-knotVector[j+1]) / (knotVector[j+order]-knotVector[j+1]);
│ │ │ │ +
1215 R derivativeAddend4 = lowOrderTwoDValues[j+2] / (knotVector[j+order+1]-knotVector[j+1]) / (knotVector[j+1+order]-knotVector[j+2]);
│ │ │ │ +
1216 // The two previous terms may evaluate as 0/0. This is to be interpreted as 0.
│ │ │ │ +
1217
│ │ │ │ +
1218 if (std::isnan(derivativeAddend1))
│ │ │ │ +
1219 derivativeAddend1 = 0;
│ │ │ │ +
1220 if (std::isnan(derivativeAddend2))
│ │ │ │ +
1221 derivativeAddend2 = 0;
│ │ │ │ +
1222 if (std::isnan(derivativeAddend3))
│ │ │ │ +
1223 derivativeAddend3 = 0;
│ │ │ │ +
1224 if (std::isnan(derivativeAddend4))
│ │ │ │ +
1225 derivativeAddend4 = 0;
│ │ │ │ +
1226 outHess[j-offset] = order * (order-1) * ( derivativeAddend1 - derivativeAddend2 -derivativeAddend3 + derivativeAddend4 );
│ │ │ │ +
1227 }
│ │ │ │ +
1228 }
│ │ │ │ +
1229 }
│ │ │ │ +
1230 }
│ │ │ │ +
1231
│ │ │ │ +
1232
│ │ │ │ +
1234 std::array<unsigned int, dim> order_;
│ │ │ │ +
1235
│ │ │ │ +
1237 std::array<std::vector<double>, dim> knotVectors_;
│ │ │ │ +
1238
│ │ │ │ +
1240 std::array<unsigned,dim> elements_;
│ │ │ │ +
1241
│ │ │ │ + │ │ │ │ +
1243};
│ │ │ │ +
1244
│ │ │ │ +
1245
│ │ │ │ +
1246
│ │ │ │ +
1247template<typename GV>
│ │ │ │ + │ │ │ │ +
1249 public LeafBasisNode
│ │ │ │ +
1250{
│ │ │ │ +
1251 static const int dim = GV::dimension;
│ │ │ │ +
1252
│ │ │ │ +
1253public:
│ │ │ │ +
1254
│ │ │ │ +
1255 using size_type = std::size_t;
│ │ │ │ +
1256 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ + │ │ │ │ +
1258
│ │ │ │ + │ │ │ │ +
1260 preBasis_(preBasis),
│ │ │ │ +
1261 finiteElement_(*preBasis)
│ │ │ │ +
1262 {}
│ │ │ │ +
1263
│ │ │ │ +
1265 const Element& element() const
│ │ │ │ +
1266 {
│ │ │ │ +
1267 return element_;
│ │ │ │ +
1268 }
│ │ │ │ +
1269
│ │ │ │ + │ │ │ │ +
1275 {
│ │ │ │ +
1276 return finiteElement_;
│ │ │ │ +
1277 }
│ │ │ │ +
1278
│ │ │ │ +
1280 void bind(const Element& e)
│ │ │ │ +
1281 {
│ │ │ │ +
1282 element_ = e;
│ │ │ │ +
1283 auto elementIndex = preBasis_->gridView().indexSet().index(e);
│ │ │ │ +
1284 finiteElement_.bind(preBasis_->getIJK(elementIndex,preBasis_->elements_));
│ │ │ │ +
1285 this->setSize(finiteElement_.size());
│ │ │ │ +
1286 }
│ │ │ │ +
1287
│ │ │ │ +
1288protected:
│ │ │ │ +
1289
│ │ │ │ + │ │ │ │ +
1291
│ │ │ │ + │ │ │ │ + │ │ │ │ +
1294};
│ │ │ │ +
1295
│ │ │ │ +
1296
│ │ │ │ +
1297
│ │ │ │ +
1298namespace BasisFactory {
│ │ │ │ +
1299
│ │ │ │ +
1306inline auto bSpline(const std::vector<double>& knotVector,
│ │ │ │ +
1307 unsigned int order,
│ │ │ │ +
1308 bool makeOpen = true)
│ │ │ │ +
1309{
│ │ │ │ +
1310 return [&knotVector, order, makeOpen](const auto& gridView) {
│ │ │ │ +
1311 return BSplinePreBasis<std::decay_t<decltype(gridView)>>(gridView, knotVector, order, makeOpen);
│ │ │ │ +
1312 };
│ │ │ │ +
1313}
│ │ │ │ +
1314
│ │ │ │ +
1315} // end namespace BasisFactory
│ │ │ │ +
1316
│ │ │ │ +
1317// *****************************************************************************
│ │ │ │ +
1318// This is the actual global basis implementation based on the reusable parts.
│ │ │ │ +
1319// *****************************************************************************
│ │ │ │ +
1320
│ │ │ │ +
1327template<typename GV>
│ │ │ │ + │ │ │ │ +
1329
│ │ │ │ +
1330
│ │ │ │ +
1331} // namespace Functions
│ │ │ │ +
1332
│ │ │ │ +
1333} // namespace Dune
│ │ │ │ +
1334
│ │ │ │ +
1335#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BSPLINEBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ +
auto bSpline(const std::vector< double > &knotVector, unsigned int order, bool makeOpen=true)
Create a pre-basis factory that can create a B-spline pre-basis.
Definition: bsplinebasis.hh:1306
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ +
LocalFiniteElement in the sense of dune-localfunctions, for the B-spline basis on tensor-product grid...
Definition: bsplinebasis.hh:362
│ │ │ │ +
BSplineLocalFiniteElement(const BSplineLocalFiniteElement &other)
Copy constructor.
Definition: bsplinebasis.hh:383
│ │ │ │ +
const BSplinePreBasis< GV > & preBasis_
Definition: bsplinebasis.hh:474
│ │ │ │ +
const BSplineLocalInterpolation< dim, BSplineLocalBasis< GV, R > > & localInterpolation() const
Hand out a LocalInterpolation object.
Definition: bsplinebasis.hh:439
│ │ │ │ +
LocalFiniteElementTraits< BSplineLocalBasis< GV, R >, BSplineLocalCoefficients< dim >, BSplineLocalInterpolation< dim, BSplineLocalBasis< GV, R > > > Traits
Export various types related to this LocalFiniteElement.
Definition: bsplinebasis.hh:372
│ │ │ │ +
std::array< unsigned, dim > currentKnotSpan_
Definition: bsplinebasis.hh:481
│ │ │ │ +
BSplineLocalFiniteElement(const BSplinePreBasis< GV > &preBasis)
Constructor with a given B-spline basis.
Definition: bsplinebasis.hh:376
│ │ │ │ +
const BSplineLocalCoefficients< dim > & localCoefficients() const
Hand out a LocalCoefficients object.
Definition: bsplinebasis.hh:433
│ │ │ │ +
void bind(const std::array< unsigned, dim > &elementIdx)
Bind LocalFiniteElement to a specific knot span of the spline patch.
Definition: bsplinebasis.hh:394
│ │ │ │ +
BSplineLocalInterpolation< dim, BSplineLocalBasis< GV, R > > localInterpolation_
Definition: bsplinebasis.hh:478
│ │ │ │ +
GeometryType type() const
Return the reference element that the local finite element is defined on (here, a hypercube)
Definition: bsplinebasis.hh:455
│ │ │ │ +
unsigned size() const
Number of shape functions in this finite element.
Definition: bsplinebasis.hh:445
│ │ │ │ +
BSplineLocalCoefficients< dim > localCoefficients_
Definition: bsplinebasis.hh:477
│ │ │ │ +
unsigned int size(int i) const
Number of degrees of freedom for one coordinate direction.
Definition: bsplinebasis.hh:463
│ │ │ │ +
BSplineLocalBasis< GV, R > localBasis_
Definition: bsplinebasis.hh:476
│ │ │ │ +
const BSplineLocalBasis< GV, R > & localBasis() const
Hand out a LocalBasis object.
Definition: bsplinebasis.hh:427
│ │ │ │ +
Pre-basis for B-spline basis.
Definition: bsplinebasis.hh:499
│ │ │ │ +
static constexpr size_type multiIndexBufferSize
Definition: bsplinebasis.hh:567
│ │ │ │ +
std::array< unsigned, dim > elements_
Number of grid elements in the different coordinate directions.
Definition: bsplinebasis.hh:1240
│ │ │ │ +
GridView gridView_
Definition: bsplinebasis.hh:1242
│ │ │ │ +
double R
Definition: bsplinebasis.hh:570
│ │ │ │ +
static void evaluateFunctionFull(const typename GV::ctype &in, DynamicMatrix< R > &out, const std::vector< R > &knotVector, unsigned int order, unsigned int currentKnotSpan)
Evaluate all one-dimensional B-spline functions for a given coordinate direction.
Definition: bsplinebasis.hh:1085
│ │ │ │ +
void evaluateFunction(const FieldVector< typename GV::ctype, dim > &in, std::vector< FieldVector< R, 1 > > &out, const std::array< unsigned, dim > &currentKnotSpan) const
Evaluate all B-spline basis functions at a given point.
Definition: bsplinebasis.hh:781
│ │ │ │ +
std::array< unsigned int, dim > order_
Order of the B-spline for each space dimension.
Definition: bsplinebasis.hh:1234
│ │ │ │ +
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition: bsplinebasis.hh:719
│ │ │ │ +
static void evaluateAll(const typename GV::ctype &in, std::vector< R > &out, bool evaluateJacobian, std::vector< R > &outJac, bool evaluateHessian, std::vector< R > &outHess, const std::vector< R > &knotVector, unsigned int order, unsigned int currentKnotSpan)
Evaluate the second derivatives of all one-dimensional B-spline functions for a given coordinate dire...
Definition: bsplinebasis.hh:1128
│ │ │ │ +
static void evaluateFunction(const typename GV::ctype &in, std::vector< R > &out, const std::vector< R > &knotVector, unsigned int order, unsigned int currentKnotSpan)
Evaluate all one-dimensional B-spline functions for a given coordinate direction.
Definition: bsplinebasis.hh:1028
│ │ │ │ +
unsigned int size(size_t d) const
Number of shape functions in one direction.
Definition: bsplinebasis.hh:774
│ │ │ │ +
GV GridView
The grid view that the FE space is defined on.
Definition: bsplinebasis.hh:560
│ │ │ │ +
It indices(const Node &node, It it) const
Maps from subtree index set [0..size-1] to a globally unique multi index in global basis.
Definition: bsplinebasis.hh:735
│ │ │ │ +
void evaluate(const typename std::array< int, k > &directions, const FieldVector< typename GV::ctype, dim > &in, std::vector< FieldVector< R, 1 > > &out, const std::array< unsigned, dim > &currentKnotSpan) const
Evaluate Derivatives of all B-spline basis functions.
Definition: bsplinebasis.hh:913
│ │ │ │ +
std::size_t size_type
Definition: bsplinebasis.hh:561
│ │ │ │ +
static constexpr size_type maxMultiIndexSize
Definition: bsplinebasis.hh:565
│ │ │ │ +
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition: bsplinebasis.hh:686
│ │ │ │ +
void initializeIndices()
Initialize the global indices.
Definition: bsplinebasis.hh:676
│ │ │ │ +
size_type size(const Dune::ReservedVector< ST, i > &prefix) const
Return number of possible values for next position in multi index.
Definition: bsplinebasis.hh:712
│ │ │ │ +
unsigned int size() const
Total number of B-spline basis functions.
Definition: bsplinebasis.hh:765
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: bsplinebasis.hh:680
│ │ │ │ +
static std::array< unsigned int, dim > getIJK(typename GridView::IndexSet::IndexType idx, std::array< unsigned int, dim > elements)
Compute integer element coordinates from the element index.
Definition: bsplinebasis.hh:1009
│ │ │ │ +
Node makeNode() const
Create tree node.
Definition: bsplinebasis.hh:694
│ │ │ │ +
BSplinePreBasis(const GridView &gridView, const std::vector< double > &knotVector, unsigned int order, bool makeOpen=true)
Construct a B-spline basis for a given grid view and set of knot vectors.
Definition: bsplinebasis.hh:590
│ │ │ │ +
void evaluateJacobian(const FieldVector< typename GV::ctype, dim > &in, std::vector< FieldMatrix< R, 1, dim > > &out, const std::array< unsigned, dim > &currentKnotSpan) const
Evaluate Jacobian of all B-spline basis functions.
Definition: bsplinebasis.hh:812
│ │ │ │ +
static constexpr size_type minMultiIndexSize
Definition: bsplinebasis.hh:566
│ │ │ │ +
std::array< std::vector< double >, dim > knotVectors_
The knot vectors, one for each space dimension.
Definition: bsplinebasis.hh:1237
│ │ │ │ +
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition: bsplinebasis.hh:725
│ │ │ │ +
BSplinePreBasis(const GridView &gridView, const FieldVector< double, dim > &lowerLeft, const FieldVector< double, dim > &upperRight, const std::array< unsigned int, dim > &elements, unsigned int order, bool makeOpen=true)
Construct a B-spline basis for a given grid view with uniform knot vectors.
Definition: bsplinebasis.hh:642
│ │ │ │ +
LocalBasis class in the sense of dune-localfunctions, presenting the restriction of a B-spline patch ...
Definition: bsplinebasis.hh:46
│ │ │ │ +
LocalBasisTraits< D, dim, FieldVector< D, dim >, R, 1, FieldVector< R, 1 >, FieldMatrix< R, 1, dim > > Traits
export type traits for function signature
Definition: bsplinebasis.hh:55
│ │ │ │ +
unsigned int order() const
Polynomial order of the shape functions.
Definition: bsplinebasis.hh:140
│ │ │ │ +
std::size_t size() const
Return the number of basis functions on the current knot span.
Definition: bsplinebasis.hh:147
│ │ │ │ +
void evaluate(const typename std::array< int, k > &directions, const typename Traits::DomainType &in, std::vector< typename Traits::RangeType > &out) const
Evaluate all shape functions and derivatives of any order.
Definition: bsplinebasis.hh:97
│ │ │ │ +
void evaluateFunction(const FieldVector< D, dim > &in, std::vector< FieldVector< R, 1 > > &out) const
Evaluate all shape functions.
Definition: bsplinebasis.hh:70
│ │ │ │ +
void evaluateJacobian(const FieldVector< D, dim > &in, std::vector< FieldMatrix< D, 1, dim > > &out) const
Evaluate Jacobian of all shape functions.
Definition: bsplinebasis.hh:82
│ │ │ │ +
BSplineLocalBasis(const BSplinePreBasis< GV > &preBasis, const BSplineLocalFiniteElement< GV, R > &lFE)
Constructor with a given B-spline patch.
Definition: bsplinebasis.hh:61
│ │ │ │ +
Attaches a shape function to an entity.
Definition: bsplinebasis.hh:178
│ │ │ │ +
const LocalKey & localKey(std::size_t i) const
get i'th index
Definition: bsplinebasis.hh:321
│ │ │ │ +
void init(const std::array< unsigned, dim > &sizes)
Definition: bsplinebasis.hh:256
│ │ │ │ +
std::size_t size() const
number of coefficients
Definition: bsplinebasis.hh:315
│ │ │ │ +
Local interpolation in the sense of dune-localfunctions, for the B-spline basis on tensor-product gri...
Definition: bsplinebasis.hh:340
│ │ │ │ +
void interpolate(const F &f, std::vector< C > &out) const
Local interpolation of a function.
Definition: bsplinebasis.hh:344
│ │ │ │ +
Definition: bsplinebasis.hh:1250
│ │ │ │ +
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition: bsplinebasis.hh:1274
│ │ │ │ +
typename GV::template Codim< 0 >::Entity Element
Definition: bsplinebasis.hh:1256
│ │ │ │ +
const BSplinePreBasis< GV > * preBasis_
Definition: bsplinebasis.hh:1290
│ │ │ │ +
Element element_
Definition: bsplinebasis.hh:1293
│ │ │ │ +
void bind(const Element &e)
Bind to element.
Definition: bsplinebasis.hh:1280
│ │ │ │ +
BSplineNode(const BSplinePreBasis< GV > *preBasis)
Definition: bsplinebasis.hh:1259
│ │ │ │ +
const Element & element() const
Return current element, throw if unbound.
Definition: bsplinebasis.hh:1265
│ │ │ │ +
FiniteElement finiteElement_
Definition: bsplinebasis.hh:1292
│ │ │ │ +
std::size_t size_type
Definition: bsplinebasis.hh:1255
│ │ │ │ +
Global basis for given pre-basis.
Definition: defaultglobalbasis.hh:46
│ │ │ │ +
size_type size() const
Definition: nodes.hh:142
│ │ │ │ +
void setSize(const size_type size)
Definition: nodes.hh:164
│ │ │ │ +
Definition: nodes.hh:186
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,91 +4,1510 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * gridfunctions │ │ │ │ │ -gridfunction_imp.hh │ │ │ │ │ + * functionspacebases │ │ │ │ │ +bsplinebasis.hh │ │ │ │ │ Go_to_the_documentation_of_this_file. │ │ │ │ │ - 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ +1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ - 3#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_IMP_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_IMP_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BSPLINEBASIS_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BSPLINEBASIS_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ - 8#include │ │ │ │ │ - 9 │ │ │ │ │ - 10 │ │ │ │ │ - 11 │ │ │ │ │ - 12namespace Dune { │ │ │ │ │ - 13namespace Functions { │ │ │ │ │ - 14namespace Imp { │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12 │ │ │ │ │ + 14#include │ │ │ │ │ 15 │ │ │ │ │ - 19struct HasFreeLocalFunction │ │ │ │ │ - 20{ │ │ │ │ │ - 21 template │ │ │ │ │ - 22 auto require(F&& f) -> decltype( │ │ │ │ │ - 23 localFunction(f) │ │ │ │ │ - 24 ); │ │ │ │ │ - 25}; │ │ │ │ │ - 26 │ │ │ │ │ + 16#include │ │ │ │ │ + 17#include │ │ │ │ │ + 18#include │ │ │ │ │ + 19#include │ │ │ │ │ + 20#include │ │ │ │ │ + 21#include │ │ │ │ │ + 22#include │ │ │ │ │ + 23 │ │ │ │ │ + 24namespace Dune │ │ │ │ │ + 25{ │ │ │ │ │ + 26namespace Functions { │ │ │ │ │ 27 │ │ │ │ │ - 28 │ │ │ │ │ - 29// Interface of type erasure wrapper │ │ │ │ │ - 30// │ │ │ │ │ - 31// Notice that the basic interface of polymorphic classes (destructor, │ │ │ │ │ -clone, ...) │ │ │ │ │ - 32// will be added by the type erasure foundation classes. │ │ │ │ │ - 33template │ │ │ │ │ - 34class GridFunctionWrapperInterface : │ │ │ │ │ - 35 public DifferentiableFunctionWrapperInterface │ │ │ │ │ - 36{ │ │ │ │ │ - 37public: │ │ │ │ │ - 38 virtual LocalFunctionInterface wrappedLocalFunction() const = 0; │ │ │ │ │ - 39 │ │ │ │ │ - 40 virtual const EntitySet& wrappedEntitySet() const = 0; │ │ │ │ │ - 41}; │ │ │ │ │ - 42 │ │ │ │ │ - 43 │ │ │ │ │ - 44// Implementation of type erasure wrapper │ │ │ │ │ - 45template │ │ │ │ │ - 46class GridFunctionWrapperImplementation : │ │ │ │ │ - 47 public DifferentiableFunctionWrapperImplementation │ │ │ │ │ - 48{ │ │ │ │ │ - 49 using Base = DifferentiableFunctionWrapperImplementation; │ │ │ │ │ - 50public: │ │ │ │ │ - 51 using Base::Base; │ │ │ │ │ + 28// A maze of dependencies between the different parts of this. We need a few │ │ │ │ │ +forward declarations │ │ │ │ │ + 29template │ │ │ │ │ + 30class BSplineLocalFiniteElement; │ │ │ │ │ + 31 │ │ │ │ │ + 32template │ │ │ │ │ + 33class BSplinePreBasis; │ │ │ │ │ + 34 │ │ │ │ │ + 35 │ │ │ │ │ + 44template │ │ │ │ │ +45class BSplineLocalBasis │ │ │ │ │ + 46{ │ │ │ │ │ + 47 friend class BSplineLocalFiniteElement; │ │ │ │ │ + 48 │ │ │ │ │ + 49 typedef typename GV::ctype D; │ │ │ │ │ + 50 enum {dim = GV::dimension}; │ │ │ │ │ + 51public: │ │ │ │ │ 52 │ │ │ │ │ - 53 virtual LocalFunctionInterface wrappedLocalFunction() const │ │ │ │ │ - 54 { │ │ │ │ │ - 55 return localFunction(this->get()); │ │ │ │ │ - 56 } │ │ │ │ │ - 57 │ │ │ │ │ - 58 virtual const EntitySet& wrappedEntitySet() const │ │ │ │ │ - 59 { │ │ │ │ │ - 60 return this->get().entitySet(); │ │ │ │ │ - 61 } │ │ │ │ │ - 62}; │ │ │ │ │ - 63 │ │ │ │ │ - 64 │ │ │ │ │ - 65 │ │ │ │ │ - 66}}} // namespace Dune::Functions::Imp │ │ │ │ │ - 67 │ │ │ │ │ - 68 │ │ │ │ │ - 69 │ │ │ │ │ - 70#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_IMP_HH │ │ │ │ │ -type_traits.hh │ │ │ │ │ -differentiablefunction_imp.hh │ │ │ │ │ -interfaces.hh │ │ │ │ │ + 54 typedef LocalBasisTraits,R,1,FieldVector, │ │ │ │ │ +55 FieldMatrix > Traits; │ │ │ │ │ + 56 │ │ │ │ │ +61 BSplineLocalBasis(const BSplinePreBasis& preBasis, │ │ │ │ │ + 62 const BSplineLocalFiniteElement& lFE) │ │ │ │ │ + 63 : preBasis_(preBasis), │ │ │ │ │ + 64 lFE_(lFE) │ │ │ │ │ + 65 {} │ │ │ │ │ + 66 │ │ │ │ │ +70 void evaluateFunction (const FieldVector& in, │ │ │ │ │ + 71 std::vector >& out) const │ │ │ │ │ + 72 { │ │ │ │ │ + 73 FieldVector globalIn = offset_; │ │ │ │ │ + 74 scaling_.umv(in,globalIn); │ │ │ │ │ + 75 │ │ │ │ │ + 76 preBasis_.evaluateFunction(globalIn, out, lFE_.currentKnotSpan_); │ │ │ │ │ + 77 } │ │ │ │ │ + 78 │ │ │ │ │ +82 void evaluateJacobian (const FieldVector& in, │ │ │ │ │ + 83 std::vector >& out) const │ │ │ │ │ + 84 { │ │ │ │ │ + 85 FieldVector globalIn = offset_; │ │ │ │ │ + 86 scaling_.umv(in,globalIn); │ │ │ │ │ + 87 │ │ │ │ │ + 88 preBasis_.evaluateJacobian(globalIn, out, lFE_.currentKnotSpan_); │ │ │ │ │ + 89 │ │ │ │ │ + 90 for (size_t i=0; i │ │ │ │ │ +97 inline void evaluate (const typename std::array& directions, │ │ │ │ │ + 98 const typename Traits::DomainType& in, │ │ │ │ │ + 99 std::vector& out) const │ │ │ │ │ + 100 { │ │ │ │ │ + 101 switch(k) │ │ │ │ │ + 102 { │ │ │ │ │ + 103 case 0: │ │ │ │ │ + 104 evaluateFunction(in, out); │ │ │ │ │ + 105 break; │ │ │ │ │ + 106 case 1: │ │ │ │ │ + 107 { │ │ │ │ │ + 108 FieldVector globalIn = offset_; │ │ │ │ │ + 109 scaling_.umv(in,globalIn); │ │ │ │ │ + 110 │ │ │ │ │ + 111 preBasis_.evaluate(directions, globalIn, out, lFE_.currentKnotSpan_); │ │ │ │ │ + 112 │ │ │ │ │ + 113 for (size_t i=0; i globalIn = offset_; │ │ │ │ │ + 120 scaling_.umv(in,globalIn); │ │ │ │ │ + 121 │ │ │ │ │ + 122 preBasis_.evaluate(directions, globalIn, out, lFE_.currentKnotSpan_); │ │ │ │ │ + 123 │ │ │ │ │ + 124 for (size_t i=0; i& preBasis_; │ │ │ │ │ + 154 │ │ │ │ │ + 155 const BSplineLocalFiniteElement& lFE_; │ │ │ │ │ + 156 │ │ │ │ │ + 157 // Coordinates in a single knot span differ from coordinates on the B- │ │ │ │ │ +spline patch │ │ │ │ │ + 158 // by an affine transformation. This transformation is stored in offset_ │ │ │ │ │ +and scaling_. │ │ │ │ │ + 159 FieldVector offset_; │ │ │ │ │ + 160 DiagonalMatrix scaling_; │ │ │ │ │ + 161}; │ │ │ │ │ + 162 │ │ │ │ │ + 176template │ │ │ │ │ +177class BSplineLocalCoefficients │ │ │ │ │ + 178{ │ │ │ │ │ + 179 // Return i as a d-digit number in the (k+1)-nary system │ │ │ │ │ + 180 std::array multiindex (unsigned int i) const │ │ │ │ │ + 181 { │ │ │ │ │ + 182 std::array alpha; │ │ │ │ │ + 183 for (int j=0; j& subEntity) │ │ │ │ │ + 193 { │ │ │ │ │ + 194 if (sizes_[0]==1) │ │ │ │ │ + 195 { │ │ │ │ │ + 196 subEntity[0] = 0; │ │ │ │ │ + 197 return; │ │ │ │ │ + 198 } │ │ │ │ │ + 199 │ │ │ │ │ + 200 /* edge and vertex numbering │ │ │ │ │ + 201 0----0----1 │ │ │ │ │ + 202 */ │ │ │ │ │ + 203 unsigned lastIndex=0; │ │ │ │ │ + 204 subEntity[lastIndex++] = 0; // corner 0 │ │ │ │ │ + 205 for (unsigned i = 0; i < sizes_[0] - 2; ++i) │ │ │ │ │ + 206 subEntity[lastIndex++] = 0; // inner dofs of element (0) │ │ │ │ │ + 207 │ │ │ │ │ + 208 subEntity[lastIndex++] = 1; // corner 1 │ │ │ │ │ + 209 │ │ │ │ │ + 210 assert(size()==lastIndex); │ │ │ │ │ + 211 } │ │ │ │ │ + 212 │ │ │ │ │ + 213 void setup2d(std::vector& subEntity) │ │ │ │ │ + 214 { │ │ │ │ │ + 215 unsigned lastIndex=0; │ │ │ │ │ + 216 │ │ │ │ │ + 217 // LocalKey: entity number , entity codim, dof indices within each entity │ │ │ │ │ + 218 /* edge and vertex numbering │ │ │ │ │ + 219 2----3----3 │ │ │ │ │ + 220 | | │ │ │ │ │ + 221 | | │ │ │ │ │ + 222 0 1 │ │ │ │ │ + 223 | | │ │ │ │ │ + 224 | | │ │ │ │ │ + 225 0----2----1 │ │ │ │ │ + 226 */ │ │ │ │ │ + 227 │ │ │ │ │ + 228 // lower edge (2) │ │ │ │ │ + 229 subEntity[lastIndex++] = 0; // corner 0 │ │ │ │ │ + 230 for (unsigned i = 0; i < sizes_[0]-2; ++i) │ │ │ │ │ + 231 subEntity[lastIndex++] = 2; // inner dofs of lower edge (2) │ │ │ │ │ + 232 │ │ │ │ │ + 233 subEntity[lastIndex++] = 1; // corner 1 │ │ │ │ │ + 234 │ │ │ │ │ + 235 // iterate from bottom to top over inner edge dofs │ │ │ │ │ + 236 for (unsigned e = 0; e < sizes_[1]-2; ++e) │ │ │ │ │ + 237 { │ │ │ │ │ + 238 subEntity[lastIndex++] = 0; // left edge (0) │ │ │ │ │ + 239 for (unsigned i = 0; i < sizes_[0]-2; ++i) │ │ │ │ │ + 240 subEntity[lastIndex++] = 0; // face dofs │ │ │ │ │ + 241 subEntity[lastIndex++] = 1; // right edge (1) │ │ │ │ │ + 242 } │ │ │ │ │ + 243 │ │ │ │ │ + 244 // upper edge (3) │ │ │ │ │ + 245 subEntity[lastIndex++] = 2; // corner 2 │ │ │ │ │ + 246 for (unsigned i = 0; i < sizes_[0]-2; ++i) │ │ │ │ │ + 247 subEntity[lastIndex++] = 3; // inner dofs of upper edge (3) │ │ │ │ │ + 248 │ │ │ │ │ + 249 subEntity[lastIndex++] = 3; // corner 3 │ │ │ │ │ + 250 │ │ │ │ │ + 251 assert(size()==lastIndex); │ │ │ │ │ + 252 } │ │ │ │ │ + 253 │ │ │ │ │ + 254 │ │ │ │ │ + 255public: │ │ │ │ │ +256 void init(const std::array& sizes) │ │ │ │ │ + 257 { │ │ │ │ │ + 258 sizes_ = sizes; │ │ │ │ │ + 259 │ │ │ │ │ + 260 li_.resize(size()); │ │ │ │ │ + 261 │ │ │ │ │ + 262 // Set up array of codimension-per-dof-number │ │ │ │ │ + 263 std::vector codim(li_.size()); │ │ │ │ │ + 264 │ │ │ │ │ + 265 for (std::size_t i=0; i mIdx = multiindex(i); │ │ │ │ │ + 271 for (int j=0; j index(size()); │ │ │ │ │ + 282 │ │ │ │ │ + 283 for (std::size_t i=0; i mIdx = multiindex(i); │ │ │ │ │ + 288 │ │ │ │ │ + 289 for (int j=dim-1; j>=0; j--) │ │ │ │ │ + 290 if (mIdx[j]>0 and mIdx[j] subEntity(li_.size()); │ │ │ │ │ + 296 │ │ │ │ │ + 297 if (subEntity.size() > 0) │ │ │ │ │ + 298 { │ │ │ │ │ + 299 if (dim==1) { │ │ │ │ │ + 300 │ │ │ │ │ + 301 setup1d(subEntity); │ │ │ │ │ + 302 │ │ │ │ │ + 303 } else if (dim==2 and sizes_[0]>1 and sizes_[1]>1) { │ │ │ │ │ + 304 │ │ │ │ │ + 305 setup2d(subEntity); │ │ │ │ │ + 306 │ │ │ │ │ + 307 } │ │ │ │ │ + 308 } │ │ │ │ │ + 309 │ │ │ │ │ + 310 for (size_t i=0; i()); │ │ │ │ │ + 318 } │ │ │ │ │ + 319 │ │ │ │ │ +321 const LocalKey& localKey (std::size_t i) const │ │ │ │ │ + 322 { │ │ │ │ │ + 323 return li_[i]; │ │ │ │ │ + 324 } │ │ │ │ │ + 325 │ │ │ │ │ + 326private: │ │ │ │ │ + 327 │ │ │ │ │ + 328 // Number of shape functions on this element per coordinate direction │ │ │ │ │ + 329 std::array sizes_; │ │ │ │ │ + 330 │ │ │ │ │ + 331 std::vector li_; │ │ │ │ │ + 332}; │ │ │ │ │ + 333 │ │ │ │ │ + 338template │ │ │ │ │ +339class BSplineLocalInterpolation │ │ │ │ │ + 340{ │ │ │ │ │ + 341public: │ │ │ │ │ + 343 template │ │ │ │ │ +344 void interpolate (const F& f, std::vector& out) const │ │ │ │ │ + 345 { │ │ │ │ │ + 346 DUNE_THROW(NotImplemented, "BSplineLocalInterpolation::interpolate"); │ │ │ │ │ + 347 } │ │ │ │ │ + 348 │ │ │ │ │ + 349}; │ │ │ │ │ + 350 │ │ │ │ │ + 360template │ │ │ │ │ +361class BSplineLocalFiniteElement │ │ │ │ │ + 362{ │ │ │ │ │ +363 typedef typename GV::ctype D; │ │ │ │ │ + 364 enum {dim = GV::dimension}; │ │ │ │ │ + 365 friend class BSplineLocalBasis; │ │ │ │ │ + 366public: │ │ │ │ │ + 367 │ │ │ │ │ + 370 typedef LocalFiniteElementTraits, │ │ │ │ │ + 371 BSplineLocalCoefficients, │ │ │ │ │ +372 BSplineLocalInterpolation > > Traits; │ │ │ │ │ + 373 │ │ │ │ │ +376 BSplineLocalFiniteElement(const BSplinePreBasis& preBasis) │ │ │ │ │ + 377 : preBasis_(preBasis), │ │ │ │ │ + 378 localBasis_(preBasis,*this) │ │ │ │ │ + 379 {} │ │ │ │ │ + 380 │ │ │ │ │ +383 BSplineLocalFiniteElement(const BSplineLocalFiniteElement& other) │ │ │ │ │ + 384 : preBasis_(other.preBasis_), │ │ │ │ │ + 385 localBasis_(preBasis_,*this) │ │ │ │ │ + 386 {} │ │ │ │ │ + 387 │ │ │ │ │ +394 void bind(const std::array& elementIdx) │ │ │ │ │ + 395 { │ │ │ │ │ + 396 /* \todo In the long run we need to precompute a table for this */ │ │ │ │ │ + 397 for (size_t i=0; i sizes; │ │ │ │ │ + 421 for (size_t i=0; i& localBasis() const │ │ │ │ │ + 428 { │ │ │ │ │ + 429 return localBasis_; │ │ │ │ │ + 430 } │ │ │ │ │ + 431 │ │ │ │ │ +433 const BSplineLocalCoefficients& localCoefficients() const │ │ │ │ │ + 434 { │ │ │ │ │ + 435 return localCoefficients_; │ │ │ │ │ + 436 } │ │ │ │ │ + 437 │ │ │ │ │ +439 const BSplineLocalInterpolation >& │ │ │ │ │ +localInterpolation() const │ │ │ │ │ + 440 { │ │ │ │ │ + 441 return localInterpolation_; │ │ │ │ │ + 442 } │ │ │ │ │ + 443 │ │ │ │ │ +445 unsigned size () const │ │ │ │ │ + 446 { │ │ │ │ │ + 447 std::size_t r = 1; │ │ │ │ │ + 448 for (int i=0; i (preBasis_.knotVectors_[i].size() - currentKnotSpan_[i] - │ │ │ │ │ +2) ) │ │ │ │ │ + 470 r -= order[i] - (preBasis_.knotVectors_[i].size() - currentKnotSpan_[i] - │ │ │ │ │ +2); │ │ │ │ │ + 471 return r; │ │ │ │ │ + 472 } │ │ │ │ │ + 473 │ │ │ │ │ +474 const BSplinePreBasis& preBasis_; │ │ │ │ │ + 475 │ │ │ │ │ +476 BSplineLocalBasis localBasis_; │ │ │ │ │ +477 BSplineLocalCoefficients localCoefficients_; │ │ │ │ │ +478 BSplineLocalInterpolation > │ │ │ │ │ +localInterpolation_; │ │ │ │ │ + 479 │ │ │ │ │ + 480 // The knot span we are bound to │ │ │ │ │ +481 std::array currentKnotSpan_; │ │ │ │ │ + 482}; │ │ │ │ │ + 483 │ │ │ │ │ + 484 │ │ │ │ │ + 485template │ │ │ │ │ + 486class BSplineNode; │ │ │ │ │ + 487 │ │ │ │ │ + 497template │ │ │ │ │ +498class BSplinePreBasis │ │ │ │ │ + 499{ │ │ │ │ │ + 500 static const int dim = GV::dimension; │ │ │ │ │ + 501 │ │ │ │ │ + 503 class MultiDigitCounter │ │ │ │ │ + 504 { │ │ │ │ │ + 505 public: │ │ │ │ │ + 506 │ │ │ │ │ + 510 MultiDigitCounter(const std::array& limits) │ │ │ │ │ + 511 : limits_(limits) │ │ │ │ │ + 512 { │ │ │ │ │ + 513 std::fill(counter_.begin(), counter_.end(), 0); │ │ │ │ │ + 514 } │ │ │ │ │ + 515 │ │ │ │ │ + 517 MultiDigitCounter& operator++() │ │ │ │ │ + 518 { │ │ │ │ │ + 519 for (int i=0; i limits_; │ │ │ │ │ + 551 │ │ │ │ │ + 553 std::array counter_; │ │ │ │ │ + 554 │ │ │ │ │ + 555 }; │ │ │ │ │ + 556 │ │ │ │ │ + 557public: │ │ │ │ │ + 558 │ │ │ │ │ +560 using GridView = GV; │ │ │ │ │ +561 using size_type = std::size_t; │ │ │ │ │ + 562 │ │ │ │ │ +563 using Node = BSplineNode; │ │ │ │ │ + 564 │ │ │ │ │ +565 static constexpr size_type maxMultiIndexSize = 1; │ │ │ │ │ +566 static constexpr size_type minMultiIndexSize = 1; │ │ │ │ │ +567 static constexpr size_type multiIndexBufferSize = 1; │ │ │ │ │ + 568 │ │ │ │ │ + 569 // Type used for function values │ │ │ │ │ +570 using R = double; │ │ │ │ │ + 571 │ │ │ │ │ +590 BSplinePreBasis(const GridView& gridView, │ │ │ │ │ + 591 const std::vector& knotVector, │ │ │ │ │ + 592 unsigned int order, │ │ │ │ │ + 593 bool makeOpen = true) │ │ │ │ │ + 594 : gridView_(gridView) │ │ │ │ │ + 595 { │ │ │ │ │ + 596 // \todo Detection of duplicate knots │ │ │ │ │ + 597 std::fill(elements_.begin(), elements_.end(), knotVector.size()-1); │ │ │ │ │ + 598 │ │ │ │ │ + 599 // Mediocre sanity check: we don't know the number of grid elements in │ │ │ │ │ +each direction. │ │ │ │ │ + 600 // but at least we know the total number of elements. │ │ │ │ │ + 601 assert( std::accumulate(elements_.begin(), elements_.end(), 1, std:: │ │ │ │ │ +multiplies()) == gridView_.size(0) ); │ │ │ │ │ + 602 │ │ │ │ │ + 603 for (int i=0; i& lowerLeft, │ │ │ │ │ + 644 const FieldVector& upperRight, │ │ │ │ │ + 645 const std::array& elements, │ │ │ │ │ + 646 unsigned int order, │ │ │ │ │ + 647 bool makeOpen = true) │ │ │ │ │ + 648 : elements_(elements), │ │ │ │ │ + 649 gridView_(gridView) │ │ │ │ │ + 650 { │ │ │ │ │ + 651 // Mediocre sanity check: we don't know the number of grid elements in │ │ │ │ │ +each direction. │ │ │ │ │ + 652 // but at least we know the total number of elements. │ │ │ │ │ + 653 assert( std::accumulate(elements_.begin(), elements_.end(), 1, std:: │ │ │ │ │ +multiplies()) == gridView_.size(0) ); │ │ │ │ │ + 654 │ │ │ │ │ + 655 for (int i=0; i │ │ │ │ │ + 702 // size_type size(const SizePrefix& prefix) const │ │ │ │ │ + 703 // │ │ │ │ │ + 704 // But leads to ambiguity with the other size method: │ │ │ │ │ + 705 // │ │ │ │ │ + 706 // unsigned int size (size_t d) const │ │ │ │ │ + 707 // │ │ │ │ │ + 708 // Once the latter is removed, this implementation should be changed. │ │ │ │ │ + 709 │ │ │ │ │ + 711 template │ │ │ │ │ +712 size_type size(const Dune::ReservedVector& prefix) const │ │ │ │ │ + 713 { │ │ │ │ │ + 714 assert(prefix.size() == 0 || prefix.size() == 1); │ │ │ │ │ + 715 return (prefix.size() == 0) ? size() : 0; │ │ │ │ │ + 716 } │ │ │ │ │ + 717 │ │ │ │ │ +719 size_type dimension() const │ │ │ │ │ + 720 { │ │ │ │ │ + 721 return size(); │ │ │ │ │ + 722 } │ │ │ │ │ + 723 │ │ │ │ │ +725 size_type maxNodeSize() const │ │ │ │ │ + 726 { │ │ │ │ │ + 727 size_type result = 1; │ │ │ │ │ + 728 for (int i=0; i │ │ │ │ │ +735 It indices(const Node& node, It it) const │ │ │ │ │ + 736 { │ │ │ │ │ + 737 // Local degrees of freedom are arranged in a lattice. │ │ │ │ │ + 738 // We need the lattice dimensions to be able to compute lattice │ │ │ │ │ +coordinates from a local index │ │ │ │ │ + 739 std::array localSizes; │ │ │ │ │ + 740 for (int i=0; i localIJK = getIJK(i, localSizes); │ │ │ │ │ + 745 │ │ │ │ │ + 746 const auto currentKnotSpan = node.finiteElement().currentKnotSpan_; │ │ │ │ │ + 747 const auto order = order_; │ │ │ │ │ + 748 │ │ │ │ │ + 749 std::array globalIJK; │ │ │ │ │ + 750 for (int i=0; i=0; i--) │ │ │ │ │ + 757 globalIdx = globalIdx * size(i) + globalIJK[i]; │ │ │ │ │ + 758 │ │ │ │ │ + 759 *it = {{globalIdx}}; │ │ │ │ │ + 760 } │ │ │ │ │ + 761 return it; │ │ │ │ │ + 762 } │ │ │ │ │ + 763 │ │ │ │ │ +765 unsigned int size () const │ │ │ │ │ + 766 { │ │ │ │ │ + 767 unsigned int result = 1; │ │ │ │ │ + 768 for (size_t i=0; i& in, │ │ │ │ │ + 782 std::vector >& out, │ │ │ │ │ + 783 const std::array& currentKnotSpan) const │ │ │ │ │ + 784 { │ │ │ │ │ + 785 // Evaluate │ │ │ │ │ + 786 std::array, dim> oneDValues; │ │ │ │ │ + 787 │ │ │ │ │ + 788 for (size_t i=0; i limits; │ │ │ │ │ + 792 for (int i=0; i& in, │ │ │ │ │ + 813 std::vector >& out, │ │ │ │ │ + 814 const std::array& currentKnotSpan) const │ │ │ │ │ + 815 { │ │ │ │ │ + 816 // How many shape functions to we have in each coordinate direction? │ │ │ │ │ + 817 std::array limits; │ │ │ │ │ + 818 for (int i=0; i (knotVectors_[i].size() - currentKnotSpan[i] - 2) ) │ │ │ │ │ + 824 limits[i] -= order_[i] - (knotVectors_[i].size() - currentKnotSpan[i] - │ │ │ │ │ +2); │ │ │ │ │ + 825 } │ │ │ │ │ + 826 │ │ │ │ │ + 827 // The lowest knot spans that we need values from │ │ │ │ │ + 828 std::array offset; │ │ │ │ │ + 829 for (int i=0; i, dim> oneDValues; │ │ │ │ │ + 834 │ │ │ │ │ + 835 // Evaluate 1d function values of one order lower (needed for the │ │ │ │ │ +derivative formula) │ │ │ │ │ + 836 std::array, dim> lowOrderOneDValues; │ │ │ │ │ + 837 │ │ │ │ │ + 838 std::array, dim> values; │ │ │ │ │ + 839 │ │ │ │ │ + 840 for (size_t i=0; i, dim> oneDDerivatives; │ │ │ │ │ + 858 for (size_t i=0; i, dim> oneDValuesShort; │ │ │ │ │ + 883 │ │ │ │ │ + 884 for (int i=0; i │ │ │ │ │ +913 void evaluate(const typename std::array& directions, │ │ │ │ │ + 914 const FieldVector& in, │ │ │ │ │ + 915 std::vector >& out, │ │ │ │ │ + 916 const std::array& currentKnotSpan) const │ │ │ │ │ + 917 { │ │ │ │ │ + 918 if (k != 1 && k != 2) │ │ │ │ │ + 919 DUNE_THROW(RangeError, "Differentiation order greater than 2 is not │ │ │ │ │ +supported!"); │ │ │ │ │ + 920 │ │ │ │ │ + 921 // Evaluate 1d function values (needed for the product rule) │ │ │ │ │ + 922 std::array, dim> oneDValues; │ │ │ │ │ + 923 std::array, dim> oneDDerivatives; │ │ │ │ │ + 924 std::array, dim> oneDSecondDerivatives; │ │ │ │ │ + 925 │ │ │ │ │ + 926 // Evaluate 1d function derivatives │ │ │ │ │ + 927 if (k==1) │ │ │ │ │ + 928 for (size_t i=0; i offset; │ │ │ │ │ + 936 for (int i=0; i limits; │ │ │ │ │ + 941 for (int i=0; i (knotVectors_[i].size() - currentKnotSpan[i] - 2) ) │ │ │ │ │ + 949 limits[i] -= order_[i] - (knotVectors_[i].size() - currentKnotSpan[i] - │ │ │ │ │ +2); │ │ │ │ │ + 950 } │ │ │ │ │ + 951 │ │ │ │ │ + 952 // Working towards computing only the parts that we really need: │ │ │ │ │ + 953 // Let's copy them out into a separate array │ │ │ │ │ + 954 std::array, dim> oneDValuesShort; │ │ │ │ │ + 955 │ │ │ │ │ + 956 for (int i=0; i getIJK(typename GridView::IndexSet:: │ │ │ │ │ +IndexType idx, std::array elements) │ │ │ │ │ + 1010 { │ │ │ │ │ + 1011 std::array result; │ │ │ │ │ + 1012 for (int i=0; i& out, │ │ │ │ │ + 1029 const std::vector& knotVector, │ │ │ │ │ + 1030 unsigned int order, │ │ │ │ │ + 1031 unsigned int currentKnotSpan) │ │ │ │ │ + 1032 { │ │ │ │ │ + 1033 std::size_t outSize = order+1; // The 'standard' value away from the │ │ │ │ │ +boundaries of the knot vector │ │ │ │ │ + 1034 if (currentKnotSpan (knotVector.size() - currentKnotSpan - 2) ) │ │ │ │ │ + 1037 outSize -= order - (knotVector.size() - currentKnotSpan - 2); │ │ │ │ │ + 1038 out.resize(outSize); │ │ │ │ │ + 1039 │ │ │ │ │ + 1040 // It's not really a matrix that is needed here, a plain 2d array would │ │ │ │ │ +do │ │ │ │ │ + 1041 DynamicMatrix N(order+1, knotVector.size()-1); │ │ │ │ │ + 1042 │ │ │ │ │ + 1043 // The text books on splines use the following geometric condition here │ │ │ │ │ +to fill the array N │ │ │ │ │ + 1044 // (see for example Cottrell, Hughes, Bazilevs, Formula (2.1). However, │ │ │ │ │ +this condition │ │ │ │ │ + 1045 // only works if splines are never evaluated exactly on the knots. │ │ │ │ │ + 1046 // │ │ │ │ │ + 1047 // for (size_t i=0; i 1e-10) │ │ │ │ │ + 1056 ? (in - knotVector[i]) / (knotVector[i+r] - knotVector[i]) │ │ │ │ │ + 1057 : 0; │ │ │ │ │ + 1058 R factor2 = ((knotVector[i+r+1] - knotVector[i+1]) > 1e-10) │ │ │ │ │ + 1059 ? (knotVector[i+r+1] - in) / (knotVector[i+r+1] - knotVector[i+1]) │ │ │ │ │ + 1060 : 0; │ │ │ │ │ + 1061 N[r][i] = factor1 * N[r-1][i] + factor2 * N[r-1][i+1]; │ │ │ │ │ + 1062 } │ │ │ │ │ + 1063 │ │ │ │ │ + 1068 for (size_t i=0; i& out, │ │ │ │ │ + 1087 const std::vector& knotVector, │ │ │ │ │ + 1088 unsigned int order, │ │ │ │ │ + 1089 unsigned int currentKnotSpan) │ │ │ │ │ + 1090 { │ │ │ │ │ + 1091 // It's not really a matrix that is needed here, a plain 2d array would │ │ │ │ │ +do │ │ │ │ │ + 1092 DynamicMatrix& N = out; │ │ │ │ │ + 1093 │ │ │ │ │ + 1094 N.resize(order+1, knotVector.size()-1); │ │ │ │ │ + 1095 │ │ │ │ │ + 1096 // The text books on splines use the following geometric condition here │ │ │ │ │ +to fill the array N │ │ │ │ │ + 1097 // (see for example Cottrell, Hughes, Bazilevs, Formula (2.1). However, │ │ │ │ │ +this condition │ │ │ │ │ + 1098 // only works if splines are never evaluated exactly on the knots. │ │ │ │ │ + 1099 // │ │ │ │ │ + 1100 // for (size_t i=0; i 1e-10) │ │ │ │ │ + 1109 ? (in - knotVector[i]) / (knotVector[i+r] - knotVector[i]) │ │ │ │ │ + 1110 : 0; │ │ │ │ │ + 1111 R factor2 = ((knotVector[i+r+1] - knotVector[i+1]) > 1e-10) │ │ │ │ │ + 1112 ? (knotVector[i+r+1] - in) / (knotVector[i+r+1] - knotVector[i+1]) │ │ │ │ │ + 1113 : 0; │ │ │ │ │ + 1114 N[r][i] = factor1 * N[r-1][i] + factor2 * N[r-1][i+1]; │ │ │ │ │ + 1115 } │ │ │ │ │ + 1116 } │ │ │ │ │ + 1117 │ │ │ │ │ + 1118 │ │ │ │ │ +1128 static void evaluateAll(const typename GV::ctype& in, │ │ │ │ │ + 1129 std::vector& out, │ │ │ │ │ + 1130 bool evaluateJacobian, std::vector& outJac, │ │ │ │ │ + 1131 bool evaluateHessian, std::vector& outHess, │ │ │ │ │ + 1132 const std::vector& knotVector, │ │ │ │ │ + 1133 unsigned int order, │ │ │ │ │ + 1134 unsigned int currentKnotSpan) │ │ │ │ │ + 1135 { │ │ │ │ │ + 1136 // How many shape functions to we have in each coordinate direction? │ │ │ │ │ + 1137 unsigned int limit; │ │ │ │ │ + 1138 limit = order+1; // The 'standard' value away from the boundaries of the │ │ │ │ │ +knot vector │ │ │ │ │ + 1139 if (currentKnotSpan (knotVector.size() - currentKnotSpan - 2) ) │ │ │ │ │ + 1142 limit -= order - (knotVector.size() - currentKnotSpan - 2); │ │ │ │ │ + 1143 │ │ │ │ │ + 1144 // The lowest knot spans that we need values from │ │ │ │ │ + 1145 unsigned int offset; │ │ │ │ │ + 1146 offset = std::max((int)(currentKnotSpan - order),0); │ │ │ │ │ + 1147 │ │ │ │ │ + 1148 // Evaluate 1d function values (needed for the product rule) │ │ │ │ │ + 1149 DynamicMatrix values; │ │ │ │ │ + 1150 │ │ │ │ │ + 1151 evaluateFunctionFull(in, values, knotVector, order, currentKnotSpan); │ │ │ │ │ + 1152 │ │ │ │ │ + 1153 out.resize(knotVector.size()-order-1); │ │ │ │ │ + 1154 for (size_t j=0; j lowOrderOneDValues; │ │ │ │ │ + 1159 │ │ │ │ │ + 1160 if (order!=0) │ │ │ │ │ + 1161 { │ │ │ │ │ + 1162 lowOrderOneDValues.resize(knotVector.size()-(order-1)-1); │ │ │ │ │ + 1163 for (size_t j=0; j lowOrderTwoDValues; │ │ │ │ │ + 1169 │ │ │ │ │ + 1170 if (order>1 && evaluateHessian) │ │ │ │ │ + 1171 { │ │ │ │ │ + 1172 lowOrderTwoDValues.resize(knotVector.size()-(order-2)-1); │ │ │ │ │ + 1173 for (size_t j=0; j order_; │ │ │ │ │ + 1235 │ │ │ │ │ +1237 std::array, dim> knotVectors_; │ │ │ │ │ + 1238 │ │ │ │ │ +1240 std::array elements_; │ │ │ │ │ + 1241 │ │ │ │ │ +1242 GridView gridView_; │ │ │ │ │ + 1243}; │ │ │ │ │ + 1244 │ │ │ │ │ + 1245 │ │ │ │ │ + 1246 │ │ │ │ │ + 1247template │ │ │ │ │ +1248class BSplineNode : │ │ │ │ │ + 1249 public LeafBasisNode │ │ │ │ │ + 1250{ │ │ │ │ │ + 1251 static const int dim = GV::dimension; │ │ │ │ │ + 1252 │ │ │ │ │ + 1253public: │ │ │ │ │ + 1254 │ │ │ │ │ +1255 using size_type = std::size_t; │ │ │ │ │ +1256 using Element = typename GV::template Codim<0>::Entity; │ │ │ │ │ +1257 using FiniteElement = BSplineLocalFiniteElement; │ │ │ │ │ + 1258 │ │ │ │ │ +1259 BSplineNode(const BSplinePreBasis* preBasis) : │ │ │ │ │ + 1260 preBasis_(preBasis), │ │ │ │ │ + 1261 finiteElement_(*preBasis) │ │ │ │ │ + 1262 {} │ │ │ │ │ + 1263 │ │ │ │ │ +1265 const Element& element() const │ │ │ │ │ + 1266 { │ │ │ │ │ + 1267 return element_; │ │ │ │ │ + 1268 } │ │ │ │ │ + 1269 │ │ │ │ │ +1274 const FiniteElement& finiteElement() const │ │ │ │ │ + 1275 { │ │ │ │ │ + 1276 return finiteElement_; │ │ │ │ │ + 1277 } │ │ │ │ │ + 1278 │ │ │ │ │ +1280 void bind(const Element& e) │ │ │ │ │ + 1281 { │ │ │ │ │ + 1282 element_ = e; │ │ │ │ │ + 1283 auto elementIndex = preBasis_->gridView().indexSet().index(e); │ │ │ │ │ + 1284 finiteElement_.bind(preBasis_->getIJK(elementIndex,preBasis_- │ │ │ │ │ +>elements_)); │ │ │ │ │ + 1285 this->setSize(finiteElement_.size()); │ │ │ │ │ + 1286 } │ │ │ │ │ + 1287 │ │ │ │ │ + 1288protected: │ │ │ │ │ + 1289 │ │ │ │ │ +1290 const BSplinePreBasis* preBasis_; │ │ │ │ │ + 1291 │ │ │ │ │ +1292 FiniteElement finiteElement_; │ │ │ │ │ +1293 Element element_; │ │ │ │ │ + 1294}; │ │ │ │ │ + 1295 │ │ │ │ │ + 1296 │ │ │ │ │ + 1297 │ │ │ │ │ + 1298namespace BasisFactory { │ │ │ │ │ + 1299 │ │ │ │ │ +1306inline auto bSpline(const std::vector& knotVector, │ │ │ │ │ + 1307 unsigned int order, │ │ │ │ │ + 1308 bool makeOpen = true) │ │ │ │ │ + 1309{ │ │ │ │ │ + 1310 return [&knotVector, order, makeOpen](const auto& gridView) { │ │ │ │ │ + 1311 return BSplinePreBasis>(gridView, │ │ │ │ │ +knotVector, order, makeOpen); │ │ │ │ │ + 1312 }; │ │ │ │ │ + 1313} │ │ │ │ │ + 1314 │ │ │ │ │ + 1315} // end namespace BasisFactory │ │ │ │ │ + 1316 │ │ │ │ │ + 1317/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ + 1318// This is the actual global basis implementation based on the reusable │ │ │ │ │ +parts. │ │ │ │ │ + 1319/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ + 1320 │ │ │ │ │ + 1327template │ │ │ │ │ +1328using BSplineBasis = DefaultGlobalBasis >; │ │ │ │ │ + 1329 │ │ │ │ │ + 1330 │ │ │ │ │ + 1331} // namespace Functions │ │ │ │ │ + 1332 │ │ │ │ │ + 1333} // namespace Dune │ │ │ │ │ + 1334 │ │ │ │ │ + 1335#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BSPLINEBASIS_HH │ │ │ │ │ +nodes.hh │ │ │ │ │ +defaultglobalbasis.hh │ │ │ │ │ +Dune::Functions::BasisFactory::bSpline │ │ │ │ │ +auto bSpline(const std::vector< double > &knotVector, unsigned int order, bool │ │ │ │ │ +makeOpen=true) │ │ │ │ │ +Create a pre-basis factory that can create a B-spline pre-basis. │ │ │ │ │ +Definition: bsplinebasis.hh:1306 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ +Dune::Functions::BSplineLocalFiniteElement │ │ │ │ │ +LocalFiniteElement in the sense of dune-localfunctions, for the B-spline basis │ │ │ │ │ +on tensor-product grid... │ │ │ │ │ +Definition: bsplinebasis.hh:362 │ │ │ │ │ +Dune::Functions::BSplineLocalFiniteElement::BSplineLocalFiniteElement │ │ │ │ │ +BSplineLocalFiniteElement(const BSplineLocalFiniteElement &other) │ │ │ │ │ +Copy constructor. │ │ │ │ │ +Definition: bsplinebasis.hh:383 │ │ │ │ │ +Dune::Functions::BSplineLocalFiniteElement::preBasis_ │ │ │ │ │ +const BSplinePreBasis< GV > & preBasis_ │ │ │ │ │ +Definition: bsplinebasis.hh:474 │ │ │ │ │ +Dune::Functions::BSplineLocalFiniteElement::localInterpolation │ │ │ │ │ +const BSplineLocalInterpolation< dim, BSplineLocalBasis< GV, R > > & │ │ │ │ │ +localInterpolation() const │ │ │ │ │ +Hand out a LocalInterpolation object. │ │ │ │ │ +Definition: bsplinebasis.hh:439 │ │ │ │ │ +Dune::Functions::BSplineLocalFiniteElement::Traits │ │ │ │ │ +LocalFiniteElementTraits< BSplineLocalBasis< GV, R >, BSplineLocalCoefficients< │ │ │ │ │ +dim >, BSplineLocalInterpolation< dim, BSplineLocalBasis< GV, R > > > Traits │ │ │ │ │ +Export various types related to this LocalFiniteElement. │ │ │ │ │ +Definition: bsplinebasis.hh:372 │ │ │ │ │ +Dune::Functions::BSplineLocalFiniteElement::currentKnotSpan_ │ │ │ │ │ +std::array< unsigned, dim > currentKnotSpan_ │ │ │ │ │ +Definition: bsplinebasis.hh:481 │ │ │ │ │ +Dune::Functions::BSplineLocalFiniteElement::BSplineLocalFiniteElement │ │ │ │ │ +BSplineLocalFiniteElement(const BSplinePreBasis< GV > &preBasis) │ │ │ │ │ +Constructor with a given B-spline basis. │ │ │ │ │ +Definition: bsplinebasis.hh:376 │ │ │ │ │ +Dune::Functions::BSplineLocalFiniteElement::localCoefficients │ │ │ │ │ +const BSplineLocalCoefficients< dim > & localCoefficients() const │ │ │ │ │ +Hand out a LocalCoefficients object. │ │ │ │ │ +Definition: bsplinebasis.hh:433 │ │ │ │ │ +Dune::Functions::BSplineLocalFiniteElement::bind │ │ │ │ │ +void bind(const std::array< unsigned, dim > &elementIdx) │ │ │ │ │ +Bind LocalFiniteElement to a specific knot span of the spline patch. │ │ │ │ │ +Definition: bsplinebasis.hh:394 │ │ │ │ │ +Dune::Functions::BSplineLocalFiniteElement::localInterpolation_ │ │ │ │ │ +BSplineLocalInterpolation< dim, BSplineLocalBasis< GV, R > > │ │ │ │ │ +localInterpolation_ │ │ │ │ │ +Definition: bsplinebasis.hh:478 │ │ │ │ │ +Dune::Functions::BSplineLocalFiniteElement::type │ │ │ │ │ +GeometryType type() const │ │ │ │ │ +Return the reference element that the local finite element is defined on (here, │ │ │ │ │ +a hypercube) │ │ │ │ │ +Definition: bsplinebasis.hh:455 │ │ │ │ │ +Dune::Functions::BSplineLocalFiniteElement::size │ │ │ │ │ +unsigned size() const │ │ │ │ │ +Number of shape functions in this finite element. │ │ │ │ │ +Definition: bsplinebasis.hh:445 │ │ │ │ │ +Dune::Functions::BSplineLocalFiniteElement::localCoefficients_ │ │ │ │ │ +BSplineLocalCoefficients< dim > localCoefficients_ │ │ │ │ │ +Definition: bsplinebasis.hh:477 │ │ │ │ │ +Dune::Functions::BSplineLocalFiniteElement::size │ │ │ │ │ +unsigned int size(int i) const │ │ │ │ │ +Number of degrees of freedom for one coordinate direction. │ │ │ │ │ +Definition: bsplinebasis.hh:463 │ │ │ │ │ +Dune::Functions::BSplineLocalFiniteElement::localBasis_ │ │ │ │ │ +BSplineLocalBasis< GV, R > localBasis_ │ │ │ │ │ +Definition: bsplinebasis.hh:476 │ │ │ │ │ +Dune::Functions::BSplineLocalFiniteElement::localBasis │ │ │ │ │ +const BSplineLocalBasis< GV, R > & localBasis() const │ │ │ │ │ +Hand out a LocalBasis object. │ │ │ │ │ +Definition: bsplinebasis.hh:427 │ │ │ │ │ +Dune::Functions::BSplinePreBasis │ │ │ │ │ +Pre-basis for B-spline basis. │ │ │ │ │ +Definition: bsplinebasis.hh:499 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::multiIndexBufferSize │ │ │ │ │ +static constexpr size_type multiIndexBufferSize │ │ │ │ │ +Definition: bsplinebasis.hh:567 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::elements_ │ │ │ │ │ +std::array< unsigned, dim > elements_ │ │ │ │ │ +Number of grid elements in the different coordinate directions. │ │ │ │ │ +Definition: bsplinebasis.hh:1240 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::gridView_ │ │ │ │ │ +GridView gridView_ │ │ │ │ │ +Definition: bsplinebasis.hh:1242 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::R │ │ │ │ │ +double R │ │ │ │ │ +Definition: bsplinebasis.hh:570 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::evaluateFunctionFull │ │ │ │ │ +static void evaluateFunctionFull(const typename GV::ctype &in, DynamicMatrix< R │ │ │ │ │ +> &out, const std::vector< R > &knotVector, unsigned int order, unsigned int │ │ │ │ │ +currentKnotSpan) │ │ │ │ │ +Evaluate all one-dimensional B-spline functions for a given coordinate │ │ │ │ │ +direction. │ │ │ │ │ +Definition: bsplinebasis.hh:1085 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::evaluateFunction │ │ │ │ │ +void evaluateFunction(const FieldVector< typename GV::ctype, dim > &in, std:: │ │ │ │ │ +vector< FieldVector< R, 1 > > &out, const std::array< unsigned, dim > │ │ │ │ │ +¤tKnotSpan) const │ │ │ │ │ +Evaluate all B-spline basis functions at a given point. │ │ │ │ │ +Definition: bsplinebasis.hh:781 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::order_ │ │ │ │ │ +std::array< unsigned int, dim > order_ │ │ │ │ │ +Order of the B-spline for each space dimension. │ │ │ │ │ +Definition: bsplinebasis.hh:1234 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::dimension │ │ │ │ │ +size_type dimension() const │ │ │ │ │ +Get the total dimension of the space spanned by this basis. │ │ │ │ │ +Definition: bsplinebasis.hh:719 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::evaluateAll │ │ │ │ │ +static void evaluateAll(const typename GV::ctype &in, std::vector< R > &out, │ │ │ │ │ +bool evaluateJacobian, std::vector< R > &outJac, bool evaluateHessian, std:: │ │ │ │ │ +vector< R > &outHess, const std::vector< R > &knotVector, unsigned int order, │ │ │ │ │ +unsigned int currentKnotSpan) │ │ │ │ │ +Evaluate the second derivatives of all one-dimensional B-spline functions for a │ │ │ │ │ +given coordinate dire... │ │ │ │ │ +Definition: bsplinebasis.hh:1128 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::evaluateFunction │ │ │ │ │ +static void evaluateFunction(const typename GV::ctype &in, std::vector< R > │ │ │ │ │ +&out, const std::vector< R > &knotVector, unsigned int order, unsigned int │ │ │ │ │ +currentKnotSpan) │ │ │ │ │ +Evaluate all one-dimensional B-spline functions for a given coordinate │ │ │ │ │ +direction. │ │ │ │ │ +Definition: bsplinebasis.hh:1028 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::size │ │ │ │ │ +unsigned int size(size_t d) const │ │ │ │ │ +Number of shape functions in one direction. │ │ │ │ │ +Definition: bsplinebasis.hh:774 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::GridView │ │ │ │ │ +GV GridView │ │ │ │ │ +The grid view that the FE space is defined on. │ │ │ │ │ +Definition: bsplinebasis.hh:560 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::indices │ │ │ │ │ +It indices(const Node &node, It it) const │ │ │ │ │ +Maps from subtree index set [0..size-1] to a globally unique multi index in │ │ │ │ │ +global basis. │ │ │ │ │ +Definition: bsplinebasis.hh:735 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::evaluate │ │ │ │ │ +void evaluate(const typename std::array< int, k > &directions, const │ │ │ │ │ +FieldVector< typename GV::ctype, dim > &in, std::vector< FieldVector< R, 1 > > │ │ │ │ │ +&out, const std::array< unsigned, dim > ¤tKnotSpan) const │ │ │ │ │ +Evaluate Derivatives of all B-spline basis functions. │ │ │ │ │ +Definition: bsplinebasis.hh:913 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::size_type │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +Definition: bsplinebasis.hh:561 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::maxMultiIndexSize │ │ │ │ │ +static constexpr size_type maxMultiIndexSize │ │ │ │ │ +Definition: bsplinebasis.hh:565 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::update │ │ │ │ │ +void update(const GridView &gv) │ │ │ │ │ +Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ +Definition: bsplinebasis.hh:686 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::initializeIndices │ │ │ │ │ +void initializeIndices() │ │ │ │ │ +Initialize the global indices. │ │ │ │ │ +Definition: bsplinebasis.hh:676 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::size │ │ │ │ │ +size_type size(const Dune::ReservedVector< ST, i > &prefix) const │ │ │ │ │ +Return number of possible values for next position in multi index. │ │ │ │ │ +Definition: bsplinebasis.hh:712 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::size │ │ │ │ │ +unsigned int size() const │ │ │ │ │ +Total number of B-spline basis functions. │ │ │ │ │ +Definition: bsplinebasis.hh:765 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::gridView │ │ │ │ │ +const GridView & gridView() const │ │ │ │ │ +Obtain the grid view that the basis is defined on. │ │ │ │ │ +Definition: bsplinebasis.hh:680 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::getIJK │ │ │ │ │ +static std::array< unsigned int, dim > getIJK(typename GridView::IndexSet:: │ │ │ │ │ +IndexType idx, std::array< unsigned int, dim > elements) │ │ │ │ │ +Compute integer element coordinates from the element index. │ │ │ │ │ +Definition: bsplinebasis.hh:1009 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::makeNode │ │ │ │ │ +Node makeNode() const │ │ │ │ │ +Create tree node. │ │ │ │ │ +Definition: bsplinebasis.hh:694 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::BSplinePreBasis │ │ │ │ │ +BSplinePreBasis(const GridView &gridView, const std::vector< double > │ │ │ │ │ +&knotVector, unsigned int order, bool makeOpen=true) │ │ │ │ │ +Construct a B-spline basis for a given grid view and set of knot vectors. │ │ │ │ │ +Definition: bsplinebasis.hh:590 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::evaluateJacobian │ │ │ │ │ +void evaluateJacobian(const FieldVector< typename GV::ctype, dim > &in, std:: │ │ │ │ │ +vector< FieldMatrix< R, 1, dim > > &out, const std::array< unsigned, dim > │ │ │ │ │ +¤tKnotSpan) const │ │ │ │ │ +Evaluate Jacobian of all B-spline basis functions. │ │ │ │ │ +Definition: bsplinebasis.hh:812 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::minMultiIndexSize │ │ │ │ │ +static constexpr size_type minMultiIndexSize │ │ │ │ │ +Definition: bsplinebasis.hh:566 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::knotVectors_ │ │ │ │ │ +std::array< std::vector< double >, dim > knotVectors_ │ │ │ │ │ +The knot vectors, one for each space dimension. │ │ │ │ │ +Definition: bsplinebasis.hh:1237 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::maxNodeSize │ │ │ │ │ +size_type maxNodeSize() const │ │ │ │ │ +Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ +Definition: bsplinebasis.hh:725 │ │ │ │ │ +Dune::Functions::BSplinePreBasis::BSplinePreBasis │ │ │ │ │ +BSplinePreBasis(const GridView &gridView, const FieldVector< double, dim > │ │ │ │ │ +&lowerLeft, const FieldVector< double, dim > &upperRight, const std::array< │ │ │ │ │ +unsigned int, dim > &elements, unsigned int order, bool makeOpen=true) │ │ │ │ │ +Construct a B-spline basis for a given grid view with uniform knot vectors. │ │ │ │ │ +Definition: bsplinebasis.hh:642 │ │ │ │ │ +Dune::Functions::BSplineLocalBasis │ │ │ │ │ +LocalBasis class in the sense of dune-localfunctions, presenting the │ │ │ │ │ +restriction of a B-spline patch ... │ │ │ │ │ +Definition: bsplinebasis.hh:46 │ │ │ │ │ +Dune::Functions::BSplineLocalBasis::Traits │ │ │ │ │ +LocalBasisTraits< D, dim, FieldVector< D, dim >, R, 1, FieldVector< R, 1 >, │ │ │ │ │ +FieldMatrix< R, 1, dim > > Traits │ │ │ │ │ +export type traits for function signature │ │ │ │ │ +Definition: bsplinebasis.hh:55 │ │ │ │ │ +Dune::Functions::BSplineLocalBasis::order │ │ │ │ │ +unsigned int order() const │ │ │ │ │ +Polynomial order of the shape functions. │ │ │ │ │ +Definition: bsplinebasis.hh:140 │ │ │ │ │ +Dune::Functions::BSplineLocalBasis::size │ │ │ │ │ +std::size_t size() const │ │ │ │ │ +Return the number of basis functions on the current knot span. │ │ │ │ │ +Definition: bsplinebasis.hh:147 │ │ │ │ │ +Dune::Functions::BSplineLocalBasis::evaluate │ │ │ │ │ +void evaluate(const typename std::array< int, k > &directions, const typename │ │ │ │ │ +Traits::DomainType &in, std::vector< typename Traits::RangeType > &out) const │ │ │ │ │ +Evaluate all shape functions and derivatives of any order. │ │ │ │ │ +Definition: bsplinebasis.hh:97 │ │ │ │ │ +Dune::Functions::BSplineLocalBasis::evaluateFunction │ │ │ │ │ +void evaluateFunction(const FieldVector< D, dim > &in, std::vector< │ │ │ │ │ +FieldVector< R, 1 > > &out) const │ │ │ │ │ +Evaluate all shape functions. │ │ │ │ │ +Definition: bsplinebasis.hh:70 │ │ │ │ │ +Dune::Functions::BSplineLocalBasis::evaluateJacobian │ │ │ │ │ +void evaluateJacobian(const FieldVector< D, dim > &in, std::vector< │ │ │ │ │ +FieldMatrix< D, 1, dim > > &out) const │ │ │ │ │ +Evaluate Jacobian of all shape functions. │ │ │ │ │ +Definition: bsplinebasis.hh:82 │ │ │ │ │ +Dune::Functions::BSplineLocalBasis::BSplineLocalBasis │ │ │ │ │ +BSplineLocalBasis(const BSplinePreBasis< GV > &preBasis, const │ │ │ │ │ +BSplineLocalFiniteElement< GV, R > &lFE) │ │ │ │ │ +Constructor with a given B-spline patch. │ │ │ │ │ +Definition: bsplinebasis.hh:61 │ │ │ │ │ +Dune::Functions::BSplineLocalCoefficients │ │ │ │ │ +Attaches a shape function to an entity. │ │ │ │ │ +Definition: bsplinebasis.hh:178 │ │ │ │ │ +Dune::Functions::BSplineLocalCoefficients::localKey │ │ │ │ │ +const LocalKey & localKey(std::size_t i) const │ │ │ │ │ +get i'th index │ │ │ │ │ +Definition: bsplinebasis.hh:321 │ │ │ │ │ +Dune::Functions::BSplineLocalCoefficients::init │ │ │ │ │ +void init(const std::array< unsigned, dim > &sizes) │ │ │ │ │ +Definition: bsplinebasis.hh:256 │ │ │ │ │ +Dune::Functions::BSplineLocalCoefficients::size │ │ │ │ │ +std::size_t size() const │ │ │ │ │ +number of coefficients │ │ │ │ │ +Definition: bsplinebasis.hh:315 │ │ │ │ │ +Dune::Functions::BSplineLocalInterpolation │ │ │ │ │ +Local interpolation in the sense of dune-localfunctions, for the B-spline basis │ │ │ │ │ +on tensor-product gri... │ │ │ │ │ +Definition: bsplinebasis.hh:340 │ │ │ │ │ +Dune::Functions::BSplineLocalInterpolation::interpolate │ │ │ │ │ +void interpolate(const F &f, std::vector< C > &out) const │ │ │ │ │ +Local interpolation of a function. │ │ │ │ │ +Definition: bsplinebasis.hh:344 │ │ │ │ │ +Dune::Functions::BSplineNode │ │ │ │ │ +Definition: bsplinebasis.hh:1250 │ │ │ │ │ +Dune::Functions::BSplineNode::finiteElement │ │ │ │ │ +const FiniteElement & finiteElement() const │ │ │ │ │ +Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ +Definition: bsplinebasis.hh:1274 │ │ │ │ │ +Dune::Functions::BSplineNode::Element │ │ │ │ │ +typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ +Definition: bsplinebasis.hh:1256 │ │ │ │ │ +Dune::Functions::BSplineNode::preBasis_ │ │ │ │ │ +const BSplinePreBasis< GV > * preBasis_ │ │ │ │ │ +Definition: bsplinebasis.hh:1290 │ │ │ │ │ +Dune::Functions::BSplineNode::element_ │ │ │ │ │ +Element element_ │ │ │ │ │ +Definition: bsplinebasis.hh:1293 │ │ │ │ │ +Dune::Functions::BSplineNode::bind │ │ │ │ │ +void bind(const Element &e) │ │ │ │ │ +Bind to element. │ │ │ │ │ +Definition: bsplinebasis.hh:1280 │ │ │ │ │ +Dune::Functions::BSplineNode::BSplineNode │ │ │ │ │ +BSplineNode(const BSplinePreBasis< GV > *preBasis) │ │ │ │ │ +Definition: bsplinebasis.hh:1259 │ │ │ │ │ +Dune::Functions::BSplineNode::element │ │ │ │ │ +const Element & element() const │ │ │ │ │ +Return current element, throw if unbound. │ │ │ │ │ +Definition: bsplinebasis.hh:1265 │ │ │ │ │ +Dune::Functions::BSplineNode::finiteElement_ │ │ │ │ │ +FiniteElement finiteElement_ │ │ │ │ │ +Definition: bsplinebasis.hh:1292 │ │ │ │ │ +Dune::Functions::BSplineNode::size_type │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +Definition: bsplinebasis.hh:1255 │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis │ │ │ │ │ +Global basis for given pre-basis. │ │ │ │ │ +Definition: defaultglobalbasis.hh:46 │ │ │ │ │ +Dune::Functions::BasisNodeMixin::size │ │ │ │ │ +size_type size() const │ │ │ │ │ +Definition: nodes.hh:142 │ │ │ │ │ +Dune::Functions::BasisNodeMixin::setSize │ │ │ │ │ +void setSize(const size_type size) │ │ │ │ │ +Definition: nodes.hh:164 │ │ │ │ │ +Dune::Functions::LeafBasisNode │ │ │ │ │ +Definition: nodes.hh:186 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00086.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: facenormalgridfunction.hh File Reference │ │ │ │ +dune-functions: powerbasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,47 +58,64 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
facenormalgridfunction.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
powerbasis.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ -#include <optional>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ +
#include <dune/common/reservedvector.hh>
│ │ │ │ #include <dune/common/typeutilities.hh>
│ │ │ │ -#include <dune/common/rangeutilities.hh>
│ │ │ │ -#include <dune/geometry/referenceelements.hh>
│ │ │ │ -#include <dune/functions/gridfunctions/gridfunction.hh>
│ │ │ │ -#include <dune/functions/gridfunctions/gridviewentityset.hh>
│ │ │ │ +#include <dune/common/indices.hh>
│ │ │ │ +#include <dune/functions/common/utility.hh>
│ │ │ │ +#include <dune/functions/common/type_traits.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/basistags.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::FaceNormalGridFunction< GV >
 Grid function implementing the piecewise element face normal. More...
class  Dune::Functions::PowerPreBasis< IMS, SPB, C >
 A pre-basis for power bases. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
namespace  Dune::Functions::BasisFactory
 
namespace  Dune::Functions::BasisBuilder
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<std::size_t k, class ChildPreBasisFactory , class IndexMergingStrategy >
auto Dune::Functions::BasisFactory::power (ChildPreBasisFactory &&childPreBasisFactory, const IndexMergingStrategy &)
 Create a pre-basis factory that can build a PowerPreBasis. More...
 
template<std::size_t k, class ChildPreBasisFactory >
auto Dune::Functions::BasisFactory::power (ChildPreBasisFactory &&childPreBasisFactory)
 Create a factory builder that can build a PowerPreBasis. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,31 +4,48 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * gridfunctions │ │ │ │ │ -Classes | Namespaces │ │ │ │ │ -facenormalgridfunction.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * functionspacebases │ │ │ │ │ +Classes | Namespaces | Functions │ │ │ │ │ +powerbasis.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::FaceNormalGridFunction<_GV_> │ │ │ │ │ -  Grid function implementing the piecewise element face normal. More... │ │ │ │ │ +class  Dune::Functions::PowerPreBasis<_IMS,_SPB,_C_> │ │ │ │ │ +  A pre-basis for power bases. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ +namespace  Dune::Functions::BasisFactory │ │ │ │ │ +  │ │ │ │ │ +namespace  Dune::Functions::BasisBuilder │ │ │ │ │ +  │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::BasisFactory::power (ChildPreBasisFactory │ │ │ │ │ + &&childPreBasisFactory, const IndexMergingStrategy &) │ │ │ │ │ +  Create a pre-basis factory that can build a PowerPreBasis. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::BasisFactory::power (ChildPreBasisFactory │ │ │ │ │ + &&childPreBasisFactory) │ │ │ │ │ +  Create a factory builder that can build a PowerPreBasis. More... │ │ │ │ │ +  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00086_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: facenormalgridfunction.hh Source File │ │ │ │ +dune-functions: powerbasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,195 +58,410 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
facenormalgridfunction.hh
│ │ │ │ +
powerbasis.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#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_FACENORMALGRIDFUNCTION_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_FACENORMALGRIDFUNCTION_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_POWERBASIS_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_POWERBASIS_HH
│ │ │ │
5
│ │ │ │ -
6#include <type_traits>
│ │ │ │ -
7#include <optional>
│ │ │ │ -
8
│ │ │ │ -
9#include <dune/common/exceptions.hh>
│ │ │ │ -
10#include <dune/common/typeutilities.hh>
│ │ │ │ -
11#include <dune/common/rangeutilities.hh>
│ │ │ │ -
12#include <dune/geometry/referenceelements.hh>
│ │ │ │ -
13
│ │ │ │ - │ │ │ │ - │ │ │ │ +
6#include <dune/common/reservedvector.hh>
│ │ │ │ +
7#include <dune/common/typeutilities.hh>
│ │ │ │ +
8#include <dune/common/indices.hh>
│ │ │ │ +
9
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
16
│ │ │ │
17
│ │ │ │ -
18namespace Dune::Functions {
│ │ │ │ -
19
│ │ │ │ -
20namespace Impl {
│ │ │ │ +
18
│ │ │ │ +
19namespace Dune {
│ │ │ │ +
20namespace Functions {
│ │ │ │
21
│ │ │ │ -
22// Compute closest face to point
│ │ │ │ -
23template<class ReferenceElement, class Coordinate>
│ │ │ │ -
24auto closestFaceIndex(const ReferenceElement& re, const Coordinate& x)
│ │ │ │ -
25{
│ │ │ │ -
26 auto closestFaceIndex = decltype(re.subEntity(0,1,0,1)){};
│ │ │ │ -
27 double closestFaceDistance = std::numeric_limits<double>::max();
│ │ │ │ -
28 for(auto&& faceIndex : Dune::range(re.size(1)))
│ │ │ │ -
29 {
│ │ │ │ -
30 // For a face unit outer normal consider the orthogonal projection
│ │ │ │ -
31 // Px = x + <c-x,n>*n into the face. Then the distance to the face
│ │ │ │ -
32 // is given by |x-Px| = |<c-x,n>||n| = <c-x,n>.
│ │ │ │ -
33 auto normal = re.integrationOuterNormal(faceIndex);
│ │ │ │ -
34 normal /= normal.two_norm();
│ │ │ │ -
35 auto c = re.position(faceIndex,1);
│ │ │ │ -
36 c -= x;
│ │ │ │ -
37 auto faceDistance = (c*normal);
│ │ │ │ -
38 if (faceDistance<closestFaceDistance)
│ │ │ │ -
39 {
│ │ │ │ -
40 closestFaceDistance = faceDistance;
│ │ │ │ -
41 closestFaceIndex = faceIndex;
│ │ │ │ -
42 }
│ │ │ │ -
43 }
│ │ │ │ -
44 return closestFaceIndex;
│ │ │ │ -
45}
│ │ │ │ -
46
│ │ │ │ -
47} // end namespace Impl
│ │ │ │ +
22
│ │ │ │ +
23// *****************************************************************************
│ │ │ │ +
24// This is the reusable part of the power bases. It contains
│ │ │ │ +
25//
│ │ │ │ +
26// PowerPreBasis
│ │ │ │ +
27//
│ │ │ │ +
28// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ +
29// state. These components do _not_ depend on the global basis and local view
│ │ │ │ +
30// and can be used without a global basis.
│ │ │ │ +
31// *****************************************************************************
│ │ │ │ +
32
│ │ │ │ +
43template<class IMS, class SPB, std::size_t C>
│ │ │ │ + │ │ │ │ +
45{
│ │ │ │ +
46 static const std::size_t children = C;
│ │ │ │ +
47 static const bool isBlocked = std::is_same_v<IMS,BasisFactory::BlockedLexicographic> or std::is_same_v<IMS,BasisFactory::BlockedInterleaved>;
│ │ │ │
48
│ │ │ │ -
49
│ │ │ │ +
49public:
│ │ │ │
50
│ │ │ │ -
51
│ │ │ │ -
64template<class GV>
│ │ │ │ - │ │ │ │ -
66{
│ │ │ │ -
67public:
│ │ │ │ -
68 using GridView = GV;
│ │ │ │ - │ │ │ │ -
70 using Element = typename EntitySet::Element;
│ │ │ │ +
52 using SubPreBasis = SPB;
│ │ │ │ +
53
│ │ │ │ +
55 using GridView = typename SPB::GridView;
│ │ │ │ +
56
│ │ │ │ +
58 using size_type = std::size_t;
│ │ │ │ +
59
│ │ │ │ + │ │ │ │ +
62
│ │ │ │ +
63 using SubNode = typename SubPreBasis::Node;
│ │ │ │ +
64
│ │ │ │ + │ │ │ │ +
67
│ │ │ │ +
68 static constexpr size_type maxMultiIndexSize = SubPreBasis::maxMultiIndexSize + isBlocked;
│ │ │ │ +
69 static constexpr size_type minMultiIndexSize = SubPreBasis::minMultiIndexSize + isBlocked;
│ │ │ │ +
70 static constexpr size_type multiIndexBufferSize = SubPreBasis::multiIndexBufferSize + isBlocked;
│ │ │ │
71
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
75
│ │ │ │ -
76private:
│ │ │ │ -
77
│ │ │ │ -
78 using Traits = Imp::GridFunctionTraits<Range(Domain), EntitySet, DefaultDerivativeTraits, 16>;
│ │ │ │ -
79
│ │ │ │ -
80 class LocalFunction
│ │ │ │ -
81 {
│ │ │ │ -
82 using Geometry = typename Element::Geometry;
│ │ │ │ -
83 static const int dimension = GV::dimension;
│ │ │ │ -
84 public:
│ │ │ │ +
77 template<class... SFArgs,
│ │ │ │ +
78 disableCopyMove<PowerPreBasis, SFArgs...> = 0,
│ │ │ │ +
79 enableIfConstructible<SubPreBasis, SFArgs...> = 0>
│ │ │ │ +
80 PowerPreBasis(SFArgs&&... sfArgs) :
│ │ │ │ +
81 subPreBasis_(std::forward<SFArgs>(sfArgs)...)
│ │ │ │ +
82 {
│ │ │ │ +
83 static_assert(models<Concept::PreBasis<GridView>, SubPreBasis>(), "Subprebasis passed to PowerPreBasis does not model the PreBasis concept.");
│ │ │ │ +
84 }
│ │ │ │
85
│ │ │ │ -
97 void bind(const Element& element)
│ │ │ │ -
98 {
│ │ │ │ -
99 element_ = element;
│ │ │ │ -
100 geometry_.emplace(element_.geometry());
│ │ │ │ -
101 }
│ │ │ │ -
102
│ │ │ │ -
103 void unbind()
│ │ │ │ -
104 {
│ │ │ │ -
105 geometry_.reset();
│ │ │ │ -
106 }
│ │ │ │ -
107
│ │ │ │ -
110 bool bound() const
│ │ │ │ -
111 {
│ │ │ │ -
112 return static_cast<bool>(geometry_);
│ │ │ │ -
113 }
│ │ │ │ + │ │ │ │ +
88 {
│ │ │ │ +
89 subPreBasis_.initializeIndices();
│ │ │ │ +
90 }
│ │ │ │ +
91
│ │ │ │ +
93 const GridView& gridView() const
│ │ │ │ +
94 {
│ │ │ │ +
95 return subPreBasis_.gridView();
│ │ │ │ +
96 }
│ │ │ │ +
97
│ │ │ │ +
99 void update(const GridView& gv)
│ │ │ │ +
100 {
│ │ │ │ +
101 subPreBasis_.update(gv);
│ │ │ │ +
102 }
│ │ │ │ +
103
│ │ │ │ + │ │ │ │ +
108 {
│ │ │ │ +
109 auto node = Node{};
│ │ │ │ +
110 for (std::size_t i=0; i<children; ++i)
│ │ │ │ +
111 node.setChild(i, subPreBasis_.makeNode());
│ │ │ │ +
112 return node;
│ │ │ │ +
113 }
│ │ │ │
114
│ │ │ │ -
124 Range operator()(const LocalDomain& x) const
│ │ │ │ -
125 {
│ │ │ │ -
126 auto&& re = Dune::referenceElement(*geometry_);
│ │ │ │ -
127 // Compute reference normal of closest face to given point
│ │ │ │ -
128 auto face = Impl::closestFaceIndex(re, x);
│ │ │ │ -
129 auto localNormal = re.integrationOuterNormal(face);
│ │ │ │ + │ │ │ │ +
117 {
│ │ │ │ +
118 return size(Dune::ReservedVector<size_type, multiIndexBufferSize>{});
│ │ │ │ +
119 }
│ │ │ │ +
120
│ │ │ │ +
122
│ │ │ │ +
123 template<class SizePrefix>
│ │ │ │ +
124 size_type size(const SizePrefix& prefix) const
│ │ │ │ +
125 {
│ │ │ │ +
126 return size(prefix, IndexMergingStrategy{});
│ │ │ │ +
127 }
│ │ │ │ +
128
│ │ │ │ +
129private:
│ │ │ │
130
│ │ │ │ -
131 // Transform reference normal into global unit outer normal using
│ │ │ │ -
132 // covariant Piola transformation
│ │ │ │ -
133 auto normal = Range{};
│ │ │ │ -
134 geometry_->jacobianInverseTransposed(x).mv(localNormal, normal);
│ │ │ │ -
135 normal /= normal.two_norm();
│ │ │ │ -
136 return normal;
│ │ │ │ -
137 }
│ │ │ │ -
138
│ │ │ │ -
140 const Element& localContext() const
│ │ │ │ -
141 {
│ │ │ │ -
142 return element_;
│ │ │ │ -
143 }
│ │ │ │ -
144
│ │ │ │ -
146 friend typename Traits::LocalFunctionTraits::DerivativeInterface derivative(const LocalFunction& t)
│ │ │ │ -
147 {
│ │ │ │ -
148 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │ -
149 }
│ │ │ │ -
150
│ │ │ │ -
151 private:
│ │ │ │ -
152 std::optional<Geometry> geometry_;
│ │ │ │ -
153 Element element_;
│ │ │ │ -
154 };
│ │ │ │ -
155
│ │ │ │ -
156public:
│ │ │ │ - │ │ │ │ -
159 entitySet_(gridView)
│ │ │ │ -
160 {}
│ │ │ │ -
161
│ │ │ │ -
163 Range operator()(const Domain& x) const
│ │ │ │ -
164 {
│ │ │ │ -
165 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │ -
166 }
│ │ │ │ -
167
│ │ │ │ - │ │ │ │ -
170 {
│ │ │ │ -
171 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │ -
172 }
│ │ │ │ -
173
│ │ │ │ -
175 friend LocalFunction localFunction(const FaceNormalGridFunction& t)
│ │ │ │ -
176 {
│ │ │ │ -
177 return LocalFunction{};
│ │ │ │ -
178 }
│ │ │ │ -
179
│ │ │ │ -
181 const EntitySet& entitySet() const
│ │ │ │ -
182 {
│ │ │ │ -
183 return entitySet_;
│ │ │ │ -
184 }
│ │ │ │ -
185
│ │ │ │ -
186private:
│ │ │ │ -
187 EntitySet entitySet_;
│ │ │ │ -
188};
│ │ │ │ +
131 template<class SizePrefix>
│ │ │ │ +
132 size_type size(const SizePrefix& prefix, BasisFactory::FlatInterleaved) const
│ │ │ │ +
133 {
│ │ │ │ +
134 // The root index size is the root index size of a single subnode
│ │ │ │ +
135 // multiplied by the number of subnodes because we enumerate all
│ │ │ │ +
136 // child indices in a row.
│ │ │ │ +
137 if (prefix.size() == 0)
│ │ │ │ +
138 return children*subPreBasis_.size();
│ │ │ │ +
139
│ │ │ │ +
140 // The first prefix entry refers to one of the (root index size)
│ │ │ │ +
141 // subindex trees. Hence we have to first compute the corresponding
│ │ │ │ +
142 // prefix entry for a single subnode subnode. The we can append
│ │ │ │ +
143 // the other prefix entries unmodified, because the index tree
│ │ │ │ +
144 // looks the same after the first level.
│ │ │ │ +
145 SizePrefix subPrefix;
│ │ │ │ +
146 subPrefix.push_back(prefix[0] / children);
│ │ │ │ +
147 for(std::size_t i=1; i<prefix.size(); ++i)
│ │ │ │ +
148 subPrefix.push_back(prefix[i]);
│ │ │ │ +
149 return subPreBasis_.size(subPrefix);
│ │ │ │ +
150 }
│ │ │ │ +
151
│ │ │ │ +
152 template<class SizePrefix>
│ │ │ │ +
153 size_type size(const SizePrefix& prefix, BasisFactory::FlatLexicographic) const
│ │ │ │ +
154 {
│ │ │ │ +
155 // The size at the index tree root is the size of at the index tree
│ │ │ │ +
156 // root of a single subnode multiplied by the number of subnodes
│ │ │ │ +
157 // because we enumerate all child indices in a row.
│ │ │ │ +
158 if (prefix.size() == 0)
│ │ │ │ +
159 return children*subPreBasis_.size();
│ │ │ │ +
160
│ │ │ │ +
161 // The first prefix entry refers to one of the (root index size)
│ │ │ │ +
162 // subindex trees. Hence we have to first compute the corresponding
│ │ │ │ +
163 // prefix entry for a single subnode subnode. The we can append
│ │ │ │ +
164 // the other prefix entries unmodified, because the index tree
│ │ │ │ +
165 // looks the same after the first level.
│ │ │ │ +
166 SizePrefix subPrefix;
│ │ │ │ +
167 subPrefix.push_back(prefix[0] % children);
│ │ │ │ +
168 for(std::size_t i=1; i<prefix.size(); ++i)
│ │ │ │ +
169 subPrefix.push_back(prefix[i]);
│ │ │ │ +
170 return subPreBasis_.size(subPrefix);
│ │ │ │ +
171 }
│ │ │ │ +
172
│ │ │ │ +
173 template<class SizePrefix>
│ │ │ │ +
174 size_type size(const SizePrefix& prefix, BasisFactory::BlockedLexicographic) const
│ │ │ │ +
175 {
│ │ │ │ +
176 if (prefix.size() == 0)
│ │ │ │ +
177 return children;
│ │ │ │ +
178 SizePrefix subPrefix;
│ │ │ │ +
179 for(std::size_t i=1; i<prefix.size(); ++i)
│ │ │ │ +
180 subPrefix.push_back(prefix[i]);
│ │ │ │ +
181 return subPreBasis_.size(subPrefix);
│ │ │ │ +
182 }
│ │ │ │ +
183
│ │ │ │ +
184 template<class SizePrefix>
│ │ │ │ +
185 size_type size(const SizePrefix& prefix, BasisFactory::BlockedInterleaved) const
│ │ │ │ +
186 {
│ │ │ │ +
187 if (prefix.size() == 0)
│ │ │ │ +
188 return subPreBasis_.size();
│ │ │ │
189
│ │ │ │ -
190
│ │ │ │ -
191
│ │ │ │ -
192} // namespace Dune::Functions
│ │ │ │ +
190 SizePrefix subPrefix;
│ │ │ │ +
191 for(std::size_t i=0; i<prefix.size()-1; ++i)
│ │ │ │ +
192 subPrefix.push_back(prefix[i]);
│ │ │ │
193
│ │ │ │ -
194#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_FACENORMALGRIDFUNCTION_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ -
Definition: polynomial.hh:11
│ │ │ │ -
Default implementation for derivative traits.
Definition: defaultderivativetraits.hh:37
│ │ │ │ -
Grid function implementing the piecewise element face normal.
Definition: facenormalgridfunction.hh:66
│ │ │ │ -
GridViewEntitySet< GridView, 0 > EntitySet
Definition: facenormalgridfunction.hh:69
│ │ │ │ -
typename EntitySet::LocalCoordinate LocalDomain
Definition: facenormalgridfunction.hh:72
│ │ │ │ -
typename EntitySet::GlobalCoordinate Domain
Definition: facenormalgridfunction.hh:73
│ │ │ │ -
typename EntitySet::GlobalCoordinate Range
Definition: facenormalgridfunction.hh:74
│ │ │ │ -
const EntitySet & entitySet() const
Return the stored GridViewEntitySet.
Definition: facenormalgridfunction.hh:181
│ │ │ │ -
friend Traits::DerivativeInterface derivative(const FaceNormalGridFunction &t)
Not implemented.
Definition: facenormalgridfunction.hh:169
│ │ │ │ -
GV GridView
Definition: facenormalgridfunction.hh:68
│ │ │ │ -
friend LocalFunction localFunction(const FaceNormalGridFunction &t)
Return a local-function associated to FaceNormalGridFunction.
Definition: facenormalgridfunction.hh:175
│ │ │ │ -
FaceNormalGridFunction(const GridView &gridView)
Construct the FaceNormalGridFunction.
Definition: facenormalgridfunction.hh:158
│ │ │ │ -
typename EntitySet::Element Element
Definition: facenormalgridfunction.hh:70
│ │ │ │ -
Range operator()(const Domain &x) const
Not implemented.
Definition: facenormalgridfunction.hh:163
│ │ │ │ -
Definition: gridfunction.hh:32
│ │ │ │ - │ │ │ │ -
GridView::template Codim< codim >::Entity Element
Type of Elements contained in this EntitySet.
Definition: gridviewentityset.hh:32
│ │ │ │ -
Element::Geometry::LocalCoordinate LocalCoordinate
Type of local coordinates with respect to the Element.
Definition: gridviewentityset.hh:35
│ │ │ │ -
Element::Geometry::GlobalCoordinate GlobalCoordinate
Definition: gridviewentityset.hh:36
│ │ │ │ +
194 size_type r = subPreBasis_.size(subPrefix);
│ │ │ │ +
195 if (r==0)
│ │ │ │ +
196 return 0;
│ │ │ │ +
197 subPrefix.push_back(prefix.back());
│ │ │ │ +
198 r = subPreBasis_.size(subPrefix);
│ │ │ │ +
199 if (r==0)
│ │ │ │ +
200 return children;
│ │ │ │ +
201 return r;
│ │ │ │ +
202 }
│ │ │ │ +
203
│ │ │ │ +
204public:
│ │ │ │ +
205
│ │ │ │ + │ │ │ │ +
208 {
│ │ │ │ +
209 return subPreBasis_.dimension() * children;
│ │ │ │ +
210 }
│ │ │ │ +
211
│ │ │ │ + │ │ │ │ +
214 {
│ │ │ │ +
215 return subPreBasis_.maxNodeSize() * children;
│ │ │ │ +
216 }
│ │ │ │ +
217
│ │ │ │ + │ │ │ │ +
220 {
│ │ │ │ +
221 return subPreBasis_;
│ │ │ │ +
222 }
│ │ │ │ +
223
│ │ │ │ + │ │ │ │ +
226 {
│ │ │ │ +
227 return subPreBasis_;
│ │ │ │ +
228 }
│ │ │ │ +
229
│ │ │ │ +
231 template<typename It>
│ │ │ │ +
232 It indices(const Node& node, It it) const
│ │ │ │ +
233 {
│ │ │ │ +
234 return indices(node, it, IndexMergingStrategy{});
│ │ │ │ +
235 }
│ │ │ │ +
236
│ │ │ │ +
237private:
│ │ │ │ +
238
│ │ │ │ +
239 template<typename It>
│ │ │ │ +
240 It indices(const Node& node, It multiIndices, BasisFactory::FlatInterleaved) const
│ │ │ │ +
241 {
│ │ │ │ +
242 using namespace Dune::Indices;
│ │ │ │ +
243 size_type subTreeSize = node.child(_0).size();
│ │ │ │ +
244 // Fill indices for first child at the beginning.
│ │ │ │ +
245 auto next = subPreBasis().indices(node.child(_0), multiIndices);
│ │ │ │ +
246 // Multiply first component of all indices for first child by
│ │ │ │ +
247 // number of children to stretch the index range for interleaving.
│ │ │ │ +
248 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ +
249 multiIndices[i][0] *= children;
│ │ │ │ +
250 for (std::size_t child = 1; child<children; ++child)
│ │ │ │ +
251 {
│ │ │ │ +
252 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ +
253 {
│ │ │ │ +
254 // Copy indices from first child for all other children
│ │ │ │ +
255 // and shift them by child index to interleave indices.
│ │ │ │ +
256 // multiIndices[child*subTreeSize+i] = multiIndices[i];
│ │ │ │ +
257 // multiIndices[child*subTreeSize+i][0] = multiIndices[i][0]+child;
│ │ │ │ +
258 (*next) = multiIndices[i];
│ │ │ │ +
259 (*next)[0] = multiIndices[i][0]+child;
│ │ │ │ +
260 ++next;
│ │ │ │ +
261 }
│ │ │ │ +
262 }
│ │ │ │ +
263 return next;
│ │ │ │ +
264 }
│ │ │ │ +
265
│ │ │ │ +
266 template<typename It>
│ │ │ │ +
267 It indices(const Node& node, It multiIndices, BasisFactory::FlatLexicographic) const
│ │ │ │ +
268 {
│ │ │ │ +
269 using namespace Dune::Indices;
│ │ │ │ +
270 size_type subTreeSize = node.child(_0).size();
│ │ │ │ +
271 size_type firstIndexEntrySize = subPreBasis().size();
│ │ │ │ +
272 // Fill indices for first child at the beginning.
│ │ │ │ +
273 auto next = subPreBasis().indices(node.child(_0), multiIndices);
│ │ │ │ +
274 for (std::size_t child = 1; child<children; ++child)
│ │ │ │ +
275 {
│ │ │ │ +
276 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ +
277 {
│ │ │ │ +
278 // Copy indices from first child for all other children
│ │ │ │ +
279 // and shift them by suitable offset to get lexicographic indices.
│ │ │ │ +
280 // multiIndices[child*subTreeSize+i] = multiIndices[i];
│ │ │ │ +
281 // multiIndices[child*subTreeSize+i][0] += child*firstIndexEntrySize;
│ │ │ │ +
282 (*next) = multiIndices[i];
│ │ │ │ +
283 (*next)[0] += child*firstIndexEntrySize;
│ │ │ │ +
284 ++next;
│ │ │ │ +
285 }
│ │ │ │ +
286 }
│ │ │ │ +
287 return next;
│ │ │ │ +
288 }
│ │ │ │ +
289
│ │ │ │ +
290 template<class MultiIndex>
│ │ │ │ +
291 static void multiIndexPushFront(MultiIndex& M, size_type M0)
│ │ │ │ +
292 {
│ │ │ │ +
293 M.resize(M.size()+1);
│ │ │ │ +
294 for(std::size_t i=M.size()-1; i>0; --i)
│ │ │ │ +
295 M[i] = M[i-1];
│ │ │ │ +
296 M[0] = M0;
│ │ │ │ +
297 }
│ │ │ │ +
298
│ │ │ │ +
299 template<typename It>
│ │ │ │ +
300 It indices(const Node& node, It multiIndices, BasisFactory::BlockedLexicographic) const
│ │ │ │ +
301 {
│ │ │ │ +
302 using namespace Dune::Indices;
│ │ │ │ +
303 size_type subTreeSize = node.child(_0).size();
│ │ │ │ +
304 // Fill indices for first child at the beginning.
│ │ │ │ +
305 auto next = subPreBasis().indices(node.child(_0), multiIndices);
│ │ │ │ +
306 // Insert 0 before first component of all indices for first child.
│ │ │ │ +
307 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ +
308 multiIndexPushFront(multiIndices[i], 0);
│ │ │ │ +
309 for (std::size_t child = 1; child<children; ++child)
│ │ │ │ +
310 {
│ │ │ │ +
311 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ +
312 {
│ │ │ │ +
313 // Copy indices from first child for all other children and overwrite
│ │ │ │ +
314 // zero in first component as inserted above by child index.
│ │ │ │ +
315 // multiIndices[child*subTreeSize+i] = multiIndices[i];
│ │ │ │ +
316 // multiIndices[child*subTreeSize+i][0] = child;
│ │ │ │ +
317 (*next) = multiIndices[i];
│ │ │ │ +
318 (*next)[0] = child;
│ │ │ │ +
319 ++next;
│ │ │ │ +
320 }
│ │ │ │ +
321 }
│ │ │ │ +
322 return next;
│ │ │ │ +
323 }
│ │ │ │ +
324
│ │ │ │ +
325 template<typename It>
│ │ │ │ +
326 It indices(const Node& node, It multiIndices, BasisFactory::BlockedInterleaved) const
│ │ │ │ +
327 {
│ │ │ │ +
328 using namespace Dune::Indices;
│ │ │ │ +
329 size_type subTreeSize = node.child(_0).size();
│ │ │ │ +
330 // Fill indices for first child at the beginning.
│ │ │ │ +
331 auto next = subPreBasis().indices(node.child(_0), multiIndices);
│ │ │ │ +
332 // Append 0 after last component of all indices for first child.
│ │ │ │ +
333 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ +
334 multiIndices[i].push_back(0);
│ │ │ │ +
335 for (std::size_t child = 1; child<children; ++child)
│ │ │ │ +
336 {
│ │ │ │ +
337 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ +
338 {
│ │ │ │ +
339 // Copy indices from first child for all other children and overwrite
│ │ │ │ +
340 // zero in last component as appended above by child index.
│ │ │ │ +
341 (*next) = multiIndices[i];
│ │ │ │ +
342 (*next).back() = child;
│ │ │ │ +
343 ++next;
│ │ │ │ +
344 }
│ │ │ │ +
345 }
│ │ │ │ +
346 return next;
│ │ │ │ +
347 }
│ │ │ │ +
348
│ │ │ │ +
349 SubPreBasis subPreBasis_;
│ │ │ │ +
350};
│ │ │ │ +
351
│ │ │ │ +
352
│ │ │ │ +
353
│ │ │ │ +
354namespace BasisFactory {
│ │ │ │ +
355
│ │ │ │ +
368template<std::size_t k, class ChildPreBasisFactory, class IndexMergingStrategy>
│ │ │ │ +
369auto power(ChildPreBasisFactory&& childPreBasisFactory, const IndexMergingStrategy&)
│ │ │ │ +
370{
│ │ │ │ +
371 return [childPreBasisFactory](const auto& gridView) {
│ │ │ │ +
372 auto childPreBasis = childPreBasisFactory(gridView);
│ │ │ │ + │ │ │ │ +
374 };
│ │ │ │ +
375}
│ │ │ │ +
376
│ │ │ │ +
387template<std::size_t k, class ChildPreBasisFactory>
│ │ │ │ +
388auto power(ChildPreBasisFactory&& childPreBasisFactory)
│ │ │ │ +
389{
│ │ │ │ +
390 return [childPreBasisFactory](const auto& gridView) {
│ │ │ │ +
391 auto childPreBasis = childPreBasisFactory(gridView);
│ │ │ │ + │ │ │ │ +
393 };
│ │ │ │ +
394}
│ │ │ │ +
395
│ │ │ │ +
396} // end namespace BasisFactory
│ │ │ │ +
397
│ │ │ │ +
398// Backward compatibility
│ │ │ │ +
399namespace BasisBuilder {
│ │ │ │ +
400
│ │ │ │ +
401 using namespace BasisFactory;
│ │ │ │ +
402
│ │ │ │ +
403}
│ │ │ │ +
404
│ │ │ │ +
405
│ │ │ │ +
406} // end namespace Functions
│ │ │ │ +
407} // end namespace Dune
│ │ │ │ +
408
│ │ │ │ +
409
│ │ │ │ +
410#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_POWERBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
auto power(ChildPreBasisFactory &&childPreBasisFactory)
Create a factory builder that can build a PowerPreBasis.
Definition: powerbasis.hh:388
│ │ │ │ +
typename std::enable_if< std::is_constructible< T, Args... >::value, int >::type enableIfConstructible
Helper to constrain forwarding constructors.
Definition: type_traits.hh:26
│ │ │ │ +
Definition: polynomial.hh:10
│ │ │ │ +
Base class for index merging strategies to simplify detection.
Definition: basistags.hh:44
│ │ │ │ +
Interleaved merging of direct children without blocking.
Definition: basistags.hh:114
│ │ │ │ +
Definition: nodes.hh:193
│ │ │ │ +
A pre-basis for power bases.
Definition: powerbasis.hh:45
│ │ │ │ +
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition: powerbasis.hh:207
│ │ │ │ +
std::size_t size_type
Type used for indices and size information.
Definition: powerbasis.hh:58
│ │ │ │ +
IMS IndexMergingStrategy
Strategy used to merge the global indices of the child factories.
Definition: powerbasis.hh:61
│ │ │ │ +
PowerBasisNode< SubNode, children > Node
Template mapping root tree path to type of created tree node.
Definition: powerbasis.hh:66
│ │ │ │ +
typename SPB::GridView GridView
The grid view that the FE basis is defined on.
Definition: powerbasis.hh:55
│ │ │ │ +
static constexpr size_type multiIndexBufferSize
Definition: powerbasis.hh:70
│ │ │ │ +
SPB SubPreBasis
The child pre-basis.
Definition: powerbasis.hh:52
│ │ │ │ +
typename SubPreBasis::Node SubNode
Definition: powerbasis.hh:63
│ │ │ │ +
void initializeIndices()
Initialize the global indices.
Definition: powerbasis.hh:87
│ │ │ │ +
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition: powerbasis.hh:99
│ │ │ │ +
It indices(const Node &node, It it) const
Maps from subtree index set [0..size-1] to a globally unique multi index in global basis.
Definition: powerbasis.hh:232
│ │ │ │ +
PowerPreBasis(SFArgs &&... sfArgs)
Constructor for given child pre-basis objects.
Definition: powerbasis.hh:80
│ │ │ │ +
size_type size() const
Same as size(prefix) with empty prefix.
Definition: powerbasis.hh:116
│ │ │ │ +
SubPreBasis & subPreBasis()
Mutable access to the stored prebasis of the factor in the power space.
Definition: powerbasis.hh:225
│ │ │ │ +
Node makeNode() const
Create tree node.
Definition: powerbasis.hh:107
│ │ │ │ +
static constexpr size_type maxMultiIndexSize
Definition: powerbasis.hh:68
│ │ │ │ +
static constexpr size_type minMultiIndexSize
Definition: powerbasis.hh:69
│ │ │ │ +
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition: powerbasis.hh:213
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: powerbasis.hh:93
│ │ │ │ +
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition: powerbasis.hh:124
│ │ │ │ +
const SubPreBasis & subPreBasis() const
Const access to the stored prebasis of the factor in the power space.
Definition: powerbasis.hh:219
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,231 +4,498 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * gridfunctions │ │ │ │ │ -facenormalgridfunction.hh │ │ │ │ │ + * functionspacebases │ │ │ │ │ +powerbasis.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#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_FACENORMALGRIDFUNCTION_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_FACENORMALGRIDFUNCTION_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_POWERBASIS_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_POWERBASIS_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ - 8 │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13 │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8#include │ │ │ │ │ + 9 │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14#include │ │ │ │ │ + 15#include │ │ │ │ │ 16 │ │ │ │ │ 17 │ │ │ │ │ - 18namespace Dune::Functions { │ │ │ │ │ - 19 │ │ │ │ │ - 20namespace Impl { │ │ │ │ │ + 18 │ │ │ │ │ + 19namespace Dune { │ │ │ │ │ + 20namespace Functions { │ │ │ │ │ 21 │ │ │ │ │ - 22// Compute closest face to point │ │ │ │ │ - 23template │ │ │ │ │ - 24auto closestFaceIndex(const ReferenceElement& re, const Coordinate& x) │ │ │ │ │ - 25{ │ │ │ │ │ - 26 auto closestFaceIndex = decltype(re.subEntity(0,1,0,1)){}; │ │ │ │ │ - 27 double closestFaceDistance = std::numeric_limits::max(); │ │ │ │ │ - 28 for(auto&& faceIndex : Dune::range(re.size(1))) │ │ │ │ │ - 29 { │ │ │ │ │ - 30 // For a face unit outer normal consider the orthogonal projection │ │ │ │ │ - 31 // Px = x + *n into the face. Then the distance to the face │ │ │ │ │ - 32 // is given by |x-Px| = |||n| = . │ │ │ │ │ - 33 auto normal = re.integrationOuterNormal(faceIndex); │ │ │ │ │ - 34 normal /= normal.two_norm(); │ │ │ │ │ - 35 auto c = re.position(faceIndex,1); │ │ │ │ │ - 36 c -= x; │ │ │ │ │ - 37 auto faceDistance = (c*normal); │ │ │ │ │ - 38 if (faceDistance │ │ │ │ │ +44class PowerPreBasis │ │ │ │ │ + 45{ │ │ │ │ │ + 46 static const std::size_t children = C; │ │ │ │ │ + 47 static const bool isBlocked = std::is_same_v or std::is_same_v; │ │ │ │ │ 48 │ │ │ │ │ - 49 │ │ │ │ │ + 49public: │ │ │ │ │ 50 │ │ │ │ │ - 51 │ │ │ │ │ - 64template │ │ │ │ │ -65class FaceNormalGridFunction │ │ │ │ │ - 66{ │ │ │ │ │ - 67public: │ │ │ │ │ -68 using GridView = GV; │ │ │ │ │ -69 using EntitySet = GridViewEntitySet; │ │ │ │ │ -70 using Element = typename EntitySet::Element; │ │ │ │ │ +52 using SubPreBasis = SPB; │ │ │ │ │ + 53 │ │ │ │ │ +55 using GridView = typename SPB::GridView; │ │ │ │ │ + 56 │ │ │ │ │ +58 using size_type = std::size_t; │ │ │ │ │ + 59 │ │ │ │ │ +61 using IndexMergingStrategy = IMS; │ │ │ │ │ + 62 │ │ │ │ │ +63 using SubNode = typename SubPreBasis::Node; │ │ │ │ │ + 64 │ │ │ │ │ +66 using Node = PowerBasisNode; │ │ │ │ │ + 67 │ │ │ │ │ +68 static constexpr size_type maxMultiIndexSize = SubPreBasis:: │ │ │ │ │ +maxMultiIndexSize + isBlocked; │ │ │ │ │ +69 static constexpr size_type minMultiIndexSize = SubPreBasis:: │ │ │ │ │ +minMultiIndexSize + isBlocked; │ │ │ │ │ +70 static constexpr size_type multiIndexBufferSize = SubPreBasis:: │ │ │ │ │ +multiIndexBufferSize + isBlocked; │ │ │ │ │ 71 │ │ │ │ │ -72 using LocalDomain = typename EntitySet::LocalCoordinate; │ │ │ │ │ -73 using Domain = typename EntitySet::GlobalCoordinate; │ │ │ │ │ -74 using Range = typename EntitySet::GlobalCoordinate; │ │ │ │ │ - 75 │ │ │ │ │ - 76private: │ │ │ │ │ - 77 │ │ │ │ │ - 78 using Traits = Imp::GridFunctionTraits; │ │ │ │ │ - 79 │ │ │ │ │ - 80 class LocalFunction │ │ │ │ │ - 81 { │ │ │ │ │ - 82 using Geometry = typename Element::Geometry; │ │ │ │ │ - 83 static const int dimension = GV::dimension; │ │ │ │ │ - 84 public: │ │ │ │ │ + 77 template = 0, │ │ │ │ │ + 79 enableIfConstructible = 0> │ │ │ │ │ +80 PowerPreBasis(SFArgs&&... sfArgs) : │ │ │ │ │ + 81 subPreBasis_(std::forward(sfArgs)...) │ │ │ │ │ + 82 { │ │ │ │ │ + 83 static_assert(models, SubPreBasis>(), │ │ │ │ │ +"Subprebasis passed to PowerPreBasis does not model the PreBasis concept."); │ │ │ │ │ + 84 } │ │ │ │ │ 85 │ │ │ │ │ - 97 void bind(const Element& element) │ │ │ │ │ - 98 { │ │ │ │ │ - 99 element_ = element; │ │ │ │ │ - 100 geometry_.emplace(element_.geometry()); │ │ │ │ │ - 101 } │ │ │ │ │ - 102 │ │ │ │ │ - 103 void unbind() │ │ │ │ │ - 104 { │ │ │ │ │ - 105 geometry_.reset(); │ │ │ │ │ - 106 } │ │ │ │ │ - 107 │ │ │ │ │ - 110 bool bound() const │ │ │ │ │ - 111 { │ │ │ │ │ - 112 return static_cast(geometry_); │ │ │ │ │ +87 void initializeIndices() │ │ │ │ │ + 88 { │ │ │ │ │ + 89 subPreBasis_.initializeIndices(); │ │ │ │ │ + 90 } │ │ │ │ │ + 91 │ │ │ │ │ +93 const GridView& gridView() const │ │ │ │ │ + 94 { │ │ │ │ │ + 95 return subPreBasis_.gridView(); │ │ │ │ │ + 96 } │ │ │ │ │ + 97 │ │ │ │ │ +99 void update(const GridView& gv) │ │ │ │ │ + 100 { │ │ │ │ │ + 101 subPreBasis_.update(gv); │ │ │ │ │ + 102 } │ │ │ │ │ + 103 │ │ │ │ │ +107 Node makeNode() const │ │ │ │ │ + 108 { │ │ │ │ │ + 109 auto node = Node{}; │ │ │ │ │ + 110 for (std::size_t i=0; i{}); │ │ │ │ │ + 119 } │ │ │ │ │ + 120 │ │ │ │ │ + 122 │ │ │ │ │ + 123 template │ │ │ │ │ +124 size_type size(const SizePrefix& prefix) const │ │ │ │ │ 125 { │ │ │ │ │ - 126 auto&& re = Dune::referenceElement(*geometry_); │ │ │ │ │ - 127 // Compute reference normal of closest face to given point │ │ │ │ │ - 128 auto face = Impl::closestFaceIndex(re, x); │ │ │ │ │ - 129 auto localNormal = re.integrationOuterNormal(face); │ │ │ │ │ + 126 return size(prefix, IndexMergingStrategy{}); │ │ │ │ │ + 127 } │ │ │ │ │ + 128 │ │ │ │ │ + 129private: │ │ │ │ │ 130 │ │ │ │ │ - 131 // Transform reference normal into global unit outer normal using │ │ │ │ │ - 132 // covariant Piola transformation │ │ │ │ │ - 133 auto normal = Range{}; │ │ │ │ │ - 134 geometry_->jacobianInverseTransposed(x).mv(localNormal, normal); │ │ │ │ │ - 135 normal /= normal.two_norm(); │ │ │ │ │ - 136 return normal; │ │ │ │ │ - 137 } │ │ │ │ │ - 138 │ │ │ │ │ - 140 const Element& localContext() const │ │ │ │ │ - 141 { │ │ │ │ │ - 142 return element_; │ │ │ │ │ - 143 } │ │ │ │ │ - 144 │ │ │ │ │ - 146 friend typename Traits::LocalFunctionTraits::DerivativeInterface │ │ │ │ │ -derivative(const LocalFunction& t) │ │ │ │ │ - 147 { │ │ │ │ │ - 148 DUNE_THROW(NotImplemented,"not implemented"); │ │ │ │ │ - 149 } │ │ │ │ │ - 150 │ │ │ │ │ - 151 private: │ │ │ │ │ - 152 std::optional geometry_; │ │ │ │ │ - 153 Element element_; │ │ │ │ │ - 154 }; │ │ │ │ │ - 155 │ │ │ │ │ - 156public: │ │ │ │ │ -158 FaceNormalGridFunction(const GridView& gridView) : │ │ │ │ │ - 159 entitySet_(gridView) │ │ │ │ │ - 160 {} │ │ │ │ │ - 161 │ │ │ │ │ -163 Range operator()(const Domain& x) const │ │ │ │ │ - 164 { │ │ │ │ │ - 165 DUNE_THROW(NotImplemented,"not implemented"); │ │ │ │ │ - 166 } │ │ │ │ │ - 167 │ │ │ │ │ -169 friend typename Traits::DerivativeInterface derivative(const │ │ │ │ │ -FaceNormalGridFunction& t) │ │ │ │ │ - 170 { │ │ │ │ │ - 171 DUNE_THROW(NotImplemented,"not implemented"); │ │ │ │ │ - 172 } │ │ │ │ │ - 173 │ │ │ │ │ -175 friend LocalFunction localFunction(const FaceNormalGridFunction& t) │ │ │ │ │ - 176 { │ │ │ │ │ - 177 return LocalFunction{}; │ │ │ │ │ - 178 } │ │ │ │ │ - 179 │ │ │ │ │ -181 const EntitySet& entitySet() const │ │ │ │ │ - 182 { │ │ │ │ │ - 183 return entitySet_; │ │ │ │ │ - 184 } │ │ │ │ │ - 185 │ │ │ │ │ - 186private: │ │ │ │ │ - 187 EntitySet entitySet_; │ │ │ │ │ - 188}; │ │ │ │ │ + 131 template │ │ │ │ │ + 132 size_type size(const SizePrefix& prefix, BasisFactory::FlatInterleaved) │ │ │ │ │ +const │ │ │ │ │ + 133 { │ │ │ │ │ + 134 // The root index size is the root index size of a single subnode │ │ │ │ │ + 135 // multiplied by the number of subnodes because we enumerate all │ │ │ │ │ + 136 // child indices in a row. │ │ │ │ │ + 137 if (prefix.size() == 0) │ │ │ │ │ + 138 return children*subPreBasis_.size(); │ │ │ │ │ + 139 │ │ │ │ │ + 140 // The first prefix entry refers to one of the (root index size) │ │ │ │ │ + 141 // subindex trees. Hence we have to first compute the corresponding │ │ │ │ │ + 142 // prefix entry for a single subnode subnode. The we can append │ │ │ │ │ + 143 // the other prefix entries unmodified, because the index tree │ │ │ │ │ + 144 // looks the same after the first level. │ │ │ │ │ + 145 SizePrefix subPrefix; │ │ │ │ │ + 146 subPrefix.push_back(prefix[0] / children); │ │ │ │ │ + 147 for(std::size_t i=1; i │ │ │ │ │ + 153 size_type size(const SizePrefix& prefix, BasisFactory::FlatLexicographic) │ │ │ │ │ +const │ │ │ │ │ + 154 { │ │ │ │ │ + 155 // The size at the index tree root is the size of at the index tree │ │ │ │ │ + 156 // root of a single subnode multiplied by the number of subnodes │ │ │ │ │ + 157 // because we enumerate all child indices in a row. │ │ │ │ │ + 158 if (prefix.size() == 0) │ │ │ │ │ + 159 return children*subPreBasis_.size(); │ │ │ │ │ + 160 │ │ │ │ │ + 161 // The first prefix entry refers to one of the (root index size) │ │ │ │ │ + 162 // subindex trees. Hence we have to first compute the corresponding │ │ │ │ │ + 163 // prefix entry for a single subnode subnode. The we can append │ │ │ │ │ + 164 // the other prefix entries unmodified, because the index tree │ │ │ │ │ + 165 // looks the same after the first level. │ │ │ │ │ + 166 SizePrefix subPrefix; │ │ │ │ │ + 167 subPrefix.push_back(prefix[0] % children); │ │ │ │ │ + 168 for(std::size_t i=1; i │ │ │ │ │ + 174 size_type size(const SizePrefix& prefix, BasisFactory:: │ │ │ │ │ +BlockedLexicographic) const │ │ │ │ │ + 175 { │ │ │ │ │ + 176 if (prefix.size() == 0) │ │ │ │ │ + 177 return children; │ │ │ │ │ + 178 SizePrefix subPrefix; │ │ │ │ │ + 179 for(std::size_t i=1; i │ │ │ │ │ + 185 size_type size(const SizePrefix& prefix, BasisFactory::BlockedInterleaved) │ │ │ │ │ +const │ │ │ │ │ + 186 { │ │ │ │ │ + 187 if (prefix.size() == 0) │ │ │ │ │ + 188 return subPreBasis_.size(); │ │ │ │ │ 189 │ │ │ │ │ - 190 │ │ │ │ │ - 191 │ │ │ │ │ - 192} // namespace Dune::Functions │ │ │ │ │ + 190 SizePrefix subPrefix; │ │ │ │ │ + 191 for(std::size_t i=0; i EntitySet │ │ │ │ │ -Definition: facenormalgridfunction.hh:69 │ │ │ │ │ -Dune::Functions::FaceNormalGridFunction::LocalDomain │ │ │ │ │ -typename EntitySet::LocalCoordinate LocalDomain │ │ │ │ │ -Definition: facenormalgridfunction.hh:72 │ │ │ │ │ -Dune::Functions::FaceNormalGridFunction::Domain │ │ │ │ │ -typename EntitySet::GlobalCoordinate Domain │ │ │ │ │ -Definition: facenormalgridfunction.hh:73 │ │ │ │ │ -Dune::Functions::FaceNormalGridFunction::Range │ │ │ │ │ -typename EntitySet::GlobalCoordinate Range │ │ │ │ │ -Definition: facenormalgridfunction.hh:74 │ │ │ │ │ -Dune::Functions::FaceNormalGridFunction::entitySet │ │ │ │ │ -const EntitySet & entitySet() const │ │ │ │ │ -Return the stored GridViewEntitySet. │ │ │ │ │ -Definition: facenormalgridfunction.hh:181 │ │ │ │ │ -Dune::Functions::FaceNormalGridFunction::derivative │ │ │ │ │ -friend Traits::DerivativeInterface derivative(const FaceNormalGridFunction &t) │ │ │ │ │ -Not implemented. │ │ │ │ │ -Definition: facenormalgridfunction.hh:169 │ │ │ │ │ -Dune::Functions::FaceNormalGridFunction::GridView │ │ │ │ │ -GV GridView │ │ │ │ │ -Definition: facenormalgridfunction.hh:68 │ │ │ │ │ -Dune::Functions::FaceNormalGridFunction::localFunction │ │ │ │ │ -friend LocalFunction localFunction(const FaceNormalGridFunction &t) │ │ │ │ │ -Return a local-function associated to FaceNormalGridFunction. │ │ │ │ │ -Definition: facenormalgridfunction.hh:175 │ │ │ │ │ -Dune::Functions::FaceNormalGridFunction::FaceNormalGridFunction │ │ │ │ │ -FaceNormalGridFunction(const GridView &gridView) │ │ │ │ │ -Construct the FaceNormalGridFunction. │ │ │ │ │ -Definition: facenormalgridfunction.hh:158 │ │ │ │ │ -Dune::Functions::FaceNormalGridFunction::Element │ │ │ │ │ -typename EntitySet::Element Element │ │ │ │ │ -Definition: facenormalgridfunction.hh:70 │ │ │ │ │ -Dune::Functions::FaceNormalGridFunction::operator() │ │ │ │ │ -Range operator()(const Domain &x) const │ │ │ │ │ -Not implemented. │ │ │ │ │ -Definition: facenormalgridfunction.hh:163 │ │ │ │ │ -Dune::Functions::GridFunction │ │ │ │ │ -Definition: gridfunction.hh:32 │ │ │ │ │ -Dune::Functions::GridViewEntitySet<_GridView,_0_> │ │ │ │ │ -Dune::Functions::GridViewEntitySet<_GridView,_0_>::Element │ │ │ │ │ -GridView::template Codim< codim >::Entity Element │ │ │ │ │ -Type of Elements contained in this EntitySet. │ │ │ │ │ -Definition: gridviewentityset.hh:32 │ │ │ │ │ -Dune::Functions::GridViewEntitySet<_GridView,_0_>::LocalCoordinate │ │ │ │ │ -Element::Geometry::LocalCoordinate LocalCoordinate │ │ │ │ │ -Type of local coordinates with respect to the Element. │ │ │ │ │ -Definition: gridviewentityset.hh:35 │ │ │ │ │ -Dune::Functions::GridViewEntitySet<_GridView,_0_>::GlobalCoordinate │ │ │ │ │ -Element::Geometry::GlobalCoordinate GlobalCoordinate │ │ │ │ │ -Definition: gridviewentityset.hh:36 │ │ │ │ │ + 194 size_type r = subPreBasis_.size(subPrefix); │ │ │ │ │ + 195 if (r==0) │ │ │ │ │ + 196 return 0; │ │ │ │ │ + 197 subPrefix.push_back(prefix.back()); │ │ │ │ │ + 198 r = subPreBasis_.size(subPrefix); │ │ │ │ │ + 199 if (r==0) │ │ │ │ │ + 200 return children; │ │ │ │ │ + 201 return r; │ │ │ │ │ + 202 } │ │ │ │ │ + 203 │ │ │ │ │ + 204public: │ │ │ │ │ + 205 │ │ │ │ │ +207 size_type dimension() const │ │ │ │ │ + 208 { │ │ │ │ │ + 209 return subPreBasis_.dimension() * children; │ │ │ │ │ + 210 } │ │ │ │ │ + 211 │ │ │ │ │ +213 size_type maxNodeSize() const │ │ │ │ │ + 214 { │ │ │ │ │ + 215 return subPreBasis_.maxNodeSize() * children; │ │ │ │ │ + 216 } │ │ │ │ │ + 217 │ │ │ │ │ +219 const SubPreBasis& subPreBasis() const │ │ │ │ │ + 220 { │ │ │ │ │ + 221 return subPreBasis_; │ │ │ │ │ + 222 } │ │ │ │ │ + 223 │ │ │ │ │ +225 SubPreBasis& subPreBasis() │ │ │ │ │ + 226 { │ │ │ │ │ + 227 return subPreBasis_; │ │ │ │ │ + 228 } │ │ │ │ │ + 229 │ │ │ │ │ + 231 template │ │ │ │ │ +232 It indices(const Node& node, It it) const │ │ │ │ │ + 233 { │ │ │ │ │ + 234 return indices(node, it, IndexMergingStrategy{}); │ │ │ │ │ + 235 } │ │ │ │ │ + 236 │ │ │ │ │ + 237private: │ │ │ │ │ + 238 │ │ │ │ │ + 239 template │ │ │ │ │ + 240 It indices(const Node& node, It multiIndices, BasisFactory:: │ │ │ │ │ +FlatInterleaved) const │ │ │ │ │ + 241 { │ │ │ │ │ + 242 using namespace Dune::Indices; │ │ │ │ │ + 243 size_type subTreeSize = node.child(_0).size(); │ │ │ │ │ + 244 // Fill indices for first child at the beginning. │ │ │ │ │ + 245 auto next = subPreBasis().indices(node.child(_0), multiIndices); │ │ │ │ │ + 246 // Multiply first component of all indices for first child by │ │ │ │ │ + 247 // number of children to stretch the index range for interleaving. │ │ │ │ │ + 248 for (std::size_t i = 0; i │ │ │ │ │ + 267 It indices(const Node& node, It multiIndices, BasisFactory:: │ │ │ │ │ +FlatLexicographic) const │ │ │ │ │ + 268 { │ │ │ │ │ + 269 using namespace Dune::Indices; │ │ │ │ │ + 270 size_type subTreeSize = node.child(_0).size(); │ │ │ │ │ + 271 size_type firstIndexEntrySize = subPreBasis().size(); │ │ │ │ │ + 272 // Fill indices for first child at the beginning. │ │ │ │ │ + 273 auto next = subPreBasis().indices(node.child(_0), multiIndices); │ │ │ │ │ + 274 for (std::size_t child = 1; child │ │ │ │ │ + 291 static void multiIndexPushFront(MultiIndex& M, size_type M0) │ │ │ │ │ + 292 { │ │ │ │ │ + 293 M.resize(M.size()+1); │ │ │ │ │ + 294 for(std::size_t i=M.size()-1; i>0; --i) │ │ │ │ │ + 295 M[i] = M[i-1]; │ │ │ │ │ + 296 M[0] = M0; │ │ │ │ │ + 297 } │ │ │ │ │ + 298 │ │ │ │ │ + 299 template │ │ │ │ │ + 300 It indices(const Node& node, It multiIndices, BasisFactory:: │ │ │ │ │ +BlockedLexicographic) const │ │ │ │ │ + 301 { │ │ │ │ │ + 302 using namespace Dune::Indices; │ │ │ │ │ + 303 size_type subTreeSize = node.child(_0).size(); │ │ │ │ │ + 304 // Fill indices for first child at the beginning. │ │ │ │ │ + 305 auto next = subPreBasis().indices(node.child(_0), multiIndices); │ │ │ │ │ + 306 // Insert 0 before first component of all indices for first child. │ │ │ │ │ + 307 for (std::size_t i = 0; i │ │ │ │ │ + 326 It indices(const Node& node, It multiIndices, BasisFactory:: │ │ │ │ │ +BlockedInterleaved) const │ │ │ │ │ + 327 { │ │ │ │ │ + 328 using namespace Dune::Indices; │ │ │ │ │ + 329 size_type subTreeSize = node.child(_0).size(); │ │ │ │ │ + 330 // Fill indices for first child at the beginning. │ │ │ │ │ + 331 auto next = subPreBasis().indices(node.child(_0), multiIndices); │ │ │ │ │ + 332 // Append 0 after last component of all indices for first child. │ │ │ │ │ + 333 for (std::size_t i = 0; i │ │ │ │ │ +369auto power(ChildPreBasisFactory&& childPreBasisFactory, const │ │ │ │ │ +IndexMergingStrategy&) │ │ │ │ │ + 370{ │ │ │ │ │ + 371 return [childPreBasisFactory](const auto& gridView) { │ │ │ │ │ + 372 auto childPreBasis = childPreBasisFactory(gridView); │ │ │ │ │ + 373 return PowerPreBasis │ │ │ │ │ +(std::move(childPreBasis)); │ │ │ │ │ + 374 }; │ │ │ │ │ + 375} │ │ │ │ │ + 376 │ │ │ │ │ + 387template │ │ │ │ │ +388auto power(ChildPreBasisFactory&& childPreBasisFactory) │ │ │ │ │ + 389{ │ │ │ │ │ + 390 return [childPreBasisFactory](const auto& gridView) { │ │ │ │ │ + 391 auto childPreBasis = childPreBasisFactory(gridView); │ │ │ │ │ + 392 return PowerPreBasis(std:: │ │ │ │ │ +move(childPreBasis)); │ │ │ │ │ + 393 }; │ │ │ │ │ + 394} │ │ │ │ │ + 395 │ │ │ │ │ + 396} // end namespace BasisFactory │ │ │ │ │ + 397 │ │ │ │ │ + 398// Backward compatibility │ │ │ │ │ + 399namespace BasisBuilder { │ │ │ │ │ + 400 │ │ │ │ │ + 401 using namespace BasisFactory; │ │ │ │ │ + 402 │ │ │ │ │ + 403} │ │ │ │ │ + 404 │ │ │ │ │ + 405 │ │ │ │ │ + 406} // end namespace Functions │ │ │ │ │ + 407} // end namespace Dune │ │ │ │ │ + 408 │ │ │ │ │ + 409 │ │ │ │ │ + 410#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_POWERBASIS_HH │ │ │ │ │ +type_traits.hh │ │ │ │ │ +utility.hh │ │ │ │ │ +basistags.hh │ │ │ │ │ +nodes.hh │ │ │ │ │ +defaultglobalbasis.hh │ │ │ │ │ +Dune::Functions::BasisFactory::power │ │ │ │ │ +auto power(ChildPreBasisFactory &&childPreBasisFactory) │ │ │ │ │ +Create a factory builder that can build a PowerPreBasis. │ │ │ │ │ +Definition: powerbasis.hh:388 │ │ │ │ │ +Dune::Functions::enableIfConstructible │ │ │ │ │ +typename std::enable_if< std::is_constructible< T, Args... >::value, int >:: │ │ │ │ │ +type enableIfConstructible │ │ │ │ │ +Helper to constrain forwarding constructors. │ │ │ │ │ +Definition: type_traits.hh:26 │ │ │ │ │ +Dune │ │ │ │ │ +Definition: polynomial.hh:10 │ │ │ │ │ +Dune::Functions::BasisFactory::IndexMergingStrategy │ │ │ │ │ +Base class for index merging strategies to simplify detection. │ │ │ │ │ +Definition: basistags.hh:44 │ │ │ │ │ +Dune::Functions::BasisFactory::FlatInterleaved │ │ │ │ │ +Interleaved merging of direct children without blocking. │ │ │ │ │ +Definition: basistags.hh:114 │ │ │ │ │ +Dune::Functions::PowerBasisNode │ │ │ │ │ +Definition: nodes.hh:193 │ │ │ │ │ +Dune::Functions::PowerPreBasis │ │ │ │ │ +A pre-basis for power bases. │ │ │ │ │ +Definition: powerbasis.hh:45 │ │ │ │ │ +Dune::Functions::PowerPreBasis::dimension │ │ │ │ │ +size_type dimension() const │ │ │ │ │ +Get the total dimension of the space spanned by this basis. │ │ │ │ │ +Definition: powerbasis.hh:207 │ │ │ │ │ +Dune::Functions::PowerPreBasis::size_type │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +Type used for indices and size information. │ │ │ │ │ +Definition: powerbasis.hh:58 │ │ │ │ │ +Dune::Functions::PowerPreBasis::IndexMergingStrategy │ │ │ │ │ +IMS IndexMergingStrategy │ │ │ │ │ +Strategy used to merge the global indices of the child factories. │ │ │ │ │ +Definition: powerbasis.hh:61 │ │ │ │ │ +Dune::Functions::PowerPreBasis::Node │ │ │ │ │ +PowerBasisNode< SubNode, children > Node │ │ │ │ │ +Template mapping root tree path to type of created tree node. │ │ │ │ │ +Definition: powerbasis.hh:66 │ │ │ │ │ +Dune::Functions::PowerPreBasis::GridView │ │ │ │ │ +typename SPB::GridView GridView │ │ │ │ │ +The grid view that the FE basis is defined on. │ │ │ │ │ +Definition: powerbasis.hh:55 │ │ │ │ │ +Dune::Functions::PowerPreBasis::multiIndexBufferSize │ │ │ │ │ +static constexpr size_type multiIndexBufferSize │ │ │ │ │ +Definition: powerbasis.hh:70 │ │ │ │ │ +Dune::Functions::PowerPreBasis::SubPreBasis │ │ │ │ │ +SPB SubPreBasis │ │ │ │ │ +The child pre-basis. │ │ │ │ │ +Definition: powerbasis.hh:52 │ │ │ │ │ +Dune::Functions::PowerPreBasis::SubNode │ │ │ │ │ +typename SubPreBasis::Node SubNode │ │ │ │ │ +Definition: powerbasis.hh:63 │ │ │ │ │ +Dune::Functions::PowerPreBasis::initializeIndices │ │ │ │ │ +void initializeIndices() │ │ │ │ │ +Initialize the global indices. │ │ │ │ │ +Definition: powerbasis.hh:87 │ │ │ │ │ +Dune::Functions::PowerPreBasis::update │ │ │ │ │ +void update(const GridView &gv) │ │ │ │ │ +Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ +Definition: powerbasis.hh:99 │ │ │ │ │ +Dune::Functions::PowerPreBasis::indices │ │ │ │ │ +It indices(const Node &node, It it) const │ │ │ │ │ +Maps from subtree index set [0..size-1] to a globally unique multi index in │ │ │ │ │ +global basis. │ │ │ │ │ +Definition: powerbasis.hh:232 │ │ │ │ │ +Dune::Functions::PowerPreBasis::PowerPreBasis │ │ │ │ │ +PowerPreBasis(SFArgs &&... sfArgs) │ │ │ │ │ +Constructor for given child pre-basis objects. │ │ │ │ │ +Definition: powerbasis.hh:80 │ │ │ │ │ +Dune::Functions::PowerPreBasis::size │ │ │ │ │ +size_type size() const │ │ │ │ │ +Same as size(prefix) with empty prefix. │ │ │ │ │ +Definition: powerbasis.hh:116 │ │ │ │ │ +Dune::Functions::PowerPreBasis::subPreBasis │ │ │ │ │ +SubPreBasis & subPreBasis() │ │ │ │ │ +Mutable access to the stored prebasis of the factor in the power space. │ │ │ │ │ +Definition: powerbasis.hh:225 │ │ │ │ │ +Dune::Functions::PowerPreBasis::makeNode │ │ │ │ │ +Node makeNode() const │ │ │ │ │ +Create tree node. │ │ │ │ │ +Definition: powerbasis.hh:107 │ │ │ │ │ +Dune::Functions::PowerPreBasis::maxMultiIndexSize │ │ │ │ │ +static constexpr size_type maxMultiIndexSize │ │ │ │ │ +Definition: powerbasis.hh:68 │ │ │ │ │ +Dune::Functions::PowerPreBasis::minMultiIndexSize │ │ │ │ │ +static constexpr size_type minMultiIndexSize │ │ │ │ │ +Definition: powerbasis.hh:69 │ │ │ │ │ +Dune::Functions::PowerPreBasis::maxNodeSize │ │ │ │ │ +size_type maxNodeSize() const │ │ │ │ │ +Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ +Definition: powerbasis.hh:213 │ │ │ │ │ +Dune::Functions::PowerPreBasis::gridView │ │ │ │ │ +const GridView & gridView() const │ │ │ │ │ +Obtain the grid view that the basis is defined on. │ │ │ │ │ +Definition: powerbasis.hh:93 │ │ │ │ │ +Dune::Functions::PowerPreBasis::size │ │ │ │ │ +size_type size(const SizePrefix &prefix) const │ │ │ │ │ +Return number of possible values for next position in multi index. │ │ │ │ │ +Definition: powerbasis.hh:124 │ │ │ │ │ +Dune::Functions::PowerPreBasis::subPreBasis │ │ │ │ │ +const SubPreBasis & subPreBasis() const │ │ │ │ │ +Const access to the stored prebasis of the factor in the power space. │ │ │ │ │ +Definition: powerbasis.hh:219 │ │ │ │ │ +concepts.hh │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00089.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: composedgridfunction.hh File Reference │ │ │ │ +dune-functions: subentitydofs.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,54 +58,58 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
composedgridfunction.hh File Reference
│ │ │ │ +
subentitydofs.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ -#include <tuple>
│ │ │ │ -#include <dune/common/referencehelper.hh>
│ │ │ │ -#include <dune/common/typeutilities.hh>
│ │ │ │ -#include <dune/functions/common/defaultderivativetraits.hh>
│ │ │ │ -#include <dune/functions/common/differentiablefunction.hh>
│ │ │ │ -#include <dune/functions/gridfunctions/gridfunction.hh>
│ │ │ │ +
#include <vector>
│ │ │ │ +#include <dune/geometry/referenceelements.hh>
│ │ │ │ +#include <dune/typetree/traversal.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::ComposedGridFunction< OF, IF >
 Composition of grid functions with another function. More...
class  Dune::Functions::SubEntityDOFs< GridView >
 Range of DOFs associated to sub-entity. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<class OF , class... IF>
auto Dune::Functions::makeComposedGridFunction (OF &&outerFunction, IF &&... innerFunction)
 Create a ComposedGridFunction that composes grid-functions with another function. More...
 
template<class T >
auto Dune::Functions::subEntityDOFs (const T &)
 Create SubEntityDOFs object. More...
 
template<class LocalView >
auto Dune::Functions::subEntityDOFs (const LocalView &localView, std::size_t subEntityIndex, std::size_t subEntityCodim)
 Create bound SubEntityDOFs object. More...
 
template<class LocalView , class Intersection >
auto Dune::Functions::subEntityDOFs (const LocalView &localView, const Intersection &intersection)
 Create bound SubEntityDOFs object. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,37 +4,41 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * gridfunctions │ │ │ │ │ + * functionspacebases │ │ │ │ │ Classes | Namespaces | Functions │ │ │ │ │ -composedgridfunction.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +subentitydofs.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::ComposedGridFunction<_OF,_IF_> │ │ │ │ │ -  Composition of grid functions with another function. More... │ │ │ │ │ +class  Dune::Functions::SubEntityDOFs<_GridView_> │ │ │ │ │ +  Range of DOFs associated to sub-entity. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::makeComposedGridFunction (OF &&outerFunction, IF &&... │ │ │ │ │ - innerFunction) │ │ │ │ │ -  Create a ComposedGridFunction that composes grid-functions with another │ │ │ │ │ - function. More... │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::subEntityDOFs (const T &) │ │ │ │ │ +  Create SubEntityDOFs object. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::subEntityDOFs (const LocalView &localView, std::size_t │ │ │ │ │ + subEntityIndex, std::size_t subEntityCodim) │ │ │ │ │ +  Create bound SubEntityDOFs object. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::subEntityDOFs (const LocalView &localView, const │ │ │ │ │ + Intersection &intersection) │ │ │ │ │ +  Create bound SubEntityDOFs object. More... │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00089_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: composedgridfunction.hh Source File │ │ │ │ +dune-functions: subentitydofs.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,199 +58,152 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
composedgridfunction.hh
│ │ │ │ +
subentitydofs.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#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBENTITYDOFS_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBENTITYDOFS_HH
│ │ │ │
5
│ │ │ │ -
6#include <type_traits>
│ │ │ │ -
7#include <tuple>
│ │ │ │ -
8
│ │ │ │ -
9#include <dune/common/referencehelper.hh>
│ │ │ │ -
10#include <dune/common/typeutilities.hh>
│ │ │ │ +
6#include <vector>
│ │ │ │ +
7
│ │ │ │ +
8#include <dune/geometry/referenceelements.hh>
│ │ │ │ +
9#include <dune/typetree/traversal.hh>
│ │ │ │ +
10
│ │ │ │
11
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +
12
│ │ │ │ +
13namespace Dune {
│ │ │ │ +
14namespace Functions {
│ │ │ │
15
│ │ │ │
16
│ │ │ │ -
17namespace Dune {
│ │ │ │ -
18namespace Functions {
│ │ │ │ -
19
│ │ │ │ -
20
│ │ │ │ -
21
│ │ │ │ -
40template<class OF, class... IF>
│ │ │ │ - │ │ │ │ +
17
│ │ │ │ +
40template<class GridView>
│ │ │ │ + │ │ │ │
42{
│ │ │ │ -
43 using InnerFunctions = std::tuple<IF...>;
│ │ │ │ -
44 using InnerLocalFunctions = std::tuple<decltype(localFunction(resolveRef(std::declval<const IF&>())))...>;
│ │ │ │ -
45
│ │ │ │ -
46 template<std::size_t i>
│ │ │ │ -
47 using InnerFunction = std::decay_t<ResolveRef_t<std::tuple_element_t<i, InnerFunctions>>>;
│ │ │ │ -
48
│ │ │ │ -
49 using OuterFunction = OF;
│ │ │ │ -
50
│ │ │ │ -
51public:
│ │ │ │ -
52
│ │ │ │ -
53 using EntitySet = typename InnerFunction<0>::EntitySet;
│ │ │ │ -
54 using Element = typename EntitySet::Element;
│ │ │ │ -
55
│ │ │ │ -
56 using Domain = typename EntitySet::GlobalCoordinate;
│ │ │ │ -
57 using LocalDomain = typename EntitySet::LocalCoordinate;
│ │ │ │ -
58
│ │ │ │ -
59 using Range = decltype(std::declval<OF>()(std::declval<IF>()(std::declval<Domain>())...));
│ │ │ │ -
60
│ │ │ │ -
61private:
│ │ │ │ -
62
│ │ │ │ -
63 using Traits = Imp::GridFunctionTraits<Range(Domain), EntitySet, DefaultDerivativeTraits, 16>;
│ │ │ │ -
64
│ │ │ │ -
65 class LocalFunction
│ │ │ │ -
66 {
│ │ │ │ -
67 public:
│ │ │ │ -
74 LocalFunction(const ComposedGridFunction& globalFunction) :
│ │ │ │ -
75 globalFunction_(globalFunction),
│ │ │ │ -
76 innerLocalFunctions_(globalFunction.innerLocalFunctions())
│ │ │ │ -
77 {}
│ │ │ │ -
78
│ │ │ │ -
88 void bind(const Element& element)
│ │ │ │ -
89 {
│ │ │ │ -
90 std::apply([&](auto&... innerFunction) {
│ │ │ │ -
91 (innerFunction.bind(element),...);
│ │ │ │ -
92 }, innerLocalFunctions_);
│ │ │ │ -
93 }
│ │ │ │ -
94
│ │ │ │ -
96 void unbind()
│ │ │ │ -
97 {
│ │ │ │ -
98 std::apply([&](auto&... innerFunction) {
│ │ │ │ -
99 (innerFunction.unbind(),...);
│ │ │ │ -
100 }, innerLocalFunctions_);
│ │ │ │ -
101 }
│ │ │ │ -
102
│ │ │ │ -
105 bool bound() const
│ │ │ │ -
106 {
│ │ │ │ -
107 return std::apply([](const auto&... innerFunction) {
│ │ │ │ -
108 return (innerFunction.bound() && ...);
│ │ │ │ -
109 }, innerLocalFunctions_);
│ │ │ │ -
110 }
│ │ │ │ -
111
│ │ │ │ -
121 Range operator()(const LocalDomain& x) const
│ │ │ │ -
122 {
│ │ │ │ -
123 return std::apply([&](const auto&... innerFunction) {
│ │ │ │ -
124 return globalFunction_.outerFunction_(innerFunction(x)...);
│ │ │ │ -
125 }, innerLocalFunctions_);
│ │ │ │ -
126 }
│ │ │ │ -
127
│ │ │ │ -
137 const Element& localContext() const
│ │ │ │ -
138 {
│ │ │ │ -
139 return std::get<0>(innerLocalFunctions_).localContext();
│ │ │ │ -
140 }
│ │ │ │ -
141
│ │ │ │ -
143 friend typename Traits::LocalFunctionTraits::DerivativeInterface derivative(const LocalFunction& t)
│ │ │ │ -
144 {
│ │ │ │ -
145 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │ -
146 }
│ │ │ │ -
147
│ │ │ │ -
148 private:
│ │ │ │ -
149 const ComposedGridFunction& globalFunction_;
│ │ │ │ -
150 InnerLocalFunctions innerLocalFunctions_;
│ │ │ │ -
151 };
│ │ │ │ -
152
│ │ │ │ -
153public:
│ │ │ │ -
154
│ │ │ │ -
164 template<class OFT, class... IFT,
│ │ │ │ -
165 disableCopyMove<ComposedGridFunction, OFT> = 0,
│ │ │ │ -
166 std::enable_if_t<(sizeof...(IFT) > 0), int> = 0>
│ │ │ │ -
167 ComposedGridFunction(OFT&& outerFunction, IFT&&... innerFunctions) :
│ │ │ │ -
168 outerFunction_(std::forward<OFT>(outerFunction)),
│ │ │ │ -
169 innerFunctions_(std::forward<IFT>(innerFunctions)...)
│ │ │ │ -
170 {}
│ │ │ │ -
171
│ │ │ │ -
173 Range operator()(const Domain& x) const
│ │ │ │ -
174 {
│ │ │ │ -
175 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │ -
176 }
│ │ │ │ -
177
│ │ │ │ - │ │ │ │ -
180 {
│ │ │ │ -
181 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │ -
182 }
│ │ │ │ -
183
│ │ │ │ -
190 friend LocalFunction localFunction(const ComposedGridFunction& cgf)
│ │ │ │ -
191 {
│ │ │ │ -
192 return LocalFunction(cgf);
│ │ │ │ -
193 }
│ │ │ │ +
43 static const int dim = GridView::dimension;
│ │ │ │ +
44
│ │ │ │ +
45public:
│ │ │ │ +
46
│ │ │ │ +
63 template<class LocalView>
│ │ │ │ +
64 SubEntityDOFs& bind(const LocalView& localView, std::size_t subEntityIndex, std::size_t subEntityCodim)
│ │ │ │ +
65 {
│ │ │ │ +
66 // fill vector with local indices of all DOFs contained in subentity
│ │ │ │ +
67 containedDOFs_.clear();
│ │ │ │ +
68 dofIsContained_.assign(localView.size(), false);
│ │ │ │ +
69
│ │ │ │ +
70 auto re = Dune::referenceElement<double,dim>(localView.element().type());
│ │ │ │ +
71
│ │ │ │ +
72 Dune::TypeTree::forEachLeafNode(localView.tree(), [&](auto&& node, auto&& /*treePath*/) {
│ │ │ │ +
73 const auto& localCoefficients = node.finiteElement().localCoefficients();
│ │ │ │ +
74 std::size_t localSize = localCoefficients.size();
│ │ │ │ +
75 for(std::size_t i=0; i<localSize; ++i)
│ │ │ │ +
76 {
│ │ │ │ +
77 auto localKey = localCoefficients.localKey(i);
│ │ │ │ +
78 if (re.subEntities(subEntityIndex, subEntityCodim, localKey.codim()).contains(localKey.subEntity()))
│ │ │ │ +
79 {
│ │ │ │ +
80 containedDOFs_.push_back(node.localIndex(i));
│ │ │ │ +
81 dofIsContained_[node.localIndex(i)] = true;
│ │ │ │ +
82 }
│ │ │ │ +
83 }
│ │ │ │ +
84 });
│ │ │ │ +
85 return *this;
│ │ │ │ +
86 }
│ │ │ │ +
87
│ │ │ │ +
103 template<class LocalView, class Intersection>
│ │ │ │ +
104 SubEntityDOFs& bind(const LocalView& localView, const Intersection& intersection)
│ │ │ │ +
105 {
│ │ │ │ +
106 return bind(localView, intersection.indexInInside(), 1);
│ │ │ │ +
107 }
│ │ │ │ +
108
│ │ │ │ +
110 auto begin() const
│ │ │ │ +
111 {
│ │ │ │ +
112 return containedDOFs_.cbegin();
│ │ │ │ +
113 }
│ │ │ │ +
114
│ │ │ │ +
116 auto end() const
│ │ │ │ +
117 {
│ │ │ │ +
118 return containedDOFs_.cend();
│ │ │ │ +
119 }
│ │ │ │ +
120
│ │ │ │ +
122 auto size() const
│ │ │ │ +
123 {
│ │ │ │ +
124 return containedDOFs_.size();
│ │ │ │ +
125 }
│ │ │ │ +
126
│ │ │ │ +
128 decltype(auto) operator[](std::size_t i) const
│ │ │ │ +
129 {
│ │ │ │ +
130 return containedDOFs_[i];
│ │ │ │ +
131 }
│ │ │ │ +
132
│ │ │ │ +
134 bool contains(std::size_t localIndex) const
│ │ │ │ +
135 {
│ │ │ │ +
136 return dofIsContained_[localIndex];
│ │ │ │ +
137 }
│ │ │ │ +
138
│ │ │ │ +
139private:
│ │ │ │ +
140
│ │ │ │ +
141 std::vector<std::size_t> containedDOFs_;
│ │ │ │ +
142 std::vector<bool> dofIsContained_;
│ │ │ │ +
143};
│ │ │ │ +
144
│ │ │ │ +
145
│ │ │ │ +
146
│ │ │ │ +
159template<class T>
│ │ │ │ +
160auto subEntityDOFs(const T&)
│ │ │ │ +
161{
│ │ │ │ + │ │ │ │ +
163}
│ │ │ │ +
164
│ │ │ │ +
165
│ │ │ │ +
166
│ │ │ │ +
186template<class LocalView>
│ │ │ │ +
187auto subEntityDOFs(const LocalView& localView, std::size_t subEntityIndex, std::size_t subEntityCodim)
│ │ │ │ +
188{
│ │ │ │ +
189 using GridView = typename LocalView::GridView;
│ │ │ │ + │ │ │ │ +
191 subEntityDOFs.bind(localView, subEntityIndex, subEntityCodim);
│ │ │ │ +
192 return subEntityDOFs;
│ │ │ │ +
193}
│ │ │ │
194
│ │ │ │ -
205 const EntitySet& entitySet() const
│ │ │ │ -
206 {
│ │ │ │ -
207 return resolveRef(std::get<0>(innerFunctions_)).entitySet();
│ │ │ │ -
208 }
│ │ │ │ -
209
│ │ │ │ -
210protected:
│ │ │ │ -
211
│ │ │ │ -
212 InnerLocalFunctions innerLocalFunctions() const
│ │ │ │ -
213 {
│ │ │ │ -
214 return std::apply([&](const auto&... innerFunction) {
│ │ │ │ -
215 return std::make_tuple(localFunction(resolveRef(innerFunction))...);
│ │ │ │ -
216 }, innerFunctions_);
│ │ │ │ -
217 }
│ │ │ │ -
218
│ │ │ │ -
219 OuterFunction outerFunction_;
│ │ │ │ -
220 InnerFunctions innerFunctions_;
│ │ │ │ -
221};
│ │ │ │ -
222
│ │ │ │ +
195
│ │ │ │ +
196
│ │ │ │ +
215template<class LocalView, class Intersection>
│ │ │ │ +
216auto subEntityDOFs(const LocalView& localView, const Intersection& intersection)
│ │ │ │ +
217{
│ │ │ │ +
218 using GridView = typename LocalView::GridView;
│ │ │ │ + │ │ │ │ +
220 subEntityDOFs.bind(localView, intersection);
│ │ │ │ +
221 return subEntityDOFs;
│ │ │ │ +
222}
│ │ │ │
223
│ │ │ │
224
│ │ │ │ -
247template<class OF, class... IF>
│ │ │ │ -
248auto makeComposedGridFunction(OF&& outerFunction, IF&&... innerFunction)
│ │ │ │ -
249{
│ │ │ │ -
250 using ComposedGridFunctionType = ComposedGridFunction<std::decay_t<OF>, std::decay_t<IF>...>;
│ │ │ │ -
251 return ComposedGridFunctionType(std::forward<OF>(outerFunction), std::forward<IF>(innerFunction)...);
│ │ │ │ -
252}
│ │ │ │ -
253
│ │ │ │ -
254
│ │ │ │ -
255
│ │ │ │ -
256}} // namespace Dune::Functions
│ │ │ │ -
257
│ │ │ │ -
258
│ │ │ │ -
259
│ │ │ │ -
260#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
auto makeComposedGridFunction(OF &&outerFunction, IF &&... innerFunction)
Create a ComposedGridFunction that composes grid-functions with another function.
Definition: composedgridfunction.hh:248
│ │ │ │ +
225
│ │ │ │ +
226} // namespace Functions
│ │ │ │ +
227} // namespace Dune
│ │ │ │ +
228
│ │ │ │ +
229#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBENTITYDOFS_HH
│ │ │ │ +
auto subEntityDOFs(const LocalView &localView, const Intersection &intersection)
Create bound SubEntityDOFs object.
Definition: subentitydofs.hh:216
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
decltype(auto) resolveRef(T &&t)
This is an alias for Dune::resolveRef.
Definition: referencehelper.hh:37
│ │ │ │ -
Default implementation for derivative traits.
Definition: defaultderivativetraits.hh:37
│ │ │ │ -
Composition of grid functions with another function.
Definition: composedgridfunction.hh:42
│ │ │ │ -
OuterFunction outerFunction_
Definition: composedgridfunction.hh:219
│ │ │ │ -
InnerFunctions innerFunctions_
Definition: composedgridfunction.hh:220
│ │ │ │ -
ComposedGridFunction(OFT &&outerFunction, IFT &&... innerFunctions)
Create ComposedGridFunction.
Definition: composedgridfunction.hh:167
│ │ │ │ -
const EntitySet & entitySet() const
Return the EntitySet associated to this composed grid-function.
Definition: composedgridfunction.hh:205
│ │ │ │ -
typename InnerFunction< 0 >::EntitySet EntitySet
Definition: composedgridfunction.hh:53
│ │ │ │ -
typename EntitySet::LocalCoordinate LocalDomain
Definition: composedgridfunction.hh:57
│ │ │ │ -
typename EntitySet::Element Element
Definition: composedgridfunction.hh:54
│ │ │ │ -
InnerLocalFunctions innerLocalFunctions() const
Definition: composedgridfunction.hh:212
│ │ │ │ -
friend LocalFunction localFunction(const ComposedGridFunction &cgf)
Create a local-function of this composed grid-function.
Definition: composedgridfunction.hh:190
│ │ │ │ -
decltype(std::declval< OF >()(std::declval< IF >()(std::declval< Domain >())...)) Range
Definition: composedgridfunction.hh:59
│ │ │ │ -
typename EntitySet::GlobalCoordinate Domain
Definition: composedgridfunction.hh:56
│ │ │ │ -
Range operator()(const Domain &x) const
Evaluation of the composed grid function in coordinates x
Definition: composedgridfunction.hh:173
│ │ │ │ -
friend Traits::DerivativeInterface derivative(const ComposedGridFunction &t)
Not implemented.
Definition: composedgridfunction.hh:179
│ │ │ │ -
Definition: gridfunction.hh:32
│ │ │ │ +
Range of DOFs associated to sub-entity.
Definition: subentitydofs.hh:42
│ │ │ │ +
auto begin() const
Create begin iterator for access to range of contained local indices.
Definition: subentitydofs.hh:110
│ │ │ │ +
auto size() const
Return number of contained DOFs.
Definition: subentitydofs.hh:122
│ │ │ │ +
SubEntityDOFs & bind(const LocalView &localView, const Intersection &intersection)
Bind SubEntityDOFs object to LocalView and sub-entity.
Definition: subentitydofs.hh:104
│ │ │ │ +
bool contains(std::size_t localIndex) const
Check if given local index is contained in this range of DOFs.
Definition: subentitydofs.hh:134
│ │ │ │ +
auto end() const
Create end iterator for access to range of contained local indices.
Definition: subentitydofs.hh:116
│ │ │ │ +
SubEntityDOFs & bind(const LocalView &localView, std::size_t subEntityIndex, std::size_t subEntityCodim)
Bind SubEntityDOFs object to LocalView and sub-entity.
Definition: subentitydofs.hh:64
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,244 +4,177 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * gridfunctions │ │ │ │ │ -composedgridfunction.hh │ │ │ │ │ + * functionspacebases │ │ │ │ │ +subentitydofs.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#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBENTITYDOFS_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBENTITYDOFS_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ - 8 │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ + 6#include │ │ │ │ │ + 7 │ │ │ │ │ + 8#include │ │ │ │ │ + 9#include │ │ │ │ │ + 10 │ │ │ │ │ 11 │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include │ │ │ │ │ + 12 │ │ │ │ │ + 13namespace Dune { │ │ │ │ │ + 14namespace Functions { │ │ │ │ │ 15 │ │ │ │ │ 16 │ │ │ │ │ - 17namespace Dune { │ │ │ │ │ - 18namespace Functions { │ │ │ │ │ - 19 │ │ │ │ │ - 20 │ │ │ │ │ - 21 │ │ │ │ │ - 40template │ │ │ │ │ -41class ComposedGridFunction │ │ │ │ │ + 17 │ │ │ │ │ + 40template │ │ │ │ │ +41class SubEntityDOFs │ │ │ │ │ 42{ │ │ │ │ │ - 43 using InnerFunctions = std::tuple; │ │ │ │ │ - 44 using InnerLocalFunctions = std::tuple())))...>; │ │ │ │ │ - 45 │ │ │ │ │ - 46 template │ │ │ │ │ - 47 using InnerFunction = std::decay_t>>; │ │ │ │ │ - 48 │ │ │ │ │ - 49 using OuterFunction = OF; │ │ │ │ │ - 50 │ │ │ │ │ - 51public: │ │ │ │ │ - 52 │ │ │ │ │ -53 using EntitySet = typename InnerFunction<0>::EntitySet; │ │ │ │ │ -54 using Element = typename EntitySet::Element; │ │ │ │ │ - 55 │ │ │ │ │ -56 using Domain = typename EntitySet::GlobalCoordinate; │ │ │ │ │ -57 using LocalDomain = typename EntitySet::LocalCoordinate; │ │ │ │ │ - 58 │ │ │ │ │ -59 using Range = decltype(std::declval()(std::declval()(std:: │ │ │ │ │ -declval())...)); │ │ │ │ │ - 60 │ │ │ │ │ - 61private: │ │ │ │ │ - 62 │ │ │ │ │ - 63 using Traits = Imp::GridFunctionTraits; │ │ │ │ │ - 64 │ │ │ │ │ - 65 class LocalFunction │ │ │ │ │ - 66 { │ │ │ │ │ - 67 public: │ │ │ │ │ - 74 LocalFunction(const ComposedGridFunction& globalFunction) : │ │ │ │ │ - 75 globalFunction_(globalFunction), │ │ │ │ │ - 76 innerLocalFunctions_(globalFunction.innerLocalFunctions()) │ │ │ │ │ - 77 {} │ │ │ │ │ - 78 │ │ │ │ │ - 88 void bind(const Element& element) │ │ │ │ │ - 89 { │ │ │ │ │ - 90 std::apply([&](auto&... innerFunction) { │ │ │ │ │ - 91 (innerFunction.bind(element),...); │ │ │ │ │ - 92 }, innerLocalFunctions_); │ │ │ │ │ - 93 } │ │ │ │ │ - 94 │ │ │ │ │ - 96 void unbind() │ │ │ │ │ - 97 { │ │ │ │ │ - 98 std::apply([&](auto&... innerFunction) { │ │ │ │ │ - 99 (innerFunction.unbind(),...); │ │ │ │ │ - 100 }, innerLocalFunctions_); │ │ │ │ │ - 101 } │ │ │ │ │ - 102 │ │ │ │ │ - 105 bool bound() const │ │ │ │ │ - 106 { │ │ │ │ │ - 107 return std::apply([](const auto&... innerFunction) { │ │ │ │ │ - 108 return (innerFunction.bound() && ...); │ │ │ │ │ - 109 }, innerLocalFunctions_); │ │ │ │ │ - 110 } │ │ │ │ │ - 111 │ │ │ │ │ - 121 Range operator()(const LocalDomain& x) const │ │ │ │ │ - 122 { │ │ │ │ │ - 123 return std::apply([&](const auto&... innerFunction) { │ │ │ │ │ - 124 return globalFunction_.outerFunction_(innerFunction(x)...); │ │ │ │ │ - 125 }, innerLocalFunctions_); │ │ │ │ │ - 126 } │ │ │ │ │ - 127 │ │ │ │ │ - 137 const Element& localContext() const │ │ │ │ │ - 138 { │ │ │ │ │ - 139 return std::get<0>(innerLocalFunctions_).localContext(); │ │ │ │ │ - 140 } │ │ │ │ │ - 141 │ │ │ │ │ - 143 friend typename Traits::LocalFunctionTraits::DerivativeInterface │ │ │ │ │ -derivative(const LocalFunction& t) │ │ │ │ │ - 144 { │ │ │ │ │ - 145 DUNE_THROW(NotImplemented,"not implemented"); │ │ │ │ │ - 146 } │ │ │ │ │ - 147 │ │ │ │ │ - 148 private: │ │ │ │ │ - 149 const ComposedGridFunction& globalFunction_; │ │ │ │ │ - 150 InnerLocalFunctions innerLocalFunctions_; │ │ │ │ │ - 151 }; │ │ │ │ │ - 152 │ │ │ │ │ - 153public: │ │ │ │ │ - 154 │ │ │ │ │ - 164 template = 0, │ │ │ │ │ - 166 std::enable_if_t<(sizeof...(IFT) > 0), int> = 0> │ │ │ │ │ -167 ComposedGridFunction(OFT&& outerFunction, IFT&&... innerFunctions) : │ │ │ │ │ - 168 outerFunction_(std::forward(outerFunction)), │ │ │ │ │ - 169 innerFunctions_(std::forward(innerFunctions)...) │ │ │ │ │ - 170 {} │ │ │ │ │ - 171 │ │ │ │ │ -173 Range operator()(const Domain& x) const │ │ │ │ │ - 174 { │ │ │ │ │ - 175 DUNE_THROW(NotImplemented,"not implemented"); │ │ │ │ │ - 176 } │ │ │ │ │ - 177 │ │ │ │ │ -179 friend typename Traits::DerivativeInterface derivative(const │ │ │ │ │ -ComposedGridFunction& t) │ │ │ │ │ - 180 { │ │ │ │ │ - 181 DUNE_THROW(NotImplemented,"not implemented"); │ │ │ │ │ - 182 } │ │ │ │ │ - 183 │ │ │ │ │ -190 friend LocalFunction localFunction(const ComposedGridFunction& cgf) │ │ │ │ │ - 191 { │ │ │ │ │ - 192 return LocalFunction(cgf); │ │ │ │ │ - 193 } │ │ │ │ │ + 43 static const int dim = GridView::dimension; │ │ │ │ │ + 44 │ │ │ │ │ + 45public: │ │ │ │ │ + 46 │ │ │ │ │ + 63 template │ │ │ │ │ +64 SubEntityDOFs& bind(const LocalView& localView, std::size_t subEntityIndex, │ │ │ │ │ +std::size_t subEntityCodim) │ │ │ │ │ + 65 { │ │ │ │ │ + 66 // fill vector with local indices of all DOFs contained in subentity │ │ │ │ │ + 67 containedDOFs_.clear(); │ │ │ │ │ + 68 dofIsContained_.assign(localView.size(), false); │ │ │ │ │ + 69 │ │ │ │ │ + 70 auto re = Dune::referenceElement(localView.element().type()); │ │ │ │ │ + 71 │ │ │ │ │ + 72 Dune::TypeTree::forEachLeafNode(localView.tree(), [&](auto&& node, auto&& / │ │ │ │ │ +*treePath*/) { │ │ │ │ │ + 73 const auto& localCoefficients = node.finiteElement().localCoefficients(); │ │ │ │ │ + 74 std::size_t localSize = localCoefficients.size(); │ │ │ │ │ + 75 for(std::size_t i=0; i │ │ │ │ │ +104 SubEntityDOFs& bind(const LocalView& localView, const Intersection& │ │ │ │ │ +intersection) │ │ │ │ │ + 105 { │ │ │ │ │ + 106 return bind(localView, intersection.indexInInside(), 1); │ │ │ │ │ + 107 } │ │ │ │ │ + 108 │ │ │ │ │ +110 auto begin() const │ │ │ │ │ + 111 { │ │ │ │ │ + 112 return containedDOFs_.cbegin(); │ │ │ │ │ + 113 } │ │ │ │ │ + 114 │ │ │ │ │ +116 auto end() const │ │ │ │ │ + 117 { │ │ │ │ │ + 118 return containedDOFs_.cend(); │ │ │ │ │ + 119 } │ │ │ │ │ + 120 │ │ │ │ │ +122 auto size() const │ │ │ │ │ + 123 { │ │ │ │ │ + 124 return containedDOFs_.size(); │ │ │ │ │ + 125 } │ │ │ │ │ + 126 │ │ │ │ │ +128 decltype(auto) operator[](std::size_t i) const │ │ │ │ │ + 129 { │ │ │ │ │ + 130 return containedDOFs_[i]; │ │ │ │ │ + 131 } │ │ │ │ │ + 132 │ │ │ │ │ +134 bool contains(std::size_t localIndex) const │ │ │ │ │ + 135 { │ │ │ │ │ + 136 return dofIsContained_[localIndex]; │ │ │ │ │ + 137 } │ │ │ │ │ + 138 │ │ │ │ │ + 139private: │ │ │ │ │ + 140 │ │ │ │ │ + 141 std::vector containedDOFs_; │ │ │ │ │ + 142 std::vector dofIsContained_; │ │ │ │ │ + 143}; │ │ │ │ │ + 144 │ │ │ │ │ + 145 │ │ │ │ │ + 146 │ │ │ │ │ + 159template │ │ │ │ │ +160auto subEntityDOFs(const T&) │ │ │ │ │ + 161{ │ │ │ │ │ + 162 return SubEntityDOFs{}; │ │ │ │ │ + 163} │ │ │ │ │ + 164 │ │ │ │ │ + 165 │ │ │ │ │ + 166 │ │ │ │ │ + 186template │ │ │ │ │ +187auto subEntityDOFs(const LocalView& localView, std::size_t subEntityIndex, │ │ │ │ │ +std::size_t subEntityCodim) │ │ │ │ │ + 188{ │ │ │ │ │ + 189 using GridView = typename LocalView::GridView; │ │ │ │ │ + 190 SubEntityDOFs subEntityDOFs; │ │ │ │ │ + 191 subEntityDOFs.bind(localView, subEntityIndex, subEntityCodim); │ │ │ │ │ + 192 return subEntityDOFs; │ │ │ │ │ + 193} │ │ │ │ │ 194 │ │ │ │ │ -205 const EntitySet& entitySet() const │ │ │ │ │ - 206 { │ │ │ │ │ - 207 return resolveRef(std::get<0>(innerFunctions_)).entitySet(); │ │ │ │ │ - 208 } │ │ │ │ │ - 209 │ │ │ │ │ - 210protected: │ │ │ │ │ - 211 │ │ │ │ │ -212 InnerLocalFunctions innerLocalFunctions() const │ │ │ │ │ - 213 { │ │ │ │ │ - 214 return std::apply([&](const auto&... innerFunction) { │ │ │ │ │ - 215 return std::make_tuple(localFunction(resolveRef(innerFunction))...); │ │ │ │ │ - 216 }, innerFunctions_); │ │ │ │ │ - 217 } │ │ │ │ │ - 218 │ │ │ │ │ -219 OuterFunction outerFunction_; │ │ │ │ │ -220 InnerFunctions innerFunctions_; │ │ │ │ │ - 221}; │ │ │ │ │ - 222 │ │ │ │ │ + 195 │ │ │ │ │ + 196 │ │ │ │ │ + 215template │ │ │ │ │ +216auto subEntityDOFs(const LocalView& localView, const Intersection& │ │ │ │ │ +intersection) │ │ │ │ │ + 217{ │ │ │ │ │ + 218 using GridView = typename LocalView::GridView; │ │ │ │ │ + 219 SubEntityDOFs subEntityDOFs; │ │ │ │ │ + 220 subEntityDOFs.bind(localView, intersection); │ │ │ │ │ + 221 return subEntityDOFs; │ │ │ │ │ + 222} │ │ │ │ │ 223 │ │ │ │ │ 224 │ │ │ │ │ - 247template │ │ │ │ │ -248auto makeComposedGridFunction(OF&& outerFunction, IF&&... innerFunction) │ │ │ │ │ - 249{ │ │ │ │ │ - 250 using ComposedGridFunctionType = ComposedGridFunction, │ │ │ │ │ -std::decay_t...>; │ │ │ │ │ - 251 return ComposedGridFunctionType(std::forward(outerFunction), std:: │ │ │ │ │ -forward(innerFunction)...); │ │ │ │ │ - 252} │ │ │ │ │ - 253 │ │ │ │ │ - 254 │ │ │ │ │ - 255 │ │ │ │ │ - 256}} // namespace Dune::Functions │ │ │ │ │ - 257 │ │ │ │ │ - 258 │ │ │ │ │ - 259 │ │ │ │ │ - 260#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH │ │ │ │ │ -defaultderivativetraits.hh │ │ │ │ │ -differentiablefunction.hh │ │ │ │ │ -gridfunction.hh │ │ │ │ │ -Dune::Functions::ComposedGridFunction::makeComposedGridFunction │ │ │ │ │ -auto makeComposedGridFunction(OF &&outerFunction, IF &&... innerFunction) │ │ │ │ │ -Create a ComposedGridFunction that composes grid-functions with another │ │ │ │ │ -function. │ │ │ │ │ -Definition: composedgridfunction.hh:248 │ │ │ │ │ + 225 │ │ │ │ │ + 226} // namespace Functions │ │ │ │ │ + 227} // namespace Dune │ │ │ │ │ + 228 │ │ │ │ │ + 229#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBENTITYDOFS_HH │ │ │ │ │ +Dune::Functions::subEntityDOFs │ │ │ │ │ +auto subEntityDOFs(const LocalView &localView, const Intersection │ │ │ │ │ +&intersection) │ │ │ │ │ +Create bound SubEntityDOFs object. │ │ │ │ │ +Definition: subentitydofs.hh:216 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::resolveRef │ │ │ │ │ -decltype(auto) resolveRef(T &&t) │ │ │ │ │ -This is an alias for Dune::resolveRef. │ │ │ │ │ -Definition: referencehelper.hh:37 │ │ │ │ │ -Dune::Functions::DefaultDerivativeTraits │ │ │ │ │ -Default implementation for derivative traits. │ │ │ │ │ -Definition: defaultderivativetraits.hh:37 │ │ │ │ │ -Dune::Functions::ComposedGridFunction │ │ │ │ │ -Composition of grid functions with another function. │ │ │ │ │ -Definition: composedgridfunction.hh:42 │ │ │ │ │ -Dune::Functions::ComposedGridFunction::outerFunction_ │ │ │ │ │ -OuterFunction outerFunction_ │ │ │ │ │ -Definition: composedgridfunction.hh:219 │ │ │ │ │ -Dune::Functions::ComposedGridFunction::innerFunctions_ │ │ │ │ │ -InnerFunctions innerFunctions_ │ │ │ │ │ -Definition: composedgridfunction.hh:220 │ │ │ │ │ -Dune::Functions::ComposedGridFunction::ComposedGridFunction │ │ │ │ │ -ComposedGridFunction(OFT &&outerFunction, IFT &&... innerFunctions) │ │ │ │ │ -Create ComposedGridFunction. │ │ │ │ │ -Definition: composedgridfunction.hh:167 │ │ │ │ │ -Dune::Functions::ComposedGridFunction::entitySet │ │ │ │ │ -const EntitySet & entitySet() const │ │ │ │ │ -Return the EntitySet associated to this composed grid-function. │ │ │ │ │ -Definition: composedgridfunction.hh:205 │ │ │ │ │ -Dune::Functions::ComposedGridFunction::EntitySet │ │ │ │ │ -typename InnerFunction< 0 >::EntitySet EntitySet │ │ │ │ │ -Definition: composedgridfunction.hh:53 │ │ │ │ │ -Dune::Functions::ComposedGridFunction::LocalDomain │ │ │ │ │ -typename EntitySet::LocalCoordinate LocalDomain │ │ │ │ │ -Definition: composedgridfunction.hh:57 │ │ │ │ │ -Dune::Functions::ComposedGridFunction::Element │ │ │ │ │ -typename EntitySet::Element Element │ │ │ │ │ -Definition: composedgridfunction.hh:54 │ │ │ │ │ -Dune::Functions::ComposedGridFunction::innerLocalFunctions │ │ │ │ │ -InnerLocalFunctions innerLocalFunctions() const │ │ │ │ │ -Definition: composedgridfunction.hh:212 │ │ │ │ │ -Dune::Functions::ComposedGridFunction::localFunction │ │ │ │ │ -friend LocalFunction localFunction(const ComposedGridFunction &cgf) │ │ │ │ │ -Create a local-function of this composed grid-function. │ │ │ │ │ -Definition: composedgridfunction.hh:190 │ │ │ │ │ -Dune::Functions::ComposedGridFunction::Range │ │ │ │ │ -decltype(std::declval< OF >()(std::declval< IF >()(std::declval< Domain > │ │ │ │ │ -())...)) Range │ │ │ │ │ -Definition: composedgridfunction.hh:59 │ │ │ │ │ -Dune::Functions::ComposedGridFunction::Domain │ │ │ │ │ -typename EntitySet::GlobalCoordinate Domain │ │ │ │ │ -Definition: composedgridfunction.hh:56 │ │ │ │ │ -Dune::Functions::ComposedGridFunction::operator() │ │ │ │ │ -Range operator()(const Domain &x) const │ │ │ │ │ -Evaluation of the composed grid function in coordinates x │ │ │ │ │ -Definition: composedgridfunction.hh:173 │ │ │ │ │ -Dune::Functions::ComposedGridFunction::derivative │ │ │ │ │ -friend Traits::DerivativeInterface derivative(const ComposedGridFunction &t) │ │ │ │ │ -Not implemented. │ │ │ │ │ -Definition: composedgridfunction.hh:179 │ │ │ │ │ -Dune::Functions::GridFunction │ │ │ │ │ -Definition: gridfunction.hh:32 │ │ │ │ │ +Dune::Functions::SubEntityDOFs │ │ │ │ │ +Range of DOFs associated to sub-entity. │ │ │ │ │ +Definition: subentitydofs.hh:42 │ │ │ │ │ +Dune::Functions::SubEntityDOFs::begin │ │ │ │ │ +auto begin() const │ │ │ │ │ +Create begin iterator for access to range of contained local indices. │ │ │ │ │ +Definition: subentitydofs.hh:110 │ │ │ │ │ +Dune::Functions::SubEntityDOFs::size │ │ │ │ │ +auto size() const │ │ │ │ │ +Return number of contained DOFs. │ │ │ │ │ +Definition: subentitydofs.hh:122 │ │ │ │ │ +Dune::Functions::SubEntityDOFs::bind │ │ │ │ │ +SubEntityDOFs & bind(const LocalView &localView, const Intersection │ │ │ │ │ +&intersection) │ │ │ │ │ +Bind SubEntityDOFs object to LocalView and sub-entity. │ │ │ │ │ +Definition: subentitydofs.hh:104 │ │ │ │ │ +Dune::Functions::SubEntityDOFs::contains │ │ │ │ │ +bool contains(std::size_t localIndex) const │ │ │ │ │ +Check if given local index is contained in this range of DOFs. │ │ │ │ │ +Definition: subentitydofs.hh:134 │ │ │ │ │ +Dune::Functions::SubEntityDOFs::end │ │ │ │ │ +auto end() const │ │ │ │ │ +Create end iterator for access to range of contained local indices. │ │ │ │ │ +Definition: subentitydofs.hh:116 │ │ │ │ │ +Dune::Functions::SubEntityDOFs::bind │ │ │ │ │ +SubEntityDOFs & bind(const LocalView &localView, std::size_t subEntityIndex, │ │ │ │ │ +std::size_t subEntityCodim) │ │ │ │ │ +Bind SubEntityDOFs object to LocalView and sub-entity. │ │ │ │ │ +Definition: subentitydofs.hh:64 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00092.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: analyticgridviewfunction.hh File Reference │ │ │ │ +dune-functions: basistags.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,56 +58,85 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
analyticgridviewfunction.hh File Reference
│ │ │ │ +
basistags.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │
#include <type_traits>
│ │ │ │ -#include <optional>
│ │ │ │ -#include <dune/common/typeutilities.hh>
│ │ │ │ -#include <dune/functions/common/signature.hh>
│ │ │ │ -#include <dune/functions/common/defaultderivativetraits.hh>
│ │ │ │ -#include <dune/functions/common/differentiablefunction_imp.hh>
│ │ │ │ -#include <dune/functions/common/differentiablefunction.hh>
│ │ │ │ -#include <dune/functions/gridfunctions/gridviewentityset.hh>
│ │ │ │ -#include <dune/functions/gridfunctions/localderivativetraits.hh>
│ │ │ │ +#include <dune/common/concept.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::AnalyticGridViewFunction< Range(Domain), GV, F, DerivativeTraits >
 Class wrapping any differentiable function as grid function. More...
struct  Dune::Functions::Concept::IndexMergingStrategy
 
struct  Dune::Functions::BasisFactory::IndexMergingStrategy
 Base class for index merging strategies to simplify detection. More...
 
struct  Dune::Functions::BasisFactory::FlatLexicographic
 Lexicographic merging of direct children without blocking. More...
 
struct  Dune::Functions::BasisFactory::FlatInterleaved
 Interleaved merging of direct children without blocking. More...
 
struct  Dune::Functions::BasisFactory::BlockedLexicographic
 Lexicographic merging of direct children with blocking (i.e. creating one block per direct child). More...
 
struct  Dune::Functions::BasisFactory::BlockedInterleaved
 Interleaved merging of direct children with blocking (i.e. creating blocks at the leaves containing one leaf per child each). More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
namespace  Dune::Functions::Concept
 
namespace  Dune::Functions::BasisFactory
 
namespace  Dune::Functions::BasisBuilder
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<class F , class GridView >
AnalyticGridViewFunction< typename std::invoke_result< F, typename GridView::template Codim< 0 >::Geometry::GlobalCoordinate >::type(typename GridView::template Codim< 0 >::Geometry::GlobalCoordinate), GridView, typename std::decay< F >::type > Dune::Functions::makeAnalyticGridViewFunction (F &&f, const GridView &gridView)
 Create an AnalyticGridViewFunction from a function and a grid view. More...
 
template<typename T >
static constexpr bool Dune::Functions::Concept::isIndexMergingStrategy ()
 
template<typename T >
static constexpr bool Dune::Functions::Concept::isIndexMergingStrategy (T &&t)
 
void Dune::Functions::BasisFactory::registerIndexMergingStrategy (IndexMergingStrategy)
 
constexpr FlatLexicographic Dune::Functions::BasisFactory::flatLexicographic ()
 Creates a lexicographic merging of direct children without blocking. More...
 
constexpr FlatInterleaved Dune::Functions::BasisFactory::flatInterleaved ()
 Creates an interleaved merging of direct children without blocking. More...
 
constexpr BlockedLexicographic Dune::Functions::BasisFactory::blockedLexicographic ()
 Creates a lexicographic merging of direct children with blocking (i.e. creating one block per direct child). More...
 
constexpr BlockedInterleaved Dune::Functions::BasisFactory::blockedInterleaved ()
 Creates an interleaved merging of direct children with blocking (i.e. creating blocks at the leaves containing one leaf per child each). More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,46 +4,83 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * gridfunctions │ │ │ │ │ + * functionspacebases │ │ │ │ │ Classes | Namespaces | Functions │ │ │ │ │ -analyticgridviewfunction.hh File Reference │ │ │ │ │ +basistags.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ - DerivativeTraits_> │ │ │ │ │ -  Class wrapping any differentiable function as grid function. More... │ │ │ │ │ +struct  Dune::Functions::Concept::IndexMergingStrategy │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::BasisFactory::IndexMergingStrategy │ │ │ │ │ +  Base class for index merging strategies to simplify detection. More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::BasisFactory::FlatLexicographic │ │ │ │ │ +  Lexicographic merging of direct children without blocking. More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::BasisFactory::FlatInterleaved │ │ │ │ │ +  Interleaved merging of direct children without blocking. More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::BasisFactory::BlockedLexicographic │ │ │ │ │ +  Lexicographic merging of direct children with blocking (i.e. creating │ │ │ │ │ + one block per direct child). More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::BasisFactory::BlockedInterleaved │ │ │ │ │ +  Interleaved merging of direct children with blocking (i.e. creating │ │ │ │ │ + blocks at the leaves containing one leaf per child each). More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ +namespace  Dune::Functions::Concept │ │ │ │ │ +  │ │ │ │ │ +namespace  Dune::Functions::BasisFactory │ │ │ │ │ +  │ │ │ │ │ +namespace  Dune::Functions::BasisBuilder │ │ │ │ │ +  │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ - AnalyticGridViewFunction< typename │ │ │ │ │ - std::invoke_result< F, typename │ │ │ │ │ - GridView::template Codim< 0 >:: │ │ │ │ │ - Geometry::GlobalCoordinate >::type │ │ │ │ │ -(typename GridView::template Codim< 0 │ │ │ │ │ - >::Geometry::GlobalCoordinate), Dune::Functions:: │ │ │ │ │ - GridView, typename std::decay< F >:: makeAnalyticGridViewFunction (F &&f, │ │ │ │ │ - type > const GridView &gridView) │ │ │ │ │ -  Create an AnalyticGridViewFunction from │ │ │ │ │ - a function and a grid view. More... │ │ │ │ │ +template │ │ │ │ │ + static constexpr bool Dune::Functions::Concept:: │ │ │ │ │ + isIndexMergingStrategy () │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + static constexpr bool Dune::Functions::Concept:: │ │ │ │ │ + isIndexMergingStrategy (T &&t) │ │ │ │ │ +  │ │ │ │ │ + void Dune::Functions::BasisFactory:: │ │ │ │ │ + registerIndexMergingStrategy │ │ │ │ │ + (IndexMergingStrategy) │ │ │ │ │ +  │ │ │ │ │ + constexpr FlatLexicographic Dune::Functions::BasisFactory:: │ │ │ │ │ + flatLexicographic () │ │ │ │ │ +  Creates a lexicographic merging of direct │ │ │ │ │ + children without blocking. More... │ │ │ │ │ +  │ │ │ │ │ + constexpr FlatInterleaved Dune::Functions::BasisFactory::flatInterleaved │ │ │ │ │ + () │ │ │ │ │ +  Creates an interleaved merging of direct │ │ │ │ │ + children without blocking. More... │ │ │ │ │ +  │ │ │ │ │ +constexpr BlockedLexicographic Dune::Functions::BasisFactory:: │ │ │ │ │ + blockedLexicographic () │ │ │ │ │ + Creates a lexicographic merging of direct │ │ │ │ │ +  children with blocking (i.e. creating one block │ │ │ │ │ + per direct child). More... │ │ │ │ │ +  │ │ │ │ │ + constexpr BlockedInterleaved Dune::Functions::BasisFactory:: │ │ │ │ │ + blockedInterleaved () │ │ │ │ │ + Creates an interleaved merging of direct │ │ │ │ │ +  children with blocking (i.e. creating blocks at │ │ │ │ │ + the leaves containing one leaf per child each). │ │ │ │ │ + More... │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00092_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: analyticgridviewfunction.hh Source File │ │ │ │ +dune-functions: basistags.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,239 +58,126 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
analyticgridviewfunction.hh
│ │ │ │ +
basistags.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#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BASISTAGS_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BASISTAGS_HH
│ │ │ │
5
│ │ │ │
6#include <type_traits>
│ │ │ │ -
7#include <optional>
│ │ │ │ +
7#include <dune/common/concept.hh>
│ │ │ │
8
│ │ │ │ -
9#include <dune/common/typeutilities.hh>
│ │ │ │ -
10
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
17
│ │ │ │ -
18
│ │ │ │ -
19namespace Dune {
│ │ │ │ -
20namespace Functions {
│ │ │ │ +
9namespace Dune {
│ │ │ │ +
10namespace Functions {
│ │ │ │ +
11
│ │ │ │ +
12 namespace Concept {
│ │ │ │ +
13
│ │ │ │ + │ │ │ │ +
15 {
│ │ │ │ +
16 template<typename T>
│ │ │ │ +
17 auto require(T&& t) -> decltype(
│ │ │ │ + │ │ │ │ +
19 );
│ │ │ │ +
20 };
│ │ │ │
21
│ │ │ │ -
22namespace Imp {
│ │ │ │ -
23
│ │ │ │ -
24template<class Signature, class GV, class FLocal, template<class> class DerivativeTraits=DefaultDerivativeTraits>
│ │ │ │ -
25class LocalAnalyticGridViewFunction;
│ │ │ │ -
26
│ │ │ │ -
27template<class Range, class LocalDomain, class GV, class F, template<class> class DerivativeTraits>
│ │ │ │ -
28class LocalAnalyticGridViewFunction<Range(LocalDomain), GV, F, DerivativeTraits>
│ │ │ │ -
29{
│ │ │ │ -
30public:
│ │ │ │ -
31 using Signature = Range(LocalDomain);
│ │ │ │ -
32 using RawSignature = typename SignatureTraits<Signature>::RawSignature;
│ │ │ │ -
33 using DerivativeSignature = typename DerivativeTraits<RawSignature>::Range(LocalDomain);
│ │ │ │ -
34
│ │ │ │ -
35 using GridView = GV;
│ │ │ │ -
36 using EntitySet = GridViewEntitySet<GridView, 0>;
│ │ │ │ -
37 using Element = typename EntitySet::Element;
│ │ │ │ -
38// using Geometry = typename Element::Geometry;
│ │ │ │ -
39 using Geometry = typename std::decay<typename Element::Geometry>::type;
│ │ │ │ -
40
│ │ │ │ -
41 // Use the indirection via derivativeIfImplemented to also support
│ │ │ │ -
42 // function types F that do not implement derivative. In this case
│ │ │ │ -
43 // the interface type DifferentiableFunction is using a dummy for
│ │ │ │ -
44 // the derivative type
│ │ │ │ -
45 using DerivativeDummy = DifferentiableFunction<DerivativeSignature>;
│ │ │ │ -
46 using GlobalRawDerivative = decltype(Imp::derivativeIfImplemented<DerivativeDummy, F>(std::declval<F>()));
│ │ │ │ -
47 using LocalDerivative = LocalAnalyticGridViewFunction<DerivativeSignature, GridView, GlobalRawDerivative, DerivativeTraits>;
│ │ │ │ -
48
│ │ │ │ -
50 template<class FT, disableCopyMove<LocalAnalyticGridViewFunction, FT> = 0>
│ │ │ │ -
51 LocalAnalyticGridViewFunction(FT&& f) :
│ │ │ │ -
52 f_(std::forward<FT>(f))
│ │ │ │ -
53 {}
│ │ │ │ -
54
│ │ │ │ -
56 template<class FT>
│ │ │ │ -
57 LocalAnalyticGridViewFunction(FT&& f, const Element& element, const std::optional<Geometry>& geometry) :
│ │ │ │ -
58 f_(std::forward<FT>(f)),
│ │ │ │ -
59 element_(element),
│ │ │ │ -
60 geometry_(geometry)
│ │ │ │ -
61 {}
│ │ │ │ -
62
│ │ │ │ -
63
│ │ │ │ -
72 void bind(const Element& element)
│ │ │ │ -
73 {
│ │ │ │ -
74 element_ = element;
│ │ │ │ -
75 geometry_.emplace(element_.geometry());
│ │ │ │ -
76 }
│ │ │ │ -
77
│ │ │ │ -
79 void unbind()
│ │ │ │ -
80 {
│ │ │ │ -
81 geometry_.reset();
│ │ │ │ -
82 }
│ │ │ │ -
83
│ │ │ │ -
86 bool bound() const
│ │ │ │ -
87 {
│ │ │ │ -
88 return static_cast<bool>(geometry_);
│ │ │ │ -
89 }
│ │ │ │ -
90
│ │ │ │ -
100 Range operator()(const LocalDomain& x) const
│ │ │ │ -
101 {
│ │ │ │ -
102 assert(!!geometry_);
│ │ │ │ -
103 return f_(geometry_->global(x));
│ │ │ │ -
104 }
│ │ │ │ -
105
│ │ │ │ -
107 const Element& localContext() const
│ │ │ │ -
108 {
│ │ │ │ -
109 assert(!!geometry_);
│ │ │ │ -
110 return element_;
│ │ │ │ -
111 }
│ │ │ │ -
112
│ │ │ │ -
121 friend LocalDerivative derivative(const LocalAnalyticGridViewFunction& t)
│ │ │ │ -
122 {
│ │ │ │ -
123 return LocalDerivative(Imp::derivativeIfImplemented<DerivativeDummy, F>(t.f_), t.element_, t.geometry_);
│ │ │ │ -
124 }
│ │ │ │ -
125
│ │ │ │ -
126private:
│ │ │ │ -
127 F f_;
│ │ │ │ -
128 Element element_;
│ │ │ │ -
129 std::optional<Geometry> geometry_ = std::nullopt;
│ │ │ │ -
130};
│ │ │ │ -
131
│ │ │ │ -
132} // end namespace Imp
│ │ │ │ -
133
│ │ │ │ -
134
│ │ │ │ -
135
│ │ │ │ -
136
│ │ │ │ -
137template<class Signature, class GV, class F, template<class> class DerivativeTraits=DefaultDerivativeTraits>
│ │ │ │ - │ │ │ │ -
139
│ │ │ │ -
140
│ │ │ │ -
146template<class Range, class Domain, class GV, class F, template<class> class DerivativeTraits>
│ │ │ │ -
147class AnalyticGridViewFunction<Range(Domain), GV, F, DerivativeTraits>
│ │ │ │ -
148{
│ │ │ │ -
149public:
│ │ │ │ -
150 using Signature = Range(Domain);
│ │ │ │ - │ │ │ │ -
152 using DerivativeSignature = typename DerivativeTraits<RawSignature>::Range(Domain);
│ │ │ │ -
153
│ │ │ │ -
154 using GridView = GV;
│ │ │ │ - │ │ │ │ -
156 using Element = typename EntitySet::Element;
│ │ │ │ -
157 using Geometry = typename Element::Geometry;
│ │ │ │ -
158
│ │ │ │ -
159 // Use the indirection via derivativeIfImplemented to also support
│ │ │ │ -
160 // function types F that do not implement derivative. In this case
│ │ │ │ -
161 // the interface type DifferentiableFunction is used a dummy for
│ │ │ │ -
162 // the derivative type
│ │ │ │ - │ │ │ │ -
164 using GlobalRawDerivative = decltype(Imp::derivativeIfImplemented<DerivativeDummy, F>(std::declval<F>()));
│ │ │ │ - │ │ │ │ -
166
│ │ │ │ - │ │ │ │ -
168 using LocalFunction = typename Imp::LocalAnalyticGridViewFunction<Range(LocalDomain), GridView, F, LocalDerivativeTraits<EntitySet, DerivativeTraits>::template Traits>;
│ │ │ │ -
169
│ │ │ │ -
171 template<class FT>
│ │ │ │ -
172 AnalyticGridViewFunction(FT&& f, const GridView& gridView) :
│ │ │ │ -
173 f_(std::forward<FT>(f)),
│ │ │ │ -
174 entitySet_(gridView)
│ │ │ │ -
175 {}
│ │ │ │ -
176
│ │ │ │ -
178 Range operator()(const Domain& x) const
│ │ │ │ -
179 {
│ │ │ │ -
180 return f_(x);
│ │ │ │ -
181 }
│ │ │ │ +
22 template<typename T>
│ │ │ │ +
23 static constexpr bool isIndexMergingStrategy()
│ │ │ │ +
24 {
│ │ │ │ +
25 return models<Concept::IndexMergingStrategy,T>();
│ │ │ │ +
26 }
│ │ │ │ +
27
│ │ │ │ +
28 template<typename T>
│ │ │ │ +
29 static constexpr bool isIndexMergingStrategy(T&& t)
│ │ │ │ +
30 {
│ │ │ │ +
31 return models<Concept::IndexMergingStrategy,std::decay_t<T>>();
│ │ │ │ +
32 }
│ │ │ │ +
33
│ │ │ │ +
34 } // namespace Concept
│ │ │ │ +
35
│ │ │ │ +
36
│ │ │ │ +
37namespace BasisFactory {
│ │ │ │ +
38
│ │ │ │ + │ │ │ │ +
45
│ │ │ │ + │ │ │ │ +
47
│ │ │ │ + │ │ │ │ + │ │ │ │ +
80 {};
│ │ │ │ +
81
│ │ │ │ + │ │ │ │ +
113 : public IndexMergingStrategy
│ │ │ │ +
114 {};
│ │ │ │ +
115
│ │ │ │ + │ │ │ │ +
147 : public IndexMergingStrategy
│ │ │ │ +
148 {};
│ │ │ │ +
149
│ │ │ │ + │ │ │ │ +
181
│ │ │ │
182
│ │ │ │ - │ │ │ │ -
185 {
│ │ │ │ -
186 return Derivative(Imp::derivativeIfImplemented<DerivativeDummy, F>(t.f_), t.entitySet_.gridView());
│ │ │ │ -
187 }
│ │ │ │ -
188
│ │ │ │ - │ │ │ │ -
191 {
│ │ │ │ -
192 return LocalFunction(t.f_);
│ │ │ │ -
193 }
│ │ │ │ -
194
│ │ │ │ -
196 const EntitySet& entitySet() const
│ │ │ │ -
197 {
│ │ │ │ -
198 return entitySet_;
│ │ │ │ -
199 }
│ │ │ │ -
200
│ │ │ │ -
201private:
│ │ │ │ -
202 F f_;
│ │ │ │ -
203 EntitySet entitySet_;
│ │ │ │ -
204};
│ │ │ │ -
205
│ │ │ │ -
206
│ │ │ │ -
207
│ │ │ │ -
224template<class F, class GridView>
│ │ │ │ -
225AnalyticGridViewFunction<
│ │ │ │ -
226 typename std::invoke_result<F, typename GridView::template Codim<0>::Geometry::GlobalCoordinate>::type // Range
│ │ │ │ -
227 (typename GridView::template Codim<0>::Geometry::GlobalCoordinate), // Domain
│ │ │ │ -
228 GridView,
│ │ │ │ -
229 typename std::decay<F>::type > // Raw type of F (without & or &&)
│ │ │ │ -
230 makeAnalyticGridViewFunction(F&& f, const GridView& gridView)
│ │ │ │ -
231{
│ │ │ │ -
232 using Domain = typename GridView::template Codim<0>::Geometry::GlobalCoordinate;
│ │ │ │ -
233 using Range = typename std::invoke_result<F, Domain>::type;
│ │ │ │ -
234 using FRaw = typename std::decay<F>::type;
│ │ │ │ + │ │ │ │ +
189 {
│ │ │ │ +
190 return {};
│ │ │ │ +
191 }
│ │ │ │ +
192
│ │ │ │ + │ │ │ │ +
199 {
│ │ │ │ +
200 return {};
│ │ │ │ +
201 }
│ │ │ │ +
202
│ │ │ │ + │ │ │ │ +
209 {
│ │ │ │ +
210 return {};
│ │ │ │ +
211 }
│ │ │ │ +
212
│ │ │ │ + │ │ │ │ +
219 {
│ │ │ │ +
220 return {};
│ │ │ │ +
221 }
│ │ │ │ +
222
│ │ │ │ +
223} // end namespace BasisFactory
│ │ │ │ +
224
│ │ │ │ +
225// Backward compatibility
│ │ │ │ +
226namespace BasisBuilder {
│ │ │ │ +
227
│ │ │ │ +
228 using namespace BasisFactory;
│ │ │ │ +
229
│ │ │ │ +
230}
│ │ │ │ +
231
│ │ │ │ +
232} // end namespace Functions
│ │ │ │ +
233} // end namespace Dune
│ │ │ │ +
234
│ │ │ │
235
│ │ │ │ -
236 return AnalyticGridViewFunction<Range(Domain), GridView, FRaw>(std::forward<F>(f), gridView);
│ │ │ │ -
237}
│ │ │ │ -
238
│ │ │ │ -
239
│ │ │ │ -
240
│ │ │ │ -
241}} // namespace Dune::Functions
│ │ │ │ -
242
│ │ │ │ -
243
│ │ │ │ -
244
│ │ │ │ -
245#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const TrigonometricFunction< K, sinFactor, cosFactor > &f)
Obtain derivative of TrigonometricFunction function.
Definition: trigonometricfunction.hh:39
│ │ │ │ -
AnalyticGridViewFunction< typename std::invoke_result< F, typename GridView::template Codim< 0 >::Geometry::GlobalCoordinate >::type(typename GridView::template Codim< 0 >::Geometry::GlobalCoordinate), GridView, typename std::decay< F >::type > makeAnalyticGridViewFunction(F &&f, const GridView &gridView)
Create an AnalyticGridViewFunction from a function and a grid view.
Definition: analyticgridviewfunction.hh:230
│ │ │ │ +
236#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BASISTAGS_HH
│ │ │ │ +
constexpr FlatLexicographic flatLexicographic()
Creates a lexicographic merging of direct children without blocking.
Definition: basistags.hh:188
│ │ │ │ +
constexpr BlockedInterleaved blockedInterleaved()
Creates an interleaved merging of direct children with blocking (i.e. creating blocks at the leaves c...
Definition: basistags.hh:218
│ │ │ │ +
constexpr FlatInterleaved flatInterleaved()
Creates an interleaved merging of direct children without blocking.
Definition: basistags.hh:198
│ │ │ │ +
constexpr BlockedLexicographic blockedLexicographic()
Creates a lexicographic merging of direct children with blocking (i.e. creating one block per direct ...
Definition: basistags.hh:208
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
Definition: differentiablefunction.hh:29
│ │ │ │ -
Helper class to deduce the signature of a callable.
Definition: signature.hh:56
│ │ │ │ -
Definition: analyticgridviewfunction.hh:138
│ │ │ │ -
Range operator()(const Domain &x) const
Evaluate the wrapped function f directly in global coordinates x.
Definition: analyticgridviewfunction.hh:178
│ │ │ │ -
typename EntitySet::LocalCoordinate LocalDomain
Definition: analyticgridviewfunction.hh:167
│ │ │ │ -
friend Derivative derivative(const AnalyticGridViewFunction &t)
Create a derivative grid-function by wrapping the derivative of f.
Definition: analyticgridviewfunction.hh:184
│ │ │ │ -
typename Element::Geometry Geometry
Definition: analyticgridviewfunction.hh:157
│ │ │ │ -
typename EntitySet::Element Element
Definition: analyticgridviewfunction.hh:156
│ │ │ │ - │ │ │ │ -
decltype(Imp::derivativeIfImplemented< DerivativeDummy, F >(std::declval< F >())) GlobalRawDerivative
Definition: analyticgridviewfunction.hh:164
│ │ │ │ -
Range(Domain) Signature
Definition: analyticgridviewfunction.hh:150
│ │ │ │ -
AnalyticGridViewFunction(FT &&f, const GridView &gridView)
Create the grid-function by wrapping a function f and create a GridViewEntitySet.
Definition: analyticgridviewfunction.hh:172
│ │ │ │ -
friend LocalFunction localFunction(const AnalyticGridViewFunction &t)
Construct the associated local-function.
Definition: analyticgridviewfunction.hh:190
│ │ │ │ -
typename Imp::LocalAnalyticGridViewFunction< Range(LocalDomain), GridView, F, LocalDerivativeTraits< EntitySet, DerivativeTraits >::template Traits > LocalFunction
Definition: analyticgridviewfunction.hh:168
│ │ │ │ -
typename SignatureTraits< Signature >::RawSignature RawSignature
Definition: analyticgridviewfunction.hh:151
│ │ │ │ -
const EntitySet & entitySet() const
Return the set of entities this local-function can be bound to.
Definition: analyticgridviewfunction.hh:196
│ │ │ │ -
typename DerivativeTraits< RawSignature >::Range(Domain) DerivativeSignature
Definition: analyticgridviewfunction.hh:152
│ │ │ │ - │ │ │ │ -
GridView::template Codim< codim >::Entity Element
Type of Elements contained in this EntitySet.
Definition: gridviewentityset.hh:32
│ │ │ │ -
Element::Geometry::LocalCoordinate LocalCoordinate
Type of local coordinates with respect to the Element.
Definition: gridviewentityset.hh:35
│ │ │ │ -
Derivative traits for local functions.
Definition: localderivativetraits.hh:28
│ │ │ │ +
static constexpr bool isIndexMergingStrategy()
Definition: basistags.hh:23
│ │ │ │ +
void registerIndexMergingStrategy(IndexMergingStrategy)
│ │ │ │ + │ │ │ │ +
auto require(T &&t) -> decltype(registerIndexMergingStrategy(t))
│ │ │ │ +
Base class for index merging strategies to simplify detection.
Definition: basistags.hh:44
│ │ │ │ +
Lexicographic merging of direct children without blocking.
Definition: basistags.hh:80
│ │ │ │ +
Interleaved merging of direct children without blocking.
Definition: basistags.hh:114
│ │ │ │ +
Lexicographic merging of direct children with blocking (i.e. creating one block per direct child).
Definition: basistags.hh:148
│ │ │ │ +
Interleaved merging of direct children with blocking (i.e. creating blocks at the leaves containing o...
Definition: basistags.hh:180
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,326 +4,150 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * gridfunctions │ │ │ │ │ -analyticgridviewfunction.hh │ │ │ │ │ + * functionspacebases │ │ │ │ │ +basistags.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#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BASISTAGS_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BASISTAGS_HH │ │ │ │ │ 5 │ │ │ │ │ 6#include │ │ │ │ │ - 7#include │ │ │ │ │ + 7#include │ │ │ │ │ 8 │ │ │ │ │ - 9#include │ │ │ │ │ - 10 │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ - 16#include │ │ │ │ │ - 17 │ │ │ │ │ - 18 │ │ │ │ │ - 19namespace Dune { │ │ │ │ │ - 20namespace Functions { │ │ │ │ │ + 9namespace Dune { │ │ │ │ │ + 10namespace Functions { │ │ │ │ │ + 11 │ │ │ │ │ + 12 namespace Concept { │ │ │ │ │ + 13 │ │ │ │ │ +14 struct IndexMergingStrategy │ │ │ │ │ + 15 { │ │ │ │ │ + 16 template │ │ │ │ │ +17 auto require(T&& t) -> decltype( │ │ │ │ │ + 18 registerIndexMergingStrategy(t) │ │ │ │ │ + 19 ); │ │ │ │ │ + 20 }; │ │ │ │ │ 21 │ │ │ │ │ - 22namespace Imp { │ │ │ │ │ - 23 │ │ │ │ │ - 24template class │ │ │ │ │ -DerivativeTraits=DefaultDerivativeTraits> │ │ │ │ │ - 25class LocalAnalyticGridViewFunction; │ │ │ │ │ - 26 │ │ │ │ │ - 27template │ │ │ │ │ -class DerivativeTraits> │ │ │ │ │ - 28class LocalAnalyticGridViewFunction │ │ │ │ │ - 29{ │ │ │ │ │ - 30public: │ │ │ │ │ - 31 using Signature = Range(LocalDomain); │ │ │ │ │ - 32 using RawSignature = typename SignatureTraits::RawSignature; │ │ │ │ │ - 33 using DerivativeSignature = typename DerivativeTraits::Range │ │ │ │ │ -(LocalDomain); │ │ │ │ │ - 34 │ │ │ │ │ - 35 using GridView = GV; │ │ │ │ │ - 36 using EntitySet = GridViewEntitySet; │ │ │ │ │ - 37 using Element = typename EntitySet::Element; │ │ │ │ │ - 38// using Geometry = typename Element::Geometry; │ │ │ │ │ - 39 using Geometry = typename std::decay::type; │ │ │ │ │ - 40 │ │ │ │ │ - 41 // Use the indirection via derivativeIfImplemented to also support │ │ │ │ │ - 42 // function types F that do not implement derivative. In this case │ │ │ │ │ - 43 // the interface type DifferentiableFunction is using a dummy for │ │ │ │ │ - 44 // the derivative type │ │ │ │ │ - 45 using DerivativeDummy = DifferentiableFunction; │ │ │ │ │ - 46 using GlobalRawDerivative = decltype(Imp:: │ │ │ │ │ -derivativeIfImplemented(std::declval())); │ │ │ │ │ - 47 using LocalDerivative = LocalAnalyticGridViewFunction; │ │ │ │ │ - 48 │ │ │ │ │ - 50 template = 0> │ │ │ │ │ - 51 LocalAnalyticGridViewFunction(FT&& f) : │ │ │ │ │ - 52 f_(std::forward(f)) │ │ │ │ │ - 53 {} │ │ │ │ │ - 54 │ │ │ │ │ - 56 template │ │ │ │ │ - 57 LocalAnalyticGridViewFunction(FT&& f, const Element& element, const std:: │ │ │ │ │ -optional& geometry) : │ │ │ │ │ - 58 f_(std::forward(f)), │ │ │ │ │ - 59 element_(element), │ │ │ │ │ - 60 geometry_(geometry) │ │ │ │ │ - 61 {} │ │ │ │ │ - 62 │ │ │ │ │ - 63 │ │ │ │ │ - 72 void bind(const Element& element) │ │ │ │ │ - 73 { │ │ │ │ │ - 74 element_ = element; │ │ │ │ │ - 75 geometry_.emplace(element_.geometry()); │ │ │ │ │ - 76 } │ │ │ │ │ - 77 │ │ │ │ │ - 79 void unbind() │ │ │ │ │ - 80 { │ │ │ │ │ - 81 geometry_.reset(); │ │ │ │ │ - 82 } │ │ │ │ │ - 83 │ │ │ │ │ - 86 bool bound() const │ │ │ │ │ - 87 { │ │ │ │ │ - 88 return static_cast(geometry_); │ │ │ │ │ - 89 } │ │ │ │ │ - 90 │ │ │ │ │ - 100 Range operator()(const LocalDomain& x) const │ │ │ │ │ - 101 { │ │ │ │ │ - 102 assert(!!geometry_); │ │ │ │ │ - 103 return f_(geometry_->global(x)); │ │ │ │ │ - 104 } │ │ │ │ │ - 105 │ │ │ │ │ - 107 const Element& localContext() const │ │ │ │ │ - 108 { │ │ │ │ │ - 109 assert(!!geometry_); │ │ │ │ │ - 110 return element_; │ │ │ │ │ - 111 } │ │ │ │ │ - 112 │ │ │ │ │ - 121 friend LocalDerivative derivative(const LocalAnalyticGridViewFunction& t) │ │ │ │ │ - 122 { │ │ │ │ │ - 123 return LocalDerivative(Imp::derivativeIfImplemented │ │ │ │ │ -(t.f_), t.element_, t.geometry_); │ │ │ │ │ - 124 } │ │ │ │ │ - 125 │ │ │ │ │ - 126private: │ │ │ │ │ - 127 F f_; │ │ │ │ │ - 128 Element element_; │ │ │ │ │ - 129 std::optional geometry_ = std::nullopt; │ │ │ │ │ - 130}; │ │ │ │ │ - 131 │ │ │ │ │ - 132} // end namespace Imp │ │ │ │ │ - 133 │ │ │ │ │ - 134 │ │ │ │ │ - 135 │ │ │ │ │ - 136 │ │ │ │ │ - 137template class │ │ │ │ │ -DerivativeTraits=DefaultDerivativeTraits> │ │ │ │ │ -138class AnalyticGridViewFunction; │ │ │ │ │ - 139 │ │ │ │ │ - 140 │ │ │ │ │ - 146template │ │ │ │ │ -class DerivativeTraits> │ │ │ │ │ -147class AnalyticGridViewFunction │ │ │ │ │ - 148{ │ │ │ │ │ - 149public: │ │ │ │ │ -150 using Signature = Range(Domain); │ │ │ │ │ -151 using RawSignature = typename SignatureTraits::RawSignature; │ │ │ │ │ -152 using DerivativeSignature = typename DerivativeTraits::Range │ │ │ │ │ -(Domain); │ │ │ │ │ - 153 │ │ │ │ │ -154 using GridView = GV; │ │ │ │ │ -155 using EntitySet = GridViewEntitySet; │ │ │ │ │ -156 using Element = typename EntitySet::Element; │ │ │ │ │ -157 using Geometry = typename Element::Geometry; │ │ │ │ │ - 158 │ │ │ │ │ - 159 // Use the indirection via derivativeIfImplemented to also support │ │ │ │ │ - 160 // function types F that do not implement derivative. In this case │ │ │ │ │ - 161 // the interface type DifferentiableFunction is used a dummy for │ │ │ │ │ - 162 // the derivative type │ │ │ │ │ -163 using DerivativeDummy = DifferentiableFunction; │ │ │ │ │ -164 using GlobalRawDerivative = decltype(Imp:: │ │ │ │ │ -derivativeIfImplemented(std::declval())); │ │ │ │ │ -165 using Derivative = AnalyticGridViewFunction; │ │ │ │ │ - 166 │ │ │ │ │ -167 using LocalDomain = typename EntitySet::LocalCoordinate; │ │ │ │ │ -168 using LocalFunction = typename Imp::LocalAnalyticGridViewFunction::template Traits>; │ │ │ │ │ - 169 │ │ │ │ │ - 171 template │ │ │ │ │ -172 AnalyticGridViewFunction(FT&& f, const GridView& gridView) : │ │ │ │ │ - 173 f_(std::forward(f)), │ │ │ │ │ - 174 entitySet_(gridView) │ │ │ │ │ - 175 {} │ │ │ │ │ - 176 │ │ │ │ │ -178 Range operator()(const Domain& x) const │ │ │ │ │ - 179 { │ │ │ │ │ - 180 return f_(x); │ │ │ │ │ - 181 } │ │ │ │ │ + 22 template │ │ │ │ │ +23 static constexpr bool isIndexMergingStrategy() │ │ │ │ │ + 24 { │ │ │ │ │ + 25 return models(); │ │ │ │ │ + 26 } │ │ │ │ │ + 27 │ │ │ │ │ + 28 template │ │ │ │ │ +29 static constexpr bool isIndexMergingStrategy(T&& t) │ │ │ │ │ + 30 { │ │ │ │ │ + 31 return models>(); │ │ │ │ │ + 32 } │ │ │ │ │ + 33 │ │ │ │ │ + 34 } // namespace Concept │ │ │ │ │ + 35 │ │ │ │ │ + 36 │ │ │ │ │ +37namespace BasisFactory { │ │ │ │ │ + 38 │ │ │ │ │ +44 struct IndexMergingStrategy {}; │ │ │ │ │ + 45 │ │ │ │ │ +46 void registerIndexMergingStrategy(IndexMergingStrategy); │ │ │ │ │ + 47 │ │ │ │ │ +78 struct FlatLexicographic │ │ │ │ │ + 79 : public IndexMergingStrategy │ │ │ │ │ + 80 {}; │ │ │ │ │ + 81 │ │ │ │ │ +112 struct FlatInterleaved │ │ │ │ │ + 113 : public IndexMergingStrategy │ │ │ │ │ + 114 {}; │ │ │ │ │ + 115 │ │ │ │ │ +146 struct BlockedLexicographic │ │ │ │ │ + 147 : public IndexMergingStrategy │ │ │ │ │ + 148 {}; │ │ │ │ │ + 149 │ │ │ │ │ +180 struct BlockedInterleaved : public IndexMergingStrategy {}; │ │ │ │ │ + 181 │ │ │ │ │ 182 │ │ │ │ │ -184 friend Derivative derivative(const AnalyticGridViewFunction& t) │ │ │ │ │ - 185 { │ │ │ │ │ - 186 return Derivative(Imp::derivativeIfImplemented(t.f_), │ │ │ │ │ -t.entitySet_.gridView()); │ │ │ │ │ - 187 } │ │ │ │ │ - 188 │ │ │ │ │ -190 friend LocalFunction localFunction(const AnalyticGridViewFunction& t) │ │ │ │ │ - 191 { │ │ │ │ │ - 192 return LocalFunction(t.f_); │ │ │ │ │ - 193 } │ │ │ │ │ - 194 │ │ │ │ │ -196 const EntitySet& entitySet() const │ │ │ │ │ - 197 { │ │ │ │ │ - 198 return entitySet_; │ │ │ │ │ - 199 } │ │ │ │ │ - 200 │ │ │ │ │ - 201private: │ │ │ │ │ - 202 F f_; │ │ │ │ │ - 203 EntitySet entitySet_; │ │ │ │ │ - 204}; │ │ │ │ │ - 205 │ │ │ │ │ - 206 │ │ │ │ │ - 207 │ │ │ │ │ - 224template │ │ │ │ │ - 225AnalyticGridViewFunction< │ │ │ │ │ - 226 typename std::invoke_result:: │ │ │ │ │ -Geometry::GlobalCoordinate>::type // Range │ │ │ │ │ - 227 (typename GridView::template Codim<0>::Geometry::GlobalCoordinate), / │ │ │ │ │ -/ Domain │ │ │ │ │ - 228 GridView, │ │ │ │ │ - 229 typename std::decay::type > // Raw type of F (without & or &&) │ │ │ │ │ -230 makeAnalyticGridViewFunction(F&& f, const GridView& gridView) │ │ │ │ │ - 231{ │ │ │ │ │ - 232 using Domain = typename GridView::template Codim<0>::Geometry:: │ │ │ │ │ -GlobalCoordinate; │ │ │ │ │ - 233 using Range = typename std::invoke_result::type; │ │ │ │ │ - 234 using FRaw = typename std::decay::type; │ │ │ │ │ +188 constexpr FlatLexicographic flatLexicographic() │ │ │ │ │ + 189 { │ │ │ │ │ + 190 return {}; │ │ │ │ │ + 191 } │ │ │ │ │ + 192 │ │ │ │ │ +198 constexpr FlatInterleaved flatInterleaved() │ │ │ │ │ + 199 { │ │ │ │ │ + 200 return {}; │ │ │ │ │ + 201 } │ │ │ │ │ + 202 │ │ │ │ │ +208 constexpr BlockedLexicographic blockedLexicographic() │ │ │ │ │ + 209 { │ │ │ │ │ + 210 return {}; │ │ │ │ │ + 211 } │ │ │ │ │ + 212 │ │ │ │ │ +218 constexpr BlockedInterleaved blockedInterleaved() │ │ │ │ │ + 219 { │ │ │ │ │ + 220 return {}; │ │ │ │ │ + 221 } │ │ │ │ │ + 222 │ │ │ │ │ + 223} // end namespace BasisFactory │ │ │ │ │ + 224 │ │ │ │ │ + 225// Backward compatibility │ │ │ │ │ +226namespace BasisBuilder { │ │ │ │ │ + 227 │ │ │ │ │ + 228 using namespace BasisFactory; │ │ │ │ │ + 229 │ │ │ │ │ + 230} │ │ │ │ │ + 231 │ │ │ │ │ + 232} // end namespace Functions │ │ │ │ │ + 233} // end namespace Dune │ │ │ │ │ + 234 │ │ │ │ │ 235 │ │ │ │ │ - 236 return AnalyticGridViewFunction(std:: │ │ │ │ │ -forward(f), gridView); │ │ │ │ │ - 237} │ │ │ │ │ - 238 │ │ │ │ │ - 239 │ │ │ │ │ - 240 │ │ │ │ │ - 241}} // namespace Dune::Functions │ │ │ │ │ - 242 │ │ │ │ │ - 243 │ │ │ │ │ - 244 │ │ │ │ │ - 245#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH │ │ │ │ │ -differentiablefunction_imp.hh │ │ │ │ │ -signature.hh │ │ │ │ │ -defaultderivativetraits.hh │ │ │ │ │ -differentiablefunction.hh │ │ │ │ │ -gridviewentityset.hh │ │ │ │ │ -localderivativetraits.hh │ │ │ │ │ -Dune::Functions::derivative │ │ │ │ │ -TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const │ │ │ │ │ -TrigonometricFunction< K, sinFactor, cosFactor > &f) │ │ │ │ │ -Obtain derivative of TrigonometricFunction function. │ │ │ │ │ -Definition: trigonometricfunction.hh:39 │ │ │ │ │ -Dune::Functions::AnalyticGridViewFunction::makeAnalyticGridViewFunction │ │ │ │ │ -AnalyticGridViewFunction< typename std::invoke_result< F, typename GridView:: │ │ │ │ │ -template Codim< 0 >::Geometry::GlobalCoordinate >::type(typename GridView:: │ │ │ │ │ -template Codim< 0 >::Geometry::GlobalCoordinate), GridView, typename std:: │ │ │ │ │ -decay< F >::type > makeAnalyticGridViewFunction(F &&f, const GridView │ │ │ │ │ -&gridView) │ │ │ │ │ -Create an AnalyticGridViewFunction from a function and a grid view. │ │ │ │ │ -Definition: analyticgridviewfunction.hh:230 │ │ │ │ │ + 236#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BASISTAGS_HH │ │ │ │ │ +Dune::Functions::BasisFactory::flatLexicographic │ │ │ │ │ +constexpr FlatLexicographic flatLexicographic() │ │ │ │ │ +Creates a lexicographic merging of direct children without blocking. │ │ │ │ │ +Definition: basistags.hh:188 │ │ │ │ │ +Dune::Functions::BasisFactory::blockedInterleaved │ │ │ │ │ +constexpr BlockedInterleaved blockedInterleaved() │ │ │ │ │ +Creates an interleaved merging of direct children with blocking (i.e. creating │ │ │ │ │ +blocks at the leaves c... │ │ │ │ │ +Definition: basistags.hh:218 │ │ │ │ │ +Dune::Functions::BasisFactory::flatInterleaved │ │ │ │ │ +constexpr FlatInterleaved flatInterleaved() │ │ │ │ │ +Creates an interleaved merging of direct children without blocking. │ │ │ │ │ +Definition: basistags.hh:198 │ │ │ │ │ +Dune::Functions::BasisFactory::blockedLexicographic │ │ │ │ │ +constexpr BlockedLexicographic blockedLexicographic() │ │ │ │ │ +Creates a lexicographic merging of direct children with blocking (i.e. creating │ │ │ │ │ +one block per direct ... │ │ │ │ │ +Definition: basistags.hh:208 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::DifferentiableFunction │ │ │ │ │ -Definition: differentiablefunction.hh:29 │ │ │ │ │ -Dune::Functions::SignatureTraits │ │ │ │ │ -Helper class to deduce the signature of a callable. │ │ │ │ │ -Definition: signature.hh:56 │ │ │ │ │ -Dune::Functions::AnalyticGridViewFunction │ │ │ │ │ -Definition: analyticgridviewfunction.hh:138 │ │ │ │ │ -Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ -DerivativeTraits_>::operator() │ │ │ │ │ -Range operator()(const Domain &x) const │ │ │ │ │ -Evaluate the wrapped function f directly in global coordinates x. │ │ │ │ │ -Definition: analyticgridviewfunction.hh:178 │ │ │ │ │ -Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ -DerivativeTraits_>::LocalDomain │ │ │ │ │ -typename EntitySet::LocalCoordinate LocalDomain │ │ │ │ │ -Definition: analyticgridviewfunction.hh:167 │ │ │ │ │ -Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ -DerivativeTraits_>::derivative │ │ │ │ │ -friend Derivative derivative(const AnalyticGridViewFunction &t) │ │ │ │ │ -Create a derivative grid-function by wrapping the derivative of f. │ │ │ │ │ -Definition: analyticgridviewfunction.hh:184 │ │ │ │ │ -Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ -DerivativeTraits_>::Geometry │ │ │ │ │ -typename Element::Geometry Geometry │ │ │ │ │ -Definition: analyticgridviewfunction.hh:157 │ │ │ │ │ -Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ -DerivativeTraits_>::Element │ │ │ │ │ -typename EntitySet::Element Element │ │ │ │ │ -Definition: analyticgridviewfunction.hh:156 │ │ │ │ │ -Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ -DerivativeTraits_>::GridView │ │ │ │ │ -GV GridView │ │ │ │ │ -Definition: analyticgridviewfunction.hh:154 │ │ │ │ │ -Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ -DerivativeTraits_>::GlobalRawDerivative │ │ │ │ │ -decltype(Imp::derivativeIfImplemented< DerivativeDummy, F >(std::declval< F > │ │ │ │ │ -())) GlobalRawDerivative │ │ │ │ │ -Definition: analyticgridviewfunction.hh:164 │ │ │ │ │ -Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ -DerivativeTraits_>::Signature │ │ │ │ │ -Range(Domain) Signature │ │ │ │ │ -Definition: analyticgridviewfunction.hh:150 │ │ │ │ │ -Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ -DerivativeTraits_>::AnalyticGridViewFunction │ │ │ │ │ -AnalyticGridViewFunction(FT &&f, const GridView &gridView) │ │ │ │ │ -Create the grid-function by wrapping a function f and create a │ │ │ │ │ -GridViewEntitySet. │ │ │ │ │ -Definition: analyticgridviewfunction.hh:172 │ │ │ │ │ -Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ -DerivativeTraits_>::localFunction │ │ │ │ │ -friend LocalFunction localFunction(const AnalyticGridViewFunction &t) │ │ │ │ │ -Construct the associated local-function. │ │ │ │ │ -Definition: analyticgridviewfunction.hh:190 │ │ │ │ │ -Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ -DerivativeTraits_>::LocalFunction │ │ │ │ │ -typename Imp::LocalAnalyticGridViewFunction< Range(LocalDomain), GridView, F, │ │ │ │ │ -LocalDerivativeTraits< EntitySet, DerivativeTraits >::template Traits > │ │ │ │ │ -LocalFunction │ │ │ │ │ -Definition: analyticgridviewfunction.hh:168 │ │ │ │ │ -Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ -DerivativeTraits_>::RawSignature │ │ │ │ │ -typename SignatureTraits< Signature >::RawSignature RawSignature │ │ │ │ │ -Definition: analyticgridviewfunction.hh:151 │ │ │ │ │ -Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ -DerivativeTraits_>::entitySet │ │ │ │ │ -const EntitySet & entitySet() const │ │ │ │ │ -Return the set of entities this local-function can be bound to. │ │ │ │ │ -Definition: analyticgridviewfunction.hh:196 │ │ │ │ │ -Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ -DerivativeTraits_>::DerivativeSignature │ │ │ │ │ -typename DerivativeTraits< RawSignature >::Range(Domain) DerivativeSignature │ │ │ │ │ -Definition: analyticgridviewfunction.hh:152 │ │ │ │ │ -Dune::Functions::GridViewEntitySet<_GridView,_0_> │ │ │ │ │ -Dune::Functions::GridViewEntitySet<_GridView,_0_>::Element │ │ │ │ │ -GridView::template Codim< codim >::Entity Element │ │ │ │ │ -Type of Elements contained in this EntitySet. │ │ │ │ │ -Definition: gridviewentityset.hh:32 │ │ │ │ │ -Dune::Functions::GridViewEntitySet<_GridView,_0_>::LocalCoordinate │ │ │ │ │ -Element::Geometry::LocalCoordinate LocalCoordinate │ │ │ │ │ -Type of local coordinates with respect to the Element. │ │ │ │ │ -Definition: gridviewentityset.hh:35 │ │ │ │ │ -Dune::Functions::LocalDerivativeTraits │ │ │ │ │ -Derivative traits for local functions. │ │ │ │ │ -Definition: localderivativetraits.hh:28 │ │ │ │ │ +Dune::Functions::Concept::isIndexMergingStrategy │ │ │ │ │ +static constexpr bool isIndexMergingStrategy() │ │ │ │ │ +Definition: basistags.hh:23 │ │ │ │ │ +Dune::Functions::BasisFactory::registerIndexMergingStrategy │ │ │ │ │ +void registerIndexMergingStrategy(IndexMergingStrategy) │ │ │ │ │ +Dune::Functions::Concept::IndexMergingStrategy │ │ │ │ │ +Definition: basistags.hh:15 │ │ │ │ │ +Dune::Functions::Concept::IndexMergingStrategy::require │ │ │ │ │ +auto require(T &&t) -> decltype(registerIndexMergingStrategy(t)) │ │ │ │ │ +Dune::Functions::BasisFactory::IndexMergingStrategy │ │ │ │ │ +Base class for index merging strategies to simplify detection. │ │ │ │ │ +Definition: basistags.hh:44 │ │ │ │ │ +Dune::Functions::BasisFactory::FlatLexicographic │ │ │ │ │ +Lexicographic merging of direct children without blocking. │ │ │ │ │ +Definition: basistags.hh:80 │ │ │ │ │ +Dune::Functions::BasisFactory::FlatInterleaved │ │ │ │ │ +Interleaved merging of direct children without blocking. │ │ │ │ │ +Definition: basistags.hh:114 │ │ │ │ │ +Dune::Functions::BasisFactory::BlockedLexicographic │ │ │ │ │ +Lexicographic merging of direct children with blocking (i.e. creating one block │ │ │ │ │ +per direct child). │ │ │ │ │ +Definition: basistags.hh:148 │ │ │ │ │ +Dune::Functions::BasisFactory::BlockedInterleaved │ │ │ │ │ +Interleaved merging of direct children with blocking (i.e. creating blocks at │ │ │ │ │ +the leaves containing o... │ │ │ │ │ +Definition: basistags.hh:180 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00095.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: gridviewfunction.hh File Reference │ │ │ │ +dune-functions: flatvectorview.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,58 +58,53 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
gridviewfunction.hh File Reference
│ │ │ │ +
flatvectorview.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <memory>
│ │ │ │ +
#include <array>
│ │ │ │ #include <dune/common/concept.hh>
│ │ │ │ -#include <dune/functions/gridfunctions/gridfunction.hh>
│ │ │ │ -#include <dune/functions/gridfunctions/gridviewentityset.hh>
│ │ │ │ -#include <dune/functions/gridfunctions/analyticgridviewfunction.hh>
│ │ │ │ +#include <dune/common/hybridutilities.hh>
│ │ │ │ +#include <dune/common/indices.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::Functions::GridViewFunction< Signature, GridView, DerivativeTraits, bufferSize >
 
class  Dune::Functions::GridViewFunction< Range(Domain), GV, DerivativeTraits, bufferSize >
 Wrapper class for functions defined on a GridView. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<class F , class GridView , typename std::enable_if< models< Imp::HasFreeLocalFunction, F >(), int >::type = 0>
std::decay< F >::type Dune::Functions::makeGridViewFunction (F &&f, const GridView &gridView)
 Construct a function modeling GridViewFunction from function and grid view. More...
 
template<class F , class GridView , typename std::enable_if< not(models< Imp::HasFreeLocalFunction, F >()), int >::type = 0>
auto Dune::Functions::makeGridViewFunction (F &&f, const GridView &gridView) -> decltype(makeAnalyticGridViewFunction(std::forward< F >(f), gridView))
 Construct a function modeling GridViewFunction from function and grid view. More...
 
template<class T >
auto Dune::Functions::flatVectorView (T &t)
 Create flat vector view of passed mutable container. More...
 
template<class T >
auto Dune::Functions::flatVectorView (const T &t)
 Create flat vector view of passed const container. More...
 
template<class T >
auto Dune::Functions::flatVectorView (T &&t)
 Create flat vector view of passed container temporary. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,49 +4,37 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * gridfunctions │ │ │ │ │ -Classes | Namespaces | Functions │ │ │ │ │ -gridviewfunction.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ + * functionspacebases │ │ │ │ │ +Namespaces | Functions │ │ │ │ │ +flatvectorview.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ - Classes │ │ │ │ │ -class  Dune::Functions::GridViewFunction<_Signature,_GridView, │ │ │ │ │ - DerivativeTraits,_bufferSize_> │ │ │ │ │ -  │ │ │ │ │ -class  Dune::Functions::GridViewFunction<_Range(Domain),_GV,_DerivativeTraits, │ │ │ │ │ - bufferSize_> │ │ │ │ │ -  Wrapper class for functions defined on a GridView. More... │ │ │ │ │ -  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ -template(), int >::type = 0> │ │ │ │ │ -std::decay< F >::type Dune::Functions::makeGridViewFunction (F &&f, const │ │ │ │ │ - GridView &gridView) │ │ │ │ │ -  Construct a function modeling GridViewFunction from │ │ │ │ │ - function and grid view. More... │ │ │ │ │ -  │ │ │ │ │ -template()), int >::type = 0> │ │ │ │ │ - auto Dune::Functions::makeGridViewFunction (F &&f, const │ │ │ │ │ - GridView &gridView) -> decltype │ │ │ │ │ - (makeAnalyticGridViewFunction(std::forward< F >(f), │ │ │ │ │ - gridView)) │ │ │ │ │ -  Construct a function modeling GridViewFunction from │ │ │ │ │ - function and grid view. More... │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::flatVectorView (T &t) │ │ │ │ │ +  Create flat vector view of passed mutable container. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::flatVectorView (const T &t) │ │ │ │ │ +  Create flat vector view of passed const container. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::flatVectorView (T &&t) │ │ │ │ │ +  Create flat vector view of passed container temporary. More... │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00095_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: gridviewfunction.hh Source File │ │ │ │ +dune-functions: flatvectorview.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,95 +58,213 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
gridviewfunction.hh
│ │ │ │ +
flatvectorview.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#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWFUNCTION_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWFUNCTION_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATVECTORVIEW_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATVECTORVIEW_HH
│ │ │ │
5
│ │ │ │ -
6#include <memory>
│ │ │ │ -
7
│ │ │ │ -
8#include <dune/common/concept.hh>
│ │ │ │ -
9
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
13
│ │ │ │ +
6
│ │ │ │ +
7#include <array>
│ │ │ │ +
8
│ │ │ │ +
9#include <dune/common/concept.hh>
│ │ │ │ +
10#include <dune/common/hybridutilities.hh>
│ │ │ │ +
11#include <dune/common/indices.hh>
│ │ │ │ +
12
│ │ │ │ + │ │ │ │
14
│ │ │ │ -
15namespace Dune {
│ │ │ │ -
16namespace Functions {
│ │ │ │ +
15
│ │ │ │ +
16
│ │ │ │
17
│ │ │ │ -
18
│ │ │ │ -
19
│ │ │ │ -
20template<class Signature, class GridView, template<class> class DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56>
│ │ │ │ - │ │ │ │ -
22{};
│ │ │ │ -
23
│ │ │ │ -
24
│ │ │ │ -
25
│ │ │ │ -
40template<class Range, class Domain, class GV, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ -
41class GridViewFunction<Range(Domain), GV, DerivativeTraits, bufferSize> :
│ │ │ │ -
42 public GridFunction<Range(Domain), GridViewEntitySet<GV, 0>, DerivativeTraits, bufferSize>
│ │ │ │ -
43{
│ │ │ │ -
44 using Base = GridFunction<Range(Domain), GridViewEntitySet<GV, 0>, DerivativeTraits, bufferSize>;
│ │ │ │ -
45public:
│ │ │ │ -
46 using GridView = GV;
│ │ │ │ +
18namespace Dune {
│ │ │ │ +
19namespace Functions {
│ │ │ │ +
20namespace Impl {
│ │ │ │ +
21
│ │ │ │ +
22
│ │ │ │ +
23template<class V>
│ │ │ │ +
24struct FlatVectorBackend
│ │ │ │ +
25{
│ │ │ │ +
26
│ │ │ │ +
27 template<class VV, class Index,
│ │ │ │ +
28 typename std::enable_if< models<Concept::HasIndexAccess, VV, Index>(), int>::type = 0>
│ │ │ │ +
29 static decltype(auto) getEntry(VV&& v, const Index& i)
│ │ │ │ +
30 {
│ │ │ │ +
31 return v[i];
│ │ │ │ +
32 }
│ │ │ │ +
33
│ │ │ │ +
34 template<class VV, class Index,
│ │ │ │ +
35 typename std::enable_if< not models<Concept::HasIndexAccess, VV, Index>(), int>::type = 0>
│ │ │ │ +
36 static decltype(auto) getEntry(VV&& v, const Index&)
│ │ │ │ +
37 {
│ │ │ │ +
38 return std::forward<VV>(v);
│ │ │ │ +
39 }
│ │ │ │ +
40
│ │ │ │ +
41 template<class VV,
│ │ │ │ +
42 typename std::enable_if< models<Concept::HasSizeMethod, VV>(), int>::type = 0>
│ │ │ │ +
43 static auto size(VV&& v)
│ │ │ │ +
44 {
│ │ │ │ +
45 return Dune::Hybrid::size(v);
│ │ │ │ +
46 }
│ │ │ │
47
│ │ │ │ -
48 using Base::Base;
│ │ │ │ -
49};
│ │ │ │ -
50
│ │ │ │ -
51
│ │ │ │ -
52
│ │ │ │ -
64template<class F, class GridView,
│ │ │ │ -
65 typename std::enable_if<
│ │ │ │ -
66 models< Imp::HasFreeLocalFunction, F>() , int>::type = 0>
│ │ │ │ -
67typename std::decay<F>::type
│ │ │ │ -
68 makeGridViewFunction(F&& f, const GridView& gridView)
│ │ │ │ -
69{
│ │ │ │ -
70 return std::forward<F>(f);
│ │ │ │ -
71}
│ │ │ │ -
72
│ │ │ │ -
73
│ │ │ │ -
74
│ │ │ │ -
90template<class F, class GridView,
│ │ │ │ -
91 typename std::enable_if<
│ │ │ │ -
92 not(models< Imp::HasFreeLocalFunction, F>()) , int>::type = 0>
│ │ │ │ -
93auto makeGridViewFunction(F&& f, const GridView& gridView)
│ │ │ │ -
94 -> decltype(makeAnalyticGridViewFunction(std::forward<F>(f), gridView))
│ │ │ │ -
95{
│ │ │ │ -
96 return makeAnalyticGridViewFunction(std::forward<F>(f), gridView);
│ │ │ │ -
97}
│ │ │ │ +
48 template<class VV,
│ │ │ │ +
49 typename std::enable_if< not models<Concept::HasSizeMethod, VV>(), int>::type = 0>
│ │ │ │ +
50 static auto size(VV&&)
│ │ │ │ +
51 {
│ │ │ │ +
52 return Dune::index_constant<1>{};
│ │ │ │ +
53 }
│ │ │ │ +
54};
│ │ │ │ +
55
│ │ │ │ +
56
│ │ │ │ +
57
│ │ │ │ +
58
│ │ │ │ +
59template<class K, int n, int m>
│ │ │ │ +
60struct FlatVectorBackend<typename Dune::FieldMatrix<K, n, m> >
│ │ │ │ +
61{
│ │ │ │ +
62
│ │ │ │ +
63 template<class VV, class Index>
│ │ │ │ +
64 static decltype(auto) getEntry(VV&& v, const Index& i)
│ │ │ │ +
65 {
│ │ │ │ +
66 return v[i/m][i%m];
│ │ │ │ +
67 }
│ │ │ │ +
68
│ │ │ │ +
69 template<class VV>
│ │ │ │ +
70 static auto size(VV&& v)
│ │ │ │ +
71 {
│ │ │ │ +
72 return Dune::index_constant<n*m>{};
│ │ │ │ +
73 }
│ │ │ │ +
74};
│ │ │ │ +
75
│ │ │ │ +
76
│ │ │ │ +
77
│ │ │ │ +
78template<class K, std::size_t n>
│ │ │ │ +
79struct FlatVectorBackend< std::array<K, n> >
│ │ │ │ +
80{
│ │ │ │ +
81
│ │ │ │ +
82 template<class VV, class Index>
│ │ │ │ +
83 static decltype(auto) getEntry(VV&& v, const Index& i)
│ │ │ │ +
84 {
│ │ │ │ +
85 const auto innerSize = decltype(FlatVectorBackend<K>::size(v[0]))::value;
│ │ │ │ +
86 return FlatVectorBackend<K>::getEntry(v[i/innerSize], i%innerSize);
│ │ │ │ +
87 }
│ │ │ │ +
88
│ │ │ │ +
89 template<class VV>
│ │ │ │ +
90 static auto size(VV&& v)
│ │ │ │ +
91 {
│ │ │ │ +
92 const auto innerSize = decltype(FlatVectorBackend<K>::size(v[0]))::value;
│ │ │ │ +
93 return Dune::index_constant<n*innerSize>{};
│ │ │ │ +
94 }
│ │ │ │ +
95
│ │ │ │ +
96};
│ │ │ │ +
97
│ │ │ │
98
│ │ │ │
99
│ │ │ │
100
│ │ │ │ -
101} // end of namespace Dune::Functions
│ │ │ │ -
102} // end of namespace Dune
│ │ │ │ -
103
│ │ │ │ -
104#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWFUNCTION_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
AnalyticGridViewFunction< typename std::invoke_result< F, typename GridView::template Codim< 0 >::Geometry::GlobalCoordinate >::type(typename GridView::template Codim< 0 >::Geometry::GlobalCoordinate), GridView, typename std::decay< F >::type > makeAnalyticGridViewFunction(F &&f, const GridView &gridView)
Create an AnalyticGridViewFunction from a function and a grid view.
Definition: analyticgridviewfunction.hh:230
│ │ │ │ +
101template<class T>
│ │ │ │ +
102class FlatVectorView
│ │ │ │ +
103{
│ │ │ │ +
104 using Backend = FlatVectorBackend<std::decay_t<T>>;
│ │ │ │ +
105public:
│ │ │ │ +
106 FlatVectorView(T& t) :
│ │ │ │ +
107 t_(&t)
│ │ │ │ +
108 {}
│ │ │ │ +
109
│ │ │ │ +
110 auto size() const
│ │ │ │ +
111 {
│ │ │ │ +
112 return Backend::size(*t_);
│ │ │ │ +
113 }
│ │ │ │ +
114
│ │ │ │ +
115 template<class Index>
│ │ │ │ +
116 decltype(auto) operator[](const Index& i) const
│ │ │ │ +
117 {
│ │ │ │ +
118 return Backend::getEntry(*t_, i);
│ │ │ │ +
119 }
│ │ │ │ +
120
│ │ │ │ +
121 template<class Index>
│ │ │ │ +
122 decltype(auto) operator[](const Index& i)
│ │ │ │ +
123 {
│ │ │ │ +
124 return Backend::getEntry(*t_, i);
│ │ │ │ +
125 }
│ │ │ │ +
126
│ │ │ │ +
127private:
│ │ │ │ +
128 T* t_;
│ │ │ │ +
129};
│ │ │ │ +
130
│ │ │ │ +
131
│ │ │ │ +
132template<class T>
│ │ │ │ +
133class FlatVectorView<T&&>
│ │ │ │ +
134{
│ │ │ │ +
135 using Backend = FlatVectorBackend<std::decay_t<T>>;
│ │ │ │ +
136public:
│ │ │ │ +
137 FlatVectorView(T&& t) :
│ │ │ │ +
138 t_(std::move(t))
│ │ │ │ +
139 {}
│ │ │ │ +
140
│ │ │ │ +
141 auto size() const
│ │ │ │ +
142 {
│ │ │ │ +
143 return Backend::size(t_);
│ │ │ │ +
144 }
│ │ │ │ +
145
│ │ │ │ +
146 template<class Index>
│ │ │ │ +
147 decltype(auto) operator[](const Index& i) const
│ │ │ │ +
148 {
│ │ │ │ +
149 return Backend::getEntry(t_, i);
│ │ │ │ +
150 }
│ │ │ │ +
151
│ │ │ │ +
152 template<class Index>
│ │ │ │ +
153 decltype(auto) operator[](const Index& i)
│ │ │ │ +
154 {
│ │ │ │ +
155 return Backend::getEntry(t_, i);
│ │ │ │ +
156 }
│ │ │ │ +
157
│ │ │ │ +
158private:
│ │ │ │ +
159 T t_;
│ │ │ │ +
160};
│ │ │ │ +
161
│ │ │ │ +
162} // namespace Impl
│ │ │ │ +
163
│ │ │ │ +
164
│ │ │ │ +
165
│ │ │ │ +
178template<class T>
│ │ │ │ + │ │ │ │ +
180{
│ │ │ │ +
181 return Impl::FlatVectorView<T>(t);
│ │ │ │ +
182}
│ │ │ │ +
183
│ │ │ │ +
196template<class T>
│ │ │ │ +
197auto flatVectorView(const T& t)
│ │ │ │ +
198{
│ │ │ │ +
199 return Impl::FlatVectorView<const T>(t);
│ │ │ │ +
200}
│ │ │ │ +
201
│ │ │ │ +
214template<class T>
│ │ │ │ +
215auto flatVectorView(T&& t)
│ │ │ │ +
216{
│ │ │ │ +
217 return Impl::FlatVectorView<T&&>(std::move(t));
│ │ │ │ +
218}
│ │ │ │ +
219
│ │ │ │ +
220
│ │ │ │ +
221} // namespace Dune::Functions
│ │ │ │ +
222} // namespace Dune
│ │ │ │ +
223
│ │ │ │ +
224
│ │ │ │ +
225#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATVECTORVIEW_HH
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
std::decay< F >::type makeGridViewFunction(F &&f, const GridView &gridView)
Construct a function modeling GridViewFunction from function and grid view.
Definition: gridviewfunction.hh:68
│ │ │ │ -
Definition: gridfunction.hh:32
│ │ │ │ -
An entity set for all entities of given codim in a grid view.
Definition: gridviewentityset.hh:23
│ │ │ │ -
Definition: gridviewfunction.hh:22
│ │ │ │ - │ │ │ │ +
auto flatVectorView(T &t)
Create flat vector view of passed mutable container.
Definition: flatvectorview.hh:179
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,109 +4,213 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * gridfunctions │ │ │ │ │ -gridviewfunction.hh │ │ │ │ │ + * functionspacebases │ │ │ │ │ +flatvectorview.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#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWFUNCTION_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWFUNCTION_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATVECTORVIEW_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATVECTORVIEW_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13 │ │ │ │ │ + 6 │ │ │ │ │ + 7#include │ │ │ │ │ + 8 │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12 │ │ │ │ │ + 13#include │ │ │ │ │ 14 │ │ │ │ │ - 15namespace Dune { │ │ │ │ │ - 16namespace Functions { │ │ │ │ │ + 15 │ │ │ │ │ + 16 │ │ │ │ │ 17 │ │ │ │ │ - 18 │ │ │ │ │ - 19 │ │ │ │ │ - 20template class │ │ │ │ │ -DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56> │ │ │ │ │ -21class GridViewFunction │ │ │ │ │ - 22{}; │ │ │ │ │ - 23 │ │ │ │ │ - 24 │ │ │ │ │ - 25 │ │ │ │ │ - 40template class │ │ │ │ │ -DerivativeTraits, size_t bufferSize> │ │ │ │ │ -41class GridViewFunction : │ │ │ │ │ - 42 public GridFunction, │ │ │ │ │ -DerivativeTraits, bufferSize> │ │ │ │ │ - 43{ │ │ │ │ │ - 44 using Base = GridFunction, │ │ │ │ │ -DerivativeTraits, bufferSize>; │ │ │ │ │ - 45public: │ │ │ │ │ -46 using GridView = GV; │ │ │ │ │ + 18namespace Dune { │ │ │ │ │ + 19namespace Functions { │ │ │ │ │ + 20namespace Impl { │ │ │ │ │ + 21 │ │ │ │ │ + 22 │ │ │ │ │ + 23template │ │ │ │ │ + 24struct FlatVectorBackend │ │ │ │ │ + 25{ │ │ │ │ │ + 26 │ │ │ │ │ + 27 template(), │ │ │ │ │ +int>::type = 0> │ │ │ │ │ + 29 static decltype(auto) getEntry(VV&& v, const Index& i) │ │ │ │ │ + 30 { │ │ │ │ │ + 31 return v[i]; │ │ │ │ │ + 32 } │ │ │ │ │ + 33 │ │ │ │ │ + 34 template(), │ │ │ │ │ +int>::type = 0> │ │ │ │ │ + 36 static decltype(auto) getEntry(VV&& v, const Index&) │ │ │ │ │ + 37 { │ │ │ │ │ + 38 return std::forward(v); │ │ │ │ │ + 39 } │ │ │ │ │ + 40 │ │ │ │ │ + 41 template(), int>::type = │ │ │ │ │ +0> │ │ │ │ │ + 43 static auto size(VV&& v) │ │ │ │ │ + 44 { │ │ │ │ │ + 45 return Dune::Hybrid::size(v); │ │ │ │ │ + 46 } │ │ │ │ │ 47 │ │ │ │ │ - 48 using Base::Base; │ │ │ │ │ - 49}; │ │ │ │ │ - 50 │ │ │ │ │ - 51 │ │ │ │ │ - 52 │ │ │ │ │ - 64template() , int>::type = 0> │ │ │ │ │ - 67typename std::decay::type │ │ │ │ │ -68 makeGridViewFunction(F&& f, const GridView& gridView) │ │ │ │ │ - 69{ │ │ │ │ │ - 70 return std::forward(f); │ │ │ │ │ - 71} │ │ │ │ │ - 72 │ │ │ │ │ - 73 │ │ │ │ │ - 74 │ │ │ │ │ - 90template()) , int>::type = 0> │ │ │ │ │ -93auto makeGridViewFunction(F&& f, const GridView& gridView) │ │ │ │ │ - 94 -> decltype(makeAnalyticGridViewFunction(std::forward(f), gridView)) │ │ │ │ │ - 95{ │ │ │ │ │ - 96 return makeAnalyticGridViewFunction(std::forward(f), gridView); │ │ │ │ │ - 97} │ │ │ │ │ + 48 template(), int>:: │ │ │ │ │ +type = 0> │ │ │ │ │ + 50 static auto size(VV&&) │ │ │ │ │ + 51 { │ │ │ │ │ + 52 return Dune::index_constant<1>{}; │ │ │ │ │ + 53 } │ │ │ │ │ + 54}; │ │ │ │ │ + 55 │ │ │ │ │ + 56 │ │ │ │ │ + 57 │ │ │ │ │ + 58 │ │ │ │ │ + 59template │ │ │ │ │ + 60struct FlatVectorBackend > │ │ │ │ │ + 61{ │ │ │ │ │ + 62 │ │ │ │ │ + 63 template │ │ │ │ │ + 64 static decltype(auto) getEntry(VV&& v, const Index& i) │ │ │ │ │ + 65 { │ │ │ │ │ + 66 return v[i/m][i%m]; │ │ │ │ │ + 67 } │ │ │ │ │ + 68 │ │ │ │ │ + 69 template │ │ │ │ │ + 70 static auto size(VV&& v) │ │ │ │ │ + 71 { │ │ │ │ │ + 72 return Dune::index_constant{}; │ │ │ │ │ + 73 } │ │ │ │ │ + 74}; │ │ │ │ │ + 75 │ │ │ │ │ + 76 │ │ │ │ │ + 77 │ │ │ │ │ + 78template │ │ │ │ │ + 79struct FlatVectorBackend< std::array > │ │ │ │ │ + 80{ │ │ │ │ │ + 81 │ │ │ │ │ + 82 template │ │ │ │ │ + 83 static decltype(auto) getEntry(VV&& v, const Index& i) │ │ │ │ │ + 84 { │ │ │ │ │ + 85 const auto innerSize = decltype(FlatVectorBackend::size(v[0]))::value; │ │ │ │ │ + 86 return FlatVectorBackend::getEntry(v[i/innerSize], i%innerSize); │ │ │ │ │ + 87 } │ │ │ │ │ + 88 │ │ │ │ │ + 89 template │ │ │ │ │ + 90 static auto size(VV&& v) │ │ │ │ │ + 91 { │ │ │ │ │ + 92 const auto innerSize = decltype(FlatVectorBackend::size(v[0]))::value; │ │ │ │ │ + 93 return Dune::index_constant{}; │ │ │ │ │ + 94 } │ │ │ │ │ + 95 │ │ │ │ │ + 96}; │ │ │ │ │ + 97 │ │ │ │ │ 98 │ │ │ │ │ 99 │ │ │ │ │ 100 │ │ │ │ │ - 101} // end of namespace Dune::Functions │ │ │ │ │ - 102} // end of namespace Dune │ │ │ │ │ - 103 │ │ │ │ │ - 104#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWFUNCTION_HH │ │ │ │ │ -gridviewentityset.hh │ │ │ │ │ -analyticgridviewfunction.hh │ │ │ │ │ -gridfunction.hh │ │ │ │ │ -Dune::Functions::makeAnalyticGridViewFunction │ │ │ │ │ -AnalyticGridViewFunction< typename std::invoke_result< F, typename GridView:: │ │ │ │ │ -template Codim< 0 >::Geometry::GlobalCoordinate >::type(typename GridView:: │ │ │ │ │ -template Codim< 0 >::Geometry::GlobalCoordinate), GridView, typename std:: │ │ │ │ │ -decay< F >::type > makeAnalyticGridViewFunction(F &&f, const GridView │ │ │ │ │ -&gridView) │ │ │ │ │ -Create an AnalyticGridViewFunction from a function and a grid view. │ │ │ │ │ -Definition: analyticgridviewfunction.hh:230 │ │ │ │ │ + 101template │ │ │ │ │ + 102class FlatVectorView │ │ │ │ │ + 103{ │ │ │ │ │ + 104 using Backend = FlatVectorBackend>; │ │ │ │ │ + 105public: │ │ │ │ │ + 106 FlatVectorView(T& t) : │ │ │ │ │ + 107 t_(&t) │ │ │ │ │ + 108 {} │ │ │ │ │ + 109 │ │ │ │ │ + 110 auto size() const │ │ │ │ │ + 111 { │ │ │ │ │ + 112 return Backend::size(*t_); │ │ │ │ │ + 113 } │ │ │ │ │ + 114 │ │ │ │ │ + 115 template │ │ │ │ │ + 116 decltype(auto) operator[](const Index& i) const │ │ │ │ │ + 117 { │ │ │ │ │ + 118 return Backend::getEntry(*t_, i); │ │ │ │ │ + 119 } │ │ │ │ │ + 120 │ │ │ │ │ + 121 template │ │ │ │ │ + 122 decltype(auto) operator[](const Index& i) │ │ │ │ │ + 123 { │ │ │ │ │ + 124 return Backend::getEntry(*t_, i); │ │ │ │ │ + 125 } │ │ │ │ │ + 126 │ │ │ │ │ + 127private: │ │ │ │ │ + 128 T* t_; │ │ │ │ │ + 129}; │ │ │ │ │ + 130 │ │ │ │ │ + 131 │ │ │ │ │ + 132template │ │ │ │ │ + 133class FlatVectorView │ │ │ │ │ + 134{ │ │ │ │ │ + 135 using Backend = FlatVectorBackend>; │ │ │ │ │ + 136public: │ │ │ │ │ + 137 FlatVectorView(T&& t) : │ │ │ │ │ + 138 t_(std::move(t)) │ │ │ │ │ + 139 {} │ │ │ │ │ + 140 │ │ │ │ │ + 141 auto size() const │ │ │ │ │ + 142 { │ │ │ │ │ + 143 return Backend::size(t_); │ │ │ │ │ + 144 } │ │ │ │ │ + 145 │ │ │ │ │ + 146 template │ │ │ │ │ + 147 decltype(auto) operator[](const Index& i) const │ │ │ │ │ + 148 { │ │ │ │ │ + 149 return Backend::getEntry(t_, i); │ │ │ │ │ + 150 } │ │ │ │ │ + 151 │ │ │ │ │ + 152 template │ │ │ │ │ + 153 decltype(auto) operator[](const Index& i) │ │ │ │ │ + 154 { │ │ │ │ │ + 155 return Backend::getEntry(t_, i); │ │ │ │ │ + 156 } │ │ │ │ │ + 157 │ │ │ │ │ + 158private: │ │ │ │ │ + 159 T t_; │ │ │ │ │ + 160}; │ │ │ │ │ + 161 │ │ │ │ │ + 162} // namespace Impl │ │ │ │ │ + 163 │ │ │ │ │ + 164 │ │ │ │ │ + 165 │ │ │ │ │ + 178template │ │ │ │ │ +179auto flatVectorView(T& t) │ │ │ │ │ + 180{ │ │ │ │ │ + 181 return Impl::FlatVectorView(t); │ │ │ │ │ + 182} │ │ │ │ │ + 183 │ │ │ │ │ + 196template │ │ │ │ │ +197auto flatVectorView(const T& t) │ │ │ │ │ + 198{ │ │ │ │ │ + 199 return Impl::FlatVectorView(t); │ │ │ │ │ + 200} │ │ │ │ │ + 201 │ │ │ │ │ + 214template │ │ │ │ │ +215auto flatVectorView(T&& t) │ │ │ │ │ + 216{ │ │ │ │ │ + 217 return Impl::FlatVectorView(std::move(t)); │ │ │ │ │ + 218} │ │ │ │ │ + 219 │ │ │ │ │ + 220 │ │ │ │ │ + 221} // namespace Dune::Functions │ │ │ │ │ + 222} // namespace Dune │ │ │ │ │ + 223 │ │ │ │ │ + 224 │ │ │ │ │ + 225#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATVECTORVIEW_HH │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::makeGridViewFunction │ │ │ │ │ -std::decay< F >::type makeGridViewFunction(F &&f, const GridView &gridView) │ │ │ │ │ -Construct a function modeling GridViewFunction from function and grid view. │ │ │ │ │ -Definition: gridviewfunction.hh:68 │ │ │ │ │ -Dune::Functions::GridFunction │ │ │ │ │ -Definition: gridfunction.hh:32 │ │ │ │ │ -Dune::Functions::GridViewEntitySet │ │ │ │ │ -An entity set for all entities of given codim in a grid view. │ │ │ │ │ -Definition: gridviewentityset.hh:23 │ │ │ │ │ -Dune::Functions::GridViewFunction │ │ │ │ │ -Definition: gridviewfunction.hh:22 │ │ │ │ │ -Dune::Functions::GridViewFunction<_Range(Domain),_GV,_DerivativeTraits, │ │ │ │ │ -bufferSize_>::GridView │ │ │ │ │ -GV GridView │ │ │ │ │ -Definition: gridviewfunction.hh:46 │ │ │ │ │ +Dune::Functions::flatVectorView │ │ │ │ │ +auto flatVectorView(T &t) │ │ │ │ │ +Create flat vector view of passed mutable container. │ │ │ │ │ +Definition: flatvectorview.hh:179 │ │ │ │ │ +concepts.hh │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00098.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: gridfunction.hh File Reference │ │ │ │ +dune-functions: brezzidouglasmarinibasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,50 +58,71 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
gridfunction.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Typedefs | │ │ │ │ +Functions
│ │ │ │ +
brezzidouglasmarinibasis.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ -#include <dune/common/typeutilities.hh>
│ │ │ │ -#include <dune/functions/common/typeerasure.hh>
│ │ │ │ -#include <dune/functions/common/defaultderivativetraits.hh>
│ │ │ │ -#include <dune/functions/common/differentiablefunction.hh>
│ │ │ │ -#include <dune/functions/common/localfunction.hh>
│ │ │ │ -#include <dune/functions/common/functionconcepts.hh>
│ │ │ │ -#include <dune/functions/gridfunctions/localderivativetraits.hh>
│ │ │ │ -#include <dune/functions/gridfunctions/gridfunction_imp.hh>
│ │ │ │ +
#include <array>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/geometry/referenceelements.hh>
│ │ │ │ +#include <dune/localfunctions/common/virtualinterface.hh>
│ │ │ │ +#include <dune/localfunctions/common/virtualwrappers.hh>
│ │ │ │ +#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini1cube2d.hh>
│ │ │ │ +#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini1cube3d.hh>
│ │ │ │ +#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini1simplex2d.hh>
│ │ │ │ +#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini2cube2d.hh>
│ │ │ │ +#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini2simplex2d.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/globalvaluedlocalfiniteelement.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::GridFunction< Signature, EntitySet, DerivativeTraits, bufferSize >
class  Dune::Functions::BrezziDouglasMariniPreBasis< GV, k >
 
class  Dune::Functions::GridFunction< Range(Domain), ES, DerivativeTraits, bufferSize >
 Wrapper class for functions defined on a Grid. More...
class  Dune::Functions::BrezziDouglasMariniNode< GV, k >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
namespace  Dune::Functions::BasisFactory
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Typedefs

template<typename GV , int k>
using Dune::Functions::BrezziDouglasMariniBasis = DefaultGlobalBasis< BrezziDouglasMariniPreBasis< GV, k > >
 Basis of a scalar k-th-order BDM finite element space on simplex and cube grids. More...
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<std::size_t k>
auto Dune::Functions::BasisFactory::brezziDouglasMarini ()
 Create a pre-basis factory that can create a Brezzi-Douglas-Marini pre-basis. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,36 +4,57 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * gridfunctions │ │ │ │ │ -Classes | Namespaces │ │ │ │ │ -gridfunction.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * functionspacebases │ │ │ │ │ +Classes | Namespaces | Typedefs | Functions │ │ │ │ │ +brezzidouglasmarinibasis.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::GridFunction<_Signature,_EntitySet,_DerivativeTraits, │ │ │ │ │ - bufferSize_> │ │ │ │ │ +class  Dune::Functions::BrezziDouglasMariniPreBasis<_GV,_k_> │ │ │ │ │   │ │ │ │ │ -class  Dune::Functions::GridFunction<_Range(Domain),_ES,_DerivativeTraits, │ │ │ │ │ - bufferSize_> │ │ │ │ │ -  Wrapper class for functions defined on a Grid. More... │ │ │ │ │ +class  Dune::Functions::BrezziDouglasMariniNode<_GV,_k_> │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ +namespace  Dune::Functions::BasisFactory │ │ │ │ │ +  │ │ │ │ │ + Typedefs │ │ │ │ │ +template │ │ │ │ │ +using Dune::Functions::BrezziDouglasMariniBasis = DefaultGlobalBasis< │ │ │ │ │ + BrezziDouglasMariniPreBasis< GV, k > > │ │ │ │ │ +  Basis of a scalar k-th-order BDM finite element space on simplex and │ │ │ │ │ + cube grids. More... │ │ │ │ │ +  │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::BasisFactory::brezziDouglasMarini () │ │ │ │ │ +  Create a pre-basis factory that can create a Brezzi-Douglas-Marini pre- │ │ │ │ │ + basis. More... │ │ │ │ │ +  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00098_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: gridfunction.hh Source File │ │ │ │ +dune-functions: brezzidouglasmarinibasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,165 +58,393 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
gridfunction.hh
│ │ │ │ +
brezzidouglasmarinibasis.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#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BREZZIDOUGLASMARINIBASIS_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BREZZIDOUGLASMARINIBASIS_HH
│ │ │ │
5
│ │ │ │ -
6#include <type_traits>
│ │ │ │ -
7
│ │ │ │ -
8#include <dune/common/typeutilities.hh>
│ │ │ │ +
6#include <array>
│ │ │ │ +
7#include <dune/common/exceptions.hh>
│ │ │ │ +
8#include <dune/geometry/referenceelements.hh>
│ │ │ │
9
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
17
│ │ │ │ +
10#include <dune/localfunctions/common/virtualinterface.hh>
│ │ │ │ +
11#include <dune/localfunctions/common/virtualwrappers.hh>
│ │ │ │ +
12
│ │ │ │ +
13#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini1cube2d.hh>
│ │ │ │ +
14#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini1cube3d.hh>
│ │ │ │ +
15#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini1simplex2d.hh>
│ │ │ │ +
16#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini2cube2d.hh>
│ │ │ │ +
17#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini2simplex2d.hh>
│ │ │ │
18
│ │ │ │ -
19
│ │ │ │ -
20namespace Dune {
│ │ │ │ -
21namespace Functions {
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
22
│ │ │ │ -
23
│ │ │ │ -
24
│ │ │ │ -
25/*
│ │ │ │ -
26 * Default implementation is empty
│ │ │ │ -
27 * The actual implementation is only given if Signature is an type
│ │ │ │ -
28 * describing a function signature as Range(Domain).
│ │ │ │ -
29 */
│ │ │ │ -
30template<class Signature, class EntitySet, template<class> class DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56>
│ │ │ │ - │ │ │ │ -
32{};
│ │ │ │ +
23namespace Dune {
│ │ │ │ +
24namespace Functions {
│ │ │ │ +
25
│ │ │ │ +
26namespace Impl {
│ │ │ │ +
27
│ │ │ │ +
28 template<int dim, typename D, typename R, std::size_t k>
│ │ │ │ +
29 struct BDMSimplexLocalInfo
│ │ │ │ +
30 {
│ │ │ │ +
31 static_assert((AlwaysFalse<D>::value),"The requested type of BDM element is not implemented, sorry!");
│ │ │ │ +
32 };
│ │ │ │
33
│ │ │ │ -
34
│ │ │ │ -
35
│ │ │ │ -
36namespace Imp
│ │ │ │ -
37{
│ │ │ │ -
38
│ │ │ │ -
40 template<class S, class ES, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ -
41 struct GridFunctionTraits :
│ │ │ │ -
42 DifferentiableFunctionTraits<S, DerivativeTraits, bufferSize>
│ │ │ │ +
34 template<typename D, typename R>
│ │ │ │ +
35 struct BDMSimplexLocalInfo<2,D,R,1>
│ │ │ │ +
36 {
│ │ │ │ +
37 using FiniteElement = BDM1Simplex2DLocalFiniteElement<D,R>;
│ │ │ │ +
38 static const std::size_t Variants = 8;
│ │ │ │ +
39 };
│ │ │ │ +
40
│ │ │ │ +
41 template<typename D, typename R>
│ │ │ │ +
42 struct BDMSimplexLocalInfo<2,D,R,2>
│ │ │ │
43 {
│ │ │ │ -
44 protected:
│ │ │ │ -
45 using Base=DifferentiableFunctionTraits<S, DerivativeTraits, bufferSize>;
│ │ │ │ -
46
│ │ │ │ -
47 public:
│ │ │ │ -
49 using EntitySet = ES;
│ │ │ │ -
50
│ │ │ │ -
52 using Element = typename EntitySet::Element;
│ │ │ │ +
44 using FiniteElement = BDM2Simplex2DLocalFiniteElement<D,R>;
│ │ │ │ +
45 static const std::size_t Variants = 8;
│ │ │ │ +
46 };
│ │ │ │ +
47
│ │ │ │ +
48 template<int dim, typename D, typename R, std::size_t k>
│ │ │ │ +
49 struct BDMCubeLocalInfo
│ │ │ │ +
50 {
│ │ │ │ +
51 static_assert((AlwaysFalse<D>::value),"The requested type of BDM element is not implemented, sorry!");
│ │ │ │ +
52 };
│ │ │ │
53
│ │ │ │ -
55 using DerivativeSignature = typename Base::DerivativeSignature;
│ │ │ │ -
56
│ │ │ │ - │ │ │ │ -
59
│ │ │ │ -
61 using LocalSignature = typename Base::Range(typename EntitySet::LocalCoordinate);
│ │ │ │ -
62
│ │ │ │ -
64 template<class R>
│ │ │ │ - │ │ │ │ -
66
│ │ │ │ -
68 using LocalFunctionTraits = typename Dune::Functions::Imp::LocalFunctionTraits<LocalSignature, Element, LocalDerivativeTraits, bufferSize>;
│ │ │ │ -
69
│ │ │ │ - │ │ │ │ -
72
│ │ │ │ -
74 using Concept = GridFunctionWrapperInterface<S, DerivativeInterface, LocalFunctionInterface, ES>;
│ │ │ │ -
75
│ │ │ │ -
77 template<class B>
│ │ │ │ -
78 using Model = GridFunctionWrapperImplementation<S, DerivativeInterface, LocalFunctionInterface, ES, B>;
│ │ │ │ -
79 };
│ │ │ │ -
80}
│ │ │ │ +
54 template<typename D, typename R>
│ │ │ │ +
55 struct BDMCubeLocalInfo<2,D,R,1>
│ │ │ │ +
56 {
│ │ │ │ +
57 using FiniteElement = BDM1Cube2DLocalFiniteElement<D,R>;
│ │ │ │ +
58 static const std::size_t Variants = 16;
│ │ │ │ +
59 };
│ │ │ │ +
60
│ │ │ │ +
61 template<typename D, typename R>
│ │ │ │ +
62 struct BDMCubeLocalInfo<2,D,R,2>
│ │ │ │ +
63 {
│ │ │ │ +
64 using FiniteElement = BDM2Cube2DLocalFiniteElement<D,R>;
│ │ │ │ +
65 static const std::size_t Variants = 16;
│ │ │ │ +
66 };
│ │ │ │ +
67
│ │ │ │ +
68 template<typename D, typename R>
│ │ │ │ +
69 struct BDMCubeLocalInfo<3,D,R,1>
│ │ │ │ +
70 {
│ │ │ │ +
71 using FiniteElement = BDM1Cube3DLocalFiniteElement<D,R>;
│ │ │ │ +
72 static const std::size_t Variants = 64;
│ │ │ │ +
73 };
│ │ │ │ +
74
│ │ │ │ +
75 template<typename GV, int dim, typename R, std::size_t k>
│ │ │ │ +
76 class BDMLocalFiniteElementMap
│ │ │ │ +
77 {
│ │ │ │ +
78 using D = typename GV::ctype;
│ │ │ │ +
79 using CubeFiniteElement = typename BDMCubeLocalInfo<dim, D, R, k>::FiniteElement;
│ │ │ │ +
80 using SimplexFiniteElement = typename BDMSimplexLocalInfo<dim, D, R, k>::FiniteElement;
│ │ │ │
81
│ │ │ │ -
82
│ │ │ │ +
82 public:
│ │ │ │
83
│ │ │ │ -
95template<class Range, class Domain, class ES, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ -
96class GridFunction<Range(Domain), ES, DerivativeTraits, bufferSize> :
│ │ │ │ -
97 public TypeErasureBase<
│ │ │ │ -
98 typename Imp::GridFunctionTraits<Range(Domain), ES, DerivativeTraits, bufferSize>::Concept,
│ │ │ │ -
99 Imp::GridFunctionTraits<Range(Domain), ES, DerivativeTraits, bufferSize>::template Model>
│ │ │ │ -
100{
│ │ │ │ -
101 using Traits = Imp::GridFunctionTraits<Range(Domain), ES, DerivativeTraits, bufferSize>;
│ │ │ │ -
102
│ │ │ │ - │ │ │ │ -
104
│ │ │ │ -
105 using DerivativeInterface = typename Traits::DerivativeInterface;
│ │ │ │ +
84 using T = LocalBasisTraits<D, dim, FieldVector<D,dim>, R, dim, FieldVector<R,dim>, FieldMatrix<D,dim,dim> >;
│ │ │ │ +
85 using FiniteElement = LocalFiniteElementVirtualInterface<T>;
│ │ │ │ +
86
│ │ │ │ +
87 BDMLocalFiniteElementMap(const GV& gv)
│ │ │ │ +
88 : is_(&(gv.indexSet())), orient_(gv.size(0))
│ │ │ │ +
89 {
│ │ │ │ +
90 cubeVariant_.resize(BDMCubeLocalInfo<dim, D, R, k>::Variants);
│ │ │ │ +
91 simplexVariant_.resize(BDMSimplexLocalInfo<dim, D, R, k>::Variants);
│ │ │ │ +
92
│ │ │ │ +
93 // create all variants
│ │ │ │ +
94 for (size_t i = 0; i < cubeVariant_.size(); i++)
│ │ │ │ +
95 cubeVariant_[i] = std::make_unique<LocalFiniteElementVirtualImp<CubeFiniteElement> >(CubeFiniteElement(i));
│ │ │ │ +
96
│ │ │ │ +
97 for (size_t i = 0; i < simplexVariant_.size(); i++)
│ │ │ │ +
98 simplexVariant_[i] = std::make_unique<LocalFiniteElementVirtualImp<SimplexFiniteElement> >(SimplexFiniteElement(i));
│ │ │ │ +
99
│ │ │ │ +
100 // compute orientation for all elements
│ │ │ │ +
101 // loop once over the grid
│ │ │ │ +
102 for(const auto& cell : elements(gv))
│ │ │ │ +
103 {
│ │ │ │ +
104 unsigned int myId = is_->index(cell);
│ │ │ │ +
105 orient_[myId] = 0;
│ │ │ │
106
│ │ │ │ -
107 using LocalFunctionInterface = typename Traits::LocalFunctionInterface;
│ │ │ │ -
108
│ │ │ │ -
109 using EntitySet = typename Traits::EntitySet;
│ │ │ │ -
110
│ │ │ │ -
111public:
│ │ │ │ -
112
│ │ │ │ -
124 template<class F, disableCopyMove<GridFunction, F> = 0 >
│ │ │ │ - │ │ │ │ -
126 Base(std::forward<F>(f))
│ │ │ │ -
127 {
│ │ │ │ -
128 static_assert(Dune::Functions::Concept::isGridFunction<F, Range(Domain), EntitySet>(), "Trying to construct a GridFunction from type that does not model the GridFunction concept");
│ │ │ │ -
129 }
│ │ │ │ -
130
│ │ │ │ -
131 GridFunction() = default;
│ │ │ │ +
107 for (const auto& intersection : intersections(gv,cell))
│ │ │ │ +
108 {
│ │ │ │ +
109 if (intersection.neighbor() && (is_->index(intersection.outside()) > myId))
│ │ │ │ +
110 orient_[myId] |= (1 << intersection.indexInInside());
│ │ │ │ +
111 }
│ │ │ │ +
112 }
│ │ │ │ +
113 }
│ │ │ │ +
114
│ │ │ │ +
116 template<class EntityType>
│ │ │ │ +
117 const FiniteElement& find(const EntityType& e) const
│ │ │ │ +
118 {
│ │ │ │ +
119 if (e.type().isCube())
│ │ │ │ +
120 return *cubeVariant_[orient_[is_->index(e)]];
│ │ │ │ +
121 else
│ │ │ │ +
122 return *simplexVariant_[orient_[is_->index(e)]];
│ │ │ │ +
123 }
│ │ │ │ +
124
│ │ │ │ +
125 private:
│ │ │ │ +
126 std::vector<std::unique_ptr<LocalFiniteElementVirtualImp<CubeFiniteElement> > > cubeVariant_;
│ │ │ │ +
127 std::vector<std::unique_ptr<LocalFiniteElementVirtualImp<SimplexFiniteElement> > > simplexVariant_;
│ │ │ │ +
128 const typename GV::IndexSet* is_;
│ │ │ │ +
129 std::vector<unsigned char> orient_;
│ │ │ │ +
130 };
│ │ │ │ +
131
│ │ │ │
132
│ │ │ │ -
138 Range operator() (const Domain& x) const
│ │ │ │ -
139 {
│ │ │ │ -
140 return this->asInterface().operator()(x);
│ │ │ │ -
141 }
│ │ │ │ -
142
│ │ │ │ -
151 friend DerivativeInterface derivative(const GridFunction& t)
│ │ │ │ -
152 {
│ │ │ │ -
153 return t.asInterface().derivative();
│ │ │ │ -
154 }
│ │ │ │ +
133} // namespace Impl
│ │ │ │ +
134
│ │ │ │ +
135
│ │ │ │ +
136// *****************************************************************************
│ │ │ │ +
137// This is the reusable part of the basis. It contains
│ │ │ │ +
138//
│ │ │ │ +
139// BrezziDouglasMariniPreBasis
│ │ │ │ +
140// BrezziDouglasMariniNode
│ │ │ │ +
141//
│ │ │ │ +
142// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ +
143// state. These components do _not_ depend on the global basis and local view
│ │ │ │ +
144// and can be used without a global basis.
│ │ │ │ +
145// *****************************************************************************
│ │ │ │ +
146
│ │ │ │ +
147template<typename GV, int k>
│ │ │ │ +
148class BrezziDouglasMariniNode;
│ │ │ │ +
149
│ │ │ │ +
150template<typename GV, int k>
│ │ │ │ + │ │ │ │ +
152{
│ │ │ │ +
153 static const int dim = GV::dimension;
│ │ │ │ +
154 using FiniteElementMap = typename Impl::BDMLocalFiniteElementMap<GV, dim, double, k>;
│ │ │ │
155
│ │ │ │ -
165 friend LocalFunctionInterface localFunction(const GridFunction& t)
│ │ │ │ -
166 {
│ │ │ │ -
167 return t.asInterface().wrappedLocalFunction();
│ │ │ │ -
168 }
│ │ │ │ -
169
│ │ │ │ -
176 const EntitySet& entitySet() const
│ │ │ │ -
177 {
│ │ │ │ -
178 return this->asInterface().wrappedEntitySet();
│ │ │ │ -
179 }
│ │ │ │ -
180};
│ │ │ │ -
181
│ │ │ │ -
182
│ │ │ │ -
183
│ │ │ │ -
184}} // namespace Dune::Functions
│ │ │ │ +
156public:
│ │ │ │ +
157
│ │ │ │ +
159 using GridView = GV;
│ │ │ │ +
160 using size_type = std::size_t;
│ │ │ │ +
161
│ │ │ │ + │ │ │ │ +
163
│ │ │ │ +
164 static constexpr size_type maxMultiIndexSize = 1;
│ │ │ │ +
165 static constexpr size_type minMultiIndexSize = 1;
│ │ │ │ +
166 static constexpr size_type multiIndexBufferSize = 1;
│ │ │ │ +
167
│ │ │ │ + │ │ │ │ +
170 gridView_(gv),
│ │ │ │ + │ │ │ │ +
172 {
│ │ │ │ +
173 // There is no inherent reason why the basis shouldn't work for grids with more than one
│ │ │ │ +
174 // element types. Somebody simply has to sit down and implement the missing bits.
│ │ │ │ +
175 if (gv.indexSet().types(0).size() > 1)
│ │ │ │ +
176 DUNE_THROW(Dune::NotImplemented, "Brezzi-Douglas-Marini basis is only implemented for grids with a single element type");
│ │ │ │ +
177 }
│ │ │ │ +
178
│ │ │ │ + │ │ │ │ +
180 {
│ │ │ │ +
181 codimOffset_[0] = 0;
│ │ │ │ +
182 codimOffset_[1] = codimOffset_[0] + dofsPerCodim_[0] * gridView_.size(0);
│ │ │ │ +
183 //if (dim==3) codimOffset_[2] = codimOffset_[1] + dofsPerCodim[1] * gridView_.size(1);
│ │ │ │ +
184 }
│ │ │ │
185
│ │ │ │ -
186
│ │ │ │ -
187
│ │ │ │ -
188#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +
188 const GridView& gridView() const
│ │ │ │ +
189 {
│ │ │ │ +
190 return gridView_;
│ │ │ │ +
191 }
│ │ │ │ +
192
│ │ │ │ +
193 /* \brief Update the stored grid view, to be called if the grid has changed */
│ │ │ │ +
194 void update (const GridView& gv)
│ │ │ │ +
195 {
│ │ │ │ +
196 gridView_ = gv;
│ │ │ │ +
197 }
│ │ │ │ +
198
│ │ │ │ + │ │ │ │ +
203 {
│ │ │ │ +
204 return Node{&finiteElementMap_};
│ │ │ │ +
205 }
│ │ │ │ +
206
│ │ │ │ + │ │ │ │ +
208 {
│ │ │ │ +
209 return dofsPerCodim_[0] * gridView_.size(0) + dofsPerCodim_[1] * gridView_.size(1); // only 2d
│ │ │ │ +
210 }
│ │ │ │ +
211
│ │ │ │ +
213 template<class SizePrefix>
│ │ │ │ +
214 size_type size(const SizePrefix prefix) const
│ │ │ │ +
215 {
│ │ │ │ +
216 assert(prefix.size() == 0 || prefix.size() == 1);
│ │ │ │ +
217 return (prefix.size() == 0) ? size() : 0;
│ │ │ │ +
218 }
│ │ │ │ +
219
│ │ │ │ + │ │ │ │ +
222 {
│ │ │ │ +
223 return size();
│ │ │ │ +
224 }
│ │ │ │ +
225
│ │ │ │ + │ │ │ │ +
227 {
│ │ │ │ +
228 // The implementation currently only supports grids with a single element type.
│ │ │ │ +
229 // We can therefore return the actual number of dofs here.
│ │ │ │ +
230 GeometryType elementType = *(gridView_.indexSet().types(0).begin());
│ │ │ │ +
231 size_t numFaces = ReferenceElements<double,dim>::general(elementType).size(1);
│ │ │ │ +
232 return dofsPerCodim_[0] + dofsPerCodim_[1] * numFaces;
│ │ │ │ +
233 }
│ │ │ │ +
234
│ │ │ │ +
240 template<typename It>
│ │ │ │ +
241 It indices(const Node& node, It it) const
│ │ │ │ +
242 {
│ │ │ │ +
243 const auto& gridIndexSet = gridView().indexSet();
│ │ │ │ +
244 const auto& element = node.element();
│ │ │ │ +
245
│ │ │ │ +
246 // throw if element is not of predefined type
│ │ │ │ +
247 if (not(element.type().isCube()) and not(element.type().isSimplex()))
│ │ │ │ +
248 DUNE_THROW(Dune::NotImplemented, "BrezziDouglasMariniBasis only implemented for cube and simplex elements.");
│ │ │ │ +
249
│ │ │ │ +
250 for(std::size_t i=0, end=node.size(); i<end; ++i, ++it)
│ │ │ │ +
251 {
│ │ │ │ +
252 Dune::LocalKey localKey = node.finiteElement().localCoefficients().localKey(i);
│ │ │ │ +
253
│ │ │ │ +
254 // The dimension of the entity that the current dof is related to
│ │ │ │ +
255 size_t subentity = localKey.subEntity();
│ │ │ │ +
256 size_t codim = localKey.codim();
│ │ │ │ +
257
│ │ │ │ +
258 *it = { codimOffset_[codim] +
│ │ │ │ +
259 dofsPerCodim_[codim] * gridIndexSet.subIndex(element, subentity, codim) + localKey.index() };
│ │ │ │ +
260 }
│ │ │ │ +
261
│ │ │ │ +
262 return it;
│ │ │ │ +
263 }
│ │ │ │ +
264
│ │ │ │ +
265protected:
│ │ │ │ + │ │ │ │ +
267 std::array<size_t,dim+1> codimOffset_;
│ │ │ │ +
268 FiniteElementMap finiteElementMap_;
│ │ │ │ +
269 // Number of dofs per entity type depending on the entity's codimension and type
│ │ │ │ +
270 std::array<int,2> dofsPerCodim_ {{dim*(k-1)*3, dim+(k-1)}};
│ │ │ │ +
271};
│ │ │ │ +
272
│ │ │ │ +
273
│ │ │ │ +
274
│ │ │ │ +
275template<typename GV, int k>
│ │ │ │ + │ │ │ │ +
277 public LeafBasisNode
│ │ │ │ +
278{
│ │ │ │ +
279 static const int dim = GV::dimension;
│ │ │ │ +
280
│ │ │ │ +
281public:
│ │ │ │ +
282
│ │ │ │ +
283 using size_type = std::size_t;
│ │ │ │ +
284 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ +
285 using FiniteElementMap = typename Impl::BDMLocalFiniteElementMap<GV, dim, double, k>;
│ │ │ │ +
286 using FiniteElement = Impl::GlobalValuedLocalFiniteElement<Impl::ContravariantPiolaTransformator,
│ │ │ │ +
287 typename FiniteElementMap::FiniteElement,
│ │ │ │ +
288 Element>;
│ │ │ │ +
289
│ │ │ │ +
290 BrezziDouglasMariniNode(const FiniteElementMap* finiteElementMap) :
│ │ │ │ +
291 element_(nullptr),
│ │ │ │ +
292 finiteElementMap_(finiteElementMap)
│ │ │ │ +
293 {}
│ │ │ │ +
294
│ │ │ │ +
296 const Element& element() const
│ │ │ │ +
297 {
│ │ │ │ +
298 return *element_;
│ │ │ │ +
299 }
│ │ │ │ +
300
│ │ │ │ + │ │ │ │ +
306 {
│ │ │ │ +
307 return finiteElement_;
│ │ │ │ +
308 }
│ │ │ │ +
309
│ │ │ │ +
311 void bind(const Element& e)
│ │ │ │ +
312 {
│ │ │ │ +
313 element_ = &e;
│ │ │ │ +
314 finiteElement_.bind((finiteElementMap_->find(*element_)), e);
│ │ │ │ +
315 this->setSize(finiteElement_.size());
│ │ │ │ +
316 }
│ │ │ │ +
317
│ │ │ │ +
318protected:
│ │ │ │ +
319
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
323};
│ │ │ │ +
324
│ │ │ │ +
325
│ │ │ │ +
326
│ │ │ │ +
327namespace BasisFactory {
│ │ │ │ +
328
│ │ │ │ +
336template<std::size_t k>
│ │ │ │ + │ │ │ │ +
338{
│ │ │ │ +
339 return [](const auto& gridView) {
│ │ │ │ +
340 return BrezziDouglasMariniPreBasis<std::decay_t<decltype(gridView)>, k>(gridView);
│ │ │ │ +
341 };
│ │ │ │ +
342}
│ │ │ │ +
343
│ │ │ │ +
344} // end namespace BasisFactory
│ │ │ │ +
345
│ │ │ │ +
346
│ │ │ │ +
347
│ │ │ │ +
348// *****************************************************************************
│ │ │ │ +
349// This is the actual global basis implementation based on the reusable parts.
│ │ │ │ +
350// *****************************************************************************
│ │ │ │ +
351
│ │ │ │ +
359template<typename GV, int k>
│ │ │ │ + │ │ │ │ +
361
│ │ │ │ +
362} // end namespace Functions
│ │ │ │ +
363} // end namespace Dune
│ │ │ │ +
364
│ │ │ │ +
365
│ │ │ │ +
366#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BREZZIDOUGLASMARINIBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
auto brezziDouglasMarini()
Create a pre-basis factory that can create a Brezzi-Douglas-Marini pre-basis.
Definition: brezzidouglasmarinibasis.hh:337
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
Definition: localfunction.hh:30
│ │ │ │ -
Base class for type-erased interface wrapper.
Definition: typeerasure.hh:165
│ │ │ │ -
Definition: gridfunction.hh:32
│ │ │ │ -
friend DerivativeInterface derivative(const GridFunction &t)
Get derivative of wrapped function.
Definition: gridfunction.hh:151
│ │ │ │ - │ │ │ │ -
const EntitySet & entitySet() const
Get associated EntitySet.
Definition: gridfunction.hh:176
│ │ │ │ -
GridFunction(F &&f)
Construct from function.
Definition: gridfunction.hh:125
│ │ │ │ -
friend LocalFunctionInterface localFunction(const GridFunction &t)
Get local function of wrapped function.
Definition: gridfunction.hh:165
│ │ │ │ -
Derivative traits for local functions.
Definition: localderivativetraits.hh:28
│ │ │ │ +
Definition: brezzidouglasmarinibasis.hh:278
│ │ │ │ +
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition: brezzidouglasmarinibasis.hh:305
│ │ │ │ +
typename GV::template Codim< 0 >::Entity Element
Definition: brezzidouglasmarinibasis.hh:284
│ │ │ │ +
const FiniteElementMap * finiteElementMap_
Definition: brezzidouglasmarinibasis.hh:322
│ │ │ │ +
std::size_t size_type
Definition: brezzidouglasmarinibasis.hh:283
│ │ │ │ +
FiniteElement finiteElement_
Definition: brezzidouglasmarinibasis.hh:320
│ │ │ │ +
typename Impl::BDMLocalFiniteElementMap< GV, dim, double, k > FiniteElementMap
Definition: brezzidouglasmarinibasis.hh:285
│ │ │ │ +
const Element * element_
Definition: brezzidouglasmarinibasis.hh:321
│ │ │ │ +
Impl::GlobalValuedLocalFiniteElement< Impl::ContravariantPiolaTransformator, typename FiniteElementMap::FiniteElement, Element > FiniteElement
Definition: brezzidouglasmarinibasis.hh:288
│ │ │ │ +
void bind(const Element &e)
Bind to element.
Definition: brezzidouglasmarinibasis.hh:311
│ │ │ │ +
BrezziDouglasMariniNode(const FiniteElementMap *finiteElementMap)
Definition: brezzidouglasmarinibasis.hh:290
│ │ │ │ +
const Element & element() const
Return current element, throw if unbound.
Definition: brezzidouglasmarinibasis.hh:296
│ │ │ │ +
Definition: brezzidouglasmarinibasis.hh:152
│ │ │ │ +
std::size_t size_type
Definition: brezzidouglasmarinibasis.hh:160
│ │ │ │ +
std::array< int, 2 > dofsPerCodim_
Definition: brezzidouglasmarinibasis.hh:270
│ │ │ │ +
size_type dimension() const
Definition: brezzidouglasmarinibasis.hh:221
│ │ │ │ +
static constexpr size_type minMultiIndexSize
Definition: brezzidouglasmarinibasis.hh:165
│ │ │ │ +
static constexpr size_type maxMultiIndexSize
Definition: brezzidouglasmarinibasis.hh:164
│ │ │ │ +
std::array< size_t, dim+1 > codimOffset_
Definition: brezzidouglasmarinibasis.hh:267
│ │ │ │ +
size_type size(const SizePrefix prefix) const
Return number possible values for next position in multi index.
Definition: brezzidouglasmarinibasis.hh:214
│ │ │ │ +
Node makeNode() const
Create tree node.
Definition: brezzidouglasmarinibasis.hh:202
│ │ │ │ +
GV GridView
The grid view that the FE space is defined on.
Definition: brezzidouglasmarinibasis.hh:159
│ │ │ │ +
BrezziDouglasMariniPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition: brezzidouglasmarinibasis.hh:169
│ │ │ │ +
FiniteElementMap finiteElementMap_
Definition: brezzidouglasmarinibasis.hh:268
│ │ │ │ +
void update(const GridView &gv)
Definition: brezzidouglasmarinibasis.hh:194
│ │ │ │ +
void initializeIndices()
Definition: brezzidouglasmarinibasis.hh:179
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: brezzidouglasmarinibasis.hh:188
│ │ │ │ +
size_type size() const
Definition: brezzidouglasmarinibasis.hh:207
│ │ │ │ +
static constexpr size_type multiIndexBufferSize
Definition: brezzidouglasmarinibasis.hh:166
│ │ │ │ +
size_type maxNodeSize() const
Definition: brezzidouglasmarinibasis.hh:226
│ │ │ │ +
GridView gridView_
Definition: brezzidouglasmarinibasis.hh:266
│ │ │ │ +
It indices(const Node &node, It it) const
Maps from subtree index set [0..size-1] to a globally unique multi index in global basis.
Definition: brezzidouglasmarinibasis.hh:241
│ │ │ │ +
Global basis for given pre-basis.
Definition: defaultglobalbasis.hh:46
│ │ │ │ +
size_type size() const
Definition: nodes.hh:142
│ │ │ │ +
void setSize(const size_type size)
Definition: nodes.hh:164
│ │ │ │ +
Definition: nodes.hh:186
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,199 +4,512 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * gridfunctions │ │ │ │ │ -gridfunction.hh │ │ │ │ │ + * functionspacebases │ │ │ │ │ +brezzidouglasmarinibasis.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#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BREZZIDOUGLASMARINIBASIS_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BREZZIDOUGLASMARINIBASIS_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7 │ │ │ │ │ - 8#include │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8#include │ │ │ │ │ 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ - 16#include │ │ │ │ │ - 17 │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12 │ │ │ │ │ + 13#include │ │ │ │ │ + 14#include │ │ │ │ │ + 15#include │ │ │ │ │ + 16#include │ │ │ │ │ + 17#include │ │ │ │ │ 18 │ │ │ │ │ - 19 │ │ │ │ │ - 20namespace Dune { │ │ │ │ │ - 21namespace Functions { │ │ │ │ │ + 19#include │ │ │ │ │ + 20#include │ │ │ │ │ + 21#include │ │ │ │ │ 22 │ │ │ │ │ - 23 │ │ │ │ │ - 24 │ │ │ │ │ - 25/* │ │ │ │ │ - 26 * Default implementation is empty │ │ │ │ │ - 27 * The actual implementation is only given if Signature is an type │ │ │ │ │ - 28 * describing a function signature as Range(Domain). │ │ │ │ │ - 29 */ │ │ │ │ │ - 30template class │ │ │ │ │ -DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56> │ │ │ │ │ -31class GridFunction │ │ │ │ │ - 32{}; │ │ │ │ │ + 23namespace Dune { │ │ │ │ │ + 24namespace Functions { │ │ │ │ │ + 25 │ │ │ │ │ + 26namespace Impl { │ │ │ │ │ + 27 │ │ │ │ │ + 28 template │ │ │ │ │ + 29 struct BDMSimplexLocalInfo │ │ │ │ │ + 30 { │ │ │ │ │ + 31 static_assert((AlwaysFalse::value),"The requested type of BDM element is │ │ │ │ │ +not implemented, sorry!"); │ │ │ │ │ + 32 }; │ │ │ │ │ 33 │ │ │ │ │ - 34 │ │ │ │ │ - 35 │ │ │ │ │ - 36namespace Imp │ │ │ │ │ - 37{ │ │ │ │ │ - 38 │ │ │ │ │ - 40 template class DerivativeTraits, size_t │ │ │ │ │ -bufferSize> │ │ │ │ │ - 41 struct GridFunctionTraits : │ │ │ │ │ - 42 DifferentiableFunctionTraits │ │ │ │ │ + 34 template │ │ │ │ │ + 35 struct BDMSimplexLocalInfo<2,D,R,1> │ │ │ │ │ + 36 { │ │ │ │ │ + 37 using FiniteElement = BDM1Simplex2DLocalFiniteElement; │ │ │ │ │ + 38 static const std::size_t Variants = 8; │ │ │ │ │ + 39 }; │ │ │ │ │ + 40 │ │ │ │ │ + 41 template │ │ │ │ │ + 42 struct BDMSimplexLocalInfo<2,D,R,2> │ │ │ │ │ 43 { │ │ │ │ │ - 44 protected: │ │ │ │ │ - 45 using Base=DifferentiableFunctionTraits; │ │ │ │ │ - 46 │ │ │ │ │ - 47 public: │ │ │ │ │ - 49 using EntitySet = ES; │ │ │ │ │ - 50 │ │ │ │ │ - 52 using Element = typename EntitySet::Element; │ │ │ │ │ + 44 using FiniteElement = BDM2Simplex2DLocalFiniteElement; │ │ │ │ │ + 45 static const std::size_t Variants = 8; │ │ │ │ │ + 46 }; │ │ │ │ │ + 47 │ │ │ │ │ + 48 template │ │ │ │ │ + 49 struct BDMCubeLocalInfo │ │ │ │ │ + 50 { │ │ │ │ │ + 51 static_assert((AlwaysFalse::value),"The requested type of BDM element is │ │ │ │ │ +not implemented, sorry!"); │ │ │ │ │ + 52 }; │ │ │ │ │ 53 │ │ │ │ │ - 55 using DerivativeSignature = typename Base::DerivativeSignature; │ │ │ │ │ - 56 │ │ │ │ │ - 58 using DerivativeInterface = GridFunction; │ │ │ │ │ - 59 │ │ │ │ │ - 61 using LocalSignature = typename Base::Range(typename EntitySet:: │ │ │ │ │ -LocalCoordinate); │ │ │ │ │ - 62 │ │ │ │ │ - 64 template │ │ │ │ │ - 65 using LocalDerivativeTraits = typename Dune::Functions:: │ │ │ │ │ -LocalDerivativeTraits::template Traits; │ │ │ │ │ - 66 │ │ │ │ │ - 68 using LocalFunctionTraits = typename Dune::Functions::Imp:: │ │ │ │ │ -LocalFunctionTraits; │ │ │ │ │ - 69 │ │ │ │ │ - 71 using LocalFunctionInterface = LocalFunction; │ │ │ │ │ - 72 │ │ │ │ │ - 74 using Concept = GridFunctionWrapperInterface; │ │ │ │ │ - 75 │ │ │ │ │ - 77 template │ │ │ │ │ - 78 using Model = GridFunctionWrapperImplementation; │ │ │ │ │ - 79 }; │ │ │ │ │ - 80} │ │ │ │ │ + 54 template │ │ │ │ │ + 55 struct BDMCubeLocalInfo<2,D,R,1> │ │ │ │ │ + 56 { │ │ │ │ │ + 57 using FiniteElement = BDM1Cube2DLocalFiniteElement; │ │ │ │ │ + 58 static const std::size_t Variants = 16; │ │ │ │ │ + 59 }; │ │ │ │ │ + 60 │ │ │ │ │ + 61 template │ │ │ │ │ + 62 struct BDMCubeLocalInfo<2,D,R,2> │ │ │ │ │ + 63 { │ │ │ │ │ + 64 using FiniteElement = BDM2Cube2DLocalFiniteElement; │ │ │ │ │ + 65 static const std::size_t Variants = 16; │ │ │ │ │ + 66 }; │ │ │ │ │ + 67 │ │ │ │ │ + 68 template │ │ │ │ │ + 69 struct BDMCubeLocalInfo<3,D,R,1> │ │ │ │ │ + 70 { │ │ │ │ │ + 71 using FiniteElement = BDM1Cube3DLocalFiniteElement; │ │ │ │ │ + 72 static const std::size_t Variants = 64; │ │ │ │ │ + 73 }; │ │ │ │ │ + 74 │ │ │ │ │ + 75 template │ │ │ │ │ + 76 class BDMLocalFiniteElementMap │ │ │ │ │ + 77 { │ │ │ │ │ + 78 using D = typename GV::ctype; │ │ │ │ │ + 79 using CubeFiniteElement = typename BDMCubeLocalInfo:: │ │ │ │ │ +FiniteElement; │ │ │ │ │ + 80 using SimplexFiniteElement = typename BDMSimplexLocalInfo:: │ │ │ │ │ +FiniteElement; │ │ │ │ │ 81 │ │ │ │ │ - 82 │ │ │ │ │ + 82 public: │ │ │ │ │ 83 │ │ │ │ │ - 95template class │ │ │ │ │ -DerivativeTraits, size_t bufferSize> │ │ │ │ │ -96class GridFunction : │ │ │ │ │ - 97 public TypeErasureBase< │ │ │ │ │ - 98 typename Imp::GridFunctionTraits::Concept, │ │ │ │ │ - 99 Imp::GridFunctionTraits:: │ │ │ │ │ -template Model> │ │ │ │ │ - 100{ │ │ │ │ │ - 101 using Traits = Imp::GridFunctionTraits; │ │ │ │ │ - 102 │ │ │ │ │ - 103 using Base = TypeErasureBase; │ │ │ │ │ - 104 │ │ │ │ │ - 105 using DerivativeInterface = typename Traits::DerivativeInterface; │ │ │ │ │ + 84 using T = LocalBasisTraits, R, dim, │ │ │ │ │ +FieldVector, FieldMatrix >; │ │ │ │ │ + 85 using FiniteElement = LocalFiniteElementVirtualInterface; │ │ │ │ │ + 86 │ │ │ │ │ + 87 BDMLocalFiniteElementMap(const GV& gv) │ │ │ │ │ + 88 : is_(&(gv.indexSet())), orient_(gv.size(0)) │ │ │ │ │ + 89 { │ │ │ │ │ + 90 cubeVariant_.resize(BDMCubeLocalInfo::Variants); │ │ │ │ │ + 91 simplexVariant_.resize(BDMSimplexLocalInfo::Variants); │ │ │ │ │ + 92 │ │ │ │ │ + 93 // create all variants │ │ │ │ │ + 94 for (size_t i = 0; i < cubeVariant_.size(); i++) │ │ │ │ │ + 95 cubeVariant_[i] = std:: │ │ │ │ │ +make_unique >(CubeFiniteElement │ │ │ │ │ +(i)); │ │ │ │ │ + 96 │ │ │ │ │ + 97 for (size_t i = 0; i < simplexVariant_.size(); i++) │ │ │ │ │ + 98 simplexVariant_[i] = std:: │ │ │ │ │ +make_unique > │ │ │ │ │ +(SimplexFiniteElement(i)); │ │ │ │ │ + 99 │ │ │ │ │ + 100 // compute orientation for all elements │ │ │ │ │ + 101 // loop once over the grid │ │ │ │ │ + 102 for(const auto& cell : elements(gv)) │ │ │ │ │ + 103 { │ │ │ │ │ + 104 unsigned int myId = is_->index(cell); │ │ │ │ │ + 105 orient_[myId] = 0; │ │ │ │ │ 106 │ │ │ │ │ - 107 using LocalFunctionInterface = typename Traits::LocalFunctionInterface; │ │ │ │ │ - 108 │ │ │ │ │ - 109 using EntitySet = typename Traits::EntitySet; │ │ │ │ │ - 110 │ │ │ │ │ - 111public: │ │ │ │ │ - 112 │ │ │ │ │ - 124 template = 0 > │ │ │ │ │ -125 GridFunction(F&& f) : │ │ │ │ │ - 126 Base(std::forward(f)) │ │ │ │ │ - 127 { │ │ │ │ │ - 128 static_assert(Dune::Functions::Concept::isGridFunction(), "Trying to construct a GridFunction from type that does not model │ │ │ │ │ -the GridFunction concept"); │ │ │ │ │ - 129 } │ │ │ │ │ - 130 │ │ │ │ │ -131 GridFunction() = default; │ │ │ │ │ + 107 for (const auto& intersection : intersections(gv,cell)) │ │ │ │ │ + 108 { │ │ │ │ │ + 109 if (intersection.neighbor() && (is_->index(intersection.outside()) > │ │ │ │ │ +myId)) │ │ │ │ │ + 110 orient_[myId] |= (1 << intersection.indexInInside()); │ │ │ │ │ + 111 } │ │ │ │ │ + 112 } │ │ │ │ │ + 113 } │ │ │ │ │ + 114 │ │ │ │ │ + 116 template │ │ │ │ │ + 117 const FiniteElement& find(const EntityType& e) const │ │ │ │ │ + 118 { │ │ │ │ │ + 119 if (e.type().isCube()) │ │ │ │ │ + 120 return *cubeVariant_[orient_[is_->index(e)]]; │ │ │ │ │ + 121 else │ │ │ │ │ + 122 return *simplexVariant_[orient_[is_->index(e)]]; │ │ │ │ │ + 123 } │ │ │ │ │ + 124 │ │ │ │ │ + 125 private: │ │ │ │ │ + 126 std::vector > > cubeVariant_; │ │ │ │ │ + 127 std::vector > > │ │ │ │ │ +simplexVariant_; │ │ │ │ │ + 128 const typename GV::IndexSet* is_; │ │ │ │ │ + 129 std::vector orient_; │ │ │ │ │ + 130 }; │ │ │ │ │ + 131 │ │ │ │ │ 132 │ │ │ │ │ -138 Range operator() (const Domain& x) const │ │ │ │ │ - 139 { │ │ │ │ │ - 140 return this->asInterface().operator()(x); │ │ │ │ │ - 141 } │ │ │ │ │ - 142 │ │ │ │ │ -151 friend DerivativeInterface derivative(const GridFunction& t) │ │ │ │ │ - 152 { │ │ │ │ │ - 153 return t.asInterface().derivative(); │ │ │ │ │ - 154 } │ │ │ │ │ + 133} // namespace Impl │ │ │ │ │ + 134 │ │ │ │ │ + 135 │ │ │ │ │ + 136/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ + 137// This is the reusable part of the basis. It contains │ │ │ │ │ + 138// │ │ │ │ │ + 139// BrezziDouglasMariniPreBasis │ │ │ │ │ + 140// BrezziDouglasMariniNode │ │ │ │ │ + 141// │ │ │ │ │ + 142// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ +shared │ │ │ │ │ + 143// state. These components do _not_ depend on the global basis and local │ │ │ │ │ +view │ │ │ │ │ + 144// and can be used without a global basis. │ │ │ │ │ + 145/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ + 146 │ │ │ │ │ + 147template │ │ │ │ │ + 148class BrezziDouglasMariniNode; │ │ │ │ │ + 149 │ │ │ │ │ + 150template │ │ │ │ │ +151class BrezziDouglasMariniPreBasis │ │ │ │ │ + 152{ │ │ │ │ │ + 153 static const int dim = GV::dimension; │ │ │ │ │ + 154 using FiniteElementMap = typename Impl::BDMLocalFiniteElementMap; │ │ │ │ │ 155 │ │ │ │ │ -165 friend LocalFunctionInterface localFunction(const GridFunction& t) │ │ │ │ │ - 166 { │ │ │ │ │ - 167 return t.asInterface().wrappedLocalFunction(); │ │ │ │ │ - 168 } │ │ │ │ │ - 169 │ │ │ │ │ -176 const EntitySet& entitySet() const │ │ │ │ │ - 177 { │ │ │ │ │ - 178 return this->asInterface().wrappedEntitySet(); │ │ │ │ │ - 179 } │ │ │ │ │ - 180}; │ │ │ │ │ - 181 │ │ │ │ │ - 182 │ │ │ │ │ - 183 │ │ │ │ │ - 184}} // namespace Dune::Functions │ │ │ │ │ + 156public: │ │ │ │ │ + 157 │ │ │ │ │ +159 using GridView = GV; │ │ │ │ │ +160 using size_type = std::size_t; │ │ │ │ │ + 161 │ │ │ │ │ +162 using Node = BrezziDouglasMariniNode; │ │ │ │ │ + 163 │ │ │ │ │ +164 static constexpr size_type maxMultiIndexSize = 1; │ │ │ │ │ +165 static constexpr size_type minMultiIndexSize = 1; │ │ │ │ │ +166 static constexpr size_type multiIndexBufferSize = 1; │ │ │ │ │ + 167 │ │ │ │ │ +169 BrezziDouglasMariniPreBasis(const GridView& gv) : │ │ │ │ │ + 170 gridView_(gv), │ │ │ │ │ + 171 finiteElementMap_(gv) │ │ │ │ │ + 172 { │ │ │ │ │ + 173 // There is no inherent reason why the basis shouldn't work for grids with │ │ │ │ │ +more than one │ │ │ │ │ + 174 // element types. Somebody simply has to sit down and implement the │ │ │ │ │ +missing bits. │ │ │ │ │ + 175 if (gv.indexSet().types(0).size() > 1) │ │ │ │ │ + 176 DUNE_THROW(Dune::NotImplemented, "Brezzi-Douglas-Marini basis is only │ │ │ │ │ +implemented for grids with a single element type"); │ │ │ │ │ + 177 } │ │ │ │ │ + 178 │ │ │ │ │ +179 void initializeIndices() │ │ │ │ │ + 180 { │ │ │ │ │ + 181 codimOffset_[0] = 0; │ │ │ │ │ + 182 codimOffset_[1] = codimOffset_[0] + dofsPerCodim_[0] * gridView_.size(0); │ │ │ │ │ + 183 //if (dim==3) codimOffset_[2] = codimOffset_[1] + dofsPerCodim[1] * │ │ │ │ │ +gridView_.size(1); │ │ │ │ │ + 184 } │ │ │ │ │ 185 │ │ │ │ │ - 186 │ │ │ │ │ - 187 │ │ │ │ │ - 188#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_HH │ │ │ │ │ -typeerasure.hh │ │ │ │ │ -functionconcepts.hh │ │ │ │ │ -defaultderivativetraits.hh │ │ │ │ │ -differentiablefunction.hh │ │ │ │ │ -localfunction.hh │ │ │ │ │ -gridfunction_imp.hh │ │ │ │ │ -localderivativetraits.hh │ │ │ │ │ +188 const GridView& gridView() const │ │ │ │ │ + 189 { │ │ │ │ │ + 190 return gridView_; │ │ │ │ │ + 191 } │ │ │ │ │ + 192 │ │ │ │ │ + 193 /* \brief Update the stored grid view, to be called if the grid has │ │ │ │ │ +changed */ │ │ │ │ │ +194 void update (const GridView& gv) │ │ │ │ │ + 195 { │ │ │ │ │ + 196 gridView_ = gv; │ │ │ │ │ + 197 } │ │ │ │ │ + 198 │ │ │ │ │ +202 Node makeNode() const │ │ │ │ │ + 203 { │ │ │ │ │ + 204 return Node{&finiteElementMap_}; │ │ │ │ │ + 205 } │ │ │ │ │ + 206 │ │ │ │ │ +207 size_type size() const │ │ │ │ │ + 208 { │ │ │ │ │ + 209 return dofsPerCodim_[0] * gridView_.size(0) + dofsPerCodim_[1] * │ │ │ │ │ +gridView_.size(1); // only 2d │ │ │ │ │ + 210 } │ │ │ │ │ + 211 │ │ │ │ │ + 213 template │ │ │ │ │ +214 size_type size(const SizePrefix prefix) const │ │ │ │ │ + 215 { │ │ │ │ │ + 216 assert(prefix.size() == 0 || prefix.size() == 1); │ │ │ │ │ + 217 return (prefix.size() == 0) ? size() : 0; │ │ │ │ │ + 218 } │ │ │ │ │ + 219 │ │ │ │ │ +221 size_type dimension() const │ │ │ │ │ + 222 { │ │ │ │ │ + 223 return size(); │ │ │ │ │ + 224 } │ │ │ │ │ + 225 │ │ │ │ │ +226 size_type maxNodeSize() const │ │ │ │ │ + 227 { │ │ │ │ │ + 228 // The implementation currently only supports grids with a single element │ │ │ │ │ +type. │ │ │ │ │ + 229 // We can therefore return the actual number of dofs here. │ │ │ │ │ + 230 GeometryType elementType = *(gridView_.indexSet().types(0).begin()); │ │ │ │ │ + 231 size_t numFaces = ReferenceElements::general(elementType).size │ │ │ │ │ +(1); │ │ │ │ │ + 232 return dofsPerCodim_[0] + dofsPerCodim_[1] * numFaces; │ │ │ │ │ + 233 } │ │ │ │ │ + 234 │ │ │ │ │ + 240 template │ │ │ │ │ +241 It indices(const Node& node, It it) const │ │ │ │ │ + 242 { │ │ │ │ │ + 243 const auto& gridIndexSet = gridView().indexSet(); │ │ │ │ │ + 244 const auto& element = node.element(); │ │ │ │ │ + 245 │ │ │ │ │ + 246 // throw if element is not of predefined type │ │ │ │ │ + 247 if (not(element.type().isCube()) and not(element.type().isSimplex())) │ │ │ │ │ + 248 DUNE_THROW(Dune::NotImplemented, "BrezziDouglasMariniBasis only │ │ │ │ │ +implemented for cube and simplex elements."); │ │ │ │ │ + 249 │ │ │ │ │ + 250 for(std::size_t i=0, end=node.size(); i codimOffset_; │ │ │ │ │ +268 FiniteElementMap finiteElementMap_; │ │ │ │ │ + 269 // Number of dofs per entity type depending on the entity's codimension │ │ │ │ │ +and type │ │ │ │ │ +270 std::array dofsPerCodim_ {{dim*(k-1)*3, dim+(k-1)}}; │ │ │ │ │ + 271}; │ │ │ │ │ + 272 │ │ │ │ │ + 273 │ │ │ │ │ + 274 │ │ │ │ │ + 275template │ │ │ │ │ +276class BrezziDouglasMariniNode : │ │ │ │ │ + 277 public LeafBasisNode │ │ │ │ │ + 278{ │ │ │ │ │ + 279 static const int dim = GV::dimension; │ │ │ │ │ + 280 │ │ │ │ │ + 281public: │ │ │ │ │ + 282 │ │ │ │ │ +283 using size_type = std::size_t; │ │ │ │ │ +284 using Element = typename GV::template Codim<0>::Entity; │ │ │ │ │ +285 using FiniteElementMap = typename Impl::BDMLocalFiniteElementMap; │ │ │ │ │ +286 using FiniteElement = Impl::GlobalValuedLocalFiniteElement; │ │ │ │ │ + 289 │ │ │ │ │ +290 BrezziDouglasMariniNode(const FiniteElementMap* finiteElementMap) : │ │ │ │ │ + 291 element_(nullptr), │ │ │ │ │ + 292 finiteElementMap_(finiteElementMap) │ │ │ │ │ + 293 {} │ │ │ │ │ + 294 │ │ │ │ │ +296 const Element& element() const │ │ │ │ │ + 297 { │ │ │ │ │ + 298 return *element_; │ │ │ │ │ + 299 } │ │ │ │ │ + 300 │ │ │ │ │ +305 const FiniteElement& finiteElement() const │ │ │ │ │ + 306 { │ │ │ │ │ + 307 return finiteElement_; │ │ │ │ │ + 308 } │ │ │ │ │ + 309 │ │ │ │ │ +311 void bind(const Element& e) │ │ │ │ │ + 312 { │ │ │ │ │ + 313 element_ = &e; │ │ │ │ │ + 314 finiteElement_.bind((finiteElementMap_->find(*element_)), e); │ │ │ │ │ + 315 this->setSize(finiteElement_.size()); │ │ │ │ │ + 316 } │ │ │ │ │ + 317 │ │ │ │ │ + 318protected: │ │ │ │ │ + 319 │ │ │ │ │ +320 FiniteElement finiteElement_; │ │ │ │ │ +321 const Element* element_; │ │ │ │ │ +322 const FiniteElementMap* finiteElementMap_; │ │ │ │ │ + 323}; │ │ │ │ │ + 324 │ │ │ │ │ + 325 │ │ │ │ │ + 326 │ │ │ │ │ + 327namespace BasisFactory { │ │ │ │ │ + 328 │ │ │ │ │ + 336template │ │ │ │ │ +337auto brezziDouglasMarini() │ │ │ │ │ + 338{ │ │ │ │ │ + 339 return [](const auto& gridView) { │ │ │ │ │ + 340 return BrezziDouglasMariniPreBasis, k> │ │ │ │ │ +(gridView); │ │ │ │ │ + 341 }; │ │ │ │ │ + 342} │ │ │ │ │ + 343 │ │ │ │ │ + 344} // end namespace BasisFactory │ │ │ │ │ + 345 │ │ │ │ │ + 346 │ │ │ │ │ + 347 │ │ │ │ │ + 348/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ + 349// This is the actual global basis implementation based on the reusable │ │ │ │ │ +parts. │ │ │ │ │ + 350/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ + 351 │ │ │ │ │ + 359template │ │ │ │ │ +360using BrezziDouglasMariniBasis = │ │ │ │ │ +DefaultGlobalBasis >; │ │ │ │ │ + 361 │ │ │ │ │ + 362} // end namespace Functions │ │ │ │ │ + 363} // end namespace Dune │ │ │ │ │ + 364 │ │ │ │ │ + 365 │ │ │ │ │ + 366#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BREZZIDOUGLASMARINIBASIS_HH │ │ │ │ │ +nodes.hh │ │ │ │ │ +defaultglobalbasis.hh │ │ │ │ │ +globalvaluedlocalfiniteelement.hh │ │ │ │ │ +Dune::Functions::BasisFactory::brezziDouglasMarini │ │ │ │ │ +auto brezziDouglasMarini() │ │ │ │ │ +Create a pre-basis factory that can create a Brezzi-Douglas-Marini pre-basis. │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:337 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::LocalFunction │ │ │ │ │ -Definition: localfunction.hh:30 │ │ │ │ │ -Dune::Functions::TypeErasureBase │ │ │ │ │ -Base class for type-erased interface wrapper. │ │ │ │ │ -Definition: typeerasure.hh:165 │ │ │ │ │ -Dune::Functions::GridFunction │ │ │ │ │ -Definition: gridfunction.hh:32 │ │ │ │ │ -Dune::Functions::GridFunction<_Range(Domain),_ES,_DerivativeTraits,_bufferSize │ │ │ │ │ ->::derivative │ │ │ │ │ -friend DerivativeInterface derivative(const GridFunction &t) │ │ │ │ │ -Get derivative of wrapped function. │ │ │ │ │ -Definition: gridfunction.hh:151 │ │ │ │ │ -Dune::Functions::GridFunction<_Range(Domain),_ES,_DerivativeTraits,_bufferSize │ │ │ │ │ ->::GridFunction │ │ │ │ │ -GridFunction()=default │ │ │ │ │ -Dune::Functions::GridFunction<_Range(Domain),_ES,_DerivativeTraits,_bufferSize │ │ │ │ │ ->::entitySet │ │ │ │ │ -const EntitySet & entitySet() const │ │ │ │ │ -Get associated EntitySet. │ │ │ │ │ -Definition: gridfunction.hh:176 │ │ │ │ │ -Dune::Functions::GridFunction<_Range(Domain),_ES,_DerivativeTraits,_bufferSize │ │ │ │ │ ->::GridFunction │ │ │ │ │ -GridFunction(F &&f) │ │ │ │ │ -Construct from function. │ │ │ │ │ -Definition: gridfunction.hh:125 │ │ │ │ │ -Dune::Functions::GridFunction<_Range(Domain),_ES,_DerivativeTraits,_bufferSize │ │ │ │ │ ->::localFunction │ │ │ │ │ -friend LocalFunctionInterface localFunction(const GridFunction &t) │ │ │ │ │ -Get local function of wrapped function. │ │ │ │ │ -Definition: gridfunction.hh:165 │ │ │ │ │ -Dune::Functions::LocalDerivativeTraits │ │ │ │ │ -Derivative traits for local functions. │ │ │ │ │ -Definition: localderivativetraits.hh:28 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniNode │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:278 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniNode::finiteElement │ │ │ │ │ +const FiniteElement & finiteElement() const │ │ │ │ │ +Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:305 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniNode::Element │ │ │ │ │ +typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:284 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniNode::finiteElementMap_ │ │ │ │ │ +const FiniteElementMap * finiteElementMap_ │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:322 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniNode::size_type │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:283 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniNode::finiteElement_ │ │ │ │ │ +FiniteElement finiteElement_ │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:320 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniNode::FiniteElementMap │ │ │ │ │ +typename Impl::BDMLocalFiniteElementMap< GV, dim, double, k > FiniteElementMap │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:285 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniNode::element_ │ │ │ │ │ +const Element * element_ │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:321 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniNode::FiniteElement │ │ │ │ │ +Impl::GlobalValuedLocalFiniteElement< Impl::ContravariantPiolaTransformator, │ │ │ │ │ +typename FiniteElementMap::FiniteElement, Element > FiniteElement │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:288 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniNode::bind │ │ │ │ │ +void bind(const Element &e) │ │ │ │ │ +Bind to element. │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:311 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniNode::BrezziDouglasMariniNode │ │ │ │ │ +BrezziDouglasMariniNode(const FiniteElementMap *finiteElementMap) │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:290 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniNode::element │ │ │ │ │ +const Element & element() const │ │ │ │ │ +Return current element, throw if unbound. │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:296 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniPreBasis │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:152 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniPreBasis::size_type │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:160 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniPreBasis::dofsPerCodim_ │ │ │ │ │ +std::array< int, 2 > dofsPerCodim_ │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:270 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniPreBasis::dimension │ │ │ │ │ +size_type dimension() const │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:221 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniPreBasis::minMultiIndexSize │ │ │ │ │ +static constexpr size_type minMultiIndexSize │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:165 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniPreBasis::maxMultiIndexSize │ │ │ │ │ +static constexpr size_type maxMultiIndexSize │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:164 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniPreBasis::codimOffset_ │ │ │ │ │ +std::array< size_t, dim+1 > codimOffset_ │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:267 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniPreBasis::size │ │ │ │ │ +size_type size(const SizePrefix prefix) const │ │ │ │ │ +Return number possible values for next position in multi index. │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:214 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniPreBasis::makeNode │ │ │ │ │ +Node makeNode() const │ │ │ │ │ +Create tree node. │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:202 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniPreBasis::GridView │ │ │ │ │ +GV GridView │ │ │ │ │ +The grid view that the FE space is defined on. │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:159 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniPreBasis::BrezziDouglasMariniPreBasis │ │ │ │ │ +BrezziDouglasMariniPreBasis(const GridView &gv) │ │ │ │ │ +Constructor for a given grid view object. │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:169 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniPreBasis::finiteElementMap_ │ │ │ │ │ +FiniteElementMap finiteElementMap_ │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:268 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniPreBasis::update │ │ │ │ │ +void update(const GridView &gv) │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:194 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniPreBasis::initializeIndices │ │ │ │ │ +void initializeIndices() │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:179 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniPreBasis::gridView │ │ │ │ │ +const GridView & gridView() const │ │ │ │ │ +Obtain the grid view that the basis is defined on. │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:188 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniPreBasis::size │ │ │ │ │ +size_type size() const │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:207 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniPreBasis::multiIndexBufferSize │ │ │ │ │ +static constexpr size_type multiIndexBufferSize │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:166 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniPreBasis::maxNodeSize │ │ │ │ │ +size_type maxNodeSize() const │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:226 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniPreBasis::gridView_ │ │ │ │ │ +GridView gridView_ │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:266 │ │ │ │ │ +Dune::Functions::BrezziDouglasMariniPreBasis::indices │ │ │ │ │ +It indices(const Node &node, It it) const │ │ │ │ │ +Maps from subtree index set [0..size-1] to a globally unique multi index in │ │ │ │ │ +global basis. │ │ │ │ │ +Definition: brezzidouglasmarinibasis.hh:241 │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis │ │ │ │ │ +Global basis for given pre-basis. │ │ │ │ │ +Definition: defaultglobalbasis.hh:46 │ │ │ │ │ +Dune::Functions::BasisNodeMixin::size │ │ │ │ │ +size_type size() const │ │ │ │ │ +Definition: nodes.hh:142 │ │ │ │ │ +Dune::Functions::BasisNodeMixin::setSize │ │ │ │ │ +void setSize(const size_type size) │ │ │ │ │ +Definition: nodes.hh:164 │ │ │ │ │ +Dune::Functions::LeafBasisNode │ │ │ │ │ +Definition: nodes.hh:186 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00101.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: discreteglobalbasisfunction.hh File Reference │ │ │ │ +dune-functions: subspacelocalview.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,73 +58,43 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
discreteglobalbasisfunction.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
subspacelocalview.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <memory>
│ │ │ │ -#include <optional>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/typetree/treecontainer.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/hierarchicnodetorangemap.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/flatvectorview.hh>
│ │ │ │ -#include <dune/functions/gridfunctions/gridviewentityset.hh>
│ │ │ │ -#include <dune/functions/gridfunctions/gridfunction.hh>
│ │ │ │ -#include <dune/functions/backends/concepts.hh>
│ │ │ │ -#include <dune/functions/backends/istlvectorbackend.hh>
│ │ │ │ +
#include <tuple>
│ │ │ │ +#include <dune/common/concept.hh>
│ │ │ │ +#include <dune/typetree/childextraction.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase< B, V, NTRE >
 
struct  Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase< B, V, NTRE >::Data
 
class  Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase< B, V, NTRE >::LocalFunctionBase
 
class  Dune::Functions::DiscreteGlobalBasisFunction< B, V, NTRE, R >
 A grid function induced by a global basis and a coefficient vector. More...
 
class  Dune::Functions::DiscreteGlobalBasisFunction< B, V, NTRE, R >::LocalFunction
 
class  Dune::Functions::DiscreteGlobalBasisFunctionDerivative< DGBF >
 Derivative of a DiscreteGlobalBasisFunction More...
 
class  Dune::Functions::DiscreteGlobalBasisFunctionDerivative< DGBF >::LocalFunction
 local function evaluating the derivative in reference coordinates More...
class  Dune::Functions::SubspaceLocalView< RLV, PP >
 The restriction of a finite element basis to a single element. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
namespace  Dune::Functions::ImplDoc
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<typename R , typename B , typename V >
auto Dune::Functions::makeDiscreteGlobalBasisFunction (B &&basis, V &&vector)
 Generate a DiscreteGlobalBasisFunction. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,61 +4,27 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * gridfunctions │ │ │ │ │ -Classes | Namespaces | Functions │ │ │ │ │ -discreteglobalbasisfunction.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * functionspacebases │ │ │ │ │ +Classes | Namespaces │ │ │ │ │ +subspacelocalview.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ - class  Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase<_B,_V,_NTRE │ │ │ │ │ - > │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase<_B,_V,_NTRE │ │ │ │ │ - >::Data │ │ │ │ │ -  │ │ │ │ │ - class  Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase<_B,_V,_NTRE │ │ │ │ │ - >::LocalFunctionBase │ │ │ │ │ -  │ │ │ │ │ - class  Dune::Functions::DiscreteGlobalBasisFunction<_B,_V,_NTRE,_R_> │ │ │ │ │ -  A grid function induced by a global basis and a coefficient vector. │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ - class  Dune::Functions::DiscreteGlobalBasisFunction<_B,_V,_NTRE,_R_>:: │ │ │ │ │ - LocalFunction │ │ │ │ │ -  │ │ │ │ │ - class  Dune::Functions::DiscreteGlobalBasisFunctionDerivative<_DGBF_> │ │ │ │ │ -  Derivative of a DiscreteGlobalBasisFunction More... │ │ │ │ │ -  │ │ │ │ │ - class  Dune::Functions::DiscreteGlobalBasisFunctionDerivative<_DGBF_>:: │ │ │ │ │ - LocalFunction │ │ │ │ │ -  local function evaluating the derivative in reference coordinates │ │ │ │ │ - More... │ │ │ │ │ +class  Dune::Functions::SubspaceLocalView<_RLV,_PP_> │ │ │ │ │ +  The restriction of a finite element basis to a single element. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ -namespace  Dune::Functions::ImplDoc │ │ │ │ │ -  │ │ │ │ │ - Functions │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::makeDiscreteGlobalBasisFunction (B &&basis, V &&vector) │ │ │ │ │ -  Generate a DiscreteGlobalBasisFunction. More... │ │ │ │ │ -  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00101_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: discreteglobalbasisfunction.hh Source File │ │ │ │ +dune-functions: subspacelocalview.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,597 +58,167 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
discreteglobalbasisfunction.hh
│ │ │ │ +
subspacelocalview.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#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACELOCALVIEW_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACELOCALVIEW_HH
│ │ │ │
5
│ │ │ │ -
6#include <memory>
│ │ │ │ -
7#include <optional>
│ │ │ │ +
6
│ │ │ │ +
7#include <tuple>
│ │ │ │
8
│ │ │ │ -
9#include <dune/common/typetraits.hh>
│ │ │ │ +
9#include <dune/common/concept.hh>
│ │ │ │
10
│ │ │ │ -
11#include <dune/typetree/treecontainer.hh>
│ │ │ │ +
11#include <dune/typetree/childextraction.hh>
│ │ │ │
12
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ +
14
│ │ │ │ +
15
│ │ │ │ +
16
│ │ │ │ +
17namespace Dune {
│ │ │ │ +
18namespace Functions {
│ │ │ │
19
│ │ │ │ -
20namespace Dune {
│ │ │ │ -
21namespace Functions {
│ │ │ │ -
22
│ │ │ │ -
23
│ │ │ │ -
24namespace ImplDoc {
│ │ │ │ +
20
│ │ │ │ +
21
│ │ │ │ +
22template<class RB, class PP>
│ │ │ │ +
23class SubspaceBasis;
│ │ │ │ +
24
│ │ │ │
25
│ │ │ │ -
26template<typename B, typename V, typename NTRE>
│ │ │ │ - │ │ │ │ -
28{
│ │ │ │ -
29public:
│ │ │ │ -
30 using Basis = B;
│ │ │ │ -
31 using Vector = V;
│ │ │ │ +
26
│ │ │ │ +
28template<class RLV, class PP>
│ │ │ │ + │ │ │ │ +
30{
│ │ │ │ +
31 using PrefixPath = PP;
│ │ │ │
32
│ │ │ │ -
33 // In order to make the cache work for proxy-references
│ │ │ │ -
34 // we have to use AutonomousValue<T> instead of std::decay_t<T>
│ │ │ │ -
35 using Coefficient = Dune::AutonomousValue<decltype(std::declval<Vector>()[std::declval<typename Basis::MultiIndex>()])>;
│ │ │ │ +
33public:
│ │ │ │ +
34
│ │ │ │ +
35 using RootLocalView = RLV;
│ │ │ │
36
│ │ │ │ -
37 using GridView = typename Basis::GridView;
│ │ │ │ - │ │ │ │ -
39 using Tree = typename Basis::LocalView::Tree;
│ │ │ │ -
40 using NodeToRangeEntry = NTRE;
│ │ │ │ -
41
│ │ │ │ - │ │ │ │ -
43
│ │ │ │ - │ │ │ │ -
45 using Element = typename EntitySet::Element;
│ │ │ │ -
46
│ │ │ │ -
47protected:
│ │ │ │ + │ │ │ │ +
39
│ │ │ │ + │ │ │ │ +
42
│ │ │ │ +
44 using Element = typename GridView::template Codim<0>::Entity;
│ │ │ │ +
45
│ │ │ │ +
47 using size_type = std::size_t;
│ │ │ │
48
│ │ │ │ -
49 // This collects all data that is shared by all related
│ │ │ │ -
50 // global and local functions. This way we don't need to
│ │ │ │ -
51 // keep track of it individually.
│ │ │ │ -
52 struct Data
│ │ │ │ -
53 {
│ │ │ │ - │ │ │ │ -
55 std::shared_ptr<const Basis> basis;
│ │ │ │ -
56 std::shared_ptr<const Vector> coefficients;
│ │ │ │ -
57 std::shared_ptr<const NodeToRangeEntry> nodeToRangeEntry;
│ │ │ │ -
58 };
│ │ │ │ -
59
│ │ │ │ -
60public:
│ │ │ │ - │ │ │ │ +
50 using RootTree = typename RootLocalView::Tree;
│ │ │ │ +
51
│ │ │ │ +
53 using Tree = typename TypeTree::ChildForTreePath<RootTree, PrefixPath>;
│ │ │ │ +
54
│ │ │ │ +
56 using MultiIndex = typename RootLocalView::MultiIndex;
│ │ │ │ +
57
│ │ │ │ +
59 SubspaceLocalView(const GlobalBasis& globalBasis, const PrefixPath& /*prefixPath*/) :
│ │ │ │ + │ │ │ │ +
61 rootLocalView_(globalBasis.rootBasis().localView())
│ │ │ │
62 {
│ │ │ │ -
63 using LocalView = typename Basis::LocalView;
│ │ │ │ -
64 using size_type = typename Tree::size_type;
│ │ │ │ +
63// static_assert(models<Concept::BasisTree<GridView>, Tree>(), "Tree type passed to SubspaceLocalView does not model the BasisNode concept.");
│ │ │ │ +
64 }
│ │ │ │
65
│ │ │ │ -
66 public:
│ │ │ │ - │ │ │ │ -
68 using Element = typename EntitySet::Element;
│ │ │ │ -
69
│ │ │ │ -
70 protected:
│ │ │ │ -
71 LocalFunctionBase(const std::shared_ptr<const Data>& data)
│ │ │ │ -
72 : data_(data)
│ │ │ │ -
73 , localView_(data_->basis->localView())
│ │ │ │ -
74 {
│ │ │ │ -
75 localDoFs_.reserve(localView_.maxSize());
│ │ │ │ -
76 }
│ │ │ │ -
77
│ │ │ │ - │ │ │ │ -
85 : data_(other.data_)
│ │ │ │ -
86 , localView_(other.localView_)
│ │ │ │ -
87 {
│ │ │ │ -
88 localDoFs_.reserve(localView_.maxSize());
│ │ │ │ -
89 if (bound())
│ │ │ │ -
90 localDoFs_ = other.localDoFs_;
│ │ │ │ -
91 }
│ │ │ │ -
92
│ │ │ │ - │ │ │ │ -
101 {
│ │ │ │ -
102 data_ = other.data_;
│ │ │ │ -
103 localView_ = other.localView_;
│ │ │ │ -
104 if (bound())
│ │ │ │ -
105 localDoFs_ = other.localDoFs_;
│ │ │ │ -
106 return *this;
│ │ │ │ -
107 }
│ │ │ │ -
108
│ │ │ │ -
109 public:
│ │ │ │ -
116 void bind(const Element& element)
│ │ │ │ -
117 {
│ │ │ │ -
118 localView_.bind(element);
│ │ │ │ -
119 // Use cache of full local view size. For a subspace basis,
│ │ │ │ -
120 // this may be larger than the number of local DOFs in the
│ │ │ │ -
121 // tree. In this case only cache entries associated to local
│ │ │ │ -
122 // DOFs in the subspace are filled. Cache entries associated
│ │ │ │ -
123 // to local DOFs which are not contained in the subspace will
│ │ │ │ -
124 // not be touched.
│ │ │ │ -
125 //
│ │ │ │ -
126 // Alternatively one could use a cache that exactly fits
│ │ │ │ -
127 // the size of the tree. However, this would require to
│ │ │ │ -
128 // subtract an offset from localIndex(i) on each cache
│ │ │ │ -
129 // access in operator().
│ │ │ │ -
130 localDoFs_.resize(localView_.size());
│ │ │ │ -
131 const auto& dofs = *data_->coefficients;
│ │ │ │ -
132 for (size_type i = 0; i < localView_.tree().size(); ++i)
│ │ │ │ -
133 {
│ │ │ │ -
134 // For a subspace basis the index-within-tree i
│ │ │ │ -
135 // is not the same as the localIndex within the
│ │ │ │ -
136 // full local view.
│ │ │ │ -
137 size_t localIndex = localView_.tree().localIndex(i);
│ │ │ │ -
138 localDoFs_[localIndex] = dofs[localView_.index(localIndex)];
│ │ │ │ -
139 }
│ │ │ │ -
140 }
│ │ │ │ -
141
│ │ │ │ -
143 void unbind()
│ │ │ │ -
144 {
│ │ │ │ -
145 localView_.unbind();
│ │ │ │ -
146 }
│ │ │ │ -
147
│ │ │ │ -
149 bool bound() const
│ │ │ │ -
150 {
│ │ │ │ -
151 return localView_.bound();
│ │ │ │ -
152 }
│ │ │ │ -
153
│ │ │ │ -
155 const Element& localContext() const
│ │ │ │ -
156 {
│ │ │ │ -
157 return localView_.element();
│ │ │ │ -
158 }
│ │ │ │ -
159
│ │ │ │ -
160 protected:
│ │ │ │ -
161
│ │ │ │ -
162 template<class To, class From>
│ │ │ │ -
163 void assignWith(To& to, const From& from) const
│ │ │ │ -
164 {
│ │ │ │ -
165 auto from_flat = flatVectorView(from);
│ │ │ │ -
166 auto to_flat = flatVectorView(to);
│ │ │ │ -
167 assert(from_flat.size() == to_flat.size());
│ │ │ │ -
168 for (size_type i = 0; i < to_flat.size(); ++i)
│ │ │ │ -
169 to_flat[i] = from_flat[i];
│ │ │ │ -
170 }
│ │ │ │ -
171
│ │ │ │ -
172 template<class Node, class TreePath, class Range>
│ │ │ │ -
173 decltype(auto) nodeToRangeEntry(const Node& node, const TreePath& treePath, Range& y) const
│ │ │ │ -
174 {
│ │ │ │ -
175 return (*data_->nodeToRangeEntry)(node, treePath, y);
│ │ │ │ -
176 }
│ │ │ │ -
177
│ │ │ │ -
178 std::shared_ptr<const Data> data_;
│ │ │ │ -
179 LocalView localView_;
│ │ │ │ -
180 std::vector<Coefficient> localDoFs_;
│ │ │ │ -
181 };
│ │ │ │ -
182
│ │ │ │ -
183protected:
│ │ │ │ -
184 DiscreteGlobalBasisFunctionBase(const std::shared_ptr<const Data>& data)
│ │ │ │ -
185 : data_(data)
│ │ │ │ -
186 {
│ │ │ │ -
187 /* Nothing. */
│ │ │ │ -
188 }
│ │ │ │ -
189
│ │ │ │ -
190public:
│ │ │ │ -
191
│ │ │ │ -
193 const Basis& basis() const
│ │ │ │ -
194 {
│ │ │ │ -
195 return *data_->basis;
│ │ │ │ -
196 }
│ │ │ │ -
197
│ │ │ │ -
199 const Vector& dofs() const
│ │ │ │ -
200 {
│ │ │ │ -
201 return *data_->coefficients;
│ │ │ │ -
202 }
│ │ │ │ -
203
│ │ │ │ - │ │ │ │ -
206 {
│ │ │ │ -
207 return *data_->nodeToRangeEntry;
│ │ │ │ -
208 }
│ │ │ │ -
209
│ │ │ │ -
211 const EntitySet& entitySet() const
│ │ │ │ -
212 {
│ │ │ │ -
213 return data_->entitySet;
│ │ │ │ -
214 }
│ │ │ │ -
215
│ │ │ │ -
216protected:
│ │ │ │ -
217 std::shared_ptr<const Data> data_;
│ │ │ │ -
218};
│ │ │ │ -
219
│ │ │ │ -
220} // namespace ImplDoc
│ │ │ │ -
221
│ │ │ │ -
222
│ │ │ │ -
223
│ │ │ │ -
224template<typename DGBF>
│ │ │ │ - │ │ │ │ -
226
│ │ │ │ -
264template<typename B, typename V,
│ │ │ │ -
265 typename NTRE = HierarchicNodeToRangeMap,
│ │ │ │ -
266 typename R = typename V::value_type>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
269{
│ │ │ │ - │ │ │ │ -
271 using Data = typename Base::Data;
│ │ │ │ -
272
│ │ │ │ -
273public:
│ │ │ │ -
274 using Basis = typename Base::Basis;
│ │ │ │ -
275 using Vector = typename Base::Vector;
│ │ │ │ -
276
│ │ │ │ -
277 using Domain = typename Base::Domain;
│ │ │ │ -
278 using Range = R;
│ │ │ │ -
279
│ │ │ │ -
280 using Traits = Imp::GridFunctionTraits<Range(Domain), typename Base::EntitySet, DefaultDerivativeTraits, 16>;
│ │ │ │ -
281
│ │ │ │ -
282private:
│ │ │ │ -
283
│ │ │ │ -
284 template<class Node>
│ │ │ │ -
285 using LocalBasisRange = typename Node::FiniteElement::Traits::LocalBasisType::Traits::RangeType;
│ │ │ │ -
286 template<class Node>
│ │ │ │ -
287 using NodeData = typename std::vector<LocalBasisRange<Node>>;
│ │ │ │ -
288 using PerNodeEvaluationBuffer = typename TypeTree::TreeContainer<NodeData, typename Base::Tree>;
│ │ │ │ -
289
│ │ │ │ -
290public:
│ │ │ │ - │ │ │ │ - │ │ │ │ -
293 {
│ │ │ │ -
294 using LocalBase = typename Base::LocalFunctionBase;
│ │ │ │ -
295 using size_type = typename Base::Tree::size_type;
│ │ │ │ -
296 using LocalBase::nodeToRangeEntry;
│ │ │ │ -
297
│ │ │ │ -
298 public:
│ │ │ │ -
299
│ │ │ │ - │ │ │ │ -
301 using Domain = typename LocalBase::Domain;
│ │ │ │ - │ │ │ │ -
303 using Element = typename LocalBase::Element;
│ │ │ │ -
304
│ │ │ │ - │ │ │ │ -
307 : LocalBase(globalFunction.data_)
│ │ │ │ -
308 , evaluationBuffer_(this->localView_.tree())
│ │ │ │ -
309 {
│ │ │ │ -
310 /* Nothing. */
│ │ │ │ -
311 }
│ │ │ │ -
312
│ │ │ │ -
322 Range operator()(const Domain& x) const
│ │ │ │ -
323 {
│ │ │ │ -
324 Range y;
│ │ │ │ -
325 istlVectorBackend(y) = 0;
│ │ │ │ -
326
│ │ │ │ -
327 TypeTree::forEachLeafNode(this->localView_.tree(), [&](auto&& node, auto&& treePath) {
│ │ │ │ -
328 const auto& fe = node.finiteElement();
│ │ │ │ -
329 const auto& localBasis = fe.localBasis();
│ │ │ │ -
330 auto& shapeFunctionValues = evaluationBuffer_[treePath];
│ │ │ │ -
331
│ │ │ │ -
332 localBasis.evaluateFunction(x, shapeFunctionValues);
│ │ │ │ -
333
│ │ │ │ -
334 // Compute linear combinations of basis function jacobian.
│ │ │ │ -
335 // Non-scalar coefficients of dimension coeffDim are handled by
│ │ │ │ -
336 // processing the coeffDim linear combinations independently
│ │ │ │ -
337 // and storing them as entries of an array.
│ │ │ │ -
338 using Value = LocalBasisRange< std::decay_t<decltype(node)> >;
│ │ │ │ -
339 static constexpr auto coeffDim = decltype(flatVectorView(this->localDoFs_[node.localIndex(0)]).size())::value;
│ │ │ │ -
340 auto values = std::array<Value, coeffDim>{};
│ │ │ │ -
341 istlVectorBackend(values) = 0;
│ │ │ │ -
342 for (size_type i = 0; i < localBasis.size(); ++i)
│ │ │ │ -
343 {
│ │ │ │ -
344 auto c = flatVectorView(this->localDoFs_[node.localIndex(i)]);
│ │ │ │ -
345 for (std::size_t j = 0; j < coeffDim; ++j)
│ │ │ │ -
346 values[j].axpy(c[j], shapeFunctionValues[i]);
│ │ │ │ -
347 }
│ │ │ │ -
348
│ │ │ │ -
349 // Assign computed values to node entry of range.
│ │ │ │ -
350 // Types are matched using the lexicographic ordering provided by flatVectorView.
│ │ │ │ -
351 LocalBase::assignWith(nodeToRangeEntry(node, treePath, y), values);
│ │ │ │ -
352 });
│ │ │ │ -
353
│ │ │ │ -
354 return y;
│ │ │ │ -
355 }
│ │ │ │ -
356
│ │ │ │ - │ │ │ │ -
359 {
│ │ │ │ - │ │ │ │ -
361 if (lf.bound())
│ │ │ │ -
362 dlf.bind(lf.localContext());
│ │ │ │ -
363 return dlf;
│ │ │ │ -
364 }
│ │ │ │ -
365
│ │ │ │ -
366 private:
│ │ │ │ -
367 mutable PerNodeEvaluationBuffer evaluationBuffer_;
│ │ │ │ -
368 };
│ │ │ │ -
369
│ │ │ │ -
371 template<class B_T, class V_T, class NTRE_T>
│ │ │ │ -
372 DiscreteGlobalBasisFunction(B_T && basis, V_T && coefficients, NTRE_T&& nodeToRangeEntry)
│ │ │ │ -
373 : Base(std::make_shared<Data>(Data{{basis.gridView()}, wrap_or_move(std::forward<B_T>(basis)), wrap_or_move(std::forward<V_T>(coefficients)), wrap_or_move(std::forward<NTRE_T>(nodeToRangeEntry))}))
│ │ │ │ -
374 {}
│ │ │ │ -
375
│ │ │ │ -
377 DiscreteGlobalBasisFunction(std::shared_ptr<const Basis> basis, std::shared_ptr<const V> coefficients, std::shared_ptr<const typename Base::NodeToRangeEntry> nodeToRangeEntry)
│ │ │ │ -
378 : Base(std::make_shared<Data>(Data{{basis->gridView()}, basis, coefficients, nodeToRangeEntry}))
│ │ │ │ -
379 {}
│ │ │ │ -
380
│ │ │ │ -
382 Range operator() (const Domain& x) const
│ │ │ │ -
383 {
│ │ │ │ -
384 // TODO: Implement this using hierarchic search
│ │ │ │ -
385 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │ -
386 }
│ │ │ │ -
387
│ │ │ │ - │ │ │ │ -
390 {
│ │ │ │ - │ │ │ │ -
392 }
│ │ │ │ -
393
│ │ │ │ - │ │ │ │ -
403 {
│ │ │ │ -
404 return LocalFunction(t);
│ │ │ │ -
405 }
│ │ │ │ -
406};
│ │ │ │ -
407
│ │ │ │ -
408
│ │ │ │ -
431template<typename R, typename B, typename V>
│ │ │ │ -
432auto makeDiscreteGlobalBasisFunction(B&& basis, V&& vector)
│ │ │ │ -
433{
│ │ │ │ -
434 using Basis = std::decay_t<B>;
│ │ │ │ -
435 using NTREM = HierarchicNodeToRangeMap;
│ │ │ │ -
436
│ │ │ │ -
437 // Small helper functions to wrap vectors using istlVectorBackend
│ │ │ │ -
438 // if they do not already satisfy the VectorBackend interface.
│ │ │ │ -
439 auto toConstVectorBackend = [&](auto&& v) -> decltype(auto) {
│ │ │ │ -
440 if constexpr (models<Concept::ConstVectorBackend<Basis>, decltype(v)>()) {
│ │ │ │ -
441 return std::forward<decltype(v)>(v);
│ │ │ │ -
442 } else {
│ │ │ │ -
443 return istlVectorBackend(v);
│ │ │ │ -
444 }
│ │ │ │ -
445 };
│ │ │ │ -
446
│ │ │ │ -
447 using Vector = std::decay_t<decltype(toConstVectorBackend(std::forward<V>(vector)))>;
│ │ │ │ - │ │ │ │ -
449 std::forward<B>(basis),
│ │ │ │ -
450 toConstVectorBackend(std::forward<V>(vector)),
│ │ │ │ - │ │ │ │ -
452}
│ │ │ │ -
453
│ │ │ │ -
454
│ │ │ │ -
469template<typename DGBF>
│ │ │ │ - │ │ │ │ -
471 : public ImplDoc::DiscreteGlobalBasisFunctionBase<typename DGBF::Basis, typename DGBF::Vector, typename DGBF::NodeToRangeEntry>
│ │ │ │ -
472{
│ │ │ │ - │ │ │ │ -
474 using Data = typename Base::Data;
│ │ │ │ -
475
│ │ │ │ -
476public:
│ │ │ │ - │ │ │ │ -
478
│ │ │ │ -
479 using Basis = typename Base::Basis;
│ │ │ │ -
480 using Vector = typename Base::Vector;
│ │ │ │ -
481
│ │ │ │ -
482 using Domain = typename Base::Domain;
│ │ │ │ - │ │ │ │ -
484
│ │ │ │ -
485 using Traits = Imp::GridFunctionTraits<Range(Domain), typename Base::EntitySet, DefaultDerivativeTraits, 16>;
│ │ │ │ -
486
│ │ │ │ -
487private:
│ │ │ │ -
488
│ │ │ │ -
489 template<class Node>
│ │ │ │ -
490 using LocalBasisRange = typename Node::FiniteElement::Traits::LocalBasisType::Traits::JacobianType;
│ │ │ │ -
491 template<class Node>
│ │ │ │ -
492 using NodeData = typename std::vector< LocalBasisRange<Node> >;
│ │ │ │ -
493 using PerNodeEvaluationBuffer = typename TypeTree::TreeContainer<NodeData, typename Base::Tree>;
│ │ │ │ -
494
│ │ │ │ -
495public:
│ │ │ │ -
496
│ │ │ │ - │ │ │ │ - │ │ │ │ -
506 {
│ │ │ │ -
507 using LocalBase = typename Base::LocalFunctionBase;
│ │ │ │ -
508 using size_type = typename Base::Tree::size_type;
│ │ │ │ -
509 using LocalBase::nodeToRangeEntry;
│ │ │ │ -
510
│ │ │ │ -
511 public:
│ │ │ │ - │ │ │ │ -
513 using Domain = typename LocalBase::Domain;
│ │ │ │ - │ │ │ │ -
515 using Element = typename LocalBase::Element;
│ │ │ │ -
516
│ │ │ │ -
518 LocalFunction(const GlobalFunction& globalFunction)
│ │ │ │ -
519 : LocalBase(globalFunction.data_)
│ │ │ │ -
520 , evaluationBuffer_(this->localView_.tree())
│ │ │ │ -
521 {
│ │ │ │ -
522 /* Nothing. */
│ │ │ │ -
523 }
│ │ │ │ -
524
│ │ │ │ -
531 void bind(const Element& element)
│ │ │ │ -
532 {
│ │ │ │ -
533 LocalBase::bind(element);
│ │ │ │ -
534 geometry_.emplace(element.geometry());
│ │ │ │ -
535 }
│ │ │ │ -
536
│ │ │ │ -
538 void unbind()
│ │ │ │ -
539 {
│ │ │ │ -
540 geometry_.reset();
│ │ │ │ -
541 LocalBase::unbind();
│ │ │ │ -
542 }
│ │ │ │ -
543
│ │ │ │ -
557 Range operator()(const Domain& x) const
│ │ │ │ -
558 {
│ │ │ │ -
559 Range y;
│ │ │ │ -
560 istlVectorBackend(y) = 0;
│ │ │ │ -
561
│ │ │ │ -
562 const auto& jacobianInverse = geometry_->jacobianInverse(x);
│ │ │ │ -
563
│ │ │ │ -
564 TypeTree::forEachLeafNode(this->localView_.tree(), [&](auto&& node, auto&& treePath) {
│ │ │ │ -
565 const auto& fe = node.finiteElement();
│ │ │ │ -
566 const auto& localBasis = fe.localBasis();
│ │ │ │ -
567 auto& shapeFunctionJacobians = evaluationBuffer_[treePath];
│ │ │ │ -
568
│ │ │ │ -
569 localBasis.evaluateJacobian(x, shapeFunctionJacobians);
│ │ │ │ -
570
│ │ │ │ -
571 // Compute linear combinations of basis function jacobian.
│ │ │ │ -
572 // Non-scalar coefficients of dimension coeffDim are handled by
│ │ │ │ -
573 // processing the coeffDim linear combinations independently
│ │ │ │ -
574 // and storing them as entries of an array.
│ │ │ │ -
575 using RefJacobian = LocalBasisRange< std::decay_t<decltype(node)> >;
│ │ │ │ -
576 static constexpr auto coeffDim = decltype(flatVectorView(this->localDoFs_[node.localIndex(0)]).size())::value;
│ │ │ │ -
577 auto refJacobians = std::array<RefJacobian, coeffDim>{};
│ │ │ │ -
578 istlVectorBackend(refJacobians) = 0;
│ │ │ │ -
579 for (size_type i = 0; i < localBasis.size(); ++i)
│ │ │ │ -
580 {
│ │ │ │ -
581 auto c = flatVectorView(this->localDoFs_[node.localIndex(i)]);
│ │ │ │ -
582 for (std::size_t j = 0; j < coeffDim; ++j)
│ │ │ │ -
583 refJacobians[j].axpy(c[j], shapeFunctionJacobians[i]);
│ │ │ │ -
584 }
│ │ │ │ -
585
│ │ │ │ -
586 // Transform Jacobians form local to global coordinates.
│ │ │ │ -
587 using Jacobian = decltype(refJacobians[0] * jacobianInverse);
│ │ │ │ -
588 auto jacobians = std::array<Jacobian, coeffDim>{};
│ │ │ │ -
589 std::transform(
│ │ │ │ -
590 refJacobians.begin(), refJacobians.end(), jacobians.begin(),
│ │ │ │ -
591 [&](const auto& refJacobian) { return refJacobian * jacobianInverse; });
│ │ │ │ -
592
│ │ │ │ -
593 // Assign computed Jacobians to node entry of range.
│ │ │ │ -
594 // Types are matched using the lexicographic ordering provided by flatVectorView.
│ │ │ │ -
595 LocalBase::assignWith(nodeToRangeEntry(node, treePath, y), jacobians);
│ │ │ │ -
596 });
│ │ │ │ -
597
│ │ │ │ -
598 return y;
│ │ │ │ -
599 }
│ │ │ │ -
600
│ │ │ │ - │ │ │ │ -
603 {
│ │ │ │ -
604 DUNE_THROW(NotImplemented, "derivative of derivative is not implemented");
│ │ │ │ -
605 }
│ │ │ │ -
606
│ │ │ │ -
607 private:
│ │ │ │ -
608 mutable PerNodeEvaluationBuffer evaluationBuffer_;
│ │ │ │ -
609 std::optional<typename Element::Geometry> geometry_;
│ │ │ │ -
610 };
│ │ │ │ -
611
│ │ │ │ -
618 DiscreteGlobalBasisFunctionDerivative(const std::shared_ptr<const Data>& data)
│ │ │ │ -
619 : Base(data)
│ │ │ │ -
620 {
│ │ │ │ -
621 /* Nothing. */
│ │ │ │ -
622 }
│ │ │ │ -
623
│ │ │ │ -
625 Range operator()(const Domain& x) const
│ │ │ │ -
626 {
│ │ │ │ -
627 // TODO: Implement this using hierarchic search
│ │ │ │ -
628 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │ -
629 }
│ │ │ │ -
630
│ │ │ │ - │ │ │ │ -
632 {
│ │ │ │ -
633 DUNE_THROW(NotImplemented, "derivative of derivative is not implemented");
│ │ │ │ -
634 }
│ │ │ │ -
635
│ │ │ │ - │ │ │ │ -
638 {
│ │ │ │ -
639 return LocalFunction(f);
│ │ │ │ -
640 }
│ │ │ │ -
641};
│ │ │ │ -
642
│ │ │ │ -
643
│ │ │ │ -
644} // namespace Functions
│ │ │ │ -
645} // namespace Dune
│ │ │ │ -
646
│ │ │ │ -
647#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
auto makeDiscreteGlobalBasisFunction(B &&basis, V &&vector)
Generate a DiscreteGlobalBasisFunction.
Definition: discreteglobalbasisfunction.hh:432
│ │ │ │ -
auto istlVectorBackend(Vector &v)
Return a vector backend wrapping non-const ISTL like containers.
Definition: istlvectorbackend.hh:346
│ │ │ │ +
71 void bind(const Element& e)
│ │ │ │ +
72 {
│ │ │ │ +
73 rootLocalView_.bind(e);
│ │ │ │ +
74 }
│ │ │ │ +
75
│ │ │ │ +
80 const Element& element() const
│ │ │ │ +
81 {
│ │ │ │ +
82 return rootLocalView_.element();
│ │ │ │ +
83 }
│ │ │ │ +
84
│ │ │ │ +
89 void unbind()
│ │ │ │ +
90 {
│ │ │ │ +
91 rootLocalView_.unbind();
│ │ │ │ +
92 }
│ │ │ │ +
93
│ │ │ │ +
96 bool bound() const
│ │ │ │ +
97 {
│ │ │ │ +
98 return rootLocalView_.bound();
│ │ │ │ +
99 }
│ │ │ │ +
100
│ │ │ │ +
105 const Tree& tree() const
│ │ │ │ +
106 {
│ │ │ │ +
107 return TypeTree::child(rootLocalView_.tree(), globalBasis_->prefixPath());
│ │ │ │ +
108 }
│ │ │ │ +
109
│ │ │ │ + │ │ │ │ +
113 {
│ │ │ │ +
114 return rootLocalView_.size();
│ │ │ │ +
115 }
│ │ │ │ +
116
│ │ │ │ + │ │ │ │ +
124 {
│ │ │ │ +
125 return rootLocalView_.maxSize();
│ │ │ │ +
126 }
│ │ │ │ +
127
│ │ │ │ + │ │ │ │ +
130 {
│ │ │ │ +
131 return rootLocalView_.index(i);
│ │ │ │ +
132 }
│ │ │ │ +
133
│ │ │ │ + │ │ │ │ +
137 {
│ │ │ │ +
138 return *globalBasis_;
│ │ │ │ +
139 }
│ │ │ │ +
140
│ │ │ │ + │ │ │ │ +
142 {
│ │ │ │ +
143 return rootLocalView_;
│ │ │ │ +
144 }
│ │ │ │ +
145
│ │ │ │ +
146protected:
│ │ │ │ + │ │ │ │ + │ │ │ │ +
149};
│ │ │ │ +
150
│ │ │ │ +
151
│ │ │ │ +
152
│ │ │ │ +
153} // end namespace Functions
│ │ │ │ +
154} // end namespace Dune
│ │ │ │ +
155
│ │ │ │ +
156
│ │ │ │ +
157
│ │ │ │ +
158#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACELOCALVIEW_HH
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
auto flatVectorView(T &t)
Create flat vector view of passed mutable container.
Definition: flatvectorview.hh:179
│ │ │ │ -
Default implementation for derivative traits.
Definition: defaultderivativetraits.hh:37
│ │ │ │ -
Helper class to deduce the signature of a callable.
Definition: signature.hh:56
│ │ │ │ -
A simple node to range map using the nested tree indices.
Definition: hierarchicnodetorangemap.hh:30
│ │ │ │ -
Definition: discreteglobalbasisfunction.hh:28
│ │ │ │ -
std::shared_ptr< const Data > data_
Definition: discreteglobalbasisfunction.hh:217
│ │ │ │ -
const Vector & dofs() const
Return the coefficients of this discrete function by reference.
Definition: discreteglobalbasisfunction.hh:199
│ │ │ │ -
B Basis
Definition: discreteglobalbasisfunction.hh:30
│ │ │ │ -
typename Basis::LocalView::Tree Tree
Definition: discreteglobalbasisfunction.hh:39
│ │ │ │ -
V Vector
Definition: discreteglobalbasisfunction.hh:31
│ │ │ │ -
typename EntitySet::Element Element
Definition: discreteglobalbasisfunction.hh:45
│ │ │ │ -
typename EntitySet::LocalCoordinate LocalDomain
Definition: discreteglobalbasisfunction.hh:44
│ │ │ │ -
const NodeToRangeEntry & nodeToRangeEntry() const
Return the stored node-to-range map.
Definition: discreteglobalbasisfunction.hh:205
│ │ │ │ -
NTRE NodeToRangeEntry
Definition: discreteglobalbasisfunction.hh:40
│ │ │ │ -
DiscreteGlobalBasisFunctionBase(const std::shared_ptr< const Data > &data)
Definition: discreteglobalbasisfunction.hh:184
│ │ │ │ -
typename Basis::GridView GridView
Definition: discreteglobalbasisfunction.hh:37
│ │ │ │ -
const Basis & basis() const
Return a const reference to the stored basis.
Definition: discreteglobalbasisfunction.hh:193
│ │ │ │ -
GridViewEntitySet< GridView, 0 > EntitySet
Definition: discreteglobalbasisfunction.hh:38
│ │ │ │ -
const EntitySet & entitySet() const
Get associated set of entities the local-function can be bound to.
Definition: discreteglobalbasisfunction.hh:211
│ │ │ │ -
typename EntitySet::GlobalCoordinate Domain
Definition: discreteglobalbasisfunction.hh:42
│ │ │ │ -
Dune::AutonomousValue< decltype(std::declval< Vector >()[std::declval< typename Basis::MultiIndex >()])> Coefficient
Definition: discreteglobalbasisfunction.hh:35
│ │ │ │ -
Definition: discreteglobalbasisfunction.hh:53
│ │ │ │ -
EntitySet entitySet
Definition: discreteglobalbasisfunction.hh:54
│ │ │ │ -
std::shared_ptr< const NodeToRangeEntry > nodeToRangeEntry
Definition: discreteglobalbasisfunction.hh:57
│ │ │ │ -
std::shared_ptr< const Basis > basis
Definition: discreteglobalbasisfunction.hh:55
│ │ │ │ -
std::shared_ptr< const Vector > coefficients
Definition: discreteglobalbasisfunction.hh:56
│ │ │ │ - │ │ │ │ -
LocalFunctionBase & operator=(const LocalFunctionBase &other)
Copy-assignment of the local-function.
Definition: discreteglobalbasisfunction.hh:100
│ │ │ │ -
bool bound() const
Check if LocalFunction is already bound to an element.
Definition: discreteglobalbasisfunction.hh:149
│ │ │ │ -
void bind(const Element &element)
Bind LocalFunction to grid element.
Definition: discreteglobalbasisfunction.hh:116
│ │ │ │ -
typename EntitySet::Element Element
Definition: discreteglobalbasisfunction.hh:68
│ │ │ │ -
const Element & localContext() const
Return the element the local-function is bound to.
Definition: discreteglobalbasisfunction.hh:155
│ │ │ │ -
LocalFunctionBase(const LocalFunctionBase &other)
Copy-construct the local-function.
Definition: discreteglobalbasisfunction.hh:84
│ │ │ │ -
std::vector< Coefficient > localDoFs_
Definition: discreteglobalbasisfunction.hh:180
│ │ │ │ -
void assignWith(To &to, const From &from) const
Definition: discreteglobalbasisfunction.hh:163
│ │ │ │ -
std::shared_ptr< const Data > data_
Definition: discreteglobalbasisfunction.hh:178
│ │ │ │ -
decltype(auto) nodeToRangeEntry(const Node &node, const TreePath &treePath, Range &y) const
Definition: discreteglobalbasisfunction.hh:173
│ │ │ │ -
LocalView localView_
Definition: discreteglobalbasisfunction.hh:179
│ │ │ │ -
void unbind()
Unbind the local-function.
Definition: discreteglobalbasisfunction.hh:143
│ │ │ │ -
LocalDomain Domain
Definition: discreteglobalbasisfunction.hh:67
│ │ │ │ -
LocalFunctionBase(const std::shared_ptr< const Data > &data)
Definition: discreteglobalbasisfunction.hh:71
│ │ │ │ -
Derivative of a DiscreteGlobalBasisFunction
Definition: discreteglobalbasisfunction.hh:472
│ │ │ │ -
typename Base::Basis Basis
Definition: discreteglobalbasisfunction.hh:479
│ │ │ │ -
friend Traits::DerivativeInterface derivative(const DiscreteGlobalBasisFunctionDerivative &f)
Definition: discreteglobalbasisfunction.hh:631
│ │ │ │ -
Range operator()(const Domain &x) const
Not implemented.
Definition: discreteglobalbasisfunction.hh:625
│ │ │ │ -
typename SignatureTraits< typename DiscreteGlobalBasisFunction::Traits::DerivativeInterface >::Range Range
Definition: discreteglobalbasisfunction.hh:483
│ │ │ │ -
friend LocalFunction localFunction(const DiscreteGlobalBasisFunctionDerivative &f)
Construct local function from a DiscreteGlobalBasisFunctionDerivative
Definition: discreteglobalbasisfunction.hh:637
│ │ │ │ -
DiscreteGlobalBasisFunctionDerivative(const std::shared_ptr< const Data > &data)
create object from DiscreateGlobalBasisFunction data
Definition: discreteglobalbasisfunction.hh:618
│ │ │ │ -
DGBF DiscreteGlobalBasisFunction
Definition: discreteglobalbasisfunction.hh:477
│ │ │ │ -
typename Base::Vector Vector
Definition: discreteglobalbasisfunction.hh:480
│ │ │ │ -
Imp::GridFunctionTraits< Range(Domain), typename Base::EntitySet, DefaultDerivativeTraits, 16 > Traits
Definition: discreteglobalbasisfunction.hh:485
│ │ │ │ -
typename Base::Domain Domain
Definition: discreteglobalbasisfunction.hh:482
│ │ │ │ -
A grid function induced by a global basis and a coefficient vector.
Definition: discreteglobalbasisfunction.hh:269
│ │ │ │ -
friend DiscreteGlobalBasisFunctionDerivative< DiscreteGlobalBasisFunction > derivative(const DiscreteGlobalBasisFunction &f)
Derivative of the DiscreteGlobalBasisFunction
Definition: discreteglobalbasisfunction.hh:389
│ │ │ │ -
DiscreteGlobalBasisFunction(B_T &&basis, V_T &&coefficients, NTRE_T &&nodeToRangeEntry)
Create a grid-function, by wrapping the arguments in std::shared_ptr.
Definition: discreteglobalbasisfunction.hh:372
│ │ │ │ -
DiscreteGlobalBasisFunction(std::shared_ptr< const Basis > basis, std::shared_ptr< const V > coefficients, std::shared_ptr< const typename Base::NodeToRangeEntry > nodeToRangeEntry)
Create a grid-function, by moving the arguments in std::shared_ptr.
Definition: discreteglobalbasisfunction.hh:377
│ │ │ │ -
friend LocalFunction localFunction(const DiscreteGlobalBasisFunction &t)
Construct local function from a DiscreteGlobalBasisFunction.
Definition: discreteglobalbasisfunction.hh:402
│ │ │ │ -
typename Base::Basis Basis
Definition: discreteglobalbasisfunction.hh:274
│ │ │ │ -
Imp::GridFunctionTraits< Range(Domain), typename Base::EntitySet, DefaultDerivativeTraits, 16 > Traits
Definition: discreteglobalbasisfunction.hh:280
│ │ │ │ -
R Range
Definition: discreteglobalbasisfunction.hh:278
│ │ │ │ -
typename Base::Vector Vector
Definition: discreteglobalbasisfunction.hh:275
│ │ │ │ -
typename Base::Domain Domain
Definition: discreteglobalbasisfunction.hh:277
│ │ │ │ -
Definition: discreteglobalbasisfunction.hh:293
│ │ │ │ -
GlobalFunction::Range Range
Definition: discreteglobalbasisfunction.hh:302
│ │ │ │ -
LocalFunction(const DiscreteGlobalBasisFunction &globalFunction)
Create a local-function from the associated grid-function.
Definition: discreteglobalbasisfunction.hh:306
│ │ │ │ -
friend DiscreteGlobalBasisFunctionDerivative< DiscreteGlobalBasisFunction >::LocalFunction derivative(const LocalFunction &lf)
Local function of the derivative.
Definition: discreteglobalbasisfunction.hh:358
│ │ │ │ -
Range operator()(const Domain &x) const
Evaluate this local-function in coordinates x in the bound element.
Definition: discreteglobalbasisfunction.hh:322
│ │ │ │ -
local function evaluating the derivative in reference coordinates
Definition: discreteglobalbasisfunction.hh:506
│ │ │ │ -
Range operator()(const Domain &x) const
Evaluate this local-function in coordinates x in the bound element.
Definition: discreteglobalbasisfunction.hh:557
│ │ │ │ -
friend Traits::LocalFunctionTraits::DerivativeInterface derivative(const LocalFunction &)
Not implemented.
Definition: discreteglobalbasisfunction.hh:602
│ │ │ │ -
GlobalFunction::Range Range
Definition: discreteglobalbasisfunction.hh:514
│ │ │ │ -
void unbind()
Unbind the local-function.
Definition: discreteglobalbasisfunction.hh:538
│ │ │ │ -
LocalFunction(const GlobalFunction &globalFunction)
Create a local function from the associated grid function.
Definition: discreteglobalbasisfunction.hh:518
│ │ │ │ -
void bind(const Element &element)
Bind LocalFunction to grid element.
Definition: discreteglobalbasisfunction.hh:531
│ │ │ │ -
Definition: gridfunction.hh:32
│ │ │ │ - │ │ │ │ -
GridView::template Codim< codim >::Entity Element
Type of Elements contained in this EntitySet.
Definition: gridviewentityset.hh:32
│ │ │ │ -
Element::Geometry::LocalCoordinate LocalCoordinate
Type of local coordinates with respect to the Element.
Definition: gridviewentityset.hh:35
│ │ │ │ -
Element::Geometry::GlobalCoordinate GlobalCoordinate
Definition: gridviewentityset.hh:36
│ │ │ │ - │ │ │ │ +
SubspaceBasis(const RB &, const TP) -> SubspaceBasis< RB, TP >
│ │ │ │ +
Definition: subspacebasis.hh:38
│ │ │ │ +
typename RootBasis::GridView GridView
The grid view that the FE space is defined on.
Definition: subspacebasis.hh:48
│ │ │ │ +
const PrefixPath & prefixPath() const
Definition: subspacebasis.hh:118
│ │ │ │ +
The restriction of a finite element basis to a single element.
Definition: subspacelocalview.hh:30
│ │ │ │ +
typename TypeTree::ChildForTreePath< RootTree, PrefixPath > Tree
Tree of local finite elements / local shape function sets.
Definition: subspacelocalview.hh:53
│ │ │ │ +
void unbind()
Unbind from the current element.
Definition: subspacelocalview.hh:89
│ │ │ │ +
const Element & element() const
Return the grid element that the view is bound to.
Definition: subspacelocalview.hh:80
│ │ │ │ +
const GlobalBasis * globalBasis_
Definition: subspacelocalview.hh:147
│ │ │ │ +
bool bound() const
Return if the view is bound to a grid element.
Definition: subspacelocalview.hh:96
│ │ │ │ +
typename RootLocalView::MultiIndex MultiIndex
Type used for global numbering of the basis vectors.
Definition: subspacelocalview.hh:56
│ │ │ │ +
size_type size() const
Total number of degrees of freedom on this element.
Definition: subspacelocalview.hh:112
│ │ │ │ +
RootLocalView rootLocalView_
Definition: subspacelocalview.hh:148
│ │ │ │ +
void bind(const Element &e)
Bind the view to a grid element.
Definition: subspacelocalview.hh:71
│ │ │ │ +
typename GlobalBasis::GridView GridView
The grid view the global FE basis lives on.
Definition: subspacelocalview.hh:41
│ │ │ │ +
SubspaceLocalView(const GlobalBasis &globalBasis, const PrefixPath &)
Construct local view for a given global finite element basis.
Definition: subspacelocalview.hh:59
│ │ │ │ +
RLV RootLocalView
Definition: subspacelocalview.hh:35
│ │ │ │ +
const RootLocalView & rootLocalView() const
Definition: subspacelocalview.hh:141
│ │ │ │ +
std::size_t size_type
The type used for sizes.
Definition: subspacelocalview.hh:47
│ │ │ │ +
typename GridView::template Codim< 0 >::Entity Element
Type of the grid element we are bound to.
Definition: subspacelocalview.hh:44
│ │ │ │ +
const GlobalBasis & globalBasis() const
Return the global basis that we are a view on.
Definition: subspacelocalview.hh:136
│ │ │ │ +
size_type maxSize() const
Maximum local size for any element on the GridView.
Definition: subspacelocalview.hh:123
│ │ │ │ +
const Tree & tree() const
Return the local ansatz tree associated to the bound entity.
Definition: subspacelocalview.hh:105
│ │ │ │ +
MultiIndex index(size_type i) const
Maps from subtree index set [0..size-1] to a globally unique multi index in global basis.
Definition: subspacelocalview.hh:129
│ │ │ │ +
typename RootLocalView::Tree RootTree
Tree of local finite elements / local shape function sets.
Definition: subspacelocalview.hh:50
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,843 +4,229 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * gridfunctions │ │ │ │ │ -discreteglobalbasisfunction.hh │ │ │ │ │ + * functionspacebases │ │ │ │ │ +subspacelocalview.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#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACELOCALVIEW_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACELOCALVIEW_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ + 6 │ │ │ │ │ + 7#include │ │ │ │ │ 8 │ │ │ │ │ - 9#include │ │ │ │ │ + 9#include │ │ │ │ │ 10 │ │ │ │ │ - 11#include │ │ │ │ │ + 11#include │ │ │ │ │ 12 │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ - 16#include │ │ │ │ │ - 17#include │ │ │ │ │ - 18#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14 │ │ │ │ │ + 15 │ │ │ │ │ + 16 │ │ │ │ │ + 17namespace Dune { │ │ │ │ │ + 18namespace Functions { │ │ │ │ │ 19 │ │ │ │ │ - 20namespace Dune { │ │ │ │ │ - 21namespace Functions { │ │ │ │ │ - 22 │ │ │ │ │ - 23 │ │ │ │ │ -24namespace ImplDoc { │ │ │ │ │ + 20 │ │ │ │ │ + 21 │ │ │ │ │ + 22template │ │ │ │ │ + 23class SubspaceBasis; │ │ │ │ │ + 24 │ │ │ │ │ 25 │ │ │ │ │ - 26template │ │ │ │ │ -27class DiscreteGlobalBasisFunctionBase │ │ │ │ │ - 28{ │ │ │ │ │ - 29public: │ │ │ │ │ -30 using Basis = B; │ │ │ │ │ -31 using Vector = V; │ │ │ │ │ + 26 │ │ │ │ │ + 28template │ │ │ │ │ +29class SubspaceLocalView │ │ │ │ │ + 30{ │ │ │ │ │ + 31 using PrefixPath = PP; │ │ │ │ │ 32 │ │ │ │ │ - 33 // In order to make the cache work for proxy-references │ │ │ │ │ - 34 // we have to use AutonomousValue instead of std::decay_t │ │ │ │ │ -35 using Coefficient = Dune::AutonomousValue() │ │ │ │ │ -[std::declval()])>; │ │ │ │ │ + 33public: │ │ │ │ │ + 34 │ │ │ │ │ +35 using RootLocalView = RLV; │ │ │ │ │ 36 │ │ │ │ │ -37 using GridView = typename Basis::GridView; │ │ │ │ │ -38 using EntitySet = GridViewEntitySet; │ │ │ │ │ -39 using Tree = typename Basis::LocalView::Tree; │ │ │ │ │ -40 using NodeToRangeEntry = NTRE; │ │ │ │ │ - 41 │ │ │ │ │ -42 using Domain = typename EntitySet::GlobalCoordinate; │ │ │ │ │ - 43 │ │ │ │ │ -44 using LocalDomain = typename EntitySet::LocalCoordinate; │ │ │ │ │ -45 using Element = typename EntitySet::Element; │ │ │ │ │ - 46 │ │ │ │ │ - 47protected: │ │ │ │ │ +38 using GlobalBasis = SubspaceBasis; │ │ │ │ │ + 39 │ │ │ │ │ +41 using GridView = typename GlobalBasis::GridView; │ │ │ │ │ + 42 │ │ │ │ │ +44 using Element = typename GridView::template Codim<0>::Entity; │ │ │ │ │ + 45 │ │ │ │ │ +47 using size_type = std::size_t; │ │ │ │ │ 48 │ │ │ │ │ - 49 // This collects all data that is shared by all related │ │ │ │ │ - 50 // global and local functions. This way we don't need to │ │ │ │ │ - 51 // keep track of it individually. │ │ │ │ │ -52 struct Data │ │ │ │ │ - 53 { │ │ │ │ │ -54 EntitySet entitySet; │ │ │ │ │ -55 std::shared_ptr basis; │ │ │ │ │ -56 std::shared_ptr coefficients; │ │ │ │ │ -57 std::shared_ptr nodeToRangeEntry; │ │ │ │ │ - 58 }; │ │ │ │ │ - 59 │ │ │ │ │ - 60public: │ │ │ │ │ -61 class LocalFunctionBase │ │ │ │ │ +50 using RootTree = typename RootLocalView::Tree; │ │ │ │ │ + 51 │ │ │ │ │ +53 using Tree = typename TypeTree::ChildForTreePath; │ │ │ │ │ + 54 │ │ │ │ │ +56 using MultiIndex = typename RootLocalView::MultiIndex; │ │ │ │ │ + 57 │ │ │ │ │ +59 SubspaceLocalView(const GlobalBasis& globalBasis, const PrefixPath& / │ │ │ │ │ +*prefixPath*/) : │ │ │ │ │ + 60 globalBasis_(&globalBasis), │ │ │ │ │ + 61 rootLocalView_(globalBasis.rootBasis().localView()) │ │ │ │ │ 62 { │ │ │ │ │ - 63 using LocalView = typename Basis::LocalView; │ │ │ │ │ - 64 using size_type = typename Tree::size_type; │ │ │ │ │ + 63// static_assert(models, Tree>(), "Tree type │ │ │ │ │ +passed to SubspaceLocalView does not model the BasisNode concept."); │ │ │ │ │ + 64 } │ │ │ │ │ 65 │ │ │ │ │ - 66 public: │ │ │ │ │ -67 using Domain = LocalDomain; │ │ │ │ │ -68 using Element = typename EntitySet::Element; │ │ │ │ │ - 69 │ │ │ │ │ - 70 protected: │ │ │ │ │ -71 LocalFunctionBase(const std::shared_ptr& data) │ │ │ │ │ - 72 : data_(data) │ │ │ │ │ - 73 , localView_(data_->basis->localView()) │ │ │ │ │ - 74 { │ │ │ │ │ - 75 localDoFs_.reserve(localView_.maxSize()); │ │ │ │ │ - 76 } │ │ │ │ │ - 77 │ │ │ │ │ -84 LocalFunctionBase(const LocalFunctionBase& other) │ │ │ │ │ - 85 : data_(other.data_) │ │ │ │ │ - 86 , localView_(other.localView_) │ │ │ │ │ - 87 { │ │ │ │ │ - 88 localDoFs_.reserve(localView_.maxSize()); │ │ │ │ │ - 89 if (bound()) │ │ │ │ │ - 90 localDoFs_ = other.localDoFs_; │ │ │ │ │ - 91 } │ │ │ │ │ - 92 │ │ │ │ │ -100 LocalFunctionBase& operator=(const LocalFunctionBase& other) │ │ │ │ │ - 101 { │ │ │ │ │ - 102 data_ = other.data_; │ │ │ │ │ - 103 localView_ = other.localView_; │ │ │ │ │ - 104 if (bound()) │ │ │ │ │ - 105 localDoFs_ = other.localDoFs_; │ │ │ │ │ - 106 return *this; │ │ │ │ │ - 107 } │ │ │ │ │ - 108 │ │ │ │ │ - 109 public: │ │ │ │ │ -116 void bind(const Element& element) │ │ │ │ │ - 117 { │ │ │ │ │ - 118 localView_.bind(element); │ │ │ │ │ - 119 // Use cache of full local view size. For a subspace basis, │ │ │ │ │ - 120 // this may be larger than the number of local DOFs in the │ │ │ │ │ - 121 // tree. In this case only cache entries associated to local │ │ │ │ │ - 122 // DOFs in the subspace are filled. Cache entries associated │ │ │ │ │ - 123 // to local DOFs which are not contained in the subspace will │ │ │ │ │ - 124 // not be touched. │ │ │ │ │ - 125 // │ │ │ │ │ - 126 // Alternatively one could use a cache that exactly fits │ │ │ │ │ - 127 // the size of the tree. However, this would require to │ │ │ │ │ - 128 // subtract an offset from localIndex(i) on each cache │ │ │ │ │ - 129 // access in operator(). │ │ │ │ │ - 130 localDoFs_.resize(localView_.size()); │ │ │ │ │ - 131 const auto& dofs = *data_->coefficients; │ │ │ │ │ - 132 for (size_type i = 0; i < localView_.tree().size(); ++i) │ │ │ │ │ - 133 { │ │ │ │ │ - 134 // For a subspace basis the index-within-tree i │ │ │ │ │ - 135 // is not the same as the localIndex within the │ │ │ │ │ - 136 // full local view. │ │ │ │ │ - 137 size_t localIndex = localView_.tree().localIndex(i); │ │ │ │ │ - 138 localDoFs_[localIndex] = dofs[localView_.index(localIndex)]; │ │ │ │ │ +71 void bind(const Element& e) │ │ │ │ │ + 72 { │ │ │ │ │ + 73 rootLocalView_.bind(e); │ │ │ │ │ + 74 } │ │ │ │ │ + 75 │ │ │ │ │ +80 const Element& element() const │ │ │ │ │ + 81 { │ │ │ │ │ + 82 return rootLocalView_.element(); │ │ │ │ │ + 83 } │ │ │ │ │ + 84 │ │ │ │ │ +89 void unbind() │ │ │ │ │ + 90 { │ │ │ │ │ + 91 rootLocalView_.unbind(); │ │ │ │ │ + 92 } │ │ │ │ │ + 93 │ │ │ │ │ +96 bool bound() const │ │ │ │ │ + 97 { │ │ │ │ │ + 98 return rootLocalView_.bound(); │ │ │ │ │ + 99 } │ │ │ │ │ + 100 │ │ │ │ │ +105 const Tree& tree() const │ │ │ │ │ + 106 { │ │ │ │ │ + 107 return TypeTree::child(rootLocalView_.tree(), globalBasis_->prefixPath()); │ │ │ │ │ + 108 } │ │ │ │ │ + 109 │ │ │ │ │ +112 size_type size() const │ │ │ │ │ + 113 { │ │ │ │ │ + 114 return rootLocalView_.size(); │ │ │ │ │ + 115 } │ │ │ │ │ + 116 │ │ │ │ │ +123 size_type maxSize() const │ │ │ │ │ + 124 { │ │ │ │ │ + 125 return rootLocalView_.maxSize(); │ │ │ │ │ + 126 } │ │ │ │ │ + 127 │ │ │ │ │ +129 MultiIndex index(size_type i) const │ │ │ │ │ + 130 { │ │ │ │ │ + 131 return rootLocalView_.index(i); │ │ │ │ │ + 132 } │ │ │ │ │ + 133 │ │ │ │ │ +136 const GlobalBasis& globalBasis() const │ │ │ │ │ + 137 { │ │ │ │ │ + 138 return *globalBasis_; │ │ │ │ │ 139 } │ │ │ │ │ - 140 } │ │ │ │ │ - 141 │ │ │ │ │ -143 void unbind() │ │ │ │ │ - 144 { │ │ │ │ │ - 145 localView_.unbind(); │ │ │ │ │ - 146 } │ │ │ │ │ - 147 │ │ │ │ │ -149 bool bound() const │ │ │ │ │ - 150 { │ │ │ │ │ - 151 return localView_.bound(); │ │ │ │ │ - 152 } │ │ │ │ │ - 153 │ │ │ │ │ -155 const Element& localContext() const │ │ │ │ │ - 156 { │ │ │ │ │ - 157 return localView_.element(); │ │ │ │ │ - 158 } │ │ │ │ │ - 159 │ │ │ │ │ - 160 protected: │ │ │ │ │ - 161 │ │ │ │ │ - 162 template │ │ │ │ │ -163 void assignWith(To& to, const From& from) const │ │ │ │ │ - 164 { │ │ │ │ │ - 165 auto from_flat = flatVectorView(from); │ │ │ │ │ - 166 auto to_flat = flatVectorView(to); │ │ │ │ │ - 167 assert(from_flat.size() == to_flat.size()); │ │ │ │ │ - 168 for (size_type i = 0; i < to_flat.size(); ++i) │ │ │ │ │ - 169 to_flat[i] = from_flat[i]; │ │ │ │ │ - 170 } │ │ │ │ │ - 171 │ │ │ │ │ - 172 template │ │ │ │ │ -173 decltype(auto) nodeToRangeEntry(const Node& node, const TreePath& treePath, │ │ │ │ │ -Range& y) const │ │ │ │ │ - 174 { │ │ │ │ │ - 175 return (*data_->nodeToRangeEntry)(node, treePath, y); │ │ │ │ │ - 176 } │ │ │ │ │ - 177 │ │ │ │ │ -178 std::shared_ptr data_; │ │ │ │ │ -179 LocalView localView_; │ │ │ │ │ -180 std::vector localDoFs_; │ │ │ │ │ - 181 }; │ │ │ │ │ - 182 │ │ │ │ │ - 183protected: │ │ │ │ │ -184 DiscreteGlobalBasisFunctionBase(const std::shared_ptr& data) │ │ │ │ │ - 185 : data_(data) │ │ │ │ │ - 186 { │ │ │ │ │ - 187 /* Nothing. */ │ │ │ │ │ - 188 } │ │ │ │ │ - 189 │ │ │ │ │ - 190public: │ │ │ │ │ - 191 │ │ │ │ │ -193 const Basis& basis() const │ │ │ │ │ - 194 { │ │ │ │ │ - 195 return *data_->basis; │ │ │ │ │ - 196 } │ │ │ │ │ - 197 │ │ │ │ │ -199 const Vector& dofs() const │ │ │ │ │ - 200 { │ │ │ │ │ - 201 return *data_->coefficients; │ │ │ │ │ - 202 } │ │ │ │ │ - 203 │ │ │ │ │ -205 const NodeToRangeEntry& nodeToRangeEntry() const │ │ │ │ │ - 206 { │ │ │ │ │ - 207 return *data_->nodeToRangeEntry; │ │ │ │ │ - 208 } │ │ │ │ │ - 209 │ │ │ │ │ -211 const EntitySet& entitySet() const │ │ │ │ │ - 212 { │ │ │ │ │ - 213 return data_->entitySet; │ │ │ │ │ - 214 } │ │ │ │ │ - 215 │ │ │ │ │ - 216protected: │ │ │ │ │ -217 std::shared_ptr data_; │ │ │ │ │ - 218}; │ │ │ │ │ - 219 │ │ │ │ │ - 220} // namespace ImplDoc │ │ │ │ │ - 221 │ │ │ │ │ - 222 │ │ │ │ │ - 223 │ │ │ │ │ - 224template │ │ │ │ │ - 225class DiscreteGlobalBasisFunctionDerivative; │ │ │ │ │ - 226 │ │ │ │ │ - 264template │ │ │ │ │ -267class DiscreteGlobalBasisFunction │ │ │ │ │ - 268 : public ImplDoc::DiscreteGlobalBasisFunctionBase │ │ │ │ │ - 269{ │ │ │ │ │ - 270 using Base = ImplDoc::DiscreteGlobalBasisFunctionBase; │ │ │ │ │ - 271 using Data = typename Base::Data; │ │ │ │ │ - 272 │ │ │ │ │ - 273public: │ │ │ │ │ -274 using Basis = typename Base::Basis; │ │ │ │ │ -275 using Vector = typename Base::Vector; │ │ │ │ │ - 276 │ │ │ │ │ -277 using Domain = typename Base::Domain; │ │ │ │ │ -278 using Range = R; │ │ │ │ │ - 279 │ │ │ │ │ -280 using Traits = Imp::GridFunctionTraits; │ │ │ │ │ - 281 │ │ │ │ │ - 282private: │ │ │ │ │ - 283 │ │ │ │ │ - 284 template │ │ │ │ │ - 285 using LocalBasisRange = typename Node::FiniteElement::Traits:: │ │ │ │ │ -LocalBasisType::Traits::RangeType; │ │ │ │ │ - 286 template │ │ │ │ │ - 287 using NodeData = typename std::vector>; │ │ │ │ │ - 288 using PerNodeEvaluationBuffer = typename TypeTree::TreeContainer; │ │ │ │ │ - 289 │ │ │ │ │ - 290public: │ │ │ │ │ -291 class LocalFunction │ │ │ │ │ - 292 : public Base::LocalFunctionBase │ │ │ │ │ - 293 { │ │ │ │ │ - 294 using LocalBase = typename Base::LocalFunctionBase; │ │ │ │ │ - 295 using size_type = typename Base::Tree::size_type; │ │ │ │ │ - 296 using LocalBase::nodeToRangeEntry; │ │ │ │ │ - 297 │ │ │ │ │ - 298 public: │ │ │ │ │ - 299 │ │ │ │ │ -300 using GlobalFunction = DiscreteGlobalBasisFunction; │ │ │ │ │ -301 using Domain = typename LocalBase::Domain; │ │ │ │ │ -302 using Range = GlobalFunction::Range; │ │ │ │ │ -303 using Element = typename LocalBase::Element; │ │ │ │ │ - 304 │ │ │ │ │ -306 LocalFunction(const DiscreteGlobalBasisFunction& globalFunction) │ │ │ │ │ - 307 : LocalBase(globalFunction.data_) │ │ │ │ │ - 308 , evaluationBuffer_(this->localView_.tree()) │ │ │ │ │ - 309 { │ │ │ │ │ - 310 /* Nothing. */ │ │ │ │ │ - 311 } │ │ │ │ │ - 312 │ │ │ │ │ -322 Range operator()(const Domain& x) const │ │ │ │ │ - 323 { │ │ │ │ │ - 324 Range y; │ │ │ │ │ - 325 istlVectorBackend(y) = 0; │ │ │ │ │ - 326 │ │ │ │ │ - 327 TypeTree::forEachLeafNode(this->localView_.tree(), [&](auto&& node, auto&& │ │ │ │ │ -treePath) { │ │ │ │ │ - 328 const auto& fe = node.finiteElement(); │ │ │ │ │ - 329 const auto& localBasis = fe.localBasis(); │ │ │ │ │ - 330 auto& shapeFunctionValues = evaluationBuffer_[treePath]; │ │ │ │ │ - 331 │ │ │ │ │ - 332 localBasis.evaluateFunction(x, shapeFunctionValues); │ │ │ │ │ - 333 │ │ │ │ │ - 334 // Compute linear combinations of basis function jacobian. │ │ │ │ │ - 335 // Non-scalar coefficients of dimension coeffDim are handled by │ │ │ │ │ - 336 // processing the coeffDim linear combinations independently │ │ │ │ │ - 337 // and storing them as entries of an array. │ │ │ │ │ - 338 using Value = LocalBasisRange< std::decay_t >; │ │ │ │ │ - 339 static constexpr auto coeffDim = decltype(flatVectorView(this->localDoFs_ │ │ │ │ │ -[node.localIndex(0)]).size())::value; │ │ │ │ │ - 340 auto values = std::array{}; │ │ │ │ │ - 341 istlVectorBackend(values) = 0; │ │ │ │ │ - 342 for (size_type i = 0; i < localBasis.size(); ++i) │ │ │ │ │ - 343 { │ │ │ │ │ - 344 auto c = flatVectorView(this->localDoFs_[node.localIndex(i)]); │ │ │ │ │ - 345 for (std::size_t j = 0; j < coeffDim; ++j) │ │ │ │ │ - 346 values[j].axpy(c[j], shapeFunctionValues[i]); │ │ │ │ │ - 347 } │ │ │ │ │ - 348 │ │ │ │ │ - 349 // Assign computed values to node entry of range. │ │ │ │ │ - 350 // Types are matched using the lexicographic ordering provided by │ │ │ │ │ -flatVectorView. │ │ │ │ │ - 351 LocalBase::assignWith(nodeToRangeEntry(node, treePath, y), values); │ │ │ │ │ - 352 }); │ │ │ │ │ - 353 │ │ │ │ │ - 354 return y; │ │ │ │ │ - 355 } │ │ │ │ │ - 356 │ │ │ │ │ -358 friend typename │ │ │ │ │ -DiscreteGlobalBasisFunctionDerivative:: │ │ │ │ │ -LocalFunction derivative(const LocalFunction& lf) │ │ │ │ │ - 359 { │ │ │ │ │ - 360 auto dlf = localFunction │ │ │ │ │ -(DiscreteGlobalBasisFunctionDerivative(lf.data_)); │ │ │ │ │ - 361 if (lf.bound()) │ │ │ │ │ - 362 dlf.bind(lf.localContext()); │ │ │ │ │ - 363 return dlf; │ │ │ │ │ - 364 } │ │ │ │ │ - 365 │ │ │ │ │ - 366 private: │ │ │ │ │ - 367 mutable PerNodeEvaluationBuffer evaluationBuffer_; │ │ │ │ │ - 368 }; │ │ │ │ │ - 369 │ │ │ │ │ - 371 template │ │ │ │ │ -372 DiscreteGlobalBasisFunction(B_T && basis, V_T && coefficients, NTRE_T&& │ │ │ │ │ -nodeToRangeEntry) │ │ │ │ │ - 373 : Base(std::make_shared(Data{{basis.gridView()}, wrap_or_move(std:: │ │ │ │ │ -forward(basis)), wrap_or_move(std::forward(coefficients)), │ │ │ │ │ -wrap_or_move(std::forward(nodeToRangeEntry))})) │ │ │ │ │ - 374 {} │ │ │ │ │ - 375 │ │ │ │ │ -377 DiscreteGlobalBasisFunction(std::shared_ptr basis, std:: │ │ │ │ │ -shared_ptr coefficients, std::shared_ptr nodeToRangeEntry) │ │ │ │ │ - 378 : Base(std::make_shared(Data{{basis->gridView()}, basis, │ │ │ │ │ -coefficients, nodeToRangeEntry})) │ │ │ │ │ - 379 {} │ │ │ │ │ - 380 │ │ │ │ │ -382 Range operator() (const Domain& x) const │ │ │ │ │ - 383 { │ │ │ │ │ - 384 // TODO: Implement this using hierarchic search │ │ │ │ │ - 385 DUNE_THROW(NotImplemented,"not implemented"); │ │ │ │ │ - 386 } │ │ │ │ │ - 387 │ │ │ │ │ -389 friend DiscreteGlobalBasisFunctionDerivative │ │ │ │ │ -derivative(const DiscreteGlobalBasisFunction& f) │ │ │ │ │ - 390 { │ │ │ │ │ - 391 return DiscreteGlobalBasisFunctionDerivative │ │ │ │ │ -(f.data_); │ │ │ │ │ - 392 } │ │ │ │ │ - 393 │ │ │ │ │ -402 friend LocalFunction localFunction(const DiscreteGlobalBasisFunction& t) │ │ │ │ │ - 403 { │ │ │ │ │ - 404 return LocalFunction(t); │ │ │ │ │ - 405 } │ │ │ │ │ - 406}; │ │ │ │ │ - 407 │ │ │ │ │ - 408 │ │ │ │ │ - 431template │ │ │ │ │ -432auto makeDiscreteGlobalBasisFunction(B&& basis, V&& vector) │ │ │ │ │ - 433{ │ │ │ │ │ - 434 using Basis = std::decay_t; │ │ │ │ │ - 435 using NTREM = HierarchicNodeToRangeMap; │ │ │ │ │ - 436 │ │ │ │ │ - 437 // Small helper functions to wrap vectors using istlVectorBackend │ │ │ │ │ - 438 // if they do not already satisfy the VectorBackend interface. │ │ │ │ │ - 439 auto toConstVectorBackend = [&](auto&& v) -> decltype(auto) { │ │ │ │ │ - 440 if constexpr (models, decltype(v)>()) { │ │ │ │ │ - 441 return std::forward(v); │ │ │ │ │ - 442 } else { │ │ │ │ │ - 443 return istlVectorBackend(v); │ │ │ │ │ - 444 } │ │ │ │ │ - 445 }; │ │ │ │ │ - 446 │ │ │ │ │ - 447 using Vector = std::decay_t │ │ │ │ │ -(vector)))>; │ │ │ │ │ - 448 return DiscreteGlobalBasisFunction( │ │ │ │ │ - 449 std::forward(basis), │ │ │ │ │ - 450 toConstVectorBackend(std::forward(vector)), │ │ │ │ │ - 451 HierarchicNodeToRangeMap()); │ │ │ │ │ - 452} │ │ │ │ │ - 453 │ │ │ │ │ - 454 │ │ │ │ │ - 469template │ │ │ │ │ -470class DiscreteGlobalBasisFunctionDerivative │ │ │ │ │ - 471 : public ImplDoc::DiscreteGlobalBasisFunctionBase │ │ │ │ │ - 472{ │ │ │ │ │ - 473 using Base = ImplDoc::DiscreteGlobalBasisFunctionBase; │ │ │ │ │ - 474 using Data = typename Base::Data; │ │ │ │ │ - 475 │ │ │ │ │ - 476public: │ │ │ │ │ -477 using DiscreteGlobalBasisFunction = DGBF; │ │ │ │ │ - 478 │ │ │ │ │ -479 using Basis = typename Base::Basis; │ │ │ │ │ -480 using Vector = typename Base::Vector; │ │ │ │ │ - 481 │ │ │ │ │ -482 using Domain = typename Base::Domain; │ │ │ │ │ -483 using Range = typename SignatureTraits::Range; │ │ │ │ │ - 484 │ │ │ │ │ -485 using Traits = Imp::GridFunctionTraits; │ │ │ │ │ - 486 │ │ │ │ │ - 487private: │ │ │ │ │ - 488 │ │ │ │ │ - 489 template │ │ │ │ │ - 490 using LocalBasisRange = typename Node::FiniteElement::Traits:: │ │ │ │ │ -LocalBasisType::Traits::JacobianType; │ │ │ │ │ - 491 template │ │ │ │ │ - 492 using NodeData = typename std::vector< LocalBasisRange >; │ │ │ │ │ - 493 using PerNodeEvaluationBuffer = typename TypeTree::TreeContainer; │ │ │ │ │ - 494 │ │ │ │ │ - 495public: │ │ │ │ │ - 496 │ │ │ │ │ -504 class LocalFunction │ │ │ │ │ - 505 : public Base::LocalFunctionBase │ │ │ │ │ - 506 { │ │ │ │ │ - 507 using LocalBase = typename Base::LocalFunctionBase; │ │ │ │ │ - 508 using size_type = typename Base::Tree::size_type; │ │ │ │ │ - 509 using LocalBase::nodeToRangeEntry; │ │ │ │ │ - 510 │ │ │ │ │ - 511 public: │ │ │ │ │ -512 using GlobalFunction = DiscreteGlobalBasisFunctionDerivative; │ │ │ │ │ -513 using Domain = typename LocalBase::Domain; │ │ │ │ │ -514 using Range = GlobalFunction::Range; │ │ │ │ │ -515 using Element = typename LocalBase::Element; │ │ │ │ │ - 516 │ │ │ │ │ -518 LocalFunction(const GlobalFunction& globalFunction) │ │ │ │ │ - 519 : LocalBase(globalFunction.data_) │ │ │ │ │ - 520 , evaluationBuffer_(this->localView_.tree()) │ │ │ │ │ - 521 { │ │ │ │ │ - 522 /* Nothing. */ │ │ │ │ │ - 523 } │ │ │ │ │ - 524 │ │ │ │ │ -531 void bind(const Element& element) │ │ │ │ │ - 532 { │ │ │ │ │ - 533 LocalBase::bind(element); │ │ │ │ │ - 534 geometry_.emplace(element.geometry()); │ │ │ │ │ - 535 } │ │ │ │ │ - 536 │ │ │ │ │ -538 void unbind() │ │ │ │ │ - 539 { │ │ │ │ │ - 540 geometry_.reset(); │ │ │ │ │ - 541 LocalBase::unbind(); │ │ │ │ │ - 542 } │ │ │ │ │ - 543 │ │ │ │ │ -557 Range operator()(const Domain& x) const │ │ │ │ │ - 558 { │ │ │ │ │ - 559 Range y; │ │ │ │ │ - 560 istlVectorBackend(y) = 0; │ │ │ │ │ - 561 │ │ │ │ │ - 562 const auto& jacobianInverse = geometry_->jacobianInverse(x); │ │ │ │ │ - 563 │ │ │ │ │ - 564 TypeTree::forEachLeafNode(this->localView_.tree(), [&](auto&& node, auto&& │ │ │ │ │ -treePath) { │ │ │ │ │ - 565 const auto& fe = node.finiteElement(); │ │ │ │ │ - 566 const auto& localBasis = fe.localBasis(); │ │ │ │ │ - 567 auto& shapeFunctionJacobians = evaluationBuffer_[treePath]; │ │ │ │ │ - 568 │ │ │ │ │ - 569 localBasis.evaluateJacobian(x, shapeFunctionJacobians); │ │ │ │ │ - 570 │ │ │ │ │ - 571 // Compute linear combinations of basis function jacobian. │ │ │ │ │ - 572 // Non-scalar coefficients of dimension coeffDim are handled by │ │ │ │ │ - 573 // processing the coeffDim linear combinations independently │ │ │ │ │ - 574 // and storing them as entries of an array. │ │ │ │ │ - 575 using RefJacobian = LocalBasisRange< std::decay_t >; │ │ │ │ │ - 576 static constexpr auto coeffDim = decltype(flatVectorView(this->localDoFs_ │ │ │ │ │ -[node.localIndex(0)]).size())::value; │ │ │ │ │ - 577 auto refJacobians = std::array{}; │ │ │ │ │ - 578 istlVectorBackend(refJacobians) = 0; │ │ │ │ │ - 579 for (size_type i = 0; i < localBasis.size(); ++i) │ │ │ │ │ - 580 { │ │ │ │ │ - 581 auto c = flatVectorView(this->localDoFs_[node.localIndex(i)]); │ │ │ │ │ - 582 for (std::size_t j = 0; j < coeffDim; ++j) │ │ │ │ │ - 583 refJacobians[j].axpy(c[j], shapeFunctionJacobians[i]); │ │ │ │ │ - 584 } │ │ │ │ │ - 585 │ │ │ │ │ - 586 // Transform Jacobians form local to global coordinates. │ │ │ │ │ - 587 using Jacobian = decltype(refJacobians[0] * jacobianInverse); │ │ │ │ │ - 588 auto jacobians = std::array{}; │ │ │ │ │ - 589 std::transform( │ │ │ │ │ - 590 refJacobians.begin(), refJacobians.end(), jacobians.begin(), │ │ │ │ │ - 591 [&](const auto& refJacobian) { return refJacobian * jacobianInverse; }); │ │ │ │ │ - 592 │ │ │ │ │ - 593 // Assign computed Jacobians to node entry of range. │ │ │ │ │ - 594 // Types are matched using the lexicographic ordering provided by │ │ │ │ │ -flatVectorView. │ │ │ │ │ - 595 LocalBase::assignWith(nodeToRangeEntry(node, treePath, y), jacobians); │ │ │ │ │ - 596 }); │ │ │ │ │ - 597 │ │ │ │ │ - 598 return y; │ │ │ │ │ - 599 } │ │ │ │ │ - 600 │ │ │ │ │ -602 friend typename Traits::LocalFunctionTraits::DerivativeInterface derivative │ │ │ │ │ -(const LocalFunction&) │ │ │ │ │ - 603 { │ │ │ │ │ - 604 DUNE_THROW(NotImplemented, "derivative of derivative is not implemented"); │ │ │ │ │ - 605 } │ │ │ │ │ - 606 │ │ │ │ │ - 607 private: │ │ │ │ │ - 608 mutable PerNodeEvaluationBuffer evaluationBuffer_; │ │ │ │ │ - 609 std::optional geometry_; │ │ │ │ │ - 610 }; │ │ │ │ │ - 611 │ │ │ │ │ -618 DiscreteGlobalBasisFunctionDerivative(const std::shared_ptr& │ │ │ │ │ -data) │ │ │ │ │ - 619 : Base(data) │ │ │ │ │ - 620 { │ │ │ │ │ - 621 /* Nothing. */ │ │ │ │ │ - 622 } │ │ │ │ │ - 623 │ │ │ │ │ -625 Range operator()(const Domain& x) const │ │ │ │ │ - 626 { │ │ │ │ │ - 627 // TODO: Implement this using hierarchic search │ │ │ │ │ - 628 DUNE_THROW(NotImplemented,"not implemented"); │ │ │ │ │ - 629 } │ │ │ │ │ - 630 │ │ │ │ │ -631 friend typename Traits::DerivativeInterface derivative(const │ │ │ │ │ -DiscreteGlobalBasisFunctionDerivative& f) │ │ │ │ │ - 632 { │ │ │ │ │ - 633 DUNE_THROW(NotImplemented, "derivative of derivative is not implemented"); │ │ │ │ │ - 634 } │ │ │ │ │ - 635 │ │ │ │ │ -637 friend LocalFunction localFunction(const │ │ │ │ │ -DiscreteGlobalBasisFunctionDerivative& f) │ │ │ │ │ - 638 { │ │ │ │ │ - 639 return LocalFunction(f); │ │ │ │ │ - 640 } │ │ │ │ │ - 641}; │ │ │ │ │ - 642 │ │ │ │ │ - 643 │ │ │ │ │ - 644} // namespace Functions │ │ │ │ │ - 645} // namespace Dune │ │ │ │ │ - 646 │ │ │ │ │ - 647#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH │ │ │ │ │ -istlvectorbackend.hh │ │ │ │ │ -gridviewentityset.hh │ │ │ │ │ -gridfunction.hh │ │ │ │ │ -flatvectorview.hh │ │ │ │ │ -hierarchicnodetorangemap.hh │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunction::makeDiscreteGlobalBasisFunction │ │ │ │ │ -auto makeDiscreteGlobalBasisFunction(B &&basis, V &&vector) │ │ │ │ │ -Generate a DiscreteGlobalBasisFunction. │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:432 │ │ │ │ │ -Dune::Functions::istlVectorBackend │ │ │ │ │ -auto istlVectorBackend(Vector &v) │ │ │ │ │ -Return a vector backend wrapping non-const ISTL like containers. │ │ │ │ │ -Definition: istlvectorbackend.hh:346 │ │ │ │ │ + 140 │ │ │ │ │ +141 const RootLocalView& rootLocalView() const │ │ │ │ │ + 142 { │ │ │ │ │ + 143 return rootLocalView_; │ │ │ │ │ + 144 } │ │ │ │ │ + 145 │ │ │ │ │ + 146protected: │ │ │ │ │ +147 const GlobalBasis* globalBasis_; │ │ │ │ │ +148 RootLocalView rootLocalView_; │ │ │ │ │ + 149}; │ │ │ │ │ + 150 │ │ │ │ │ + 151 │ │ │ │ │ + 152 │ │ │ │ │ + 153} // end namespace Functions │ │ │ │ │ + 154} // end namespace Dune │ │ │ │ │ + 155 │ │ │ │ │ + 156 │ │ │ │ │ + 157 │ │ │ │ │ + 158#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACELOCALVIEW_HH │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::flatVectorView │ │ │ │ │ -auto flatVectorView(T &t) │ │ │ │ │ -Create flat vector view of passed mutable container. │ │ │ │ │ -Definition: flatvectorview.hh:179 │ │ │ │ │ -Dune::Functions::DefaultDerivativeTraits │ │ │ │ │ -Default implementation for derivative traits. │ │ │ │ │ -Definition: defaultderivativetraits.hh:37 │ │ │ │ │ -Dune::Functions::SignatureTraits │ │ │ │ │ -Helper class to deduce the signature of a callable. │ │ │ │ │ -Definition: signature.hh:56 │ │ │ │ │ -Dune::Functions::HierarchicNodeToRangeMap │ │ │ │ │ -A simple node to range map using the nested tree indices. │ │ │ │ │ -Definition: hierarchicnodetorangemap.hh:30 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:28 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::data_ │ │ │ │ │ -std::shared_ptr< const Data > data_ │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:217 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::dofs │ │ │ │ │ -const Vector & dofs() const │ │ │ │ │ -Return the coefficients of this discrete function by reference. │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:199 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::Basis │ │ │ │ │ -B Basis │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:30 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::Tree │ │ │ │ │ -typename Basis::LocalView::Tree Tree │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:39 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::Vector │ │ │ │ │ -V Vector │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:31 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::Element │ │ │ │ │ -typename EntitySet::Element Element │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:45 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalDomain │ │ │ │ │ -typename EntitySet::LocalCoordinate LocalDomain │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:44 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::nodeToRangeEntry │ │ │ │ │ -const NodeToRangeEntry & nodeToRangeEntry() const │ │ │ │ │ -Return the stored node-to-range map. │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:205 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::NodeToRangeEntry │ │ │ │ │ -NTRE NodeToRangeEntry │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:40 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase:: │ │ │ │ │ -DiscreteGlobalBasisFunctionBase │ │ │ │ │ -DiscreteGlobalBasisFunctionBase(const std::shared_ptr< const Data > &data) │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:184 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::GridView │ │ │ │ │ -typename Basis::GridView GridView │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:37 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::basis │ │ │ │ │ -const Basis & basis() const │ │ │ │ │ -Return a const reference to the stored basis. │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:193 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::EntitySet │ │ │ │ │ -GridViewEntitySet< GridView, 0 > EntitySet │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:38 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::entitySet │ │ │ │ │ -const EntitySet & entitySet() const │ │ │ │ │ -Get associated set of entities the local-function can be bound to. │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:211 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::Domain │ │ │ │ │ -typename EntitySet::GlobalCoordinate Domain │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:42 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::Coefficient │ │ │ │ │ -Dune::AutonomousValue< decltype(std::declval< Vector >()[std::declval< typename │ │ │ │ │ -Basis::MultiIndex >()])> Coefficient │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:35 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::Data │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:53 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::Data::entitySet │ │ │ │ │ -EntitySet entitySet │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:54 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::Data:: │ │ │ │ │ -nodeToRangeEntry │ │ │ │ │ -std::shared_ptr< const NodeToRangeEntry > nodeToRangeEntry │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:57 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::Data::basis │ │ │ │ │ -std::shared_ptr< const Basis > basis │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:55 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::Data::coefficients │ │ │ │ │ -std::shared_ptr< const Vector > coefficients │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:56 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:62 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ -operator= │ │ │ │ │ -LocalFunctionBase & operator=(const LocalFunctionBase &other) │ │ │ │ │ -Copy-assignment of the local-function. │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:100 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ -bound │ │ │ │ │ -bool bound() const │ │ │ │ │ -Check if LocalFunction is already bound to an element. │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:149 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ -bind │ │ │ │ │ -void bind(const Element &element) │ │ │ │ │ -Bind LocalFunction to grid element. │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:116 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ -Element │ │ │ │ │ -typename EntitySet::Element Element │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:68 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ -localContext │ │ │ │ │ -const Element & localContext() const │ │ │ │ │ -Return the element the local-function is bound to. │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:155 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ -LocalFunctionBase │ │ │ │ │ -LocalFunctionBase(const LocalFunctionBase &other) │ │ │ │ │ -Copy-construct the local-function. │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:84 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ -localDoFs_ │ │ │ │ │ -std::vector< Coefficient > localDoFs_ │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:180 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ -assignWith │ │ │ │ │ -void assignWith(To &to, const From &from) const │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:163 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ -data_ │ │ │ │ │ -std::shared_ptr< const Data > data_ │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:178 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ -nodeToRangeEntry │ │ │ │ │ -decltype(auto) nodeToRangeEntry(const Node &node, const TreePath &treePath, │ │ │ │ │ -Range &y) const │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:173 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ -localView_ │ │ │ │ │ -LocalView localView_ │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:179 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ -unbind │ │ │ │ │ -void unbind() │ │ │ │ │ -Unbind the local-function. │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:143 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ -Domain │ │ │ │ │ -LocalDomain Domain │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:67 │ │ │ │ │ -Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ -LocalFunctionBase │ │ │ │ │ -LocalFunctionBase(const std::shared_ptr< const Data > &data) │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:71 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunctionDerivative │ │ │ │ │ -Derivative of a DiscreteGlobalBasisFunction │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:472 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunctionDerivative::Basis │ │ │ │ │ -typename Base::Basis Basis │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:479 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunctionDerivative::derivative │ │ │ │ │ -friend Traits::DerivativeInterface derivative(const │ │ │ │ │ -DiscreteGlobalBasisFunctionDerivative &f) │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:631 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunctionDerivative::operator() │ │ │ │ │ -Range operator()(const Domain &x) const │ │ │ │ │ -Not implemented. │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:625 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunctionDerivative::Range │ │ │ │ │ -typename SignatureTraits< typename DiscreteGlobalBasisFunction::Traits:: │ │ │ │ │ -DerivativeInterface >::Range Range │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:483 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunctionDerivative::localFunction │ │ │ │ │ -friend LocalFunction localFunction(const DiscreteGlobalBasisFunctionDerivative │ │ │ │ │ -&f) │ │ │ │ │ -Construct local function from a DiscreteGlobalBasisFunctionDerivative │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:637 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunctionDerivative:: │ │ │ │ │ -DiscreteGlobalBasisFunctionDerivative │ │ │ │ │ -DiscreteGlobalBasisFunctionDerivative(const std::shared_ptr< const Data > │ │ │ │ │ -&data) │ │ │ │ │ -create object from DiscreateGlobalBasisFunction data │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:618 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunctionDerivative:: │ │ │ │ │ -DiscreteGlobalBasisFunction │ │ │ │ │ -DGBF DiscreteGlobalBasisFunction │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:477 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunctionDerivative::Vector │ │ │ │ │ -typename Base::Vector Vector │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:480 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunctionDerivative::Traits │ │ │ │ │ -Imp::GridFunctionTraits< Range(Domain), typename Base::EntitySet, │ │ │ │ │ -DefaultDerivativeTraits, 16 > Traits │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:485 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunctionDerivative::Domain │ │ │ │ │ -typename Base::Domain Domain │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:482 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunction │ │ │ │ │ -A grid function induced by a global basis and a coefficient vector. │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:269 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunction::derivative │ │ │ │ │ -friend DiscreteGlobalBasisFunctionDerivative< DiscreteGlobalBasisFunction > │ │ │ │ │ -derivative(const DiscreteGlobalBasisFunction &f) │ │ │ │ │ -Derivative of the DiscreteGlobalBasisFunction │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:389 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunction::DiscreteGlobalBasisFunction │ │ │ │ │ -DiscreteGlobalBasisFunction(B_T &&basis, V_T &&coefficients, NTRE_T │ │ │ │ │ -&&nodeToRangeEntry) │ │ │ │ │ -Create a grid-function, by wrapping the arguments in std::shared_ptr. │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:372 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunction::DiscreteGlobalBasisFunction │ │ │ │ │ -DiscreteGlobalBasisFunction(std::shared_ptr< const Basis > basis, std:: │ │ │ │ │ -shared_ptr< const V > coefficients, std::shared_ptr< const typename Base:: │ │ │ │ │ -NodeToRangeEntry > nodeToRangeEntry) │ │ │ │ │ -Create a grid-function, by moving the arguments in std::shared_ptr. │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:377 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunction::localFunction │ │ │ │ │ -friend LocalFunction localFunction(const DiscreteGlobalBasisFunction &t) │ │ │ │ │ -Construct local function from a DiscreteGlobalBasisFunction. │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:402 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunction::Basis │ │ │ │ │ -typename Base::Basis Basis │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:274 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunction::Traits │ │ │ │ │ -Imp::GridFunctionTraits< Range(Domain), typename Base::EntitySet, │ │ │ │ │ -DefaultDerivativeTraits, 16 > Traits │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:280 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunction::Range │ │ │ │ │ -R Range │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:278 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunction::Vector │ │ │ │ │ -typename Base::Vector Vector │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:275 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunction::Domain │ │ │ │ │ -typename Base::Domain Domain │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:277 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunction::LocalFunction │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:293 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunction::LocalFunction::Range │ │ │ │ │ -GlobalFunction::Range Range │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:302 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunction::LocalFunction::LocalFunction │ │ │ │ │ -LocalFunction(const DiscreteGlobalBasisFunction &globalFunction) │ │ │ │ │ -Create a local-function from the associated grid-function. │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:306 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunction::LocalFunction::derivative │ │ │ │ │ -friend DiscreteGlobalBasisFunctionDerivative< DiscreteGlobalBasisFunction >:: │ │ │ │ │ -LocalFunction derivative(const LocalFunction &lf) │ │ │ │ │ -Local function of the derivative. │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:358 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunction::LocalFunction::operator() │ │ │ │ │ -Range operator()(const Domain &x) const │ │ │ │ │ -Evaluate this local-function in coordinates x in the bound element. │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:322 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunctionDerivative::LocalFunction │ │ │ │ │ -local function evaluating the derivative in reference coordinates │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:506 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunctionDerivative::LocalFunction::operator │ │ │ │ │ -() │ │ │ │ │ -Range operator()(const Domain &x) const │ │ │ │ │ -Evaluate this local-function in coordinates x in the bound element. │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:557 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunctionDerivative::LocalFunction:: │ │ │ │ │ -derivative │ │ │ │ │ -friend Traits::LocalFunctionTraits::DerivativeInterface derivative(const │ │ │ │ │ -LocalFunction &) │ │ │ │ │ -Not implemented. │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:602 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunctionDerivative::LocalFunction::Range │ │ │ │ │ -GlobalFunction::Range Range │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:514 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunctionDerivative::LocalFunction::unbind │ │ │ │ │ +Dune::Functions::SubspaceBasis │ │ │ │ │ +SubspaceBasis(const RB &, const TP) -> SubspaceBasis< RB, TP > │ │ │ │ │ +Dune::Functions::SubspaceBasis │ │ │ │ │ +Definition: subspacebasis.hh:38 │ │ │ │ │ +Dune::Functions::SubspaceBasis::GridView │ │ │ │ │ +typename RootBasis::GridView GridView │ │ │ │ │ +The grid view that the FE space is defined on. │ │ │ │ │ +Definition: subspacebasis.hh:48 │ │ │ │ │ +Dune::Functions::SubspaceBasis::prefixPath │ │ │ │ │ +const PrefixPath & prefixPath() const │ │ │ │ │ +Definition: subspacebasis.hh:118 │ │ │ │ │ +Dune::Functions::SubspaceLocalView │ │ │ │ │ +The restriction of a finite element basis to a single element. │ │ │ │ │ +Definition: subspacelocalview.hh:30 │ │ │ │ │ +Dune::Functions::SubspaceLocalView::Tree │ │ │ │ │ +typename TypeTree::ChildForTreePath< RootTree, PrefixPath > Tree │ │ │ │ │ +Tree of local finite elements / local shape function sets. │ │ │ │ │ +Definition: subspacelocalview.hh:53 │ │ │ │ │ +Dune::Functions::SubspaceLocalView::unbind │ │ │ │ │ void unbind() │ │ │ │ │ -Unbind the local-function. │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:538 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunctionDerivative::LocalFunction:: │ │ │ │ │ -LocalFunction │ │ │ │ │ -LocalFunction(const GlobalFunction &globalFunction) │ │ │ │ │ -Create a local function from the associated grid function. │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:518 │ │ │ │ │ -Dune::Functions::DiscreteGlobalBasisFunctionDerivative::LocalFunction::bind │ │ │ │ │ -void bind(const Element &element) │ │ │ │ │ -Bind LocalFunction to grid element. │ │ │ │ │ -Definition: discreteglobalbasisfunction.hh:531 │ │ │ │ │ -Dune::Functions::GridFunction │ │ │ │ │ -Definition: gridfunction.hh:32 │ │ │ │ │ -Dune::Functions::GridViewEntitySet<_GridView,_0_> │ │ │ │ │ -Dune::Functions::GridViewEntitySet<_GridView,_0_>::Element │ │ │ │ │ -GridView::template Codim< codim >::Entity Element │ │ │ │ │ -Type of Elements contained in this EntitySet. │ │ │ │ │ -Definition: gridviewentityset.hh:32 │ │ │ │ │ -Dune::Functions::GridViewEntitySet<_GridView,_0_>::LocalCoordinate │ │ │ │ │ -Element::Geometry::LocalCoordinate LocalCoordinate │ │ │ │ │ -Type of local coordinates with respect to the Element. │ │ │ │ │ -Definition: gridviewentityset.hh:35 │ │ │ │ │ -Dune::Functions::GridViewEntitySet<_GridView,_0_>::GlobalCoordinate │ │ │ │ │ -Element::Geometry::GlobalCoordinate GlobalCoordinate │ │ │ │ │ -Definition: gridviewentityset.hh:36 │ │ │ │ │ +Unbind from the current element. │ │ │ │ │ +Definition: subspacelocalview.hh:89 │ │ │ │ │ +Dune::Functions::SubspaceLocalView::element │ │ │ │ │ +const Element & element() const │ │ │ │ │ +Return the grid element that the view is bound to. │ │ │ │ │ +Definition: subspacelocalview.hh:80 │ │ │ │ │ +Dune::Functions::SubspaceLocalView::globalBasis_ │ │ │ │ │ +const GlobalBasis * globalBasis_ │ │ │ │ │ +Definition: subspacelocalview.hh:147 │ │ │ │ │ +Dune::Functions::SubspaceLocalView::bound │ │ │ │ │ +bool bound() const │ │ │ │ │ +Return if the view is bound to a grid element. │ │ │ │ │ +Definition: subspacelocalview.hh:96 │ │ │ │ │ +Dune::Functions::SubspaceLocalView::MultiIndex │ │ │ │ │ +typename RootLocalView::MultiIndex MultiIndex │ │ │ │ │ +Type used for global numbering of the basis vectors. │ │ │ │ │ +Definition: subspacelocalview.hh:56 │ │ │ │ │ +Dune::Functions::SubspaceLocalView::size │ │ │ │ │ +size_type size() const │ │ │ │ │ +Total number of degrees of freedom on this element. │ │ │ │ │ +Definition: subspacelocalview.hh:112 │ │ │ │ │ +Dune::Functions::SubspaceLocalView::rootLocalView_ │ │ │ │ │ +RootLocalView rootLocalView_ │ │ │ │ │ +Definition: subspacelocalview.hh:148 │ │ │ │ │ +Dune::Functions::SubspaceLocalView::bind │ │ │ │ │ +void bind(const Element &e) │ │ │ │ │ +Bind the view to a grid element. │ │ │ │ │ +Definition: subspacelocalview.hh:71 │ │ │ │ │ +Dune::Functions::SubspaceLocalView::GridView │ │ │ │ │ +typename GlobalBasis::GridView GridView │ │ │ │ │ +The grid view the global FE basis lives on. │ │ │ │ │ +Definition: subspacelocalview.hh:41 │ │ │ │ │ +Dune::Functions::SubspaceLocalView::SubspaceLocalView │ │ │ │ │ +SubspaceLocalView(const GlobalBasis &globalBasis, const PrefixPath &) │ │ │ │ │ +Construct local view for a given global finite element basis. │ │ │ │ │ +Definition: subspacelocalview.hh:59 │ │ │ │ │ +Dune::Functions::SubspaceLocalView::RootLocalView │ │ │ │ │ +RLV RootLocalView │ │ │ │ │ +Definition: subspacelocalview.hh:35 │ │ │ │ │ +Dune::Functions::SubspaceLocalView::rootLocalView │ │ │ │ │ +const RootLocalView & rootLocalView() const │ │ │ │ │ +Definition: subspacelocalview.hh:141 │ │ │ │ │ +Dune::Functions::SubspaceLocalView::size_type │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +The type used for sizes. │ │ │ │ │ +Definition: subspacelocalview.hh:47 │ │ │ │ │ +Dune::Functions::SubspaceLocalView::Element │ │ │ │ │ +typename GridView::template Codim< 0 >::Entity Element │ │ │ │ │ +Type of the grid element we are bound to. │ │ │ │ │ +Definition: subspacelocalview.hh:44 │ │ │ │ │ +Dune::Functions::SubspaceLocalView::globalBasis │ │ │ │ │ +const GlobalBasis & globalBasis() const │ │ │ │ │ +Return the global basis that we are a view on. │ │ │ │ │ +Definition: subspacelocalview.hh:136 │ │ │ │ │ +Dune::Functions::SubspaceLocalView::maxSize │ │ │ │ │ +size_type maxSize() const │ │ │ │ │ +Maximum local size for any element on the GridView. │ │ │ │ │ +Definition: subspacelocalview.hh:123 │ │ │ │ │ +Dune::Functions::SubspaceLocalView::tree │ │ │ │ │ +const Tree & tree() const │ │ │ │ │ +Return the local ansatz tree associated to the bound entity. │ │ │ │ │ +Definition: subspacelocalview.hh:105 │ │ │ │ │ +Dune::Functions::SubspaceLocalView::index │ │ │ │ │ +MultiIndex index(size_type i) const │ │ │ │ │ +Maps from subtree index set [0..size-1] to a globally unique multi index in │ │ │ │ │ +global basis. │ │ │ │ │ +Definition: subspacelocalview.hh:129 │ │ │ │ │ +Dune::Functions::SubspaceLocalView::RootTree │ │ │ │ │ +typename RootLocalView::Tree RootTree │ │ │ │ │ +Tree of local finite elements / local shape function sets. │ │ │ │ │ +Definition: subspacelocalview.hh:50 │ │ │ │ │ concepts.hh │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00104.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: localderivativetraits.hh File Reference │ │ │ │ +dune-functions: subspacebasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,44 +58,61 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
localderivativetraits.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
subspacebasis.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <dune/functions/common/defaultderivativetraits.hh>
│ │ │ │ +
#include <dune/common/reservedvector.hh>
│ │ │ │ +#include <dune/common/typeutilities.hh>
│ │ │ │ +#include <dune/common/concept.hh>
│ │ │ │ +#include <dune/functions/common/type_traits.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/subspacelocalview.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::Functions::LocalDerivativeTraits< EntitySet, DerivativeTraits >
 Derivative traits for local functions. More...
 
struct  Dune::Functions::LocalDerivativeTraits< EntitySet, DerivativeTraits >::Traits< Signature >
 
struct  Dune::Functions::LocalDerivativeTraits< EntitySet, DerivativeTraits >::Traits< R(LocalDomain)>
class  Dune::Functions::SubspaceBasis< RB, TP >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<class RB , class TP >
 Dune::Functions::SubspaceBasis (const RB &, const TP) -> SubspaceBasis< RB, TP >
 
template<class RootRootBasis , class InnerTP , class OuterTP >
 Dune::Functions::SubspaceBasis (const SubspaceBasis< RootRootBasis, InnerTP > &rootBasis, const OuterTP &prefixPath) -> SubspaceBasis< std::decay_t< decltype(rootBasis.rootBasis())>, Impl::JoinTreePath_t< InnerTP, OuterTP > >
 
template<class RootBasis , class... PrefixTreeIndices>
auto Dune::Functions::subspaceBasis (const RootBasis &rootBasis, const TypeTree::HybridTreePath< PrefixTreeIndices... > &prefixPath)
 Create SubspaceBasis from a root basis and a prefixPath. More...
 
template<class RootBasis , class... PrefixTreeIndices>
auto Dune::Functions::subspaceBasis (const RootBasis &rootBasis, const PrefixTreeIndices &... prefixTreeIndices)
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,30 +4,48 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * gridfunctions │ │ │ │ │ -Classes | Namespaces │ │ │ │ │ -localderivativetraits.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ + * functionspacebases │ │ │ │ │ +Classes | Namespaces | Functions │ │ │ │ │ +subspacebasis.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -struct  Dune::Functions::LocalDerivativeTraits<_EntitySet,_DerivativeTraits_> │ │ │ │ │ -  Derivative traits for local functions. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::LocalDerivativeTraits<_EntitySet,_DerivativeTraits │ │ │ │ │ - >::Traits<_Signature_> │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::LocalDerivativeTraits<_EntitySet,_DerivativeTraits │ │ │ │ │ - >::Traits<_R(LocalDomain)> │ │ │ │ │ +class  Dune::Functions::SubspaceBasis<_RB,_TP_> │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +  Dune::Functions::SubspaceBasis (const RB &, const TP) -> SubspaceBasis< │ │ │ │ │ + RB, TP > │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +  Dune::Functions::SubspaceBasis (const SubspaceBasis< RootRootBasis, │ │ │ │ │ + InnerTP > &rootBasis, const OuterTP &prefixPath) -> SubspaceBasis< std:: │ │ │ │ │ + decay_t< decltype(rootBasis.rootBasis())>, Impl::JoinTreePath_t< InnerTP, │ │ │ │ │ + OuterTP > > │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::subspaceBasis (const RootBasis &rootBasis, const │ │ │ │ │ + TypeTree::HybridTreePath< PrefixTreeIndices... > &prefixPath) │ │ │ │ │ +  Create SubspaceBasis from a root basis and a prefixPath. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::subspaceBasis (const RootBasis &rootBasis, const │ │ │ │ │ + PrefixTreeIndices &... prefixTreeIndices) │ │ │ │ │ +  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00104_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: localderivativetraits.hh Source File │ │ │ │ +dune-functions: subspacebasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,66 +58,188 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
localderivativetraits.hh
│ │ │ │ +
subspacebasis.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#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_LOCALDERIVATIVE_TRAITS_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_LOCALDERIVATIVE_TRAITS_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACEBASIS_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACEBASIS_HH
│ │ │ │
5
│ │ │ │ -
6
│ │ │ │ - │ │ │ │ -
8
│ │ │ │ +
6#include <dune/common/reservedvector.hh>
│ │ │ │ +
7#include <dune/common/typeutilities.hh>
│ │ │ │ +
8#include <dune/common/concept.hh>
│ │ │ │
9
│ │ │ │ -
10namespace Dune {
│ │ │ │ -
11namespace Functions {
│ │ │ │ -
12
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
13
│ │ │ │ -
26template<class EntitySet, template<class> class DerivativeTraits=DefaultDerivativeTraits>
│ │ │ │ - │ │ │ │ -
28{
│ │ │ │ -
29 using LocalDomain = typename EntitySet::LocalCoordinate;
│ │ │ │ -
30 using Domain = typename EntitySet::GlobalCoordinate;
│ │ │ │ +
14
│ │ │ │ +
15
│ │ │ │ +
16namespace Dune {
│ │ │ │ +
17namespace Functions {
│ │ │ │ +
18
│ │ │ │ +
19
│ │ │ │ +
20
│ │ │ │ +
21namespace Impl {
│ │ │ │ +
22
│ │ │ │ +
23 template<class... Inner, class... Outer>
│ │ │ │ +
24 auto joinTreePaths(const TypeTree::HybridTreePath<Inner...>& inner, const TypeTree::HybridTreePath<Outer...> outer)
│ │ │ │ +
25 {
│ │ │ │ +
26 return TypeTree::HybridTreePath<Inner..., Outer...>(std::tuple_cat(inner._data, outer._data));
│ │ │ │ +
27 }
│ │ │ │ +
28
│ │ │ │ +
29 template<class InnerTP, class OuterTP>
│ │ │ │ +
30 using JoinTreePath_t = std::decay_t<decltype(joinTreePaths(std::declval<InnerTP>(), std::declval<OuterTP>()))>;
│ │ │ │
31
│ │ │ │ -
32 template<class Signature>
│ │ │ │ -
33 struct Traits
│ │ │ │ -
34 {
│ │ │ │ - │ │ │ │ -
36 };
│ │ │ │ -
37
│ │ │ │ -
38 template<class R>
│ │ │ │ - │ │ │ │ -
40 {
│ │ │ │ -
41 using Range = typename DerivativeTraits<R(Domain)>::Range;
│ │ │ │ -
42 };
│ │ │ │ -
43};
│ │ │ │ +
32}
│ │ │ │ +
33
│ │ │ │ +
34
│ │ │ │ +
35
│ │ │ │ +
36template<class RB, class TP>
│ │ │ │ + │ │ │ │ +
38{
│ │ │ │ +
39public:
│ │ │ │ +
40
│ │ │ │ +
41 using RootBasis = RB;
│ │ │ │ +
42
│ │ │ │ +
43 using RootLocalView = typename RootBasis::LocalView;
│ │ │ │
44
│ │ │ │ -
45
│ │ │ │ -
46}} // namespace Dune::Functions
│ │ │ │ -
47
│ │ │ │ -
48#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_LOCALDERIVATIVE_TRAITS_HH
│ │ │ │ - │ │ │ │ +
45 using PrefixPath = TP;
│ │ │ │ +
46
│ │ │ │ +
48 using GridView = typename RootBasis::GridView;
│ │ │ │ +
49
│ │ │ │ +
51 using MultiIndex = typename RootBasis::MultiIndex;
│ │ │ │ +
52
│ │ │ │ +
53 using size_type = std::size_t;
│ │ │ │ +
54
│ │ │ │ + │ │ │ │ +
57
│ │ │ │ +
58 using SizePrefix = typename RootBasis::SizePrefix;
│ │ │ │ +
59
│ │ │ │ +
60
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
65 {}
│ │ │ │ +
66
│ │ │ │ +
72 template<class RootRootBasis, class InnerTP, class OuterTP>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
75 {}
│ │ │ │ +
76
│ │ │ │ +
77
│ │ │ │ +
80 const GridView& gridView() const
│ │ │ │ +
81 {
│ │ │ │ +
82 return rootBasis_->gridView();
│ │ │ │ +
83 }
│ │ │ │ +
84
│ │ │ │ + │ │ │ │ +
89 {
│ │ │ │ +
90 return rootBasis_->dimension();
│ │ │ │ +
91 }
│ │ │ │ +
92
│ │ │ │ + │ │ │ │ +
95 {
│ │ │ │ +
96 return rootBasis_->size();
│ │ │ │ +
97 }
│ │ │ │ +
98
│ │ │ │ +
100 size_type size(const SizePrefix& prefix) const
│ │ │ │ +
101 {
│ │ │ │ +
102 return rootBasis_->size(prefix);
│ │ │ │ +
103 }
│ │ │ │ +
104
│ │ │ │ + │ │ │ │ +
109 {
│ │ │ │ +
110 return LocalView(*this, prefixPath_);
│ │ │ │ +
111 }
│ │ │ │ +
112
│ │ │ │ +
113 const RootBasis& rootBasis() const
│ │ │ │ +
114 {
│ │ │ │ +
115 return *rootBasis_;
│ │ │ │ +
116 }
│ │ │ │ +
117
│ │ │ │ +
118 const PrefixPath& prefixPath() const
│ │ │ │ +
119 {
│ │ │ │ +
120 return prefixPath_;
│ │ │ │ +
121 }
│ │ │ │ +
122
│ │ │ │ +
123protected:
│ │ │ │ + │ │ │ │ + │ │ │ │ +
126};
│ │ │ │ +
127
│ │ │ │ +
128
│ │ │ │ +
129// CTAD guide for a non-SubspaceBasis root basis
│ │ │ │ +
130template<class RB, class TP>
│ │ │ │ +
131SubspaceBasis(const RB&, const TP) -> SubspaceBasis<RB, TP>;
│ │ │ │ +
132
│ │ │ │ +
133// CTAD guide for a SubspaceBasis root basis
│ │ │ │ +
134template<class RootRootBasis, class InnerTP, class OuterTP>
│ │ │ │ +
135SubspaceBasis(const SubspaceBasis<RootRootBasis, InnerTP>& rootBasis, const OuterTP& prefixPath)
│ │ │ │ +
136 -> SubspaceBasis<std::decay_t<decltype(rootBasis.rootBasis())>, Impl::JoinTreePath_t<InnerTP, OuterTP>>;
│ │ │ │ +
137
│ │ │ │ +
138
│ │ │ │ +
139
│ │ │ │ +
150template<class RootBasis, class... PrefixTreeIndices>
│ │ │ │ +
151auto subspaceBasis(const RootBasis& rootBasis, const TypeTree::HybridTreePath<PrefixTreeIndices...>& prefixPath)
│ │ │ │ +
152{
│ │ │ │ +
153 return SubspaceBasis(rootBasis, prefixPath);
│ │ │ │ +
154}
│ │ │ │ +
155
│ │ │ │ +
156template<class RootBasis, class... PrefixTreeIndices>
│ │ │ │ +
157auto subspaceBasis(const RootBasis& rootBasis, const PrefixTreeIndices&... prefixTreeIndices)
│ │ │ │ +
158{
│ │ │ │ +
159 return subspaceBasis(rootBasis, TypeTree::hybridTreePath(prefixTreeIndices...));
│ │ │ │ +
160}
│ │ │ │ +
161
│ │ │ │ +
162
│ │ │ │ +
163
│ │ │ │ +
164} // end namespace Functions
│ │ │ │ +
165} // end namespace Dune
│ │ │ │ +
166
│ │ │ │ +
167
│ │ │ │ +
168
│ │ │ │ +
169#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
Dummy range class to be used if no proper type is available.
Definition: defaultderivativetraits.hh:23
│ │ │ │ -
Derivative traits for local functions.
Definition: localderivativetraits.hh:28
│ │ │ │ -
typename EntitySet::GlobalCoordinate Domain
Definition: localderivativetraits.hh:30
│ │ │ │ -
typename EntitySet::LocalCoordinate LocalDomain
Definition: localderivativetraits.hh:29
│ │ │ │ -
Definition: localderivativetraits.hh:34
│ │ │ │ -
InvalidRange Range
Definition: localderivativetraits.hh:35
│ │ │ │ -
typename DerivativeTraits< R(Domain)>::Range Range
Definition: localderivativetraits.hh:41
│ │ │ │ +
SubspaceBasis(const RB &, const TP) -> SubspaceBasis< RB, TP >
│ │ │ │ +
auto subspaceBasis(const RootBasis &rootBasis, const TypeTree::HybridTreePath< PrefixTreeIndices... > &prefixPath)
Create SubspaceBasis from a root basis and a prefixPath.
Definition: subspacebasis.hh:151
│ │ │ │ +
Definition: subspacebasis.hh:38
│ │ │ │ +
typename RootBasis::LocalView RootLocalView
Definition: subspacebasis.hh:43
│ │ │ │ +
LocalView localView() const
Return local view for basis.
Definition: subspacebasis.hh:108
│ │ │ │ +
const RootBasis * rootBasis_
Definition: subspacebasis.hh:124
│ │ │ │ +
typename RootBasis::SizePrefix SizePrefix
Definition: subspacebasis.hh:58
│ │ │ │ +
TP PrefixPath
Definition: subspacebasis.hh:45
│ │ │ │ +
SubspaceLocalView< RootLocalView, PrefixPath > LocalView
Type of the local view on the restriction of the basis to a single element.
Definition: subspacebasis.hh:56
│ │ │ │ +
size_type size(const SizePrefix &prefix) const
Return number possible values for next position in multi index.
Definition: subspacebasis.hh:100
│ │ │ │ +
typename RootBasis::GridView GridView
The grid view that the FE space is defined on.
Definition: subspacebasis.hh:48
│ │ │ │ +
const PrefixPath & prefixPath() const
Definition: subspacebasis.hh:118
│ │ │ │ +
SubspaceBasis(const SubspaceBasis< RootRootBasis, InnerTP > &rootBasis, const OuterTP &prefixPath)
Constructor from another SubspaceBasis.
Definition: subspacebasis.hh:73
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: subspacebasis.hh:80
│ │ │ │ +
RB RootBasis
Definition: subspacebasis.hh:41
│ │ │ │ +
PrefixPath prefixPath_
Definition: subspacebasis.hh:125
│ │ │ │ +
size_type size() const
Return number of possible values for next position in empty multi index.
Definition: subspacebasis.hh:94
│ │ │ │ +
const RootBasis & rootBasis() const
Definition: subspacebasis.hh:113
│ │ │ │ +
typename RootBasis::MultiIndex MultiIndex
Type used for global numbering of the basis vectors.
Definition: subspacebasis.hh:51
│ │ │ │ +
size_type dimension() const
Definition: subspacebasis.hh:88
│ │ │ │ +
std::size_t size_type
Definition: subspacebasis.hh:53
│ │ │ │ +
SubspaceBasis(const RootBasis &rootBasis, const PrefixPath &prefixPath)
Constructor for a given grid view object.
Definition: subspacebasis.hh:62
│ │ │ │ +
The restriction of a finite element basis to a single element.
Definition: subspacelocalview.hh:30
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,73 +4,247 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * gridfunctions │ │ │ │ │ -localderivativetraits.hh │ │ │ │ │ + * functionspacebases │ │ │ │ │ +subspacebasis.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#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_LOCALDERIVATIVE_TRAITS_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_LOCALDERIVATIVE_TRAITS_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACEBASIS_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACEBASIS_HH │ │ │ │ │ 5 │ │ │ │ │ - 6 │ │ │ │ │ - 7#include │ │ │ │ │ - 8 │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8#include │ │ │ │ │ 9 │ │ │ │ │ - 10namespace Dune { │ │ │ │ │ - 11namespace Functions { │ │ │ │ │ - 12 │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ 13 │ │ │ │ │ - 26template class │ │ │ │ │ -DerivativeTraits=DefaultDerivativeTraits> │ │ │ │ │ -27struct LocalDerivativeTraits │ │ │ │ │ - 28{ │ │ │ │ │ -29 using LocalDomain = typename EntitySet::LocalCoordinate; │ │ │ │ │ -30 using Domain = typename EntitySet::GlobalCoordinate; │ │ │ │ │ + 14 │ │ │ │ │ + 15 │ │ │ │ │ + 16namespace Dune { │ │ │ │ │ + 17namespace Functions { │ │ │ │ │ + 18 │ │ │ │ │ + 19 │ │ │ │ │ + 20 │ │ │ │ │ + 21namespace Impl { │ │ │ │ │ + 22 │ │ │ │ │ + 23 template │ │ │ │ │ + 24 auto joinTreePaths(const TypeTree::HybridTreePath& inner, const │ │ │ │ │ +TypeTree::HybridTreePath outer) │ │ │ │ │ + 25 { │ │ │ │ │ + 26 return TypeTree::HybridTreePath(std::tuple_cat │ │ │ │ │ +(inner._data, outer._data)); │ │ │ │ │ + 27 } │ │ │ │ │ + 28 │ │ │ │ │ + 29 template │ │ │ │ │ + 30 using JoinTreePath_t = std::decay_t(), std::declval()))>; │ │ │ │ │ 31 │ │ │ │ │ - 32 template │ │ │ │ │ -33 struct Traits │ │ │ │ │ - 34 { │ │ │ │ │ -35 typedef InvalidRange Range; │ │ │ │ │ - 36 }; │ │ │ │ │ - 37 │ │ │ │ │ - 38 template │ │ │ │ │ -39 struct Traits │ │ │ │ │ - 40 { │ │ │ │ │ -41 using Range = typename DerivativeTraits::Range; │ │ │ │ │ - 42 }; │ │ │ │ │ - 43}; │ │ │ │ │ + 32} │ │ │ │ │ + 33 │ │ │ │ │ + 34 │ │ │ │ │ + 35 │ │ │ │ │ + 36template │ │ │ │ │ +37class SubspaceBasis │ │ │ │ │ + 38{ │ │ │ │ │ + 39public: │ │ │ │ │ + 40 │ │ │ │ │ +41 using RootBasis = RB; │ │ │ │ │ + 42 │ │ │ │ │ +43 using RootLocalView = typename RootBasis::LocalView; │ │ │ │ │ 44 │ │ │ │ │ - 45 │ │ │ │ │ - 46}} // namespace Dune::Functions │ │ │ │ │ - 47 │ │ │ │ │ - 48#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_LOCALDERIVATIVE_TRAITS_HH │ │ │ │ │ -defaultderivativetraits.hh │ │ │ │ │ +45 using PrefixPath = TP; │ │ │ │ │ + 46 │ │ │ │ │ +48 using GridView = typename RootBasis::GridView; │ │ │ │ │ + 49 │ │ │ │ │ +51 using MultiIndex = typename RootBasis::MultiIndex; │ │ │ │ │ + 52 │ │ │ │ │ +53 using size_type = std::size_t; │ │ │ │ │ + 54 │ │ │ │ │ +56 using LocalView = SubspaceLocalView; │ │ │ │ │ + 57 │ │ │ │ │ +58 using SizePrefix = typename RootBasis::SizePrefix; │ │ │ │ │ + 59 │ │ │ │ │ + 60 │ │ │ │ │ +62 SubspaceBasis(const RootBasis& rootBasis, const PrefixPath& prefixPath) : │ │ │ │ │ + 63 rootBasis_(&rootBasis), │ │ │ │ │ + 64 prefixPath_(prefixPath) │ │ │ │ │ + 65 {} │ │ │ │ │ + 66 │ │ │ │ │ + 72 template │ │ │ │ │ +73 SubspaceBasis(const SubspaceBasis& rootBasis, const │ │ │ │ │ +OuterTP& prefixPath) : │ │ │ │ │ + 74 SubspaceBasis(rootBasis.rootBasis(), Impl::joinTreePaths │ │ │ │ │ +(rootBasis.prefixPath(), prefixPath)) │ │ │ │ │ + 75 {} │ │ │ │ │ + 76 │ │ │ │ │ + 77 │ │ │ │ │ +80 const GridView& gridView() const │ │ │ │ │ + 81 { │ │ │ │ │ + 82 return rootBasis_->gridView(); │ │ │ │ │ + 83 } │ │ │ │ │ + 84 │ │ │ │ │ +88 size_type dimension() const │ │ │ │ │ + 89 { │ │ │ │ │ + 90 return rootBasis_->dimension(); │ │ │ │ │ + 91 } │ │ │ │ │ + 92 │ │ │ │ │ +94 size_type size() const │ │ │ │ │ + 95 { │ │ │ │ │ + 96 return rootBasis_->size(); │ │ │ │ │ + 97 } │ │ │ │ │ + 98 │ │ │ │ │ +100 size_type size(const SizePrefix& prefix) const │ │ │ │ │ + 101 { │ │ │ │ │ + 102 return rootBasis_->size(prefix); │ │ │ │ │ + 103 } │ │ │ │ │ + 104 │ │ │ │ │ +108 LocalView localView() const │ │ │ │ │ + 109 { │ │ │ │ │ + 110 return LocalView(*this, prefixPath_); │ │ │ │ │ + 111 } │ │ │ │ │ + 112 │ │ │ │ │ +113 const RootBasis& rootBasis() const │ │ │ │ │ + 114 { │ │ │ │ │ + 115 return *rootBasis_; │ │ │ │ │ + 116 } │ │ │ │ │ + 117 │ │ │ │ │ +118 const PrefixPath& prefixPath() const │ │ │ │ │ + 119 { │ │ │ │ │ + 120 return prefixPath_; │ │ │ │ │ + 121 } │ │ │ │ │ + 122 │ │ │ │ │ + 123protected: │ │ │ │ │ +124 const RootBasis* rootBasis_; │ │ │ │ │ +125 PrefixPath prefixPath_; │ │ │ │ │ + 126}; │ │ │ │ │ + 127 │ │ │ │ │ + 128 │ │ │ │ │ + 129// CTAD guide for a non-SubspaceBasis root basis │ │ │ │ │ + 130template │ │ │ │ │ +131SubspaceBasis(const RB&, const TP) -> SubspaceBasis; │ │ │ │ │ + 132 │ │ │ │ │ + 133// CTAD guide for a SubspaceBasis root basis │ │ │ │ │ + 134template │ │ │ │ │ +135SubspaceBasis(const SubspaceBasis& rootBasis, const │ │ │ │ │ +OuterTP& prefixPath) │ │ │ │ │ + 136 -> SubspaceBasis, Impl:: │ │ │ │ │ +JoinTreePath_t>; │ │ │ │ │ + 137 │ │ │ │ │ + 138 │ │ │ │ │ + 139 │ │ │ │ │ + 150template │ │ │ │ │ +151auto subspaceBasis(const RootBasis& rootBasis, const TypeTree:: │ │ │ │ │ +HybridTreePath& prefixPath) │ │ │ │ │ + 152{ │ │ │ │ │ + 153 return SubspaceBasis(rootBasis, prefixPath); │ │ │ │ │ + 154} │ │ │ │ │ + 155 │ │ │ │ │ + 156template │ │ │ │ │ +157auto subspaceBasis(const RootBasis& rootBasis, const PrefixTreeIndices&... │ │ │ │ │ +prefixTreeIndices) │ │ │ │ │ + 158{ │ │ │ │ │ + 159 return subspaceBasis(rootBasis, TypeTree::hybridTreePath │ │ │ │ │ +(prefixTreeIndices...)); │ │ │ │ │ + 160} │ │ │ │ │ + 161 │ │ │ │ │ + 162 │ │ │ │ │ + 163 │ │ │ │ │ + 164} // end namespace Functions │ │ │ │ │ + 165} // end namespace Dune │ │ │ │ │ + 166 │ │ │ │ │ + 167 │ │ │ │ │ + 168 │ │ │ │ │ + 169#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH │ │ │ │ │ +type_traits.hh │ │ │ │ │ +subspacelocalview.hh │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::InvalidRange │ │ │ │ │ -Dummy range class to be used if no proper type is available. │ │ │ │ │ -Definition: defaultderivativetraits.hh:23 │ │ │ │ │ -Dune::Functions::LocalDerivativeTraits │ │ │ │ │ -Derivative traits for local functions. │ │ │ │ │ -Definition: localderivativetraits.hh:28 │ │ │ │ │ -Dune::Functions::LocalDerivativeTraits::Domain │ │ │ │ │ -typename EntitySet::GlobalCoordinate Domain │ │ │ │ │ -Definition: localderivativetraits.hh:30 │ │ │ │ │ -Dune::Functions::LocalDerivativeTraits::LocalDomain │ │ │ │ │ -typename EntitySet::LocalCoordinate LocalDomain │ │ │ │ │ -Definition: localderivativetraits.hh:29 │ │ │ │ │ -Dune::Functions::LocalDerivativeTraits::Traits │ │ │ │ │ -Definition: localderivativetraits.hh:34 │ │ │ │ │ -Dune::Functions::LocalDerivativeTraits::Traits::Range │ │ │ │ │ -InvalidRange Range │ │ │ │ │ -Definition: localderivativetraits.hh:35 │ │ │ │ │ -Dune::Functions::LocalDerivativeTraits::Traits<_R(LocalDomain)>::Range │ │ │ │ │ -typename DerivativeTraits< R(Domain)>::Range Range │ │ │ │ │ -Definition: localderivativetraits.hh:41 │ │ │ │ │ +Dune::Functions::SubspaceBasis │ │ │ │ │ +SubspaceBasis(const RB &, const TP) -> SubspaceBasis< RB, TP > │ │ │ │ │ +Dune::Functions::subspaceBasis │ │ │ │ │ +auto subspaceBasis(const RootBasis &rootBasis, const TypeTree::HybridTreePath< │ │ │ │ │ +PrefixTreeIndices... > &prefixPath) │ │ │ │ │ +Create SubspaceBasis from a root basis and a prefixPath. │ │ │ │ │ +Definition: subspacebasis.hh:151 │ │ │ │ │ +Dune::Functions::SubspaceBasis │ │ │ │ │ +Definition: subspacebasis.hh:38 │ │ │ │ │ +Dune::Functions::SubspaceBasis::RootLocalView │ │ │ │ │ +typename RootBasis::LocalView RootLocalView │ │ │ │ │ +Definition: subspacebasis.hh:43 │ │ │ │ │ +Dune::Functions::SubspaceBasis::localView │ │ │ │ │ +LocalView localView() const │ │ │ │ │ +Return local view for basis. │ │ │ │ │ +Definition: subspacebasis.hh:108 │ │ │ │ │ +Dune::Functions::SubspaceBasis::rootBasis_ │ │ │ │ │ +const RootBasis * rootBasis_ │ │ │ │ │ +Definition: subspacebasis.hh:124 │ │ │ │ │ +Dune::Functions::SubspaceBasis::SizePrefix │ │ │ │ │ +typename RootBasis::SizePrefix SizePrefix │ │ │ │ │ +Definition: subspacebasis.hh:58 │ │ │ │ │ +Dune::Functions::SubspaceBasis::PrefixPath │ │ │ │ │ +TP PrefixPath │ │ │ │ │ +Definition: subspacebasis.hh:45 │ │ │ │ │ +Dune::Functions::SubspaceBasis::LocalView │ │ │ │ │ +SubspaceLocalView< RootLocalView, PrefixPath > LocalView │ │ │ │ │ +Type of the local view on the restriction of the basis to a single element. │ │ │ │ │ +Definition: subspacebasis.hh:56 │ │ │ │ │ +Dune::Functions::SubspaceBasis::size │ │ │ │ │ +size_type size(const SizePrefix &prefix) const │ │ │ │ │ +Return number possible values for next position in multi index. │ │ │ │ │ +Definition: subspacebasis.hh:100 │ │ │ │ │ +Dune::Functions::SubspaceBasis::GridView │ │ │ │ │ +typename RootBasis::GridView GridView │ │ │ │ │ +The grid view that the FE space is defined on. │ │ │ │ │ +Definition: subspacebasis.hh:48 │ │ │ │ │ +Dune::Functions::SubspaceBasis::prefixPath │ │ │ │ │ +const PrefixPath & prefixPath() const │ │ │ │ │ +Definition: subspacebasis.hh:118 │ │ │ │ │ +Dune::Functions::SubspaceBasis::SubspaceBasis │ │ │ │ │ +SubspaceBasis(const SubspaceBasis< RootRootBasis, InnerTP > &rootBasis, const │ │ │ │ │ +OuterTP &prefixPath) │ │ │ │ │ +Constructor from another SubspaceBasis. │ │ │ │ │ +Definition: subspacebasis.hh:73 │ │ │ │ │ +Dune::Functions::SubspaceBasis::gridView │ │ │ │ │ +const GridView & gridView() const │ │ │ │ │ +Obtain the grid view that the basis is defined on. │ │ │ │ │ +Definition: subspacebasis.hh:80 │ │ │ │ │ +Dune::Functions::SubspaceBasis::RootBasis │ │ │ │ │ +RB RootBasis │ │ │ │ │ +Definition: subspacebasis.hh:41 │ │ │ │ │ +Dune::Functions::SubspaceBasis::prefixPath_ │ │ │ │ │ +PrefixPath prefixPath_ │ │ │ │ │ +Definition: subspacebasis.hh:125 │ │ │ │ │ +Dune::Functions::SubspaceBasis::size │ │ │ │ │ +size_type size() const │ │ │ │ │ +Return number of possible values for next position in empty multi index. │ │ │ │ │ +Definition: subspacebasis.hh:94 │ │ │ │ │ +Dune::Functions::SubspaceBasis::rootBasis │ │ │ │ │ +const RootBasis & rootBasis() const │ │ │ │ │ +Definition: subspacebasis.hh:113 │ │ │ │ │ +Dune::Functions::SubspaceBasis::MultiIndex │ │ │ │ │ +typename RootBasis::MultiIndex MultiIndex │ │ │ │ │ +Type used for global numbering of the basis vectors. │ │ │ │ │ +Definition: subspacebasis.hh:51 │ │ │ │ │ +Dune::Functions::SubspaceBasis::dimension │ │ │ │ │ +size_type dimension() const │ │ │ │ │ +Definition: subspacebasis.hh:88 │ │ │ │ │ +Dune::Functions::SubspaceBasis::size_type │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +Definition: subspacebasis.hh:53 │ │ │ │ │ +Dune::Functions::SubspaceBasis::SubspaceBasis │ │ │ │ │ +SubspaceBasis(const RootBasis &rootBasis, const PrefixPath &prefixPath) │ │ │ │ │ +Constructor for a given grid view object. │ │ │ │ │ +Definition: subspacebasis.hh:62 │ │ │ │ │ +Dune::Functions::SubspaceLocalView │ │ │ │ │ +The restriction of a finite element basis to a single element. │ │ │ │ │ +Definition: subspacelocalview.hh:30 │ │ │ │ │ +concepts.hh │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00107.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: compositebasis.hh File Reference │ │ │ │ +dune-functions: periodicbasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -66,58 +66,50 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
compositebasis.hh File Reference
│ │ │ │ +
periodicbasis.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <tuple>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <dune/common/std/apply.hh>
│ │ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ │ -#include <dune/common/reservedvector.hh>
│ │ │ │ -#include <dune/common/typeutilities.hh>
│ │ │ │ -#include <dune/common/tupleutility.hh>
│ │ │ │ -#include <dune/common/tuplevector.hh>
│ │ │ │ -#include <dune/functions/common/staticforloop.hh>
│ │ │ │ -#include <dune/functions/common/type_traits.hh>
│ │ │ │ -#include <dune/functions/common/utility.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/basistags.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ +
#include <utility>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <limits>
│ │ │ │ +#include <set>
│ │ │ │ +#include <vector>
│ │ │ │ #include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/transformedindexbasis.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::CompositePreBasis< IMS, SPB >
 A pre-basis for composite bases. More...
class  Dune::Functions::BasisFactory::Experimental::PeriodicIndexSet
 Container storing identified indices for a periodic basis. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
namespace  Dune::Functions::BasisFactory
 
namespace  Dune::Functions::BasisBuilder
namespace  Dune::Functions::BasisFactory::Experimental
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<typename... Args, std::enable_if_t< Concept::isIndexMergingStrategy< typename LastType< Args... >::type >(), int > = 0>
auto Dune::Functions::BasisFactory::composite (Args &&... args)
 Create a factory builder that can build a CompositePreBasis. More...
 
template<class RawPreBasisIndicator , class PIS >
auto Dune::Functions::BasisFactory::Experimental::periodic (RawPreBasisIndicator &&rawPreBasisIndicator, PIS &&periodicIndexSet)
 Create a pre-basis factory that can create a periodic pre-basis. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -6,46 +6,38 @@ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ Classes | Namespaces | Functions │ │ │ │ │ -compositebasis.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +periodicbasis.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::CompositePreBasis<_IMS,_SPB_> │ │ │ │ │ -  A pre-basis for composite bases. More... │ │ │ │ │ +class  Dune::Functions::BasisFactory::Experimental::PeriodicIndexSet │ │ │ │ │ +  Container storing identified indices for a periodic basis. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions::BasisFactory │ │ │ │ │   │ │ │ │ │ -namespace  Dune::Functions::BasisBuilder │ │ │ │ │ +namespace  Dune::Functions::BasisFactory::Experimental │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ -template::type >(), int > = 0> │ │ │ │ │ -auto Dune::Functions::BasisFactory::composite (Args &&... args) │ │ │ │ │ -  Create a factory builder that can build a CompositePreBasis. More... │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::BasisFactory::Experimental::periodic │ │ │ │ │ + (RawPreBasisIndicator &&rawPreBasisIndicator, PIS &&periodicIndexSet) │ │ │ │ │ +  Create a pre-basis factory that can create a periodic pre-basis. More... │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00107_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: compositebasis.hh Source File │ │ │ │ +dune-functions: periodicbasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,422 +62,203 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
compositebasis.hh
│ │ │ │ +
periodicbasis.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_COMPOSITEBASIS_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_COMPOSITEBASIS_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_PERIODICBASIS_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_PERIODICBASIS_HH
│ │ │ │
5
│ │ │ │ -
6#include <tuple>
│ │ │ │ -
7#include <utility>
│ │ │ │ -
8
│ │ │ │ -
9#include <dune/common/std/apply.hh>
│ │ │ │ -
10#include <dune/common/hybridutilities.hh>
│ │ │ │ -
11#include <dune/common/reservedvector.hh>
│ │ │ │ -
12#include <dune/common/typeutilities.hh>
│ │ │ │ -
13#include <dune/common/hybridutilities.hh>
│ │ │ │ -
14#include <dune/common/tupleutility.hh>
│ │ │ │ -
15#include <dune/common/tuplevector.hh>
│ │ │ │ -
16
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
24
│ │ │ │ +
6#include <utility>
│ │ │ │ +
7#include <type_traits>
│ │ │ │ +
8#include <limits>
│ │ │ │ +
9#include <set>
│ │ │ │ +
10#include <vector>
│ │ │ │ +
11
│ │ │ │ + │ │ │ │ + │ │ │ │ +
14
│ │ │ │ +
15
│ │ │ │ +
16namespace Dune::Functions {
│ │ │ │ +
17
│ │ │ │ +
18namespace BasisFactory {
│ │ │ │ +
19
│ │ │ │ +
20// The PeriodicBasis class is in the Experimental namespace because we are
│ │ │ │ +
21// not completely sure yet whether we like it. We reserve the right to
│ │ │ │ +
22// modify it without advance warning. Use at your own risk!
│ │ │ │ +
23
│ │ │ │ +
24namespace Experimental {
│ │ │ │
25
│ │ │ │ -
26namespace Dune {
│ │ │ │ -
27namespace Functions {
│ │ │ │ -
28
│ │ │ │ -
29// *****************************************************************************
│ │ │ │ -
30// This is the reusable part of the composite bases. It contains
│ │ │ │ -
31//
│ │ │ │ -
32// CompositePreBasis
│ │ │ │ -
33//
│ │ │ │ -
34// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ -
35// state. These components do _not_ depend on the global basis and local view
│ │ │ │ -
36// and can be used without a global basis.
│ │ │ │ -
37// *****************************************************************************
│ │ │ │ -
38
│ │ │ │ +
26
│ │ │ │ + │ │ │ │ +
36{
│ │ │ │ +
37 using IndexPairSet = std::set<std::pair<std::size_t,std::size_t>>;
│ │ │ │ +
38public:
│ │ │ │
39
│ │ │ │ -
51template<class IMS, class... SPB>
│ │ │ │ - │ │ │ │ -
53{
│ │ │ │ -
54 static const bool isBlocked = std::is_same_v<IMS,BasisFactory::BlockedLexicographic> or std::is_same_v<IMS,BasisFactory::BlockedInterleaved>;
│ │ │ │ -
55public:
│ │ │ │ -
56
│ │ │ │ -
58 using SubPreBases = std::tuple<SPB...>;
│ │ │ │ -
59
│ │ │ │ -
61 template<std::size_t i>
│ │ │ │ -
62 using SubPreBasis = std::tuple_element_t<i, SubPreBases>;
│ │ │ │ -
63
│ │ │ │ -
65 using GridView = typename std::tuple_element_t<0, SubPreBases>::GridView;
│ │ │ │ +
47 void unifyIndexPair(std::size_t a, std::size_t b)
│ │ │ │ +
48 {
│ │ │ │ +
49 if (a>b)
│ │ │ │ +
50 std::swap(a,b);
│ │ │ │ +
51 if (a==b)
│ │ │ │ +
52 return;
│ │ │ │ +
53 indexPairSet_.insert(std::make_pair(a,b));
│ │ │ │ +
54 }
│ │ │ │ +
55
│ │ │ │ +
56 const auto& indexPairSet() const
│ │ │ │ +
57 {
│ │ │ │ +
58 return indexPairSet_;
│ │ │ │ +
59 }
│ │ │ │ +
60
│ │ │ │ +
61private:
│ │ │ │ +
62 IndexPairSet indexPairSet_;
│ │ │ │ +
63};
│ │ │ │ +
64
│ │ │ │ +
65
│ │ │ │
66
│ │ │ │ -
68 using size_type = std::size_t;
│ │ │ │ -
69
│ │ │ │ - │ │ │ │ -
72
│ │ │ │ -
73protected:
│ │ │ │ -
74 static const std::size_t children = sizeof...(SPB);
│ │ │ │ +
67namespace Impl {
│ │ │ │ +
68
│ │ │ │ +
69// An index transformation for a TransformedIndexPreBasis
│ │ │ │ +
70// implementing periodic functions by merging indices.
│ │ │ │ +
71// Currently only flat indices are supported.
│ │ │ │ +
72class PeriodicIndexingTransformation
│ │ │ │ +
73{
│ │ │ │ +
74public:
│ │ │ │
75
│ │ │ │ -
76 using ChildIndices = std::make_index_sequence<children>;
│ │ │ │ -
77
│ │ │ │ -
78public:
│ │ │ │ -
79
│ │ │ │ -
81 using Node = CompositeBasisNode<typename SPB::Node...>;
│ │ │ │ -
82
│ │ │ │ -
83 static constexpr size_type maxMultiIndexSize = std::max({SPB::maxMultiIndexSize...}) + isBlocked;
│ │ │ │ -
84 static constexpr size_type minMultiIndexSize = std::min({SPB::minMultiIndexSize...}) + isBlocked;
│ │ │ │ -
85 static constexpr size_type multiIndexBufferSize = std::max({SPB::multiIndexBufferSize...}) + isBlocked;
│ │ │ │ -
86
│ │ │ │ -
92 template<class... SFArgs,
│ │ │ │ -
93 disableCopyMove<CompositePreBasis, SFArgs...> = 0,
│ │ │ │ -
94 enableIfConstructible<std::tuple<SPB...>, SFArgs...> = 0>
│ │ │ │ -
95 CompositePreBasis(SFArgs&&... sfArgs) :
│ │ │ │ -
96 subPreBases_(std::forward<SFArgs>(sfArgs)...)
│ │ │ │ -
97 {
│ │ │ │ -
98 Hybrid::forEach(subPreBases_, [&](const auto& subPreBasis){
│ │ │ │ -
99 static_assert(models<Concept::PreBasis<GridView>, std::decay_t<decltype(subPreBasis)>>(), "Subprebases passed to CompositePreBasis does not model the PreBasis concept.");
│ │ │ │ -
100 });
│ │ │ │ -
101 }
│ │ │ │ -
102
│ │ │ │ -
109 template<class GV,
│ │ │ │ -
110 std::enable_if_t<std::conjunction_v<
│ │ │ │ -
111 std::bool_constant<(children > 1)>, // Avoid ambiguous constructor if there's only one child
│ │ │ │ -
112 std::is_same<GV, GridView>,
│ │ │ │ -
113 std::is_constructible<SPB, GridView>...
│ │ │ │ -
114 >, int> = 0>
│ │ │ │ -
115 CompositePreBasis(const GV& gv) :
│ │ │ │ -
116 subPreBases_(SPB(gv)...)
│ │ │ │ -
117 {
│ │ │ │ -
118 Hybrid::forEach(subPreBases_, [&](const auto& subPreBasis){
│ │ │ │ -
119 static_assert(models<Concept::PreBasis<GridView>, std::decay_t<decltype(subPreBasis)>>(), "Subprebases passed to CompositePreBasis does not model the PreBasis concept.");
│ │ │ │ -
120 });
│ │ │ │ -
121 }
│ │ │ │ -
122
│ │ │ │ - │ │ │ │ -
125 {
│ │ │ │ -
126 Hybrid::forEach(ChildIndices(), [&](auto i) {
│ │ │ │ -
127 this->subPreBasis(i).initializeIndices();
│ │ │ │ -
128 });
│ │ │ │ -
129 }
│ │ │ │ -
130
│ │ │ │ -
132 const GridView& gridView() const
│ │ │ │ -
133 {
│ │ │ │ -
134 return std::get<0>(subPreBases_).gridView();
│ │ │ │ -
135 }
│ │ │ │ -
136
│ │ │ │ -
138 void update(const GridView& gv)
│ │ │ │ -
139 {
│ │ │ │ -
140 Hybrid::forEach(ChildIndices(), [&](auto i) {
│ │ │ │ -
141 this->subPreBasis(i).update(gv);
│ │ │ │ -
142 });
│ │ │ │ -
143 }
│ │ │ │ -
144
│ │ │ │ - │ │ │ │ -
149 {
│ │ │ │ -
150 auto node = Node{};
│ │ │ │ -
151 Hybrid::forEach(ChildIndices(), [&](auto i) {
│ │ │ │ -
152 node.setChild(this->subPreBasis(i).makeNode(), i);
│ │ │ │ -
153 });
│ │ │ │ -
154 return node;
│ │ │ │ +
76 static constexpr std::size_t minIndexSize = 1;
│ │ │ │ +
77 static constexpr std::size_t maxIndexSize = 1;
│ │ │ │ +
78
│ │ │ │ +
79 template<class RawPreBasis, class IndexPairSet>
│ │ │ │ +
80 PeriodicIndexingTransformation(const RawPreBasis& rawPreBasis, const IndexPairSet& indexPairSet)
│ │ │ │ +
81 {
│ │ │ │ +
82 static_assert(RawPreBasis::maxMultiIndexSize==1, "PeriodicIndexingTransformation is only implemented for flat multi-indices");
│ │ │ │ +
83 std::size_t invalid = {std::numeric_limits<std::size_t>::max()};
│ │ │ │ +
84 mappedIdx_.resize(rawPreBasis.size(), invalid);
│ │ │ │ +
85 numIndices_ = 0;
│ │ │ │ +
86 std::size_t i = 0;
│ │ │ │ +
87 for(const auto& [a, b] : indexPairSet)
│ │ │ │ +
88 {
│ │ │ │ +
89 for(; i<=a; ++i)
│ │ │ │ +
90 if (mappedIdx_[i] == invalid)
│ │ │ │ +
91 mappedIdx_[i] = numIndices_++;
│ │ │ │ +
92 mappedIdx_[b] = mappedIdx_[a];
│ │ │ │ +
93 }
│ │ │ │ +
94 for(; i<rawPreBasis.size(); ++i)
│ │ │ │ +
95 if (mappedIdx_[i] == invalid)
│ │ │ │ +
96 mappedIdx_[i] = numIndices_++;
│ │ │ │ +
97 }
│ │ │ │ +
98
│ │ │ │ +
99 template<class MultiIndex, class PreBasis>
│ │ │ │ +
100 void transformIndex(MultiIndex& multiIndex, const PreBasis& preBasis) const
│ │ │ │ +
101 {
│ │ │ │ +
102 multiIndex = {{ mappedIdx_[multiIndex[0]] }};
│ │ │ │ +
103 }
│ │ │ │ +
104
│ │ │ │ +
105 template<class Prefix, class PreBasis>
│ │ │ │ +
106 std::size_t size(const Prefix& prefix, const PreBasis& preBasis) const
│ │ │ │ +
107 {
│ │ │ │ +
108 if (prefix.size() == 1)
│ │ │ │ +
109 return 0;
│ │ │ │ +
110 return numIndices_;
│ │ │ │ +
111 }
│ │ │ │ +
112
│ │ │ │ +
113 template<class PreBasis>
│ │ │ │ +
114 auto dimension(const PreBasis& preBasis) const
│ │ │ │ +
115 {
│ │ │ │ +
116 return numIndices_;
│ │ │ │ +
117 }
│ │ │ │ +
118
│ │ │ │ +
119private:
│ │ │ │ +
120 std::vector<std::size_t> mappedIdx_;
│ │ │ │ +
121 std::size_t numIndices_;
│ │ │ │ +
122};
│ │ │ │ +
123
│ │ │ │ +
124
│ │ │ │ +
125
│ │ │ │ +
126template<class RawPreBasisIndicator>
│ │ │ │ +
127class PeriodicPreBasisFactory
│ │ │ │ +
128{
│ │ │ │ +
129public:
│ │ │ │ +
130 PeriodicPreBasisFactory()
│ │ │ │ +
131 {}
│ │ │ │ +
132
│ │ │ │ +
133 template<class RPBI, class PIS>
│ │ │ │ +
134 PeriodicPreBasisFactory(RPBI&& rawPreBasisIndicator, PIS&& periodicIndexSet) :
│ │ │ │ +
135 rawPreBasisIndicator_(std::forward<RPBI>(rawPreBasisIndicator)),
│ │ │ │ +
136 periodicIndexSet_(std::forward<PIS>(periodicIndexSet))
│ │ │ │ +
137 {}
│ │ │ │ +
138
│ │ │ │ +
139 template<class GridView,
│ │ │ │ +
140 std::enable_if_t<models<Concept::GlobalBasis<GridView>,RawPreBasisIndicator>(), int> = 0>
│ │ │ │ +
141 auto operator()(const GridView& gridView) const
│ │ │ │ +
142 {
│ │ │ │ +
143 const auto& rawPreBasis = rawPreBasisIndicator_.preBasis();
│ │ │ │ +
144 auto transformation = PeriodicIndexingTransformation(rawPreBasis, periodicIndexSet_.indexPairSet());
│ │ │ │ +
145 return Dune::Functions::Experimental::TransformedIndexPreBasis(std::move(rawPreBasis), std::move(transformation));
│ │ │ │ +
146 }
│ │ │ │ +
147
│ │ │ │ +
148 template<class GridView,
│ │ │ │ +
149 std::enable_if_t<models<Concept::PreBasis<GridView>,RawPreBasisIndicator>(), int> = 0>
│ │ │ │ +
150 auto operator()(const GridView& gridView) const
│ │ │ │ +
151 {
│ │ │ │ +
152 const auto& rawPreBasis = rawPreBasisIndicator_;
│ │ │ │ +
153 auto transformation = PeriodicIndexingTransformation(rawPreBasis, periodicIndexSet_.indexPairSet());
│ │ │ │ +
154 return Dune::Functions::Experimental::TransformedIndexPreBasis(std::move(rawPreBasis), std::move(transformation));
│ │ │ │
155 }
│ │ │ │
156
│ │ │ │ - │ │ │ │ -
159 {
│ │ │ │ -
160 return size(Dune::ReservedVector<size_type, multiIndexBufferSize>{});
│ │ │ │ -
161 }
│ │ │ │ -
162
│ │ │ │ -
164 template<class SizePrefix>
│ │ │ │ -
165 size_type size(const SizePrefix& prefix) const
│ │ │ │ -
166 {
│ │ │ │ -
167 return size(prefix, IndexMergingStrategy{});
│ │ │ │ -
168 }
│ │ │ │ -
169
│ │ │ │ -
170private:
│ │ │ │ -
171
│ │ │ │ -
172 template<class SizePrefix>
│ │ │ │ -
173 size_type size(const SizePrefix& prefix, BasisFactory::BlockedLexicographic) const
│ │ │ │ -
174 {
│ │ │ │ -
175 if (prefix.size() == 0)
│ │ │ │ -
176 return children;
│ │ │ │ -
177
│ │ │ │ -
178 return Hybrid::switchCases(ChildIndices(), prefix[0], [&] (auto i) {
│ │ │ │ -
179 SizePrefix subPrefix;
│ │ │ │ -
180 for(std::size_t i=1; i<prefix.size(); ++i)
│ │ │ │ -
181 subPrefix.push_back(prefix[i]);
│ │ │ │ -
182 return this->subPreBasis(i).size(subPrefix);
│ │ │ │ -
183 }, []() {
│ │ │ │ -
184 return size_type(0);
│ │ │ │ -
185 });
│ │ │ │ -
186 }
│ │ │ │ -
187
│ │ │ │ -
188 template<class SizePrefix>
│ │ │ │ -
189 size_type size(const SizePrefix& prefix, BasisFactory::FlatLexicographic) const
│ │ │ │ -
190 {
│ │ │ │ -
191 size_type result = 0;
│ │ │ │ -
192 if (prefix.size() == 0)
│ │ │ │ -
193 Hybrid::forEach(ChildIndices(), [&](auto i) {
│ │ │ │ -
194 result += this->subPreBasis(i).size();
│ │ │ │ -
195 });
│ │ │ │ -
196 else {
│ │ │ │ -
197 size_type shiftedFirstDigit = prefix[0];
│ │ │ │ -
198 staticFindInRange<0, children>([&](auto i) {
│ │ │ │ -
199 auto firstDigitSize = this->subPreBasis(i).size();
│ │ │ │ -
200 if (shiftedFirstDigit < firstDigitSize)
│ │ │ │ -
201 {
│ │ │ │ -
202 SizePrefix subPrefix;
│ │ │ │ -
203 subPrefix.push_back(shiftedFirstDigit);
│ │ │ │ -
204 for(std::size_t i=1; i<prefix.size(); ++i)
│ │ │ │ -
205 subPrefix.push_back(prefix[i]);
│ │ │ │ -
206 result = this->subPreBasis(i).size(subPrefix);
│ │ │ │ -
207 return true;
│ │ │ │ -
208 }
│ │ │ │ -
209 shiftedFirstDigit -= firstDigitSize;
│ │ │ │ -
210 return false;
│ │ │ │ -
211 });
│ │ │ │ -
212 }
│ │ │ │ -
213 return result;
│ │ │ │ -
214 }
│ │ │ │ -
215
│ │ │ │ -
216public:
│ │ │ │ -
217
│ │ │ │ - │ │ │ │ -
220 {
│ │ │ │ -
221 size_type r=0;
│ │ │ │ -
222 // Accumulate dimension() for all subprebases
│ │ │ │ -
223 Hybrid::forEach(ChildIndices(), [&](auto i) {
│ │ │ │ -
224 r += this->subPreBasis(i).dimension();
│ │ │ │ -
225 });
│ │ │ │ -
226 return r;
│ │ │ │ -
227 }
│ │ │ │ -
228
│ │ │ │ - │ │ │ │ -
231 {
│ │ │ │ -
232 size_type r=0;
│ │ │ │ -
233 // Accumulate maxNodeSize() for all subprebases
│ │ │ │ -
234 Hybrid::forEach(ChildIndices(), [&](auto i) {
│ │ │ │ -
235 r += this->subPreBasis(i).maxNodeSize();
│ │ │ │ -
236 });
│ │ │ │ -
237 return r;
│ │ │ │ -
238 }
│ │ │ │ -
239
│ │ │ │ -
241 template<std::size_t i>
│ │ │ │ -
242 const SubPreBasis<i>& subPreBasis(Dune::index_constant<i> = {}) const
│ │ │ │ -
243 {
│ │ │ │ -
244 return std::get<i>(subPreBases_);
│ │ │ │ -
245 }
│ │ │ │ -
246
│ │ │ │ -
248 template<std::size_t i>
│ │ │ │ -
249 SubPreBasis<i>& subPreBasis(Dune::index_constant<i> = {})
│ │ │ │ -
250 {
│ │ │ │ -
251 return std::get<i>(subPreBases_);
│ │ │ │ -
252 }
│ │ │ │ -
253
│ │ │ │ -
255 template<typename It>
│ │ │ │ -
256 It indices(const Node& node, It it) const
│ │ │ │ -
257 {
│ │ │ │ -
258 return indices(node, it, IndexMergingStrategy{});
│ │ │ │ -
259 }
│ │ │ │ -
260
│ │ │ │ -
261private:
│ │ │ │ -
262
│ │ │ │ -
263 template<typename It>
│ │ │ │ -
264 It indices(const Node& node, It multiIndices, BasisFactory::FlatLexicographic) const
│ │ │ │ -
265 {
│ │ │ │ -
266 size_type firstComponentOffset = 0;
│ │ │ │ -
267 // Loop over all children
│ │ │ │ -
268 Hybrid::forEach(ChildIndices(), [&](auto child){
│ │ │ │ -
269 size_type subTreeSize = node.child(child).size();
│ │ │ │ -
270 // Fill indices for current child into index buffer starting from current
│ │ │ │ -
271 // buffer position and shift first index component of any index for current
│ │ │ │ -
272 // child by suitable offset to get lexicographic indices.
│ │ │ │ -
273 subPreBasis(child).indices(node.child(child), multiIndices);
│ │ │ │ -
274 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
275 multiIndices[i][0] += firstComponentOffset;
│ │ │ │ -
276 // Increment offset by the size for first index component of the current child
│ │ │ │ -
277 firstComponentOffset += subPreBasis(child).size();
│ │ │ │ -
278 // Increment buffer iterator by the number of indices processed for current child
│ │ │ │ -
279 multiIndices += subTreeSize;
│ │ │ │ -
280 });
│ │ │ │ -
281 return multiIndices;
│ │ │ │ -
282 }
│ │ │ │ -
283
│ │ │ │ -
284 template<class MultiIndex>
│ │ │ │ -
285 static void multiIndexPushFront(MultiIndex& M, size_type M0)
│ │ │ │ -
286 {
│ │ │ │ -
287 M.resize(M.size()+1);
│ │ │ │ -
288 for(std::size_t i=M.size()-1; i>0; --i)
│ │ │ │ -
289 M[i] = M[i-1];
│ │ │ │ -
290 M[0] = M0;
│ │ │ │ -
291 }
│ │ │ │ -
292
│ │ │ │ -
293 template<typename It>
│ │ │ │ -
294 It indices(const Node& node, It multiIndices, BasisFactory::BlockedLexicographic) const
│ │ │ │ -
295 {
│ │ │ │ -
296 // Loop over all children
│ │ │ │ -
297 Hybrid::forEach(ChildIndices(), [&](auto child){
│ │ │ │ -
298 size_type subTreeSize = node.child(child).size();
│ │ │ │ -
299 // Fill indices for current child into index buffer starting from current position
│ │ │ │ -
300 subPreBasis(child).indices(node.child(child), multiIndices);
│ │ │ │ -
301 // Insert child index before first component of all indices of current child.
│ │ │ │ -
302 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
303 this->multiIndexPushFront(multiIndices[i], child);
│ │ │ │ -
304 // Increment buffer iterator by the number of indices processed for current child
│ │ │ │ -
305 multiIndices += subTreeSize;
│ │ │ │ -
306 });
│ │ │ │ -
307 return multiIndices;
│ │ │ │ -
308 }
│ │ │ │ -
309
│ │ │ │ -
310 std::tuple<SPB...> subPreBases_;
│ │ │ │ -
311};
│ │ │ │ -
312
│ │ │ │ -
313
│ │ │ │ -
314
│ │ │ │ -
315namespace BasisFactory {
│ │ │ │ -
316
│ │ │ │ -
317namespace Imp {
│ │ │ │ -
318
│ │ │ │ -
319template<class IndexMergingStrategy, class... ChildPreBasisFactory>
│ │ │ │ -
320class CompositePreBasisFactory
│ │ │ │ -
321{
│ │ │ │ -
322
│ │ │ │ -
323 template<class GridView, class... ChildPreBasis>
│ │ │ │ -
324 auto makePreBasisFromChildPreBases(const GridView&, ChildPreBasis&&... childPreBasis) const
│ │ │ │ -
325 {
│ │ │ │ -
326 return CompositePreBasis<IndexMergingStrategy, std::decay_t<ChildPreBasis>...>(std::forward<ChildPreBasis>(childPreBasis)...);
│ │ │ │ -
327 }
│ │ │ │ -
328
│ │ │ │ -
329public:
│ │ │ │ -
330
│ │ │ │ -
331 CompositePreBasisFactory(const ChildPreBasisFactory&... childPreBasisFactory) :
│ │ │ │ -
332 childPreBasisFactories_(childPreBasisFactory...)
│ │ │ │ -
333 {}
│ │ │ │ -
334
│ │ │ │ -
335 CompositePreBasisFactory(ChildPreBasisFactory&&... childPreBasisFactory) :
│ │ │ │ -
336 childPreBasisFactories_(std::move(childPreBasisFactory)...)
│ │ │ │ -
337 {}
│ │ │ │ -
338
│ │ │ │ -
339 template<class GridView>
│ │ │ │ -
340 auto operator()(const GridView& gridView) const
│ │ │ │ -
341 {
│ │ │ │ -
342 // Use std::apply to unpack the tuple childPreBasisFactories_
│ │ │ │ -
343 return std::apply([&](const auto&... childPreBasisFactory) {
│ │ │ │ -
344 return this->makePreBasisFromChildPreBases(gridView, childPreBasisFactory(gridView)...);
│ │ │ │ -
345 }, childPreBasisFactories_);
│ │ │ │ -
346 }
│ │ │ │ -
347
│ │ │ │ -
348private:
│ │ │ │ -
349 std::tuple<ChildPreBasisFactory...> childPreBasisFactories_;
│ │ │ │ -
350};
│ │ │ │ -
351
│ │ │ │ -
352} // end namespace BasisFactory::Imp
│ │ │ │ -
353
│ │ │ │ -
354
│ │ │ │ -
355
│ │ │ │ -
366template<
│ │ │ │ -
367 typename... Args,
│ │ │ │ -
368 std::enable_if_t<Concept::isIndexMergingStrategy<typename LastType<Args...>::type>(),int> = 0>
│ │ │ │ -
369auto composite(Args&&... args)
│ │ │ │ -
370{
│ │ │ │ -
371 // We have to separate the last entry which is the IndexMergingStrategy
│ │ │ │ -
372 // and the preceding ones, which are the ChildPreBasisFactories
│ │ │ │ -
373
│ │ │ │ -
374 using ArgTuple = std::tuple<std::decay_t<Args>...>;
│ │ │ │ -
375
│ │ │ │ -
376 // Compute number of children and index of the IndexMergingStrategy argument
│ │ │ │ -
377 constexpr std::size_t children = Dune::SizeOf<Args...>::value-1;
│ │ │ │ -
378
│ │ │ │ -
379 // Use last type as IndexMergingStrategy
│ │ │ │ -
380 using IndexMergingStrategy = std::tuple_element_t<children, ArgTuple>;
│ │ │ │ -
381
│ │ │ │ -
382 // Index sequence for all but the last entry for partial tuple unpacking
│ │ │ │ -
383 auto childIndices = std::make_index_sequence<children>{};
│ │ │ │ -
384
│ │ │ │ -
385 // Unpack tuple only for those entries related to children
│ │ │ │ -
386 return applyPartial([](auto&&... childPreBasisFactory){
│ │ │ │ -
387 return Imp::CompositePreBasisFactory<IndexMergingStrategy, std::decay_t<decltype(childPreBasisFactory)>...>(std::forward<decltype(childPreBasisFactory)>(childPreBasisFactory)...);
│ │ │ │ -
388 },
│ │ │ │ -
389 std::forward_as_tuple(std::forward<Args>(args)...),
│ │ │ │ -
390 childIndices);
│ │ │ │ -
391}
│ │ │ │ -
392
│ │ │ │ -
404template<
│ │ │ │ -
405 typename... Args,
│ │ │ │ -
406 std::enable_if_t<not Concept::isIndexMergingStrategy<typename LastType<Args...>::type>(),int> = 0>
│ │ │ │ -
407auto composite(Args&&... args)
│ │ │ │ -
408{
│ │ │ │ -
409 return Imp::CompositePreBasisFactory<BasisFactory::BlockedLexicographic, std::decay_t<Args>...>(std::forward<Args>(args)...);
│ │ │ │ -
410}
│ │ │ │ -
411
│ │ │ │ -
412} // end namespace BasisFactory
│ │ │ │ -
413
│ │ │ │ -
414// Backward compatibility
│ │ │ │ -
415namespace BasisBuilder {
│ │ │ │ -
416
│ │ │ │ -
417 using namespace BasisFactory;
│ │ │ │ -
418
│ │ │ │ -
419}
│ │ │ │ -
420
│ │ │ │ -
421
│ │ │ │ -
422
│ │ │ │ -
423} // end namespace Functions
│ │ │ │ -
424} // end namespace Dune
│ │ │ │ -
425
│ │ │ │ -
426
│ │ │ │ -
427#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_COMPOSITEBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
auto composite(Args &&... args)
Create a factory builder that can build a CompositePreBasis.
Definition: compositebasis.hh:369
│ │ │ │ -
typename std::enable_if< std::is_constructible< T, Args... >::value, int >::type enableIfConstructible
Helper to constrain forwarding constructors.
Definition: type_traits.hh:26
│ │ │ │ -
Definition: polynomial.hh:10
│ │ │ │ -
static constexpr bool isIndexMergingStrategy()
Definition: basistags.hh:23
│ │ │ │ -
Get last entry of type list.
Definition: utility.hh:222
│ │ │ │ -
Base class for index merging strategies to simplify detection.
Definition: basistags.hh:44
│ │ │ │ -
Lexicographic merging of direct children without blocking.
Definition: basistags.hh:80
│ │ │ │ -
Lexicographic merging of direct children with blocking (i.e. creating one block per direct child).
Definition: basistags.hh:148
│ │ │ │ -
A pre-basis for composite bases.
Definition: compositebasis.hh:53
│ │ │ │ -
SubPreBasis< i > & subPreBasis(Dune::index_constant< i >={})
Mutable access to the stored prebasis of the factor in the power space.
Definition: compositebasis.hh:249
│ │ │ │ -
IMS IndexMergingStrategy
Strategy used to merge the global indices of the child pre-bases.
Definition: compositebasis.hh:71
│ │ │ │ -
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition: compositebasis.hh:230
│ │ │ │ -
const SubPreBasis< i > & subPreBasis(Dune::index_constant< i >={}) const
Const access to the stored prebasis of the factor in the power space.
Definition: compositebasis.hh:242
│ │ │ │ -
std::size_t size_type
Type used for indices and size information.
Definition: compositebasis.hh:68
│ │ │ │ -
CompositeBasisNode< typename SPB::Node... > Node
Template mapping root tree path to type of created tree node.
Definition: compositebasis.hh:81
│ │ │ │ -
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition: compositebasis.hh:165
│ │ │ │ -
CompositePreBasis(SFArgs &&... sfArgs)
Constructor for given child pre-basis objects.
Definition: compositebasis.hh:95
│ │ │ │ -
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition: compositebasis.hh:219
│ │ │ │ -
CompositePreBasis(const GV &gv)
Constructor for given GridView.
Definition: compositebasis.hh:115
│ │ │ │ -
It indices(const Node &node, It it) const
Maps from subtree index set [0..size-1] to a globally unique multi index in global basis.
Definition: compositebasis.hh:256
│ │ │ │ -
size_type size() const
Same as size(prefix) with empty prefix.
Definition: compositebasis.hh:158
│ │ │ │ -
typename std::tuple_element_t< 0, SubPreBases >::GridView GridView
The grid view that the FE basis is defined on.
Definition: compositebasis.hh:65
│ │ │ │ -
static const std::size_t children
Definition: compositebasis.hh:74
│ │ │ │ -
std::tuple< SPB... > SubPreBases
Tuple of child pre-bases.
Definition: compositebasis.hh:58
│ │ │ │ -
Node makeNode() const
Create tree node.
Definition: compositebasis.hh:148
│ │ │ │ -
void initializeIndices()
Initialize the global indices.
Definition: compositebasis.hh:124
│ │ │ │ -
std::tuple_element_t< i, SubPreBases > SubPreBasis
Export individual child pre-bases by index.
Definition: compositebasis.hh:62
│ │ │ │ -
std::make_index_sequence< children > ChildIndices
Definition: compositebasis.hh:76
│ │ │ │ -
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition: compositebasis.hh:138
│ │ │ │ -
static constexpr size_type multiIndexBufferSize
Definition: compositebasis.hh:85
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: compositebasis.hh:132
│ │ │ │ -
static constexpr size_type minMultiIndexSize
Definition: compositebasis.hh:84
│ │ │ │ -
static constexpr size_type maxMultiIndexSize
Definition: compositebasis.hh:83
│ │ │ │ -
Definition: nodes.hh:219
│ │ │ │ +
157 template<class GridView,
│ │ │ │ +
158 std::enable_if_t<not models<Concept::GlobalBasis<GridView>,RawPreBasisIndicator>(), int> = 0,
│ │ │ │ +
159 std::enable_if_t<not models<Concept::PreBasis<GridView>,RawPreBasisIndicator>(), int> = 0>
│ │ │ │ +
160 auto operator()(const GridView& gridView) const
│ │ │ │ +
161 {
│ │ │ │ +
162 auto rawPreBasis = rawPreBasisIndicator_(gridView);
│ │ │ │ +
163 rawPreBasis.initializeIndices();
│ │ │ │ +
164 auto transformation = PeriodicIndexingTransformation(rawPreBasis, periodicIndexSet_.indexPairSet());
│ │ │ │ +
165 return Dune::Functions::Experimental::TransformedIndexPreBasis(std::move(rawPreBasis), std::move(transformation));
│ │ │ │ +
166 }
│ │ │ │ +
167
│ │ │ │ +
168private:
│ │ │ │ +
169 RawPreBasisIndicator rawPreBasisIndicator_;
│ │ │ │ +
170 PeriodicIndexSet periodicIndexSet_;
│ │ │ │ +
171};
│ │ │ │ +
172
│ │ │ │ +
173} // end namespace BasisFactory::Impl
│ │ │ │ +
174
│ │ │ │ +
175
│ │ │ │ +
176
│ │ │ │ +
190template<class RawPreBasisIndicator, class PIS>
│ │ │ │ + │ │ │ │ +
192 RawPreBasisIndicator&& rawPreBasisIndicator,
│ │ │ │ +
193 PIS&& periodicIndexSet
│ │ │ │ +
194 )
│ │ │ │ +
195{
│ │ │ │ +
196 return Impl::PeriodicPreBasisFactory<std::decay_t<RawPreBasisIndicator>>(
│ │ │ │ +
197 std::forward<RawPreBasisIndicator>(rawPreBasisIndicator),
│ │ │ │ +
198 std::forward<PIS>(periodicIndexSet));
│ │ │ │ +
199}
│ │ │ │ +
200
│ │ │ │ +
201} // end namespace Experimental
│ │ │ │ +
202
│ │ │ │ +
203} // end namespace BasisFactory
│ │ │ │ +
204
│ │ │ │ +
205} // end namespace Dune::Functions
│ │ │ │ +
206
│ │ │ │ +
207#endif // DUNE_FUFEM_PERIODICBASIS_HH
│ │ │ │ + │ │ │ │ +
auto periodic(RawPreBasisIndicator &&rawPreBasisIndicator, PIS &&periodicIndexSet)
Create a pre-basis factory that can create a periodic pre-basis.
Definition: periodicbasis.hh:191
│ │ │ │ +
Definition: polynomial.hh:11
│ │ │ │ +
TransformedIndexPreBasis(RPB &&, T &&) -> TransformedIndexPreBasis< std::decay_t< RPB >, std::decay_t< T > >
│ │ │ │ +
Container storing identified indices for a periodic basis.
Definition: periodicbasis.hh:36
│ │ │ │ +
void unifyIndexPair(std::size_t a, std::size_t b)
Insert a pair of indices.
Definition: periodicbasis.hh:47
│ │ │ │ +
const auto & indexPairSet() const
Definition: periodicbasis.hh:56
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,541 +5,227 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -compositebasis.hh │ │ │ │ │ +periodicbasis.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_COMPOSITEBASIS_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_COMPOSITEBASIS_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_PERIODICBASIS_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_PERIODICBASIS_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ - 8 │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ - 16 │ │ │ │ │ - 17#include │ │ │ │ │ - 18#include │ │ │ │ │ - 19#include │ │ │ │ │ - 20#include │ │ │ │ │ - 21#include │ │ │ │ │ - 22#include │ │ │ │ │ - 23#include │ │ │ │ │ - 24 │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8#include │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11 │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14 │ │ │ │ │ + 15 │ │ │ │ │ + 16namespace Dune::Functions { │ │ │ │ │ + 17 │ │ │ │ │ + 18namespace BasisFactory { │ │ │ │ │ + 19 │ │ │ │ │ + 20// The PeriodicBasis class is in the Experimental namespace because we are │ │ │ │ │ + 21// not completely sure yet whether we like it. We reserve the right to │ │ │ │ │ + 22// modify it without advance warning. Use at your own risk! │ │ │ │ │ + 23 │ │ │ │ │ +24namespace Experimental { │ │ │ │ │ 25 │ │ │ │ │ - 26namespace Dune { │ │ │ │ │ - 27namespace Functions { │ │ │ │ │ - 28 │ │ │ │ │ - 29/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 30// This is the reusable part of the composite bases. It contains │ │ │ │ │ - 31// │ │ │ │ │ - 32// CompositePreBasis │ │ │ │ │ - 33// │ │ │ │ │ - 34// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ -shared │ │ │ │ │ - 35// state. These components do _not_ depend on the global basis and local │ │ │ │ │ -view │ │ │ │ │ - 36// and can be used without a global basis. │ │ │ │ │ - 37/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 38 │ │ │ │ │ + 26 │ │ │ │ │ +35class PeriodicIndexSet │ │ │ │ │ + 36{ │ │ │ │ │ + 37 using IndexPairSet = std::set>; │ │ │ │ │ + 38public: │ │ │ │ │ 39 │ │ │ │ │ - 51template │ │ │ │ │ -52class CompositePreBasis │ │ │ │ │ - 53{ │ │ │ │ │ - 54 static const bool isBlocked = std::is_same_v or std::is_same_v; │ │ │ │ │ - 55public: │ │ │ │ │ - 56 │ │ │ │ │ -58 using SubPreBases = std::tuple; │ │ │ │ │ - 59 │ │ │ │ │ - 61 template │ │ │ │ │ -62 using SubPreBasis = std::tuple_element_t; │ │ │ │ │ - 63 │ │ │ │ │ -65 using GridView = typename std::tuple_element_t<0, SubPreBases>::GridView; │ │ │ │ │ +47 void unifyIndexPair(std::size_t a, std::size_t b) │ │ │ │ │ + 48 { │ │ │ │ │ + 49 if (a>b) │ │ │ │ │ + 50 std::swap(a,b); │ │ │ │ │ + 51 if (a==b) │ │ │ │ │ + 52 return; │ │ │ │ │ + 53 indexPairSet_.insert(std::make_pair(a,b)); │ │ │ │ │ + 54 } │ │ │ │ │ + 55 │ │ │ │ │ +56 const auto& indexPairSet() const │ │ │ │ │ + 57 { │ │ │ │ │ + 58 return indexPairSet_; │ │ │ │ │ + 59 } │ │ │ │ │ + 60 │ │ │ │ │ + 61private: │ │ │ │ │ + 62 IndexPairSet indexPairSet_; │ │ │ │ │ + 63}; │ │ │ │ │ + 64 │ │ │ │ │ + 65 │ │ │ │ │ 66 │ │ │ │ │ -68 using size_type = std::size_t; │ │ │ │ │ - 69 │ │ │ │ │ -71 using IndexMergingStrategy = IMS; │ │ │ │ │ - 72 │ │ │ │ │ - 73protected: │ │ │ │ │ -74 static const std::size_t children = sizeof...(SPB); │ │ │ │ │ + 67namespace Impl { │ │ │ │ │ + 68 │ │ │ │ │ + 69// An index transformation for a TransformedIndexPreBasis │ │ │ │ │ + 70// implementing periodic functions by merging indices. │ │ │ │ │ + 71// Currently only flat indices are supported. │ │ │ │ │ + 72class PeriodicIndexingTransformation │ │ │ │ │ + 73{ │ │ │ │ │ + 74public: │ │ │ │ │ 75 │ │ │ │ │ -76 using ChildIndices = std::make_index_sequence; │ │ │ │ │ - 77 │ │ │ │ │ - 78public: │ │ │ │ │ - 79 │ │ │ │ │ -81 using Node = CompositeBasisNode; │ │ │ │ │ - 82 │ │ │ │ │ -83 static constexpr size_type maxMultiIndexSize = std::max({SPB:: │ │ │ │ │ -maxMultiIndexSize...}) + isBlocked; │ │ │ │ │ -84 static constexpr size_type minMultiIndexSize = std::min({SPB:: │ │ │ │ │ -minMultiIndexSize...}) + isBlocked; │ │ │ │ │ -85 static constexpr size_type multiIndexBufferSize = std::max({SPB:: │ │ │ │ │ -multiIndexBufferSize...}) + isBlocked; │ │ │ │ │ - 86 │ │ │ │ │ - 92 template = 0, │ │ │ │ │ - 94 enableIfConstructible, SFArgs...> = 0> │ │ │ │ │ -95 CompositePreBasis(SFArgs&&... sfArgs) : │ │ │ │ │ - 96 subPreBases_(std::forward(sfArgs)...) │ │ │ │ │ - 97 { │ │ │ │ │ - 98 Hybrid::forEach(subPreBases_, [&](const auto& subPreBasis){ │ │ │ │ │ - 99 static_assert(models, std::decay_t>(), "Subprebases passed to CompositePreBasis does not model the │ │ │ │ │ -PreBasis concept."); │ │ │ │ │ - 100 }); │ │ │ │ │ - 101 } │ │ │ │ │ - 102 │ │ │ │ │ - 109 template 1)>, // Avoid ambiguous constructor if │ │ │ │ │ -there's only one child │ │ │ │ │ - 112 std::is_same, │ │ │ │ │ - 113 std::is_constructible... │ │ │ │ │ - 114 >, int> = 0> │ │ │ │ │ -115 CompositePreBasis(const GV& gv) : │ │ │ │ │ - 116 subPreBases_(SPB(gv)...) │ │ │ │ │ - 117 { │ │ │ │ │ - 118 Hybrid::forEach(subPreBases_, [&](const auto& subPreBasis){ │ │ │ │ │ - 119 static_assert(models, std::decay_t>(), "Subprebases passed to CompositePreBasis does not model the │ │ │ │ │ -PreBasis concept."); │ │ │ │ │ - 120 }); │ │ │ │ │ - 121 } │ │ │ │ │ - 122 │ │ │ │ │ -124 void initializeIndices() │ │ │ │ │ - 125 { │ │ │ │ │ - 126 Hybrid::forEach(ChildIndices(), [&](auto i) { │ │ │ │ │ - 127 this->subPreBasis(i).initializeIndices(); │ │ │ │ │ - 128 }); │ │ │ │ │ - 129 } │ │ │ │ │ - 130 │ │ │ │ │ -132 const GridView& gridView() const │ │ │ │ │ - 133 { │ │ │ │ │ - 134 return std::get<0>(subPreBases_).gridView(); │ │ │ │ │ - 135 } │ │ │ │ │ - 136 │ │ │ │ │ -138 void update(const GridView& gv) │ │ │ │ │ - 139 { │ │ │ │ │ - 140 Hybrid::forEach(ChildIndices(), [&](auto i) { │ │ │ │ │ - 141 this->subPreBasis(i).update(gv); │ │ │ │ │ - 142 }); │ │ │ │ │ - 143 } │ │ │ │ │ - 144 │ │ │ │ │ -148 Node makeNode() const │ │ │ │ │ - 149 { │ │ │ │ │ - 150 auto node = Node{}; │ │ │ │ │ - 151 Hybrid::forEach(ChildIndices(), [&](auto i) { │ │ │ │ │ - 152 node.setChild(this->subPreBasis(i).makeNode(), i); │ │ │ │ │ - 153 }); │ │ │ │ │ - 154 return node; │ │ │ │ │ + 76 static constexpr std::size_t minIndexSize = 1; │ │ │ │ │ + 77 static constexpr std::size_t maxIndexSize = 1; │ │ │ │ │ + 78 │ │ │ │ │ + 79 template │ │ │ │ │ + 80 PeriodicIndexingTransformation(const RawPreBasis& rawPreBasis, const │ │ │ │ │ +IndexPairSet& indexPairSet) │ │ │ │ │ + 81 { │ │ │ │ │ + 82 static_assert(RawPreBasis::maxMultiIndexSize==1, │ │ │ │ │ +"PeriodicIndexingTransformation is only implemented for flat multi-indices"); │ │ │ │ │ + 83 std::size_t invalid = {std::numeric_limits::max()}; │ │ │ │ │ + 84 mappedIdx_.resize(rawPreBasis.size(), invalid); │ │ │ │ │ + 85 numIndices_ = 0; │ │ │ │ │ + 86 std::size_t i = 0; │ │ │ │ │ + 87 for(const auto& [a, b] : indexPairSet) │ │ │ │ │ + 88 { │ │ │ │ │ + 89 for(; i<=a; ++i) │ │ │ │ │ + 90 if (mappedIdx_[i] == invalid) │ │ │ │ │ + 91 mappedIdx_[i] = numIndices_++; │ │ │ │ │ + 92 mappedIdx_[b] = mappedIdx_[a]; │ │ │ │ │ + 93 } │ │ │ │ │ + 94 for(; i │ │ │ │ │ + 100 void transformIndex(MultiIndex& multiIndex, const PreBasis& preBasis) │ │ │ │ │ +const │ │ │ │ │ + 101 { │ │ │ │ │ + 102 multiIndex = {{ mappedIdx_[multiIndex[0]] }}; │ │ │ │ │ + 103 } │ │ │ │ │ + 104 │ │ │ │ │ + 105 template │ │ │ │ │ + 106 std::size_t size(const Prefix& prefix, const PreBasis& preBasis) const │ │ │ │ │ + 107 { │ │ │ │ │ + 108 if (prefix.size() == 1) │ │ │ │ │ + 109 return 0; │ │ │ │ │ + 110 return numIndices_; │ │ │ │ │ + 111 } │ │ │ │ │ + 112 │ │ │ │ │ + 113 template │ │ │ │ │ + 114 auto dimension(const PreBasis& preBasis) const │ │ │ │ │ + 115 { │ │ │ │ │ + 116 return numIndices_; │ │ │ │ │ + 117 } │ │ │ │ │ + 118 │ │ │ │ │ + 119private: │ │ │ │ │ + 120 std::vector mappedIdx_; │ │ │ │ │ + 121 std::size_t numIndices_; │ │ │ │ │ + 122}; │ │ │ │ │ + 123 │ │ │ │ │ + 124 │ │ │ │ │ + 125 │ │ │ │ │ + 126template │ │ │ │ │ + 127class PeriodicPreBasisFactory │ │ │ │ │ + 128{ │ │ │ │ │ + 129public: │ │ │ │ │ + 130 PeriodicPreBasisFactory() │ │ │ │ │ + 131 {} │ │ │ │ │ + 132 │ │ │ │ │ + 133 template │ │ │ │ │ + 134 PeriodicPreBasisFactory(RPBI&& rawPreBasisIndicator, PIS&& │ │ │ │ │ +periodicIndexSet) : │ │ │ │ │ + 135 rawPreBasisIndicator_(std::forward(rawPreBasisIndicator)), │ │ │ │ │ + 136 periodicIndexSet_(std::forward(periodicIndexSet)) │ │ │ │ │ + 137 {} │ │ │ │ │ + 138 │ │ │ │ │ + 139 template,RawPreBasisIndicator>(), int> = 0> │ │ │ │ │ + 141 auto operator()(const GridView& gridView) const │ │ │ │ │ + 142 { │ │ │ │ │ + 143 const auto& rawPreBasis = rawPreBasisIndicator_.preBasis(); │ │ │ │ │ + 144 auto transformation = PeriodicIndexingTransformation(rawPreBasis, │ │ │ │ │ +periodicIndexSet_.indexPairSet()); │ │ │ │ │ + 145 return Dune::Functions::Experimental::TransformedIndexPreBasis(std::move │ │ │ │ │ +(rawPreBasis), std::move(transformation)); │ │ │ │ │ + 146 } │ │ │ │ │ + 147 │ │ │ │ │ + 148 template,RawPreBasisIndicator> │ │ │ │ │ +(), int> = 0> │ │ │ │ │ + 150 auto operator()(const GridView& gridView) const │ │ │ │ │ + 151 { │ │ │ │ │ + 152 const auto& rawPreBasis = rawPreBasisIndicator_; │ │ │ │ │ + 153 auto transformation = PeriodicIndexingTransformation(rawPreBasis, │ │ │ │ │ +periodicIndexSet_.indexPairSet()); │ │ │ │ │ + 154 return Dune::Functions::Experimental::TransformedIndexPreBasis(std::move │ │ │ │ │ +(rawPreBasis), std::move(transformation)); │ │ │ │ │ 155 } │ │ │ │ │ 156 │ │ │ │ │ -158 size_type size() const │ │ │ │ │ - 159 { │ │ │ │ │ - 160 return size(Dune::ReservedVector{}); │ │ │ │ │ - 161 } │ │ │ │ │ - 162 │ │ │ │ │ - 164 template │ │ │ │ │ -165 size_type size(const SizePrefix& prefix) const │ │ │ │ │ - 166 { │ │ │ │ │ - 167 return size(prefix, IndexMergingStrategy{}); │ │ │ │ │ - 168 } │ │ │ │ │ - 169 │ │ │ │ │ - 170private: │ │ │ │ │ - 171 │ │ │ │ │ - 172 template │ │ │ │ │ - 173 size_type size(const SizePrefix& prefix, BasisFactory:: │ │ │ │ │ -BlockedLexicographic) const │ │ │ │ │ - 174 { │ │ │ │ │ - 175 if (prefix.size() == 0) │ │ │ │ │ - 176 return children; │ │ │ │ │ - 177 │ │ │ │ │ - 178 return Hybrid::switchCases(ChildIndices(), prefix[0], [&] (auto i) { │ │ │ │ │ - 179 SizePrefix subPrefix; │ │ │ │ │ - 180 for(std::size_t i=1; isubPreBasis(i).size(subPrefix); │ │ │ │ │ - 183 }, []() { │ │ │ │ │ - 184 return size_type(0); │ │ │ │ │ - 185 }); │ │ │ │ │ - 186 } │ │ │ │ │ - 187 │ │ │ │ │ - 188 template │ │ │ │ │ - 189 size_type size(const SizePrefix& prefix, BasisFactory::FlatLexicographic) │ │ │ │ │ -const │ │ │ │ │ - 190 { │ │ │ │ │ - 191 size_type result = 0; │ │ │ │ │ - 192 if (prefix.size() == 0) │ │ │ │ │ - 193 Hybrid::forEach(ChildIndices(), [&](auto i) { │ │ │ │ │ - 194 result += this->subPreBasis(i).size(); │ │ │ │ │ - 195 }); │ │ │ │ │ - 196 else { │ │ │ │ │ - 197 size_type shiftedFirstDigit = prefix[0]; │ │ │ │ │ - 198 staticFindInRange<0, children>([&](auto i) { │ │ │ │ │ - 199 auto firstDigitSize = this->subPreBasis(i).size(); │ │ │ │ │ - 200 if (shiftedFirstDigit < firstDigitSize) │ │ │ │ │ - 201 { │ │ │ │ │ - 202 SizePrefix subPrefix; │ │ │ │ │ - 203 subPrefix.push_back(shiftedFirstDigit); │ │ │ │ │ - 204 for(std::size_t i=1; isubPreBasis(i).size(subPrefix); │ │ │ │ │ - 207 return true; │ │ │ │ │ - 208 } │ │ │ │ │ - 209 shiftedFirstDigit -= firstDigitSize; │ │ │ │ │ - 210 return false; │ │ │ │ │ - 211 }); │ │ │ │ │ - 212 } │ │ │ │ │ - 213 return result; │ │ │ │ │ - 214 } │ │ │ │ │ - 215 │ │ │ │ │ - 216public: │ │ │ │ │ - 217 │ │ │ │ │ -219 size_type dimension() const │ │ │ │ │ - 220 { │ │ │ │ │ - 221 size_type r=0; │ │ │ │ │ - 222 // Accumulate dimension() for all subprebases │ │ │ │ │ - 223 Hybrid::forEach(ChildIndices(), [&](auto i) { │ │ │ │ │ - 224 r += this->subPreBasis(i).dimension(); │ │ │ │ │ - 225 }); │ │ │ │ │ - 226 return r; │ │ │ │ │ - 227 } │ │ │ │ │ - 228 │ │ │ │ │ -230 size_type maxNodeSize() const │ │ │ │ │ - 231 { │ │ │ │ │ - 232 size_type r=0; │ │ │ │ │ - 233 // Accumulate maxNodeSize() for all subprebases │ │ │ │ │ - 234 Hybrid::forEach(ChildIndices(), [&](auto i) { │ │ │ │ │ - 235 r += this->subPreBasis(i).maxNodeSize(); │ │ │ │ │ - 236 }); │ │ │ │ │ - 237 return r; │ │ │ │ │ - 238 } │ │ │ │ │ - 239 │ │ │ │ │ - 241 template │ │ │ │ │ -242 const SubPreBasis& subPreBasis(Dune::index_constant = {}) const │ │ │ │ │ - 243 { │ │ │ │ │ - 244 return std::get(subPreBases_); │ │ │ │ │ - 245 } │ │ │ │ │ - 246 │ │ │ │ │ - 248 template │ │ │ │ │ -249 SubPreBasis& subPreBasis(Dune::index_constant = {}) │ │ │ │ │ - 250 { │ │ │ │ │ - 251 return std::get(subPreBases_); │ │ │ │ │ - 252 } │ │ │ │ │ - 253 │ │ │ │ │ - 255 template │ │ │ │ │ -256 It indices(const Node& node, It it) const │ │ │ │ │ - 257 { │ │ │ │ │ - 258 return indices(node, it, IndexMergingStrategy{}); │ │ │ │ │ - 259 } │ │ │ │ │ - 260 │ │ │ │ │ - 261private: │ │ │ │ │ - 262 │ │ │ │ │ - 263 template │ │ │ │ │ - 264 It indices(const Node& node, It multiIndices, BasisFactory:: │ │ │ │ │ -FlatLexicographic) const │ │ │ │ │ - 265 { │ │ │ │ │ - 266 size_type firstComponentOffset = 0; │ │ │ │ │ - 267 // Loop over all children │ │ │ │ │ - 268 Hybrid::forEach(ChildIndices(), [&](auto child){ │ │ │ │ │ - 269 size_type subTreeSize = node.child(child).size(); │ │ │ │ │ - 270 // Fill indices for current child into index buffer starting from current │ │ │ │ │ - 271 // buffer position and shift first index component of any index for │ │ │ │ │ -current │ │ │ │ │ - 272 // child by suitable offset to get lexicographic indices. │ │ │ │ │ - 273 subPreBasis(child).indices(node.child(child), multiIndices); │ │ │ │ │ - 274 for (std::size_t i = 0; i │ │ │ │ │ - 285 static void multiIndexPushFront(MultiIndex& M, size_type M0) │ │ │ │ │ - 286 { │ │ │ │ │ - 287 M.resize(M.size()+1); │ │ │ │ │ - 288 for(std::size_t i=M.size()-1; i>0; --i) │ │ │ │ │ - 289 M[i] = M[i-1]; │ │ │ │ │ - 290 M[0] = M0; │ │ │ │ │ - 291 } │ │ │ │ │ - 292 │ │ │ │ │ - 293 template │ │ │ │ │ - 294 It indices(const Node& node, It multiIndices, BasisFactory:: │ │ │ │ │ -BlockedLexicographic) const │ │ │ │ │ - 295 { │ │ │ │ │ - 296 // Loop over all children │ │ │ │ │ - 297 Hybrid::forEach(ChildIndices(), [&](auto child){ │ │ │ │ │ - 298 size_type subTreeSize = node.child(child).size(); │ │ │ │ │ - 299 // Fill indices for current child into index buffer starting from current │ │ │ │ │ -position │ │ │ │ │ - 300 subPreBasis(child).indices(node.child(child), multiIndices); │ │ │ │ │ - 301 // Insert child index before first component of all indices of current │ │ │ │ │ -child. │ │ │ │ │ - 302 for (std::size_t i = 0; imultiIndexPushFront(multiIndices[i], child); │ │ │ │ │ - 304 // Increment buffer iterator by the number of indices processed for │ │ │ │ │ -current child │ │ │ │ │ - 305 multiIndices += subTreeSize; │ │ │ │ │ - 306 }); │ │ │ │ │ - 307 return multiIndices; │ │ │ │ │ - 308 } │ │ │ │ │ - 309 │ │ │ │ │ - 310 std::tuple subPreBases_; │ │ │ │ │ - 311}; │ │ │ │ │ - 312 │ │ │ │ │ - 313 │ │ │ │ │ - 314 │ │ │ │ │ - 315namespace BasisFactory { │ │ │ │ │ - 316 │ │ │ │ │ - 317namespace Imp { │ │ │ │ │ - 318 │ │ │ │ │ - 319template │ │ │ │ │ - 320class CompositePreBasisFactory │ │ │ │ │ - 321{ │ │ │ │ │ - 322 │ │ │ │ │ - 323 template │ │ │ │ │ - 324 auto makePreBasisFromChildPreBases(const GridView&, ChildPreBasis&&... │ │ │ │ │ -childPreBasis) const │ │ │ │ │ - 325 { │ │ │ │ │ - 326 return CompositePreBasis...>(std::forward(childPreBasis)...); │ │ │ │ │ - 327 } │ │ │ │ │ - 328 │ │ │ │ │ - 329public: │ │ │ │ │ - 330 │ │ │ │ │ - 331 CompositePreBasisFactory(const ChildPreBasisFactory&... │ │ │ │ │ -childPreBasisFactory) : │ │ │ │ │ - 332 childPreBasisFactories_(childPreBasisFactory...) │ │ │ │ │ - 333 {} │ │ │ │ │ - 334 │ │ │ │ │ - 335 CompositePreBasisFactory(ChildPreBasisFactory&&... childPreBasisFactory) : │ │ │ │ │ - 336 childPreBasisFactories_(std::move(childPreBasisFactory)...) │ │ │ │ │ - 337 {} │ │ │ │ │ - 338 │ │ │ │ │ - 339 template │ │ │ │ │ - 340 auto operator()(const GridView& gridView) const │ │ │ │ │ - 341 { │ │ │ │ │ - 342 // Use std::apply to unpack the tuple childPreBasisFactories_ │ │ │ │ │ - 343 return std::apply([&](const auto&... childPreBasisFactory) { │ │ │ │ │ - 344 return this->makePreBasisFromChildPreBases(gridView, childPreBasisFactory │ │ │ │ │ -(gridView)...); │ │ │ │ │ - 345 }, childPreBasisFactories_); │ │ │ │ │ - 346 } │ │ │ │ │ - 347 │ │ │ │ │ - 348private: │ │ │ │ │ - 349 std::tuple childPreBasisFactories_; │ │ │ │ │ - 350}; │ │ │ │ │ - 351 │ │ │ │ │ - 352} // end namespace BasisFactory::Imp │ │ │ │ │ - 353 │ │ │ │ │ - 354 │ │ │ │ │ - 355 │ │ │ │ │ - 366template< │ │ │ │ │ - 367 typename... Args, │ │ │ │ │ - 368 std::enable_if_t::type>(),int> = 0> │ │ │ │ │ -369auto composite(Args&&... args) │ │ │ │ │ - 370{ │ │ │ │ │ - 371 // We have to separate the last entry which is the IndexMergingStrategy │ │ │ │ │ - 372 // and the preceding ones, which are the ChildPreBasisFactories │ │ │ │ │ - 373 │ │ │ │ │ - 374 using ArgTuple = std::tuple...>; │ │ │ │ │ - 375 │ │ │ │ │ - 376 // Compute number of children and index of the IndexMergingStrategy │ │ │ │ │ -argument │ │ │ │ │ - 377 constexpr std::size_t children = Dune::SizeOf::value-1; │ │ │ │ │ - 378 │ │ │ │ │ - 379 // Use last type as IndexMergingStrategy │ │ │ │ │ - 380 using IndexMergingStrategy = std::tuple_element_t; │ │ │ │ │ - 381 │ │ │ │ │ - 382 // Index sequence for all but the last entry for partial tuple unpacking │ │ │ │ │ - 383 auto childIndices = std::make_index_sequence{}; │ │ │ │ │ - 384 │ │ │ │ │ - 385 // Unpack tuple only for those entries related to children │ │ │ │ │ - 386 return applyPartial([](auto&&... childPreBasisFactory){ │ │ │ │ │ - 387 return Imp::CompositePreBasisFactory...>(std::forward(childPreBasisFactory)...); │ │ │ │ │ - 388 }, │ │ │ │ │ - 389 std::forward_as_tuple(std::forward(args)...), │ │ │ │ │ - 390 childIndices); │ │ │ │ │ - 391} │ │ │ │ │ - 392 │ │ │ │ │ - 404template< │ │ │ │ │ - 405 typename... Args, │ │ │ │ │ - 406 std::enable_if_t::type>(),int> = 0> │ │ │ │ │ - 407auto composite(Args&&... args) │ │ │ │ │ - 408{ │ │ │ │ │ - 409 return Imp::CompositePreBasisFactory...>(std::forward(args)...); │ │ │ │ │ - 410} │ │ │ │ │ - 411 │ │ │ │ │ - 412} // end namespace BasisFactory │ │ │ │ │ - 413 │ │ │ │ │ - 414// Backward compatibility │ │ │ │ │ - 415namespace BasisBuilder { │ │ │ │ │ - 416 │ │ │ │ │ - 417 using namespace BasisFactory; │ │ │ │ │ - 418 │ │ │ │ │ - 419} │ │ │ │ │ - 420 │ │ │ │ │ - 421 │ │ │ │ │ - 422 │ │ │ │ │ - 423} // end namespace Functions │ │ │ │ │ - 424} // end namespace Dune │ │ │ │ │ - 425 │ │ │ │ │ - 426 │ │ │ │ │ - 427#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_COMPOSITEBASIS_HH │ │ │ │ │ -type_traits.hh │ │ │ │ │ -staticforloop.hh │ │ │ │ │ -utility.hh │ │ │ │ │ -nodes.hh │ │ │ │ │ -defaultglobalbasis.hh │ │ │ │ │ -basistags.hh │ │ │ │ │ -Dune::Functions::BasisFactory::composite │ │ │ │ │ -auto composite(Args &&... args) │ │ │ │ │ -Create a factory builder that can build a CompositePreBasis. │ │ │ │ │ -Definition: compositebasis.hh:369 │ │ │ │ │ -Dune::Functions::enableIfConstructible │ │ │ │ │ -typename std::enable_if< std::is_constructible< T, Args... >::value, int >:: │ │ │ │ │ -type enableIfConstructible │ │ │ │ │ -Helper to constrain forwarding constructors. │ │ │ │ │ -Definition: type_traits.hh:26 │ │ │ │ │ -Dune │ │ │ │ │ -Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::Concept::isIndexMergingStrategy │ │ │ │ │ -static constexpr bool isIndexMergingStrategy() │ │ │ │ │ -Definition: basistags.hh:23 │ │ │ │ │ -Dune::Functions::LastType │ │ │ │ │ -Get last entry of type list. │ │ │ │ │ -Definition: utility.hh:222 │ │ │ │ │ -Dune::Functions::BasisFactory::IndexMergingStrategy │ │ │ │ │ -Base class for index merging strategies to simplify detection. │ │ │ │ │ -Definition: basistags.hh:44 │ │ │ │ │ -Dune::Functions::BasisFactory::FlatLexicographic │ │ │ │ │ -Lexicographic merging of direct children without blocking. │ │ │ │ │ -Definition: basistags.hh:80 │ │ │ │ │ -Dune::Functions::BasisFactory::BlockedLexicographic │ │ │ │ │ -Lexicographic merging of direct children with blocking (i.e. creating one block │ │ │ │ │ -per direct child). │ │ │ │ │ -Definition: basistags.hh:148 │ │ │ │ │ -Dune::Functions::CompositePreBasis │ │ │ │ │ -A pre-basis for composite bases. │ │ │ │ │ -Definition: compositebasis.hh:53 │ │ │ │ │ -Dune::Functions::CompositePreBasis::subPreBasis │ │ │ │ │ -SubPreBasis< i > & subPreBasis(Dune::index_constant< i >={}) │ │ │ │ │ -Mutable access to the stored prebasis of the factor in the power space. │ │ │ │ │ -Definition: compositebasis.hh:249 │ │ │ │ │ -Dune::Functions::CompositePreBasis::IndexMergingStrategy │ │ │ │ │ -IMS IndexMergingStrategy │ │ │ │ │ -Strategy used to merge the global indices of the child pre-bases. │ │ │ │ │ -Definition: compositebasis.hh:71 │ │ │ │ │ -Dune::Functions::CompositePreBasis::maxNodeSize │ │ │ │ │ -size_type maxNodeSize() const │ │ │ │ │ -Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ -Definition: compositebasis.hh:230 │ │ │ │ │ -Dune::Functions::CompositePreBasis::subPreBasis │ │ │ │ │ -const SubPreBasis< i > & subPreBasis(Dune::index_constant< i >={}) const │ │ │ │ │ -Const access to the stored prebasis of the factor in the power space. │ │ │ │ │ -Definition: compositebasis.hh:242 │ │ │ │ │ -Dune::Functions::CompositePreBasis::size_type │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Type used for indices and size information. │ │ │ │ │ -Definition: compositebasis.hh:68 │ │ │ │ │ -Dune::Functions::CompositePreBasis::Node │ │ │ │ │ -CompositeBasisNode< typename SPB::Node... > Node │ │ │ │ │ -Template mapping root tree path to type of created tree node. │ │ │ │ │ -Definition: compositebasis.hh:81 │ │ │ │ │ -Dune::Functions::CompositePreBasis::size │ │ │ │ │ -size_type size(const SizePrefix &prefix) const │ │ │ │ │ -Return number of possible values for next position in multi index. │ │ │ │ │ -Definition: compositebasis.hh:165 │ │ │ │ │ -Dune::Functions::CompositePreBasis::CompositePreBasis │ │ │ │ │ -CompositePreBasis(SFArgs &&... sfArgs) │ │ │ │ │ -Constructor for given child pre-basis objects. │ │ │ │ │ -Definition: compositebasis.hh:95 │ │ │ │ │ -Dune::Functions::CompositePreBasis::dimension │ │ │ │ │ -size_type dimension() const │ │ │ │ │ -Get the total dimension of the space spanned by this basis. │ │ │ │ │ -Definition: compositebasis.hh:219 │ │ │ │ │ -Dune::Functions::CompositePreBasis::CompositePreBasis │ │ │ │ │ -CompositePreBasis(const GV &gv) │ │ │ │ │ -Constructor for given GridView. │ │ │ │ │ -Definition: compositebasis.hh:115 │ │ │ │ │ -Dune::Functions::CompositePreBasis::indices │ │ │ │ │ -It indices(const Node &node, It it) const │ │ │ │ │ -Maps from subtree index set [0..size-1] to a globally unique multi index in │ │ │ │ │ -global basis. │ │ │ │ │ -Definition: compositebasis.hh:256 │ │ │ │ │ -Dune::Functions::CompositePreBasis::size │ │ │ │ │ -size_type size() const │ │ │ │ │ -Same as size(prefix) with empty prefix. │ │ │ │ │ -Definition: compositebasis.hh:158 │ │ │ │ │ -Dune::Functions::CompositePreBasis::GridView │ │ │ │ │ -typename std::tuple_element_t< 0, SubPreBases >::GridView GridView │ │ │ │ │ -The grid view that the FE basis is defined on. │ │ │ │ │ -Definition: compositebasis.hh:65 │ │ │ │ │ -Dune::Functions::CompositePreBasis::children │ │ │ │ │ -static const std::size_t children │ │ │ │ │ -Definition: compositebasis.hh:74 │ │ │ │ │ -Dune::Functions::CompositePreBasis::SubPreBases │ │ │ │ │ -std::tuple< SPB... > SubPreBases │ │ │ │ │ -Tuple of child pre-bases. │ │ │ │ │ -Definition: compositebasis.hh:58 │ │ │ │ │ -Dune::Functions::CompositePreBasis::makeNode │ │ │ │ │ -Node makeNode() const │ │ │ │ │ -Create tree node. │ │ │ │ │ -Definition: compositebasis.hh:148 │ │ │ │ │ -Dune::Functions::CompositePreBasis::initializeIndices │ │ │ │ │ -void initializeIndices() │ │ │ │ │ -Initialize the global indices. │ │ │ │ │ -Definition: compositebasis.hh:124 │ │ │ │ │ -Dune::Functions::CompositePreBasis::SubPreBasis │ │ │ │ │ -std::tuple_element_t< i, SubPreBases > SubPreBasis │ │ │ │ │ -Export individual child pre-bases by index. │ │ │ │ │ -Definition: compositebasis.hh:62 │ │ │ │ │ -Dune::Functions::CompositePreBasis::ChildIndices │ │ │ │ │ -std::make_index_sequence< children > ChildIndices │ │ │ │ │ -Definition: compositebasis.hh:76 │ │ │ │ │ -Dune::Functions::CompositePreBasis::update │ │ │ │ │ -void update(const GridView &gv) │ │ │ │ │ -Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ -Definition: compositebasis.hh:138 │ │ │ │ │ -Dune::Functions::CompositePreBasis::multiIndexBufferSize │ │ │ │ │ -static constexpr size_type multiIndexBufferSize │ │ │ │ │ -Definition: compositebasis.hh:85 │ │ │ │ │ -Dune::Functions::CompositePreBasis::gridView │ │ │ │ │ -const GridView & gridView() const │ │ │ │ │ -Obtain the grid view that the basis is defined on. │ │ │ │ │ -Definition: compositebasis.hh:132 │ │ │ │ │ -Dune::Functions::CompositePreBasis::minMultiIndexSize │ │ │ │ │ -static constexpr size_type minMultiIndexSize │ │ │ │ │ -Definition: compositebasis.hh:84 │ │ │ │ │ -Dune::Functions::CompositePreBasis::maxMultiIndexSize │ │ │ │ │ -static constexpr size_type maxMultiIndexSize │ │ │ │ │ -Definition: compositebasis.hh:83 │ │ │ │ │ -Dune::Functions::CompositeBasisNode │ │ │ │ │ -Definition: nodes.hh:219 │ │ │ │ │ + 157 template,RawPreBasisIndicator>(), int> = 0, │ │ │ │ │ + 159 std::enable_if_t,RawPreBasisIndicator>(), int> = 0> │ │ │ │ │ + 160 auto operator()(const GridView& gridView) const │ │ │ │ │ + 161 { │ │ │ │ │ + 162 auto rawPreBasis = rawPreBasisIndicator_(gridView); │ │ │ │ │ + 163 rawPreBasis.initializeIndices(); │ │ │ │ │ + 164 auto transformation = PeriodicIndexingTransformation(rawPreBasis, │ │ │ │ │ +periodicIndexSet_.indexPairSet()); │ │ │ │ │ + 165 return Dune::Functions::Experimental::TransformedIndexPreBasis(std::move │ │ │ │ │ +(rawPreBasis), std::move(transformation)); │ │ │ │ │ + 166 } │ │ │ │ │ + 167 │ │ │ │ │ + 168private: │ │ │ │ │ + 169 RawPreBasisIndicator rawPreBasisIndicator_; │ │ │ │ │ + 170 PeriodicIndexSet periodicIndexSet_; │ │ │ │ │ + 171}; │ │ │ │ │ + 172 │ │ │ │ │ + 173} // end namespace BasisFactory::Impl │ │ │ │ │ + 174 │ │ │ │ │ + 175 │ │ │ │ │ + 176 │ │ │ │ │ + 190template │ │ │ │ │ +191auto periodic( │ │ │ │ │ + 192 RawPreBasisIndicator&& rawPreBasisIndicator, │ │ │ │ │ + 193 PIS&& periodicIndexSet │ │ │ │ │ + 194 ) │ │ │ │ │ + 195{ │ │ │ │ │ + 196 return Impl::PeriodicPreBasisFactory>( │ │ │ │ │ + 197 std::forward(rawPreBasisIndicator), │ │ │ │ │ + 198 std::forward(periodicIndexSet)); │ │ │ │ │ + 199} │ │ │ │ │ + 200 │ │ │ │ │ + 201} // end namespace Experimental │ │ │ │ │ + 202 │ │ │ │ │ + 203} // end namespace BasisFactory │ │ │ │ │ + 204 │ │ │ │ │ + 205} // end namespace Dune::Functions │ │ │ │ │ + 206 │ │ │ │ │ + 207#endif // DUNE_FUFEM_PERIODICBASIS_HH │ │ │ │ │ +transformedindexbasis.hh │ │ │ │ │ +Dune::Functions::BasisFactory::Experimental::periodic │ │ │ │ │ +auto periodic(RawPreBasisIndicator &&rawPreBasisIndicator, PIS │ │ │ │ │ +&&periodicIndexSet) │ │ │ │ │ +Create a pre-basis factory that can create a periodic pre-basis. │ │ │ │ │ +Definition: periodicbasis.hh:191 │ │ │ │ │ +Dune::Functions │ │ │ │ │ +Definition: polynomial.hh:11 │ │ │ │ │ +Dune::Functions::Experimental::TransformedIndexPreBasis │ │ │ │ │ +TransformedIndexPreBasis(RPB &&, T &&) -> TransformedIndexPreBasis< std:: │ │ │ │ │ +decay_t< RPB >, std::decay_t< T > > │ │ │ │ │ +Dune::Functions::BasisFactory::Experimental::PeriodicIndexSet │ │ │ │ │ +Container storing identified indices for a periodic basis. │ │ │ │ │ +Definition: periodicbasis.hh:36 │ │ │ │ │ +Dune::Functions::BasisFactory::Experimental::PeriodicIndexSet::unifyIndexPair │ │ │ │ │ +void unifyIndexPair(std::size_t a, std::size_t b) │ │ │ │ │ +Insert a pair of indices. │ │ │ │ │ +Definition: periodicbasis.hh:47 │ │ │ │ │ +Dune::Functions::BasisFactory::Experimental::PeriodicIndexSet::indexPairSet │ │ │ │ │ +const auto & indexPairSet() const │ │ │ │ │ +Definition: periodicbasis.hh:56 │ │ │ │ │ concepts.hh │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00110.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: nodes.hh File Reference │ │ │ │ +dune-functions: sizeinfo.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -66,57 +66,39 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
nodes.hh File Reference
│ │ │ │ +
sizeinfo.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <cassert>
│ │ │ │ -#include <memory>
│ │ │ │ -#include <dune/common/indices.hh>
│ │ │ │ -#include <dune/typetree/leafnode.hh>
│ │ │ │ -#include <dune/typetree/powernode.hh>
│ │ │ │ -#include <dune/typetree/compositenode.hh>
│ │ │ │ -#include <dune/typetree/traversal.hh>
│ │ │ │ -#include <dune/typetree/visitor.hh>
│ │ │ │ +
#include <array>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::BasisNodeMixin
 
class  Dune::Functions::LeafBasisNode
 
class  Dune::Functions::PowerBasisNode< T, n >
 
class  Dune::Functions::CompositeBasisNode< T >
class  Dune::Functions::SizeInfo< B >
 A class encapsulating size information. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<typename Tree >
void Dune::Functions::clearSize (Tree &tree, std::size_t offset)
 
template<typename Tree , typename Entity >
void Dune::Functions::bindTree (Tree &tree, const Entity &entity, std::size_t offset=0)
 
template<typename Tree >
void Dune::Functions::initializeTree (Tree &tree, std::size_t treeIndexOffset=0)
 
template<class Basis >
SizeInfo< Basis > Dune::Functions::sizeInfo (const Basis &basis)
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -6,46 +6,26 @@ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ Classes | Namespaces | Functions │ │ │ │ │ -nodes.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +sizeinfo.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::BasisNodeMixin │ │ │ │ │ -  │ │ │ │ │ -class  Dune::Functions::LeafBasisNode │ │ │ │ │ -  │ │ │ │ │ -class  Dune::Functions::PowerBasisNode<_T,_n_> │ │ │ │ │ -  │ │ │ │ │ -class  Dune::Functions::CompositeBasisNode<_T_> │ │ │ │ │ +class  Dune::Functions::SizeInfo<_B_> │ │ │ │ │ +  A class encapsulating size information. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ -void Dune::Functions::clearSize (Tree &tree, std::size_t offset) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void Dune::Functions::bindTree (Tree &tree, const Entity &entity, std::size_t │ │ │ │ │ - offset=0) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void Dune::Functions::initializeTree (Tree &tree, std::size_t │ │ │ │ │ - treeIndexOffset=0) │ │ │ │ │ +template │ │ │ │ │ +SizeInfo< Basis > Dune::Functions::sizeInfo (const Basis &basis) │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00110_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: nodes.hh Source File │ │ │ │ +dune-functions: sizeinfo.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,314 +62,84 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
nodes.hh
│ │ │ │ +
sizeinfo.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SIZEINFO_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SIZEINFO_HH
│ │ │ │
5
│ │ │ │ -
6#include <cassert>
│ │ │ │ -
7#include <memory>
│ │ │ │ -
8
│ │ │ │ -
9#include <dune/common/indices.hh>
│ │ │ │ +
6#include <array>
│ │ │ │ +
7
│ │ │ │ +
8namespace Dune {
│ │ │ │ +
9namespace Functions {
│ │ │ │
10
│ │ │ │ -
11#include <dune/typetree/leafnode.hh>
│ │ │ │ -
12#include <dune/typetree/powernode.hh>
│ │ │ │ -
13#include <dune/typetree/compositenode.hh>
│ │ │ │ -
14#include <dune/typetree/traversal.hh>
│ │ │ │ -
15#include <dune/typetree/visitor.hh>
│ │ │ │ -
16
│ │ │ │ -
17namespace Dune {
│ │ │ │ -
18 namespace Functions {
│ │ │ │ -
19
│ │ │ │ -
20
│ │ │ │ -
21 namespace Impl {
│ │ │ │ -
22
│ │ │ │ -
23
│ │ │ │ -
24 struct ClearSizeVisitor
│ │ │ │ -
25 : public TypeTree::TreeVisitor
│ │ │ │ -
26 , public TypeTree::DynamicTraversal
│ │ │ │ -
27 {
│ │ │ │ -
28
│ │ │ │ -
29 template<typename Node, typename TreePath>
│ │ │ │ -
30 void pre(Node& node, TreePath treePath)
│ │ │ │ -
31 {
│ │ │ │ -
32 leaf(node,treePath);
│ │ │ │ -
33 node.setSize(0);
│ │ │ │ -
34 }
│ │ │ │ -
35
│ │ │ │ -
36 template<typename Node, typename TreePath>
│ │ │ │ -
37 void leaf(Node& node, TreePath treePath)
│ │ │ │ -
38 {
│ │ │ │ -
39 node.setOffset(offset_);
│ │ │ │ -
40 }
│ │ │ │ -
41
│ │ │ │ -
42 ClearSizeVisitor(std::size_t offset)
│ │ │ │ -
43 : offset_(offset)
│ │ │ │ -
44 {}
│ │ │ │ +
11
│ │ │ │ +
12
│ │ │ │ +
23template<class B>
│ │ │ │ + │ │ │ │ +
25{
│ │ │ │ +
26public:
│ │ │ │ +
27 using Basis = B;
│ │ │ │ +
28 using size_type = typename Basis::size_type;
│ │ │ │ +
29 using SizePrefix = typename Basis::SizePrefix;
│ │ │ │ +
30
│ │ │ │ +
34 SizeInfo(const Basis& basis) :
│ │ │ │ +
35 basis_(&basis)
│ │ │ │ +
36 {}
│ │ │ │ +
37
│ │ │ │ +
41 size_type operator()(const SizePrefix& prefix) const
│ │ │ │ +
42 {
│ │ │ │ +
43 return basis_->size(prefix);
│ │ │ │ +
44 }
│ │ │ │
45
│ │ │ │ -
46 const std::size_t offset_;
│ │ │ │ -
47
│ │ │ │ -
48 };
│ │ │ │ -
49
│ │ │ │ -
50
│ │ │ │ -
51 template<typename Entity>
│ │ │ │ -
52 struct BindVisitor
│ │ │ │ -
53 : public TypeTree::TreeVisitor
│ │ │ │ -
54 , public TypeTree::DynamicTraversal
│ │ │ │ -
55 {
│ │ │ │ +
52 size_type size(const SizePrefix& prefix) const
│ │ │ │ +
53 {
│ │ │ │ +
54 return basis_->size(prefix);
│ │ │ │ +
55 }
│ │ │ │
56
│ │ │ │ -
57 template<typename Node, typename TreePath>
│ │ │ │ -
58 void pre(Node& node, TreePath)
│ │ │ │ -
59 {
│ │ │ │ -
60 node.setOffset(offset_);
│ │ │ │ -
61 }
│ │ │ │ -
62
│ │ │ │ -
63 template<typename Node, typename TreePath>
│ │ │ │ -
64 void post(Node& node, TreePath)
│ │ │ │ -
65 {
│ │ │ │ -
66 node.setSize(offset_ - node.offset());
│ │ │ │ -
67 }
│ │ │ │ -
68
│ │ │ │ -
69 template<typename Node, typename TreePath>
│ │ │ │ -
70 void leaf(Node& node, TreePath)
│ │ │ │ -
71 {
│ │ │ │ -
72 node.setOffset(offset_);
│ │ │ │ -
73 node.bind(entity_);
│ │ │ │ -
74 offset_ += node.size();
│ │ │ │ -
75 }
│ │ │ │ -
76
│ │ │ │ -
77 BindVisitor(const Entity& entity, std::size_t offset = 0)
│ │ │ │ -
78 : entity_(entity)
│ │ │ │ -
79 , offset_(offset)
│ │ │ │ -
80 {}
│ │ │ │ -
81
│ │ │ │ -
82 const Entity& entity_;
│ │ │ │ -
83 std::size_t offset_;
│ │ │ │ -
84
│ │ │ │ -
85 };
│ │ │ │ -
86
│ │ │ │ -
87
│ │ │ │ -
88 struct InitializeTreeVisitor :
│ │ │ │ -
89 public TypeTree::TreeVisitor,
│ │ │ │ -
90 public TypeTree::DynamicTraversal
│ │ │ │ -
91 {
│ │ │ │ -
92 template<typename Node, typename TreePath>
│ │ │ │ -
93 void pre(Node& node, TreePath)
│ │ │ │ -
94 {
│ │ │ │ -
95 node.setTreeIndex(treeIndex_);
│ │ │ │ -
96 ++treeIndex_;
│ │ │ │ -
97 }
│ │ │ │ -
98
│ │ │ │ -
99 template<typename Node, typename TreePath>
│ │ │ │ -
100 void leaf(Node& node, TreePath)
│ │ │ │ -
101 {
│ │ │ │ -
102 node.setTreeIndex(treeIndex_);
│ │ │ │ -
103 ++treeIndex_;
│ │ │ │ -
104 }
│ │ │ │ -
105
│ │ │ │ -
106 InitializeTreeVisitor(std::size_t treeIndexOffset = 0) :
│ │ │ │ -
107 treeIndex_(treeIndexOffset)
│ │ │ │ -
108 {}
│ │ │ │ -
109
│ │ │ │ -
110 std::size_t treeIndex_;
│ │ │ │ -
111 };
│ │ │ │ -
112
│ │ │ │ -
113 } // end namespace Impl
│ │ │ │ -
114
│ │ │ │ -
115
│ │ │ │ - │ │ │ │ -
117 {
│ │ │ │ -
118
│ │ │ │ -
119 friend struct Impl::ClearSizeVisitor;
│ │ │ │ -
120
│ │ │ │ -
121 template<typename>
│ │ │ │ -
122 friend struct Impl::BindVisitor;
│ │ │ │ -
123
│ │ │ │ -
124 friend struct Impl::InitializeTreeVisitor;
│ │ │ │ -
125
│ │ │ │ -
126 public:
│ │ │ │ -
127
│ │ │ │ -
128 using size_type = std::size_t;
│ │ │ │ -
129
│ │ │ │ - │ │ │ │ -
131 offset_(0),
│ │ │ │ -
132 size_(0),
│ │ │ │ -
133 treeIndex_(0)
│ │ │ │ -
134 {}
│ │ │ │ -
135
│ │ │ │ - │ │ │ │ -
137 {
│ │ │ │ -
138 assert(i < size_);
│ │ │ │ -
139 return offset_ + i;
│ │ │ │ -
140 }
│ │ │ │ -
141
│ │ │ │ - │ │ │ │ -
143 {
│ │ │ │ -
144 return size_;
│ │ │ │ -
145 }
│ │ │ │ -
146
│ │ │ │ - │ │ │ │ -
148 {
│ │ │ │ -
149 return treeIndex_;
│ │ │ │ -
150 }
│ │ │ │ -
151
│ │ │ │ -
152 protected:
│ │ │ │ -
153
│ │ │ │ - │ │ │ │ -
155 {
│ │ │ │ -
156 return offset_;
│ │ │ │ -
157 }
│ │ │ │ -
158
│ │ │ │ - │ │ │ │ -
160 {
│ │ │ │ -
161 offset_ = offset;
│ │ │ │ -
162 }
│ │ │ │ -
163
│ │ │ │ - │ │ │ │ -
165 {
│ │ │ │ -
166 size_ = size;
│ │ │ │ -
167 }
│ │ │ │ -
168
│ │ │ │ - │ │ │ │ -
170 {
│ │ │ │ -
171 treeIndex_ = treeIndex;
│ │ │ │ -
172 }
│ │ │ │ -
173
│ │ │ │ -
174 private:
│ │ │ │ -
175
│ │ │ │ -
176 size_type offset_;
│ │ │ │ -
177 size_type size_;
│ │ │ │ -
178 size_type treeIndex_;
│ │ │ │ -
179
│ │ │ │ -
180 };
│ │ │ │ -
181
│ │ │ │ -
182
│ │ │ │ - │ │ │ │ -
184 public BasisNodeMixin,
│ │ │ │ -
185 public TypeTree::LeafNode
│ │ │ │ -
186 {};
│ │ │ │ -
187
│ │ │ │ -
188
│ │ │ │ -
189 template<typename T, std::size_t n>
│ │ │ │ - │ │ │ │ -
191 public BasisNodeMixin,
│ │ │ │ -
192 public TypeTree::PowerNode<T,n>
│ │ │ │ -
193 {
│ │ │ │ -
194
│ │ │ │ -
195 using Node = TypeTree::PowerNode<T,n>;
│ │ │ │ -
196
│ │ │ │ -
197 public:
│ │ │ │ -
198
│ │ │ │ -
199 using Element = typename T::Element;
│ │ │ │ -
200
│ │ │ │ -
201 PowerBasisNode() = default;
│ │ │ │ -
202
│ │ │ │ -
203 PowerBasisNode(const typename Node::NodeStorage& children) :
│ │ │ │ -
204 Node(children)
│ │ │ │ -
205 {}
│ │ │ │ -
206
│ │ │ │ -
207 const Element& element() const
│ │ │ │ -
208 {
│ │ │ │ -
209 return this->child(Dune::Indices::_0).element();
│ │ │ │ -
210 }
│ │ │ │ -
211
│ │ │ │ -
212 };
│ │ │ │ -
213
│ │ │ │ -
214
│ │ │ │ -
215 template<typename... T>
│ │ │ │ - │ │ │ │ -
217 public BasisNodeMixin,
│ │ │ │ -
218 public TypeTree::CompositeNode<T...>
│ │ │ │ -
219 {
│ │ │ │ -
220
│ │ │ │ -
221 using Node = TypeTree::CompositeNode<T...>;
│ │ │ │ -
222
│ │ │ │ -
223 public:
│ │ │ │ -
224
│ │ │ │ -
225 using Element = typename Node::template Child<0>::Type::Element;
│ │ │ │ -
226
│ │ │ │ - │ │ │ │ -
228
│ │ │ │ -
229 CompositeBasisNode(const typename Node::NodeStorage& children) :
│ │ │ │ -
230 Node(children)
│ │ │ │ -
231 {}
│ │ │ │ -
232
│ │ │ │ -
233 template<typename... Children>
│ │ │ │ -
234 CompositeBasisNode(const std::shared_ptr<Children>&... children) :
│ │ │ │ -
235 Node(children...)
│ │ │ │ -
236 {}
│ │ │ │ -
237
│ │ │ │ -
238 const Element& element() const
│ │ │ │ -
239 {
│ │ │ │ -
240 return this->child(Dune::Indices::_0).element();
│ │ │ │ -
241 }
│ │ │ │ -
242
│ │ │ │ -
243 };
│ │ │ │ -
244
│ │ │ │ -
245
│ │ │ │ -
246 template<typename Tree>
│ │ │ │ -
247 void clearSize(Tree& tree, std::size_t offset)
│ │ │ │ -
248 {
│ │ │ │ -
249 TypeTree::applyToTree(tree,Impl::ClearSizeVisitor(offset));
│ │ │ │ -
250 }
│ │ │ │ -
251
│ │ │ │ -
252 template<typename Tree, typename Entity>
│ │ │ │ -
253 void bindTree(Tree& tree, const Entity& entity, std::size_t offset = 0)
│ │ │ │ -
254 {
│ │ │ │ -
255 Impl::BindVisitor<Entity> visitor(entity,offset);
│ │ │ │ -
256 TypeTree::applyToTree(tree,visitor);
│ │ │ │ -
257 }
│ │ │ │ -
258
│ │ │ │ -
259 template<typename Tree>
│ │ │ │ -
260 void initializeTree(Tree& tree, std::size_t treeIndexOffset = 0)
│ │ │ │ -
261 {
│ │ │ │ -
262 Impl::InitializeTreeVisitor visitor(treeIndexOffset);
│ │ │ │ -
263 TypeTree::applyToTree(tree,visitor);
│ │ │ │ -
264 }
│ │ │ │ -
265
│ │ │ │ -
266
│ │ │ │ -
267 } // namespace Functions
│ │ │ │ -
268
│ │ │ │ -
269} // namespace Dune
│ │ │ │ -
270
│ │ │ │ -
271#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH
│ │ │ │ +
57 operator size_type () const
│ │ │ │ +
58 {
│ │ │ │ +
59 return basis_->dimension();
│ │ │ │ +
60 }
│ │ │ │ +
61
│ │ │ │ +
62protected:
│ │ │ │ +
63
│ │ │ │ +
64 const Basis* basis_;
│ │ │ │ +
65};
│ │ │ │ +
66
│ │ │ │ +
67
│ │ │ │ +
68template<class Basis>
│ │ │ │ +
69SizeInfo<Basis> sizeInfo(const Basis& basis)
│ │ │ │ +
70{
│ │ │ │ +
71 return SizeInfo<Basis>(basis);
│ │ │ │ +
72}
│ │ │ │ +
73
│ │ │ │ +
74
│ │ │ │ +
75
│ │ │ │ +
76} // end namespace Functions
│ │ │ │ +
77} // end namespace Dune
│ │ │ │ +
78
│ │ │ │ +
79#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SIZEINFO_HH
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
void clearSize(Tree &tree, std::size_t offset)
Definition: nodes.hh:247
│ │ │ │ -
void bindTree(Tree &tree, const Entity &entity, std::size_t offset=0)
Definition: nodes.hh:253
│ │ │ │ -
void initializeTree(Tree &tree, std::size_t treeIndexOffset=0)
Definition: nodes.hh:260
│ │ │ │ -
Definition: nodes.hh:117
│ │ │ │ -
size_type treeIndex() const
Definition: nodes.hh:147
│ │ │ │ -
size_type localIndex(size_type i) const
Definition: nodes.hh:136
│ │ │ │ -
size_type offset() const
Definition: nodes.hh:154
│ │ │ │ -
size_type size() const
Definition: nodes.hh:142
│ │ │ │ -
void setOffset(const size_type offset)
Definition: nodes.hh:159
│ │ │ │ -
std::size_t size_type
Definition: nodes.hh:128
│ │ │ │ -
BasisNodeMixin()
Definition: nodes.hh:130
│ │ │ │ -
void setSize(const size_type size)
Definition: nodes.hh:164
│ │ │ │ -
void setTreeIndex(size_type treeIndex)
Definition: nodes.hh:169
│ │ │ │ -
Definition: nodes.hh:186
│ │ │ │ -
Definition: nodes.hh:193
│ │ │ │ -
const Element & element() const
Definition: nodes.hh:207
│ │ │ │ -
typename T::Element Element
Definition: nodes.hh:199
│ │ │ │ -
PowerBasisNode(const typename Node::NodeStorage &children)
Definition: nodes.hh:203
│ │ │ │ - │ │ │ │ -
Definition: nodes.hh:219
│ │ │ │ - │ │ │ │ -
CompositeBasisNode(const typename Node::NodeStorage &children)
Definition: nodes.hh:229
│ │ │ │ -
const Element & element() const
Definition: nodes.hh:238
│ │ │ │ -
typename Node::template Child< 0 >::Type::Element Element
Definition: nodes.hh:225
│ │ │ │ -
CompositeBasisNode(const std::shared_ptr< Children > &... children)
Definition: nodes.hh:234
│ │ │ │ +
SizeInfo< Basis > sizeInfo(const Basis &basis)
Definition: sizeinfo.hh:69
│ │ │ │ +
A class encapsulating size information.
Definition: sizeinfo.hh:25
│ │ │ │ +
typename Basis::SizePrefix SizePrefix
Definition: sizeinfo.hh:29
│ │ │ │ +
size_type size(const SizePrefix &prefix) const
Return number possible values for next position in multi index.
Definition: sizeinfo.hh:52
│ │ │ │ +
size_type operator()(const SizePrefix &prefix) const
Return number possible values for next position in multi index.
Definition: sizeinfo.hh:41
│ │ │ │ +
typename Basis::size_type size_type
Definition: sizeinfo.hh:28
│ │ │ │ +
B Basis
Definition: sizeinfo.hh:27
│ │ │ │ +
SizeInfo(const Basis &basis)
Construct from basis.
Definition: sizeinfo.hh:34
│ │ │ │ +
const Basis * basis_
Definition: sizeinfo.hh:64
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,354 +5,101 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -nodes.hh │ │ │ │ │ +sizeinfo.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SIZEINFO_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SIZEINFO_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ - 8 │ │ │ │ │ - 9#include │ │ │ │ │ + 6#include │ │ │ │ │ + 7 │ │ │ │ │ + 8namespace Dune { │ │ │ │ │ + 9namespace Functions { │ │ │ │ │ 10 │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ - 16 │ │ │ │ │ - 17namespace Dune { │ │ │ │ │ - 18 namespace Functions { │ │ │ │ │ - 19 │ │ │ │ │ - 20 │ │ │ │ │ - 21 namespace Impl { │ │ │ │ │ - 22 │ │ │ │ │ - 23 │ │ │ │ │ - 24 struct ClearSizeVisitor │ │ │ │ │ - 25 : public TypeTree::TreeVisitor │ │ │ │ │ - 26 , public TypeTree::DynamicTraversal │ │ │ │ │ - 27 { │ │ │ │ │ - 28 │ │ │ │ │ - 29 template │ │ │ │ │ - 30 void pre(Node& node, TreePath treePath) │ │ │ │ │ - 31 { │ │ │ │ │ - 32 leaf(node,treePath); │ │ │ │ │ - 33 node.setSize(0); │ │ │ │ │ - 34 } │ │ │ │ │ - 35 │ │ │ │ │ - 36 template │ │ │ │ │ - 37 void leaf(Node& node, TreePath treePath) │ │ │ │ │ - 38 { │ │ │ │ │ - 39 node.setOffset(offset_); │ │ │ │ │ - 40 } │ │ │ │ │ - 41 │ │ │ │ │ - 42 ClearSizeVisitor(std::size_t offset) │ │ │ │ │ - 43 : offset_(offset) │ │ │ │ │ - 44 {} │ │ │ │ │ + 11 │ │ │ │ │ + 12 │ │ │ │ │ + 23template │ │ │ │ │ +24class SizeInfo │ │ │ │ │ + 25{ │ │ │ │ │ + 26public: │ │ │ │ │ +27 using Basis = B; │ │ │ │ │ +28 using size_type = typename Basis::size_type; │ │ │ │ │ +29 using SizePrefix = typename Basis::SizePrefix; │ │ │ │ │ + 30 │ │ │ │ │ +34 SizeInfo(const Basis& basis) : │ │ │ │ │ + 35 basis_(&basis) │ │ │ │ │ + 36 {} │ │ │ │ │ + 37 │ │ │ │ │ +41 size_type operator()(const SizePrefix& prefix) const │ │ │ │ │ + 42 { │ │ │ │ │ + 43 return basis_->size(prefix); │ │ │ │ │ + 44 } │ │ │ │ │ 45 │ │ │ │ │ - 46 const std::size_t offset_; │ │ │ │ │ - 47 │ │ │ │ │ - 48 }; │ │ │ │ │ - 49 │ │ │ │ │ - 50 │ │ │ │ │ - 51 template │ │ │ │ │ - 52 struct BindVisitor │ │ │ │ │ - 53 : public TypeTree::TreeVisitor │ │ │ │ │ - 54 , public TypeTree::DynamicTraversal │ │ │ │ │ - 55 { │ │ │ │ │ +52 size_type size(const SizePrefix& prefix) const │ │ │ │ │ + 53 { │ │ │ │ │ + 54 return basis_->size(prefix); │ │ │ │ │ + 55 } │ │ │ │ │ 56 │ │ │ │ │ - 57 template │ │ │ │ │ - 58 void pre(Node& node, TreePath) │ │ │ │ │ - 59 { │ │ │ │ │ - 60 node.setOffset(offset_); │ │ │ │ │ - 61 } │ │ │ │ │ - 62 │ │ │ │ │ - 63 template │ │ │ │ │ - 64 void post(Node& node, TreePath) │ │ │ │ │ - 65 { │ │ │ │ │ - 66 node.setSize(offset_ - node.offset()); │ │ │ │ │ - 67 } │ │ │ │ │ - 68 │ │ │ │ │ - 69 template │ │ │ │ │ - 70 void leaf(Node& node, TreePath) │ │ │ │ │ - 71 { │ │ │ │ │ - 72 node.setOffset(offset_); │ │ │ │ │ - 73 node.bind(entity_); │ │ │ │ │ - 74 offset_ += node.size(); │ │ │ │ │ - 75 } │ │ │ │ │ - 76 │ │ │ │ │ - 77 BindVisitor(const Entity& entity, std::size_t offset = 0) │ │ │ │ │ - 78 : entity_(entity) │ │ │ │ │ - 79 , offset_(offset) │ │ │ │ │ - 80 {} │ │ │ │ │ - 81 │ │ │ │ │ - 82 const Entity& entity_; │ │ │ │ │ - 83 std::size_t offset_; │ │ │ │ │ - 84 │ │ │ │ │ - 85 }; │ │ │ │ │ - 86 │ │ │ │ │ - 87 │ │ │ │ │ - 88 struct InitializeTreeVisitor : │ │ │ │ │ - 89 public TypeTree::TreeVisitor, │ │ │ │ │ - 90 public TypeTree::DynamicTraversal │ │ │ │ │ - 91 { │ │ │ │ │ - 92 template │ │ │ │ │ - 93 void pre(Node& node, TreePath) │ │ │ │ │ - 94 { │ │ │ │ │ - 95 node.setTreeIndex(treeIndex_); │ │ │ │ │ - 96 ++treeIndex_; │ │ │ │ │ - 97 } │ │ │ │ │ - 98 │ │ │ │ │ - 99 template │ │ │ │ │ - 100 void leaf(Node& node, TreePath) │ │ │ │ │ - 101 { │ │ │ │ │ - 102 node.setTreeIndex(treeIndex_); │ │ │ │ │ - 103 ++treeIndex_; │ │ │ │ │ - 104 } │ │ │ │ │ - 105 │ │ │ │ │ - 106 InitializeTreeVisitor(std::size_t treeIndexOffset = 0) : │ │ │ │ │ - 107 treeIndex_(treeIndexOffset) │ │ │ │ │ - 108 {} │ │ │ │ │ - 109 │ │ │ │ │ - 110 std::size_t treeIndex_; │ │ │ │ │ - 111 }; │ │ │ │ │ - 112 │ │ │ │ │ - 113 } // end namespace Impl │ │ │ │ │ - 114 │ │ │ │ │ - 115 │ │ │ │ │ -116 class BasisNodeMixin │ │ │ │ │ - 117 { │ │ │ │ │ - 118 │ │ │ │ │ - 119 friend struct Impl::ClearSizeVisitor; │ │ │ │ │ - 120 │ │ │ │ │ - 121 template │ │ │ │ │ - 122 friend struct Impl::BindVisitor; │ │ │ │ │ - 123 │ │ │ │ │ - 124 friend struct Impl::InitializeTreeVisitor; │ │ │ │ │ - 125 │ │ │ │ │ - 126 public: │ │ │ │ │ - 127 │ │ │ │ │ -128 using size_type = std::size_t; │ │ │ │ │ - 129 │ │ │ │ │ -130 BasisNodeMixin() : │ │ │ │ │ - 131 offset_(0), │ │ │ │ │ - 132 size_(0), │ │ │ │ │ - 133 treeIndex_(0) │ │ │ │ │ - 134 {} │ │ │ │ │ - 135 │ │ │ │ │ -136 size_type localIndex(size_type i) const │ │ │ │ │ - 137 { │ │ │ │ │ - 138 assert(i < size_); │ │ │ │ │ - 139 return offset_ + i; │ │ │ │ │ - 140 } │ │ │ │ │ - 141 │ │ │ │ │ -142 size_type size() const │ │ │ │ │ - 143 { │ │ │ │ │ - 144 return size_; │ │ │ │ │ - 145 } │ │ │ │ │ - 146 │ │ │ │ │ -147 size_type treeIndex() const │ │ │ │ │ - 148 { │ │ │ │ │ - 149 return treeIndex_; │ │ │ │ │ - 150 } │ │ │ │ │ - 151 │ │ │ │ │ - 152 protected: │ │ │ │ │ - 153 │ │ │ │ │ -154 size_type offset() const │ │ │ │ │ - 155 { │ │ │ │ │ - 156 return offset_; │ │ │ │ │ - 157 } │ │ │ │ │ - 158 │ │ │ │ │ -159 void setOffset(const size_type offset) │ │ │ │ │ - 160 { │ │ │ │ │ - 161 offset_ = offset; │ │ │ │ │ - 162 } │ │ │ │ │ - 163 │ │ │ │ │ -164 void setSize(const size_type size) │ │ │ │ │ - 165 { │ │ │ │ │ - 166 size_ = size; │ │ │ │ │ - 167 } │ │ │ │ │ - 168 │ │ │ │ │ -169 void setTreeIndex(size_type treeIndex) │ │ │ │ │ - 170 { │ │ │ │ │ - 171 treeIndex_ = treeIndex; │ │ │ │ │ - 172 } │ │ │ │ │ - 173 │ │ │ │ │ - 174 private: │ │ │ │ │ - 175 │ │ │ │ │ - 176 size_type offset_; │ │ │ │ │ - 177 size_type size_; │ │ │ │ │ - 178 size_type treeIndex_; │ │ │ │ │ - 179 │ │ │ │ │ - 180 }; │ │ │ │ │ - 181 │ │ │ │ │ - 182 │ │ │ │ │ -183 class LeafBasisNode : │ │ │ │ │ - 184 public BasisNodeMixin, │ │ │ │ │ - 185 public TypeTree::LeafNode │ │ │ │ │ - 186 {}; │ │ │ │ │ - 187 │ │ │ │ │ - 188 │ │ │ │ │ - 189 template │ │ │ │ │ -190 class PowerBasisNode : │ │ │ │ │ - 191 public BasisNodeMixin, │ │ │ │ │ - 192 public TypeTree::PowerNode │ │ │ │ │ - 193 { │ │ │ │ │ - 194 │ │ │ │ │ - 195 using Node = TypeTree::PowerNode; │ │ │ │ │ - 196 │ │ │ │ │ - 197 public: │ │ │ │ │ - 198 │ │ │ │ │ -199 using Element = typename T::Element; │ │ │ │ │ - 200 │ │ │ │ │ -201 PowerBasisNode() = default; │ │ │ │ │ - 202 │ │ │ │ │ -203 PowerBasisNode(const typename Node::NodeStorage& children) : │ │ │ │ │ - 204 Node(children) │ │ │ │ │ - 205 {} │ │ │ │ │ - 206 │ │ │ │ │ -207 const Element& element() const │ │ │ │ │ - 208 { │ │ │ │ │ - 209 return this->child(Dune::Indices::_0).element(); │ │ │ │ │ - 210 } │ │ │ │ │ - 211 │ │ │ │ │ - 212 }; │ │ │ │ │ - 213 │ │ │ │ │ - 214 │ │ │ │ │ - 215 template │ │ │ │ │ -216 class CompositeBasisNode : │ │ │ │ │ - 217 public BasisNodeMixin, │ │ │ │ │ - 218 public TypeTree::CompositeNode │ │ │ │ │ - 219 { │ │ │ │ │ - 220 │ │ │ │ │ - 221 using Node = TypeTree::CompositeNode; │ │ │ │ │ - 222 │ │ │ │ │ - 223 public: │ │ │ │ │ - 224 │ │ │ │ │ -225 using Element = typename Node::template Child<0>::Type::Element; │ │ │ │ │ - 226 │ │ │ │ │ -227 CompositeBasisNode() = default; │ │ │ │ │ - 228 │ │ │ │ │ -229 CompositeBasisNode(const typename Node::NodeStorage& children) : │ │ │ │ │ - 230 Node(children) │ │ │ │ │ - 231 {} │ │ │ │ │ - 232 │ │ │ │ │ - 233 template │ │ │ │ │ -234 CompositeBasisNode(const std::shared_ptr&... children) : │ │ │ │ │ - 235 Node(children...) │ │ │ │ │ - 236 {} │ │ │ │ │ - 237 │ │ │ │ │ -238 const Element& element() const │ │ │ │ │ - 239 { │ │ │ │ │ - 240 return this->child(Dune::Indices::_0).element(); │ │ │ │ │ - 241 } │ │ │ │ │ - 242 │ │ │ │ │ - 243 }; │ │ │ │ │ - 244 │ │ │ │ │ - 245 │ │ │ │ │ - 246 template │ │ │ │ │ -247 void clearSize(Tree& tree, std::size_t offset) │ │ │ │ │ - 248 { │ │ │ │ │ - 249 TypeTree::applyToTree(tree,Impl::ClearSizeVisitor(offset)); │ │ │ │ │ - 250 } │ │ │ │ │ - 251 │ │ │ │ │ - 252 template │ │ │ │ │ -253 void bindTree(Tree& tree, const Entity& entity, std::size_t offset = 0) │ │ │ │ │ - 254 { │ │ │ │ │ - 255 Impl::BindVisitor visitor(entity,offset); │ │ │ │ │ - 256 TypeTree::applyToTree(tree,visitor); │ │ │ │ │ - 257 } │ │ │ │ │ - 258 │ │ │ │ │ - 259 template │ │ │ │ │ -260 void initializeTree(Tree& tree, std::size_t treeIndexOffset = 0) │ │ │ │ │ - 261 { │ │ │ │ │ - 262 Impl::InitializeTreeVisitor visitor(treeIndexOffset); │ │ │ │ │ - 263 TypeTree::applyToTree(tree,visitor); │ │ │ │ │ - 264 } │ │ │ │ │ - 265 │ │ │ │ │ - 266 │ │ │ │ │ - 267 } // namespace Functions │ │ │ │ │ - 268 │ │ │ │ │ - 269} // namespace Dune │ │ │ │ │ - 270 │ │ │ │ │ - 271#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH │ │ │ │ │ +57 operator size_type () const │ │ │ │ │ + 58 { │ │ │ │ │ + 59 return basis_->dimension(); │ │ │ │ │ + 60 } │ │ │ │ │ + 61 │ │ │ │ │ + 62protected: │ │ │ │ │ + 63 │ │ │ │ │ +64 const Basis* basis_; │ │ │ │ │ + 65}; │ │ │ │ │ + 66 │ │ │ │ │ + 67 │ │ │ │ │ + 68template │ │ │ │ │ +69SizeInfo sizeInfo(const Basis& basis) │ │ │ │ │ + 70{ │ │ │ │ │ + 71 return SizeInfo(basis); │ │ │ │ │ + 72} │ │ │ │ │ + 73 │ │ │ │ │ + 74 │ │ │ │ │ + 75 │ │ │ │ │ + 76} // end namespace Functions │ │ │ │ │ + 77} // end namespace Dune │ │ │ │ │ + 78 │ │ │ │ │ + 79#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SIZEINFO_HH │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::clearSize │ │ │ │ │ -void clearSize(Tree &tree, std::size_t offset) │ │ │ │ │ -Definition: nodes.hh:247 │ │ │ │ │ -Dune::Functions::bindTree │ │ │ │ │ -void bindTree(Tree &tree, const Entity &entity, std::size_t offset=0) │ │ │ │ │ -Definition: nodes.hh:253 │ │ │ │ │ -Dune::Functions::initializeTree │ │ │ │ │ -void initializeTree(Tree &tree, std::size_t treeIndexOffset=0) │ │ │ │ │ -Definition: nodes.hh:260 │ │ │ │ │ -Dune::Functions::BasisNodeMixin │ │ │ │ │ -Definition: nodes.hh:117 │ │ │ │ │ -Dune::Functions::BasisNodeMixin::treeIndex │ │ │ │ │ -size_type treeIndex() const │ │ │ │ │ -Definition: nodes.hh:147 │ │ │ │ │ -Dune::Functions::BasisNodeMixin::localIndex │ │ │ │ │ -size_type localIndex(size_type i) const │ │ │ │ │ -Definition: nodes.hh:136 │ │ │ │ │ -Dune::Functions::BasisNodeMixin::offset │ │ │ │ │ -size_type offset() const │ │ │ │ │ -Definition: nodes.hh:154 │ │ │ │ │ -Dune::Functions::BasisNodeMixin::size │ │ │ │ │ -size_type size() const │ │ │ │ │ -Definition: nodes.hh:142 │ │ │ │ │ -Dune::Functions::BasisNodeMixin::setOffset │ │ │ │ │ -void setOffset(const size_type offset) │ │ │ │ │ -Definition: nodes.hh:159 │ │ │ │ │ -Dune::Functions::BasisNodeMixin::size_type │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Definition: nodes.hh:128 │ │ │ │ │ -Dune::Functions::BasisNodeMixin::BasisNodeMixin │ │ │ │ │ -BasisNodeMixin() │ │ │ │ │ -Definition: nodes.hh:130 │ │ │ │ │ -Dune::Functions::BasisNodeMixin::setSize │ │ │ │ │ -void setSize(const size_type size) │ │ │ │ │ -Definition: nodes.hh:164 │ │ │ │ │ -Dune::Functions::BasisNodeMixin::setTreeIndex │ │ │ │ │ -void setTreeIndex(size_type treeIndex) │ │ │ │ │ -Definition: nodes.hh:169 │ │ │ │ │ -Dune::Functions::LeafBasisNode │ │ │ │ │ -Definition: nodes.hh:186 │ │ │ │ │ -Dune::Functions::PowerBasisNode │ │ │ │ │ -Definition: nodes.hh:193 │ │ │ │ │ -Dune::Functions::PowerBasisNode::element │ │ │ │ │ -const Element & element() const │ │ │ │ │ -Definition: nodes.hh:207 │ │ │ │ │ -Dune::Functions::PowerBasisNode::Element │ │ │ │ │ -typename T::Element Element │ │ │ │ │ -Definition: nodes.hh:199 │ │ │ │ │ -Dune::Functions::PowerBasisNode::PowerBasisNode │ │ │ │ │ -PowerBasisNode(const typename Node::NodeStorage &children) │ │ │ │ │ -Definition: nodes.hh:203 │ │ │ │ │ -Dune::Functions::PowerBasisNode::PowerBasisNode │ │ │ │ │ -PowerBasisNode()=default │ │ │ │ │ -Dune::Functions::CompositeBasisNode │ │ │ │ │ -Definition: nodes.hh:219 │ │ │ │ │ -Dune::Functions::CompositeBasisNode::CompositeBasisNode │ │ │ │ │ -CompositeBasisNode()=default │ │ │ │ │ -Dune::Functions::CompositeBasisNode::CompositeBasisNode │ │ │ │ │ -CompositeBasisNode(const typename Node::NodeStorage &children) │ │ │ │ │ -Definition: nodes.hh:229 │ │ │ │ │ -Dune::Functions::CompositeBasisNode::element │ │ │ │ │ -const Element & element() const │ │ │ │ │ -Definition: nodes.hh:238 │ │ │ │ │ -Dune::Functions::CompositeBasisNode::Element │ │ │ │ │ -typename Node::template Child< 0 >::Type::Element Element │ │ │ │ │ -Definition: nodes.hh:225 │ │ │ │ │ -Dune::Functions::CompositeBasisNode::CompositeBasisNode │ │ │ │ │ -CompositeBasisNode(const std::shared_ptr< Children > &... children) │ │ │ │ │ -Definition: nodes.hh:234 │ │ │ │ │ +Dune::Functions::sizeInfo │ │ │ │ │ +SizeInfo< Basis > sizeInfo(const Basis &basis) │ │ │ │ │ +Definition: sizeinfo.hh:69 │ │ │ │ │ +Dune::Functions::SizeInfo │ │ │ │ │ +A class encapsulating size information. │ │ │ │ │ +Definition: sizeinfo.hh:25 │ │ │ │ │ +Dune::Functions::SizeInfo::SizePrefix │ │ │ │ │ +typename Basis::SizePrefix SizePrefix │ │ │ │ │ +Definition: sizeinfo.hh:29 │ │ │ │ │ +Dune::Functions::SizeInfo::size │ │ │ │ │ +size_type size(const SizePrefix &prefix) const │ │ │ │ │ +Return number possible values for next position in multi index. │ │ │ │ │ +Definition: sizeinfo.hh:52 │ │ │ │ │ +Dune::Functions::SizeInfo::operator() │ │ │ │ │ +size_type operator()(const SizePrefix &prefix) const │ │ │ │ │ +Return number possible values for next position in multi index. │ │ │ │ │ +Definition: sizeinfo.hh:41 │ │ │ │ │ +Dune::Functions::SizeInfo::size_type │ │ │ │ │ +typename Basis::size_type size_type │ │ │ │ │ +Definition: sizeinfo.hh:28 │ │ │ │ │ +Dune::Functions::SizeInfo::Basis │ │ │ │ │ +B Basis │ │ │ │ │ +Definition: sizeinfo.hh:27 │ │ │ │ │ +Dune::Functions::SizeInfo::SizeInfo │ │ │ │ │ +SizeInfo(const Basis &basis) │ │ │ │ │ +Construct from basis. │ │ │ │ │ +Definition: sizeinfo.hh:34 │ │ │ │ │ +Dune::Functions::SizeInfo::basis_ │ │ │ │ │ +const Basis * basis_ │ │ │ │ │ +Definition: sizeinfo.hh:64 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00113.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: flatmultiindex.hh File Reference │ │ │ │ +dune-functions: rannacherturekbasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,37 +63,61 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces | │ │ │ │ -Typedefs
│ │ │ │ -
flatmultiindex.hh File Reference
│ │ │ │ +Typedefs | │ │ │ │ +Functions
│ │ │ │ +
rannacherturekbasis.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <array>
│ │ │ │ -#include <dune/functions/common/multiindex.hh>
│ │ │ │ +
#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/grid/common/capabilities.hh>
│ │ │ │ +#include <dune/localfunctions/common/localfiniteelementvariant.hh>
│ │ │ │ +#include <dune/localfunctions/rannacherturek.hh>
│ │ │ │ +#include <dune/localfunctions/crouzeixraviart.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ +Classes

class  Dune::Functions::RannacherTurekPreBasis< GV >
 Pre-basis for a Rannacher-Turek basis. More...
 
class  Dune::Functions::RannacherTurekNode< GV >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
namespace  Dune::Functions::BasisFactory
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ Typedefs

template<class size_type >
using Dune::Functions::FlatMultiIndex = StaticMultiIndex< size_type, 1 >
 A multi-index class with only one level. More...
 
template<typename GV >
using Dune::Functions::RannacherTurekBasis = DefaultGlobalBasis< RannacherTurekPreBasis< GV > >
 Rannacher-Turek basis. More...
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<class Dummy = void>
auto Dune::Functions::BasisFactory::rannacherTurek ()
 Create a pre-basis factory that can create a Rannacher-Turek pre-basis. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,25 +5,45 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -Namespaces | Typedefs │ │ │ │ │ -flatmultiindex.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Typedefs | Functions │ │ │ │ │ +rannacherturekbasis.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ + Classes │ │ │ │ │ +class  Dune::Functions::RannacherTurekPreBasis<_GV_> │ │ │ │ │ +  Pre-basis for a Rannacher-Turek basis. More... │ │ │ │ │ +  │ │ │ │ │ +class  Dune::Functions::RannacherTurekNode<_GV_> │ │ │ │ │ +  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ +namespace  Dune::Functions::BasisFactory │ │ │ │ │ +  │ │ │ │ │ Typedefs │ │ │ │ │ -template │ │ │ │ │ -using Dune::Functions::FlatMultiIndex = StaticMultiIndex< size_type, 1 > │ │ │ │ │ -  A multi-index class with only one level. More... │ │ │ │ │ +template │ │ │ │ │ +using Dune::Functions::RannacherTurekBasis = DefaultGlobalBasis< │ │ │ │ │ + RannacherTurekPreBasis< GV > > │ │ │ │ │ +  Rannacher-Turek basis. More... │ │ │ │ │ +  │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::BasisFactory::rannacherTurek () │ │ │ │ │ +  Create a pre-basis factory that can create a Rannacher-Turek pre-basis. │ │ │ │ │ + More... │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00113_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: flatmultiindex.hh Source File │ │ │ │ +dune-functions: rannacherturekbasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,43 +62,251 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
flatmultiindex.hh
│ │ │ │ +
rannacherturekbasis.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATMULTIINDEX_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATMULTIINDEX_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH
│ │ │ │
5
│ │ │ │ -
6#include <array>
│ │ │ │ +
6#include <dune/common/exceptions.hh>
│ │ │ │
7
│ │ │ │ - │ │ │ │ +
8#include <dune/grid/common/capabilities.hh>
│ │ │ │
9
│ │ │ │ -
10namespace Dune {
│ │ │ │ -
11namespace Functions {
│ │ │ │ -
12
│ │ │ │ +
10#include <dune/localfunctions/common/localfiniteelementvariant.hh>
│ │ │ │ +
11#include <dune/localfunctions/rannacherturek.hh>
│ │ │ │ +
12#include <dune/localfunctions/crouzeixraviart.hh>
│ │ │ │
13
│ │ │ │ -
14
│ │ │ │ -
30template<class size_type>
│ │ │ │ - │ │ │ │ -
32
│ │ │ │ -
33
│ │ │ │ + │ │ │ │ + │ │ │ │ +
16
│ │ │ │ +
17
│ │ │ │ +
18namespace Dune {
│ │ │ │ +
19namespace Functions {
│ │ │ │ +
20
│ │ │ │ +
21// *****************************************************************************
│ │ │ │ +
22// This is the reusable part of the basis. It contains
│ │ │ │ +
23//
│ │ │ │ +
24// RannacherTurekPreBasis
│ │ │ │ +
25// RannacherTurekNode
│ │ │ │ +
26//
│ │ │ │ +
27// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ +
28// state. These components do _not_ depend on the global basis and local view
│ │ │ │ +
29// and can be used without a global basis.
│ │ │ │ +
30// *****************************************************************************
│ │ │ │ +
31
│ │ │ │ +
32template<typename GV>
│ │ │ │ +
33class RannacherTurekNode;
│ │ │ │
34
│ │ │ │ -
35} // end namespace Functions
│ │ │ │ -
36} // end namespace Dune
│ │ │ │ +
35template<typename GV>
│ │ │ │ +
36class RannacherTurekPreBasis;
│ │ │ │
37
│ │ │ │ -
38#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATMULTIINDEX_HH
│ │ │ │ - │ │ │ │ +
50template<typename GV>
│ │ │ │ + │ │ │ │ +
52{
│ │ │ │ +
53 static const int dim = GV::dimension;
│ │ │ │ +
54
│ │ │ │ +
55public:
│ │ │ │ +
56
│ │ │ │ +
58 using GridView = GV;
│ │ │ │ +
59
│ │ │ │ +
61 using size_type = std::size_t;
│ │ │ │ +
62
│ │ │ │ + │ │ │ │ +
65
│ │ │ │ +
66 static constexpr size_type maxMultiIndexSize = 1;
│ │ │ │ +
67 static constexpr size_type minMultiIndexSize = 1;
│ │ │ │ +
68 static constexpr size_type multiIndexBufferSize = 1;
│ │ │ │ +
69
│ │ │ │ + │ │ │ │ +
72 gridView_(gv)
│ │ │ │ +
73 {
│ │ │ │ +
74 for(auto type : gv.indexSet().types(0))
│ │ │ │ +
75 if (!type.isSimplex() && !type.isCube())
│ │ │ │ +
76 DUNE_THROW(Dune::NotImplemented, "Rannacher-Turek or Crouzeix-Raviart elements are only implemented for grids with simplex or cube elements.");
│ │ │ │ +
77 }
│ │ │ │ +
78
│ │ │ │ + │ │ │ │ +
81 {}
│ │ │ │ +
82
│ │ │ │ +
84 const GridView& gridView() const
│ │ │ │ +
85 {
│ │ │ │ +
86 return gridView_;
│ │ │ │ +
87 }
│ │ │ │ +
88
│ │ │ │ +
90 void update (const GridView& gv)
│ │ │ │ +
91 {
│ │ │ │ +
92 gridView_ = gv;
│ │ │ │ +
93 }
│ │ │ │ +
94
│ │ │ │ +
98 Node makeNode() const
│ │ │ │ +
99 {
│ │ │ │ +
100 return Node{};
│ │ │ │ +
101 }
│ │ │ │ +
102
│ │ │ │ + │ │ │ │ +
105 {
│ │ │ │ +
106 return (size_type)(gridView_.size(1));
│ │ │ │ +
107 }
│ │ │ │ +
108
│ │ │ │ +
110 template<class SizePrefix>
│ │ │ │ +
111 size_type size(const SizePrefix prefix) const
│ │ │ │ +
112 {
│ │ │ │ +
113 assert(prefix.size() == 0 || prefix.size() == 1);
│ │ │ │ +
114 return (prefix.size() == 0) ? size() : 0;
│ │ │ │ +
115 }
│ │ │ │ +
116
│ │ │ │ + │ │ │ │ +
119 {
│ │ │ │ +
120 return size();
│ │ │ │ +
121 }
│ │ │ │ +
122
│ │ │ │ + │ │ │ │ +
125 {
│ │ │ │ +
126 return 2*GV::dimension;
│ │ │ │ +
127 }
│ │ │ │ +
128
│ │ │ │ +
129 template<typename It>
│ │ │ │ +
130 It indices(const Node& node, It it) const
│ │ │ │ +
131 {
│ │ │ │ +
132 for (size_type i = 0, end = node.size() ; i < end ; ++i, ++it)
│ │ │ │ +
133 {
│ │ │ │ +
134 Dune::LocalKey localKey = node.finiteElement().localCoefficients().localKey(i);
│ │ │ │ +
135 const auto& gridIndexSet = gridView().indexSet();
│ │ │ │ +
136 const auto& element = node.element();
│ │ │ │ +
137
│ │ │ │ +
138 *it = {{ (size_type)(gridIndexSet.subIndex(element,localKey.subEntity(),1)) }};
│ │ │ │ +
139 }
│ │ │ │ +
140 return it;
│ │ │ │ +
141 }
│ │ │ │ +
142
│ │ │ │ +
143protected:
│ │ │ │ + │ │ │ │ +
145};
│ │ │ │ +
146
│ │ │ │ +
147
│ │ │ │ +
148
│ │ │ │ +
149template<typename GV>
│ │ │ │ + │ │ │ │ +
151 public LeafBasisNode
│ │ │ │ +
152{
│ │ │ │ +
153 static const int dim = GV::dimension;
│ │ │ │ +
154 static const int maxSize = 2*dim;
│ │ │ │ +
155
│ │ │ │ +
156 constexpr static bool hasFixedElementType = Capabilities::hasSingleGeometryType<typename GV::Grid>::v;
│ │ │ │ +
157
│ │ │ │ +
158 using CubeFiniteElement = RannacherTurekLocalFiniteElement<typename GV::ctype,double,dim>;
│ │ │ │ +
159 using SimplexFiniteElement = CrouzeixRaviartLocalFiniteElement<typename GV::ctype,double,dim>;
│ │ │ │ +
160
│ │ │ │ +
161 constexpr static unsigned int topologyId = Capabilities::hasSingleGeometryType<typename GV::Grid>::topologyId; // meaningless if hasFixedElementType is false
│ │ │ │ +
162 constexpr static GeometryType type = GeometryType(topologyId, GV::dimension);
│ │ │ │ +
163
│ │ │ │ +
164public:
│ │ │ │ +
165
│ │ │ │ +
166 using size_type = std::size_t;
│ │ │ │ +
167 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ +
168 using FiniteElement = std::conditional_t<hasFixedElementType,
│ │ │ │ +
169 std::conditional_t<type.isCube(),CubeFiniteElement,SimplexFiniteElement>,
│ │ │ │ +
170 LocalFiniteElementVariant<CubeFiniteElement, SimplexFiniteElement> >;
│ │ │ │ +
171
│ │ │ │ + │ │ │ │ + │ │ │ │ +
174 element_(nullptr)
│ │ │ │ +
175 {}
│ │ │ │ +
176
│ │ │ │ +
178 const Element& element() const
│ │ │ │ +
179 {
│ │ │ │ +
180 return *element_;
│ │ │ │ +
181 }
│ │ │ │ +
182
│ │ │ │ + │ │ │ │ +
188 {
│ │ │ │ +
189 return finiteElement_;
│ │ │ │ +
190 }
│ │ │ │ +
191
│ │ │ │ +
193 void bind(const Element& e)
│ │ │ │ +
194 {
│ │ │ │ +
195 element_ = &e;
│ │ │ │ +
196 if constexpr (!hasFixedElementType)
│ │ │ │ +
197 finiteElement_ = e.type().isCube() ? static_cast<FiniteElement>(CubeFiniteElement())
│ │ │ │ +
198 : static_cast<FiniteElement>(SimplexFiniteElement()) ;
│ │ │ │ +
199 this->setSize(finiteElement_.size());
│ │ │ │ +
200 }
│ │ │ │ +
201
│ │ │ │ +
202protected:
│ │ │ │ +
203
│ │ │ │ + │ │ │ │ + │ │ │ │ +
206};
│ │ │ │ +
207
│ │ │ │ +
208
│ │ │ │ +
209
│ │ │ │ +
210namespace BasisFactory {
│ │ │ │ +
211
│ │ │ │ +
217template<class Dummy=void>
│ │ │ │ + │ │ │ │ +
219{
│ │ │ │ +
220 return [](const auto& gridView) {
│ │ │ │ +
221 return RannacherTurekPreBasis<std::decay_t<decltype(gridView)>>(gridView);
│ │ │ │ +
222 };
│ │ │ │ +
223}
│ │ │ │ +
224
│ │ │ │ +
225} // end namespace BasisFactory
│ │ │ │ +
226
│ │ │ │ +
227
│ │ │ │ +
228
│ │ │ │ +
229
│ │ │ │ +
241template<typename GV>
│ │ │ │ + │ │ │ │ +
243
│ │ │ │ +
244} // end namespace Functions
│ │ │ │ +
245} // end namespace Dune
│ │ │ │ +
246
│ │ │ │ +
247#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ +
auto rannacherTurek()
Create a pre-basis factory that can create a Rannacher-Turek pre-basis.
Definition: rannacherturekbasis.hh:218
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
A statically sized MultiIndex type.
Definition: multiindex.hh:49
│ │ │ │ +
Global basis for given pre-basis.
Definition: defaultglobalbasis.hh:46
│ │ │ │ +
size_type size() const
Definition: nodes.hh:142
│ │ │ │ +
std::size_t size_type
Definition: nodes.hh:128
│ │ │ │ +
void setSize(const size_type size)
Definition: nodes.hh:164
│ │ │ │ +
Definition: nodes.hh:186
│ │ │ │ +
Definition: rannacherturekbasis.hh:152
│ │ │ │ +
std::conditional_t< hasFixedElementType, std::conditional_t< type.isCube(), CubeFiniteElement, SimplexFiniteElement >, LocalFiniteElementVariant< CubeFiniteElement, SimplexFiniteElement > > FiniteElement
Definition: rannacherturekbasis.hh:170
│ │ │ │ +
void bind(const Element &e)
Bind to element.
Definition: rannacherturekbasis.hh:193
│ │ │ │ +
FiniteElement finiteElement_
Definition: rannacherturekbasis.hh:204
│ │ │ │ +
typename GV::template Codim< 0 >::Entity Element
Definition: rannacherturekbasis.hh:167
│ │ │ │ +
RannacherTurekNode()
Definition: rannacherturekbasis.hh:172
│ │ │ │ +
const Element * element_
Definition: rannacherturekbasis.hh:205
│ │ │ │ +
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition: rannacherturekbasis.hh:187
│ │ │ │ +
const Element & element() const
Return current element, throw if unbound.
Definition: rannacherturekbasis.hh:178
│ │ │ │ +
Pre-basis for a Rannacher-Turek basis.
Definition: rannacherturekbasis.hh:52
│ │ │ │ +
static constexpr size_type multiIndexBufferSize
Definition: rannacherturekbasis.hh:68
│ │ │ │ +
void initializeIndices()
Initialize the global indices.
Definition: rannacherturekbasis.hh:80
│ │ │ │ +
static constexpr size_type maxMultiIndexSize
Definition: rannacherturekbasis.hh:66
│ │ │ │ +
static constexpr size_type minMultiIndexSize
Definition: rannacherturekbasis.hh:67
│ │ │ │ +
size_type size(const SizePrefix prefix) const
Return number of possible values for next position in multi index.
Definition: rannacherturekbasis.hh:111
│ │ │ │ +
std::size_t size_type
Type used for indices and size information.
Definition: rannacherturekbasis.hh:61
│ │ │ │ +
Node makeNode() const
Create tree node.
Definition: rannacherturekbasis.hh:98
│ │ │ │ +
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition: rannacherturekbasis.hh:90
│ │ │ │ +
It indices(const Node &node, It it) const
Definition: rannacherturekbasis.hh:130
│ │ │ │ +
GV GridView
The grid view that the FE basis is defined on.
Definition: rannacherturekbasis.hh:58
│ │ │ │ +
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition: rannacherturekbasis.hh:118
│ │ │ │ +
RannacherTurekPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition: rannacherturekbasis.hh:71
│ │ │ │ +
size_type size() const
Same as size(prefix) with empty prefix.
Definition: rannacherturekbasis.hh:104
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: rannacherturekbasis.hh:84
│ │ │ │ +
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition: rannacherturekbasis.hh:124
│ │ │ │ +
GridView gridView_
Definition: rannacherturekbasis.hh:144
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,41 +5,340 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -flatmultiindex.hh │ │ │ │ │ +rannacherturekbasis.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATMULTIINDEX_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATMULTIINDEX_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ + 6#include │ │ │ │ │ 7 │ │ │ │ │ - 8#include │ │ │ │ │ + 8#include │ │ │ │ │ 9 │ │ │ │ │ - 10namespace Dune { │ │ │ │ │ - 11namespace Functions { │ │ │ │ │ - 12 │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ 13 │ │ │ │ │ - 14 │ │ │ │ │ - 30template │ │ │ │ │ -31using FlatMultiIndex = StaticMultiIndex; │ │ │ │ │ - 32 │ │ │ │ │ - 33 │ │ │ │ │ + 14#include │ │ │ │ │ + 15#include │ │ │ │ │ + 16 │ │ │ │ │ + 17 │ │ │ │ │ + 18namespace Dune { │ │ │ │ │ + 19namespace Functions { │ │ │ │ │ + 20 │ │ │ │ │ + 21/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ + 22// This is the reusable part of the basis. It contains │ │ │ │ │ + 23// │ │ │ │ │ + 24// RannacherTurekPreBasis │ │ │ │ │ + 25// RannacherTurekNode │ │ │ │ │ + 26// │ │ │ │ │ + 27// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ +shared │ │ │ │ │ + 28// state. These components do _not_ depend on the global basis and local │ │ │ │ │ +view │ │ │ │ │ + 29// and can be used without a global basis. │ │ │ │ │ + 30/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ + 31 │ │ │ │ │ + 32template │ │ │ │ │ + 33class RannacherTurekNode; │ │ │ │ │ 34 │ │ │ │ │ - 35} // end namespace Functions │ │ │ │ │ - 36} // end namespace Dune │ │ │ │ │ + 35template │ │ │ │ │ + 36class RannacherTurekPreBasis; │ │ │ │ │ 37 │ │ │ │ │ - 38#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATMULTIINDEX_HH │ │ │ │ │ -multiindex.hh │ │ │ │ │ + 50template │ │ │ │ │ +51class RannacherTurekPreBasis │ │ │ │ │ + 52{ │ │ │ │ │ + 53 static const int dim = GV::dimension; │ │ │ │ │ + 54 │ │ │ │ │ + 55public: │ │ │ │ │ + 56 │ │ │ │ │ +58 using GridView = GV; │ │ │ │ │ + 59 │ │ │ │ │ +61 using size_type = std::size_t; │ │ │ │ │ + 62 │ │ │ │ │ +64 using Node = RannacherTurekNode; │ │ │ │ │ + 65 │ │ │ │ │ +66 static constexpr size_type maxMultiIndexSize = 1; │ │ │ │ │ +67 static constexpr size_type minMultiIndexSize = 1; │ │ │ │ │ +68 static constexpr size_type multiIndexBufferSize = 1; │ │ │ │ │ + 69 │ │ │ │ │ +71 RannacherTurekPreBasis(const GridView& gv) : │ │ │ │ │ + 72 gridView_(gv) │ │ │ │ │ + 73 { │ │ │ │ │ + 74 for(auto type : gv.indexSet().types(0)) │ │ │ │ │ + 75 if (!type.isSimplex() && !type.isCube()) │ │ │ │ │ + 76 DUNE_THROW(Dune::NotImplemented, "Rannacher-Turek or Crouzeix-Raviart │ │ │ │ │ +elements are only implemented for grids with simplex or cube elements."); │ │ │ │ │ + 77 } │ │ │ │ │ + 78 │ │ │ │ │ +80 void initializeIndices() │ │ │ │ │ + 81 {} │ │ │ │ │ + 82 │ │ │ │ │ +84 const GridView& gridView() const │ │ │ │ │ + 85 { │ │ │ │ │ + 86 return gridView_; │ │ │ │ │ + 87 } │ │ │ │ │ + 88 │ │ │ │ │ +90 void update (const GridView& gv) │ │ │ │ │ + 91 { │ │ │ │ │ + 92 gridView_ = gv; │ │ │ │ │ + 93 } │ │ │ │ │ + 94 │ │ │ │ │ +98 Node makeNode() const │ │ │ │ │ + 99 { │ │ │ │ │ + 100 return Node{}; │ │ │ │ │ + 101 } │ │ │ │ │ + 102 │ │ │ │ │ +104 size_type size() const │ │ │ │ │ + 105 { │ │ │ │ │ + 106 return (size_type)(gridView_.size(1)); │ │ │ │ │ + 107 } │ │ │ │ │ + 108 │ │ │ │ │ + 110 template │ │ │ │ │ +111 size_type size(const SizePrefix prefix) const │ │ │ │ │ + 112 { │ │ │ │ │ + 113 assert(prefix.size() == 0 || prefix.size() == 1); │ │ │ │ │ + 114 return (prefix.size() == 0) ? size() : 0; │ │ │ │ │ + 115 } │ │ │ │ │ + 116 │ │ │ │ │ +118 size_type dimension() const │ │ │ │ │ + 119 { │ │ │ │ │ + 120 return size(); │ │ │ │ │ + 121 } │ │ │ │ │ + 122 │ │ │ │ │ +124 size_type maxNodeSize() const │ │ │ │ │ + 125 { │ │ │ │ │ + 126 return 2*GV::dimension; │ │ │ │ │ + 127 } │ │ │ │ │ + 128 │ │ │ │ │ + 129 template │ │ │ │ │ +130 It indices(const Node& node, It it) const │ │ │ │ │ + 131 { │ │ │ │ │ + 132 for (size_type i = 0, end = node.size() ; i < end ; ++i, ++it) │ │ │ │ │ + 133 { │ │ │ │ │ + 134 Dune::LocalKey localKey = node.finiteElement().localCoefficients │ │ │ │ │ +().localKey(i); │ │ │ │ │ + 135 const auto& gridIndexSet = gridView().indexSet(); │ │ │ │ │ + 136 const auto& element = node.element(); │ │ │ │ │ + 137 │ │ │ │ │ + 138 *it = {{ (size_type)(gridIndexSet.subIndex(element,localKey.subEntity │ │ │ │ │ +(),1)) }}; │ │ │ │ │ + 139 } │ │ │ │ │ + 140 return it; │ │ │ │ │ + 141 } │ │ │ │ │ + 142 │ │ │ │ │ + 143protected: │ │ │ │ │ +144 GridView gridView_; │ │ │ │ │ + 145}; │ │ │ │ │ + 146 │ │ │ │ │ + 147 │ │ │ │ │ + 148 │ │ │ │ │ + 149template │ │ │ │ │ +150class RannacherTurekNode : │ │ │ │ │ + 151 public LeafBasisNode │ │ │ │ │ + 152{ │ │ │ │ │ + 153 static const int dim = GV::dimension; │ │ │ │ │ + 154 static const int maxSize = 2*dim; │ │ │ │ │ + 155 │ │ │ │ │ + 156 constexpr static bool hasFixedElementType = Capabilities:: │ │ │ │ │ +hasSingleGeometryType::v; │ │ │ │ │ + 157 │ │ │ │ │ + 158 using CubeFiniteElement = RannacherTurekLocalFiniteElement; │ │ │ │ │ + 159 using SimplexFiniteElement = CrouzeixRaviartLocalFiniteElement; │ │ │ │ │ + 160 │ │ │ │ │ + 161 constexpr static unsigned int topologyId = Capabilities:: │ │ │ │ │ +hasSingleGeometryType::topologyId; // meaningless if │ │ │ │ │ +hasFixedElementType is false │ │ │ │ │ + 162 constexpr static GeometryType type = GeometryType(topologyId, GV:: │ │ │ │ │ +dimension); │ │ │ │ │ + 163 │ │ │ │ │ + 164public: │ │ │ │ │ + 165 │ │ │ │ │ +166 using size_type = std::size_t; │ │ │ │ │ +167 using Element = typename GV::template Codim<0>::Entity; │ │ │ │ │ +168 using FiniteElement = std::conditional_t, │ │ │ │ │ + 170 LocalFiniteElementVariant >; │ │ │ │ │ + 171 │ │ │ │ │ +172 RannacherTurekNode() : │ │ │ │ │ + 173 finiteElement_(), │ │ │ │ │ + 174 element_(nullptr) │ │ │ │ │ + 175 {} │ │ │ │ │ + 176 │ │ │ │ │ +178 const Element& element() const │ │ │ │ │ + 179 { │ │ │ │ │ + 180 return *element_; │ │ │ │ │ + 181 } │ │ │ │ │ + 182 │ │ │ │ │ +187 const FiniteElement& finiteElement() const │ │ │ │ │ + 188 { │ │ │ │ │ + 189 return finiteElement_; │ │ │ │ │ + 190 } │ │ │ │ │ + 191 │ │ │ │ │ +193 void bind(const Element& e) │ │ │ │ │ + 194 { │ │ │ │ │ + 195 element_ = &e; │ │ │ │ │ + 196 if constexpr (!hasFixedElementType) │ │ │ │ │ + 197 finiteElement_ = e.type().isCube() ? static_cast │ │ │ │ │ +(CubeFiniteElement()) │ │ │ │ │ + 198 : static_cast(SimplexFiniteElement()) ; │ │ │ │ │ + 199 this->setSize(finiteElement_.size()); │ │ │ │ │ + 200 } │ │ │ │ │ + 201 │ │ │ │ │ + 202protected: │ │ │ │ │ + 203 │ │ │ │ │ +204 FiniteElement finiteElement_; │ │ │ │ │ +205 const Element* element_; │ │ │ │ │ + 206}; │ │ │ │ │ + 207 │ │ │ │ │ + 208 │ │ │ │ │ + 209 │ │ │ │ │ + 210namespace BasisFactory { │ │ │ │ │ + 211 │ │ │ │ │ + 217template │ │ │ │ │ +218auto rannacherTurek() │ │ │ │ │ + 219{ │ │ │ │ │ + 220 return [](const auto& gridView) { │ │ │ │ │ + 221 return RannacherTurekPreBasis>(gridView); │ │ │ │ │ + 222 }; │ │ │ │ │ + 223} │ │ │ │ │ + 224 │ │ │ │ │ + 225} // end namespace BasisFactory │ │ │ │ │ + 226 │ │ │ │ │ + 227 │ │ │ │ │ + 228 │ │ │ │ │ + 229 │ │ │ │ │ + 241template │ │ │ │ │ +242using RannacherTurekBasis = DefaultGlobalBasis >; │ │ │ │ │ + 243 │ │ │ │ │ + 244} // end namespace Functions │ │ │ │ │ + 245} // end namespace Dune │ │ │ │ │ + 246 │ │ │ │ │ + 247#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH │ │ │ │ │ +nodes.hh │ │ │ │ │ +defaultglobalbasis.hh │ │ │ │ │ +Dune::Functions::BasisFactory::rannacherTurek │ │ │ │ │ +auto rannacherTurek() │ │ │ │ │ +Create a pre-basis factory that can create a Rannacher-Turek pre-basis. │ │ │ │ │ +Definition: rannacherturekbasis.hh:218 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::StaticMultiIndex<_size_type,_1_> │ │ │ │ │ -A statically sized MultiIndex type. │ │ │ │ │ -Definition: multiindex.hh:49 │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis │ │ │ │ │ +Global basis for given pre-basis. │ │ │ │ │ +Definition: defaultglobalbasis.hh:46 │ │ │ │ │ +Dune::Functions::BasisNodeMixin::size │ │ │ │ │ +size_type size() const │ │ │ │ │ +Definition: nodes.hh:142 │ │ │ │ │ +Dune::Functions::BasisNodeMixin::size_type │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +Definition: nodes.hh:128 │ │ │ │ │ +Dune::Functions::BasisNodeMixin::setSize │ │ │ │ │ +void setSize(const size_type size) │ │ │ │ │ +Definition: nodes.hh:164 │ │ │ │ │ +Dune::Functions::LeafBasisNode │ │ │ │ │ +Definition: nodes.hh:186 │ │ │ │ │ +Dune::Functions::RannacherTurekNode │ │ │ │ │ +Definition: rannacherturekbasis.hh:152 │ │ │ │ │ +Dune::Functions::RannacherTurekNode::FiniteElement │ │ │ │ │ +std::conditional_t< hasFixedElementType, std::conditional_t< type.isCube(), │ │ │ │ │ +CubeFiniteElement, SimplexFiniteElement >, LocalFiniteElementVariant< │ │ │ │ │ +CubeFiniteElement, SimplexFiniteElement > > FiniteElement │ │ │ │ │ +Definition: rannacherturekbasis.hh:170 │ │ │ │ │ +Dune::Functions::RannacherTurekNode::bind │ │ │ │ │ +void bind(const Element &e) │ │ │ │ │ +Bind to element. │ │ │ │ │ +Definition: rannacherturekbasis.hh:193 │ │ │ │ │ +Dune::Functions::RannacherTurekNode::finiteElement_ │ │ │ │ │ +FiniteElement finiteElement_ │ │ │ │ │ +Definition: rannacherturekbasis.hh:204 │ │ │ │ │ +Dune::Functions::RannacherTurekNode::Element │ │ │ │ │ +typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ +Definition: rannacherturekbasis.hh:167 │ │ │ │ │ +Dune::Functions::RannacherTurekNode::RannacherTurekNode │ │ │ │ │ +RannacherTurekNode() │ │ │ │ │ +Definition: rannacherturekbasis.hh:172 │ │ │ │ │ +Dune::Functions::RannacherTurekNode::element_ │ │ │ │ │ +const Element * element_ │ │ │ │ │ +Definition: rannacherturekbasis.hh:205 │ │ │ │ │ +Dune::Functions::RannacherTurekNode::finiteElement │ │ │ │ │ +const FiniteElement & finiteElement() const │ │ │ │ │ +Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ +Definition: rannacherturekbasis.hh:187 │ │ │ │ │ +Dune::Functions::RannacherTurekNode::element │ │ │ │ │ +const Element & element() const │ │ │ │ │ +Return current element, throw if unbound. │ │ │ │ │ +Definition: rannacherturekbasis.hh:178 │ │ │ │ │ +Dune::Functions::RannacherTurekPreBasis │ │ │ │ │ +Pre-basis for a Rannacher-Turek basis. │ │ │ │ │ +Definition: rannacherturekbasis.hh:52 │ │ │ │ │ +Dune::Functions::RannacherTurekPreBasis::multiIndexBufferSize │ │ │ │ │ +static constexpr size_type multiIndexBufferSize │ │ │ │ │ +Definition: rannacherturekbasis.hh:68 │ │ │ │ │ +Dune::Functions::RannacherTurekPreBasis::initializeIndices │ │ │ │ │ +void initializeIndices() │ │ │ │ │ +Initialize the global indices. │ │ │ │ │ +Definition: rannacherturekbasis.hh:80 │ │ │ │ │ +Dune::Functions::RannacherTurekPreBasis::maxMultiIndexSize │ │ │ │ │ +static constexpr size_type maxMultiIndexSize │ │ │ │ │ +Definition: rannacherturekbasis.hh:66 │ │ │ │ │ +Dune::Functions::RannacherTurekPreBasis::minMultiIndexSize │ │ │ │ │ +static constexpr size_type minMultiIndexSize │ │ │ │ │ +Definition: rannacherturekbasis.hh:67 │ │ │ │ │ +Dune::Functions::RannacherTurekPreBasis::size │ │ │ │ │ +size_type size(const SizePrefix prefix) const │ │ │ │ │ +Return number of possible values for next position in multi index. │ │ │ │ │ +Definition: rannacherturekbasis.hh:111 │ │ │ │ │ +Dune::Functions::RannacherTurekPreBasis::size_type │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +Type used for indices and size information. │ │ │ │ │ +Definition: rannacherturekbasis.hh:61 │ │ │ │ │ +Dune::Functions::RannacherTurekPreBasis::makeNode │ │ │ │ │ +Node makeNode() const │ │ │ │ │ +Create tree node. │ │ │ │ │ +Definition: rannacherturekbasis.hh:98 │ │ │ │ │ +Dune::Functions::RannacherTurekPreBasis::update │ │ │ │ │ +void update(const GridView &gv) │ │ │ │ │ +Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ +Definition: rannacherturekbasis.hh:90 │ │ │ │ │ +Dune::Functions::RannacherTurekPreBasis::indices │ │ │ │ │ +It indices(const Node &node, It it) const │ │ │ │ │ +Definition: rannacherturekbasis.hh:130 │ │ │ │ │ +Dune::Functions::RannacherTurekPreBasis::GridView │ │ │ │ │ +GV GridView │ │ │ │ │ +The grid view that the FE basis is defined on. │ │ │ │ │ +Definition: rannacherturekbasis.hh:58 │ │ │ │ │ +Dune::Functions::RannacherTurekPreBasis::dimension │ │ │ │ │ +size_type dimension() const │ │ │ │ │ +Get the total dimension of the space spanned by this basis. │ │ │ │ │ +Definition: rannacherturekbasis.hh:118 │ │ │ │ │ +Dune::Functions::RannacherTurekPreBasis::RannacherTurekPreBasis │ │ │ │ │ +RannacherTurekPreBasis(const GridView &gv) │ │ │ │ │ +Constructor for a given grid view object. │ │ │ │ │ +Definition: rannacherturekbasis.hh:71 │ │ │ │ │ +Dune::Functions::RannacherTurekPreBasis::size │ │ │ │ │ +size_type size() const │ │ │ │ │ +Same as size(prefix) with empty prefix. │ │ │ │ │ +Definition: rannacherturekbasis.hh:104 │ │ │ │ │ +Dune::Functions::RannacherTurekPreBasis::gridView │ │ │ │ │ +const GridView & gridView() const │ │ │ │ │ +Obtain the grid view that the basis is defined on. │ │ │ │ │ +Definition: rannacherturekbasis.hh:84 │ │ │ │ │ +Dune::Functions::RannacherTurekPreBasis::maxNodeSize │ │ │ │ │ +size_type maxNodeSize() const │ │ │ │ │ +Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ +Definition: rannacherturekbasis.hh:124 │ │ │ │ │ +Dune::Functions::RannacherTurekPreBasis::gridView_ │ │ │ │ │ +GridView gridView_ │ │ │ │ │ +Definition: rannacherturekbasis.hh:144 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00116.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: boundarydofs.hh File Reference │ │ │ │ +dune-functions: nodes.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,37 +63,60 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
boundarydofs.hh File Reference
│ │ │ │ +
nodes.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <utility>
│ │ │ │ -#include <dune/functions/functionspacebases/subentitydofs.hh>
│ │ │ │ +
#include <cassert>
│ │ │ │ +#include <memory>
│ │ │ │ +#include <dune/common/indices.hh>
│ │ │ │ +#include <dune/typetree/leafnode.hh>
│ │ │ │ +#include <dune/typetree/powernode.hh>
│ │ │ │ +#include <dune/typetree/compositenode.hh>
│ │ │ │ +#include <dune/typetree/traversal.hh>
│ │ │ │ +#include <dune/typetree/visitor.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ +Classes

class  Dune::Functions::BasisNodeMixin
 
class  Dune::Functions::LeafBasisNode
 
class  Dune::Functions::PowerBasisNode< T, n >
 
class  Dune::Functions::CompositeBasisNode< T >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<class Basis , class F , decltype(std::declval< std::decay_t< F > >()(0, std::declval< typename Basis::LocalView >(), std::declval< typename Basis::GridView::Intersection >()), 0) = 0>
void Dune::Functions::forEachBoundaryDOF (const Basis &basis, F &&f)
 Loop over all DOFs on the boundary. More...
 
template<typename Tree >
void Dune::Functions::clearSize (Tree &tree, std::size_t offset)
 
template<typename Tree , typename Entity >
void Dune::Functions::bindTree (Tree &tree, const Entity &entity, std::size_t offset=0)
 
template<typename Tree >
void Dune::Functions::initializeTree (Tree &tree, std::size_t treeIndexOffset=0)
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,27 +5,47 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -Namespaces | Functions │ │ │ │ │ -boundarydofs.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Functions │ │ │ │ │ +nodes.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ + Classes │ │ │ │ │ +class  Dune::Functions::BasisNodeMixin │ │ │ │ │ +  │ │ │ │ │ +class  Dune::Functions::LeafBasisNode │ │ │ │ │ +  │ │ │ │ │ +class  Dune::Functions::PowerBasisNode<_T,_n_> │ │ │ │ │ +  │ │ │ │ │ +class  Dune::Functions::CompositeBasisNode<_T_> │ │ │ │ │ +  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ -template >() │ │ │ │ │ -(0, std::declval< typename Basis::LocalView >(), std::declval< typename │ │ │ │ │ -Basis::GridView::Intersection >()), 0) = 0> │ │ │ │ │ -void Dune::Functions::forEachBoundaryDOF (const Basis &basis, F &&f) │ │ │ │ │ -  Loop over all DOFs on the boundary. More... │ │ │ │ │ +template │ │ │ │ │ +void Dune::Functions::clearSize (Tree &tree, std::size_t offset) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void Dune::Functions::bindTree (Tree &tree, const Entity &entity, std::size_t │ │ │ │ │ + offset=0) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void Dune::Functions::initializeTree (Tree &tree, std::size_t │ │ │ │ │ + treeIndexOffset=0) │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00116_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: boundarydofs.hh Source File │ │ │ │ +dune-functions: nodes.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,99 +62,314 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
boundarydofs.hh
│ │ │ │ +
nodes.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BOUNDARYDOFS_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BOUNDARYDOFS_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH
│ │ │ │
5
│ │ │ │ -
6#include <utility>
│ │ │ │ -
7
│ │ │ │ - │ │ │ │ -
9
│ │ │ │ -
10namespace Dune {
│ │ │ │ -
11namespace Functions {
│ │ │ │ -
12
│ │ │ │ -
13
│ │ │ │ -
14
│ │ │ │ -
34template<class Basis, class F,
│ │ │ │ -
35 decltype(std::declval<std::decay_t<F>>()(0, std::declval<typename Basis::LocalView>(),std::declval<typename Basis::GridView::Intersection>()), 0) = 0>
│ │ │ │ -
36void forEachBoundaryDOF(const Basis& basis, F&& f)
│ │ │ │ -
37{
│ │ │ │ -
38 auto localView = basis.localView();
│ │ │ │ -
39 auto seDOFs = subEntityDOFs(basis);
│ │ │ │ -
40 const auto& gridView = basis.gridView();
│ │ │ │ -
41 for(auto&& element : elements(gridView))
│ │ │ │ -
42 if (element.hasBoundaryIntersections())
│ │ │ │ -
43 {
│ │ │ │ -
44 localView.bind(element);
│ │ │ │ -
45 for(const auto& intersection: intersections(gridView, element))
│ │ │ │ -
46 if (intersection.boundary())
│ │ │ │ -
47 for(auto localIndex: seDOFs.bind(localView,intersection))
│ │ │ │ -
48 f(localIndex, localView, intersection);
│ │ │ │ -
49 }
│ │ │ │ -
50}
│ │ │ │ -
51
│ │ │ │ -
52
│ │ │ │ -
53
│ │ │ │ -
71template<class Basis, class F,
│ │ │ │ -
72 decltype(std::declval<std::decay_t<F>>()(0, std::declval<typename Basis::LocalView>()),0) = 0>
│ │ │ │ -
73void forEachBoundaryDOF(const Basis& basis, F&& f)
│ │ │ │ -
74{
│ │ │ │ -
75 auto localView = basis.localView();
│ │ │ │ -
76 auto seDOFs = subEntityDOFs(basis);
│ │ │ │ -
77 const auto& gridView = basis.gridView();
│ │ │ │ -
78 for(auto&& element : elements(gridView))
│ │ │ │ -
79 if (element.hasBoundaryIntersections())
│ │ │ │ -
80 {
│ │ │ │ -
81 localView.bind(element);
│ │ │ │ -
82 for(const auto& intersection: intersections(gridView, element))
│ │ │ │ -
83 if (intersection.boundary())
│ │ │ │ -
84 for(auto localIndex: seDOFs.bind(localView,intersection))
│ │ │ │ -
85 f(localIndex, localView);
│ │ │ │ -
86 }
│ │ │ │ -
87}
│ │ │ │ -
88
│ │ │ │ -
89
│ │ │ │ -
90
│ │ │ │ -
107template<class Basis, class F,
│ │ │ │ -
108 decltype(std::declval<std::decay_t<F>>()(std::declval<typename Basis::MultiIndex>()),0) = 0>
│ │ │ │ -
109void forEachBoundaryDOF(const Basis& basis, F&& f)
│ │ │ │ -
110{
│ │ │ │ -
111 auto localView = basis.localView();
│ │ │ │ -
112 auto seDOFs = subEntityDOFs(basis);
│ │ │ │ -
113 const auto& gridView = basis.gridView();
│ │ │ │ -
114 for(auto&& element : elements(gridView))
│ │ │ │ -
115 if (element.hasBoundaryIntersections())
│ │ │ │ -
116 {
│ │ │ │ -
117 localView.bind(element);
│ │ │ │ -
118 for(const auto& intersection: intersections(gridView, element))
│ │ │ │ -
119 if (intersection.boundary())
│ │ │ │ -
120 for(auto localIndex: seDOFs.bind(localView,intersection))
│ │ │ │ -
121 f(localView.index(localIndex));
│ │ │ │ -
122 }
│ │ │ │ -
123}
│ │ │ │ -
124
│ │ │ │ +
6#include <cassert>
│ │ │ │ +
7#include <memory>
│ │ │ │ +
8
│ │ │ │ +
9#include <dune/common/indices.hh>
│ │ │ │ +
10
│ │ │ │ +
11#include <dune/typetree/leafnode.hh>
│ │ │ │ +
12#include <dune/typetree/powernode.hh>
│ │ │ │ +
13#include <dune/typetree/compositenode.hh>
│ │ │ │ +
14#include <dune/typetree/traversal.hh>
│ │ │ │ +
15#include <dune/typetree/visitor.hh>
│ │ │ │ +
16
│ │ │ │ +
17namespace Dune {
│ │ │ │ +
18 namespace Functions {
│ │ │ │ +
19
│ │ │ │ +
20
│ │ │ │ +
21 namespace Impl {
│ │ │ │ +
22
│ │ │ │ +
23
│ │ │ │ +
24 struct ClearSizeVisitor
│ │ │ │ +
25 : public TypeTree::TreeVisitor
│ │ │ │ +
26 , public TypeTree::DynamicTraversal
│ │ │ │ +
27 {
│ │ │ │ +
28
│ │ │ │ +
29 template<typename Node, typename TreePath>
│ │ │ │ +
30 void pre(Node& node, TreePath treePath)
│ │ │ │ +
31 {
│ │ │ │ +
32 leaf(node,treePath);
│ │ │ │ +
33 node.setSize(0);
│ │ │ │ +
34 }
│ │ │ │ +
35
│ │ │ │ +
36 template<typename Node, typename TreePath>
│ │ │ │ +
37 void leaf(Node& node, TreePath treePath)
│ │ │ │ +
38 {
│ │ │ │ +
39 node.setOffset(offset_);
│ │ │ │ +
40 }
│ │ │ │ +
41
│ │ │ │ +
42 ClearSizeVisitor(std::size_t offset)
│ │ │ │ +
43 : offset_(offset)
│ │ │ │ +
44 {}
│ │ │ │ +
45
│ │ │ │ +
46 const std::size_t offset_;
│ │ │ │ +
47
│ │ │ │ +
48 };
│ │ │ │ +
49
│ │ │ │ +
50
│ │ │ │ +
51 template<typename Entity>
│ │ │ │ +
52 struct BindVisitor
│ │ │ │ +
53 : public TypeTree::TreeVisitor
│ │ │ │ +
54 , public TypeTree::DynamicTraversal
│ │ │ │ +
55 {
│ │ │ │ +
56
│ │ │ │ +
57 template<typename Node, typename TreePath>
│ │ │ │ +
58 void pre(Node& node, TreePath)
│ │ │ │ +
59 {
│ │ │ │ +
60 node.setOffset(offset_);
│ │ │ │ +
61 }
│ │ │ │ +
62
│ │ │ │ +
63 template<typename Node, typename TreePath>
│ │ │ │ +
64 void post(Node& node, TreePath)
│ │ │ │ +
65 {
│ │ │ │ +
66 node.setSize(offset_ - node.offset());
│ │ │ │ +
67 }
│ │ │ │ +
68
│ │ │ │ +
69 template<typename Node, typename TreePath>
│ │ │ │ +
70 void leaf(Node& node, TreePath)
│ │ │ │ +
71 {
│ │ │ │ +
72 node.setOffset(offset_);
│ │ │ │ +
73 node.bind(entity_);
│ │ │ │ +
74 offset_ += node.size();
│ │ │ │ +
75 }
│ │ │ │ +
76
│ │ │ │ +
77 BindVisitor(const Entity& entity, std::size_t offset = 0)
│ │ │ │ +
78 : entity_(entity)
│ │ │ │ +
79 , offset_(offset)
│ │ │ │ +
80 {}
│ │ │ │ +
81
│ │ │ │ +
82 const Entity& entity_;
│ │ │ │ +
83 std::size_t offset_;
│ │ │ │ +
84
│ │ │ │ +
85 };
│ │ │ │ +
86
│ │ │ │ +
87
│ │ │ │ +
88 struct InitializeTreeVisitor :
│ │ │ │ +
89 public TypeTree::TreeVisitor,
│ │ │ │ +
90 public TypeTree::DynamicTraversal
│ │ │ │ +
91 {
│ │ │ │ +
92 template<typename Node, typename TreePath>
│ │ │ │ +
93 void pre(Node& node, TreePath)
│ │ │ │ +
94 {
│ │ │ │ +
95 node.setTreeIndex(treeIndex_);
│ │ │ │ +
96 ++treeIndex_;
│ │ │ │ +
97 }
│ │ │ │ +
98
│ │ │ │ +
99 template<typename Node, typename TreePath>
│ │ │ │ +
100 void leaf(Node& node, TreePath)
│ │ │ │ +
101 {
│ │ │ │ +
102 node.setTreeIndex(treeIndex_);
│ │ │ │ +
103 ++treeIndex_;
│ │ │ │ +
104 }
│ │ │ │ +
105
│ │ │ │ +
106 InitializeTreeVisitor(std::size_t treeIndexOffset = 0) :
│ │ │ │ +
107 treeIndex_(treeIndexOffset)
│ │ │ │ +
108 {}
│ │ │ │ +
109
│ │ │ │ +
110 std::size_t treeIndex_;
│ │ │ │ +
111 };
│ │ │ │ +
112
│ │ │ │ +
113 } // end namespace Impl
│ │ │ │ +
114
│ │ │ │ +
115
│ │ │ │ + │ │ │ │ +
117 {
│ │ │ │ +
118
│ │ │ │ +
119 friend struct Impl::ClearSizeVisitor;
│ │ │ │ +
120
│ │ │ │ +
121 template<typename>
│ │ │ │ +
122 friend struct Impl::BindVisitor;
│ │ │ │ +
123
│ │ │ │ +
124 friend struct Impl::InitializeTreeVisitor;
│ │ │ │
125
│ │ │ │ -
126
│ │ │ │ -
127} // namespace Functions
│ │ │ │ -
128} // namespace Dune
│ │ │ │ +
126 public:
│ │ │ │ +
127
│ │ │ │ +
128 using size_type = std::size_t;
│ │ │ │
129
│ │ │ │ -
130#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BOUNDARYDOFS_HH
│ │ │ │ - │ │ │ │ -
auto subEntityDOFs(const T &)
Create SubEntityDOFs object.
Definition: subentitydofs.hh:160
│ │ │ │ -
void forEachBoundaryDOF(const Basis &basis, F &&f)
Loop over all DOFs on the boundary.
Definition: boundarydofs.hh:36
│ │ │ │ + │ │ │ │ +
131 offset_(0),
│ │ │ │ +
132 size_(0),
│ │ │ │ +
133 treeIndex_(0)
│ │ │ │ +
134 {}
│ │ │ │ +
135
│ │ │ │ + │ │ │ │ +
137 {
│ │ │ │ +
138 assert(i < size_);
│ │ │ │ +
139 return offset_ + i;
│ │ │ │ +
140 }
│ │ │ │ +
141
│ │ │ │ + │ │ │ │ +
143 {
│ │ │ │ +
144 return size_;
│ │ │ │ +
145 }
│ │ │ │ +
146
│ │ │ │ + │ │ │ │ +
148 {
│ │ │ │ +
149 return treeIndex_;
│ │ │ │ +
150 }
│ │ │ │ +
151
│ │ │ │ +
152 protected:
│ │ │ │ +
153
│ │ │ │ + │ │ │ │ +
155 {
│ │ │ │ +
156 return offset_;
│ │ │ │ +
157 }
│ │ │ │ +
158
│ │ │ │ + │ │ │ │ +
160 {
│ │ │ │ +
161 offset_ = offset;
│ │ │ │ +
162 }
│ │ │ │ +
163
│ │ │ │ + │ │ │ │ +
165 {
│ │ │ │ +
166 size_ = size;
│ │ │ │ +
167 }
│ │ │ │ +
168
│ │ │ │ + │ │ │ │ +
170 {
│ │ │ │ +
171 treeIndex_ = treeIndex;
│ │ │ │ +
172 }
│ │ │ │ +
173
│ │ │ │ +
174 private:
│ │ │ │ +
175
│ │ │ │ +
176 size_type offset_;
│ │ │ │ +
177 size_type size_;
│ │ │ │ +
178 size_type treeIndex_;
│ │ │ │ +
179
│ │ │ │ +
180 };
│ │ │ │ +
181
│ │ │ │ +
182
│ │ │ │ + │ │ │ │ +
184 public BasisNodeMixin,
│ │ │ │ +
185 public TypeTree::LeafNode
│ │ │ │ +
186 {};
│ │ │ │ +
187
│ │ │ │ +
188
│ │ │ │ +
189 template<typename T, std::size_t n>
│ │ │ │ + │ │ │ │ +
191 public BasisNodeMixin,
│ │ │ │ +
192 public TypeTree::PowerNode<T,n>
│ │ │ │ +
193 {
│ │ │ │ +
194
│ │ │ │ +
195 using Node = TypeTree::PowerNode<T,n>;
│ │ │ │ +
196
│ │ │ │ +
197 public:
│ │ │ │ +
198
│ │ │ │ +
199 using Element = typename T::Element;
│ │ │ │ +
200
│ │ │ │ +
201 PowerBasisNode() = default;
│ │ │ │ +
202
│ │ │ │ +
203 PowerBasisNode(const typename Node::NodeStorage& children) :
│ │ │ │ +
204 Node(children)
│ │ │ │ +
205 {}
│ │ │ │ +
206
│ │ │ │ +
207 const Element& element() const
│ │ │ │ +
208 {
│ │ │ │ +
209 return this->child(Dune::Indices::_0).element();
│ │ │ │ +
210 }
│ │ │ │ +
211
│ │ │ │ +
212 };
│ │ │ │ +
213
│ │ │ │ +
214
│ │ │ │ +
215 template<typename... T>
│ │ │ │ + │ │ │ │ +
217 public BasisNodeMixin,
│ │ │ │ +
218 public TypeTree::CompositeNode<T...>
│ │ │ │ +
219 {
│ │ │ │ +
220
│ │ │ │ +
221 using Node = TypeTree::CompositeNode<T...>;
│ │ │ │ +
222
│ │ │ │ +
223 public:
│ │ │ │ +
224
│ │ │ │ +
225 using Element = typename Node::template Child<0>::Type::Element;
│ │ │ │ +
226
│ │ │ │ + │ │ │ │ +
228
│ │ │ │ +
229 CompositeBasisNode(const typename Node::NodeStorage& children) :
│ │ │ │ +
230 Node(children)
│ │ │ │ +
231 {}
│ │ │ │ +
232
│ │ │ │ +
233 template<typename... Children>
│ │ │ │ +
234 CompositeBasisNode(const std::shared_ptr<Children>&... children) :
│ │ │ │ +
235 Node(children...)
│ │ │ │ +
236 {}
│ │ │ │ +
237
│ │ │ │ +
238 const Element& element() const
│ │ │ │ +
239 {
│ │ │ │ +
240 return this->child(Dune::Indices::_0).element();
│ │ │ │ +
241 }
│ │ │ │ +
242
│ │ │ │ +
243 };
│ │ │ │ +
244
│ │ │ │ +
245
│ │ │ │ +
246 template<typename Tree>
│ │ │ │ +
247 void clearSize(Tree& tree, std::size_t offset)
│ │ │ │ +
248 {
│ │ │ │ +
249 TypeTree::applyToTree(tree,Impl::ClearSizeVisitor(offset));
│ │ │ │ +
250 }
│ │ │ │ +
251
│ │ │ │ +
252 template<typename Tree, typename Entity>
│ │ │ │ +
253 void bindTree(Tree& tree, const Entity& entity, std::size_t offset = 0)
│ │ │ │ +
254 {
│ │ │ │ +
255 Impl::BindVisitor<Entity> visitor(entity,offset);
│ │ │ │ +
256 TypeTree::applyToTree(tree,visitor);
│ │ │ │ +
257 }
│ │ │ │ +
258
│ │ │ │ +
259 template<typename Tree>
│ │ │ │ +
260 void initializeTree(Tree& tree, std::size_t treeIndexOffset = 0)
│ │ │ │ +
261 {
│ │ │ │ +
262 Impl::InitializeTreeVisitor visitor(treeIndexOffset);
│ │ │ │ +
263 TypeTree::applyToTree(tree,visitor);
│ │ │ │ +
264 }
│ │ │ │ +
265
│ │ │ │ +
266
│ │ │ │ +
267 } // namespace Functions
│ │ │ │ +
268
│ │ │ │ +
269} // namespace Dune
│ │ │ │ +
270
│ │ │ │ +
271#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ +
void clearSize(Tree &tree, std::size_t offset)
Definition: nodes.hh:247
│ │ │ │ +
void bindTree(Tree &tree, const Entity &entity, std::size_t offset=0)
Definition: nodes.hh:253
│ │ │ │ +
void initializeTree(Tree &tree, std::size_t treeIndexOffset=0)
Definition: nodes.hh:260
│ │ │ │ +
Definition: nodes.hh:117
│ │ │ │ +
size_type treeIndex() const
Definition: nodes.hh:147
│ │ │ │ +
size_type localIndex(size_type i) const
Definition: nodes.hh:136
│ │ │ │ +
size_type offset() const
Definition: nodes.hh:154
│ │ │ │ +
size_type size() const
Definition: nodes.hh:142
│ │ │ │ +
void setOffset(const size_type offset)
Definition: nodes.hh:159
│ │ │ │ +
std::size_t size_type
Definition: nodes.hh:128
│ │ │ │ +
BasisNodeMixin()
Definition: nodes.hh:130
│ │ │ │ +
void setSize(const size_type size)
Definition: nodes.hh:164
│ │ │ │ +
void setTreeIndex(size_type treeIndex)
Definition: nodes.hh:169
│ │ │ │ +
Definition: nodes.hh:186
│ │ │ │ +
Definition: nodes.hh:193
│ │ │ │ +
const Element & element() const
Definition: nodes.hh:207
│ │ │ │ +
typename T::Element Element
Definition: nodes.hh:199
│ │ │ │ +
PowerBasisNode(const typename Node::NodeStorage &children)
Definition: nodes.hh:203
│ │ │ │ + │ │ │ │ +
Definition: nodes.hh:219
│ │ │ │ + │ │ │ │ +
CompositeBasisNode(const typename Node::NodeStorage &children)
Definition: nodes.hh:229
│ │ │ │ +
const Element & element() const
Definition: nodes.hh:238
│ │ │ │ +
typename Node::template Child< 0 >::Type::Element Element
Definition: nodes.hh:225
│ │ │ │ +
CompositeBasisNode(const std::shared_ptr< Children > &... children)
Definition: nodes.hh:234
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,104 +5,354 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -boundarydofs.hh │ │ │ │ │ +nodes.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BOUNDARYDOFS_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BOUNDARYDOFS_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9 │ │ │ │ │ - 10namespace Dune { │ │ │ │ │ - 11namespace Functions { │ │ │ │ │ - 12 │ │ │ │ │ - 13 │ │ │ │ │ - 14 │ │ │ │ │ - 34template>()(0, std::declval(),std::declval()), 0) = 0> │ │ │ │ │ -36void forEachBoundaryDOF(const Basis& basis, F&& f) │ │ │ │ │ - 37{ │ │ │ │ │ - 38 auto localView = basis.localView(); │ │ │ │ │ - 39 auto seDOFs = subEntityDOFs(basis); │ │ │ │ │ - 40 const auto& gridView = basis.gridView(); │ │ │ │ │ - 41 for(auto&& element : elements(gridView)) │ │ │ │ │ - 42 if (element.hasBoundaryIntersections()) │ │ │ │ │ - 43 { │ │ │ │ │ - 44 localView.bind(element); │ │ │ │ │ - 45 for(const auto& intersection: intersections(gridView, element)) │ │ │ │ │ - 46 if (intersection.boundary()) │ │ │ │ │ - 47 for(auto localIndex: seDOFs.bind(localView,intersection)) │ │ │ │ │ - 48 f(localIndex, localView, intersection); │ │ │ │ │ - 49 } │ │ │ │ │ - 50} │ │ │ │ │ - 51 │ │ │ │ │ - 52 │ │ │ │ │ - 53 │ │ │ │ │ - 71template>()(0, std::declval()),0) = 0> │ │ │ │ │ - 73void forEachBoundaryDOF(const Basis& basis, F&& f) │ │ │ │ │ - 74{ │ │ │ │ │ - 75 auto localView = basis.localView(); │ │ │ │ │ - 76 auto seDOFs = subEntityDOFs(basis); │ │ │ │ │ - 77 const auto& gridView = basis.gridView(); │ │ │ │ │ - 78 for(auto&& element : elements(gridView)) │ │ │ │ │ - 79 if (element.hasBoundaryIntersections()) │ │ │ │ │ - 80 { │ │ │ │ │ - 81 localView.bind(element); │ │ │ │ │ - 82 for(const auto& intersection: intersections(gridView, element)) │ │ │ │ │ - 83 if (intersection.boundary()) │ │ │ │ │ - 84 for(auto localIndex: seDOFs.bind(localView,intersection)) │ │ │ │ │ - 85 f(localIndex, localView); │ │ │ │ │ - 86 } │ │ │ │ │ - 87} │ │ │ │ │ - 88 │ │ │ │ │ - 89 │ │ │ │ │ - 90 │ │ │ │ │ - 107template>()(std::declval()),0) = 0> │ │ │ │ │ - 109void forEachBoundaryDOF(const Basis& basis, F&& f) │ │ │ │ │ - 110{ │ │ │ │ │ - 111 auto localView = basis.localView(); │ │ │ │ │ - 112 auto seDOFs = subEntityDOFs(basis); │ │ │ │ │ - 113 const auto& gridView = basis.gridView(); │ │ │ │ │ - 114 for(auto&& element : elements(gridView)) │ │ │ │ │ - 115 if (element.hasBoundaryIntersections()) │ │ │ │ │ - 116 { │ │ │ │ │ - 117 localView.bind(element); │ │ │ │ │ - 118 for(const auto& intersection: intersections(gridView, element)) │ │ │ │ │ - 119 if (intersection.boundary()) │ │ │ │ │ - 120 for(auto localIndex: seDOFs.bind(localView,intersection)) │ │ │ │ │ - 121 f(localView.index(localIndex)); │ │ │ │ │ - 122 } │ │ │ │ │ - 123} │ │ │ │ │ - 124 │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8 │ │ │ │ │ + 9#include │ │ │ │ │ + 10 │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14#include │ │ │ │ │ + 15#include │ │ │ │ │ + 16 │ │ │ │ │ + 17namespace Dune { │ │ │ │ │ + 18 namespace Functions { │ │ │ │ │ + 19 │ │ │ │ │ + 20 │ │ │ │ │ + 21 namespace Impl { │ │ │ │ │ + 22 │ │ │ │ │ + 23 │ │ │ │ │ + 24 struct ClearSizeVisitor │ │ │ │ │ + 25 : public TypeTree::TreeVisitor │ │ │ │ │ + 26 , public TypeTree::DynamicTraversal │ │ │ │ │ + 27 { │ │ │ │ │ + 28 │ │ │ │ │ + 29 template │ │ │ │ │ + 30 void pre(Node& node, TreePath treePath) │ │ │ │ │ + 31 { │ │ │ │ │ + 32 leaf(node,treePath); │ │ │ │ │ + 33 node.setSize(0); │ │ │ │ │ + 34 } │ │ │ │ │ + 35 │ │ │ │ │ + 36 template │ │ │ │ │ + 37 void leaf(Node& node, TreePath treePath) │ │ │ │ │ + 38 { │ │ │ │ │ + 39 node.setOffset(offset_); │ │ │ │ │ + 40 } │ │ │ │ │ + 41 │ │ │ │ │ + 42 ClearSizeVisitor(std::size_t offset) │ │ │ │ │ + 43 : offset_(offset) │ │ │ │ │ + 44 {} │ │ │ │ │ + 45 │ │ │ │ │ + 46 const std::size_t offset_; │ │ │ │ │ + 47 │ │ │ │ │ + 48 }; │ │ │ │ │ + 49 │ │ │ │ │ + 50 │ │ │ │ │ + 51 template │ │ │ │ │ + 52 struct BindVisitor │ │ │ │ │ + 53 : public TypeTree::TreeVisitor │ │ │ │ │ + 54 , public TypeTree::DynamicTraversal │ │ │ │ │ + 55 { │ │ │ │ │ + 56 │ │ │ │ │ + 57 template │ │ │ │ │ + 58 void pre(Node& node, TreePath) │ │ │ │ │ + 59 { │ │ │ │ │ + 60 node.setOffset(offset_); │ │ │ │ │ + 61 } │ │ │ │ │ + 62 │ │ │ │ │ + 63 template │ │ │ │ │ + 64 void post(Node& node, TreePath) │ │ │ │ │ + 65 { │ │ │ │ │ + 66 node.setSize(offset_ - node.offset()); │ │ │ │ │ + 67 } │ │ │ │ │ + 68 │ │ │ │ │ + 69 template │ │ │ │ │ + 70 void leaf(Node& node, TreePath) │ │ │ │ │ + 71 { │ │ │ │ │ + 72 node.setOffset(offset_); │ │ │ │ │ + 73 node.bind(entity_); │ │ │ │ │ + 74 offset_ += node.size(); │ │ │ │ │ + 75 } │ │ │ │ │ + 76 │ │ │ │ │ + 77 BindVisitor(const Entity& entity, std::size_t offset = 0) │ │ │ │ │ + 78 : entity_(entity) │ │ │ │ │ + 79 , offset_(offset) │ │ │ │ │ + 80 {} │ │ │ │ │ + 81 │ │ │ │ │ + 82 const Entity& entity_; │ │ │ │ │ + 83 std::size_t offset_; │ │ │ │ │ + 84 │ │ │ │ │ + 85 }; │ │ │ │ │ + 86 │ │ │ │ │ + 87 │ │ │ │ │ + 88 struct InitializeTreeVisitor : │ │ │ │ │ + 89 public TypeTree::TreeVisitor, │ │ │ │ │ + 90 public TypeTree::DynamicTraversal │ │ │ │ │ + 91 { │ │ │ │ │ + 92 template │ │ │ │ │ + 93 void pre(Node& node, TreePath) │ │ │ │ │ + 94 { │ │ │ │ │ + 95 node.setTreeIndex(treeIndex_); │ │ │ │ │ + 96 ++treeIndex_; │ │ │ │ │ + 97 } │ │ │ │ │ + 98 │ │ │ │ │ + 99 template │ │ │ │ │ + 100 void leaf(Node& node, TreePath) │ │ │ │ │ + 101 { │ │ │ │ │ + 102 node.setTreeIndex(treeIndex_); │ │ │ │ │ + 103 ++treeIndex_; │ │ │ │ │ + 104 } │ │ │ │ │ + 105 │ │ │ │ │ + 106 InitializeTreeVisitor(std::size_t treeIndexOffset = 0) : │ │ │ │ │ + 107 treeIndex_(treeIndexOffset) │ │ │ │ │ + 108 {} │ │ │ │ │ + 109 │ │ │ │ │ + 110 std::size_t treeIndex_; │ │ │ │ │ + 111 }; │ │ │ │ │ + 112 │ │ │ │ │ + 113 } // end namespace Impl │ │ │ │ │ + 114 │ │ │ │ │ + 115 │ │ │ │ │ +116 class BasisNodeMixin │ │ │ │ │ + 117 { │ │ │ │ │ + 118 │ │ │ │ │ + 119 friend struct Impl::ClearSizeVisitor; │ │ │ │ │ + 120 │ │ │ │ │ + 121 template │ │ │ │ │ + 122 friend struct Impl::BindVisitor; │ │ │ │ │ + 123 │ │ │ │ │ + 124 friend struct Impl::InitializeTreeVisitor; │ │ │ │ │ 125 │ │ │ │ │ - 126 │ │ │ │ │ - 127} // namespace Functions │ │ │ │ │ - 128} // namespace Dune │ │ │ │ │ + 126 public: │ │ │ │ │ + 127 │ │ │ │ │ +128 using size_type = std::size_t; │ │ │ │ │ 129 │ │ │ │ │ - 130#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BOUNDARYDOFS_HH │ │ │ │ │ -subentitydofs.hh │ │ │ │ │ -Dune::Functions::subEntityDOFs │ │ │ │ │ -auto subEntityDOFs(const T &) │ │ │ │ │ -Create SubEntityDOFs object. │ │ │ │ │ -Definition: subentitydofs.hh:160 │ │ │ │ │ -Dune::Functions::forEachBoundaryDOF │ │ │ │ │ -void forEachBoundaryDOF(const Basis &basis, F &&f) │ │ │ │ │ -Loop over all DOFs on the boundary. │ │ │ │ │ -Definition: boundarydofs.hh:36 │ │ │ │ │ +130 BasisNodeMixin() : │ │ │ │ │ + 131 offset_(0), │ │ │ │ │ + 132 size_(0), │ │ │ │ │ + 133 treeIndex_(0) │ │ │ │ │ + 134 {} │ │ │ │ │ + 135 │ │ │ │ │ +136 size_type localIndex(size_type i) const │ │ │ │ │ + 137 { │ │ │ │ │ + 138 assert(i < size_); │ │ │ │ │ + 139 return offset_ + i; │ │ │ │ │ + 140 } │ │ │ │ │ + 141 │ │ │ │ │ +142 size_type size() const │ │ │ │ │ + 143 { │ │ │ │ │ + 144 return size_; │ │ │ │ │ + 145 } │ │ │ │ │ + 146 │ │ │ │ │ +147 size_type treeIndex() const │ │ │ │ │ + 148 { │ │ │ │ │ + 149 return treeIndex_; │ │ │ │ │ + 150 } │ │ │ │ │ + 151 │ │ │ │ │ + 152 protected: │ │ │ │ │ + 153 │ │ │ │ │ +154 size_type offset() const │ │ │ │ │ + 155 { │ │ │ │ │ + 156 return offset_; │ │ │ │ │ + 157 } │ │ │ │ │ + 158 │ │ │ │ │ +159 void setOffset(const size_type offset) │ │ │ │ │ + 160 { │ │ │ │ │ + 161 offset_ = offset; │ │ │ │ │ + 162 } │ │ │ │ │ + 163 │ │ │ │ │ +164 void setSize(const size_type size) │ │ │ │ │ + 165 { │ │ │ │ │ + 166 size_ = size; │ │ │ │ │ + 167 } │ │ │ │ │ + 168 │ │ │ │ │ +169 void setTreeIndex(size_type treeIndex) │ │ │ │ │ + 170 { │ │ │ │ │ + 171 treeIndex_ = treeIndex; │ │ │ │ │ + 172 } │ │ │ │ │ + 173 │ │ │ │ │ + 174 private: │ │ │ │ │ + 175 │ │ │ │ │ + 176 size_type offset_; │ │ │ │ │ + 177 size_type size_; │ │ │ │ │ + 178 size_type treeIndex_; │ │ │ │ │ + 179 │ │ │ │ │ + 180 }; │ │ │ │ │ + 181 │ │ │ │ │ + 182 │ │ │ │ │ +183 class LeafBasisNode : │ │ │ │ │ + 184 public BasisNodeMixin, │ │ │ │ │ + 185 public TypeTree::LeafNode │ │ │ │ │ + 186 {}; │ │ │ │ │ + 187 │ │ │ │ │ + 188 │ │ │ │ │ + 189 template │ │ │ │ │ +190 class PowerBasisNode : │ │ │ │ │ + 191 public BasisNodeMixin, │ │ │ │ │ + 192 public TypeTree::PowerNode │ │ │ │ │ + 193 { │ │ │ │ │ + 194 │ │ │ │ │ + 195 using Node = TypeTree::PowerNode; │ │ │ │ │ + 196 │ │ │ │ │ + 197 public: │ │ │ │ │ + 198 │ │ │ │ │ +199 using Element = typename T::Element; │ │ │ │ │ + 200 │ │ │ │ │ +201 PowerBasisNode() = default; │ │ │ │ │ + 202 │ │ │ │ │ +203 PowerBasisNode(const typename Node::NodeStorage& children) : │ │ │ │ │ + 204 Node(children) │ │ │ │ │ + 205 {} │ │ │ │ │ + 206 │ │ │ │ │ +207 const Element& element() const │ │ │ │ │ + 208 { │ │ │ │ │ + 209 return this->child(Dune::Indices::_0).element(); │ │ │ │ │ + 210 } │ │ │ │ │ + 211 │ │ │ │ │ + 212 }; │ │ │ │ │ + 213 │ │ │ │ │ + 214 │ │ │ │ │ + 215 template │ │ │ │ │ +216 class CompositeBasisNode : │ │ │ │ │ + 217 public BasisNodeMixin, │ │ │ │ │ + 218 public TypeTree::CompositeNode │ │ │ │ │ + 219 { │ │ │ │ │ + 220 │ │ │ │ │ + 221 using Node = TypeTree::CompositeNode; │ │ │ │ │ + 222 │ │ │ │ │ + 223 public: │ │ │ │ │ + 224 │ │ │ │ │ +225 using Element = typename Node::template Child<0>::Type::Element; │ │ │ │ │ + 226 │ │ │ │ │ +227 CompositeBasisNode() = default; │ │ │ │ │ + 228 │ │ │ │ │ +229 CompositeBasisNode(const typename Node::NodeStorage& children) : │ │ │ │ │ + 230 Node(children) │ │ │ │ │ + 231 {} │ │ │ │ │ + 232 │ │ │ │ │ + 233 template │ │ │ │ │ +234 CompositeBasisNode(const std::shared_ptr&... children) : │ │ │ │ │ + 235 Node(children...) │ │ │ │ │ + 236 {} │ │ │ │ │ + 237 │ │ │ │ │ +238 const Element& element() const │ │ │ │ │ + 239 { │ │ │ │ │ + 240 return this->child(Dune::Indices::_0).element(); │ │ │ │ │ + 241 } │ │ │ │ │ + 242 │ │ │ │ │ + 243 }; │ │ │ │ │ + 244 │ │ │ │ │ + 245 │ │ │ │ │ + 246 template │ │ │ │ │ +247 void clearSize(Tree& tree, std::size_t offset) │ │ │ │ │ + 248 { │ │ │ │ │ + 249 TypeTree::applyToTree(tree,Impl::ClearSizeVisitor(offset)); │ │ │ │ │ + 250 } │ │ │ │ │ + 251 │ │ │ │ │ + 252 template │ │ │ │ │ +253 void bindTree(Tree& tree, const Entity& entity, std::size_t offset = 0) │ │ │ │ │ + 254 { │ │ │ │ │ + 255 Impl::BindVisitor visitor(entity,offset); │ │ │ │ │ + 256 TypeTree::applyToTree(tree,visitor); │ │ │ │ │ + 257 } │ │ │ │ │ + 258 │ │ │ │ │ + 259 template │ │ │ │ │ +260 void initializeTree(Tree& tree, std::size_t treeIndexOffset = 0) │ │ │ │ │ + 261 { │ │ │ │ │ + 262 Impl::InitializeTreeVisitor visitor(treeIndexOffset); │ │ │ │ │ + 263 TypeTree::applyToTree(tree,visitor); │ │ │ │ │ + 264 } │ │ │ │ │ + 265 │ │ │ │ │ + 266 │ │ │ │ │ + 267 } // namespace Functions │ │ │ │ │ + 268 │ │ │ │ │ + 269} // namespace Dune │ │ │ │ │ + 270 │ │ │ │ │ + 271#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ +Dune::Functions::clearSize │ │ │ │ │ +void clearSize(Tree &tree, std::size_t offset) │ │ │ │ │ +Definition: nodes.hh:247 │ │ │ │ │ +Dune::Functions::bindTree │ │ │ │ │ +void bindTree(Tree &tree, const Entity &entity, std::size_t offset=0) │ │ │ │ │ +Definition: nodes.hh:253 │ │ │ │ │ +Dune::Functions::initializeTree │ │ │ │ │ +void initializeTree(Tree &tree, std::size_t treeIndexOffset=0) │ │ │ │ │ +Definition: nodes.hh:260 │ │ │ │ │ +Dune::Functions::BasisNodeMixin │ │ │ │ │ +Definition: nodes.hh:117 │ │ │ │ │ +Dune::Functions::BasisNodeMixin::treeIndex │ │ │ │ │ +size_type treeIndex() const │ │ │ │ │ +Definition: nodes.hh:147 │ │ │ │ │ +Dune::Functions::BasisNodeMixin::localIndex │ │ │ │ │ +size_type localIndex(size_type i) const │ │ │ │ │ +Definition: nodes.hh:136 │ │ │ │ │ +Dune::Functions::BasisNodeMixin::offset │ │ │ │ │ +size_type offset() const │ │ │ │ │ +Definition: nodes.hh:154 │ │ │ │ │ +Dune::Functions::BasisNodeMixin::size │ │ │ │ │ +size_type size() const │ │ │ │ │ +Definition: nodes.hh:142 │ │ │ │ │ +Dune::Functions::BasisNodeMixin::setOffset │ │ │ │ │ +void setOffset(const size_type offset) │ │ │ │ │ +Definition: nodes.hh:159 │ │ │ │ │ +Dune::Functions::BasisNodeMixin::size_type │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +Definition: nodes.hh:128 │ │ │ │ │ +Dune::Functions::BasisNodeMixin::BasisNodeMixin │ │ │ │ │ +BasisNodeMixin() │ │ │ │ │ +Definition: nodes.hh:130 │ │ │ │ │ +Dune::Functions::BasisNodeMixin::setSize │ │ │ │ │ +void setSize(const size_type size) │ │ │ │ │ +Definition: nodes.hh:164 │ │ │ │ │ +Dune::Functions::BasisNodeMixin::setTreeIndex │ │ │ │ │ +void setTreeIndex(size_type treeIndex) │ │ │ │ │ +Definition: nodes.hh:169 │ │ │ │ │ +Dune::Functions::LeafBasisNode │ │ │ │ │ +Definition: nodes.hh:186 │ │ │ │ │ +Dune::Functions::PowerBasisNode │ │ │ │ │ +Definition: nodes.hh:193 │ │ │ │ │ +Dune::Functions::PowerBasisNode::element │ │ │ │ │ +const Element & element() const │ │ │ │ │ +Definition: nodes.hh:207 │ │ │ │ │ +Dune::Functions::PowerBasisNode::Element │ │ │ │ │ +typename T::Element Element │ │ │ │ │ +Definition: nodes.hh:199 │ │ │ │ │ +Dune::Functions::PowerBasisNode::PowerBasisNode │ │ │ │ │ +PowerBasisNode(const typename Node::NodeStorage &children) │ │ │ │ │ +Definition: nodes.hh:203 │ │ │ │ │ +Dune::Functions::PowerBasisNode::PowerBasisNode │ │ │ │ │ +PowerBasisNode()=default │ │ │ │ │ +Dune::Functions::CompositeBasisNode │ │ │ │ │ +Definition: nodes.hh:219 │ │ │ │ │ +Dune::Functions::CompositeBasisNode::CompositeBasisNode │ │ │ │ │ +CompositeBasisNode()=default │ │ │ │ │ +Dune::Functions::CompositeBasisNode::CompositeBasisNode │ │ │ │ │ +CompositeBasisNode(const typename Node::NodeStorage &children) │ │ │ │ │ +Definition: nodes.hh:229 │ │ │ │ │ +Dune::Functions::CompositeBasisNode::element │ │ │ │ │ +const Element & element() const │ │ │ │ │ +Definition: nodes.hh:238 │ │ │ │ │ +Dune::Functions::CompositeBasisNode::Element │ │ │ │ │ +typename Node::template Child< 0 >::Type::Element Element │ │ │ │ │ +Definition: nodes.hh:225 │ │ │ │ │ +Dune::Functions::CompositeBasisNode::CompositeBasisNode │ │ │ │ │ +CompositeBasisNode(const std::shared_ptr< Children > &... children) │ │ │ │ │ +Definition: nodes.hh:234 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00119.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: hierarchicallagrangebasis.hh File Reference │ │ │ │ +dune-functions: lagrangebasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -67,55 +67,61 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Typedefs | │ │ │ │ Functions
│ │ │ │ -
hierarchicallagrangebasis.hh File Reference
│ │ │ │ +
lagrangebasis.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/localfunctions/hierarchical/hierarchicalp2.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │ -#include <dune/grid/common/mcmgmapper.hh>
│ │ │ │ +
#include <type_traits>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/localfunctions/lagrange.hh>
│ │ │ │ +#include <dune/localfunctions/lagrange/equidistantpoints.hh>
│ │ │ │ +#include <dune/localfunctions/lagrange/pqkfactory.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::HierarchicalLagrangePreBasis< GV, k, R >
 A pre-basis for a hierarchical basis. More...
class  Dune::Functions::LagrangePreBasis< GV, k, R >
 A pre-basis for a PQ-lagrange bases with given order. More...
 
class  Dune::Functions::HierarchicalLagrangeNode< GV, k, R >
class  Dune::Functions::LagrangeNode< GV, k, R >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
namespace  Dune::Functions::BasisFactory
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Typedefs

template<typename GV , int k, typename R = double>
using Dune::Functions::HierarchicalLagrangeBasis = DefaultGlobalBasis< HierarchicalLagrangePreBasis< GV, k, R > >
 Basis of a scalar Hierarchical Lagrange finite element space. More...
 
template<typename GV , int k = -1, typename R = double>
using Dune::Functions::LagrangeBasis = DefaultGlobalBasis< LagrangePreBasis< GV, k, R > >
 Nodal basis of a scalar k-th-order Lagrangean finite element space. More...
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<std::size_t k, typename R = double>
auto Dune::Functions::BasisFactory::hierarchicalLagrange ()
 Create a pre-basis factory that can create a HierarchicalLagrange pre-basis. More...
 
template<std::size_t k, typename R = double>
auto Dune::Functions::BasisFactory::lagrange ()
 Create a pre-basis factory that can create a Lagrange pre-basis. More...
 
template<typename R = double>
auto Dune::Functions::BasisFactory::lagrange (int order)
 Create a pre-basis factory that can create a Lagrange pre-basis with a run-time order. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -6,42 +6,49 @@ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ Classes | Namespaces | Typedefs | Functions │ │ │ │ │ -hierarchicallagrangebasis.hh File Reference │ │ │ │ │ +lagrangebasis.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::HierarchicalLagrangePreBasis<_GV,_k,_R_> │ │ │ │ │ -  A pre-basis for a hierarchical basis. More... │ │ │ │ │ +class  Dune::Functions::LagrangePreBasis<_GV,_k,_R_> │ │ │ │ │ +  A pre-basis for a PQ-lagrange bases with given order. More... │ │ │ │ │   │ │ │ │ │ -class  Dune::Functions::HierarchicalLagrangeNode<_GV,_k,_R_> │ │ │ │ │ +class  Dune::Functions::LagrangeNode<_GV,_k,_R_> │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions::BasisFactory │ │ │ │ │   │ │ │ │ │ Typedefs │ │ │ │ │ -template │ │ │ │ │ -using Dune::Functions::HierarchicalLagrangeBasis = DefaultGlobalBasis< │ │ │ │ │ - HierarchicalLagrangePreBasis< GV, k, R > > │ │ │ │ │ -  Basis of a scalar Hierarchical Lagrange finite element space. More... │ │ │ │ │ +template │ │ │ │ │ +using Dune::Functions::LagrangeBasis = DefaultGlobalBasis< LagrangePreBasis< │ │ │ │ │ + GV, k, R > > │ │ │ │ │ +  Nodal basis of a scalar k-th-order Lagrangean finite element space. │ │ │ │ │ + More... │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ template │ │ │ │ │ -auto Dune::Functions::BasisFactory::hierarchicalLagrange () │ │ │ │ │ -  Create a pre-basis factory that can create a HierarchicalLagrange pre- │ │ │ │ │ - basis. More... │ │ │ │ │ +auto Dune::Functions::BasisFactory::lagrange () │ │ │ │ │ +  Create a pre-basis factory that can create a Lagrange pre-basis. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::BasisFactory::lagrange (int order) │ │ │ │ │ +  Create a pre-basis factory that can create a Lagrange pre-basis with a │ │ │ │ │ + run-time order. More... │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00119_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: hierarchicallagrangebasis.hh Source File │ │ │ │ +dune-functions: lagrangebasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,263 +62,546 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
hierarchicallagrangebasis.hh
│ │ │ │ +
lagrangebasis.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICALLAGRANGEBASIS_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICALLAGRANGEBASIS_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH
│ │ │ │
5
│ │ │ │ -
6#include <dune/common/exceptions.hh>
│ │ │ │ -
7#include <dune/localfunctions/hierarchical/hierarchicalp2.hh>
│ │ │ │ +
6#include <type_traits>
│ │ │ │ +
7#include <dune/common/exceptions.hh>
│ │ │ │
8
│ │ │ │ - │ │ │ │ - │ │ │ │ -
11#include <dune/grid/common/mcmgmapper.hh>
│ │ │ │ +
9#include <dune/localfunctions/lagrange.hh>
│ │ │ │ +
10#include <dune/localfunctions/lagrange/equidistantpoints.hh>
│ │ │ │ +
11#include <dune/localfunctions/lagrange/pqkfactory.hh>
│ │ │ │
12
│ │ │ │ -
13namespace Dune {
│ │ │ │ -
14 namespace Functions {
│ │ │ │ + │ │ │ │ + │ │ │ │
15
│ │ │ │ -
16 // *****************************************************************************
│ │ │ │ -
17 // Implementation for Hierarchical Lagrange Basis
│ │ │ │ -
18 //
│ │ │ │ -
19 // -- only order k=2 is implemented up to now --
│ │ │ │ -
20 // -- currently only supports simplex grids --
│ │ │ │ -
21 //
│ │ │ │ -
22 // This is the reusable part of the HierarchicalLagrangeBasis. It contains
│ │ │ │ -
23 //
│ │ │ │ -
24 // HierarchicalLagrangePreBasis
│ │ │ │ -
25 // HierarchicalLagrangeNode
│ │ │ │ -
26 //
│ │ │ │ -
27 // The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ -
28 // state. These components do _not_ depend on the global basis and can be
│ │ │ │ -
29 // used without a global basis.
│ │ │ │ -
30 // *****************************************************************************
│ │ │ │ -
31
│ │ │ │ -
32 template<typename GV, int k, typename R=double>
│ │ │ │ -
33 class HierarchicalLagrangeNode;
│ │ │ │ -
34
│ │ │ │ -
35 template<typename GV, int k, typename R=double>
│ │ │ │ -
36 class HierarchicalLagrangePreBasis;
│ │ │ │ +
16
│ │ │ │ +
17namespace Dune {
│ │ │ │ +
18namespace Functions {
│ │ │ │ +
19
│ │ │ │ +
20// *****************************************************************************
│ │ │ │ +
21// This is the reusable part of the LagrangeBasis. It contains
│ │ │ │ +
22//
│ │ │ │ +
23// LagrangePreBasis
│ │ │ │ +
24// LagrangeNode
│ │ │ │ +
25//
│ │ │ │ +
26// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ +
27// state. These components do _not_ depend on the global basis and local view
│ │ │ │ +
28// and can be used without a global basis.
│ │ │ │ +
29// *****************************************************************************
│ │ │ │ +
30
│ │ │ │ +
31template<typename GV, int k, typename R=double>
│ │ │ │ +
32class LagrangeNode;
│ │ │ │ +
33
│ │ │ │ +
34template<typename GV, int k, typename R=double>
│ │ │ │ +
35class LagrangePreBasis;
│ │ │ │ +
36
│ │ │ │
37
│ │ │ │ -
47 template<typename GV, int k, typename R>
│ │ │ │ - │ │ │ │ -
49 {
│ │ │ │ -
50 static const int dim = GV::dimension;
│ │ │ │ -
51
│ │ │ │ -
52 public:
│ │ │ │ -
53
│ │ │ │ -
55 using GridView = GV;
│ │ │ │ -
56
│ │ │ │ -
58 using size_type = std::size_t;
│ │ │ │ -
59
│ │ │ │ - │ │ │ │ -
62
│ │ │ │ -
63 static constexpr size_type maxMultiIndexSize = 1;
│ │ │ │ -
64 static constexpr size_type minMultiIndexSize = 1;
│ │ │ │ -
65 static constexpr size_type multiIndexBufferSize = 1;
│ │ │ │ +
38
│ │ │ │ +
53template<typename GV, int k, typename R>
│ │ │ │ + │ │ │ │ +
55{
│ │ │ │ +
56 static const int dim = GV::dimension;
│ │ │ │ +
57 static const bool useDynamicOrder = (k<0);
│ │ │ │ +
58
│ │ │ │ +
59public:
│ │ │ │ +
60
│ │ │ │ +
62 using GridView = GV;
│ │ │ │ +
63
│ │ │ │ +
65 using size_type = std::size_t;
│ │ │ │
66
│ │ │ │ - │ │ │ │ -
72 {}
│ │ │ │ + │ │ │ │ +
69
│ │ │ │ +
70 static constexpr size_type maxMultiIndexSize = 1;
│ │ │ │ +
71 static constexpr size_type minMultiIndexSize = 1;
│ │ │ │ +
72 static constexpr size_type multiIndexBufferSize = 1;
│ │ │ │
73
│ │ │ │ - │ │ │ │ -
76 {}
│ │ │ │ -
77
│ │ │ │ -
79 const GridView& gridView() const
│ │ │ │ -
80 {
│ │ │ │ -
81 return gridView_;
│ │ │ │ -
82 }
│ │ │ │ -
83
│ │ │ │ -
85 void update (const GridView& gv)
│ │ │ │ -
86 {
│ │ │ │ -
87 gridView_ = gv;
│ │ │ │ -
88 mcmgMapper_.update(gv);
│ │ │ │ -
89 }
│ │ │ │ -
90
│ │ │ │ -
94 Node makeNode() const
│ │ │ │ -
95 {
│ │ │ │ -
96 return Node{};
│ │ │ │ -
97 }
│ │ │ │ -
98
│ │ │ │ - │ │ │ │ -
101 {
│ │ │ │ -
102 return mcmgMapper_.size();
│ │ │ │ -
103 }
│ │ │ │ + │ │ │ │ +
76 : LagrangePreBasis(gv, std::numeric_limits<unsigned int>::max())
│ │ │ │ +
77 {}
│ │ │ │ +
78
│ │ │ │ +
80 LagrangePreBasis(const GridView& gv, unsigned int order) :
│ │ │ │ + │ │ │ │ +
82 {
│ │ │ │ +
83 if (!useDynamicOrder && order!=std::numeric_limits<unsigned int>::max())
│ │ │ │ +
84 DUNE_THROW(RangeError, "Template argument k has to be -1 when supplying a run-time order!");
│ │ │ │ +
85
│ │ │ │ +
86 for (int i=0; i<=dim; i++)
│ │ │ │ +
87 {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
90 }
│ │ │ │ + │ │ │ │ + │ │ │ │ +
93 }
│ │ │ │ +
94
│ │ │ │ + │ │ │ │ +
97 {
│ │ │ │ +
98 vertexOffset_ = 0;
│ │ │ │ + │ │ │ │ +
100
│ │ │ │ +
101 if (dim>=2)
│ │ │ │ +
102 {
│ │ │ │ + │ │ │ │
104
│ │ │ │ -
106 template<class SizePrefix>
│ │ │ │ -
107 size_type size(const SizePrefix prefix) const
│ │ │ │ -
108 {
│ │ │ │ -
109 assert(prefix.size() == 0 || prefix.size() == 1);
│ │ │ │ -
110 return (prefix.size() == 0) ? size() : 0;
│ │ │ │ -
111 }
│ │ │ │ +
105 quadrilateralOffset_ = triangleOffset_ + dofsPerSimplex(2) * ((size_type)gridView_.size(Dune::GeometryTypes::triangle));
│ │ │ │ +
106 }
│ │ │ │ +
107
│ │ │ │ +
108 if (dim==3) {
│ │ │ │ +
109 tetrahedronOffset_ = quadrilateralOffset_ + dofsPerCube(2) * ((size_type)gridView_.size(Dune::GeometryTypes::quadrilateral));
│ │ │ │ +
110
│ │ │ │ +
111 prismOffset_ = tetrahedronOffset_ + dofsPerSimplex(3) * ((size_type)gridView_.size(Dune::GeometryTypes::tetrahedron));
│ │ │ │
112
│ │ │ │ - │ │ │ │ -
115 {
│ │ │ │ -
116 return size();
│ │ │ │ -
117 }
│ │ │ │ +
113 hexahedronOffset_ = prismOffset_ + dofsPerPrism() * ((size_type)gridView_.size(Dune::GeometryTypes::prism));
│ │ │ │ +
114
│ │ │ │ +
115 pyramidOffset_ = hexahedronOffset_ + dofsPerCube(3) * ((size_type)gridView_.size(Dune::GeometryTypes::hexahedron));
│ │ │ │ +
116 }
│ │ │ │ +
117 }
│ │ │ │
118
│ │ │ │ - │ │ │ │ -
124 {
│ │ │ │ -
125 // That cast to unsigned int is necessary because GV::dimension is an enum
│ │ │ │ -
126 return Dune::binomial(std::size_t(order() + (unsigned int)GV::dimension),std::size_t(order()));
│ │ │ │ -
127 }
│ │ │ │ -
128
│ │ │ │ -
129 template<typename It>
│ │ │ │ -
130 It indices(const Node& node, It it) const
│ │ │ │ -
131 {
│ │ │ │ -
132 for (size_type i = 0, end = node.finiteElement().size() ; i < end ; ++it, ++i)
│ │ │ │ -
133 {
│ │ │ │ -
134 Dune::LocalKey localKey = node.finiteElement().localCoefficients().localKey(i);
│ │ │ │ -
135 const auto& element = node.element();
│ │ │ │ -
136
│ │ │ │ -
137 *it = {{ (size_type)(mcmgMapper_.subIndex(element,localKey.subEntity(),localKey.codim())) }};
│ │ │ │ -
138 }
│ │ │ │ -
139 return it;
│ │ │ │ -
140 }
│ │ │ │ -
141
│ │ │ │ -
142 protected:
│ │ │ │ - │ │ │ │ -
144
│ │ │ │ -
145 unsigned int order() const
│ │ │ │ -
146 {
│ │ │ │ -
147 return 2;
│ │ │ │ -
148 }
│ │ │ │ -
149
│ │ │ │ -
150 MultipleCodimMultipleGeomTypeMapper<GridView> mcmgMapper_;
│ │ │ │ -
151
│ │ │ │ -
152 private:
│ │ │ │ -
157 static auto p2Layout()
│ │ │ │ -
158 {
│ │ │ │ -
159 return [](Dune::GeometryType type, int gridDim)
│ │ │ │ -
160 {
│ │ │ │ -
161 if (type.isVertex())
│ │ │ │ -
162 return 1;
│ │ │ │ -
163 if (type.isLine())
│ │ │ │ -
164 return 1;
│ │ │ │ -
165 if (type.isTriangle())
│ │ │ │ -
166 return 0;
│ │ │ │ -
167 assert(type.isTetrahedron());
│ │ │ │ -
168 return 0;
│ │ │ │ -
169 };
│ │ │ │ -
170 }
│ │ │ │ -
171 };
│ │ │ │ -
172
│ │ │ │ -
173
│ │ │ │ -
174
│ │ │ │ -
175 template<typename GV, int k, typename R>
│ │ │ │ - │ │ │ │ -
177 public LeafBasisNode
│ │ │ │ -
178 {
│ │ │ │ -
179 static const int dim = GV::dimension;
│ │ │ │ -
180
│ │ │ │ -
181 public:
│ │ │ │ +
120 const GridView& gridView() const
│ │ │ │ +
121 {
│ │ │ │ +
122 return gridView_;
│ │ │ │ +
123 }
│ │ │ │ +
124
│ │ │ │ +
126 void update (const GridView& gv)
│ │ │ │ +
127 {
│ │ │ │ +
128 gridView_ = gv;
│ │ │ │ +
129 }
│ │ │ │ +
130
│ │ │ │ + │ │ │ │ +
135 {
│ │ │ │ +
136 return Node{order_};
│ │ │ │ +
137 }
│ │ │ │ +
138
│ │ │ │ + │ │ │ │ +
141 {
│ │ │ │ +
142 switch (dim)
│ │ │ │ +
143 {
│ │ │ │ +
144 case 1:
│ │ │ │ +
145 return dofsPerCube(0) * ((size_type)gridView_.size(dim))
│ │ │ │ +
146 + dofsPerCube(1) * ((size_type)gridView_.size(dim-1));
│ │ │ │ +
147 case 2:
│ │ │ │ +
148 {
│ │ │ │ +
149 return dofsPerCube(0) * ((size_type)gridView_.size(dim))
│ │ │ │ +
150 + dofsPerCube(1) * ((size_type)gridView_.size(dim-1))
│ │ │ │ +
151 + dofsPerSimplex(2) * ((size_type)gridView_.size(Dune::GeometryTypes::triangle))
│ │ │ │ +
152 + dofsPerCube(2) * ((size_type)gridView_.size(Dune::GeometryTypes::quadrilateral));
│ │ │ │ +
153 }
│ │ │ │ +
154 case 3:
│ │ │ │ +
155 {
│ │ │ │ +
156 return dofsPerCube(0) * ((size_type)gridView_.size(dim))
│ │ │ │ +
157 + dofsPerCube(1) * ((size_type)gridView_.size(dim-1))
│ │ │ │ +
158 + dofsPerSimplex(2) * ((size_type)gridView_.size(Dune::GeometryTypes::triangle))
│ │ │ │ +
159 + dofsPerCube(2) * ((size_type)gridView_.size(Dune::GeometryTypes::quadrilateral))
│ │ │ │ +
160 + dofsPerSimplex(3) * ((size_type)gridView_.size(Dune::GeometryTypes::tetrahedron))
│ │ │ │ +
161 + dofsPerPyramid() * ((size_type)gridView_.size(Dune::GeometryTypes::pyramid))
│ │ │ │ +
162 + dofsPerPrism() * ((size_type)gridView_.size(Dune::GeometryTypes::prism))
│ │ │ │ +
163 + dofsPerCube(3) * ((size_type)gridView_.size(Dune::GeometryTypes::hexahedron));
│ │ │ │ +
164 }
│ │ │ │ +
165 }
│ │ │ │ +
166 DUNE_THROW(Dune::NotImplemented, "No size method for " << dim << "d grids available yet!");
│ │ │ │ +
167 }
│ │ │ │ +
168
│ │ │ │ +
170 template<class SizePrefix>
│ │ │ │ +
171 size_type size(const SizePrefix& prefix) const
│ │ │ │ +
172 {
│ │ │ │ +
173 assert(prefix.size() == 0 || prefix.size() == 1);
│ │ │ │ +
174 return (prefix.size() == 0) ? size() : 0;
│ │ │ │ +
175 }
│ │ │ │ +
176
│ │ │ │ + │ │ │ │ +
179 {
│ │ │ │ +
180 return size();
│ │ │ │ +
181 }
│ │ │ │
182
│ │ │ │ -
183 using size_type = std::size_t;
│ │ │ │ -
184 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ -
185 using FiniteElement = HierarchicalP2LocalFiniteElement<typename GV::ctype,R,dim>;
│ │ │ │ -
186
│ │ │ │ - │ │ │ │ - │ │ │ │ -
189 element_(nullptr)
│ │ │ │ -
190 {}
│ │ │ │ -
191
│ │ │ │ -
193 const Element& element() const
│ │ │ │ -
194 {
│ │ │ │ -
195 return *element_;
│ │ │ │ -
196 }
│ │ │ │ -
197
│ │ │ │ - │ │ │ │ -
203 {
│ │ │ │ -
204 return finiteElement_;
│ │ │ │ -
205 }
│ │ │ │ -
206
│ │ │ │ -
208 void bind(const Element& e)
│ │ │ │ -
209 {
│ │ │ │ -
210 element_ = &e;
│ │ │ │ -
211
│ │ │ │ -
212 if (e.type() != finiteElement_.type())
│ │ │ │ -
213 DUNE_THROW(Dune::Exception,
│ │ │ │ -
214 "HierarchicalLagrange-elements do not exist for elements of type " << e.type());
│ │ │ │ -
215
│ │ │ │ -
216 this->setSize(finiteElement_.size());
│ │ │ │ -
217 }
│ │ │ │ -
218
│ │ │ │ -
219 protected:
│ │ │ │ -
220
│ │ │ │ -
221 unsigned int order() const
│ │ │ │ -
222 {
│ │ │ │ -
223 return 2;
│ │ │ │ -
224 }
│ │ │ │ -
225
│ │ │ │ - │ │ │ │ - │ │ │ │ -
228 };
│ │ │ │ -
229
│ │ │ │ -
230
│ │ │ │ -
231
│ │ │ │ -
232 namespace BasisFactory {
│ │ │ │ -
233
│ │ │ │ -
242 template<std::size_t k, typename R=double>
│ │ │ │ - │ │ │ │ -
244 {
│ │ │ │ -
245 return [](const auto& gridView) {
│ │ │ │ -
246 return HierarchicalLagrangePreBasis<std::decay_t<decltype(gridView)>, k, R>(gridView);
│ │ │ │ -
247 };
│ │ │ │ -
248 }
│ │ │ │ -
249
│ │ │ │ -
250 } // end namespace BasisFactory
│ │ │ │ -
251
│ │ │ │ -
262 template<typename GV, int k, typename R=double>
│ │ │ │ - │ │ │ │ -
264
│ │ │ │ -
265 } // end namespace Functions
│ │ │ │ -
266} // end namespace Dune
│ │ │ │ -
267
│ │ │ │ -
268#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICALLAGRANGEBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ -
auto hierarchicalLagrange()
Create a pre-basis factory that can create a HierarchicalLagrange pre-basis.
Definition: hierarchicallagrangebasis.hh:243
│ │ │ │ + │ │ │ │ +
185 {
│ │ │ │ +
186 // That cast to unsigned int is necessary because GV::dimension is an enum,
│ │ │ │ +
187 // which is not recognized by the power method as an integer type...
│ │ │ │ +
188 return power(order()+1, (unsigned int)GV::dimension);
│ │ │ │ +
189 }
│ │ │ │ +
190
│ │ │ │ +
191 template<typename It>
│ │ │ │ +
192 It indices(const Node& node, It it) const
│ │ │ │ +
193 {
│ │ │ │ +
194 for (size_type i = 0, end = node.finiteElement().size() ; i < end ; ++it, ++i)
│ │ │ │ +
195 {
│ │ │ │ +
196 Dune::LocalKey localKey = node.finiteElement().localCoefficients().localKey(i);
│ │ │ │ +
197 const auto& gridIndexSet = gridView().indexSet();
│ │ │ │ +
198 const auto& element = node.element();
│ │ │ │ +
199
│ │ │ │ +
200 // The dimension of the entity that the current dof is related to
│ │ │ │ +
201 auto dofDim = dim - localKey.codim();
│ │ │ │ +
202
│ │ │ │ +
203 // Test for a vertex dof
│ │ │ │ +
204 // The test for k==1 is redundant, but having it here allows the compiler to conclude
│ │ │ │ +
205 // at compile-time that the dofDim==0 case is the only one that will ever happen.
│ │ │ │ +
206 // This leads to measurable speed-up: see
│ │ │ │ +
207 // https://gitlab.dune-project.org/staging/dune-functions/issues/30
│ │ │ │ +
208 if (k==1 || dofDim==0) {
│ │ │ │ +
209 *it = {{ (size_type)(gridIndexSet.subIndex(element,localKey.subEntity(),dim)) }};
│ │ │ │ +
210 continue;
│ │ │ │ +
211 }
│ │ │ │ +
212
│ │ │ │ +
213 if (dofDim==1)
│ │ │ │ +
214 { // edge dof
│ │ │ │ +
215 if (dim==1) // element dof -- any local numbering is fine
│ │ │ │ +
216 {
│ │ │ │ +
217 *it = {{ edgeOffset_
│ │ │ │ +
218 + dofsPerCube(1) * ((size_type)gridIndexSet.subIndex(element,0,0))
│ │ │ │ +
219 + localKey.index() }};
│ │ │ │ +
220 continue;
│ │ │ │ +
221 }
│ │ │ │ +
222 else
│ │ │ │ +
223 {
│ │ │ │ +
224 const auto refElement
│ │ │ │ +
225 = Dune::referenceElement<double,dim>(element.type());
│ │ │ │ +
226
│ │ │ │ +
227 // We have to reverse the numbering if the local element edge is
│ │ │ │ +
228 // not aligned with the global edge.
│ │ │ │ +
229 auto v0 = (size_type)gridIndexSet.subIndex(element,refElement.subEntity(localKey.subEntity(),localKey.codim(),0,dim),dim);
│ │ │ │ +
230 auto v1 = (size_type)gridIndexSet.subIndex(element,refElement.subEntity(localKey.subEntity(),localKey.codim(),1,dim),dim);
│ │ │ │ +
231 bool flip = (v0 > v1);
│ │ │ │ +
232 *it = {{ (flip)
│ │ │ │ + │ │ │ │ +
234 + dofsPerCube(1)*((size_type)gridIndexSet.subIndex(element,localKey.subEntity(),localKey.codim()))
│ │ │ │ +
235 + (dofsPerCube(1)-1)-localKey.index()
│ │ │ │ + │ │ │ │ +
237 + dofsPerCube(1)*((size_type)gridIndexSet.subIndex(element,localKey.subEntity(),localKey.codim()))
│ │ │ │ +
238 + localKey.index() }};
│ │ │ │ +
239 continue;
│ │ │ │ +
240 }
│ │ │ │ +
241 }
│ │ │ │ +
242
│ │ │ │ +
243 if (dofDim==2)
│ │ │ │ +
244 {
│ │ │ │ +
245 if (dim==2) // element dof -- any local numbering is fine
│ │ │ │ +
246 {
│ │ │ │ +
247 if (element.type().isTriangle())
│ │ │ │ +
248 {
│ │ │ │ +
249 *it = {{ triangleOffset_ + dofsPerSimplex(2)*((size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }};
│ │ │ │ +
250 continue;
│ │ │ │ +
251 }
│ │ │ │ +
252 else if (element.type().isQuadrilateral())
│ │ │ │ +
253 {
│ │ │ │ +
254 *it = {{ quadrilateralOffset_ + dofsPerCube(2)*((size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }};
│ │ │ │ +
255 continue;
│ │ │ │ +
256 }
│ │ │ │ +
257 else
│ │ │ │ +
258 DUNE_THROW(Dune::NotImplemented, "2d elements have to be triangles or quadrilaterals");
│ │ │ │ +
259 } else
│ │ │ │ +
260 {
│ │ │ │ +
261 const auto refElement
│ │ │ │ +
262 = Dune::referenceElement<double,dim>(element.type());
│ │ │ │ +
263
│ │ │ │ +
264 if (order()>3)
│ │ │ │ +
265 DUNE_THROW(Dune::NotImplemented, "LagrangeBasis for 3D grids is only implemented if k<=3");
│ │ │ │ +
266
│ │ │ │ +
267 if (order()==3 and !refElement.type(localKey.subEntity(), localKey.codim()).isTriangle())
│ │ │ │ +
268 DUNE_THROW(Dune::NotImplemented, "LagrangeBasis for 3D grids with k==3 is only implemented if the grid is a simplex grid");
│ │ │ │ +
269
│ │ │ │ +
270 *it = {{ triangleOffset_ + ((size_type)gridIndexSet.subIndex(element,localKey.subEntity(),localKey.codim())) }};
│ │ │ │ +
271 continue;
│ │ │ │ +
272 }
│ │ │ │ +
273 }
│ │ │ │ +
274
│ │ │ │ +
275 if (dofDim==3)
│ │ │ │ +
276 {
│ │ │ │ +
277 if (dim==3) // element dof -- any local numbering is fine
│ │ │ │ +
278 {
│ │ │ │ +
279 if (element.type().isTetrahedron())
│ │ │ │ +
280 {
│ │ │ │ +
281 *it = {{ tetrahedronOffset_ + dofsPerSimplex(3)*((size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }};
│ │ │ │ +
282 continue;
│ │ │ │ +
283 }
│ │ │ │ +
284 else if (element.type().isHexahedron())
│ │ │ │ +
285 {
│ │ │ │ +
286 *it = {{ hexahedronOffset_ + dofsPerCube(3)*((size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }};
│ │ │ │ +
287 continue;
│ │ │ │ +
288 }
│ │ │ │ +
289 else if (element.type().isPrism())
│ │ │ │ +
290 {
│ │ │ │ +
291 *it = {{ prismOffset_ + dofsPerPrism()*((size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }};
│ │ │ │ +
292 continue;
│ │ │ │ +
293 }
│ │ │ │ +
294 else if (element.type().isPyramid())
│ │ │ │ +
295 {
│ │ │ │ +
296 *it = {{ pyramidOffset_ + dofsPerPyramid()*((size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }};
│ │ │ │ +
297 continue;
│ │ │ │ +
298 }
│ │ │ │ +
299 else
│ │ │ │ +
300 DUNE_THROW(Dune::NotImplemented, "3d elements have to be tetrahedra, hexahedra, prisms, or pyramids");
│ │ │ │ +
301 } else
│ │ │ │ +
302 DUNE_THROW(Dune::NotImplemented, "Grids of dimension larger than 3 are no supported");
│ │ │ │ +
303 }
│ │ │ │ +
304 DUNE_THROW(Dune::NotImplemented, "Grid contains elements not supported for the LagrangeBasis");
│ │ │ │ +
305 }
│ │ │ │ +
306 return it;
│ │ │ │ +
307 }
│ │ │ │ +
308
│ │ │ │ +
310 unsigned int order() const
│ │ │ │ +
311 {
│ │ │ │ +
312 return (useDynamicOrder) ? order_ : k;
│ │ │ │ +
313 }
│ │ │ │ +
314
│ │ │ │ +
315protected:
│ │ │ │ + │ │ │ │ +
317
│ │ │ │ +
318 // Run-time order, only valid if k<0
│ │ │ │ +
319 const unsigned int order_;
│ │ │ │ +
320
│ │ │ │ +
322 size_type dofsPerSimplex(std::size_t simplexDim) const
│ │ │ │ +
323 {
│ │ │ │ +
324 return useDynamicOrder ? dofsPerSimplex_[simplexDim] : computeDofsPerSimplex(simplexDim);
│ │ │ │ +
325 }
│ │ │ │ +
326
│ │ │ │ +
328 size_type dofsPerCube(std::size_t cubeDim) const
│ │ │ │ +
329 {
│ │ │ │ +
330 return useDynamicOrder ? dofsPerCube_[cubeDim] : computeDofsPerCube(cubeDim);
│ │ │ │ +
331 }
│ │ │ │ +
332
│ │ │ │ + │ │ │ │ +
334 {
│ │ │ │ +
335 return useDynamicOrder ? dofsPerPrism_ : computeDofsPerPrism();
│ │ │ │ +
336 }
│ │ │ │ +
337
│ │ │ │ + │ │ │ │ +
339 {
│ │ │ │ +
340 return useDynamicOrder ? dofsPerPyramid_ : computeDofsPerPyramid();
│ │ │ │ +
341 }
│ │ │ │ +
342
│ │ │ │ +
344 size_type computeDofsPerSimplex(std::size_t simplexDim) const
│ │ │ │ +
345 {
│ │ │ │ +
346 return order() == 0 ? (dim == simplexDim ? 1 : 0) : Dune::binomial(std::size_t(order()-1),simplexDim);
│ │ │ │ +
347 }
│ │ │ │ +
348
│ │ │ │ +
350 size_type computeDofsPerCube(std::size_t cubeDim) const
│ │ │ │ +
351 {
│ │ │ │ +
352 return order() == 0 ? (dim == cubeDim ? 1 : 0) : Dune::power(order()-1, cubeDim);
│ │ │ │ +
353 }
│ │ │ │ +
354
│ │ │ │ + │ │ │ │ +
356 {
│ │ │ │ +
357 return order() == 0 ? (dim == 3 ? 1 : 0) : (order()-1)*(order()-1)*(order()-2)/2;
│ │ │ │ +
358 }
│ │ │ │ +
359
│ │ │ │ + │ │ │ │ +
361 {
│ │ │ │ +
362 return order() == 0 ? (dim == 3 ? 1 : 0) : (order()-2)*(order()-1)*(2*order()-3)/6;
│ │ │ │ +
363 }
│ │ │ │ +
364
│ │ │ │ +
365 // When the order is given at run-time, the following numbers are pre-computed:
│ │ │ │ +
366 std::array<size_type,dim+1> dofsPerSimplex_;
│ │ │ │ +
367 std::array<size_type,dim+1> dofsPerCube_;
│ │ │ │ + │ │ │ │ + │ │ │ │ +
370
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
379
│ │ │ │ +
380};
│ │ │ │ +
381
│ │ │ │ +
382
│ │ │ │ +
383
│ │ │ │ +
384template<typename GV, int k, typename R>
│ │ │ │ + │ │ │ │ +
386 public LeafBasisNode
│ │ │ │ +
387{
│ │ │ │ +
388 // Stores LocalFiniteElement implementations with run-time order as a function of GeometryType
│ │ │ │ +
389 template<typename Domain, typename Range, int dim>
│ │ │ │ +
390 class LagrangeRunTimeLFECache
│ │ │ │ +
391 {
│ │ │ │ +
392 public:
│ │ │ │ +
393 using FiniteElementType = LagrangeLocalFiniteElement<EquidistantPointSet,dim,Domain,Range>;
│ │ │ │ +
394
│ │ │ │ +
395 const FiniteElementType& get(GeometryType type)
│ │ │ │ +
396 {
│ │ │ │ +
397 auto i = data_.find(type);
│ │ │ │ +
398 if (i==data_.end())
│ │ │ │ +
399 i = data_.emplace(type,FiniteElementType(type,order_)).first;
│ │ │ │ +
400 return (*i).second;
│ │ │ │ +
401 }
│ │ │ │ +
402
│ │ │ │ +
403 std::map<GeometryType, FiniteElementType> data_;
│ │ │ │ +
404 unsigned int order_;
│ │ │ │ +
405 };
│ │ │ │ +
406
│ │ │ │ +
407 static constexpr int dim = GV::dimension;
│ │ │ │ +
408 static constexpr bool useDynamicOrder = (k<0);
│ │ │ │ +
409
│ │ │ │ +
410 using FiniteElementCache = typename std::conditional<(useDynamicOrder),
│ │ │ │ +
411 LagrangeRunTimeLFECache<typename GV::ctype, R, dim>,
│ │ │ │ +
412 PQkLocalFiniteElementCache<typename GV::ctype, R, dim, k>
│ │ │ │ +
413 >::type;
│ │ │ │ +
414
│ │ │ │ +
415public:
│ │ │ │ +
416
│ │ │ │ +
417 using size_type = std::size_t;
│ │ │ │ +
418 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ +
419 using FiniteElement = typename FiniteElementCache::FiniteElementType;
│ │ │ │ +
420
│ │ │ │ + │ │ │ │ +
423 finiteElement_(nullptr),
│ │ │ │ +
424 element_(nullptr)
│ │ │ │ +
425 {}
│ │ │ │ +
426
│ │ │ │ +
428 LagrangeNode(unsigned int order) :
│ │ │ │ +
429 order_(order),
│ │ │ │ +
430 finiteElement_(nullptr),
│ │ │ │ +
431 element_(nullptr)
│ │ │ │ +
432 {
│ │ │ │ +
433 // Only the cache for the run-time-order case (i.e., k<0), has the 'order_' member
│ │ │ │ +
434 if constexpr (useDynamicOrder)
│ │ │ │ +
435 cache_.order_ = order;
│ │ │ │ +
436 }
│ │ │ │ +
437
│ │ │ │ +
439 const Element& element() const
│ │ │ │ +
440 {
│ │ │ │ +
441 return *element_;
│ │ │ │ +
442 }
│ │ │ │ +
443
│ │ │ │ + │ │ │ │ +
449 {
│ │ │ │ +
450 return *finiteElement_;
│ │ │ │ +
451 }
│ │ │ │ +
452
│ │ │ │ +
454 void bind(const Element& e)
│ │ │ │ +
455 {
│ │ │ │ +
456 element_ = &e;
│ │ │ │ +
457 finiteElement_ = &(cache_.get(element_->type()));
│ │ │ │ +
458 this->setSize(finiteElement_->size());
│ │ │ │ +
459 }
│ │ │ │ +
460
│ │ │ │ +
461protected:
│ │ │ │ +
462
│ │ │ │ +
463 unsigned int order() const
│ │ │ │ +
464 {
│ │ │ │ +
465 return (useDynamicOrder) ? order_ : k;
│ │ │ │ +
466 }
│ │ │ │ +
467
│ │ │ │ +
468 // Run-time order, only valid if k<0
│ │ │ │ +
469 unsigned int order_;
│ │ │ │ +
470
│ │ │ │ +
471 FiniteElementCache cache_;
│ │ │ │ + │ │ │ │ + │ │ │ │ +
474};
│ │ │ │ +
475
│ │ │ │ +
476
│ │ │ │ +
477
│ │ │ │ +
478namespace BasisFactory {
│ │ │ │ +
479
│ │ │ │ +
488template<std::size_t k, typename R=double>
│ │ │ │ + │ │ │ │ +
490{
│ │ │ │ +
491 return [](const auto& gridView) {
│ │ │ │ +
492 return LagrangePreBasis<std::decay_t<decltype(gridView)>, k, R>(gridView);
│ │ │ │ +
493 };
│ │ │ │ +
494}
│ │ │ │ +
495
│ │ │ │ +
503template<typename R=double>
│ │ │ │ +
504auto lagrange(int order)
│ │ │ │ +
505{
│ │ │ │ +
506 return [=](const auto& gridView) {
│ │ │ │ +
507 return LagrangePreBasis<std::decay_t<decltype(gridView)>, -1, R>(gridView, order);
│ │ │ │ +
508 };
│ │ │ │ +
509}
│ │ │ │ +
510
│ │ │ │ +
511} // end namespace BasisFactory
│ │ │ │ +
512
│ │ │ │ +
513
│ │ │ │ +
514
│ │ │ │ +
538template<typename GV, int k=-1, typename R=double>
│ │ │ │ + │ │ │ │ +
540
│ │ │ │ +
541
│ │ │ │ +
542
│ │ │ │ +
543
│ │ │ │ +
544
│ │ │ │ +
545} // end namespace Functions
│ │ │ │ +
546} // end namespace Dune
│ │ │ │ +
547
│ │ │ │ +
548
│ │ │ │ +
549#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ +
auto power(ChildPreBasisFactory &&childPreBasisFactory, const IndexMergingStrategy &)
Create a pre-basis factory that can build a PowerPreBasis.
Definition: powerbasis.hh:369
│ │ │ │ +
auto lagrange()
Create a pre-basis factory that can create a Lagrange pre-basis.
Definition: lagrangebasis.hh:489
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │
Global basis for given pre-basis.
Definition: defaultglobalbasis.hh:46
│ │ │ │ -
Definition: hierarchicallagrangebasis.hh:178
│ │ │ │ -
HierarchicalP2LocalFiniteElement< typename GV::ctype, R, dim > FiniteElement
Definition: hierarchicallagrangebasis.hh:185
│ │ │ │ -
const Element & element() const
Return current element, throw if unbound.
Definition: hierarchicallagrangebasis.hh:193
│ │ │ │ -
void bind(const Element &e)
Bind to element.
Definition: hierarchicallagrangebasis.hh:208
│ │ │ │ -
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition: hierarchicallagrangebasis.hh:202
│ │ │ │ -
const Element * element_
Definition: hierarchicallagrangebasis.hh:227
│ │ │ │ -
const FiniteElement finiteElement_
Definition: hierarchicallagrangebasis.hh:226
│ │ │ │ -
unsigned int order() const
Definition: hierarchicallagrangebasis.hh:221
│ │ │ │ -
HierarchicalLagrangeNode()
Definition: hierarchicallagrangebasis.hh:187
│ │ │ │ -
std::size_t size_type
Definition: hierarchicallagrangebasis.hh:183
│ │ │ │ -
typename GV::template Codim< 0 >::Entity Element
Definition: hierarchicallagrangebasis.hh:184
│ │ │ │ -
A pre-basis for a hierarchical basis.
Definition: hierarchicallagrangebasis.hh:49
│ │ │ │ -
std::size_t size_type
Type used for indices and size information.
Definition: hierarchicallagrangebasis.hh:58
│ │ │ │ -
unsigned int order() const
Definition: hierarchicallagrangebasis.hh:145
│ │ │ │ -
Node makeNode() const
Create tree node.
Definition: hierarchicallagrangebasis.hh:94
│ │ │ │ -
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition: hierarchicallagrangebasis.hh:123
│ │ │ │ -
static constexpr size_type multiIndexBufferSize
Definition: hierarchicallagrangebasis.hh:65
│ │ │ │ -
void update(const GridView &gv)
Update the stored grid view & MultipleCodimMultipleGeomTypeMapper, to be called if the grid has chang...
Definition: hierarchicallagrangebasis.hh:85
│ │ │ │ -
MultipleCodimMultipleGeomTypeMapper< GridView > mcmgMapper_
Definition: hierarchicallagrangebasis.hh:150
│ │ │ │ -
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition: hierarchicallagrangebasis.hh:114
│ │ │ │ -
GV GridView
The grid view that the FE basis is defined on.
Definition: hierarchicallagrangebasis.hh:55
│ │ │ │ -
HierarchicalLagrangePreBasis(const GridView &gv)
Constructor for a given grid view object with layout for second order.
Definition: hierarchicallagrangebasis.hh:71
│ │ │ │ -
static constexpr size_type maxMultiIndexSize
Definition: hierarchicallagrangebasis.hh:63
│ │ │ │ -
size_type size(const SizePrefix prefix) const
Return number of possible values for next position in multi index.
Definition: hierarchicallagrangebasis.hh:107
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: hierarchicallagrangebasis.hh:79
│ │ │ │ -
GridView gridView_
Definition: hierarchicallagrangebasis.hh:143
│ │ │ │ -
size_type size() const
Same as size(prefix) with empty prefix.
Definition: hierarchicallagrangebasis.hh:100
│ │ │ │ -
void initializeIndices()
Initialize the global indices.
Definition: hierarchicallagrangebasis.hh:75
│ │ │ │ -
It indices(const Node &node, It it) const
Definition: hierarchicallagrangebasis.hh:130
│ │ │ │ -
static constexpr size_type minMultiIndexSize
Definition: hierarchicallagrangebasis.hh:64
│ │ │ │ +
Definition: lagrangebasis.hh:387
│ │ │ │ +
LagrangeNode(unsigned int order)
Constructor with a run-time order.
Definition: lagrangebasis.hh:428
│ │ │ │ +
unsigned int order() const
Definition: lagrangebasis.hh:463
│ │ │ │ +
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition: lagrangebasis.hh:448
│ │ │ │ +
const Element * element_
Definition: lagrangebasis.hh:473
│ │ │ │ +
const Element & element() const
Return current element, throw if unbound.
Definition: lagrangebasis.hh:439
│ │ │ │ +
FiniteElementCache cache_
Definition: lagrangebasis.hh:471
│ │ │ │ +
typename FiniteElementCache::FiniteElementType FiniteElement
Definition: lagrangebasis.hh:419
│ │ │ │ +
void bind(const Element &e)
Bind to element.
Definition: lagrangebasis.hh:454
│ │ │ │ +
typename GV::template Codim< 0 >::Entity Element
Definition: lagrangebasis.hh:418
│ │ │ │ +
const FiniteElement * finiteElement_
Definition: lagrangebasis.hh:472
│ │ │ │ +
unsigned int order_
Definition: lagrangebasis.hh:469
│ │ │ │ +
std::size_t size_type
Definition: lagrangebasis.hh:417
│ │ │ │ +
LagrangeNode()
Constructor without order (uses the compile-time value)
Definition: lagrangebasis.hh:422
│ │ │ │ +
A pre-basis for a PQ-lagrange bases with given order.
Definition: lagrangebasis.hh:55
│ │ │ │ +
size_type dofsPerPrism() const
Definition: lagrangebasis.hh:333
│ │ │ │ +
size_type computeDofsPerCube(std::size_t cubeDim) const
Number of degrees of freedom assigned to a cube (without the ones assigned to its faces!...
Definition: lagrangebasis.hh:350
│ │ │ │ +
size_type computeDofsPerSimplex(std::size_t simplexDim) const
Number of degrees of freedom assigned to a simplex (without the ones assigned to its faces!...
Definition: lagrangebasis.hh:344
│ │ │ │ +
static constexpr size_type maxMultiIndexSize
Definition: lagrangebasis.hh:70
│ │ │ │ +
size_type computeDofsPerPrism() const
Definition: lagrangebasis.hh:355
│ │ │ │ +
size_type edgeOffset_
Definition: lagrangebasis.hh:372
│ │ │ │ +
std::array< size_type, dim+1 > dofsPerSimplex_
Definition: lagrangebasis.hh:366
│ │ │ │ +
It indices(const Node &node, It it) const
Definition: lagrangebasis.hh:192
│ │ │ │ +
size_type vertexOffset_
Definition: lagrangebasis.hh:371
│ │ │ │ +
size_type dofsPerSimplex(std::size_t simplexDim) const
Number of degrees of freedom assigned to a simplex (without the ones assigned to its faces!...
Definition: lagrangebasis.hh:322
│ │ │ │ +
std::size_t size_type
Type used for indices and size information.
Definition: lagrangebasis.hh:65
│ │ │ │ +
size_type pyramidOffset_
Definition: lagrangebasis.hh:376
│ │ │ │ +
size_type prismOffset_
Definition: lagrangebasis.hh:377
│ │ │ │ +
size_type tetrahedronOffset_
Definition: lagrangebasis.hh:375
│ │ │ │ +
void initializeIndices()
Initialize the global indices.
Definition: lagrangebasis.hh:96
│ │ │ │ +
size_type computeDofsPerPyramid() const
Definition: lagrangebasis.hh:360
│ │ │ │ +
LagrangePreBasis(const GridView &gv, unsigned int order)
Constructor for a given grid view object and run-time order.
Definition: lagrangebasis.hh:80
│ │ │ │ +
size_type dofsPerPyramid_
Definition: lagrangebasis.hh:369
│ │ │ │ +
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition: lagrangebasis.hh:178
│ │ │ │ +
LagrangePreBasis(const GridView &gv)
Constructor for a given grid view object with compile-time order.
Definition: lagrangebasis.hh:75
│ │ │ │ +
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition: lagrangebasis.hh:126
│ │ │ │ +
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition: lagrangebasis.hh:171
│ │ │ │ +
static constexpr size_type multiIndexBufferSize
Definition: lagrangebasis.hh:72
│ │ │ │ +
GV GridView
The grid view that the FE basis is defined on.
Definition: lagrangebasis.hh:62
│ │ │ │ +
size_type quadrilateralOffset_
Definition: lagrangebasis.hh:374
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: lagrangebasis.hh:120
│ │ │ │ +
GridView gridView_
Definition: lagrangebasis.hh:316
│ │ │ │ +
Node makeNode() const
Create tree node.
Definition: lagrangebasis.hh:134
│ │ │ │ +
unsigned int order() const
Polynomial order used in the local Lagrange finite-elements.
Definition: lagrangebasis.hh:310
│ │ │ │ +
const unsigned int order_
Definition: lagrangebasis.hh:319
│ │ │ │ +
std::array< size_type, dim+1 > dofsPerCube_
Definition: lagrangebasis.hh:367
│ │ │ │ +
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition: lagrangebasis.hh:184
│ │ │ │ +
size_type size() const
Same as size(prefix) with empty prefix.
Definition: lagrangebasis.hh:140
│ │ │ │ +
size_type dofsPerPrism_
Definition: lagrangebasis.hh:368
│ │ │ │ +
size_type dofsPerCube(std::size_t cubeDim) const
Number of degrees of freedom assigned to a cube (without the ones assigned to its faces!...
Definition: lagrangebasis.hh:328
│ │ │ │ +
size_type triangleOffset_
Definition: lagrangebasis.hh:373
│ │ │ │ +
size_type hexahedronOffset_
Definition: lagrangebasis.hh:378
│ │ │ │ +
static constexpr size_type minMultiIndexSize
Definition: lagrangebasis.hh:71
│ │ │ │ +
size_type dofsPerPyramid() const
Definition: lagrangebasis.hh:338
│ │ │ │
void setSize(const size_type size)
Definition: nodes.hh:164
│ │ │ │
Definition: nodes.hh:186
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,354 +5,743 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -hierarchicallagrangebasis.hh │ │ │ │ │ +lagrangebasis.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICALLAGRANGEBASIS_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICALLAGRANGEBASIS_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ 8 │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ 12 │ │ │ │ │ - 13namespace Dune { │ │ │ │ │ - 14 namespace Functions { │ │ │ │ │ + 13#include │ │ │ │ │ + 14#include │ │ │ │ │ 15 │ │ │ │ │ - 16 / │ │ │ │ │ + 16 │ │ │ │ │ + 17namespace Dune { │ │ │ │ │ + 18namespace Functions { │ │ │ │ │ + 19 │ │ │ │ │ + 20/ │ │ │ │ │ / ***************************************************************************** │ │ │ │ │ - 17 // Implementation for Hierarchical Lagrange Basis │ │ │ │ │ - 18 // │ │ │ │ │ - 19 // -- only order k=2 is implemented up to now -- │ │ │ │ │ - 20 // -- currently only supports simplex grids -- │ │ │ │ │ - 21 // │ │ │ │ │ - 22 // This is the reusable part of the HierarchicalLagrangeBasis. It contains │ │ │ │ │ - 23 // │ │ │ │ │ - 24 // HierarchicalLagrangePreBasis │ │ │ │ │ - 25 // HierarchicalLagrangeNode │ │ │ │ │ - 26 // │ │ │ │ │ - 27 // The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ + 21// This is the reusable part of the LagrangeBasis. It contains │ │ │ │ │ + 22// │ │ │ │ │ + 23// LagrangePreBasis │ │ │ │ │ + 24// LagrangeNode │ │ │ │ │ + 25// │ │ │ │ │ + 26// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ shared │ │ │ │ │ - 28 // state. These components do _not_ depend on the global basis and can be │ │ │ │ │ - 29 // used without a global basis. │ │ │ │ │ - 30 / │ │ │ │ │ + 27// state. These components do _not_ depend on the global basis and local │ │ │ │ │ +view │ │ │ │ │ + 28// and can be used without a global basis. │ │ │ │ │ + 29/ │ │ │ │ │ / ***************************************************************************** │ │ │ │ │ - 31 │ │ │ │ │ - 32 template │ │ │ │ │ - 33 class HierarchicalLagrangeNode; │ │ │ │ │ - 34 │ │ │ │ │ - 35 template │ │ │ │ │ - 36 class HierarchicalLagrangePreBasis; │ │ │ │ │ + 30 │ │ │ │ │ + 31template │ │ │ │ │ + 32class LagrangeNode; │ │ │ │ │ + 33 │ │ │ │ │ + 34template │ │ │ │ │ + 35class LagrangePreBasis; │ │ │ │ │ + 36 │ │ │ │ │ 37 │ │ │ │ │ - 47 template │ │ │ │ │ -48 class HierarchicalLagrangePreBasis │ │ │ │ │ - 49 { │ │ │ │ │ - 50 static const int dim = GV::dimension; │ │ │ │ │ - 51 │ │ │ │ │ - 52 public: │ │ │ │ │ - 53 │ │ │ │ │ -55 using GridView = GV; │ │ │ │ │ - 56 │ │ │ │ │ -58 using size_type = std::size_t; │ │ │ │ │ - 59 │ │ │ │ │ -61 using Node = HierarchicalLagrangeNode; │ │ │ │ │ - 62 │ │ │ │ │ -63 static constexpr size_type maxMultiIndexSize = 1; │ │ │ │ │ -64 static constexpr size_type minMultiIndexSize = 1; │ │ │ │ │ -65 static constexpr size_type multiIndexBufferSize = 1; │ │ │ │ │ + 38 │ │ │ │ │ + 53template │ │ │ │ │ +54class LagrangePreBasis │ │ │ │ │ + 55{ │ │ │ │ │ + 56 static const int dim = GV::dimension; │ │ │ │ │ + 57 static const bool useDynamicOrder = (k<0); │ │ │ │ │ + 58 │ │ │ │ │ + 59public: │ │ │ │ │ + 60 │ │ │ │ │ +62 using GridView = GV; │ │ │ │ │ + 63 │ │ │ │ │ +65 using size_type = std::size_t; │ │ │ │ │ 66 │ │ │ │ │ -71 HierarchicalLagrangePreBasis(const GridView& gv) : gridView_(gv) , │ │ │ │ │ -mcmgMapper_(gv,p2Layout()) │ │ │ │ │ - 72 {} │ │ │ │ │ +68 using Node = LagrangeNode; │ │ │ │ │ + 69 │ │ │ │ │ +70 static constexpr size_type maxMultiIndexSize = 1; │ │ │ │ │ +71 static constexpr size_type minMultiIndexSize = 1; │ │ │ │ │ +72 static constexpr size_type multiIndexBufferSize = 1; │ │ │ │ │ 73 │ │ │ │ │ -75 void initializeIndices() │ │ │ │ │ - 76 {} │ │ │ │ │ - 77 │ │ │ │ │ -79 const GridView& gridView() const │ │ │ │ │ - 80 { │ │ │ │ │ - 81 return gridView_; │ │ │ │ │ - 82 } │ │ │ │ │ - 83 │ │ │ │ │ -85 void update (const GridView& gv) │ │ │ │ │ - 86 { │ │ │ │ │ - 87 gridView_ = gv; │ │ │ │ │ - 88 mcmgMapper_.update(gv); │ │ │ │ │ - 89 } │ │ │ │ │ - 90 │ │ │ │ │ -94 Node makeNode() const │ │ │ │ │ - 95 { │ │ │ │ │ - 96 return Node{}; │ │ │ │ │ - 97 } │ │ │ │ │ - 98 │ │ │ │ │ -100 size_type size() const │ │ │ │ │ - 101 { │ │ │ │ │ - 102 return mcmgMapper_.size(); │ │ │ │ │ - 103 } │ │ │ │ │ +75 LagrangePreBasis(const GridView& gv) │ │ │ │ │ + 76 : LagrangePreBasis(gv, std::numeric_limits::max()) │ │ │ │ │ + 77 {} │ │ │ │ │ + 78 │ │ │ │ │ +80 LagrangePreBasis(const GridView& gv, unsigned int order) : │ │ │ │ │ + 81 gridView_(gv), order_(order) │ │ │ │ │ + 82 { │ │ │ │ │ + 83 if (!useDynamicOrder && order!=std::numeric_limits::max()) │ │ │ │ │ + 84 DUNE_THROW(RangeError, "Template argument k has to be -1 when supplying a │ │ │ │ │ +run-time order!"); │ │ │ │ │ + 85 │ │ │ │ │ + 86 for (int i=0; i<=dim; i++) │ │ │ │ │ + 87 { │ │ │ │ │ + 88 dofsPerCube_[i] = computeDofsPerCube(i); │ │ │ │ │ + 89 dofsPerSimplex_[i] = computeDofsPerSimplex(i); │ │ │ │ │ + 90 } │ │ │ │ │ + 91 dofsPerPrism_ = computeDofsPerPrism(); │ │ │ │ │ + 92 dofsPerPyramid_ = computeDofsPerPyramid(); │ │ │ │ │ + 93 } │ │ │ │ │ + 94 │ │ │ │ │ +96 void initializeIndices() │ │ │ │ │ + 97 { │ │ │ │ │ + 98 vertexOffset_ = 0; │ │ │ │ │ + 99 edgeOffset_ = vertexOffset_ + dofsPerCube(0) * ((size_type)gridView_.size │ │ │ │ │ +(dim)); │ │ │ │ │ + 100 │ │ │ │ │ + 101 if (dim>=2) │ │ │ │ │ + 102 { │ │ │ │ │ + 103 triangleOffset_ = edgeOffset_ + dofsPerCube(1) * ((size_type) │ │ │ │ │ +gridView_.size(dim-1)); │ │ │ │ │ 104 │ │ │ │ │ - 106 template │ │ │ │ │ -107 size_type size(const SizePrefix prefix) const │ │ │ │ │ - 108 { │ │ │ │ │ - 109 assert(prefix.size() == 0 || prefix.size() == 1); │ │ │ │ │ - 110 return (prefix.size() == 0) ? size() : 0; │ │ │ │ │ - 111 } │ │ │ │ │ + 105 quadrilateralOffset_ = triangleOffset_ + dofsPerSimplex(2) * ( │ │ │ │ │ +(size_type)gridView_.size(Dune::GeometryTypes::triangle)); │ │ │ │ │ + 106 } │ │ │ │ │ + 107 │ │ │ │ │ + 108 if (dim==3) { │ │ │ │ │ + 109 tetrahedronOffset_ = quadrilateralOffset_ + dofsPerCube(2) * ( │ │ │ │ │ +(size_type)gridView_.size(Dune::GeometryTypes::quadrilateral)); │ │ │ │ │ + 110 │ │ │ │ │ + 111 prismOffset_ = tetrahedronOffset_ + dofsPerSimplex(3) * ( │ │ │ │ │ +(size_type)gridView_.size(Dune::GeometryTypes::tetrahedron)); │ │ │ │ │ 112 │ │ │ │ │ -114 size_type dimension() const │ │ │ │ │ - 115 { │ │ │ │ │ - 116 return size(); │ │ │ │ │ + 113 hexahedronOffset_ = prismOffset_ + dofsPerPrism() * ( │ │ │ │ │ +(size_type)gridView_.size(Dune::GeometryTypes::prism)); │ │ │ │ │ + 114 │ │ │ │ │ + 115 pyramidOffset_ = hexahedronOffset_ + dofsPerCube(3) * ( │ │ │ │ │ +(size_type)gridView_.size(Dune::GeometryTypes::hexahedron)); │ │ │ │ │ + 116 } │ │ │ │ │ 117 } │ │ │ │ │ 118 │ │ │ │ │ -123 size_type maxNodeSize() const │ │ │ │ │ - 124 { │ │ │ │ │ - 125 // That cast to unsigned int is necessary because GV::dimension is an enum │ │ │ │ │ - 126 return Dune::binomial(std::size_t(order() + (unsigned int)GV:: │ │ │ │ │ -dimension),std::size_t(order())); │ │ │ │ │ - 127 } │ │ │ │ │ - 128 │ │ │ │ │ - 129 template │ │ │ │ │ -130 It indices(const Node& node, It it) const │ │ │ │ │ - 131 { │ │ │ │ │ - 132 for (size_type i = 0, end = node.finiteElement().size() ; i < end ; ++it, │ │ │ │ │ +120 const GridView& gridView() const │ │ │ │ │ + 121 { │ │ │ │ │ + 122 return gridView_; │ │ │ │ │ + 123 } │ │ │ │ │ + 124 │ │ │ │ │ +126 void update (const GridView& gv) │ │ │ │ │ + 127 { │ │ │ │ │ + 128 gridView_ = gv; │ │ │ │ │ + 129 } │ │ │ │ │ + 130 │ │ │ │ │ +134 Node makeNode() const │ │ │ │ │ + 135 { │ │ │ │ │ + 136 return Node{order_}; │ │ │ │ │ + 137 } │ │ │ │ │ + 138 │ │ │ │ │ +140 size_type size() const │ │ │ │ │ + 141 { │ │ │ │ │ + 142 switch (dim) │ │ │ │ │ + 143 { │ │ │ │ │ + 144 case 1: │ │ │ │ │ + 145 return dofsPerCube(0) * ((size_type)gridView_.size(dim)) │ │ │ │ │ + 146 + dofsPerCube(1) * ((size_type)gridView_.size(dim-1)); │ │ │ │ │ + 147 case 2: │ │ │ │ │ + 148 { │ │ │ │ │ + 149 return dofsPerCube(0) * ((size_type)gridView_.size(dim)) │ │ │ │ │ + 150 + dofsPerCube(1) * ((size_type)gridView_.size(dim-1)) │ │ │ │ │ + 151 + dofsPerSimplex(2) * ((size_type)gridView_.size(Dune::GeometryTypes:: │ │ │ │ │ +triangle)) │ │ │ │ │ + 152 + dofsPerCube(2) * ((size_type)gridView_.size(Dune::GeometryTypes:: │ │ │ │ │ +quadrilateral)); │ │ │ │ │ + 153 } │ │ │ │ │ + 154 case 3: │ │ │ │ │ + 155 { │ │ │ │ │ + 156 return dofsPerCube(0) * ((size_type)gridView_.size(dim)) │ │ │ │ │ + 157 + dofsPerCube(1) * ((size_type)gridView_.size(dim-1)) │ │ │ │ │ + 158 + dofsPerSimplex(2) * ((size_type)gridView_.size(Dune::GeometryTypes:: │ │ │ │ │ +triangle)) │ │ │ │ │ + 159 + dofsPerCube(2) * ((size_type)gridView_.size(Dune::GeometryTypes:: │ │ │ │ │ +quadrilateral)) │ │ │ │ │ + 160 + dofsPerSimplex(3) * ((size_type)gridView_.size(Dune::GeometryTypes:: │ │ │ │ │ +tetrahedron)) │ │ │ │ │ + 161 + dofsPerPyramid() * ((size_type)gridView_.size(Dune::GeometryTypes:: │ │ │ │ │ +pyramid)) │ │ │ │ │ + 162 + dofsPerPrism() * ((size_type)gridView_.size(Dune::GeometryTypes::prism)) │ │ │ │ │ + 163 + dofsPerCube(3) * ((size_type)gridView_.size(Dune::GeometryTypes:: │ │ │ │ │ +hexahedron)); │ │ │ │ │ + 164 } │ │ │ │ │ + 165 } │ │ │ │ │ + 166 DUNE_THROW(Dune::NotImplemented, "No size method for " << dim << "d grids │ │ │ │ │ +available yet!"); │ │ │ │ │ + 167 } │ │ │ │ │ + 168 │ │ │ │ │ + 170 template │ │ │ │ │ +171 size_type size(const SizePrefix& prefix) const │ │ │ │ │ + 172 { │ │ │ │ │ + 173 assert(prefix.size() == 0 || prefix.size() == 1); │ │ │ │ │ + 174 return (prefix.size() == 0) ? size() : 0; │ │ │ │ │ + 175 } │ │ │ │ │ + 176 │ │ │ │ │ +178 size_type dimension() const │ │ │ │ │ + 179 { │ │ │ │ │ + 180 return size(); │ │ │ │ │ + 181 } │ │ │ │ │ + 182 │ │ │ │ │ +184 size_type maxNodeSize() const │ │ │ │ │ + 185 { │ │ │ │ │ + 186 // That cast to unsigned int is necessary because GV::dimension is an │ │ │ │ │ +enum, │ │ │ │ │ + 187 // which is not recognized by the power method as an integer type... │ │ │ │ │ + 188 return power(order()+1, (unsigned int)GV::dimension); │ │ │ │ │ + 189 } │ │ │ │ │ + 190 │ │ │ │ │ + 191 template │ │ │ │ │ +192 It indices(const Node& node, It it) const │ │ │ │ │ + 193 { │ │ │ │ │ + 194 for (size_type i = 0, end = node.finiteElement().size() ; i < end ; ++it, │ │ │ │ │ ++i) │ │ │ │ │ - 133 { │ │ │ │ │ - 134 Dune::LocalKey localKey = node.finiteElement().localCoefficients │ │ │ │ │ + 195 { │ │ │ │ │ + 196 Dune::LocalKey localKey = node.finiteElement().localCoefficients │ │ │ │ │ ().localKey(i); │ │ │ │ │ - 135 const auto& element = node.element(); │ │ │ │ │ - 136 │ │ │ │ │ - 137 *it = {{ (size_type)(mcmgMapper_.subIndex(element,localKey.subEntity │ │ │ │ │ -(),localKey.codim())) }}; │ │ │ │ │ - 138 } │ │ │ │ │ - 139 return it; │ │ │ │ │ - 140 } │ │ │ │ │ - 141 │ │ │ │ │ - 142 protected: │ │ │ │ │ -143 GridView gridView_; │ │ │ │ │ - 144 │ │ │ │ │ -145 unsigned int order() const │ │ │ │ │ - 146 { │ │ │ │ │ - 147 return 2; │ │ │ │ │ - 148 } │ │ │ │ │ - 149 │ │ │ │ │ -150 MultipleCodimMultipleGeomTypeMapper mcmgMapper_; │ │ │ │ │ - 151 │ │ │ │ │ - 152 private: │ │ │ │ │ - 157 static auto p2Layout() │ │ │ │ │ - 158 { │ │ │ │ │ - 159 return [](Dune::GeometryType type, int gridDim) │ │ │ │ │ - 160 { │ │ │ │ │ - 161 if (type.isVertex()) │ │ │ │ │ - 162 return 1; │ │ │ │ │ - 163 if (type.isLine()) │ │ │ │ │ - 164 return 1; │ │ │ │ │ - 165 if (type.isTriangle()) │ │ │ │ │ - 166 return 0; │ │ │ │ │ - 167 assert(type.isTetrahedron()); │ │ │ │ │ - 168 return 0; │ │ │ │ │ - 169 }; │ │ │ │ │ - 170 } │ │ │ │ │ - 171 }; │ │ │ │ │ - 172 │ │ │ │ │ - 173 │ │ │ │ │ - 174 │ │ │ │ │ - 175 template │ │ │ │ │ -176 class HierarchicalLagrangeNode : │ │ │ │ │ - 177 public LeafBasisNode │ │ │ │ │ - 178 { │ │ │ │ │ - 179 static const int dim = GV::dimension; │ │ │ │ │ - 180 │ │ │ │ │ - 181 public: │ │ │ │ │ - 182 │ │ │ │ │ -183 using size_type = std::size_t; │ │ │ │ │ -184 using Element = typename GV::template Codim<0>::Entity; │ │ │ │ │ -185 using FiniteElement = HierarchicalP2LocalFiniteElement; │ │ │ │ │ - 186 │ │ │ │ │ -187 HierarchicalLagrangeNode() : │ │ │ │ │ - 188 finiteElement_(), │ │ │ │ │ - 189 element_(nullptr) │ │ │ │ │ - 190 {} │ │ │ │ │ - 191 │ │ │ │ │ -193 const Element& element() const │ │ │ │ │ - 194 { │ │ │ │ │ - 195 return *element_; │ │ │ │ │ - 196 } │ │ │ │ │ - 197 │ │ │ │ │ -202 const FiniteElement& finiteElement() const │ │ │ │ │ - 203 { │ │ │ │ │ - 204 return finiteElement_; │ │ │ │ │ - 205 } │ │ │ │ │ - 206 │ │ │ │ │ -208 void bind(const Element& e) │ │ │ │ │ - 209 { │ │ │ │ │ - 210 element_ = &e; │ │ │ │ │ - 211 │ │ │ │ │ - 212 if (e.type() != finiteElement_.type()) │ │ │ │ │ - 213 DUNE_THROW(Dune::Exception, │ │ │ │ │ - 214 "HierarchicalLagrange-elements do not exist for elements of type " << │ │ │ │ │ -e.type()); │ │ │ │ │ - 215 │ │ │ │ │ - 216 this->setSize(finiteElement_.size()); │ │ │ │ │ - 217 } │ │ │ │ │ - 218 │ │ │ │ │ - 219 protected: │ │ │ │ │ - 220 │ │ │ │ │ -221 unsigned int order() const │ │ │ │ │ - 222 { │ │ │ │ │ - 223 return 2; │ │ │ │ │ - 224 } │ │ │ │ │ - 225 │ │ │ │ │ -226 const FiniteElement finiteElement_; │ │ │ │ │ -227 const Element* element_; │ │ │ │ │ - 228 }; │ │ │ │ │ - 229 │ │ │ │ │ - 230 │ │ │ │ │ - 231 │ │ │ │ │ - 232 namespace BasisFactory { │ │ │ │ │ - 233 │ │ │ │ │ - 242 template │ │ │ │ │ -243 auto hierarchicalLagrange() │ │ │ │ │ + 197 const auto& gridIndexSet = gridView().indexSet(); │ │ │ │ │ + 198 const auto& element = node.element(); │ │ │ │ │ + 199 │ │ │ │ │ + 200 // The dimension of the entity that the current dof is related to │ │ │ │ │ + 201 auto dofDim = dim - localKey.codim(); │ │ │ │ │ + 202 │ │ │ │ │ + 203 // Test for a vertex dof │ │ │ │ │ + 204 // The test for k==1 is redundant, but having it here allows the compiler │ │ │ │ │ +to conclude │ │ │ │ │ + 205 // at compile-time that the dofDim==0 case is the only one that will ever │ │ │ │ │ +happen. │ │ │ │ │ + 206 // This leads to measurable speed-up: see │ │ │ │ │ + 207 // https://gitlab.dune-project.org/staging/dune-functions/issues/30 │ │ │ │ │ + 208 if (k==1 || dofDim==0) { │ │ │ │ │ + 209 *it = {{ (size_type)(gridIndexSet.subIndex(element,localKey.subEntity │ │ │ │ │ +(),dim)) }}; │ │ │ │ │ + 210 continue; │ │ │ │ │ + 211 } │ │ │ │ │ + 212 │ │ │ │ │ + 213 if (dofDim==1) │ │ │ │ │ + 214 { // edge dof │ │ │ │ │ + 215 if (dim==1) // element dof -- any local numbering is fine │ │ │ │ │ + 216 { │ │ │ │ │ + 217 *it = {{ edgeOffset_ │ │ │ │ │ + 218 + dofsPerCube(1) * ((size_type)gridIndexSet.subIndex(element,0,0)) │ │ │ │ │ + 219 + localKey.index() }}; │ │ │ │ │ + 220 continue; │ │ │ │ │ + 221 } │ │ │ │ │ + 222 else │ │ │ │ │ + 223 { │ │ │ │ │ + 224 const auto refElement │ │ │ │ │ + 225 = Dune::referenceElement(element.type()); │ │ │ │ │ + 226 │ │ │ │ │ + 227 // We have to reverse the numbering if the local element edge is │ │ │ │ │ + 228 // not aligned with the global edge. │ │ │ │ │ + 229 auto v0 = (size_type)gridIndexSet.subIndex(element,refElement.subEntity │ │ │ │ │ +(localKey.subEntity(),localKey.codim(),0,dim),dim); │ │ │ │ │ + 230 auto v1 = (size_type)gridIndexSet.subIndex(element,refElement.subEntity │ │ │ │ │ +(localKey.subEntity(),localKey.codim(),1,dim),dim); │ │ │ │ │ + 231 bool flip = (v0 > v1); │ │ │ │ │ + 232 *it = {{ (flip) │ │ │ │ │ + 233 ? edgeOffset_ │ │ │ │ │ + 234 + dofsPerCube(1)*((size_type)gridIndexSet.subIndex │ │ │ │ │ +(element,localKey.subEntity(),localKey.codim())) │ │ │ │ │ + 235 + (dofsPerCube(1)-1)-localKey.index() │ │ │ │ │ + 236 : edgeOffset_ │ │ │ │ │ + 237 + dofsPerCube(1)*((size_type)gridIndexSet.subIndex │ │ │ │ │ +(element,localKey.subEntity(),localKey.codim())) │ │ │ │ │ + 238 + localKey.index() }}; │ │ │ │ │ + 239 continue; │ │ │ │ │ + 240 } │ │ │ │ │ + 241 } │ │ │ │ │ + 242 │ │ │ │ │ + 243 if (dofDim==2) │ │ │ │ │ 244 { │ │ │ │ │ - 245 return [](const auto& gridView) { │ │ │ │ │ - 246 return HierarchicalLagrangePreBasis, k, │ │ │ │ │ -R>(gridView); │ │ │ │ │ - 247 }; │ │ │ │ │ - 248 } │ │ │ │ │ - 249 │ │ │ │ │ - 250 } // end namespace BasisFactory │ │ │ │ │ - 251 │ │ │ │ │ - 262 template │ │ │ │ │ -263 using HierarchicalLagrangeBasis = │ │ │ │ │ -DefaultGlobalBasis >; │ │ │ │ │ - 264 │ │ │ │ │ - 265 } // end namespace Functions │ │ │ │ │ - 266} // end namespace Dune │ │ │ │ │ - 267 │ │ │ │ │ - 268#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICALLAGRANGEBASIS_HH │ │ │ │ │ + 245 if (dim==2) // element dof -- any local numbering is fine │ │ │ │ │ + 246 { │ │ │ │ │ + 247 if (element.type().isTriangle()) │ │ │ │ │ + 248 { │ │ │ │ │ + 249 *it = {{ triangleOffset_ + dofsPerSimplex(2)*( │ │ │ │ │ +(size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }}; │ │ │ │ │ + 250 continue; │ │ │ │ │ + 251 } │ │ │ │ │ + 252 else if (element.type().isQuadrilateral()) │ │ │ │ │ + 253 { │ │ │ │ │ + 254 *it = {{ quadrilateralOffset_ + dofsPerCube(2)*( │ │ │ │ │ +(size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }}; │ │ │ │ │ + 255 continue; │ │ │ │ │ + 256 } │ │ │ │ │ + 257 else │ │ │ │ │ + 258 DUNE_THROW(Dune::NotImplemented, "2d elements have to be triangles or │ │ │ │ │ +quadrilaterals"); │ │ │ │ │ + 259 } else │ │ │ │ │ + 260 { │ │ │ │ │ + 261 const auto refElement │ │ │ │ │ + 262 = Dune::referenceElement(element.type()); │ │ │ │ │ + 263 │ │ │ │ │ + 264 if (order()>3) │ │ │ │ │ + 265 DUNE_THROW(Dune::NotImplemented, "LagrangeBasis for 3D grids is only │ │ │ │ │ +implemented if k<=3"); │ │ │ │ │ + 266 │ │ │ │ │ + 267 if (order()==3 and !refElement.type(localKey.subEntity(), localKey.codim │ │ │ │ │ +()).isTriangle()) │ │ │ │ │ + 268 DUNE_THROW(Dune::NotImplemented, "LagrangeBasis for 3D grids with k==3 is │ │ │ │ │ +only implemented if the grid is a simplex grid"); │ │ │ │ │ + 269 │ │ │ │ │ + 270 *it = {{ triangleOffset_ + ((size_type)gridIndexSet.subIndex │ │ │ │ │ +(element,localKey.subEntity(),localKey.codim())) }}; │ │ │ │ │ + 271 continue; │ │ │ │ │ + 272 } │ │ │ │ │ + 273 } │ │ │ │ │ + 274 │ │ │ │ │ + 275 if (dofDim==3) │ │ │ │ │ + 276 { │ │ │ │ │ + 277 if (dim==3) // element dof -- any local numbering is fine │ │ │ │ │ + 278 { │ │ │ │ │ + 279 if (element.type().isTetrahedron()) │ │ │ │ │ + 280 { │ │ │ │ │ + 281 *it = {{ tetrahedronOffset_ + dofsPerSimplex(3)*( │ │ │ │ │ +(size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }}; │ │ │ │ │ + 282 continue; │ │ │ │ │ + 283 } │ │ │ │ │ + 284 else if (element.type().isHexahedron()) │ │ │ │ │ + 285 { │ │ │ │ │ + 286 *it = {{ hexahedronOffset_ + dofsPerCube(3)*( │ │ │ │ │ +(size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }}; │ │ │ │ │ + 287 continue; │ │ │ │ │ + 288 } │ │ │ │ │ + 289 else if (element.type().isPrism()) │ │ │ │ │ + 290 { │ │ │ │ │ + 291 *it = {{ prismOffset_ + dofsPerPrism()*((size_type)gridIndexSet.subIndex │ │ │ │ │ +(element,0,0)) + localKey.index() }}; │ │ │ │ │ + 292 continue; │ │ │ │ │ + 293 } │ │ │ │ │ + 294 else if (element.type().isPyramid()) │ │ │ │ │ + 295 { │ │ │ │ │ + 296 *it = {{ pyramidOffset_ + dofsPerPyramid()*( │ │ │ │ │ +(size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }}; │ │ │ │ │ + 297 continue; │ │ │ │ │ + 298 } │ │ │ │ │ + 299 else │ │ │ │ │ + 300 DUNE_THROW(Dune::NotImplemented, "3d elements have to be tetrahedra, │ │ │ │ │ +hexahedra, prisms, or pyramids"); │ │ │ │ │ + 301 } else │ │ │ │ │ + 302 DUNE_THROW(Dune::NotImplemented, "Grids of dimension larger than 3 are no │ │ │ │ │ +supported"); │ │ │ │ │ + 303 } │ │ │ │ │ + 304 DUNE_THROW(Dune::NotImplemented, "Grid contains elements not supported for │ │ │ │ │ +the LagrangeBasis"); │ │ │ │ │ + 305 } │ │ │ │ │ + 306 return it; │ │ │ │ │ + 307 } │ │ │ │ │ + 308 │ │ │ │ │ +310 unsigned int order() const │ │ │ │ │ + 311 { │ │ │ │ │ + 312 return (useDynamicOrder) ? order_ : k; │ │ │ │ │ + 313 } │ │ │ │ │ + 314 │ │ │ │ │ + 315protected: │ │ │ │ │ +316 GridView gridView_; │ │ │ │ │ + 317 │ │ │ │ │ + 318 // Run-time order, only valid if k<0 │ │ │ │ │ +319 const unsigned int order_; │ │ │ │ │ + 320 │ │ │ │ │ +322 size_type dofsPerSimplex(std::size_t simplexDim) const │ │ │ │ │ + 323 { │ │ │ │ │ + 324 return useDynamicOrder ? dofsPerSimplex_[simplexDim] : │ │ │ │ │ +computeDofsPerSimplex(simplexDim); │ │ │ │ │ + 325 } │ │ │ │ │ + 326 │ │ │ │ │ +328 size_type dofsPerCube(std::size_t cubeDim) const │ │ │ │ │ + 329 { │ │ │ │ │ + 330 return useDynamicOrder ? dofsPerCube_[cubeDim] : computeDofsPerCube │ │ │ │ │ +(cubeDim); │ │ │ │ │ + 331 } │ │ │ │ │ + 332 │ │ │ │ │ +333 size_type dofsPerPrism() const │ │ │ │ │ + 334 { │ │ │ │ │ + 335 return useDynamicOrder ? dofsPerPrism_ : computeDofsPerPrism(); │ │ │ │ │ + 336 } │ │ │ │ │ + 337 │ │ │ │ │ +338 size_type dofsPerPyramid() const │ │ │ │ │ + 339 { │ │ │ │ │ + 340 return useDynamicOrder ? dofsPerPyramid_ : computeDofsPerPyramid(); │ │ │ │ │ + 341 } │ │ │ │ │ + 342 │ │ │ │ │ +344 size_type computeDofsPerSimplex(std::size_t simplexDim) const │ │ │ │ │ + 345 { │ │ │ │ │ + 346 return order() == 0 ? (dim == simplexDim ? 1 : 0) : Dune::binomial(std:: │ │ │ │ │ +size_t(order()-1),simplexDim); │ │ │ │ │ + 347 } │ │ │ │ │ + 348 │ │ │ │ │ +350 size_type computeDofsPerCube(std::size_t cubeDim) const │ │ │ │ │ + 351 { │ │ │ │ │ + 352 return order() == 0 ? (dim == cubeDim ? 1 : 0) : Dune::power(order()-1, │ │ │ │ │ +cubeDim); │ │ │ │ │ + 353 } │ │ │ │ │ + 354 │ │ │ │ │ +355 size_type computeDofsPerPrism() const │ │ │ │ │ + 356 { │ │ │ │ │ + 357 return order() == 0 ? (dim == 3 ? 1 : 0) : (order()-1)*(order()-1)*(order │ │ │ │ │ +()-2)/2; │ │ │ │ │ + 358 } │ │ │ │ │ + 359 │ │ │ │ │ +360 size_type computeDofsPerPyramid() const │ │ │ │ │ + 361 { │ │ │ │ │ + 362 return order() == 0 ? (dim == 3 ? 1 : 0) : (order()-2)*(order()-1)* │ │ │ │ │ +(2*order()-3)/6; │ │ │ │ │ + 363 } │ │ │ │ │ + 364 │ │ │ │ │ + 365 // When the order is given at run-time, the following numbers are pre- │ │ │ │ │ +computed: │ │ │ │ │ +366 std::array dofsPerSimplex_; │ │ │ │ │ +367 std::array dofsPerCube_; │ │ │ │ │ +368 size_type dofsPerPrism_; │ │ │ │ │ +369 size_type dofsPerPyramid_; │ │ │ │ │ + 370 │ │ │ │ │ +371 size_type vertexOffset_; │ │ │ │ │ +372 size_type edgeOffset_; │ │ │ │ │ +373 size_type triangleOffset_; │ │ │ │ │ +374 size_type quadrilateralOffset_; │ │ │ │ │ +375 size_type tetrahedronOffset_; │ │ │ │ │ +376 size_type pyramidOffset_; │ │ │ │ │ +377 size_type prismOffset_; │ │ │ │ │ +378 size_type hexahedronOffset_; │ │ │ │ │ + 379 │ │ │ │ │ + 380}; │ │ │ │ │ + 381 │ │ │ │ │ + 382 │ │ │ │ │ + 383 │ │ │ │ │ + 384template │ │ │ │ │ +385class LagrangeNode : │ │ │ │ │ + 386 public LeafBasisNode │ │ │ │ │ + 387{ │ │ │ │ │ + 388 // Stores LocalFiniteElement implementations with run-time order as a │ │ │ │ │ +function of GeometryType │ │ │ │ │ + 389 template │ │ │ │ │ + 390 class LagrangeRunTimeLFECache │ │ │ │ │ + 391 { │ │ │ │ │ + 392 public: │ │ │ │ │ + 393 using FiniteElementType = │ │ │ │ │ +LagrangeLocalFiniteElement; │ │ │ │ │ + 394 │ │ │ │ │ + 395 const FiniteElementType& get(GeometryType type) │ │ │ │ │ + 396 { │ │ │ │ │ + 397 auto i = data_.find(type); │ │ │ │ │ + 398 if (i==data_.end()) │ │ │ │ │ + 399 i = data_.emplace(type,FiniteElementType(type,order_)).first; │ │ │ │ │ + 400 return (*i).second; │ │ │ │ │ + 401 } │ │ │ │ │ + 402 │ │ │ │ │ + 403 std::map data_; │ │ │ │ │ + 404 unsigned int order_; │ │ │ │ │ + 405 }; │ │ │ │ │ + 406 │ │ │ │ │ + 407 static constexpr int dim = GV::dimension; │ │ │ │ │ + 408 static constexpr bool useDynamicOrder = (k<0); │ │ │ │ │ + 409 │ │ │ │ │ + 410 using FiniteElementCache = typename std::conditional<(useDynamicOrder), │ │ │ │ │ + 411 LagrangeRunTimeLFECache, │ │ │ │ │ + 412 PQkLocalFiniteElementCache │ │ │ │ │ + 413 >::type; │ │ │ │ │ + 414 │ │ │ │ │ + 415public: │ │ │ │ │ + 416 │ │ │ │ │ +417 using size_type = std::size_t; │ │ │ │ │ +418 using Element = typename GV::template Codim<0>::Entity; │ │ │ │ │ +419 using FiniteElement = typename FiniteElementCache::FiniteElementType; │ │ │ │ │ + 420 │ │ │ │ │ +422 LagrangeNode() : │ │ │ │ │ + 423 finiteElement_(nullptr), │ │ │ │ │ + 424 element_(nullptr) │ │ │ │ │ + 425 {} │ │ │ │ │ + 426 │ │ │ │ │ +428 LagrangeNode(unsigned int order) : │ │ │ │ │ + 429 order_(order), │ │ │ │ │ + 430 finiteElement_(nullptr), │ │ │ │ │ + 431 element_(nullptr) │ │ │ │ │ + 432 { │ │ │ │ │ + 433 // Only the cache for the run-time-order case (i.e., k<0), has the │ │ │ │ │ +'order_' member │ │ │ │ │ + 434 if constexpr (useDynamicOrder) │ │ │ │ │ + 435 cache_.order_ = order; │ │ │ │ │ + 436 } │ │ │ │ │ + 437 │ │ │ │ │ +439 const Element& element() const │ │ │ │ │ + 440 { │ │ │ │ │ + 441 return *element_; │ │ │ │ │ + 442 } │ │ │ │ │ + 443 │ │ │ │ │ +448 const FiniteElement& finiteElement() const │ │ │ │ │ + 449 { │ │ │ │ │ + 450 return *finiteElement_; │ │ │ │ │ + 451 } │ │ │ │ │ + 452 │ │ │ │ │ +454 void bind(const Element& e) │ │ │ │ │ + 455 { │ │ │ │ │ + 456 element_ = &e; │ │ │ │ │ + 457 finiteElement_ = &(cache_.get(element_->type())); │ │ │ │ │ + 458 this->setSize(finiteElement_->size()); │ │ │ │ │ + 459 } │ │ │ │ │ + 460 │ │ │ │ │ + 461protected: │ │ │ │ │ + 462 │ │ │ │ │ +463 unsigned int order() const │ │ │ │ │ + 464 { │ │ │ │ │ + 465 return (useDynamicOrder) ? order_ : k; │ │ │ │ │ + 466 } │ │ │ │ │ + 467 │ │ │ │ │ + 468 // Run-time order, only valid if k<0 │ │ │ │ │ +469 unsigned int order_; │ │ │ │ │ + 470 │ │ │ │ │ +471 FiniteElementCache cache_; │ │ │ │ │ +472 const FiniteElement* finiteElement_; │ │ │ │ │ +473 const Element* element_; │ │ │ │ │ + 474}; │ │ │ │ │ + 475 │ │ │ │ │ + 476 │ │ │ │ │ + 477 │ │ │ │ │ + 478namespace BasisFactory { │ │ │ │ │ + 479 │ │ │ │ │ + 488template │ │ │ │ │ +489auto lagrange() │ │ │ │ │ + 490{ │ │ │ │ │ + 491 return [](const auto& gridView) { │ │ │ │ │ + 492 return LagrangePreBasis, k, R>(gridView); │ │ │ │ │ + 493 }; │ │ │ │ │ + 494} │ │ │ │ │ + 495 │ │ │ │ │ + 503template │ │ │ │ │ +504auto lagrange(int order) │ │ │ │ │ + 505{ │ │ │ │ │ + 506 return [=](const auto& gridView) { │ │ │ │ │ + 507 return LagrangePreBasis, -1, R>(gridView, │ │ │ │ │ +order); │ │ │ │ │ + 508 }; │ │ │ │ │ + 509} │ │ │ │ │ + 510 │ │ │ │ │ + 511} // end namespace BasisFactory │ │ │ │ │ + 512 │ │ │ │ │ + 513 │ │ │ │ │ + 514 │ │ │ │ │ + 538template │ │ │ │ │ +539using LagrangeBasis = DefaultGlobalBasis >; │ │ │ │ │ + 540 │ │ │ │ │ + 541 │ │ │ │ │ + 542 │ │ │ │ │ + 543 │ │ │ │ │ + 544 │ │ │ │ │ + 545} // end namespace Functions │ │ │ │ │ + 546} // end namespace Dune │ │ │ │ │ + 547 │ │ │ │ │ + 548 │ │ │ │ │ + 549#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH │ │ │ │ │ nodes.hh │ │ │ │ │ defaultglobalbasis.hh │ │ │ │ │ -Dune::Functions::BasisFactory::hierarchicalLagrange │ │ │ │ │ -auto hierarchicalLagrange() │ │ │ │ │ -Create a pre-basis factory that can create a HierarchicalLagrange pre-basis. │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:243 │ │ │ │ │ +Dune::Functions::BasisFactory::power │ │ │ │ │ +auto power(ChildPreBasisFactory &&childPreBasisFactory, const │ │ │ │ │ +IndexMergingStrategy &) │ │ │ │ │ +Create a pre-basis factory that can build a PowerPreBasis. │ │ │ │ │ +Definition: powerbasis.hh:369 │ │ │ │ │ +Dune::Functions::BasisFactory::lagrange │ │ │ │ │ +auto lagrange() │ │ │ │ │ +Create a pre-basis factory that can create a Lagrange pre-basis. │ │ │ │ │ +Definition: lagrangebasis.hh:489 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ Dune::Functions::DefaultGlobalBasis │ │ │ │ │ Global basis for given pre-basis. │ │ │ │ │ Definition: defaultglobalbasis.hh:46 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangeNode │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:178 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangeNode::FiniteElement │ │ │ │ │ -HierarchicalP2LocalFiniteElement< typename GV::ctype, R, dim > FiniteElement │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:185 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangeNode::element │ │ │ │ │ +Dune::Functions::LagrangeNode │ │ │ │ │ +Definition: lagrangebasis.hh:387 │ │ │ │ │ +Dune::Functions::LagrangeNode::LagrangeNode │ │ │ │ │ +LagrangeNode(unsigned int order) │ │ │ │ │ +Constructor with a run-time order. │ │ │ │ │ +Definition: lagrangebasis.hh:428 │ │ │ │ │ +Dune::Functions::LagrangeNode::order │ │ │ │ │ +unsigned int order() const │ │ │ │ │ +Definition: lagrangebasis.hh:463 │ │ │ │ │ +Dune::Functions::LagrangeNode::finiteElement │ │ │ │ │ +const FiniteElement & finiteElement() const │ │ │ │ │ +Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ +Definition: lagrangebasis.hh:448 │ │ │ │ │ +Dune::Functions::LagrangeNode::element_ │ │ │ │ │ +const Element * element_ │ │ │ │ │ +Definition: lagrangebasis.hh:473 │ │ │ │ │ +Dune::Functions::LagrangeNode::element │ │ │ │ │ const Element & element() const │ │ │ │ │ Return current element, throw if unbound. │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:193 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangeNode::bind │ │ │ │ │ +Definition: lagrangebasis.hh:439 │ │ │ │ │ +Dune::Functions::LagrangeNode::cache_ │ │ │ │ │ +FiniteElementCache cache_ │ │ │ │ │ +Definition: lagrangebasis.hh:471 │ │ │ │ │ +Dune::Functions::LagrangeNode::FiniteElement │ │ │ │ │ +typename FiniteElementCache::FiniteElementType FiniteElement │ │ │ │ │ +Definition: lagrangebasis.hh:419 │ │ │ │ │ +Dune::Functions::LagrangeNode::bind │ │ │ │ │ void bind(const Element &e) │ │ │ │ │ Bind to element. │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:208 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangeNode::finiteElement │ │ │ │ │ -const FiniteElement & finiteElement() const │ │ │ │ │ -Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:202 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangeNode::element_ │ │ │ │ │ -const Element * element_ │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:227 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangeNode::finiteElement_ │ │ │ │ │ -const FiniteElement finiteElement_ │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:226 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangeNode::order │ │ │ │ │ -unsigned int order() const │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:221 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangeNode::HierarchicalLagrangeNode │ │ │ │ │ -HierarchicalLagrangeNode() │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:187 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangeNode::size_type │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:183 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangeNode::Element │ │ │ │ │ +Definition: lagrangebasis.hh:454 │ │ │ │ │ +Dune::Functions::LagrangeNode::Element │ │ │ │ │ typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:184 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangePreBasis │ │ │ │ │ -A pre-basis for a hierarchical basis. │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:49 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangePreBasis::size_type │ │ │ │ │ +Definition: lagrangebasis.hh:418 │ │ │ │ │ +Dune::Functions::LagrangeNode::finiteElement_ │ │ │ │ │ +const FiniteElement * finiteElement_ │ │ │ │ │ +Definition: lagrangebasis.hh:472 │ │ │ │ │ +Dune::Functions::LagrangeNode::order_ │ │ │ │ │ +unsigned int order_ │ │ │ │ │ +Definition: lagrangebasis.hh:469 │ │ │ │ │ +Dune::Functions::LagrangeNode::size_type │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +Definition: lagrangebasis.hh:417 │ │ │ │ │ +Dune::Functions::LagrangeNode::LagrangeNode │ │ │ │ │ +LagrangeNode() │ │ │ │ │ +Constructor without order (uses the compile-time value) │ │ │ │ │ +Definition: lagrangebasis.hh:422 │ │ │ │ │ +Dune::Functions::LagrangePreBasis │ │ │ │ │ +A pre-basis for a PQ-lagrange bases with given order. │ │ │ │ │ +Definition: lagrangebasis.hh:55 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::dofsPerPrism │ │ │ │ │ +size_type dofsPerPrism() const │ │ │ │ │ +Definition: lagrangebasis.hh:333 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::computeDofsPerCube │ │ │ │ │ +size_type computeDofsPerCube(std::size_t cubeDim) const │ │ │ │ │ +Number of degrees of freedom assigned to a cube (without the ones assigned to │ │ │ │ │ +its faces!... │ │ │ │ │ +Definition: lagrangebasis.hh:350 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::computeDofsPerSimplex │ │ │ │ │ +size_type computeDofsPerSimplex(std::size_t simplexDim) const │ │ │ │ │ +Number of degrees of freedom assigned to a simplex (without the ones assigned │ │ │ │ │ +to its faces!... │ │ │ │ │ +Definition: lagrangebasis.hh:344 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::maxMultiIndexSize │ │ │ │ │ +static constexpr size_type maxMultiIndexSize │ │ │ │ │ +Definition: lagrangebasis.hh:70 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::computeDofsPerPrism │ │ │ │ │ +size_type computeDofsPerPrism() const │ │ │ │ │ +Definition: lagrangebasis.hh:355 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::edgeOffset_ │ │ │ │ │ +size_type edgeOffset_ │ │ │ │ │ +Definition: lagrangebasis.hh:372 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::dofsPerSimplex_ │ │ │ │ │ +std::array< size_type, dim+1 > dofsPerSimplex_ │ │ │ │ │ +Definition: lagrangebasis.hh:366 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::indices │ │ │ │ │ +It indices(const Node &node, It it) const │ │ │ │ │ +Definition: lagrangebasis.hh:192 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::vertexOffset_ │ │ │ │ │ +size_type vertexOffset_ │ │ │ │ │ +Definition: lagrangebasis.hh:371 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::dofsPerSimplex │ │ │ │ │ +size_type dofsPerSimplex(std::size_t simplexDim) const │ │ │ │ │ +Number of degrees of freedom assigned to a simplex (without the ones assigned │ │ │ │ │ +to its faces!... │ │ │ │ │ +Definition: lagrangebasis.hh:322 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::size_type │ │ │ │ │ std::size_t size_type │ │ │ │ │ Type used for indices and size information. │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:58 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangePreBasis::order │ │ │ │ │ -unsigned int order() const │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:145 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangePreBasis::makeNode │ │ │ │ │ -Node makeNode() const │ │ │ │ │ -Create tree node. │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:94 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangePreBasis::maxNodeSize │ │ │ │ │ -size_type maxNodeSize() const │ │ │ │ │ -Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:123 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangePreBasis::multiIndexBufferSize │ │ │ │ │ -static constexpr size_type multiIndexBufferSize │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:65 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangePreBasis::update │ │ │ │ │ -void update(const GridView &gv) │ │ │ │ │ -Update the stored grid view & MultipleCodimMultipleGeomTypeMapper, to be called │ │ │ │ │ -if the grid has chang... │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:85 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangePreBasis::mcmgMapper_ │ │ │ │ │ -MultipleCodimMultipleGeomTypeMapper< GridView > mcmgMapper_ │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:150 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangePreBasis::dimension │ │ │ │ │ +Definition: lagrangebasis.hh:65 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::pyramidOffset_ │ │ │ │ │ +size_type pyramidOffset_ │ │ │ │ │ +Definition: lagrangebasis.hh:376 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::prismOffset_ │ │ │ │ │ +size_type prismOffset_ │ │ │ │ │ +Definition: lagrangebasis.hh:377 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::tetrahedronOffset_ │ │ │ │ │ +size_type tetrahedronOffset_ │ │ │ │ │ +Definition: lagrangebasis.hh:375 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::initializeIndices │ │ │ │ │ +void initializeIndices() │ │ │ │ │ +Initialize the global indices. │ │ │ │ │ +Definition: lagrangebasis.hh:96 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::computeDofsPerPyramid │ │ │ │ │ +size_type computeDofsPerPyramid() const │ │ │ │ │ +Definition: lagrangebasis.hh:360 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::LagrangePreBasis │ │ │ │ │ +LagrangePreBasis(const GridView &gv, unsigned int order) │ │ │ │ │ +Constructor for a given grid view object and run-time order. │ │ │ │ │ +Definition: lagrangebasis.hh:80 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::dofsPerPyramid_ │ │ │ │ │ +size_type dofsPerPyramid_ │ │ │ │ │ +Definition: lagrangebasis.hh:369 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::dimension │ │ │ │ │ size_type dimension() const │ │ │ │ │ Get the total dimension of the space spanned by this basis. │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:114 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangePreBasis::GridView │ │ │ │ │ +Definition: lagrangebasis.hh:178 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::LagrangePreBasis │ │ │ │ │ +LagrangePreBasis(const GridView &gv) │ │ │ │ │ +Constructor for a given grid view object with compile-time order. │ │ │ │ │ +Definition: lagrangebasis.hh:75 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::update │ │ │ │ │ +void update(const GridView &gv) │ │ │ │ │ +Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ +Definition: lagrangebasis.hh:126 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::size │ │ │ │ │ +size_type size(const SizePrefix &prefix) const │ │ │ │ │ +Return number of possible values for next position in multi index. │ │ │ │ │ +Definition: lagrangebasis.hh:171 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::multiIndexBufferSize │ │ │ │ │ +static constexpr size_type multiIndexBufferSize │ │ │ │ │ +Definition: lagrangebasis.hh:72 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::GridView │ │ │ │ │ GV GridView │ │ │ │ │ The grid view that the FE basis is defined on. │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:55 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangePreBasis::HierarchicalLagrangePreBasis │ │ │ │ │ -HierarchicalLagrangePreBasis(const GridView &gv) │ │ │ │ │ -Constructor for a given grid view object with layout for second order. │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:71 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangePreBasis::maxMultiIndexSize │ │ │ │ │ -static constexpr size_type maxMultiIndexSize │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:63 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangePreBasis::size │ │ │ │ │ -size_type size(const SizePrefix prefix) const │ │ │ │ │ -Return number of possible values for next position in multi index. │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:107 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangePreBasis::gridView │ │ │ │ │ +Definition: lagrangebasis.hh:62 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::quadrilateralOffset_ │ │ │ │ │ +size_type quadrilateralOffset_ │ │ │ │ │ +Definition: lagrangebasis.hh:374 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::gridView │ │ │ │ │ const GridView & gridView() const │ │ │ │ │ Obtain the grid view that the basis is defined on. │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:79 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangePreBasis::gridView_ │ │ │ │ │ +Definition: lagrangebasis.hh:120 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::gridView_ │ │ │ │ │ GridView gridView_ │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:143 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangePreBasis::size │ │ │ │ │ +Definition: lagrangebasis.hh:316 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::makeNode │ │ │ │ │ +Node makeNode() const │ │ │ │ │ +Create tree node. │ │ │ │ │ +Definition: lagrangebasis.hh:134 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::order │ │ │ │ │ +unsigned int order() const │ │ │ │ │ +Polynomial order used in the local Lagrange finite-elements. │ │ │ │ │ +Definition: lagrangebasis.hh:310 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::order_ │ │ │ │ │ +const unsigned int order_ │ │ │ │ │ +Definition: lagrangebasis.hh:319 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::dofsPerCube_ │ │ │ │ │ +std::array< size_type, dim+1 > dofsPerCube_ │ │ │ │ │ +Definition: lagrangebasis.hh:367 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::maxNodeSize │ │ │ │ │ +size_type maxNodeSize() const │ │ │ │ │ +Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ +Definition: lagrangebasis.hh:184 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::size │ │ │ │ │ size_type size() const │ │ │ │ │ Same as size(prefix) with empty prefix. │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:100 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangePreBasis::initializeIndices │ │ │ │ │ -void initializeIndices() │ │ │ │ │ -Initialize the global indices. │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:75 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangePreBasis::indices │ │ │ │ │ -It indices(const Node &node, It it) const │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:130 │ │ │ │ │ -Dune::Functions::HierarchicalLagrangePreBasis::minMultiIndexSize │ │ │ │ │ +Definition: lagrangebasis.hh:140 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::dofsPerPrism_ │ │ │ │ │ +size_type dofsPerPrism_ │ │ │ │ │ +Definition: lagrangebasis.hh:368 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::dofsPerCube │ │ │ │ │ +size_type dofsPerCube(std::size_t cubeDim) const │ │ │ │ │ +Number of degrees of freedom assigned to a cube (without the ones assigned to │ │ │ │ │ +its faces!... │ │ │ │ │ +Definition: lagrangebasis.hh:328 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::triangleOffset_ │ │ │ │ │ +size_type triangleOffset_ │ │ │ │ │ +Definition: lagrangebasis.hh:373 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::hexahedronOffset_ │ │ │ │ │ +size_type hexahedronOffset_ │ │ │ │ │ +Definition: lagrangebasis.hh:378 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::minMultiIndexSize │ │ │ │ │ static constexpr size_type minMultiIndexSize │ │ │ │ │ -Definition: hierarchicallagrangebasis.hh:64 │ │ │ │ │ +Definition: lagrangebasis.hh:71 │ │ │ │ │ +Dune::Functions::LagrangePreBasis::dofsPerPyramid │ │ │ │ │ +size_type dofsPerPyramid() const │ │ │ │ │ +Definition: lagrangebasis.hh:338 │ │ │ │ │ Dune::Functions::BasisNodeMixin::setSize │ │ │ │ │ void setSize(const size_type size) │ │ │ │ │ Definition: nodes.hh:164 │ │ │ │ │ Dune::Functions::LeafBasisNode │ │ │ │ │ Definition: nodes.hh:186 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00122.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: subspacelocalview.hh File Reference │ │ │ │ +dune-functions: flatmultiindex.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,38 +63,37 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces
│ │ │ │ -
subspacelocalview.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Typedefs
│ │ │ │ +
flatmultiindex.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <tuple>
│ │ │ │ -#include <dune/common/concept.hh>
│ │ │ │ -#include <dune/typetree/childextraction.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │ +
#include <array>
│ │ │ │ +#include <dune/functions/common/multiindex.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::Functions::SubspaceLocalView< RLV, PP >
 The restriction of a finite element basis to a single element. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Typedefs

template<class size_type >
using Dune::Functions::FlatMultiIndex = StaticMultiIndex< size_type, 1 >
 A multi-index class with only one level. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,26 +5,25 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -Classes | Namespaces │ │ │ │ │ -subspacelocalview.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Namespaces | Typedefs │ │ │ │ │ +flatmultiindex.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ - Classes │ │ │ │ │ -class  Dune::Functions::SubspaceLocalView<_RLV,_PP_> │ │ │ │ │ -  The restriction of a finite element basis to a single element. More... │ │ │ │ │ -  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ + Typedefs │ │ │ │ │ +template │ │ │ │ │ +using Dune::Functions::FlatMultiIndex = StaticMultiIndex< size_type, 1 > │ │ │ │ │ +  A multi-index class with only one level. More... │ │ │ │ │ +  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00122_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: subspacelocalview.hh Source File │ │ │ │ +dune-functions: flatmultiindex.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,163 +62,43 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
subspacelocalview.hh
│ │ │ │ +
flatmultiindex.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACELOCALVIEW_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACELOCALVIEW_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATMULTIINDEX_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATMULTIINDEX_HH
│ │ │ │
5
│ │ │ │ -
6
│ │ │ │ -
7#include <tuple>
│ │ │ │ -
8
│ │ │ │ -
9#include <dune/common/concept.hh>
│ │ │ │ -
10
│ │ │ │ -
11#include <dune/typetree/childextraction.hh>
│ │ │ │ +
6#include <array>
│ │ │ │ +
7
│ │ │ │ + │ │ │ │ +
9
│ │ │ │ +
10namespace Dune {
│ │ │ │ +
11namespace Functions {
│ │ │ │
12
│ │ │ │ - │ │ │ │ +
13
│ │ │ │
14
│ │ │ │ -
15
│ │ │ │ -
16
│ │ │ │ -
17namespace Dune {
│ │ │ │ -
18namespace Functions {
│ │ │ │ -
19
│ │ │ │ -
20
│ │ │ │ -
21
│ │ │ │ -
22template<class RB, class PP>
│ │ │ │ -
23class SubspaceBasis;
│ │ │ │ -
24
│ │ │ │ -
25
│ │ │ │ -
26
│ │ │ │ -
28template<class RLV, class PP>
│ │ │ │ - │ │ │ │ -
30{
│ │ │ │ -
31 using PrefixPath = PP;
│ │ │ │ +
30template<class size_type>
│ │ │ │ + │ │ │ │
32
│ │ │ │ -
33public:
│ │ │ │ +
33
│ │ │ │
34
│ │ │ │ -
35 using RootLocalView = RLV;
│ │ │ │ -
36
│ │ │ │ - │ │ │ │ -
39
│ │ │ │ - │ │ │ │ -
42
│ │ │ │ -
44 using Element = typename GridView::template Codim<0>::Entity;
│ │ │ │ -
45
│ │ │ │ -
47 using size_type = std::size_t;
│ │ │ │ -
48
│ │ │ │ -
50 using RootTree = typename RootLocalView::Tree;
│ │ │ │ -
51
│ │ │ │ -
53 using Tree = typename TypeTree::ChildForTreePath<RootTree, PrefixPath>;
│ │ │ │ -
54
│ │ │ │ -
56 using MultiIndex = typename RootLocalView::MultiIndex;
│ │ │ │ -
57
│ │ │ │ -
59 SubspaceLocalView(const GlobalBasis& globalBasis, const PrefixPath& /*prefixPath*/) :
│ │ │ │ - │ │ │ │ -
61 rootLocalView_(globalBasis.rootBasis().localView())
│ │ │ │ -
62 {
│ │ │ │ -
63// static_assert(models<Concept::BasisTree<GridView>, Tree>(), "Tree type passed to SubspaceLocalView does not model the BasisNode concept.");
│ │ │ │ -
64 }
│ │ │ │ -
65
│ │ │ │ -
71 void bind(const Element& e)
│ │ │ │ -
72 {
│ │ │ │ -
73 rootLocalView_.bind(e);
│ │ │ │ -
74 }
│ │ │ │ -
75
│ │ │ │ -
80 const Element& element() const
│ │ │ │ -
81 {
│ │ │ │ -
82 return rootLocalView_.element();
│ │ │ │ -
83 }
│ │ │ │ -
84
│ │ │ │ -
89 void unbind()
│ │ │ │ -
90 {
│ │ │ │ -
91 rootLocalView_.unbind();
│ │ │ │ -
92 }
│ │ │ │ -
93
│ │ │ │ -
96 bool bound() const
│ │ │ │ -
97 {
│ │ │ │ -
98 return rootLocalView_.bound();
│ │ │ │ -
99 }
│ │ │ │ -
100
│ │ │ │ -
105 const Tree& tree() const
│ │ │ │ -
106 {
│ │ │ │ -
107 return TypeTree::child(rootLocalView_.tree(), globalBasis_->prefixPath());
│ │ │ │ -
108 }
│ │ │ │ -
109
│ │ │ │ - │ │ │ │ -
113 {
│ │ │ │ -
114 return rootLocalView_.size();
│ │ │ │ -
115 }
│ │ │ │ -
116
│ │ │ │ - │ │ │ │ -
124 {
│ │ │ │ -
125 return rootLocalView_.maxSize();
│ │ │ │ -
126 }
│ │ │ │ -
127
│ │ │ │ - │ │ │ │ -
130 {
│ │ │ │ -
131 return rootLocalView_.index(i);
│ │ │ │ -
132 }
│ │ │ │ -
133
│ │ │ │ - │ │ │ │ -
137 {
│ │ │ │ -
138 return *globalBasis_;
│ │ │ │ -
139 }
│ │ │ │ -
140
│ │ │ │ - │ │ │ │ -
142 {
│ │ │ │ -
143 return rootLocalView_;
│ │ │ │ -
144 }
│ │ │ │ -
145
│ │ │ │ -
146protected:
│ │ │ │ - │ │ │ │ - │ │ │ │ -
149};
│ │ │ │ -
150
│ │ │ │ -
151
│ │ │ │ -
152
│ │ │ │ -
153} // end namespace Functions
│ │ │ │ -
154} // end namespace Dune
│ │ │ │ -
155
│ │ │ │ -
156
│ │ │ │ -
157
│ │ │ │ -
158#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACELOCALVIEW_HH
│ │ │ │ +
35} // end namespace Functions
│ │ │ │ +
36} // end namespace Dune
│ │ │ │ +
37
│ │ │ │ +
38#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATMULTIINDEX_HH
│ │ │ │ + │ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
SubspaceBasis(const RB &, const TP) -> SubspaceBasis< RB, TP >
│ │ │ │ -
Definition: subspacebasis.hh:38
│ │ │ │ -
typename RootBasis::GridView GridView
The grid view that the FE space is defined on.
Definition: subspacebasis.hh:48
│ │ │ │ -
const PrefixPath & prefixPath() const
Definition: subspacebasis.hh:118
│ │ │ │ -
The restriction of a finite element basis to a single element.
Definition: subspacelocalview.hh:30
│ │ │ │ -
typename TypeTree::ChildForTreePath< RootTree, PrefixPath > Tree
Tree of local finite elements / local shape function sets.
Definition: subspacelocalview.hh:53
│ │ │ │ -
void unbind()
Unbind from the current element.
Definition: subspacelocalview.hh:89
│ │ │ │ -
const Element & element() const
Return the grid element that the view is bound to.
Definition: subspacelocalview.hh:80
│ │ │ │ -
const GlobalBasis * globalBasis_
Definition: subspacelocalview.hh:147
│ │ │ │ -
bool bound() const
Return if the view is bound to a grid element.
Definition: subspacelocalview.hh:96
│ │ │ │ -
typename RootLocalView::MultiIndex MultiIndex
Type used for global numbering of the basis vectors.
Definition: subspacelocalview.hh:56
│ │ │ │ -
size_type size() const
Total number of degrees of freedom on this element.
Definition: subspacelocalview.hh:112
│ │ │ │ -
RootLocalView rootLocalView_
Definition: subspacelocalview.hh:148
│ │ │ │ -
void bind(const Element &e)
Bind the view to a grid element.
Definition: subspacelocalview.hh:71
│ │ │ │ -
typename GlobalBasis::GridView GridView
The grid view the global FE basis lives on.
Definition: subspacelocalview.hh:41
│ │ │ │ -
SubspaceLocalView(const GlobalBasis &globalBasis, const PrefixPath &)
Construct local view for a given global finite element basis.
Definition: subspacelocalview.hh:59
│ │ │ │ -
RLV RootLocalView
Definition: subspacelocalview.hh:35
│ │ │ │ -
const RootLocalView & rootLocalView() const
Definition: subspacelocalview.hh:141
│ │ │ │ -
std::size_t size_type
The type used for sizes.
Definition: subspacelocalview.hh:47
│ │ │ │ -
typename GridView::template Codim< 0 >::Entity Element
Type of the grid element we are bound to.
Definition: subspacelocalview.hh:44
│ │ │ │ -
const GlobalBasis & globalBasis() const
Return the global basis that we are a view on.
Definition: subspacelocalview.hh:136
│ │ │ │ -
size_type maxSize() const
Maximum local size for any element on the GridView.
Definition: subspacelocalview.hh:123
│ │ │ │ -
const Tree & tree() const
Return the local ansatz tree associated to the bound entity.
Definition: subspacelocalview.hh:105
│ │ │ │ -
MultiIndex index(size_type i) const
Maps from subtree index set [0..size-1] to a globally unique multi index in global basis.
Definition: subspacelocalview.hh:129
│ │ │ │ -
typename RootLocalView::Tree RootTree
Tree of local finite elements / local shape function sets.
Definition: subspacelocalview.hh:50
│ │ │ │ - │ │ │ │ +
A statically sized MultiIndex type.
Definition: multiindex.hh:49
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,228 +5,41 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -subspacelocalview.hh │ │ │ │ │ +flatmultiindex.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACELOCALVIEW_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACELOCALVIEW_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATMULTIINDEX_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATMULTIINDEX_HH │ │ │ │ │ 5 │ │ │ │ │ - 6 │ │ │ │ │ - 7#include │ │ │ │ │ - 8 │ │ │ │ │ - 9#include │ │ │ │ │ - 10 │ │ │ │ │ - 11#include │ │ │ │ │ + 6#include │ │ │ │ │ + 7 │ │ │ │ │ + 8#include │ │ │ │ │ + 9 │ │ │ │ │ + 10namespace Dune { │ │ │ │ │ + 11namespace Functions { │ │ │ │ │ 12 │ │ │ │ │ - 13#include │ │ │ │ │ + 13 │ │ │ │ │ 14 │ │ │ │ │ - 15 │ │ │ │ │ - 16 │ │ │ │ │ - 17namespace Dune { │ │ │ │ │ - 18namespace Functions { │ │ │ │ │ - 19 │ │ │ │ │ - 20 │ │ │ │ │ - 21 │ │ │ │ │ - 22template │ │ │ │ │ - 23class SubspaceBasis; │ │ │ │ │ - 24 │ │ │ │ │ - 25 │ │ │ │ │ - 26 │ │ │ │ │ - 28template │ │ │ │ │ -29class SubspaceLocalView │ │ │ │ │ - 30{ │ │ │ │ │ - 31 using PrefixPath = PP; │ │ │ │ │ + 30template │ │ │ │ │ +31using FlatMultiIndex = StaticMultiIndex; │ │ │ │ │ 32 │ │ │ │ │ - 33public: │ │ │ │ │ + 33 │ │ │ │ │ 34 │ │ │ │ │ -35 using RootLocalView = RLV; │ │ │ │ │ - 36 │ │ │ │ │ -38 using GlobalBasis = SubspaceBasis; │ │ │ │ │ - 39 │ │ │ │ │ -41 using GridView = typename GlobalBasis::GridView; │ │ │ │ │ - 42 │ │ │ │ │ -44 using Element = typename GridView::template Codim<0>::Entity; │ │ │ │ │ - 45 │ │ │ │ │ -47 using size_type = std::size_t; │ │ │ │ │ - 48 │ │ │ │ │ -50 using RootTree = typename RootLocalView::Tree; │ │ │ │ │ - 51 │ │ │ │ │ -53 using Tree = typename TypeTree::ChildForTreePath; │ │ │ │ │ - 54 │ │ │ │ │ -56 using MultiIndex = typename RootLocalView::MultiIndex; │ │ │ │ │ - 57 │ │ │ │ │ -59 SubspaceLocalView(const GlobalBasis& globalBasis, const PrefixPath& / │ │ │ │ │ -*prefixPath*/) : │ │ │ │ │ - 60 globalBasis_(&globalBasis), │ │ │ │ │ - 61 rootLocalView_(globalBasis.rootBasis().localView()) │ │ │ │ │ - 62 { │ │ │ │ │ - 63// static_assert(models, Tree>(), "Tree type │ │ │ │ │ -passed to SubspaceLocalView does not model the BasisNode concept."); │ │ │ │ │ - 64 } │ │ │ │ │ - 65 │ │ │ │ │ -71 void bind(const Element& e) │ │ │ │ │ - 72 { │ │ │ │ │ - 73 rootLocalView_.bind(e); │ │ │ │ │ - 74 } │ │ │ │ │ - 75 │ │ │ │ │ -80 const Element& element() const │ │ │ │ │ - 81 { │ │ │ │ │ - 82 return rootLocalView_.element(); │ │ │ │ │ - 83 } │ │ │ │ │ - 84 │ │ │ │ │ -89 void unbind() │ │ │ │ │ - 90 { │ │ │ │ │ - 91 rootLocalView_.unbind(); │ │ │ │ │ - 92 } │ │ │ │ │ - 93 │ │ │ │ │ -96 bool bound() const │ │ │ │ │ - 97 { │ │ │ │ │ - 98 return rootLocalView_.bound(); │ │ │ │ │ - 99 } │ │ │ │ │ - 100 │ │ │ │ │ -105 const Tree& tree() const │ │ │ │ │ - 106 { │ │ │ │ │ - 107 return TypeTree::child(rootLocalView_.tree(), globalBasis_->prefixPath()); │ │ │ │ │ - 108 } │ │ │ │ │ - 109 │ │ │ │ │ -112 size_type size() const │ │ │ │ │ - 113 { │ │ │ │ │ - 114 return rootLocalView_.size(); │ │ │ │ │ - 115 } │ │ │ │ │ - 116 │ │ │ │ │ -123 size_type maxSize() const │ │ │ │ │ - 124 { │ │ │ │ │ - 125 return rootLocalView_.maxSize(); │ │ │ │ │ - 126 } │ │ │ │ │ - 127 │ │ │ │ │ -129 MultiIndex index(size_type i) const │ │ │ │ │ - 130 { │ │ │ │ │ - 131 return rootLocalView_.index(i); │ │ │ │ │ - 132 } │ │ │ │ │ - 133 │ │ │ │ │ -136 const GlobalBasis& globalBasis() const │ │ │ │ │ - 137 { │ │ │ │ │ - 138 return *globalBasis_; │ │ │ │ │ - 139 } │ │ │ │ │ - 140 │ │ │ │ │ -141 const RootLocalView& rootLocalView() const │ │ │ │ │ - 142 { │ │ │ │ │ - 143 return rootLocalView_; │ │ │ │ │ - 144 } │ │ │ │ │ - 145 │ │ │ │ │ - 146protected: │ │ │ │ │ -147 const GlobalBasis* globalBasis_; │ │ │ │ │ -148 RootLocalView rootLocalView_; │ │ │ │ │ - 149}; │ │ │ │ │ - 150 │ │ │ │ │ - 151 │ │ │ │ │ - 152 │ │ │ │ │ - 153} // end namespace Functions │ │ │ │ │ - 154} // end namespace Dune │ │ │ │ │ - 155 │ │ │ │ │ - 156 │ │ │ │ │ - 157 │ │ │ │ │ - 158#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACELOCALVIEW_HH │ │ │ │ │ + 35} // end namespace Functions │ │ │ │ │ + 36} // end namespace Dune │ │ │ │ │ + 37 │ │ │ │ │ + 38#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATMULTIINDEX_HH │ │ │ │ │ +multiindex.hh │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::SubspaceBasis │ │ │ │ │ -SubspaceBasis(const RB &, const TP) -> SubspaceBasis< RB, TP > │ │ │ │ │ -Dune::Functions::SubspaceBasis │ │ │ │ │ -Definition: subspacebasis.hh:38 │ │ │ │ │ -Dune::Functions::SubspaceBasis::GridView │ │ │ │ │ -typename RootBasis::GridView GridView │ │ │ │ │ -The grid view that the FE space is defined on. │ │ │ │ │ -Definition: subspacebasis.hh:48 │ │ │ │ │ -Dune::Functions::SubspaceBasis::prefixPath │ │ │ │ │ -const PrefixPath & prefixPath() const │ │ │ │ │ -Definition: subspacebasis.hh:118 │ │ │ │ │ -Dune::Functions::SubspaceLocalView │ │ │ │ │ -The restriction of a finite element basis to a single element. │ │ │ │ │ -Definition: subspacelocalview.hh:30 │ │ │ │ │ -Dune::Functions::SubspaceLocalView::Tree │ │ │ │ │ -typename TypeTree::ChildForTreePath< RootTree, PrefixPath > Tree │ │ │ │ │ -Tree of local finite elements / local shape function sets. │ │ │ │ │ -Definition: subspacelocalview.hh:53 │ │ │ │ │ -Dune::Functions::SubspaceLocalView::unbind │ │ │ │ │ -void unbind() │ │ │ │ │ -Unbind from the current element. │ │ │ │ │ -Definition: subspacelocalview.hh:89 │ │ │ │ │ -Dune::Functions::SubspaceLocalView::element │ │ │ │ │ -const Element & element() const │ │ │ │ │ -Return the grid element that the view is bound to. │ │ │ │ │ -Definition: subspacelocalview.hh:80 │ │ │ │ │ -Dune::Functions::SubspaceLocalView::globalBasis_ │ │ │ │ │ -const GlobalBasis * globalBasis_ │ │ │ │ │ -Definition: subspacelocalview.hh:147 │ │ │ │ │ -Dune::Functions::SubspaceLocalView::bound │ │ │ │ │ -bool bound() const │ │ │ │ │ -Return if the view is bound to a grid element. │ │ │ │ │ -Definition: subspacelocalview.hh:96 │ │ │ │ │ -Dune::Functions::SubspaceLocalView::MultiIndex │ │ │ │ │ -typename RootLocalView::MultiIndex MultiIndex │ │ │ │ │ -Type used for global numbering of the basis vectors. │ │ │ │ │ -Definition: subspacelocalview.hh:56 │ │ │ │ │ -Dune::Functions::SubspaceLocalView::size │ │ │ │ │ -size_type size() const │ │ │ │ │ -Total number of degrees of freedom on this element. │ │ │ │ │ -Definition: subspacelocalview.hh:112 │ │ │ │ │ -Dune::Functions::SubspaceLocalView::rootLocalView_ │ │ │ │ │ -RootLocalView rootLocalView_ │ │ │ │ │ -Definition: subspacelocalview.hh:148 │ │ │ │ │ -Dune::Functions::SubspaceLocalView::bind │ │ │ │ │ -void bind(const Element &e) │ │ │ │ │ -Bind the view to a grid element. │ │ │ │ │ -Definition: subspacelocalview.hh:71 │ │ │ │ │ -Dune::Functions::SubspaceLocalView::GridView │ │ │ │ │ -typename GlobalBasis::GridView GridView │ │ │ │ │ -The grid view the global FE basis lives on. │ │ │ │ │ -Definition: subspacelocalview.hh:41 │ │ │ │ │ -Dune::Functions::SubspaceLocalView::SubspaceLocalView │ │ │ │ │ -SubspaceLocalView(const GlobalBasis &globalBasis, const PrefixPath &) │ │ │ │ │ -Construct local view for a given global finite element basis. │ │ │ │ │ -Definition: subspacelocalview.hh:59 │ │ │ │ │ -Dune::Functions::SubspaceLocalView::RootLocalView │ │ │ │ │ -RLV RootLocalView │ │ │ │ │ -Definition: subspacelocalview.hh:35 │ │ │ │ │ -Dune::Functions::SubspaceLocalView::rootLocalView │ │ │ │ │ -const RootLocalView & rootLocalView() const │ │ │ │ │ -Definition: subspacelocalview.hh:141 │ │ │ │ │ -Dune::Functions::SubspaceLocalView::size_type │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -The type used for sizes. │ │ │ │ │ -Definition: subspacelocalview.hh:47 │ │ │ │ │ -Dune::Functions::SubspaceLocalView::Element │ │ │ │ │ -typename GridView::template Codim< 0 >::Entity Element │ │ │ │ │ -Type of the grid element we are bound to. │ │ │ │ │ -Definition: subspacelocalview.hh:44 │ │ │ │ │ -Dune::Functions::SubspaceLocalView::globalBasis │ │ │ │ │ -const GlobalBasis & globalBasis() const │ │ │ │ │ -Return the global basis that we are a view on. │ │ │ │ │ -Definition: subspacelocalview.hh:136 │ │ │ │ │ -Dune::Functions::SubspaceLocalView::maxSize │ │ │ │ │ -size_type maxSize() const │ │ │ │ │ -Maximum local size for any element on the GridView. │ │ │ │ │ -Definition: subspacelocalview.hh:123 │ │ │ │ │ -Dune::Functions::SubspaceLocalView::tree │ │ │ │ │ -const Tree & tree() const │ │ │ │ │ -Return the local ansatz tree associated to the bound entity. │ │ │ │ │ -Definition: subspacelocalview.hh:105 │ │ │ │ │ -Dune::Functions::SubspaceLocalView::index │ │ │ │ │ -MultiIndex index(size_type i) const │ │ │ │ │ -Maps from subtree index set [0..size-1] to a globally unique multi index in │ │ │ │ │ -global basis. │ │ │ │ │ -Definition: subspacelocalview.hh:129 │ │ │ │ │ -Dune::Functions::SubspaceLocalView::RootTree │ │ │ │ │ -typename RootLocalView::Tree RootTree │ │ │ │ │ -Tree of local finite elements / local shape function sets. │ │ │ │ │ -Definition: subspacelocalview.hh:50 │ │ │ │ │ -concepts.hh │ │ │ │ │ +Dune::Functions::StaticMultiIndex<_size_type,_1_> │ │ │ │ │ +A statically sized MultiIndex type. │ │ │ │ │ +Definition: multiindex.hh:49 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00125.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: taylorhoodbasis.hh File Reference │ │ │ │ +dune-functions: compositebasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,61 +65,59 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Typedefs | │ │ │ │ Functions
│ │ │ │ -
taylorhoodbasis.hh File Reference
│ │ │ │ +
compositebasis.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <dune/common/exceptions.hh>
│ │ │ │ +
#include <tuple>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <dune/common/std/apply.hh>
│ │ │ │ +#include <dune/common/hybridutilities.hh>
│ │ │ │ #include <dune/common/reservedvector.hh>
│ │ │ │ -#include <dune/common/indices.hh>
│ │ │ │ -#include <dune/typetree/powernode.hh>
│ │ │ │ -#include <dune/typetree/compositenode.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/lagrangebasis.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │ +#include <dune/common/typeutilities.hh>
│ │ │ │ +#include <dune/common/tupleutility.hh>
│ │ │ │ +#include <dune/common/tuplevector.hh>
│ │ │ │ +#include <dune/functions/common/staticforloop.hh>
│ │ │ │ +#include <dune/functions/common/type_traits.hh>
│ │ │ │ +#include <dune/functions/common/utility.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/basistags.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::TaylorHoodPreBasis< GV, HI >
 Pre-basis for lowest order Taylor-Hood basis. More...
 
class  Dune::Functions::TaylorHoodVelocityTree< GV >
 
class  Dune::Functions::TaylorHoodBasisTree< GV >
class  Dune::Functions::CompositePreBasis< IMS, SPB >
 A pre-basis for composite bases. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
namespace  Dune::Functions::BasisFactory
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Typedefs

template<typename GV >
using Dune::Functions::TaylorHoodBasis = DefaultGlobalBasis< TaylorHoodPreBasis< GV > >
 Nodal basis for a lowest order Taylor-Hood Lagrangean finite element space. More...
 
namespace  Dune::Functions::BasisBuilder
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

auto Dune::Functions::BasisFactory::taylorHood ()
 Create a pre-basis factory that can create a Taylor-Hood pre-basis. More...
 
template<typename... Args, std::enable_if_t< Concept::isIndexMergingStrategy< typename LastType< Args... >::type >(), int > = 0>
auto Dune::Functions::BasisFactory::composite (Args &&... args)
 Create a factory builder that can build a CompositePreBasis. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,48 +5,47 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -Classes | Namespaces | Typedefs | Functions │ │ │ │ │ -taylorhoodbasis.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Functions │ │ │ │ │ +compositebasis.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::TaylorHoodPreBasis<_GV,_HI_> │ │ │ │ │ -  Pre-basis for lowest order Taylor-Hood basis. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::Functions::TaylorHoodVelocityTree<_GV_> │ │ │ │ │ -  │ │ │ │ │ -class  Dune::Functions::TaylorHoodBasisTree<_GV_> │ │ │ │ │ +class  Dune::Functions::CompositePreBasis<_IMS,_SPB_> │ │ │ │ │ +  A pre-basis for composite bases. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions::BasisFactory │ │ │ │ │   │ │ │ │ │ - Typedefs │ │ │ │ │ -template │ │ │ │ │ -using Dune::Functions::TaylorHoodBasis = DefaultGlobalBasis< │ │ │ │ │ - TaylorHoodPreBasis< GV > > │ │ │ │ │ -  Nodal basis for a lowest order Taylor-Hood Lagrangean finite element │ │ │ │ │ - space. More... │ │ │ │ │ +namespace  Dune::Functions::BasisBuilder │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ -auto Dune::Functions::BasisFactory::taylorHood () │ │ │ │ │ -  Create a pre-basis factory that can create a Taylor-Hood pre-basis. │ │ │ │ │ - More... │ │ │ │ │ +template::type >(), int > = 0> │ │ │ │ │ +auto Dune::Functions::BasisFactory::composite (Args &&... args) │ │ │ │ │ +  Create a factory builder that can build a CompositePreBasis. More... │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00125_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: taylorhoodbasis.hh Source File │ │ │ │ +dune-functions: compositebasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,352 +62,423 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
taylorhoodbasis.hh
│ │ │ │ +
compositebasis.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TAYLORHOODBASIS_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TAYLORHOODBASIS_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_COMPOSITEBASIS_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_COMPOSITEBASIS_HH
│ │ │ │
5
│ │ │ │ -
6#include <dune/common/exceptions.hh>
│ │ │ │ -
7#include <dune/common/reservedvector.hh>
│ │ │ │ -
8#include <dune/common/indices.hh>
│ │ │ │ -
9
│ │ │ │ -
10#include <dune/typetree/powernode.hh>
│ │ │ │ -
11#include <dune/typetree/compositenode.hh>
│ │ │ │ -
12
│ │ │ │ - │ │ │ │ -
14
│ │ │ │ - │ │ │ │ - │ │ │ │ -
17
│ │ │ │ -
18namespace Dune {
│ │ │ │ -
19namespace Functions {
│ │ │ │ -
20
│ │ │ │ -
21
│ │ │ │ -
22// *****************************************************************************
│ │ │ │ -
23// This is the reusable part of the basis. It contains
│ │ │ │ -
24//
│ │ │ │ -
25// TaylorHoodPreBasis
│ │ │ │ -
26// TaylorHoodBasisTree
│ │ │ │ -
27// TaylorHoodVelocityTree
│ │ │ │ -
28//
│ │ │ │ -
29// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ -
30// state. These components do _not_ depend on the global basis and local view
│ │ │ │ -
31// and can be used without a global basis.
│ │ │ │ -
32// *****************************************************************************
│ │ │ │ -
33
│ │ │ │ -
34template<typename GV>
│ │ │ │ -
35class TaylorHoodVelocityTree;
│ │ │ │ -
36
│ │ │ │ -
37template<typename GV>
│ │ │ │ -
38class TaylorHoodBasisTree;
│ │ │ │ +
6#include <tuple>
│ │ │ │ +
7#include <utility>
│ │ │ │ +
8
│ │ │ │ +
9#include <dune/common/std/apply.hh>
│ │ │ │ +
10#include <dune/common/hybridutilities.hh>
│ │ │ │ +
11#include <dune/common/reservedvector.hh>
│ │ │ │ +
12#include <dune/common/typeutilities.hh>
│ │ │ │ +
13#include <dune/common/hybridutilities.hh>
│ │ │ │ +
14#include <dune/common/tupleutility.hh>
│ │ │ │ +
15#include <dune/common/tuplevector.hh>
│ │ │ │ +
16
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
24
│ │ │ │ +
25
│ │ │ │ +
26namespace Dune {
│ │ │ │ +
27namespace Functions {
│ │ │ │ +
28
│ │ │ │ +
29// *****************************************************************************
│ │ │ │ +
30// This is the reusable part of the composite bases. It contains
│ │ │ │ +
31//
│ │ │ │ +
32// CompositePreBasis
│ │ │ │ +
33//
│ │ │ │ +
34// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ +
35// state. These components do _not_ depend on the global basis and local view
│ │ │ │ +
36// and can be used without a global basis.
│ │ │ │ +
37// *****************************************************************************
│ │ │ │ +
38
│ │ │ │
39
│ │ │ │ -
59template<typename GV, bool HI=false>
│ │ │ │ - │ │ │ │ -
61{
│ │ │ │ -
62 static const bool useHybridIndices = HI;
│ │ │ │ +
51template<class IMS, class... SPB>
│ │ │ │ + │ │ │ │ +
53{
│ │ │ │ +
54 static const bool isBlocked = std::is_same_v<IMS,BasisFactory::BlockedLexicographic> or std::is_same_v<IMS,BasisFactory::BlockedInterleaved>;
│ │ │ │ +
55public:
│ │ │ │ +
56
│ │ │ │ +
58 using SubPreBases = std::tuple<SPB...>;
│ │ │ │ +
59
│ │ │ │ +
61 template<std::size_t i>
│ │ │ │ +
62 using SubPreBasis = std::tuple_element_t<i, SubPreBases>;
│ │ │ │
63
│ │ │ │ -
64 static const int dim = GV::dimension;
│ │ │ │ -
65
│ │ │ │ -
66public:
│ │ │ │ -
67
│ │ │ │ -
69 using GridView = GV;
│ │ │ │ -
70
│ │ │ │ -
72 using size_type = std::size_t;
│ │ │ │ -
73
│ │ │ │ - │ │ │ │ -
76
│ │ │ │ -
77 static constexpr size_type maxMultiIndexSize = useHybridIndices ? 3 : 2;
│ │ │ │ -
78 static constexpr size_type minMultiIndexSize = 2;
│ │ │ │ - │ │ │ │ -
80
│ │ │ │ -
81private:
│ │ │ │ +
65 using GridView = typename std::tuple_element_t<0, SubPreBases>::GridView;
│ │ │ │ +
66
│ │ │ │ +
68 using size_type = std::size_t;
│ │ │ │ +
69
│ │ │ │ + │ │ │ │ +
72
│ │ │ │ +
73protected:
│ │ │ │ +
74 static const std::size_t children = sizeof...(SPB);
│ │ │ │ +
75
│ │ │ │ +
76 using ChildIndices = std::make_index_sequence<children>;
│ │ │ │ +
77
│ │ │ │ +
78public:
│ │ │ │ +
79
│ │ │ │ +
81 using Node = CompositeBasisNode<typename SPB::Node...>;
│ │ │ │
82
│ │ │ │ - │ │ │ │ - │ │ │ │ -
85
│ │ │ │ -
86public:
│ │ │ │ -
87
│ │ │ │ - │ │ │ │ -
90 gridView_(gv),
│ │ │ │ -
91 pq1PreBasis_(gv),
│ │ │ │ -
92 pq2PreBasis_(gv)
│ │ │ │ -
93 {}
│ │ │ │ -
94
│ │ │ │ - │ │ │ │ +
83 static constexpr size_type maxMultiIndexSize = std::max({SPB::maxMultiIndexSize...}) + isBlocked;
│ │ │ │ +
84 static constexpr size_type minMultiIndexSize = std::min({SPB::minMultiIndexSize...}) + isBlocked;
│ │ │ │ +
85 static constexpr size_type multiIndexBufferSize = std::max({SPB::multiIndexBufferSize...}) + isBlocked;
│ │ │ │ +
86
│ │ │ │ +
92 template<class... SFArgs,
│ │ │ │ +
93 disableCopyMove<CompositePreBasis, SFArgs...> = 0,
│ │ │ │ +
94 enableIfConstructible<std::tuple<SPB...>, SFArgs...> = 0>
│ │ │ │ +
95 CompositePreBasis(SFArgs&&... sfArgs) :
│ │ │ │ +
96 subPreBases_(std::forward<SFArgs>(sfArgs)...)
│ │ │ │
97 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
100 }
│ │ │ │ -
101
│ │ │ │ -
103 const GridView& gridView() const
│ │ │ │ -
104 {
│ │ │ │ -
105 return gridView_;
│ │ │ │ -
106 }
│ │ │ │ -
107
│ │ │ │ -
109 void update (const GridView& gv)
│ │ │ │ -
110 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
113 }
│ │ │ │ -
114
│ │ │ │ - │ │ │ │ -
119 {
│ │ │ │ -
120 return Node{};
│ │ │ │ +
98 Hybrid::forEach(subPreBases_, [&](const auto& subPreBasis){
│ │ │ │ +
99 static_assert(models<Concept::PreBasis<GridView>, std::decay_t<decltype(subPreBasis)>>(), "Subprebases passed to CompositePreBasis does not model the PreBasis concept.");
│ │ │ │ +
100 });
│ │ │ │ +
101 }
│ │ │ │ +
102
│ │ │ │ +
109 template<class GV,
│ │ │ │ +
110 std::enable_if_t<std::conjunction_v<
│ │ │ │ +
111 std::bool_constant<(children > 1)>, // Avoid ambiguous constructor if there's only one child
│ │ │ │ +
112 std::is_same<GV, GridView>,
│ │ │ │ +
113 std::is_constructible<SPB, GridView>...
│ │ │ │ +
114 >, int> = 0>
│ │ │ │ +
115 CompositePreBasis(const GV& gv) :
│ │ │ │ +
116 subPreBases_(SPB(gv)...)
│ │ │ │ +
117 {
│ │ │ │ +
118 Hybrid::forEach(subPreBases_, [&](const auto& subPreBasis){
│ │ │ │ +
119 static_assert(models<Concept::PreBasis<GridView>, std::decay_t<decltype(subPreBasis)>>(), "Subprebases passed to CompositePreBasis does not model the PreBasis concept.");
│ │ │ │ +
120 });
│ │ │ │
121 }
│ │ │ │
122
│ │ │ │ - │ │ │ │ -
125 {
│ │ │ │ -
126 return 2;
│ │ │ │ -
127 }
│ │ │ │ -
128
│ │ │ │ -
130 template<class SizePrefix>
│ │ │ │ -
131 size_type size(const SizePrefix& prefix) const
│ │ │ │ -
132 {
│ │ │ │ -
133 return sizeImp<useHybridIndices>(prefix);
│ │ │ │ -
134 }
│ │ │ │ -
135
│ │ │ │ -
136private:
│ │ │ │ -
137
│ │ │ │ -
138 template<bool hi, class SizePrefix,
│ │ │ │ -
139 typename std::enable_if<not hi,int>::type = 0>
│ │ │ │ -
140 size_type sizeImp(const SizePrefix& prefix) const
│ │ │ │ -
141 {
│ │ │ │ -
142 if (prefix.size() == 0)
│ │ │ │ -
143 return 2;
│ │ │ │ -
144 if (prefix.size() == 1)
│ │ │ │ -
145 {
│ │ │ │ -
146 if (prefix[0] == 0)
│ │ │ │ -
147 return dim * pq2PreBasis_.size();
│ │ │ │ -
148 if (prefix[0] == 1)
│ │ │ │ -
149 return pq1PreBasis_.size();
│ │ │ │ -
150 }
│ │ │ │ -
151 assert(prefix.size() == 2);
│ │ │ │ -
152 return 0;
│ │ │ │ -
153 }
│ │ │ │ -
154
│ │ │ │ -
155 template<bool hi, class SizePrefix,
│ │ │ │ -
156 typename std::enable_if<hi,int>::type = 0>
│ │ │ │ -
157 size_type sizeImp(const SizePrefix& prefix) const
│ │ │ │ -
158 {
│ │ │ │ -
159 if (prefix.size() == 0)
│ │ │ │ -
160 return 2;
│ │ │ │ -
161 if (prefix.size() == 1)
│ │ │ │ -
162 {
│ │ │ │ -
163 if (prefix[0] == 0)
│ │ │ │ -
164 return pq2PreBasis_.size();
│ │ │ │ -
165 if (prefix[0] == 1)
│ │ │ │ -
166 return pq1PreBasis_.size();
│ │ │ │ -
167 }
│ │ │ │ -
168 if (prefix.size() == 2)
│ │ │ │ -
169 {
│ │ │ │ -
170 if (prefix[0] == 0)
│ │ │ │ -
171 return dim;
│ │ │ │ -
172 if (prefix[0] == 1)
│ │ │ │ -
173 return 0;
│ │ │ │ -
174 }
│ │ │ │ -
175 assert(prefix.size() == 3);
│ │ │ │ -
176 return 0;
│ │ │ │ -
177 }
│ │ │ │ -
178
│ │ │ │ -
179public:
│ │ │ │ -
180
│ │ │ │ - │ │ │ │ -
183 {
│ │ │ │ -
184 return dim * pq2PreBasis_.size() + pq1PreBasis_.size();
│ │ │ │ -
185 }
│ │ │ │ -
186
│ │ │ │ - │ │ │ │ -
189 {
│ │ │ │ - │ │ │ │ -
191 }
│ │ │ │ -
192
│ │ │ │ -
193 template<typename It>
│ │ │ │ -
194 It indices(const Node& node, It it) const
│ │ │ │ -
195 {
│ │ │ │ -
196 return indicesImp<useHybridIndices>(node, it);
│ │ │ │ -
197 }
│ │ │ │ -
198
│ │ │ │ -
199protected:
│ │ │ │ -
200
│ │ │ │ -
201 template<class MultiIndex>
│ │ │ │ -
202 static const void multiIndexPushFront(MultiIndex& M, size_type M0)
│ │ │ │ -
203 {
│ │ │ │ -
204 M.resize(M.size()+1);
│ │ │ │ -
205 for(std::size_t i=M.size()-1; i>0; --i)
│ │ │ │ -
206 M[i] = M[i-1];
│ │ │ │ -
207 M[0] = M0;
│ │ │ │ -
208 }
│ │ │ │ -
209
│ │ │ │ -
210 template<bool hi, class It,
│ │ │ │ -
211 typename std::enable_if<not hi,int>::type = 0>
│ │ │ │ -
212 It indicesImp(const Node& node, It multiIndices) const
│ │ │ │ -
213 {
│ │ │ │ -
214 using namespace Dune::Indices;
│ │ │ │ -
215 for(std::size_t child=0; child<dim; ++child)
│ │ │ │ -
216 {
│ │ │ │ -
217 size_type subTreeSize = node.child(_0, 0).size();
│ │ │ │ -
218 pq2PreBasis_.indices(node.child(_0, 0), multiIndices);
│ │ │ │ -
219 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
220 {
│ │ │ │ -
221 multiIndexPushFront(multiIndices[i], 0);
│ │ │ │ -
222 multiIndices[i][1] = multiIndices[i][1]*dim + child;
│ │ │ │ -
223 }
│ │ │ │ -
224 multiIndices += subTreeSize;
│ │ │ │ -
225 }
│ │ │ │ -
226 size_type subTreeSize = node.child(_1).size();
│ │ │ │ -
227 pq1PreBasis_.indices(node.child(_1), multiIndices);
│ │ │ │ -
228 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
229 multiIndexPushFront(multiIndices[i], 1);
│ │ │ │ -
230 multiIndices += subTreeSize;
│ │ │ │ -
231 return multiIndices;
│ │ │ │ -
232 }
│ │ │ │ -
233
│ │ │ │ -
234 template<bool hi, class It,
│ │ │ │ -
235 typename std::enable_if<hi,int>::type = 0>
│ │ │ │ -
236 It indicesImp(const Node& node, It multiIndices) const
│ │ │ │ -
237 {
│ │ │ │ -
238 using namespace Dune::Indices;
│ │ │ │ -
239 for(std::size_t child=0; child<dim; ++child)
│ │ │ │ -
240 {
│ │ │ │ -
241 size_type subTreeSize = node.child(_0, 0).size();
│ │ │ │ -
242 pq2PreBasis_.indices(node.child(_0, 0), multiIndices);
│ │ │ │ -
243 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
244 {
│ │ │ │ -
245 multiIndexPushFront(multiIndices[i], 0);
│ │ │ │ -
246 multiIndices[i].push_back(i);
│ │ │ │ -
247 }
│ │ │ │ -
248 multiIndices += subTreeSize;
│ │ │ │ -
249 }
│ │ │ │ -
250 size_type subTreeSize = node.child(_1).size();
│ │ │ │ -
251 pq1PreBasis_.indices(node.child(_1), multiIndices);
│ │ │ │ -
252 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
253 multiIndexPushFront(multiIndices[i], 1);
│ │ │ │ -
254 multiIndices += subTreeSize;
│ │ │ │ -
255 return multiIndices;
│ │ │ │ -
256 }
│ │ │ │ -
257
│ │ │ │ - │ │ │ │ -
259
│ │ │ │ - │ │ │ │ - │ │ │ │ -
262};
│ │ │ │ -
263
│ │ │ │ -
264
│ │ │ │ -
265
│ │ │ │ -
266template<typename GV>
│ │ │ │ - │ │ │ │ -
268 public PowerBasisNode<LagrangeNode<GV,2>, GV::dimension>
│ │ │ │ -
269{
│ │ │ │ - │ │ │ │ - │ │ │ │ -
272
│ │ │ │ -
273public:
│ │ │ │ - │ │ │ │ -
275 {
│ │ │ │ -
276 for(int i=0; i<GV::dimension; ++i)
│ │ │ │ -
277 this->setChild(i, std::make_shared<PQ2Node>());
│ │ │ │ -
278 }
│ │ │ │ -
279};
│ │ │ │ -
280
│ │ │ │ -
281template<typename GV>
│ │ │ │ - │ │ │ │ -
283 public CompositeBasisNode<
│ │ │ │ -
284 TaylorHoodVelocityTree<GV>,
│ │ │ │ -
285 LagrangeNode<GV,1>
│ │ │ │ -
286 >
│ │ │ │ -
287{
│ │ │ │ - │ │ │ │ - │ │ │ │ -
290
│ │ │ │ - │ │ │ │ + │ │ │ │ +
125 {
│ │ │ │ +
126 Hybrid::forEach(ChildIndices(), [&](auto i) {
│ │ │ │ +
127 this->subPreBasis(i).initializeIndices();
│ │ │ │ +
128 });
│ │ │ │ +
129 }
│ │ │ │ +
130
│ │ │ │ +
132 const GridView& gridView() const
│ │ │ │ +
133 {
│ │ │ │ +
134 return std::get<0>(subPreBases_).gridView();
│ │ │ │ +
135 }
│ │ │ │ +
136
│ │ │ │ +
138 void update(const GridView& gv)
│ │ │ │ +
139 {
│ │ │ │ +
140 Hybrid::forEach(ChildIndices(), [&](auto i) {
│ │ │ │ +
141 this->subPreBasis(i).update(gv);
│ │ │ │ +
142 });
│ │ │ │ +
143 }
│ │ │ │ +
144
│ │ │ │ + │ │ │ │ +
149 {
│ │ │ │ +
150 auto node = Node{};
│ │ │ │ +
151 Hybrid::forEach(ChildIndices(), [&](auto i) {
│ │ │ │ +
152 node.setChild(this->subPreBasis(i).makeNode(), i);
│ │ │ │ +
153 });
│ │ │ │ +
154 return node;
│ │ │ │ +
155 }
│ │ │ │ +
156
│ │ │ │ + │ │ │ │ +
159 {
│ │ │ │ +
160 return size(Dune::ReservedVector<size_type, multiIndexBufferSize>{});
│ │ │ │ +
161 }
│ │ │ │ +
162
│ │ │ │ +
164 template<class SizePrefix>
│ │ │ │ +
165 size_type size(const SizePrefix& prefix) const
│ │ │ │ +
166 {
│ │ │ │ +
167 return size(prefix, IndexMergingStrategy{});
│ │ │ │ +
168 }
│ │ │ │ +
169
│ │ │ │ +
170private:
│ │ │ │ +
171
│ │ │ │ +
172 template<class SizePrefix>
│ │ │ │ +
173 size_type size(const SizePrefix& prefix, BasisFactory::BlockedLexicographic) const
│ │ │ │ +
174 {
│ │ │ │ +
175 if (prefix.size() == 0)
│ │ │ │ +
176 return children;
│ │ │ │ +
177
│ │ │ │ +
178 return Hybrid::switchCases(ChildIndices(), prefix[0], [&] (auto i) {
│ │ │ │ +
179 SizePrefix subPrefix;
│ │ │ │ +
180 for(std::size_t i=1; i<prefix.size(); ++i)
│ │ │ │ +
181 subPrefix.push_back(prefix[i]);
│ │ │ │ +
182 return this->subPreBasis(i).size(subPrefix);
│ │ │ │ +
183 }, []() {
│ │ │ │ +
184 return size_type(0);
│ │ │ │ +
185 });
│ │ │ │ +
186 }
│ │ │ │ +
187
│ │ │ │ +
188 template<class SizePrefix>
│ │ │ │ +
189 size_type size(const SizePrefix& prefix, BasisFactory::FlatLexicographic) const
│ │ │ │ +
190 {
│ │ │ │ +
191 size_type result = 0;
│ │ │ │ +
192 if (prefix.size() == 0)
│ │ │ │ +
193 Hybrid::forEach(ChildIndices(), [&](auto i) {
│ │ │ │ +
194 result += this->subPreBasis(i).size();
│ │ │ │ +
195 });
│ │ │ │ +
196 else {
│ │ │ │ +
197 size_type shiftedFirstDigit = prefix[0];
│ │ │ │ +
198 staticFindInRange<0, children>([&](auto i) {
│ │ │ │ +
199 auto firstDigitSize = this->subPreBasis(i).size();
│ │ │ │ +
200 if (shiftedFirstDigit < firstDigitSize)
│ │ │ │ +
201 {
│ │ │ │ +
202 SizePrefix subPrefix;
│ │ │ │ +
203 subPrefix.push_back(shiftedFirstDigit);
│ │ │ │ +
204 for(std::size_t i=1; i<prefix.size(); ++i)
│ │ │ │ +
205 subPrefix.push_back(prefix[i]);
│ │ │ │ +
206 result = this->subPreBasis(i).size(subPrefix);
│ │ │ │ +
207 return true;
│ │ │ │ +
208 }
│ │ │ │ +
209 shiftedFirstDigit -= firstDigitSize;
│ │ │ │ +
210 return false;
│ │ │ │ +
211 });
│ │ │ │ +
212 }
│ │ │ │ +
213 return result;
│ │ │ │ +
214 }
│ │ │ │ +
215
│ │ │ │ +
216public:
│ │ │ │ +
217
│ │ │ │ + │ │ │ │ +
220 {
│ │ │ │ +
221 size_type r=0;
│ │ │ │ +
222 // Accumulate dimension() for all subprebases
│ │ │ │ +
223 Hybrid::forEach(ChildIndices(), [&](auto i) {
│ │ │ │ +
224 r += this->subPreBasis(i).dimension();
│ │ │ │ +
225 });
│ │ │ │ +
226 return r;
│ │ │ │ +
227 }
│ │ │ │ +
228
│ │ │ │ + │ │ │ │ +
231 {
│ │ │ │ +
232 size_type r=0;
│ │ │ │ +
233 // Accumulate maxNodeSize() for all subprebases
│ │ │ │ +
234 Hybrid::forEach(ChildIndices(), [&](auto i) {
│ │ │ │ +
235 r += this->subPreBasis(i).maxNodeSize();
│ │ │ │ +
236 });
│ │ │ │ +
237 return r;
│ │ │ │ +
238 }
│ │ │ │ +
239
│ │ │ │ +
241 template<std::size_t i>
│ │ │ │ +
242 const SubPreBasis<i>& subPreBasis(Dune::index_constant<i> = {}) const
│ │ │ │ +
243 {
│ │ │ │ +
244 return std::get<i>(subPreBases_);
│ │ │ │ +
245 }
│ │ │ │ +
246
│ │ │ │ +
248 template<std::size_t i>
│ │ │ │ +
249 SubPreBasis<i>& subPreBasis(Dune::index_constant<i> = {})
│ │ │ │ +
250 {
│ │ │ │ +
251 return std::get<i>(subPreBases_);
│ │ │ │ +
252 }
│ │ │ │ +
253
│ │ │ │ +
255 template<typename It>
│ │ │ │ +
256 It indices(const Node& node, It it) const
│ │ │ │ +
257 {
│ │ │ │ +
258 return indices(node, it, IndexMergingStrategy{});
│ │ │ │ +
259 }
│ │ │ │ +
260
│ │ │ │ +
261private:
│ │ │ │ +
262
│ │ │ │ +
263 template<typename It>
│ │ │ │ +
264 It indices(const Node& node, It multiIndices, BasisFactory::FlatLexicographic) const
│ │ │ │ +
265 {
│ │ │ │ +
266 size_type firstComponentOffset = 0;
│ │ │ │ +
267 // Loop over all children
│ │ │ │ +
268 Hybrid::forEach(ChildIndices(), [&](auto child){
│ │ │ │ +
269 size_type subTreeSize = node.child(child).size();
│ │ │ │ +
270 // Fill indices for current child into index buffer starting from current
│ │ │ │ +
271 // buffer position and shift first index component of any index for current
│ │ │ │ +
272 // child by suitable offset to get lexicographic indices.
│ │ │ │ +
273 subPreBasis(child).indices(node.child(child), multiIndices);
│ │ │ │ +
274 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ +
275 multiIndices[i][0] += firstComponentOffset;
│ │ │ │ +
276 // Increment offset by the size for first index component of the current child
│ │ │ │ +
277 firstComponentOffset += subPreBasis(child).size();
│ │ │ │ +
278 // Increment buffer iterator by the number of indices processed for current child
│ │ │ │ +
279 multiIndices += subTreeSize;
│ │ │ │ +
280 });
│ │ │ │ +
281 return multiIndices;
│ │ │ │ +
282 }
│ │ │ │ +
283
│ │ │ │ +
284 template<class MultiIndex>
│ │ │ │ +
285 static void multiIndexPushFront(MultiIndex& M, size_type M0)
│ │ │ │ +
286 {
│ │ │ │ +
287 M.resize(M.size()+1);
│ │ │ │ +
288 for(std::size_t i=M.size()-1; i>0; --i)
│ │ │ │ +
289 M[i] = M[i-1];
│ │ │ │ +
290 M[0] = M0;
│ │ │ │ +
291 }
│ │ │ │
292
│ │ │ │ -
293public:
│ │ │ │ - │ │ │ │ -
295 {
│ │ │ │ -
296 this->template setChild<0>(std::make_shared<VelocityNode>());
│ │ │ │ -
297 this->template setChild<1>(std::make_shared<PressureNode>());
│ │ │ │ -
298 }
│ │ │ │ -
299};
│ │ │ │ -
300
│ │ │ │ -
301
│ │ │ │ -
302
│ │ │ │ -
303namespace BasisFactory {
│ │ │ │ -
304
│ │ │ │ -
311inline auto taylorHood()
│ │ │ │ -
312{
│ │ │ │ -
313 return [](const auto& gridView) {
│ │ │ │ -
314 return TaylorHoodPreBasis<std::decay_t<decltype(gridView)>>(gridView);
│ │ │ │ -
315 };
│ │ │ │ -
316}
│ │ │ │ -
317
│ │ │ │ -
318} // end namespace BasisFactory
│ │ │ │ -
319
│ │ │ │ -
320// *****************************************************************************
│ │ │ │ -
321// This is the actual global basis implementation based on the reusable parts.
│ │ │ │ -
322// *****************************************************************************
│ │ │ │ -
323
│ │ │ │ -
345template<typename GV>
│ │ │ │ - │ │ │ │ +
293 template<typename It>
│ │ │ │ +
294 It indices(const Node& node, It multiIndices, BasisFactory::BlockedLexicographic) const
│ │ │ │ +
295 {
│ │ │ │ +
296 // Loop over all children
│ │ │ │ +
297 Hybrid::forEach(ChildIndices(), [&](auto child){
│ │ │ │ +
298 size_type subTreeSize = node.child(child).size();
│ │ │ │ +
299 // Fill indices for current child into index buffer starting from current position
│ │ │ │ +
300 subPreBasis(child).indices(node.child(child), multiIndices);
│ │ │ │ +
301 // Insert child index before first component of all indices of current child.
│ │ │ │ +
302 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ +
303 this->multiIndexPushFront(multiIndices[i], child);
│ │ │ │ +
304 // Increment buffer iterator by the number of indices processed for current child
│ │ │ │ +
305 multiIndices += subTreeSize;
│ │ │ │ +
306 });
│ │ │ │ +
307 return multiIndices;
│ │ │ │ +
308 }
│ │ │ │ +
309
│ │ │ │ +
310 std::tuple<SPB...> subPreBases_;
│ │ │ │ +
311};
│ │ │ │ +
312
│ │ │ │ +
313
│ │ │ │ +
314
│ │ │ │ +
315namespace BasisFactory {
│ │ │ │ +
316
│ │ │ │ +
317namespace Imp {
│ │ │ │ +
318
│ │ │ │ +
319template<class IndexMergingStrategy, class... ChildPreBasisFactory>
│ │ │ │ +
320class CompositePreBasisFactory
│ │ │ │ +
321{
│ │ │ │ +
322
│ │ │ │ +
323 template<class GridView, class... ChildPreBasis>
│ │ │ │ +
324 auto makePreBasisFromChildPreBases(const GridView&, ChildPreBasis&&... childPreBasis) const
│ │ │ │ +
325 {
│ │ │ │ +
326 return CompositePreBasis<IndexMergingStrategy, std::decay_t<ChildPreBasis>...>(std::forward<ChildPreBasis>(childPreBasis)...);
│ │ │ │ +
327 }
│ │ │ │ +
328
│ │ │ │ +
329public:
│ │ │ │ +
330
│ │ │ │ +
331 CompositePreBasisFactory(const ChildPreBasisFactory&... childPreBasisFactory) :
│ │ │ │ +
332 childPreBasisFactories_(childPreBasisFactory...)
│ │ │ │ +
333 {}
│ │ │ │ +
334
│ │ │ │ +
335 CompositePreBasisFactory(ChildPreBasisFactory&&... childPreBasisFactory) :
│ │ │ │ +
336 childPreBasisFactories_(std::move(childPreBasisFactory)...)
│ │ │ │ +
337 {}
│ │ │ │ +
338
│ │ │ │ +
339 template<class GridView>
│ │ │ │ +
340 auto operator()(const GridView& gridView) const
│ │ │ │ +
341 {
│ │ │ │ +
342 // Use std::apply to unpack the tuple childPreBasisFactories_
│ │ │ │ +
343 return std::apply([&](const auto&... childPreBasisFactory) {
│ │ │ │ +
344 return this->makePreBasisFromChildPreBases(gridView, childPreBasisFactory(gridView)...);
│ │ │ │ +
345 }, childPreBasisFactories_);
│ │ │ │ +
346 }
│ │ │ │
347
│ │ │ │ -
348
│ │ │ │ -
349
│ │ │ │ -
350} // end namespace Functions
│ │ │ │ -
351} // end namespace Dune
│ │ │ │ -
352
│ │ │ │ +
348private:
│ │ │ │ +
349 std::tuple<ChildPreBasisFactory...> childPreBasisFactories_;
│ │ │ │ +
350};
│ │ │ │ +
351
│ │ │ │ +
352} // end namespace BasisFactory::Imp
│ │ │ │
353
│ │ │ │ -
354#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TAYLORHOODBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
auto taylorHood()
Create a pre-basis factory that can create a Taylor-Hood pre-basis.
Definition: taylorhoodbasis.hh:311
│ │ │ │ +
354
│ │ │ │ +
355
│ │ │ │ +
366template<
│ │ │ │ +
367 typename... Args,
│ │ │ │ +
368 std::enable_if_t<Concept::isIndexMergingStrategy<typename LastType<Args...>::type>(),int> = 0>
│ │ │ │ +
369auto composite(Args&&... args)
│ │ │ │ +
370{
│ │ │ │ +
371 // We have to separate the last entry which is the IndexMergingStrategy
│ │ │ │ +
372 // and the preceding ones, which are the ChildPreBasisFactories
│ │ │ │ +
373
│ │ │ │ +
374 using ArgTuple = std::tuple<std::decay_t<Args>...>;
│ │ │ │ +
375
│ │ │ │ +
376 // Compute number of children and index of the IndexMergingStrategy argument
│ │ │ │ +
377 constexpr std::size_t children = Dune::SizeOf<Args...>::value-1;
│ │ │ │ +
378
│ │ │ │ +
379 // Use last type as IndexMergingStrategy
│ │ │ │ +
380 using IndexMergingStrategy = std::tuple_element_t<children, ArgTuple>;
│ │ │ │ +
381
│ │ │ │ +
382 // Index sequence for all but the last entry for partial tuple unpacking
│ │ │ │ +
383 auto childIndices = std::make_index_sequence<children>{};
│ │ │ │ +
384
│ │ │ │ +
385 // Unpack tuple only for those entries related to children
│ │ │ │ +
386 return applyPartial([](auto&&... childPreBasisFactory){
│ │ │ │ +
387 return Imp::CompositePreBasisFactory<IndexMergingStrategy, std::decay_t<decltype(childPreBasisFactory)>...>(std::forward<decltype(childPreBasisFactory)>(childPreBasisFactory)...);
│ │ │ │ +
388 },
│ │ │ │ +
389 std::forward_as_tuple(std::forward<Args>(args)...),
│ │ │ │ +
390 childIndices);
│ │ │ │ +
391}
│ │ │ │ +
392
│ │ │ │ +
404template<
│ │ │ │ +
405 typename... Args,
│ │ │ │ +
406 std::enable_if_t<not Concept::isIndexMergingStrategy<typename LastType<Args...>::type>(),int> = 0>
│ │ │ │ +
407auto composite(Args&&... args)
│ │ │ │ +
408{
│ │ │ │ +
409 return Imp::CompositePreBasisFactory<BasisFactory::BlockedLexicographic, std::decay_t<Args>...>(std::forward<Args>(args)...);
│ │ │ │ +
410}
│ │ │ │ +
411
│ │ │ │ +
412} // end namespace BasisFactory
│ │ │ │ +
413
│ │ │ │ +
414// Backward compatibility
│ │ │ │ +
415namespace BasisBuilder {
│ │ │ │ +
416
│ │ │ │ +
417 using namespace BasisFactory;
│ │ │ │ +
418
│ │ │ │ +
419}
│ │ │ │ +
420
│ │ │ │ +
421
│ │ │ │ +
422
│ │ │ │ +
423} // end namespace Functions
│ │ │ │ +
424} // end namespace Dune
│ │ │ │ +
425
│ │ │ │ +
426
│ │ │ │ +
427#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_COMPOSITEBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
auto composite(Args &&... args)
Create a factory builder that can build a CompositePreBasis.
Definition: compositebasis.hh:369
│ │ │ │ +
typename std::enable_if< std::is_constructible< T, Args... >::value, int >::type enableIfConstructible
Helper to constrain forwarding constructors.
Definition: type_traits.hh:26
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
Global basis for given pre-basis.
Definition: defaultglobalbasis.hh:46
│ │ │ │ -
Definition: lagrangebasis.hh:387
│ │ │ │ - │ │ │ │ -
It indices(const Node &node, It it) const
Definition: lagrangebasis.hh:192
│ │ │ │ -
void initializeIndices()
Initialize the global indices.
Definition: lagrangebasis.hh:96
│ │ │ │ -
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition: lagrangebasis.hh:126
│ │ │ │ -
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition: lagrangebasis.hh:184
│ │ │ │ -
size_type size() const
Same as size(prefix) with empty prefix.
Definition: lagrangebasis.hh:140
│ │ │ │ -
size_type size() const
Definition: nodes.hh:142
│ │ │ │ -
Definition: nodes.hh:193
│ │ │ │ +
static constexpr bool isIndexMergingStrategy()
Definition: basistags.hh:23
│ │ │ │ +
Get last entry of type list.
Definition: utility.hh:222
│ │ │ │ +
Base class for index merging strategies to simplify detection.
Definition: basistags.hh:44
│ │ │ │ +
Lexicographic merging of direct children without blocking.
Definition: basistags.hh:80
│ │ │ │ +
Lexicographic merging of direct children with blocking (i.e. creating one block per direct child).
Definition: basistags.hh:148
│ │ │ │ +
A pre-basis for composite bases.
Definition: compositebasis.hh:53
│ │ │ │ +
SubPreBasis< i > & subPreBasis(Dune::index_constant< i >={})
Mutable access to the stored prebasis of the factor in the power space.
Definition: compositebasis.hh:249
│ │ │ │ +
IMS IndexMergingStrategy
Strategy used to merge the global indices of the child pre-bases.
Definition: compositebasis.hh:71
│ │ │ │ +
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition: compositebasis.hh:230
│ │ │ │ +
const SubPreBasis< i > & subPreBasis(Dune::index_constant< i >={}) const
Const access to the stored prebasis of the factor in the power space.
Definition: compositebasis.hh:242
│ │ │ │ +
std::size_t size_type
Type used for indices and size information.
Definition: compositebasis.hh:68
│ │ │ │ +
CompositeBasisNode< typename SPB::Node... > Node
Template mapping root tree path to type of created tree node.
Definition: compositebasis.hh:81
│ │ │ │ +
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition: compositebasis.hh:165
│ │ │ │ +
CompositePreBasis(SFArgs &&... sfArgs)
Constructor for given child pre-basis objects.
Definition: compositebasis.hh:95
│ │ │ │ +
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition: compositebasis.hh:219
│ │ │ │ +
CompositePreBasis(const GV &gv)
Constructor for given GridView.
Definition: compositebasis.hh:115
│ │ │ │ +
It indices(const Node &node, It it) const
Maps from subtree index set [0..size-1] to a globally unique multi index in global basis.
Definition: compositebasis.hh:256
│ │ │ │ +
size_type size() const
Same as size(prefix) with empty prefix.
Definition: compositebasis.hh:158
│ │ │ │ +
typename std::tuple_element_t< 0, SubPreBases >::GridView GridView
The grid view that the FE basis is defined on.
Definition: compositebasis.hh:65
│ │ │ │ +
static const std::size_t children
Definition: compositebasis.hh:74
│ │ │ │ +
std::tuple< SPB... > SubPreBases
Tuple of child pre-bases.
Definition: compositebasis.hh:58
│ │ │ │ +
Node makeNode() const
Create tree node.
Definition: compositebasis.hh:148
│ │ │ │ +
void initializeIndices()
Initialize the global indices.
Definition: compositebasis.hh:124
│ │ │ │ +
std::tuple_element_t< i, SubPreBases > SubPreBasis
Export individual child pre-bases by index.
Definition: compositebasis.hh:62
│ │ │ │ +
std::make_index_sequence< children > ChildIndices
Definition: compositebasis.hh:76
│ │ │ │ +
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition: compositebasis.hh:138
│ │ │ │ +
static constexpr size_type multiIndexBufferSize
Definition: compositebasis.hh:85
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: compositebasis.hh:132
│ │ │ │ +
static constexpr size_type minMultiIndexSize
Definition: compositebasis.hh:84
│ │ │ │ +
static constexpr size_type maxMultiIndexSize
Definition: compositebasis.hh:83
│ │ │ │
Definition: nodes.hh:219
│ │ │ │ -
Definition: taylorhoodbasis.hh:269
│ │ │ │ -
TaylorHoodVelocityTree()
Definition: taylorhoodbasis.hh:274
│ │ │ │ -
Definition: taylorhoodbasis.hh:287
│ │ │ │ -
TaylorHoodBasisTree()
Definition: taylorhoodbasis.hh:294
│ │ │ │ -
Pre-basis for lowest order Taylor-Hood basis.
Definition: taylorhoodbasis.hh:61
│ │ │ │ -
TaylorHoodPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition: taylorhoodbasis.hh:89
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: taylorhoodbasis.hh:103
│ │ │ │ -
static constexpr size_type minMultiIndexSize
Definition: taylorhoodbasis.hh:78
│ │ │ │ -
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition: taylorhoodbasis.hh:131
│ │ │ │ -
GridView gridView_
Definition: taylorhoodbasis.hh:258
│ │ │ │ -
GV GridView
The grid view that the FE basis is defined on.
Definition: taylorhoodbasis.hh:69
│ │ │ │ -
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition: taylorhoodbasis.hh:109
│ │ │ │ -
PQ2PreBasis pq2PreBasis_
Definition: taylorhoodbasis.hh:261
│ │ │ │ -
size_type size() const
Same as size(prefix) with empty prefix.
Definition: taylorhoodbasis.hh:124
│ │ │ │ -
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition: taylorhoodbasis.hh:182
│ │ │ │ -
PQ1PreBasis pq1PreBasis_
Definition: taylorhoodbasis.hh:260
│ │ │ │ -
static const void multiIndexPushFront(MultiIndex &M, size_type M0)
Definition: taylorhoodbasis.hh:202
│ │ │ │ -
static constexpr size_type maxMultiIndexSize
Definition: taylorhoodbasis.hh:77
│ │ │ │ -
Node makeNode() const
Create tree node.
Definition: taylorhoodbasis.hh:118
│ │ │ │ -
It indices(const Node &node, It it) const
Definition: taylorhoodbasis.hh:194
│ │ │ │ -
static constexpr size_type multiIndexBufferSize
Definition: taylorhoodbasis.hh:79
│ │ │ │ -
void initializeIndices()
Initialize the global indices.
Definition: taylorhoodbasis.hh:96
│ │ │ │ -
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition: taylorhoodbasis.hh:188
│ │ │ │ -
std::size_t size_type
Type used for indices and size information.
Definition: taylorhoodbasis.hh:72
│ │ │ │ -
It indicesImp(const Node &node, It multiIndices) const
Definition: taylorhoodbasis.hh:212
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,438 +5,541 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -taylorhoodbasis.hh │ │ │ │ │ +compositebasis.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TAYLORHOODBASIS_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TAYLORHOODBASIS_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_COMPOSITEBASIS_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_COMPOSITEBASIS_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ - 8#include │ │ │ │ │ - 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12 │ │ │ │ │ - 13#include │ │ │ │ │ - 14 │ │ │ │ │ - 15#include │ │ │ │ │ - 16#include │ │ │ │ │ - 17 │ │ │ │ │ - 18namespace Dune { │ │ │ │ │ - 19namespace Functions { │ │ │ │ │ - 20 │ │ │ │ │ - 21 │ │ │ │ │ - 22/ │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8 │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14#include │ │ │ │ │ + 15#include │ │ │ │ │ + 16 │ │ │ │ │ + 17#include │ │ │ │ │ + 18#include │ │ │ │ │ + 19#include │ │ │ │ │ + 20#include │ │ │ │ │ + 21#include │ │ │ │ │ + 22#include │ │ │ │ │ + 23#include │ │ │ │ │ + 24 │ │ │ │ │ + 25 │ │ │ │ │ + 26namespace Dune { │ │ │ │ │ + 27namespace Functions { │ │ │ │ │ + 28 │ │ │ │ │ + 29/ │ │ │ │ │ / ***************************************************************************** │ │ │ │ │ - 23// This is the reusable part of the basis. It contains │ │ │ │ │ - 24// │ │ │ │ │ - 25// TaylorHoodPreBasis │ │ │ │ │ - 26// TaylorHoodBasisTree │ │ │ │ │ - 27// TaylorHoodVelocityTree │ │ │ │ │ - 28// │ │ │ │ │ - 29// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ + 30// This is the reusable part of the composite bases. It contains │ │ │ │ │ + 31// │ │ │ │ │ + 32// CompositePreBasis │ │ │ │ │ + 33// │ │ │ │ │ + 34// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ shared │ │ │ │ │ - 30// state. These components do _not_ depend on the global basis and local │ │ │ │ │ + 35// state. These components do _not_ depend on the global basis and local │ │ │ │ │ view │ │ │ │ │ - 31// and can be used without a global basis. │ │ │ │ │ - 32/ │ │ │ │ │ + 36// and can be used without a global basis. │ │ │ │ │ + 37/ │ │ │ │ │ / ***************************************************************************** │ │ │ │ │ - 33 │ │ │ │ │ - 34template │ │ │ │ │ - 35class TaylorHoodVelocityTree; │ │ │ │ │ - 36 │ │ │ │ │ - 37template │ │ │ │ │ - 38class TaylorHoodBasisTree; │ │ │ │ │ + 38 │ │ │ │ │ 39 │ │ │ │ │ - 59template │ │ │ │ │ -60class TaylorHoodPreBasis │ │ │ │ │ - 61{ │ │ │ │ │ - 62 static const bool useHybridIndices = HI; │ │ │ │ │ + 51template │ │ │ │ │ +52class CompositePreBasis │ │ │ │ │ + 53{ │ │ │ │ │ + 54 static const bool isBlocked = std::is_same_v or std::is_same_v; │ │ │ │ │ + 55public: │ │ │ │ │ + 56 │ │ │ │ │ +58 using SubPreBases = std::tuple; │ │ │ │ │ + 59 │ │ │ │ │ + 61 template │ │ │ │ │ +62 using SubPreBasis = std::tuple_element_t; │ │ │ │ │ 63 │ │ │ │ │ - 64 static const int dim = GV::dimension; │ │ │ │ │ - 65 │ │ │ │ │ - 66public: │ │ │ │ │ - 67 │ │ │ │ │ -69 using GridView = GV; │ │ │ │ │ - 70 │ │ │ │ │ -72 using size_type = std::size_t; │ │ │ │ │ - 73 │ │ │ │ │ -75 using Node = TaylorHoodBasisTree; │ │ │ │ │ - 76 │ │ │ │ │ -77 static constexpr size_type maxMultiIndexSize = useHybridIndices ? 3 : 2; │ │ │ │ │ -78 static constexpr size_type minMultiIndexSize = 2; │ │ │ │ │ -79 static constexpr size_type multiIndexBufferSize = maxMultiIndexSize; │ │ │ │ │ - 80 │ │ │ │ │ - 81private: │ │ │ │ │ +65 using GridView = typename std::tuple_element_t<0, SubPreBases>::GridView; │ │ │ │ │ + 66 │ │ │ │ │ +68 using size_type = std::size_t; │ │ │ │ │ + 69 │ │ │ │ │ +71 using IndexMergingStrategy = IMS; │ │ │ │ │ + 72 │ │ │ │ │ + 73protected: │ │ │ │ │ +74 static const std::size_t children = sizeof...(SPB); │ │ │ │ │ + 75 │ │ │ │ │ +76 using ChildIndices = std::make_index_sequence; │ │ │ │ │ + 77 │ │ │ │ │ + 78public: │ │ │ │ │ + 79 │ │ │ │ │ +81 using Node = CompositeBasisNode; │ │ │ │ │ 82 │ │ │ │ │ - 83 using PQ1PreBasis = LagrangePreBasis; │ │ │ │ │ - 84 using PQ2PreBasis = LagrangePreBasis; │ │ │ │ │ - 85 │ │ │ │ │ - 86public: │ │ │ │ │ - 87 │ │ │ │ │ -89 TaylorHoodPreBasis(const GridView& gv) : │ │ │ │ │ - 90 gridView_(gv), │ │ │ │ │ - 91 pq1PreBasis_(gv), │ │ │ │ │ - 92 pq2PreBasis_(gv) │ │ │ │ │ - 93 {} │ │ │ │ │ - 94 │ │ │ │ │ -96 void initializeIndices() │ │ │ │ │ +83 static constexpr size_type maxMultiIndexSize = std::max({SPB:: │ │ │ │ │ +maxMultiIndexSize...}) + isBlocked; │ │ │ │ │ +84 static constexpr size_type minMultiIndexSize = std::min({SPB:: │ │ │ │ │ +minMultiIndexSize...}) + isBlocked; │ │ │ │ │ +85 static constexpr size_type multiIndexBufferSize = std::max({SPB:: │ │ │ │ │ +multiIndexBufferSize...}) + isBlocked; │ │ │ │ │ + 86 │ │ │ │ │ + 92 template = 0, │ │ │ │ │ + 94 enableIfConstructible, SFArgs...> = 0> │ │ │ │ │ +95 CompositePreBasis(SFArgs&&... sfArgs) : │ │ │ │ │ + 96 subPreBases_(std::forward(sfArgs)...) │ │ │ │ │ 97 { │ │ │ │ │ - 98 pq1PreBasis_.initializeIndices(); │ │ │ │ │ - 99 pq2PreBasis_.initializeIndices(); │ │ │ │ │ - 100 } │ │ │ │ │ - 101 │ │ │ │ │ -103 const GridView& gridView() const │ │ │ │ │ - 104 { │ │ │ │ │ - 105 return gridView_; │ │ │ │ │ - 106 } │ │ │ │ │ - 107 │ │ │ │ │ -109 void update (const GridView& gv) │ │ │ │ │ - 110 { │ │ │ │ │ - 111 pq1PreBasis_.update(gv); │ │ │ │ │ - 112 pq2PreBasis_.update(gv); │ │ │ │ │ - 113 } │ │ │ │ │ - 114 │ │ │ │ │ -118 Node makeNode() const │ │ │ │ │ - 119 { │ │ │ │ │ - 120 return Node{}; │ │ │ │ │ + 98 Hybrid::forEach(subPreBases_, [&](const auto& subPreBasis){ │ │ │ │ │ + 99 static_assert(models, std::decay_t>(), "Subprebases passed to CompositePreBasis does not model the │ │ │ │ │ +PreBasis concept."); │ │ │ │ │ + 100 }); │ │ │ │ │ + 101 } │ │ │ │ │ + 102 │ │ │ │ │ + 109 template 1)>, // Avoid ambiguous constructor if │ │ │ │ │ +there's only one child │ │ │ │ │ + 112 std::is_same, │ │ │ │ │ + 113 std::is_constructible... │ │ │ │ │ + 114 >, int> = 0> │ │ │ │ │ +115 CompositePreBasis(const GV& gv) : │ │ │ │ │ + 116 subPreBases_(SPB(gv)...) │ │ │ │ │ + 117 { │ │ │ │ │ + 118 Hybrid::forEach(subPreBases_, [&](const auto& subPreBasis){ │ │ │ │ │ + 119 static_assert(models, std::decay_t>(), "Subprebases passed to CompositePreBasis does not model the │ │ │ │ │ +PreBasis concept."); │ │ │ │ │ + 120 }); │ │ │ │ │ 121 } │ │ │ │ │ 122 │ │ │ │ │ -124 size_type size() const │ │ │ │ │ +124 void initializeIndices() │ │ │ │ │ 125 { │ │ │ │ │ - 126 return 2; │ │ │ │ │ - 127 } │ │ │ │ │ - 128 │ │ │ │ │ - 130 template │ │ │ │ │ -131 size_type size(const SizePrefix& prefix) const │ │ │ │ │ - 132 { │ │ │ │ │ - 133 return sizeImp(prefix); │ │ │ │ │ - 134 } │ │ │ │ │ - 135 │ │ │ │ │ - 136private: │ │ │ │ │ - 137 │ │ │ │ │ - 138 template::type = 0> │ │ │ │ │ - 140 size_type sizeImp(const SizePrefix& prefix) const │ │ │ │ │ - 141 { │ │ │ │ │ - 142 if (prefix.size() == 0) │ │ │ │ │ - 143 return 2; │ │ │ │ │ - 144 if (prefix.size() == 1) │ │ │ │ │ - 145 { │ │ │ │ │ - 146 if (prefix[0] == 0) │ │ │ │ │ - 147 return dim * pq2PreBasis_.size(); │ │ │ │ │ - 148 if (prefix[0] == 1) │ │ │ │ │ - 149 return pq1PreBasis_.size(); │ │ │ │ │ - 150 } │ │ │ │ │ - 151 assert(prefix.size() == 2); │ │ │ │ │ - 152 return 0; │ │ │ │ │ - 153 } │ │ │ │ │ - 154 │ │ │ │ │ - 155 template::type = 0> │ │ │ │ │ - 157 size_type sizeImp(const SizePrefix& prefix) const │ │ │ │ │ - 158 { │ │ │ │ │ - 159 if (prefix.size() == 0) │ │ │ │ │ - 160 return 2; │ │ │ │ │ - 161 if (prefix.size() == 1) │ │ │ │ │ - 162 { │ │ │ │ │ - 163 if (prefix[0] == 0) │ │ │ │ │ - 164 return pq2PreBasis_.size(); │ │ │ │ │ - 165 if (prefix[0] == 1) │ │ │ │ │ - 166 return pq1PreBasis_.size(); │ │ │ │ │ - 167 } │ │ │ │ │ - 168 if (prefix.size() == 2) │ │ │ │ │ - 169 { │ │ │ │ │ - 170 if (prefix[0] == 0) │ │ │ │ │ - 171 return dim; │ │ │ │ │ - 172 if (prefix[0] == 1) │ │ │ │ │ - 173 return 0; │ │ │ │ │ - 174 } │ │ │ │ │ - 175 assert(prefix.size() == 3); │ │ │ │ │ - 176 return 0; │ │ │ │ │ - 177 } │ │ │ │ │ - 178 │ │ │ │ │ - 179public: │ │ │ │ │ - 180 │ │ │ │ │ -182 size_type dimension() const │ │ │ │ │ - 183 { │ │ │ │ │ - 184 return dim * pq2PreBasis_.size() + pq1PreBasis_.size(); │ │ │ │ │ - 185 } │ │ │ │ │ - 186 │ │ │ │ │ -188 size_type maxNodeSize() const │ │ │ │ │ - 189 { │ │ │ │ │ - 190 return dim * pq2PreBasis_.maxNodeSize() + pq1PreBasis_.maxNodeSize(); │ │ │ │ │ - 191 } │ │ │ │ │ - 192 │ │ │ │ │ - 193 template │ │ │ │ │ -194 It indices(const Node& node, It it) const │ │ │ │ │ - 195 { │ │ │ │ │ - 196 return indicesImp(node, it); │ │ │ │ │ - 197 } │ │ │ │ │ - 198 │ │ │ │ │ - 199protected: │ │ │ │ │ - 200 │ │ │ │ │ - 201 template │ │ │ │ │ -202 static const void multiIndexPushFront(MultiIndex& M, size_type M0) │ │ │ │ │ - 203 { │ │ │ │ │ - 204 M.resize(M.size()+1); │ │ │ │ │ - 205 for(std::size_t i=M.size()-1; i>0; --i) │ │ │ │ │ - 206 M[i] = M[i-1]; │ │ │ │ │ - 207 M[0] = M0; │ │ │ │ │ + 126 Hybrid::forEach(ChildIndices(), [&](auto i) { │ │ │ │ │ + 127 this->subPreBasis(i).initializeIndices(); │ │ │ │ │ + 128 }); │ │ │ │ │ + 129 } │ │ │ │ │ + 130 │ │ │ │ │ +132 const GridView& gridView() const │ │ │ │ │ + 133 { │ │ │ │ │ + 134 return std::get<0>(subPreBases_).gridView(); │ │ │ │ │ + 135 } │ │ │ │ │ + 136 │ │ │ │ │ +138 void update(const GridView& gv) │ │ │ │ │ + 139 { │ │ │ │ │ + 140 Hybrid::forEach(ChildIndices(), [&](auto i) { │ │ │ │ │ + 141 this->subPreBasis(i).update(gv); │ │ │ │ │ + 142 }); │ │ │ │ │ + 143 } │ │ │ │ │ + 144 │ │ │ │ │ +148 Node makeNode() const │ │ │ │ │ + 149 { │ │ │ │ │ + 150 auto node = Node{}; │ │ │ │ │ + 151 Hybrid::forEach(ChildIndices(), [&](auto i) { │ │ │ │ │ + 152 node.setChild(this->subPreBasis(i).makeNode(), i); │ │ │ │ │ + 153 }); │ │ │ │ │ + 154 return node; │ │ │ │ │ + 155 } │ │ │ │ │ + 156 │ │ │ │ │ +158 size_type size() const │ │ │ │ │ + 159 { │ │ │ │ │ + 160 return size(Dune::ReservedVector{}); │ │ │ │ │ + 161 } │ │ │ │ │ + 162 │ │ │ │ │ + 164 template │ │ │ │ │ +165 size_type size(const SizePrefix& prefix) const │ │ │ │ │ + 166 { │ │ │ │ │ + 167 return size(prefix, IndexMergingStrategy{}); │ │ │ │ │ + 168 } │ │ │ │ │ + 169 │ │ │ │ │ + 170private: │ │ │ │ │ + 171 │ │ │ │ │ + 172 template │ │ │ │ │ + 173 size_type size(const SizePrefix& prefix, BasisFactory:: │ │ │ │ │ +BlockedLexicographic) const │ │ │ │ │ + 174 { │ │ │ │ │ + 175 if (prefix.size() == 0) │ │ │ │ │ + 176 return children; │ │ │ │ │ + 177 │ │ │ │ │ + 178 return Hybrid::switchCases(ChildIndices(), prefix[0], [&] (auto i) { │ │ │ │ │ + 179 SizePrefix subPrefix; │ │ │ │ │ + 180 for(std::size_t i=1; isubPreBasis(i).size(subPrefix); │ │ │ │ │ + 183 }, []() { │ │ │ │ │ + 184 return size_type(0); │ │ │ │ │ + 185 }); │ │ │ │ │ + 186 } │ │ │ │ │ + 187 │ │ │ │ │ + 188 template │ │ │ │ │ + 189 size_type size(const SizePrefix& prefix, BasisFactory::FlatLexicographic) │ │ │ │ │ +const │ │ │ │ │ + 190 { │ │ │ │ │ + 191 size_type result = 0; │ │ │ │ │ + 192 if (prefix.size() == 0) │ │ │ │ │ + 193 Hybrid::forEach(ChildIndices(), [&](auto i) { │ │ │ │ │ + 194 result += this->subPreBasis(i).size(); │ │ │ │ │ + 195 }); │ │ │ │ │ + 196 else { │ │ │ │ │ + 197 size_type shiftedFirstDigit = prefix[0]; │ │ │ │ │ + 198 staticFindInRange<0, children>([&](auto i) { │ │ │ │ │ + 199 auto firstDigitSize = this->subPreBasis(i).size(); │ │ │ │ │ + 200 if (shiftedFirstDigit < firstDigitSize) │ │ │ │ │ + 201 { │ │ │ │ │ + 202 SizePrefix subPrefix; │ │ │ │ │ + 203 subPrefix.push_back(shiftedFirstDigit); │ │ │ │ │ + 204 for(std::size_t i=1; isubPreBasis(i).size(subPrefix); │ │ │ │ │ + 207 return true; │ │ │ │ │ 208 } │ │ │ │ │ - 209 │ │ │ │ │ - 210 template::type = 0> │ │ │ │ │ -212 It indicesImp(const Node& node, It multiIndices) const │ │ │ │ │ - 213 { │ │ │ │ │ - 214 using namespace Dune::Indices; │ │ │ │ │ - 215 for(std::size_t child=0; child::type = 0> │ │ │ │ │ -236 It indicesImp(const Node& node, It multiIndices) const │ │ │ │ │ - 237 { │ │ │ │ │ - 238 using namespace Dune::Indices; │ │ │ │ │ - 239 for(std::size_t child=0; child │ │ │ │ │ -267class TaylorHoodVelocityTree : │ │ │ │ │ - 268 public PowerBasisNode, GV::dimension> │ │ │ │ │ - 269{ │ │ │ │ │ - 270 using PQ2Node = LagrangeNode; │ │ │ │ │ - 271 using Base = PowerBasisNode; │ │ │ │ │ - 272 │ │ │ │ │ - 273public: │ │ │ │ │ -274 TaylorHoodVelocityTree() │ │ │ │ │ - 275 { │ │ │ │ │ - 276 for(int i=0; isetChild(i, std::make_shared()); │ │ │ │ │ - 278 } │ │ │ │ │ - 279}; │ │ │ │ │ - 280 │ │ │ │ │ - 281template │ │ │ │ │ -282class TaylorHoodBasisTree : │ │ │ │ │ - 283 public CompositeBasisNode< │ │ │ │ │ - 284 TaylorHoodVelocityTree, │ │ │ │ │ - 285 LagrangeNode │ │ │ │ │ - 286 > │ │ │ │ │ - 287{ │ │ │ │ │ - 288 using VelocityNode=TaylorHoodVelocityTree; │ │ │ │ │ - 289 using PressureNode=LagrangeNode; │ │ │ │ │ - 290 │ │ │ │ │ - 291 using Base=CompositeBasisNode; │ │ │ │ │ + 221 size_type r=0; │ │ │ │ │ + 222 // Accumulate dimension() for all subprebases │ │ │ │ │ + 223 Hybrid::forEach(ChildIndices(), [&](auto i) { │ │ │ │ │ + 224 r += this->subPreBasis(i).dimension(); │ │ │ │ │ + 225 }); │ │ │ │ │ + 226 return r; │ │ │ │ │ + 227 } │ │ │ │ │ + 228 │ │ │ │ │ +230 size_type maxNodeSize() const │ │ │ │ │ + 231 { │ │ │ │ │ + 232 size_type r=0; │ │ │ │ │ + 233 // Accumulate maxNodeSize() for all subprebases │ │ │ │ │ + 234 Hybrid::forEach(ChildIndices(), [&](auto i) { │ │ │ │ │ + 235 r += this->subPreBasis(i).maxNodeSize(); │ │ │ │ │ + 236 }); │ │ │ │ │ + 237 return r; │ │ │ │ │ + 238 } │ │ │ │ │ + 239 │ │ │ │ │ + 241 template │ │ │ │ │ +242 const SubPreBasis& subPreBasis(Dune::index_constant = {}) const │ │ │ │ │ + 243 { │ │ │ │ │ + 244 return std::get(subPreBases_); │ │ │ │ │ + 245 } │ │ │ │ │ + 246 │ │ │ │ │ + 248 template │ │ │ │ │ +249 SubPreBasis& subPreBasis(Dune::index_constant = {}) │ │ │ │ │ + 250 { │ │ │ │ │ + 251 return std::get(subPreBases_); │ │ │ │ │ + 252 } │ │ │ │ │ + 253 │ │ │ │ │ + 255 template │ │ │ │ │ +256 It indices(const Node& node, It it) const │ │ │ │ │ + 257 { │ │ │ │ │ + 258 return indices(node, it, IndexMergingStrategy{}); │ │ │ │ │ + 259 } │ │ │ │ │ + 260 │ │ │ │ │ + 261private: │ │ │ │ │ + 262 │ │ │ │ │ + 263 template │ │ │ │ │ + 264 It indices(const Node& node, It multiIndices, BasisFactory:: │ │ │ │ │ +FlatLexicographic) const │ │ │ │ │ + 265 { │ │ │ │ │ + 266 size_type firstComponentOffset = 0; │ │ │ │ │ + 267 // Loop over all children │ │ │ │ │ + 268 Hybrid::forEach(ChildIndices(), [&](auto child){ │ │ │ │ │ + 269 size_type subTreeSize = node.child(child).size(); │ │ │ │ │ + 270 // Fill indices for current child into index buffer starting from current │ │ │ │ │ + 271 // buffer position and shift first index component of any index for │ │ │ │ │ +current │ │ │ │ │ + 272 // child by suitable offset to get lexicographic indices. │ │ │ │ │ + 273 subPreBasis(child).indices(node.child(child), multiIndices); │ │ │ │ │ + 274 for (std::size_t i = 0; i │ │ │ │ │ + 285 static void multiIndexPushFront(MultiIndex& M, size_type M0) │ │ │ │ │ + 286 { │ │ │ │ │ + 287 M.resize(M.size()+1); │ │ │ │ │ + 288 for(std::size_t i=M.size()-1; i>0; --i) │ │ │ │ │ + 289 M[i] = M[i-1]; │ │ │ │ │ + 290 M[0] = M0; │ │ │ │ │ + 291 } │ │ │ │ │ 292 │ │ │ │ │ - 293public: │ │ │ │ │ -294 TaylorHoodBasisTree() │ │ │ │ │ + 293 template │ │ │ │ │ + 294 It indices(const Node& node, It multiIndices, BasisFactory:: │ │ │ │ │ +BlockedLexicographic) const │ │ │ │ │ 295 { │ │ │ │ │ - 296 this->template setChild<0>(std::make_shared()); │ │ │ │ │ - 297 this->template setChild<1>(std::make_shared()); │ │ │ │ │ - 298 } │ │ │ │ │ - 299}; │ │ │ │ │ - 300 │ │ │ │ │ - 301 │ │ │ │ │ - 302 │ │ │ │ │ - 303namespace BasisFactory { │ │ │ │ │ - 304 │ │ │ │ │ -311inline auto taylorHood() │ │ │ │ │ - 312{ │ │ │ │ │ - 313 return [](const auto& gridView) { │ │ │ │ │ - 314 return TaylorHoodPreBasis>(gridView); │ │ │ │ │ - 315 }; │ │ │ │ │ - 316} │ │ │ │ │ - 317 │ │ │ │ │ - 318} // end namespace BasisFactory │ │ │ │ │ - 319 │ │ │ │ │ - 320/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 321// This is the actual global basis implementation based on the reusable │ │ │ │ │ -parts. │ │ │ │ │ - 322/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 323 │ │ │ │ │ - 345template │ │ │ │ │ -346using TaylorHoodBasis = DefaultGlobalBasis >; │ │ │ │ │ + 296 // Loop over all children │ │ │ │ │ + 297 Hybrid::forEach(ChildIndices(), [&](auto child){ │ │ │ │ │ + 298 size_type subTreeSize = node.child(child).size(); │ │ │ │ │ + 299 // Fill indices for current child into index buffer starting from current │ │ │ │ │ +position │ │ │ │ │ + 300 subPreBasis(child).indices(node.child(child), multiIndices); │ │ │ │ │ + 301 // Insert child index before first component of all indices of current │ │ │ │ │ +child. │ │ │ │ │ + 302 for (std::size_t i = 0; imultiIndexPushFront(multiIndices[i], child); │ │ │ │ │ + 304 // Increment buffer iterator by the number of indices processed for │ │ │ │ │ +current child │ │ │ │ │ + 305 multiIndices += subTreeSize; │ │ │ │ │ + 306 }); │ │ │ │ │ + 307 return multiIndices; │ │ │ │ │ + 308 } │ │ │ │ │ + 309 │ │ │ │ │ + 310 std::tuple subPreBases_; │ │ │ │ │ + 311}; │ │ │ │ │ + 312 │ │ │ │ │ + 313 │ │ │ │ │ + 314 │ │ │ │ │ + 315namespace BasisFactory { │ │ │ │ │ + 316 │ │ │ │ │ + 317namespace Imp { │ │ │ │ │ + 318 │ │ │ │ │ + 319template │ │ │ │ │ + 320class CompositePreBasisFactory │ │ │ │ │ + 321{ │ │ │ │ │ + 322 │ │ │ │ │ + 323 template │ │ │ │ │ + 324 auto makePreBasisFromChildPreBases(const GridView&, ChildPreBasis&&... │ │ │ │ │ +childPreBasis) const │ │ │ │ │ + 325 { │ │ │ │ │ + 326 return CompositePreBasis...>(std::forward(childPreBasis)...); │ │ │ │ │ + 327 } │ │ │ │ │ + 328 │ │ │ │ │ + 329public: │ │ │ │ │ + 330 │ │ │ │ │ + 331 CompositePreBasisFactory(const ChildPreBasisFactory&... │ │ │ │ │ +childPreBasisFactory) : │ │ │ │ │ + 332 childPreBasisFactories_(childPreBasisFactory...) │ │ │ │ │ + 333 {} │ │ │ │ │ + 334 │ │ │ │ │ + 335 CompositePreBasisFactory(ChildPreBasisFactory&&... childPreBasisFactory) : │ │ │ │ │ + 336 childPreBasisFactories_(std::move(childPreBasisFactory)...) │ │ │ │ │ + 337 {} │ │ │ │ │ + 338 │ │ │ │ │ + 339 template │ │ │ │ │ + 340 auto operator()(const GridView& gridView) const │ │ │ │ │ + 341 { │ │ │ │ │ + 342 // Use std::apply to unpack the tuple childPreBasisFactories_ │ │ │ │ │ + 343 return std::apply([&](const auto&... childPreBasisFactory) { │ │ │ │ │ + 344 return this->makePreBasisFromChildPreBases(gridView, childPreBasisFactory │ │ │ │ │ +(gridView)...); │ │ │ │ │ + 345 }, childPreBasisFactories_); │ │ │ │ │ + 346 } │ │ │ │ │ 347 │ │ │ │ │ - 348 │ │ │ │ │ - 349 │ │ │ │ │ - 350} // end namespace Functions │ │ │ │ │ - 351} // end namespace Dune │ │ │ │ │ - 352 │ │ │ │ │ + 348private: │ │ │ │ │ + 349 std::tuple childPreBasisFactories_; │ │ │ │ │ + 350}; │ │ │ │ │ + 351 │ │ │ │ │ + 352} // end namespace BasisFactory::Imp │ │ │ │ │ 353 │ │ │ │ │ - 354#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TAYLORHOODBASIS_HH │ │ │ │ │ + 354 │ │ │ │ │ + 355 │ │ │ │ │ + 366template< │ │ │ │ │ + 367 typename... Args, │ │ │ │ │ + 368 std::enable_if_t::type>(),int> = 0> │ │ │ │ │ +369auto composite(Args&&... args) │ │ │ │ │ + 370{ │ │ │ │ │ + 371 // We have to separate the last entry which is the IndexMergingStrategy │ │ │ │ │ + 372 // and the preceding ones, which are the ChildPreBasisFactories │ │ │ │ │ + 373 │ │ │ │ │ + 374 using ArgTuple = std::tuple...>; │ │ │ │ │ + 375 │ │ │ │ │ + 376 // Compute number of children and index of the IndexMergingStrategy │ │ │ │ │ +argument │ │ │ │ │ + 377 constexpr std::size_t children = Dune::SizeOf::value-1; │ │ │ │ │ + 378 │ │ │ │ │ + 379 // Use last type as IndexMergingStrategy │ │ │ │ │ + 380 using IndexMergingStrategy = std::tuple_element_t; │ │ │ │ │ + 381 │ │ │ │ │ + 382 // Index sequence for all but the last entry for partial tuple unpacking │ │ │ │ │ + 383 auto childIndices = std::make_index_sequence{}; │ │ │ │ │ + 384 │ │ │ │ │ + 385 // Unpack tuple only for those entries related to children │ │ │ │ │ + 386 return applyPartial([](auto&&... childPreBasisFactory){ │ │ │ │ │ + 387 return Imp::CompositePreBasisFactory...>(std::forward(childPreBasisFactory)...); │ │ │ │ │ + 388 }, │ │ │ │ │ + 389 std::forward_as_tuple(std::forward(args)...), │ │ │ │ │ + 390 childIndices); │ │ │ │ │ + 391} │ │ │ │ │ + 392 │ │ │ │ │ + 404template< │ │ │ │ │ + 405 typename... Args, │ │ │ │ │ + 406 std::enable_if_t::type>(),int> = 0> │ │ │ │ │ + 407auto composite(Args&&... args) │ │ │ │ │ + 408{ │ │ │ │ │ + 409 return Imp::CompositePreBasisFactory...>(std::forward(args)...); │ │ │ │ │ + 410} │ │ │ │ │ + 411 │ │ │ │ │ + 412} // end namespace BasisFactory │ │ │ │ │ + 413 │ │ │ │ │ + 414// Backward compatibility │ │ │ │ │ + 415namespace BasisBuilder { │ │ │ │ │ + 416 │ │ │ │ │ + 417 using namespace BasisFactory; │ │ │ │ │ + 418 │ │ │ │ │ + 419} │ │ │ │ │ + 420 │ │ │ │ │ + 421 │ │ │ │ │ + 422 │ │ │ │ │ + 423} // end namespace Functions │ │ │ │ │ + 424} // end namespace Dune │ │ │ │ │ + 425 │ │ │ │ │ + 426 │ │ │ │ │ + 427#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_COMPOSITEBASIS_HH │ │ │ │ │ +type_traits.hh │ │ │ │ │ +utility.hh │ │ │ │ │ +staticforloop.hh │ │ │ │ │ +basistags.hh │ │ │ │ │ nodes.hh │ │ │ │ │ defaultglobalbasis.hh │ │ │ │ │ -lagrangebasis.hh │ │ │ │ │ -Dune::Functions::BasisFactory::taylorHood │ │ │ │ │ -auto taylorHood() │ │ │ │ │ -Create a pre-basis factory that can create a Taylor-Hood pre-basis. │ │ │ │ │ -Definition: taylorhoodbasis.hh:311 │ │ │ │ │ +Dune::Functions::BasisFactory::composite │ │ │ │ │ +auto composite(Args &&... args) │ │ │ │ │ +Create a factory builder that can build a CompositePreBasis. │ │ │ │ │ +Definition: compositebasis.hh:369 │ │ │ │ │ +Dune::Functions::enableIfConstructible │ │ │ │ │ +typename std::enable_if< std::is_constructible< T, Args... >::value, int >:: │ │ │ │ │ +type enableIfConstructible │ │ │ │ │ +Helper to constrain forwarding constructors. │ │ │ │ │ +Definition: type_traits.hh:26 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis │ │ │ │ │ -Global basis for given pre-basis. │ │ │ │ │ -Definition: defaultglobalbasis.hh:46 │ │ │ │ │ -Dune::Functions::LagrangeNode │ │ │ │ │ -Definition: lagrangebasis.hh:387 │ │ │ │ │ -Dune::Functions::LagrangePreBasis<_GV,_1_> │ │ │ │ │ -Dune::Functions::LagrangePreBasis::indices │ │ │ │ │ -It indices(const Node &node, It it) const │ │ │ │ │ -Definition: lagrangebasis.hh:192 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::initializeIndices │ │ │ │ │ -void initializeIndices() │ │ │ │ │ -Initialize the global indices. │ │ │ │ │ -Definition: lagrangebasis.hh:96 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::update │ │ │ │ │ -void update(const GridView &gv) │ │ │ │ │ -Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ -Definition: lagrangebasis.hh:126 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::maxNodeSize │ │ │ │ │ +Dune::Functions::Concept::isIndexMergingStrategy │ │ │ │ │ +static constexpr bool isIndexMergingStrategy() │ │ │ │ │ +Definition: basistags.hh:23 │ │ │ │ │ +Dune::Functions::LastType │ │ │ │ │ +Get last entry of type list. │ │ │ │ │ +Definition: utility.hh:222 │ │ │ │ │ +Dune::Functions::BasisFactory::IndexMergingStrategy │ │ │ │ │ +Base class for index merging strategies to simplify detection. │ │ │ │ │ +Definition: basistags.hh:44 │ │ │ │ │ +Dune::Functions::BasisFactory::FlatLexicographic │ │ │ │ │ +Lexicographic merging of direct children without blocking. │ │ │ │ │ +Definition: basistags.hh:80 │ │ │ │ │ +Dune::Functions::BasisFactory::BlockedLexicographic │ │ │ │ │ +Lexicographic merging of direct children with blocking (i.e. creating one block │ │ │ │ │ +per direct child). │ │ │ │ │ +Definition: basistags.hh:148 │ │ │ │ │ +Dune::Functions::CompositePreBasis │ │ │ │ │ +A pre-basis for composite bases. │ │ │ │ │ +Definition: compositebasis.hh:53 │ │ │ │ │ +Dune::Functions::CompositePreBasis::subPreBasis │ │ │ │ │ +SubPreBasis< i > & subPreBasis(Dune::index_constant< i >={}) │ │ │ │ │ +Mutable access to the stored prebasis of the factor in the power space. │ │ │ │ │ +Definition: compositebasis.hh:249 │ │ │ │ │ +Dune::Functions::CompositePreBasis::IndexMergingStrategy │ │ │ │ │ +IMS IndexMergingStrategy │ │ │ │ │ +Strategy used to merge the global indices of the child pre-bases. │ │ │ │ │ +Definition: compositebasis.hh:71 │ │ │ │ │ +Dune::Functions::CompositePreBasis::maxNodeSize │ │ │ │ │ size_type maxNodeSize() const │ │ │ │ │ Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ -Definition: lagrangebasis.hh:184 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::size │ │ │ │ │ -size_type size() const │ │ │ │ │ -Same as size(prefix) with empty prefix. │ │ │ │ │ -Definition: lagrangebasis.hh:140 │ │ │ │ │ -Dune::Functions::BasisNodeMixin::size │ │ │ │ │ -size_type size() const │ │ │ │ │ -Definition: nodes.hh:142 │ │ │ │ │ -Dune::Functions::PowerBasisNode │ │ │ │ │ -Definition: nodes.hh:193 │ │ │ │ │ -Dune::Functions::CompositeBasisNode │ │ │ │ │ -Definition: nodes.hh:219 │ │ │ │ │ -Dune::Functions::TaylorHoodVelocityTree │ │ │ │ │ -Definition: taylorhoodbasis.hh:269 │ │ │ │ │ -Dune::Functions::TaylorHoodVelocityTree::TaylorHoodVelocityTree │ │ │ │ │ -TaylorHoodVelocityTree() │ │ │ │ │ -Definition: taylorhoodbasis.hh:274 │ │ │ │ │ -Dune::Functions::TaylorHoodBasisTree │ │ │ │ │ -Definition: taylorhoodbasis.hh:287 │ │ │ │ │ -Dune::Functions::TaylorHoodBasisTree::TaylorHoodBasisTree │ │ │ │ │ -TaylorHoodBasisTree() │ │ │ │ │ -Definition: taylorhoodbasis.hh:294 │ │ │ │ │ -Dune::Functions::TaylorHoodPreBasis │ │ │ │ │ -Pre-basis for lowest order Taylor-Hood basis. │ │ │ │ │ -Definition: taylorhoodbasis.hh:61 │ │ │ │ │ -Dune::Functions::TaylorHoodPreBasis::TaylorHoodPreBasis │ │ │ │ │ -TaylorHoodPreBasis(const GridView &gv) │ │ │ │ │ -Constructor for a given grid view object. │ │ │ │ │ -Definition: taylorhoodbasis.hh:89 │ │ │ │ │ -Dune::Functions::TaylorHoodPreBasis::gridView │ │ │ │ │ -const GridView & gridView() const │ │ │ │ │ -Obtain the grid view that the basis is defined on. │ │ │ │ │ -Definition: taylorhoodbasis.hh:103 │ │ │ │ │ -Dune::Functions::TaylorHoodPreBasis::minMultiIndexSize │ │ │ │ │ -static constexpr size_type minMultiIndexSize │ │ │ │ │ -Definition: taylorhoodbasis.hh:78 │ │ │ │ │ -Dune::Functions::TaylorHoodPreBasis::size │ │ │ │ │ +Definition: compositebasis.hh:230 │ │ │ │ │ +Dune::Functions::CompositePreBasis::subPreBasis │ │ │ │ │ +const SubPreBasis< i > & subPreBasis(Dune::index_constant< i >={}) const │ │ │ │ │ +Const access to the stored prebasis of the factor in the power space. │ │ │ │ │ +Definition: compositebasis.hh:242 │ │ │ │ │ +Dune::Functions::CompositePreBasis::size_type │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +Type used for indices and size information. │ │ │ │ │ +Definition: compositebasis.hh:68 │ │ │ │ │ +Dune::Functions::CompositePreBasis::Node │ │ │ │ │ +CompositeBasisNode< typename SPB::Node... > Node │ │ │ │ │ +Template mapping root tree path to type of created tree node. │ │ │ │ │ +Definition: compositebasis.hh:81 │ │ │ │ │ +Dune::Functions::CompositePreBasis::size │ │ │ │ │ size_type size(const SizePrefix &prefix) const │ │ │ │ │ Return number of possible values for next position in multi index. │ │ │ │ │ -Definition: taylorhoodbasis.hh:131 │ │ │ │ │ -Dune::Functions::TaylorHoodPreBasis::gridView_ │ │ │ │ │ -GridView gridView_ │ │ │ │ │ -Definition: taylorhoodbasis.hh:258 │ │ │ │ │ -Dune::Functions::TaylorHoodPreBasis::GridView │ │ │ │ │ -GV GridView │ │ │ │ │ -The grid view that the FE basis is defined on. │ │ │ │ │ -Definition: taylorhoodbasis.hh:69 │ │ │ │ │ -Dune::Functions::TaylorHoodPreBasis::update │ │ │ │ │ -void update(const GridView &gv) │ │ │ │ │ -Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ -Definition: taylorhoodbasis.hh:109 │ │ │ │ │ -Dune::Functions::TaylorHoodPreBasis::pq2PreBasis_ │ │ │ │ │ -PQ2PreBasis pq2PreBasis_ │ │ │ │ │ -Definition: taylorhoodbasis.hh:261 │ │ │ │ │ -Dune::Functions::TaylorHoodPreBasis::size │ │ │ │ │ -size_type size() const │ │ │ │ │ -Same as size(prefix) with empty prefix. │ │ │ │ │ -Definition: taylorhoodbasis.hh:124 │ │ │ │ │ -Dune::Functions::TaylorHoodPreBasis::dimension │ │ │ │ │ +Definition: compositebasis.hh:165 │ │ │ │ │ +Dune::Functions::CompositePreBasis::CompositePreBasis │ │ │ │ │ +CompositePreBasis(SFArgs &&... sfArgs) │ │ │ │ │ +Constructor for given child pre-basis objects. │ │ │ │ │ +Definition: compositebasis.hh:95 │ │ │ │ │ +Dune::Functions::CompositePreBasis::dimension │ │ │ │ │ size_type dimension() const │ │ │ │ │ Get the total dimension of the space spanned by this basis. │ │ │ │ │ -Definition: taylorhoodbasis.hh:182 │ │ │ │ │ -Dune::Functions::TaylorHoodPreBasis::pq1PreBasis_ │ │ │ │ │ -PQ1PreBasis pq1PreBasis_ │ │ │ │ │ -Definition: taylorhoodbasis.hh:260 │ │ │ │ │ -Dune::Functions::TaylorHoodPreBasis::multiIndexPushFront │ │ │ │ │ -static const void multiIndexPushFront(MultiIndex &M, size_type M0) │ │ │ │ │ -Definition: taylorhoodbasis.hh:202 │ │ │ │ │ -Dune::Functions::TaylorHoodPreBasis::maxMultiIndexSize │ │ │ │ │ -static constexpr size_type maxMultiIndexSize │ │ │ │ │ -Definition: taylorhoodbasis.hh:77 │ │ │ │ │ -Dune::Functions::TaylorHoodPreBasis::makeNode │ │ │ │ │ +Definition: compositebasis.hh:219 │ │ │ │ │ +Dune::Functions::CompositePreBasis::CompositePreBasis │ │ │ │ │ +CompositePreBasis(const GV &gv) │ │ │ │ │ +Constructor for given GridView. │ │ │ │ │ +Definition: compositebasis.hh:115 │ │ │ │ │ +Dune::Functions::CompositePreBasis::indices │ │ │ │ │ +It indices(const Node &node, It it) const │ │ │ │ │ +Maps from subtree index set [0..size-1] to a globally unique multi index in │ │ │ │ │ +global basis. │ │ │ │ │ +Definition: compositebasis.hh:256 │ │ │ │ │ +Dune::Functions::CompositePreBasis::size │ │ │ │ │ +size_type size() const │ │ │ │ │ +Same as size(prefix) with empty prefix. │ │ │ │ │ +Definition: compositebasis.hh:158 │ │ │ │ │ +Dune::Functions::CompositePreBasis::GridView │ │ │ │ │ +typename std::tuple_element_t< 0, SubPreBases >::GridView GridView │ │ │ │ │ +The grid view that the FE basis is defined on. │ │ │ │ │ +Definition: compositebasis.hh:65 │ │ │ │ │ +Dune::Functions::CompositePreBasis::children │ │ │ │ │ +static const std::size_t children │ │ │ │ │ +Definition: compositebasis.hh:74 │ │ │ │ │ +Dune::Functions::CompositePreBasis::SubPreBases │ │ │ │ │ +std::tuple< SPB... > SubPreBases │ │ │ │ │ +Tuple of child pre-bases. │ │ │ │ │ +Definition: compositebasis.hh:58 │ │ │ │ │ +Dune::Functions::CompositePreBasis::makeNode │ │ │ │ │ Node makeNode() const │ │ │ │ │ Create tree node. │ │ │ │ │ -Definition: taylorhoodbasis.hh:118 │ │ │ │ │ -Dune::Functions::TaylorHoodPreBasis::indices │ │ │ │ │ -It indices(const Node &node, It it) const │ │ │ │ │ -Definition: taylorhoodbasis.hh:194 │ │ │ │ │ -Dune::Functions::TaylorHoodPreBasis::multiIndexBufferSize │ │ │ │ │ -static constexpr size_type multiIndexBufferSize │ │ │ │ │ -Definition: taylorhoodbasis.hh:79 │ │ │ │ │ -Dune::Functions::TaylorHoodPreBasis::initializeIndices │ │ │ │ │ +Definition: compositebasis.hh:148 │ │ │ │ │ +Dune::Functions::CompositePreBasis::initializeIndices │ │ │ │ │ void initializeIndices() │ │ │ │ │ Initialize the global indices. │ │ │ │ │ -Definition: taylorhoodbasis.hh:96 │ │ │ │ │ -Dune::Functions::TaylorHoodPreBasis::maxNodeSize │ │ │ │ │ -size_type maxNodeSize() const │ │ │ │ │ -Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ -Definition: taylorhoodbasis.hh:188 │ │ │ │ │ -Dune::Functions::TaylorHoodPreBasis::size_type │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Type used for indices and size information. │ │ │ │ │ -Definition: taylorhoodbasis.hh:72 │ │ │ │ │ -Dune::Functions::TaylorHoodPreBasis::indicesImp │ │ │ │ │ -It indicesImp(const Node &node, It multiIndices) const │ │ │ │ │ -Definition: taylorhoodbasis.hh:212 │ │ │ │ │ +Definition: compositebasis.hh:124 │ │ │ │ │ +Dune::Functions::CompositePreBasis::SubPreBasis │ │ │ │ │ +std::tuple_element_t< i, SubPreBases > SubPreBasis │ │ │ │ │ +Export individual child pre-bases by index. │ │ │ │ │ +Definition: compositebasis.hh:62 │ │ │ │ │ +Dune::Functions::CompositePreBasis::ChildIndices │ │ │ │ │ +std::make_index_sequence< children > ChildIndices │ │ │ │ │ +Definition: compositebasis.hh:76 │ │ │ │ │ +Dune::Functions::CompositePreBasis::update │ │ │ │ │ +void update(const GridView &gv) │ │ │ │ │ +Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ +Definition: compositebasis.hh:138 │ │ │ │ │ +Dune::Functions::CompositePreBasis::multiIndexBufferSize │ │ │ │ │ +static constexpr size_type multiIndexBufferSize │ │ │ │ │ +Definition: compositebasis.hh:85 │ │ │ │ │ +Dune::Functions::CompositePreBasis::gridView │ │ │ │ │ +const GridView & gridView() const │ │ │ │ │ +Obtain the grid view that the basis is defined on. │ │ │ │ │ +Definition: compositebasis.hh:132 │ │ │ │ │ +Dune::Functions::CompositePreBasis::minMultiIndexSize │ │ │ │ │ +static constexpr size_type minMultiIndexSize │ │ │ │ │ +Definition: compositebasis.hh:84 │ │ │ │ │ +Dune::Functions::CompositePreBasis::maxMultiIndexSize │ │ │ │ │ +static constexpr size_type maxMultiIndexSize │ │ │ │ │ +Definition: compositebasis.hh:83 │ │ │ │ │ +Dune::Functions::CompositeBasisNode │ │ │ │ │ +Definition: nodes.hh:219 │ │ │ │ │ +concepts.hh │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00128.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: defaultglobalbasis.hh File Reference │ │ │ │ +dune-functions: hierarchicallagrangebasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,58 +65,57 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ +Typedefs | │ │ │ │ Functions
│ │ │ │ -
defaultglobalbasis.hh File Reference
│ │ │ │ +
hierarchicallagrangebasis.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <cstddef>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <dune/common/reservedvector.hh>
│ │ │ │ -#include <dune/common/typeutilities.hh>
│ │ │ │ -#include <dune/common/concept.hh>
│ │ │ │ -#include <dune/functions/common/type_traits.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/defaultlocalview.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │ +
#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/localfunctions/hierarchical/hierarchicalp2.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │ +#include <dune/grid/common/mcmgmapper.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::DefaultGlobalBasis< PB >
 Global basis for given pre-basis. More...
class  Dune::Functions::HierarchicalLagrangePreBasis< GV, k, R >
 A pre-basis for a hierarchical basis. More...
 
class  Dune::Functions::HierarchicalLagrangeNode< GV, k, R >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
namespace  Dune::Functions::BasisFactory
 
namespace  Dune::Functions::BasisBuilder
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Typedefs

template<typename GV , int k, typename R = double>
using Dune::Functions::HierarchicalLagrangeBasis = DefaultGlobalBasis< HierarchicalLagrangePreBasis< GV, k, R > >
 Basis of a scalar Hierarchical Lagrange finite element space. More...
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<class PreBasis >
 Dune::Functions::DefaultGlobalBasis (PreBasis &&) -> DefaultGlobalBasis< std::decay_t< PreBasis > >
 
template<class GridView , class PreBasisFactory >
 Dune::Functions::DefaultGlobalBasis (const GridView &gv, PreBasisFactory &&f) -> DefaultGlobalBasis< std::decay_t< decltype(f(gv))> >
 
template<class GridView , class PreBasisFactory >
auto Dune::Functions::BasisFactory::makeBasis (const GridView &gridView, PreBasisFactory &&preBasisFactory)
 
template<std::size_t k, typename R = double>
auto Dune::Functions::BasisFactory::hierarchicalLagrange ()
 Create a pre-basis factory that can create a HierarchicalLagrange pre-basis. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,48 +5,43 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -Classes | Namespaces | Functions │ │ │ │ │ -defaultglobalbasis.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Typedefs | Functions │ │ │ │ │ +hierarchicallagrangebasis.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::DefaultGlobalBasis<_PB_> │ │ │ │ │ -  Global basis for given pre-basis. More... │ │ │ │ │ +class  Dune::Functions::HierarchicalLagrangePreBasis<_GV,_k,_R_> │ │ │ │ │ +  A pre-basis for a hierarchical basis. More... │ │ │ │ │ +  │ │ │ │ │ +class  Dune::Functions::HierarchicalLagrangeNode<_GV,_k,_R_> │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions::BasisFactory │ │ │ │ │   │ │ │ │ │ -namespace  Dune::Functions::BasisBuilder │ │ │ │ │ + Typedefs │ │ │ │ │ +template │ │ │ │ │ +using Dune::Functions::HierarchicalLagrangeBasis = DefaultGlobalBasis< │ │ │ │ │ + HierarchicalLagrangePreBasis< GV, k, R > > │ │ │ │ │ +  Basis of a scalar Hierarchical Lagrange finite element space. More... │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ -  Dune::Functions::DefaultGlobalBasis (PreBasis &&) -> DefaultGlobalBasis< │ │ │ │ │ - std::decay_t< PreBasis > > │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -  Dune::Functions::DefaultGlobalBasis (const GridView &gv, PreBasisFactory │ │ │ │ │ - &&f) -> DefaultGlobalBasis< std::decay_t< decltype(f(gv))> > │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::BasisFactory::makeBasis (const GridView &gridView, │ │ │ │ │ - PreBasisFactory &&preBasisFactory) │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::BasisFactory::hierarchicalLagrange () │ │ │ │ │ +  Create a pre-basis factory that can create a HierarchicalLagrange pre- │ │ │ │ │ + basis. More... │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00128_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: defaultglobalbasis.hh Source File │ │ │ │ +dune-functions: hierarchicallagrangebasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,203 +62,265 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
defaultglobalbasis.hh
│ │ │ │ +
hierarchicallagrangebasis.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICALLAGRANGEBASIS_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICALLAGRANGEBASIS_HH
│ │ │ │
5
│ │ │ │ -
6#include <cstddef>
│ │ │ │ -
7#include <type_traits>
│ │ │ │ -
8#include <utility>
│ │ │ │ -
9
│ │ │ │ -
10#include <dune/common/reservedvector.hh>
│ │ │ │ -
11#include <dune/common/typeutilities.hh>
│ │ │ │ -
12#include <dune/common/concept.hh>
│ │ │ │ -
13
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
17
│ │ │ │ -
18
│ │ │ │ -
19
│ │ │ │ -
20namespace Dune {
│ │ │ │ -
21namespace Functions {
│ │ │ │ -
22
│ │ │ │ -
23
│ │ │ │ -
24
│ │ │ │ -
44template<class PB>
│ │ │ │ - │ │ │ │ -
46{
│ │ │ │ -
47
│ │ │ │ -
48public:
│ │ │ │ -
49
│ │ │ │ -
51 using PreBasis = PB;
│ │ │ │ -
52
│ │ │ │ -
54 using PrefixPath = TypeTree::HybridTreePath<>;
│ │ │ │ -
55
│ │ │ │ -
57 using GridView = typename PreBasis::GridView;
│ │ │ │ -
58
│ │ │ │ -
60 using size_type = std::size_t;
│ │ │ │ -
61
│ │ │ │ - │ │ │ │ -
64
│ │ │ │ - │ │ │ │ -
67
│ │ │ │ -
69 using SizePrefix = Dune::ReservedVector<std::size_t, PreBasis::multiIndexBufferSize>;
│ │ │ │ -
70
│ │ │ │ -
79 template<class... T,
│ │ │ │ -
80 disableCopyMove<DefaultGlobalBasis, T...> = 0,
│ │ │ │ - │ │ │ │ - │ │ │ │ -
83 preBasis_(std::forward<T>(t)...),
│ │ │ │ - │ │ │ │ -
85 {
│ │ │ │ -
86 static_assert(models<Concept::PreBasis<GridView>, PreBasis>(), "Type passed to DefaultGlobalBasis does not model the PreBasis concept.");
│ │ │ │ -
87 preBasis_.initializeIndices();
│ │ │ │ -
88 }
│ │ │ │ -
89
│ │ │ │ -
96 template<class PreBasisFactory,
│ │ │ │ -
97 std::enable_if_t<Dune::IsCallable<PreBasisFactory(GridView), PreBasis>::value, int> = 0>
│ │ │ │ -
98 DefaultGlobalBasis(const GridView& gridView, PreBasisFactory&& factory) :
│ │ │ │ -
99 preBasis_(factory(gridView)),
│ │ │ │ - │ │ │ │ -
101 {
│ │ │ │ -
102 static_assert(models<Concept::PreBasis<GridView>, PreBasis>(), "Type passed to DefaultGlobalBasis does not model the PreBasis concept.");
│ │ │ │ -
103 preBasis_.initializeIndices();
│ │ │ │ -
104 }
│ │ │ │ -
105
│ │ │ │ -
107 const GridView& gridView() const
│ │ │ │ -
108 {
│ │ │ │ -
109 return preBasis_.gridView();
│ │ │ │ -
110 }
│ │ │ │ -
111
│ │ │ │ -
113 const PreBasis& preBasis() const
│ │ │ │ -
114 {
│ │ │ │ -
115 return preBasis_;
│ │ │ │ -
116 }
│ │ │ │ -
117
│ │ │ │ - │ │ │ │ -
120 {
│ │ │ │ -
121 return preBasis_;
│ │ │ │ -
122 }
│ │ │ │ -
123
│ │ │ │ -
130 void update(const GridView & gv)
│ │ │ │ -
131 {
│ │ │ │ -
132 preBasis_.update(gv);
│ │ │ │ -
133 preBasis_.initializeIndices();
│ │ │ │ -
134 }
│ │ │ │ -
135
│ │ │ │ - │ │ │ │ -
138 {
│ │ │ │ -
139 return preBasis_.dimension();
│ │ │ │ -
140 }
│ │ │ │ +
6#include <dune/common/exceptions.hh>
│ │ │ │ +
7#include <dune/localfunctions/hierarchical/hierarchicalp2.hh>
│ │ │ │ +
8
│ │ │ │ + │ │ │ │ + │ │ │ │ +
11#include <dune/grid/common/mcmgmapper.hh>
│ │ │ │ +
12
│ │ │ │ +
13namespace Dune {
│ │ │ │ +
14 namespace Functions {
│ │ │ │ +
15
│ │ │ │ +
16 // *****************************************************************************
│ │ │ │ +
17 // Implementation for Hierarchical Lagrange Basis
│ │ │ │ +
18 //
│ │ │ │ +
19 // -- only order k=2 is implemented up to now --
│ │ │ │ +
20 // -- currently only supports simplex grids --
│ │ │ │ +
21 //
│ │ │ │ +
22 // This is the reusable part of the HierarchicalLagrangeBasis. It contains
│ │ │ │ +
23 //
│ │ │ │ +
24 // HierarchicalLagrangePreBasis
│ │ │ │ +
25 // HierarchicalLagrangeNode
│ │ │ │ +
26 //
│ │ │ │ +
27 // The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ +
28 // state. These components do _not_ depend on the global basis and can be
│ │ │ │ +
29 // used without a global basis.
│ │ │ │ +
30 // *****************************************************************************
│ │ │ │ +
31
│ │ │ │ +
32 template<typename GV, int k, typename R=double>
│ │ │ │ +
33 class HierarchicalLagrangeNode;
│ │ │ │ +
34
│ │ │ │ +
35 template<typename GV, int k, typename R=double>
│ │ │ │ +
36 class HierarchicalLagrangePreBasis;
│ │ │ │ +
37
│ │ │ │ +
47 template<typename GV, int k, typename R>
│ │ │ │ + │ │ │ │ +
49 {
│ │ │ │ +
50 static const int dim = GV::dimension;
│ │ │ │ +
51
│ │ │ │ +
52 public:
│ │ │ │ +
53
│ │ │ │ +
55 using GridView = GV;
│ │ │ │ +
56
│ │ │ │ +
58 using size_type = std::size_t;
│ │ │ │ +
59
│ │ │ │ + │ │ │ │ +
62
│ │ │ │ +
63 static constexpr size_type maxMultiIndexSize = 1;
│ │ │ │ +
64 static constexpr size_type minMultiIndexSize = 1;
│ │ │ │ +
65 static constexpr size_type multiIndexBufferSize = 1;
│ │ │ │ +
66
│ │ │ │ + │ │ │ │ +
72 {}
│ │ │ │ +
73
│ │ │ │ + │ │ │ │ +
76 {}
│ │ │ │ +
77
│ │ │ │ +
79 const GridView& gridView() const
│ │ │ │ +
80 {
│ │ │ │ +
81 return gridView_;
│ │ │ │ +
82 }
│ │ │ │ +
83
│ │ │ │ +
85 void update (const GridView& gv)
│ │ │ │ +
86 {
│ │ │ │ +
87 gridView_ = gv;
│ │ │ │ +
88 mcmgMapper_.update(gv);
│ │ │ │ +
89 }
│ │ │ │ +
90
│ │ │ │ +
94 Node makeNode() const
│ │ │ │ +
95 {
│ │ │ │ +
96 return Node{};
│ │ │ │ +
97 }
│ │ │ │ +
98
│ │ │ │ + │ │ │ │ +
101 {
│ │ │ │ +
102 return mcmgMapper_.size();
│ │ │ │ +
103 }
│ │ │ │ +
104
│ │ │ │ +
106 template<class SizePrefix>
│ │ │ │ +
107 size_type size(const SizePrefix prefix) const
│ │ │ │ +
108 {
│ │ │ │ +
109 assert(prefix.size() == 0 || prefix.size() == 1);
│ │ │ │ +
110 return (prefix.size() == 0) ? size() : 0;
│ │ │ │ +
111 }
│ │ │ │ +
112
│ │ │ │ + │ │ │ │ +
115 {
│ │ │ │ +
116 return size();
│ │ │ │ +
117 }
│ │ │ │ +
118
│ │ │ │ + │ │ │ │ +
124 {
│ │ │ │ +
125 // That cast to unsigned int is necessary because GV::dimension is an enum
│ │ │ │ +
126 return Dune::binomial(std::size_t(order() + (unsigned int)GV::dimension),std::size_t(order()));
│ │ │ │ +
127 }
│ │ │ │ +
128
│ │ │ │ +
129 template<typename It>
│ │ │ │ +
130 It indices(const Node& node, It it) const
│ │ │ │ +
131 {
│ │ │ │ +
132 for (size_type i = 0, end = node.finiteElement().size() ; i < end ; ++it, ++i)
│ │ │ │ +
133 {
│ │ │ │ +
134 Dune::LocalKey localKey = node.finiteElement().localCoefficients().localKey(i);
│ │ │ │ +
135 const auto& element = node.element();
│ │ │ │ +
136
│ │ │ │ +
137 *it = {{ (size_type)(mcmgMapper_.subIndex(element,localKey.subEntity(),localKey.codim())) }};
│ │ │ │ +
138 }
│ │ │ │ +
139 return it;
│ │ │ │ +
140 }
│ │ │ │
141
│ │ │ │ - │ │ │ │ -
144 {
│ │ │ │ -
145 return preBasis_.size();
│ │ │ │ -
146 }
│ │ │ │ -
147
│ │ │ │ -
149 size_type size(const SizePrefix& prefix) const
│ │ │ │ -
150 {
│ │ │ │ -
151 return preBasis_.size(prefix);
│ │ │ │ -
152 }
│ │ │ │ -
153
│ │ │ │ - │ │ │ │ -
156 {
│ │ │ │ -
157 return LocalView(*this);
│ │ │ │ -
158 }
│ │ │ │ -
159
│ │ │ │ - │ │ │ │ -
162 {
│ │ │ │ -
163 return *this;
│ │ │ │ -
164 }
│ │ │ │ -
165
│ │ │ │ -
167 const PrefixPath& prefixPath() const
│ │ │ │ -
168 {
│ │ │ │ -
169 return prefixPath_;
│ │ │ │ -
170 }
│ │ │ │ -
171
│ │ │ │ -
172protected:
│ │ │ │ - │ │ │ │ - │ │ │ │ -
175};
│ │ │ │ -
176
│ │ │ │ -
177
│ │ │ │ -
178
│ │ │ │ -
179template<class PreBasis>
│ │ │ │ - │ │ │ │ -
181
│ │ │ │ -
182template<class GridView, class PreBasisFactory>
│ │ │ │ -
183DefaultGlobalBasis(const GridView& gv, PreBasisFactory&& f) -> DefaultGlobalBasis<std::decay_t<decltype(f(gv))>>;
│ │ │ │ -
184
│ │ │ │ -
185
│ │ │ │ +
142 protected:
│ │ │ │ + │ │ │ │ +
144
│ │ │ │ +
145 unsigned int order() const
│ │ │ │ +
146 {
│ │ │ │ +
147 return 2;
│ │ │ │ +
148 }
│ │ │ │ +
149
│ │ │ │ +
150 MultipleCodimMultipleGeomTypeMapper<GridView> mcmgMapper_;
│ │ │ │ +
151
│ │ │ │ +
152 private:
│ │ │ │ +
157 static auto p2Layout()
│ │ │ │ +
158 {
│ │ │ │ +
159 return [](Dune::GeometryType type, int gridDim)
│ │ │ │ +
160 {
│ │ │ │ +
161 if (type.isVertex())
│ │ │ │ +
162 return 1;
│ │ │ │ +
163 if (type.isLine())
│ │ │ │ +
164 return 1;
│ │ │ │ +
165 if (type.isTriangle())
│ │ │ │ +
166 return 0;
│ │ │ │ +
167 assert(type.isTetrahedron());
│ │ │ │ +
168 return 0;
│ │ │ │ +
169 };
│ │ │ │ +
170 }
│ │ │ │ +
171 };
│ │ │ │ +
172
│ │ │ │ +
173
│ │ │ │ +
174
│ │ │ │ +
175 template<typename GV, int k, typename R>
│ │ │ │ + │ │ │ │ +
177 public LeafBasisNode
│ │ │ │ +
178 {
│ │ │ │ +
179 static const int dim = GV::dimension;
│ │ │ │ +
180
│ │ │ │ +
181 public:
│ │ │ │ +
182
│ │ │ │ +
183 using size_type = std::size_t;
│ │ │ │ +
184 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ +
185 using FiniteElement = HierarchicalP2LocalFiniteElement<typename GV::ctype,R,dim>;
│ │ │ │
186
│ │ │ │ -
187namespace BasisFactory {
│ │ │ │ -
188
│ │ │ │ -
189template<class GridView, class PreBasisFactory>
│ │ │ │ -
190auto makeBasis(const GridView& gridView, PreBasisFactory&& preBasisFactory)
│ │ │ │ -
191{
│ │ │ │ -
192 return DefaultGlobalBasis(preBasisFactory(gridView));
│ │ │ │ -
193}
│ │ │ │ -
194
│ │ │ │ -
195} // end namespace BasisFactory
│ │ │ │ -
196
│ │ │ │ -
197// Backward compatibility
│ │ │ │ -
198namespace BasisBuilder {
│ │ │ │ -
199
│ │ │ │ -
200 using namespace BasisFactory;
│ │ │ │ -
201
│ │ │ │ -
202}
│ │ │ │ -
203
│ │ │ │ -
204
│ │ │ │ -
205} // end namespace Functions
│ │ │ │ -
206} // end namespace Dune
│ │ │ │ -
207
│ │ │ │ -
208
│ │ │ │ -
209
│ │ │ │ -
210#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ -
typename std::enable_if< std::is_constructible< T, Args... >::value, int >::type enableIfConstructible
Helper to constrain forwarding constructors.
Definition: type_traits.hh:26
│ │ │ │ + │ │ │ │ + │ │ │ │ +
189 element_(nullptr)
│ │ │ │ +
190 {}
│ │ │ │ +
191
│ │ │ │ +
193 const Element& element() const
│ │ │ │ +
194 {
│ │ │ │ +
195 return *element_;
│ │ │ │ +
196 }
│ │ │ │ +
197
│ │ │ │ + │ │ │ │ +
203 {
│ │ │ │ +
204 return finiteElement_;
│ │ │ │ +
205 }
│ │ │ │ +
206
│ │ │ │ +
208 void bind(const Element& e)
│ │ │ │ +
209 {
│ │ │ │ +
210 element_ = &e;
│ │ │ │ +
211
│ │ │ │ +
212 if (e.type() != finiteElement_.type())
│ │ │ │ +
213 DUNE_THROW(Dune::Exception,
│ │ │ │ +
214 "HierarchicalLagrange-elements do not exist for elements of type " << e.type());
│ │ │ │ +
215
│ │ │ │ +
216 this->setSize(finiteElement_.size());
│ │ │ │ +
217 }
│ │ │ │ +
218
│ │ │ │ +
219 protected:
│ │ │ │ +
220
│ │ │ │ +
221 unsigned int order() const
│ │ │ │ +
222 {
│ │ │ │ +
223 return 2;
│ │ │ │ +
224 }
│ │ │ │ +
225
│ │ │ │ + │ │ │ │ + │ │ │ │ +
228 };
│ │ │ │ +
229
│ │ │ │ +
230
│ │ │ │ +
231
│ │ │ │ +
232 namespace BasisFactory {
│ │ │ │ +
233
│ │ │ │ +
242 template<std::size_t k, typename R=double>
│ │ │ │ + │ │ │ │ +
244 {
│ │ │ │ +
245 return [](const auto& gridView) {
│ │ │ │ +
246 return HierarchicalLagrangePreBasis<std::decay_t<decltype(gridView)>, k, R>(gridView);
│ │ │ │ +
247 };
│ │ │ │ +
248 }
│ │ │ │ +
249
│ │ │ │ +
250 } // end namespace BasisFactory
│ │ │ │ +
251
│ │ │ │ +
262 template<typename GV, int k, typename R=double>
│ │ │ │ + │ │ │ │ +
264
│ │ │ │ +
265 } // end namespace Functions
│ │ │ │ +
266} // end namespace Dune
│ │ │ │ +
267
│ │ │ │ +
268#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICALLAGRANGEBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ +
auto hierarchicalLagrange()
Create a pre-basis factory that can create a HierarchicalLagrange pre-basis.
Definition: hierarchicallagrangebasis.hh:243
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
DefaultGlobalBasis(PreBasis &&) -> DefaultGlobalBasis< std::decay_t< PreBasis > >
│ │ │ │ -
auto makeBasis(const GridView &gridView, PreBasisFactory &&preBasisFactory)
Definition: defaultglobalbasis.hh:190
│ │ │ │
Global basis for given pre-basis.
Definition: defaultglobalbasis.hh:46
│ │ │ │ -
Dune::ReservedVector< std::size_t, PreBasis::multiIndexBufferSize > SizePrefix
Type used for prefixes handed to the size() method.
Definition: defaultglobalbasis.hh:69
│ │ │ │ -
std::size_t size_type
Type used for indices and size information.
Definition: defaultglobalbasis.hh:60
│ │ │ │ -
typename PreBasis::GridView GridView
The grid view that the FE space is defined on.
Definition: defaultglobalbasis.hh:57
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: defaultglobalbasis.hh:107
│ │ │ │ -
PB PreBasis
Pre-basis providing the implementation details.
Definition: defaultglobalbasis.hh:51
│ │ │ │ -
PreBasis & preBasis()
Obtain the pre-basis providing the implementation details.
Definition: defaultglobalbasis.hh:119
│ │ │ │ -
void update(const GridView &gv)
Update the stored grid view.
Definition: defaultglobalbasis.hh:130
│ │ │ │ -
DefaultLocalView< DefaultGlobalBasis< PreBasis > > LocalView
Type of the local view on the restriction of the basis to a single element.
Definition: defaultglobalbasis.hh:63
│ │ │ │ -
typename LocalView::MultiIndex MultiIndex
Type used for global numbering of the basis vectors.
Definition: defaultglobalbasis.hh:66
│ │ │ │ -
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition: defaultglobalbasis.hh:149
│ │ │ │ -
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition: defaultglobalbasis.hh:137
│ │ │ │ -
PreBasis preBasis_
Definition: defaultglobalbasis.hh:173
│ │ │ │ -
LocalView localView() const
Return local view for basis.
Definition: defaultglobalbasis.hh:155
│ │ │ │ -
TypeTree::HybridTreePath<> PrefixPath
The empty prefix path that identifies the root in the local ansatz tree.
Definition: defaultglobalbasis.hh:54
│ │ │ │ -
DefaultGlobalBasis(T &&... t)
Constructor.
Definition: defaultglobalbasis.hh:82
│ │ │ │ -
DefaultGlobalBasis(const GridView &gridView, PreBasisFactory &&factory)
Constructor from a PreBasis factory.
Definition: defaultglobalbasis.hh:98
│ │ │ │ -
size_type size() const
Return number of possible values for next position in empty multi index.
Definition: defaultglobalbasis.hh:143
│ │ │ │ -
const PreBasis & preBasis() const
Obtain the pre-basis providing the implementation details.
Definition: defaultglobalbasis.hh:113
│ │ │ │ -
PrefixPath prefixPath_
Definition: defaultglobalbasis.hh:174
│ │ │ │ -
const DefaultGlobalBasis & rootBasis() const
Return *this because we are not embedded in a larger basis.
Definition: defaultglobalbasis.hh:161
│ │ │ │ -
const PrefixPath & prefixPath() const
Return empty path, because this is the root in the local ansatz tree.
Definition: defaultglobalbasis.hh:167
│ │ │ │ -
The restriction of a finite element basis to a single element.
Definition: defaultlocalview.hh:28
│ │ │ │ -
std::conditional_t<(PreBasis::minMultiIndexSize==PreBasis::maxMultiIndexSize), StaticMultiIndex< size_type, PreBasis::maxMultiIndexSize >, Dune::ReservedVector< size_type, PreBasis::multiIndexBufferSize > > MultiIndex
Type used for global numbering of the basis vectors.
Definition: defaultlocalview.hh:64
│ │ │ │ - │ │ │ │ +
Definition: hierarchicallagrangebasis.hh:178
│ │ │ │ +
HierarchicalP2LocalFiniteElement< typename GV::ctype, R, dim > FiniteElement
Definition: hierarchicallagrangebasis.hh:185
│ │ │ │ +
const Element & element() const
Return current element, throw if unbound.
Definition: hierarchicallagrangebasis.hh:193
│ │ │ │ +
void bind(const Element &e)
Bind to element.
Definition: hierarchicallagrangebasis.hh:208
│ │ │ │ +
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition: hierarchicallagrangebasis.hh:202
│ │ │ │ +
const Element * element_
Definition: hierarchicallagrangebasis.hh:227
│ │ │ │ +
const FiniteElement finiteElement_
Definition: hierarchicallagrangebasis.hh:226
│ │ │ │ +
unsigned int order() const
Definition: hierarchicallagrangebasis.hh:221
│ │ │ │ +
HierarchicalLagrangeNode()
Definition: hierarchicallagrangebasis.hh:187
│ │ │ │ +
std::size_t size_type
Definition: hierarchicallagrangebasis.hh:183
│ │ │ │ +
typename GV::template Codim< 0 >::Entity Element
Definition: hierarchicallagrangebasis.hh:184
│ │ │ │ +
A pre-basis for a hierarchical basis.
Definition: hierarchicallagrangebasis.hh:49
│ │ │ │ +
std::size_t size_type
Type used for indices and size information.
Definition: hierarchicallagrangebasis.hh:58
│ │ │ │ +
unsigned int order() const
Definition: hierarchicallagrangebasis.hh:145
│ │ │ │ +
Node makeNode() const
Create tree node.
Definition: hierarchicallagrangebasis.hh:94
│ │ │ │ +
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition: hierarchicallagrangebasis.hh:123
│ │ │ │ +
static constexpr size_type multiIndexBufferSize
Definition: hierarchicallagrangebasis.hh:65
│ │ │ │ +
void update(const GridView &gv)
Update the stored grid view & MultipleCodimMultipleGeomTypeMapper, to be called if the grid has chang...
Definition: hierarchicallagrangebasis.hh:85
│ │ │ │ +
MultipleCodimMultipleGeomTypeMapper< GridView > mcmgMapper_
Definition: hierarchicallagrangebasis.hh:150
│ │ │ │ +
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition: hierarchicallagrangebasis.hh:114
│ │ │ │ +
GV GridView
The grid view that the FE basis is defined on.
Definition: hierarchicallagrangebasis.hh:55
│ │ │ │ +
HierarchicalLagrangePreBasis(const GridView &gv)
Constructor for a given grid view object with layout for second order.
Definition: hierarchicallagrangebasis.hh:71
│ │ │ │ +
static constexpr size_type maxMultiIndexSize
Definition: hierarchicallagrangebasis.hh:63
│ │ │ │ +
size_type size(const SizePrefix prefix) const
Return number of possible values for next position in multi index.
Definition: hierarchicallagrangebasis.hh:107
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: hierarchicallagrangebasis.hh:79
│ │ │ │ +
GridView gridView_
Definition: hierarchicallagrangebasis.hh:143
│ │ │ │ +
size_type size() const
Same as size(prefix) with empty prefix.
Definition: hierarchicallagrangebasis.hh:100
│ │ │ │ +
void initializeIndices()
Initialize the global indices.
Definition: hierarchicallagrangebasis.hh:75
│ │ │ │ +
It indices(const Node &node, It it) const
Definition: hierarchicallagrangebasis.hh:130
│ │ │ │ +
static constexpr size_type minMultiIndexSize
Definition: hierarchicallagrangebasis.hh:64
│ │ │ │ +
void setSize(const size_type size)
Definition: nodes.hh:164
│ │ │ │ +
Definition: nodes.hh:186
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,283 +5,355 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -defaultglobalbasis.hh │ │ │ │ │ +hierarchicallagrangebasis.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICALLAGRANGEBASIS_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICALLAGRANGEBASIS_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ - 8#include │ │ │ │ │ - 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13 │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ - 16#include │ │ │ │ │ - 17 │ │ │ │ │ - 18 │ │ │ │ │ - 19 │ │ │ │ │ - 20namespace Dune { │ │ │ │ │ - 21namespace Functions { │ │ │ │ │ - 22 │ │ │ │ │ - 23 │ │ │ │ │ - 24 │ │ │ │ │ - 44template │ │ │ │ │ -45class DefaultGlobalBasis │ │ │ │ │ - 46{ │ │ │ │ │ - 47 │ │ │ │ │ - 48public: │ │ │ │ │ - 49 │ │ │ │ │ -51 using PreBasis = PB; │ │ │ │ │ - 52 │ │ │ │ │ -54 using PrefixPath = TypeTree::HybridTreePath<>; │ │ │ │ │ - 55 │ │ │ │ │ -57 using GridView = typename PreBasis::GridView; │ │ │ │ │ - 58 │ │ │ │ │ -60 using size_type = std::size_t; │ │ │ │ │ - 61 │ │ │ │ │ -63 using LocalView = DefaultLocalView>; │ │ │ │ │ - 64 │ │ │ │ │ -66 using MultiIndex = typename LocalView::MultiIndex; │ │ │ │ │ - 67 │ │ │ │ │ -69 using SizePrefix = Dune::ReservedVector; │ │ │ │ │ - 70 │ │ │ │ │ - 79 template = 0, │ │ │ │ │ - 81 enableIfConstructible = 0> │ │ │ │ │ -82 DefaultGlobalBasis(T&&... t) : │ │ │ │ │ - 83 preBasis_(std::forward(t)...), │ │ │ │ │ - 84 prefixPath_() │ │ │ │ │ - 85 { │ │ │ │ │ - 86 static_assert(models, PreBasis>(), "Type passed │ │ │ │ │ -to DefaultGlobalBasis does not model the PreBasis concept."); │ │ │ │ │ - 87 preBasis_.initializeIndices(); │ │ │ │ │ - 88 } │ │ │ │ │ - 89 │ │ │ │ │ - 96 template:: │ │ │ │ │ -value, int> = 0> │ │ │ │ │ -98 DefaultGlobalBasis(const GridView& gridView, PreBasisFactory&& factory) : │ │ │ │ │ - 99 preBasis_(factory(gridView)), │ │ │ │ │ - 100 prefixPath_() │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8 │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12 │ │ │ │ │ + 13namespace Dune { │ │ │ │ │ + 14 namespace Functions { │ │ │ │ │ + 15 │ │ │ │ │ + 16 / │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ + 17 // Implementation for Hierarchical Lagrange Basis │ │ │ │ │ + 18 // │ │ │ │ │ + 19 // -- only order k=2 is implemented up to now -- │ │ │ │ │ + 20 // -- currently only supports simplex grids -- │ │ │ │ │ + 21 // │ │ │ │ │ + 22 // This is the reusable part of the HierarchicalLagrangeBasis. It contains │ │ │ │ │ + 23 // │ │ │ │ │ + 24 // HierarchicalLagrangePreBasis │ │ │ │ │ + 25 // HierarchicalLagrangeNode │ │ │ │ │ + 26 // │ │ │ │ │ + 27 // The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ +shared │ │ │ │ │ + 28 // state. These components do _not_ depend on the global basis and can be │ │ │ │ │ + 29 // used without a global basis. │ │ │ │ │ + 30 / │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ + 31 │ │ │ │ │ + 32 template │ │ │ │ │ + 33 class HierarchicalLagrangeNode; │ │ │ │ │ + 34 │ │ │ │ │ + 35 template │ │ │ │ │ + 36 class HierarchicalLagrangePreBasis; │ │ │ │ │ + 37 │ │ │ │ │ + 47 template │ │ │ │ │ +48 class HierarchicalLagrangePreBasis │ │ │ │ │ + 49 { │ │ │ │ │ + 50 static const int dim = GV::dimension; │ │ │ │ │ + 51 │ │ │ │ │ + 52 public: │ │ │ │ │ + 53 │ │ │ │ │ +55 using GridView = GV; │ │ │ │ │ + 56 │ │ │ │ │ +58 using size_type = std::size_t; │ │ │ │ │ + 59 │ │ │ │ │ +61 using Node = HierarchicalLagrangeNode; │ │ │ │ │ + 62 │ │ │ │ │ +63 static constexpr size_type maxMultiIndexSize = 1; │ │ │ │ │ +64 static constexpr size_type minMultiIndexSize = 1; │ │ │ │ │ +65 static constexpr size_type multiIndexBufferSize = 1; │ │ │ │ │ + 66 │ │ │ │ │ +71 HierarchicalLagrangePreBasis(const GridView& gv) : gridView_(gv) , │ │ │ │ │ +mcmgMapper_(gv,p2Layout()) │ │ │ │ │ + 72 {} │ │ │ │ │ + 73 │ │ │ │ │ +75 void initializeIndices() │ │ │ │ │ + 76 {} │ │ │ │ │ + 77 │ │ │ │ │ +79 const GridView& gridView() const │ │ │ │ │ + 80 { │ │ │ │ │ + 81 return gridView_; │ │ │ │ │ + 82 } │ │ │ │ │ + 83 │ │ │ │ │ +85 void update (const GridView& gv) │ │ │ │ │ + 86 { │ │ │ │ │ + 87 gridView_ = gv; │ │ │ │ │ + 88 mcmgMapper_.update(gv); │ │ │ │ │ + 89 } │ │ │ │ │ + 90 │ │ │ │ │ +94 Node makeNode() const │ │ │ │ │ + 95 { │ │ │ │ │ + 96 return Node{}; │ │ │ │ │ + 97 } │ │ │ │ │ + 98 │ │ │ │ │ +100 size_type size() const │ │ │ │ │ 101 { │ │ │ │ │ - 102 static_assert(models, PreBasis>(), "Type │ │ │ │ │ -passed to DefaultGlobalBasis does not model the PreBasis concept."); │ │ │ │ │ - 103 preBasis_.initializeIndices(); │ │ │ │ │ - 104 } │ │ │ │ │ - 105 │ │ │ │ │ -107 const GridView& gridView() const │ │ │ │ │ + 102 return mcmgMapper_.size(); │ │ │ │ │ + 103 } │ │ │ │ │ + 104 │ │ │ │ │ + 106 template │ │ │ │ │ +107 size_type size(const SizePrefix prefix) const │ │ │ │ │ 108 { │ │ │ │ │ - 109 return preBasis_.gridView(); │ │ │ │ │ - 110 } │ │ │ │ │ - 111 │ │ │ │ │ -113 const PreBasis& preBasis() const │ │ │ │ │ - 114 { │ │ │ │ │ - 115 return preBasis_; │ │ │ │ │ - 116 } │ │ │ │ │ - 117 │ │ │ │ │ -119 PreBasis& preBasis() │ │ │ │ │ - 120 { │ │ │ │ │ - 121 return preBasis_; │ │ │ │ │ - 122 } │ │ │ │ │ - 123 │ │ │ │ │ -130 void update(const GridView & gv) │ │ │ │ │ + 109 assert(prefix.size() == 0 || prefix.size() == 1); │ │ │ │ │ + 110 return (prefix.size() == 0) ? size() : 0; │ │ │ │ │ + 111 } │ │ │ │ │ + 112 │ │ │ │ │ +114 size_type dimension() const │ │ │ │ │ + 115 { │ │ │ │ │ + 116 return size(); │ │ │ │ │ + 117 } │ │ │ │ │ + 118 │ │ │ │ │ +123 size_type maxNodeSize() const │ │ │ │ │ + 124 { │ │ │ │ │ + 125 // That cast to unsigned int is necessary because GV::dimension is an enum │ │ │ │ │ + 126 return Dune::binomial(std::size_t(order() + (unsigned int)GV:: │ │ │ │ │ +dimension),std::size_t(order())); │ │ │ │ │ + 127 } │ │ │ │ │ + 128 │ │ │ │ │ + 129 template │ │ │ │ │ +130 It indices(const Node& node, It it) const │ │ │ │ │ 131 { │ │ │ │ │ - 132 preBasis_.update(gv); │ │ │ │ │ - 133 preBasis_.initializeIndices(); │ │ │ │ │ - 134 } │ │ │ │ │ - 135 │ │ │ │ │ -137 size_type dimension() const │ │ │ │ │ - 138 { │ │ │ │ │ - 139 return preBasis_.dimension(); │ │ │ │ │ + 132 for (size_type i = 0, end = node.finiteElement().size() ; i < end ; ++it, │ │ │ │ │ +++i) │ │ │ │ │ + 133 { │ │ │ │ │ + 134 Dune::LocalKey localKey = node.finiteElement().localCoefficients │ │ │ │ │ +().localKey(i); │ │ │ │ │ + 135 const auto& element = node.element(); │ │ │ │ │ + 136 │ │ │ │ │ + 137 *it = {{ (size_type)(mcmgMapper_.subIndex(element,localKey.subEntity │ │ │ │ │ +(),localKey.codim())) }}; │ │ │ │ │ + 138 } │ │ │ │ │ + 139 return it; │ │ │ │ │ 140 } │ │ │ │ │ 141 │ │ │ │ │ -143 size_type size() const │ │ │ │ │ - 144 { │ │ │ │ │ - 145 return preBasis_.size(); │ │ │ │ │ - 146 } │ │ │ │ │ - 147 │ │ │ │ │ -149 size_type size(const SizePrefix& prefix) const │ │ │ │ │ - 150 { │ │ │ │ │ - 151 return preBasis_.size(prefix); │ │ │ │ │ - 152 } │ │ │ │ │ - 153 │ │ │ │ │ -155 LocalView localView() const │ │ │ │ │ - 156 { │ │ │ │ │ - 157 return LocalView(*this); │ │ │ │ │ - 158 } │ │ │ │ │ - 159 │ │ │ │ │ -161 const DefaultGlobalBasis& rootBasis() const │ │ │ │ │ - 162 { │ │ │ │ │ - 163 return *this; │ │ │ │ │ - 164 } │ │ │ │ │ - 165 │ │ │ │ │ -167 const PrefixPath& prefixPath() const │ │ │ │ │ - 168 { │ │ │ │ │ - 169 return prefixPath_; │ │ │ │ │ + 142 protected: │ │ │ │ │ +143 GridView gridView_; │ │ │ │ │ + 144 │ │ │ │ │ +145 unsigned int order() const │ │ │ │ │ + 146 { │ │ │ │ │ + 147 return 2; │ │ │ │ │ + 148 } │ │ │ │ │ + 149 │ │ │ │ │ +150 MultipleCodimMultipleGeomTypeMapper mcmgMapper_; │ │ │ │ │ + 151 │ │ │ │ │ + 152 private: │ │ │ │ │ + 157 static auto p2Layout() │ │ │ │ │ + 158 { │ │ │ │ │ + 159 return [](Dune::GeometryType type, int gridDim) │ │ │ │ │ + 160 { │ │ │ │ │ + 161 if (type.isVertex()) │ │ │ │ │ + 162 return 1; │ │ │ │ │ + 163 if (type.isLine()) │ │ │ │ │ + 164 return 1; │ │ │ │ │ + 165 if (type.isTriangle()) │ │ │ │ │ + 166 return 0; │ │ │ │ │ + 167 assert(type.isTetrahedron()); │ │ │ │ │ + 168 return 0; │ │ │ │ │ + 169 }; │ │ │ │ │ 170 } │ │ │ │ │ - 171 │ │ │ │ │ - 172protected: │ │ │ │ │ -173 PreBasis preBasis_; │ │ │ │ │ -174 PrefixPath prefixPath_; │ │ │ │ │ - 175}; │ │ │ │ │ - 176 │ │ │ │ │ - 177 │ │ │ │ │ - 178 │ │ │ │ │ - 179template │ │ │ │ │ -180DefaultGlobalBasis(PreBasis&&) -> DefaultGlobalBasis>; │ │ │ │ │ - 181 │ │ │ │ │ - 182template │ │ │ │ │ -183DefaultGlobalBasis(const GridView& gv, PreBasisFactory&& f) - │ │ │ │ │ -> DefaultGlobalBasis>; │ │ │ │ │ - 184 │ │ │ │ │ - 185 │ │ │ │ │ + 171 }; │ │ │ │ │ + 172 │ │ │ │ │ + 173 │ │ │ │ │ + 174 │ │ │ │ │ + 175 template │ │ │ │ │ +176 class HierarchicalLagrangeNode : │ │ │ │ │ + 177 public LeafBasisNode │ │ │ │ │ + 178 { │ │ │ │ │ + 179 static const int dim = GV::dimension; │ │ │ │ │ + 180 │ │ │ │ │ + 181 public: │ │ │ │ │ + 182 │ │ │ │ │ +183 using size_type = std::size_t; │ │ │ │ │ +184 using Element = typename GV::template Codim<0>::Entity; │ │ │ │ │ +185 using FiniteElement = HierarchicalP2LocalFiniteElement; │ │ │ │ │ 186 │ │ │ │ │ - 187namespace BasisFactory { │ │ │ │ │ - 188 │ │ │ │ │ - 189template │ │ │ │ │ -190auto makeBasis(const GridView& gridView, PreBasisFactory&& preBasisFactory) │ │ │ │ │ - 191{ │ │ │ │ │ - 192 return DefaultGlobalBasis(preBasisFactory(gridView)); │ │ │ │ │ - 193} │ │ │ │ │ - 194 │ │ │ │ │ - 195} // end namespace BasisFactory │ │ │ │ │ - 196 │ │ │ │ │ - 197// Backward compatibility │ │ │ │ │ - 198namespace BasisBuilder { │ │ │ │ │ - 199 │ │ │ │ │ - 200 using namespace BasisFactory; │ │ │ │ │ - 201 │ │ │ │ │ - 202} │ │ │ │ │ - 203 │ │ │ │ │ - 204 │ │ │ │ │ - 205} // end namespace Functions │ │ │ │ │ - 206} // end namespace Dune │ │ │ │ │ - 207 │ │ │ │ │ - 208 │ │ │ │ │ - 209 │ │ │ │ │ - 210#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH │ │ │ │ │ -type_traits.hh │ │ │ │ │ -defaultlocalview.hh │ │ │ │ │ -Dune::Functions::enableIfConstructible │ │ │ │ │ -typename std::enable_if< std::is_constructible< T, Args... >::value, int >:: │ │ │ │ │ -type enableIfConstructible │ │ │ │ │ -Helper to constrain forwarding constructors. │ │ │ │ │ -Definition: type_traits.hh:26 │ │ │ │ │ +187 HierarchicalLagrangeNode() : │ │ │ │ │ + 188 finiteElement_(), │ │ │ │ │ + 189 element_(nullptr) │ │ │ │ │ + 190 {} │ │ │ │ │ + 191 │ │ │ │ │ +193 const Element& element() const │ │ │ │ │ + 194 { │ │ │ │ │ + 195 return *element_; │ │ │ │ │ + 196 } │ │ │ │ │ + 197 │ │ │ │ │ +202 const FiniteElement& finiteElement() const │ │ │ │ │ + 203 { │ │ │ │ │ + 204 return finiteElement_; │ │ │ │ │ + 205 } │ │ │ │ │ + 206 │ │ │ │ │ +208 void bind(const Element& e) │ │ │ │ │ + 209 { │ │ │ │ │ + 210 element_ = &e; │ │ │ │ │ + 211 │ │ │ │ │ + 212 if (e.type() != finiteElement_.type()) │ │ │ │ │ + 213 DUNE_THROW(Dune::Exception, │ │ │ │ │ + 214 "HierarchicalLagrange-elements do not exist for elements of type " << │ │ │ │ │ +e.type()); │ │ │ │ │ + 215 │ │ │ │ │ + 216 this->setSize(finiteElement_.size()); │ │ │ │ │ + 217 } │ │ │ │ │ + 218 │ │ │ │ │ + 219 protected: │ │ │ │ │ + 220 │ │ │ │ │ +221 unsigned int order() const │ │ │ │ │ + 222 { │ │ │ │ │ + 223 return 2; │ │ │ │ │ + 224 } │ │ │ │ │ + 225 │ │ │ │ │ +226 const FiniteElement finiteElement_; │ │ │ │ │ +227 const Element* element_; │ │ │ │ │ + 228 }; │ │ │ │ │ + 229 │ │ │ │ │ + 230 │ │ │ │ │ + 231 │ │ │ │ │ + 232 namespace BasisFactory { │ │ │ │ │ + 233 │ │ │ │ │ + 242 template │ │ │ │ │ +243 auto hierarchicalLagrange() │ │ │ │ │ + 244 { │ │ │ │ │ + 245 return [](const auto& gridView) { │ │ │ │ │ + 246 return HierarchicalLagrangePreBasis, k, │ │ │ │ │ +R>(gridView); │ │ │ │ │ + 247 }; │ │ │ │ │ + 248 } │ │ │ │ │ + 249 │ │ │ │ │ + 250 } // end namespace BasisFactory │ │ │ │ │ + 251 │ │ │ │ │ + 262 template │ │ │ │ │ +263 using HierarchicalLagrangeBasis = │ │ │ │ │ +DefaultGlobalBasis >; │ │ │ │ │ + 264 │ │ │ │ │ + 265 } // end namespace Functions │ │ │ │ │ + 266} // end namespace Dune │ │ │ │ │ + 267 │ │ │ │ │ + 268#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICALLAGRANGEBASIS_HH │ │ │ │ │ +nodes.hh │ │ │ │ │ +defaultglobalbasis.hh │ │ │ │ │ +Dune::Functions::BasisFactory::hierarchicalLagrange │ │ │ │ │ +auto hierarchicalLagrange() │ │ │ │ │ +Create a pre-basis factory that can create a HierarchicalLagrange pre-basis. │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:243 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ Dune::Functions::DefaultGlobalBasis │ │ │ │ │ -DefaultGlobalBasis(PreBasis &&) -> DefaultGlobalBasis< std::decay_t< PreBasis > │ │ │ │ │ -> │ │ │ │ │ -Dune::Functions::BasisFactory::makeBasis │ │ │ │ │ -auto makeBasis(const GridView &gridView, PreBasisFactory &&preBasisFactory) │ │ │ │ │ -Definition: defaultglobalbasis.hh:190 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis │ │ │ │ │ Global basis for given pre-basis. │ │ │ │ │ Definition: defaultglobalbasis.hh:46 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis::SizePrefix │ │ │ │ │ -Dune::ReservedVector< std::size_t, PreBasis::multiIndexBufferSize > SizePrefix │ │ │ │ │ -Type used for prefixes handed to the size() method. │ │ │ │ │ -Definition: defaultglobalbasis.hh:69 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis::size_type │ │ │ │ │ +Dune::Functions::HierarchicalLagrangeNode │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:178 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangeNode::FiniteElement │ │ │ │ │ +HierarchicalP2LocalFiniteElement< typename GV::ctype, R, dim > FiniteElement │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:185 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangeNode::element │ │ │ │ │ +const Element & element() const │ │ │ │ │ +Return current element, throw if unbound. │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:193 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangeNode::bind │ │ │ │ │ +void bind(const Element &e) │ │ │ │ │ +Bind to element. │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:208 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangeNode::finiteElement │ │ │ │ │ +const FiniteElement & finiteElement() const │ │ │ │ │ +Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:202 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangeNode::element_ │ │ │ │ │ +const Element * element_ │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:227 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangeNode::finiteElement_ │ │ │ │ │ +const FiniteElement finiteElement_ │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:226 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangeNode::order │ │ │ │ │ +unsigned int order() const │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:221 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangeNode::HierarchicalLagrangeNode │ │ │ │ │ +HierarchicalLagrangeNode() │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:187 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangeNode::size_type │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:183 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangeNode::Element │ │ │ │ │ +typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:184 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangePreBasis │ │ │ │ │ +A pre-basis for a hierarchical basis. │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:49 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangePreBasis::size_type │ │ │ │ │ std::size_t size_type │ │ │ │ │ Type used for indices and size information. │ │ │ │ │ -Definition: defaultglobalbasis.hh:60 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis::GridView │ │ │ │ │ -typename PreBasis::GridView GridView │ │ │ │ │ -The grid view that the FE space is defined on. │ │ │ │ │ -Definition: defaultglobalbasis.hh:57 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis::gridView │ │ │ │ │ -const GridView & gridView() const │ │ │ │ │ -Obtain the grid view that the basis is defined on. │ │ │ │ │ -Definition: defaultglobalbasis.hh:107 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis::PreBasis │ │ │ │ │ -PB PreBasis │ │ │ │ │ -Pre-basis providing the implementation details. │ │ │ │ │ -Definition: defaultglobalbasis.hh:51 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis::preBasis │ │ │ │ │ -PreBasis & preBasis() │ │ │ │ │ -Obtain the pre-basis providing the implementation details. │ │ │ │ │ -Definition: defaultglobalbasis.hh:119 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis::update │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:58 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangePreBasis::order │ │ │ │ │ +unsigned int order() const │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:145 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangePreBasis::makeNode │ │ │ │ │ +Node makeNode() const │ │ │ │ │ +Create tree node. │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:94 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangePreBasis::maxNodeSize │ │ │ │ │ +size_type maxNodeSize() const │ │ │ │ │ +Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:123 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangePreBasis::multiIndexBufferSize │ │ │ │ │ +static constexpr size_type multiIndexBufferSize │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:65 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangePreBasis::update │ │ │ │ │ void update(const GridView &gv) │ │ │ │ │ -Update the stored grid view. │ │ │ │ │ -Definition: defaultglobalbasis.hh:130 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis::LocalView │ │ │ │ │ -DefaultLocalView< DefaultGlobalBasis< PreBasis > > LocalView │ │ │ │ │ -Type of the local view on the restriction of the basis to a single element. │ │ │ │ │ -Definition: defaultglobalbasis.hh:63 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis::MultiIndex │ │ │ │ │ -typename LocalView::MultiIndex MultiIndex │ │ │ │ │ -Type used for global numbering of the basis vectors. │ │ │ │ │ -Definition: defaultglobalbasis.hh:66 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis::size │ │ │ │ │ -size_type size(const SizePrefix &prefix) const │ │ │ │ │ -Return number of possible values for next position in multi index. │ │ │ │ │ -Definition: defaultglobalbasis.hh:149 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis::dimension │ │ │ │ │ +Update the stored grid view & MultipleCodimMultipleGeomTypeMapper, to be called │ │ │ │ │ +if the grid has chang... │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:85 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangePreBasis::mcmgMapper_ │ │ │ │ │ +MultipleCodimMultipleGeomTypeMapper< GridView > mcmgMapper_ │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:150 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangePreBasis::dimension │ │ │ │ │ size_type dimension() const │ │ │ │ │ Get the total dimension of the space spanned by this basis. │ │ │ │ │ -Definition: defaultglobalbasis.hh:137 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis::preBasis_ │ │ │ │ │ -PreBasis preBasis_ │ │ │ │ │ -Definition: defaultglobalbasis.hh:173 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis::localView │ │ │ │ │ -LocalView localView() const │ │ │ │ │ -Return local view for basis. │ │ │ │ │ -Definition: defaultglobalbasis.hh:155 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis::PrefixPath │ │ │ │ │ -TypeTree::HybridTreePath<> PrefixPath │ │ │ │ │ -The empty prefix path that identifies the root in the local ansatz tree. │ │ │ │ │ -Definition: defaultglobalbasis.hh:54 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis::DefaultGlobalBasis │ │ │ │ │ -DefaultGlobalBasis(T &&... t) │ │ │ │ │ -Constructor. │ │ │ │ │ -Definition: defaultglobalbasis.hh:82 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis::DefaultGlobalBasis │ │ │ │ │ -DefaultGlobalBasis(const GridView &gridView, PreBasisFactory &&factory) │ │ │ │ │ -Constructor from a PreBasis factory. │ │ │ │ │ -Definition: defaultglobalbasis.hh:98 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis::size │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:114 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangePreBasis::GridView │ │ │ │ │ +GV GridView │ │ │ │ │ +The grid view that the FE basis is defined on. │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:55 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangePreBasis::HierarchicalLagrangePreBasis │ │ │ │ │ +HierarchicalLagrangePreBasis(const GridView &gv) │ │ │ │ │ +Constructor for a given grid view object with layout for second order. │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:71 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangePreBasis::maxMultiIndexSize │ │ │ │ │ +static constexpr size_type maxMultiIndexSize │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:63 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangePreBasis::size │ │ │ │ │ +size_type size(const SizePrefix prefix) const │ │ │ │ │ +Return number of possible values for next position in multi index. │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:107 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangePreBasis::gridView │ │ │ │ │ +const GridView & gridView() const │ │ │ │ │ +Obtain the grid view that the basis is defined on. │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:79 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangePreBasis::gridView_ │ │ │ │ │ +GridView gridView_ │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:143 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangePreBasis::size │ │ │ │ │ size_type size() const │ │ │ │ │ -Return number of possible values for next position in empty multi index. │ │ │ │ │ -Definition: defaultglobalbasis.hh:143 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis::preBasis │ │ │ │ │ -const PreBasis & preBasis() const │ │ │ │ │ -Obtain the pre-basis providing the implementation details. │ │ │ │ │ -Definition: defaultglobalbasis.hh:113 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis::prefixPath_ │ │ │ │ │ -PrefixPath prefixPath_ │ │ │ │ │ -Definition: defaultglobalbasis.hh:174 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis::rootBasis │ │ │ │ │ -const DefaultGlobalBasis & rootBasis() const │ │ │ │ │ -Return *this because we are not embedded in a larger basis. │ │ │ │ │ -Definition: defaultglobalbasis.hh:161 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis::prefixPath │ │ │ │ │ -const PrefixPath & prefixPath() const │ │ │ │ │ -Return empty path, because this is the root in the local ansatz tree. │ │ │ │ │ -Definition: defaultglobalbasis.hh:167 │ │ │ │ │ -Dune::Functions::DefaultLocalView │ │ │ │ │ -The restriction of a finite element basis to a single element. │ │ │ │ │ -Definition: defaultlocalview.hh:28 │ │ │ │ │ -Dune::Functions::DefaultLocalView::MultiIndex │ │ │ │ │ -std::conditional_t<(PreBasis::minMultiIndexSize==PreBasis::maxMultiIndexSize), │ │ │ │ │ -StaticMultiIndex< size_type, PreBasis::maxMultiIndexSize >, Dune:: │ │ │ │ │ -ReservedVector< size_type, PreBasis::multiIndexBufferSize > > MultiIndex │ │ │ │ │ -Type used for global numbering of the basis vectors. │ │ │ │ │ -Definition: defaultlocalview.hh:64 │ │ │ │ │ -concepts.hh │ │ │ │ │ +Same as size(prefix) with empty prefix. │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:100 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangePreBasis::initializeIndices │ │ │ │ │ +void initializeIndices() │ │ │ │ │ +Initialize the global indices. │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:75 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangePreBasis::indices │ │ │ │ │ +It indices(const Node &node, It it) const │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:130 │ │ │ │ │ +Dune::Functions::HierarchicalLagrangePreBasis::minMultiIndexSize │ │ │ │ │ +static constexpr size_type minMultiIndexSize │ │ │ │ │ +Definition: hierarchicallagrangebasis.hh:64 │ │ │ │ │ +Dune::Functions::BasisNodeMixin::setSize │ │ │ │ │ +void setSize(const size_type size) │ │ │ │ │ +Definition: nodes.hh:164 │ │ │ │ │ +Dune::Functions::LeafBasisNode │ │ │ │ │ +Definition: nodes.hh:186 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00131.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: defaultlocalview.hh File Reference │ │ │ │ +dune-functions: hierarchicvectorwrapper.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -64,41 +64,53 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
defaultlocalview.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
hierarchicvectorwrapper.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <tuple>
│ │ │ │ -#include <optional>
│ │ │ │ -#include <dune/common/concept.hh>
│ │ │ │ +
#include <dune/common/concept.hh>
│ │ │ │ #include <dune/common/hybridutilities.hh>
│ │ │ │ -#include <dune/common/reservedvector.hh>
│ │ │ │ -#include <dune/functions/common/overflowarray.hh>
│ │ │ │ -#include <dune/functions/common/multiindex.hh>
│ │ │ │ +#include <dune/common/indices.hh>
│ │ │ │ +#include <dune/functions/common/indexaccess.hh>
│ │ │ │ +#include <dune/functions/common/utility.hh>
│ │ │ │ +#include <dune/functions/common/type_traits.hh>
│ │ │ │ #include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::DefaultLocalView< GB >
 The restriction of a finite element basis to a single element. More...
class  Dune::Functions::HierarchicVectorWrapper< V, CO >
 A wrapper providing multiindex access to vector entries. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<class V >
HierarchicVectorWrapper< V > Dune::Functions::hierarchicVector (V &v)
 
template<class MultiIndex , class V , typename std::enable_if< models< Concept::HasIndexAccess, V, MultiIndex >(), int >::type = 0>
V & Dune::Functions::makeHierarchicVectorForMultiIndex (V &v)
 
template<class MultiIndex , class V , typename std::enable_if< not models< Concept::HasIndexAccess, V, MultiIndex >(), int >::type = 0>
HierarchicVectorWrapper< V > Dune::Functions::makeHierarchicVectorForMultiIndex (V &v)
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,30 +5,43 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -Classes | Namespaces │ │ │ │ │ -defaultlocalview.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Functions │ │ │ │ │ +hierarchicvectorwrapper.hh File Reference │ │ │ │ │ #include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::DefaultLocalView<_GB_> │ │ │ │ │ -  The restriction of a finite element basis to a single element. More... │ │ │ │ │ +class  Dune::Functions::HierarchicVectorWrapper<_V,_CO_> │ │ │ │ │ +  A wrapper providing multiindex access to vector entries. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +HierarchicVectorWrapper< V > Dune::Functions::hierarchicVector (V &v) │ │ │ │ │ +  │ │ │ │ │ +template(), int >::type = 0> │ │ │ │ │ + V & Dune::Functions:: │ │ │ │ │ + makeHierarchicVectorForMultiIndex (V &v) │ │ │ │ │ +  │ │ │ │ │ +template(), int >::type = 0> │ │ │ │ │ +HierarchicVectorWrapper< V > Dune::Functions:: │ │ │ │ │ + makeHierarchicVectorForMultiIndex (V &v) │ │ │ │ │ +  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00131_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: defaultlocalview.hh Source File │ │ │ │ +dune-functions: hierarchicvectorwrapper.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,189 +62,275 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
defaultlocalview.hh
│ │ │ │ +
hierarchicvectorwrapper.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALVIEW_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALVIEW_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICVECTORWRAPPER_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICVECTORWRAPPER_HH
│ │ │ │
5
│ │ │ │ -
6
│ │ │ │ -
7#include <tuple>
│ │ │ │ -
8#include <optional>
│ │ │ │ +
6#include <dune/common/concept.hh>
│ │ │ │ +
7#include <dune/common/hybridutilities.hh>
│ │ │ │ +
8#include <dune/common/indices.hh>
│ │ │ │
9
│ │ │ │ -
10#include <dune/common/concept.hh>
│ │ │ │ -
11#include <dune/common/hybridutilities.hh>
│ │ │ │ -
12#include <dune/common/reservedvector.hh>
│ │ │ │ -
13
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
17
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
14
│ │ │ │ +
15
│ │ │ │ +
16namespace Dune {
│ │ │ │ +
17namespace Functions {
│ │ │ │
18
│ │ │ │
19
│ │ │ │ -
20namespace Dune {
│ │ │ │ -
21namespace Functions {
│ │ │ │ +
20
│ │ │ │ +
21namespace Imp {
│ │ │ │
22
│ │ │ │ -
23
│ │ │ │ -
24
│ │ │ │ -
26template<class GB>
│ │ │ │ - │ │ │ │ -
28{
│ │ │ │ -
29public:
│ │ │ │ -
30
│ │ │ │ -
32 using GlobalBasis = GB;
│ │ │ │ -
33
│ │ │ │ -
35 using GridView = typename GlobalBasis::GridView;
│ │ │ │ -
36
│ │ │ │ -
38 using Element = typename GridView::template Codim<0>::Entity;
│ │ │ │ -
39
│ │ │ │ -
41 using size_type = std::size_t;
│ │ │ │ -
42
│ │ │ │ -
44 using Tree = typename GlobalBasis::PreBasis::Node;
│ │ │ │ -
45
│ │ │ │ -
46protected:
│ │ │ │ -
47
│ │ │ │ -
48 using PreBasis = typename GlobalBasis::PreBasis;
│ │ │ │ -
49
│ │ │ │ -
50 // Type used to store the multi indices of the basis vectors.
│ │ │ │ -
51 // In contrast to MultiIndex this always has dynamic size.
│ │ │ │ -
52 // It's guaranteed, that you can always cast it to MultiIndex
│ │ │ │ - │ │ │ │ -
54 std::conditional_t<(PreBasis::minMultiIndexSize == PreBasis::maxMultiIndexSize),
│ │ │ │ - │ │ │ │ -
56 Dune::ReservedVector<size_type, PreBasis::multiIndexBufferSize>>;
│ │ │ │ -
57
│ │ │ │ -
58public:
│ │ │ │ +
23 // Construct default coefficient type from vector and multiindex type
│ │ │ │ +
24 // This requires that MultiIndex has a static size. Otherwise the
│ │ │ │ +
25 // vector type itself is returned.
│ │ │ │ +
26 template<class V, class MultiIndex>
│ │ │ │ +
27 struct CoefficientType
│ │ │ │ +
28 {
│ │ │ │ +
29 template<class E, std::size_t size>
│ │ │ │ +
30 struct DefaultCoefficientTypeHelper
│ │ │ │ +
31 {
│ │ │ │ +
32 using E0 = decltype(std::declval<E>()[Dune::Indices::_0]);
│ │ │ │ +
33 using type = typename DefaultCoefficientTypeHelper<E0, size-1>::type;
│ │ │ │ +
34 };
│ │ │ │ +
35
│ │ │ │ +
36 template<class E>
│ │ │ │ +
37 struct DefaultCoefficientTypeHelper<E, 0>
│ │ │ │ +
38 {
│ │ │ │ +
39 using type = E;
│ │ │ │ +
40 };
│ │ │ │ +
41
│ │ │ │ +
42 template<class MI,
│ │ │ │ +
43 typename std::enable_if<HasStaticSize<MI>::value, int>::type = 0>
│ │ │ │ +
44 static constexpr std::size_t getStaticSizeOrZero()
│ │ │ │ +
45 {
│ │ │ │ +
46 return StaticSize<MI>::value;
│ │ │ │ +
47 }
│ │ │ │ +
48
│ │ │ │ +
49 template<class MI,
│ │ │ │ +
50 typename std::enable_if<not HasStaticSize<MI>::value, int>::type = 0>
│ │ │ │ +
51 static constexpr std::size_t getStaticSizeOrZero()
│ │ │ │ +
52 {
│ │ │ │ +
53 return 0;
│ │ │ │ +
54 }
│ │ │ │ +
55
│ │ │ │ +
56 using type = typename DefaultCoefficientTypeHelper<V, getStaticSizeOrZero<MultiIndex>()>::type;
│ │ │ │ +
57 };
│ │ │ │ +
58
│ │ │ │
59
│ │ │ │ -
61 using MultiIndex =
│ │ │ │ -
62 std::conditional_t<(PreBasis::minMultiIndexSize == PreBasis::maxMultiIndexSize),
│ │ │ │ - │ │ │ │ -
64 Dune::ReservedVector<size_type, PreBasis::multiIndexBufferSize>>;
│ │ │ │ +
60
│ │ │ │ +
61 // This tag class is used as Coefficient template parameter
│ │ │ │ +
62 // for HierarchicVectorWrapper if the coefficient type should
│ │ │ │ +
63 // be deduced.
│ │ │ │ +
64 struct DeducedCoefficientTag {};
│ │ │ │
65
│ │ │ │ -
66
│ │ │ │ - │ │ │ │ - │ │ │ │ -
70 tree_(globalBasis_->preBasis().makeNode())
│ │ │ │ -
71 {
│ │ │ │ -
72 static_assert(models<Concept::BasisTree<GridView>, Tree>(), "Tree type passed to DefaultLocalView does not model the BasisNode concept.");
│ │ │ │ - │ │ │ │ -
74 }
│ │ │ │ -
75
│ │ │ │ -
81 void bind(const Element& e)
│ │ │ │ -
82 {
│ │ │ │ -
83 element_ = e;
│ │ │ │ - │ │ │ │ -
85 indices_.resize(size());
│ │ │ │ -
86 globalBasis_->preBasis().indices(tree_, indices_.begin());
│ │ │ │ -
87 }
│ │ │ │ -
88
│ │ │ │ -
91 [[deprecated("Use the bound() method instead")]]
│ │ │ │ -
92 bool isBound() const {
│ │ │ │ -
93 return static_cast<bool>(element_);
│ │ │ │ -
94 }
│ │ │ │ -
95
│ │ │ │ -
98 bool bound() const
│ │ │ │ -
99 {
│ │ │ │ -
100 return static_cast<bool>(element_);
│ │ │ │ -
101 }
│ │ │ │ -
102
│ │ │ │ -
107 const Element& element() const
│ │ │ │ -
108 {
│ │ │ │ -
109 return *element_;
│ │ │ │ +
66} // namespace Imp
│ │ │ │ +
67
│ │ │ │ +
68
│ │ │ │ +
69
│ │ │ │ +
90template<class V, class CO=Imp::DeducedCoefficientTag>
│ │ │ │ + │ │ │ │ +
92{
│ │ │ │ +
93 template<class MultiIndex>
│ │ │ │ +
94 using Coefficient = typename std::conditional< std::is_same<Imp::DeducedCoefficientTag,CO>::value and HasStaticSize<MultiIndex>::value,
│ │ │ │ +
95 typename Imp::CoefficientType<V, MultiIndex>::type,
│ │ │ │ +
96 CO
│ │ │ │ +
97 >::type;
│ │ │ │ +
98
│ │ │ │ +
99
│ │ │ │ +
100 using size_type = std::size_t;
│ │ │ │ +
101
│ │ │ │ +
102 template<class C, class SizeProvider,
│ │ │ │ +
103 typename std::enable_if< not models<Concept::HasResize, C>(), int>::type = 0,
│ │ │ │ +
104 typename std::enable_if< not models<Concept::HasSizeMethod, C>(), int>::type = 0>
│ │ │ │ +
105 static void resizeHelper(C& c, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ +
106 {
│ │ │ │ +
107 auto size = sizeProvider.size(prefix);
│ │ │ │ +
108 if (size != 0)
│ │ │ │ +
109 DUNE_THROW(RangeError, "Can't resize scalar vector entry v[" << prefix << "] to size(" << prefix << ")=" << size);
│ │ │ │
110 }
│ │ │ │
111
│ │ │ │ -
116 void unbind()
│ │ │ │ -
117 {
│ │ │ │ -
118 element_.reset();
│ │ │ │ -
119 }
│ │ │ │ -
120
│ │ │ │ -
125 const Tree& tree() const
│ │ │ │ -
126 {
│ │ │ │ -
127 return tree_;
│ │ │ │ -
128 }
│ │ │ │ -
129
│ │ │ │ - │ │ │ │ -
133 {
│ │ │ │ -
134 return tree_.size();
│ │ │ │ -
135 }
│ │ │ │ -
136
│ │ │ │ - │ │ │ │ -
144 {
│ │ │ │ -
145 return globalBasis_->preBasis().maxNodeSize();
│ │ │ │ -
146 }
│ │ │ │ -
147
│ │ │ │ -
149 const MultiIndex& index(size_type i) const
│ │ │ │ -
150 {
│ │ │ │ -
151 return indices_[i];
│ │ │ │ -
152 }
│ │ │ │ +
112 struct StaticResizeHelper
│ │ │ │ +
113 {
│ │ │ │ +
114 template<class I, class C, class SizeProvider>
│ │ │ │ +
115 static void apply(I&& i, C& c, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ +
116 {
│ │ │ │ +
117 prefix.back() = i;
│ │ │ │ +
118 resizeHelper(c[i], sizeProvider, prefix);
│ │ │ │ +
119 }
│ │ │ │ +
120 };
│ │ │ │ +
121
│ │ │ │ +
122 template<class C, class SizeProvider,
│ │ │ │ +
123 typename std::enable_if< not models<Concept::HasResize, C>(), int>::type = 0,
│ │ │ │ +
124 typename std::enable_if< models<Concept::HasSizeMethod, C>(), int>::type = 0>
│ │ │ │ +
125 static void resizeHelper(C& c, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ +
126 {
│ │ │ │ +
127 auto size = sizeProvider.size(prefix);
│ │ │ │ +
128 if (size == 0)
│ │ │ │ +
129 return;
│ │ │ │ +
130
│ │ │ │ +
131 if (c.size() != size)
│ │ │ │ +
132 DUNE_THROW(RangeError, "Can't resize statically sized vector entry v[" << prefix << "] of size " << c.size() << " to size(" << prefix << ")=" << size);
│ │ │ │ +
133
│ │ │ │ +
134 using namespace Dune::Hybrid;
│ │ │ │ +
135 prefix.push_back(0);
│ │ │ │ +
136 forEach(integralRange(Hybrid::size(c)), [&](auto&& i) {
│ │ │ │ +
137 StaticResizeHelper::apply(i, c, sizeProvider, prefix);
│ │ │ │ +
138 });
│ │ │ │ +
139 }
│ │ │ │ +
140
│ │ │ │ +
141 template<class C, class SizeProvider,
│ │ │ │ +
142 typename std::enable_if< models<Concept::HasResize, C>(), int>::type = 0>
│ │ │ │ +
143 static void resizeHelper(C& c, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ +
144 {
│ │ │ │ +
145 auto size = sizeProvider.size(prefix);
│ │ │ │ +
146 if (size==0)
│ │ │ │ +
147 {
│ │ │ │ +
148 if (c.size()==0)
│ │ │ │ +
149 DUNE_THROW(RangeError, "Can't resize dynamically sized vector entry v[" << prefix << "]. Its size is 0 but the target size is unknown due to size(" << prefix << ")=0.");
│ │ │ │ +
150 else
│ │ │ │ +
151 return;
│ │ │ │ +
152 }
│ │ │ │
153
│ │ │ │ - │ │ │ │ -
157 {
│ │ │ │ -
158 return *globalBasis_;
│ │ │ │ -
159 }
│ │ │ │ -
160
│ │ │ │ - │ │ │ │ -
162 {
│ │ │ │ -
163 return *this;
│ │ │ │ -
164 }
│ │ │ │ -
165
│ │ │ │ -
166protected:
│ │ │ │ - │ │ │ │ -
168 std::optional<Element> element_;
│ │ │ │ - │ │ │ │ -
170 std::vector<MultiIndexStorage> indices_;
│ │ │ │ -
171};
│ │ │ │ -
172
│ │ │ │ -
173
│ │ │ │ -
174
│ │ │ │ -
175} // end namespace Functions
│ │ │ │ -
176} // end namespace Dune
│ │ │ │ -
177
│ │ │ │ -
178
│ │ │ │ -
179
│ │ │ │ -
180#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALVIEW_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ +
154 c.resize(size);
│ │ │ │ +
155 prefix.push_back(0);
│ │ │ │ +
156 for(std::size_t i=0; i<size; ++i)
│ │ │ │ +
157 {
│ │ │ │ +
158 prefix.back() = i;
│ │ │ │ +
159 resizeHelper(c[i], sizeProvider, prefix);
│ │ │ │ +
160 }
│ │ │ │ +
161 }
│ │ │ │ +
162
│ │ │ │ +
163
│ │ │ │ +
164
│ │ │ │ +
165public:
│ │ │ │ +
166
│ │ │ │ +
167 using Vector = V;
│ │ │ │ +
168
│ │ │ │ +
169 template<class MultiIndex>
│ │ │ │ +
170 using Entry = Coefficient<MultiIndex>;
│ │ │ │ +
171
│ │ │ │ + │ │ │ │ +
173 vector_(&vector)
│ │ │ │ +
174 {}
│ │ │ │ +
175
│ │ │ │ +
176 template<class SizeProvider>
│ │ │ │ +
177 void resize(const SizeProvider& sizeProvider)
│ │ │ │ +
178 {
│ │ │ │ +
179 typename SizeProvider::SizePrefix prefix;
│ │ │ │ +
180 prefix.resize(0);
│ │ │ │ +
181 resizeHelper(*vector_, sizeProvider, prefix);
│ │ │ │ +
182 }
│ │ │ │ +
183
│ │ │ │ +
184 template<class MultiIndex>
│ │ │ │ +
185 const Entry<MultiIndex>& operator[](const MultiIndex& index) const
│ │ │ │ +
186 {
│ │ │ │ +
187 static_assert(not std::is_same<Imp::DeducedCoefficientTag,Entry<MultiIndex>>::value, "Coefficient type for HierarchicVectorWrapper and given multi-index type cannot be determined automatically!");
│ │ │ │ +
188 return hybridMultiIndexAccess<const Entry<MultiIndex>&>(*vector_, index);
│ │ │ │ +
189 }
│ │ │ │ +
190
│ │ │ │ +
191 template<class MultiIndex>
│ │ │ │ +
192 Entry<MultiIndex>& operator[](const MultiIndex& index)
│ │ │ │ +
193 {
│ │ │ │ +
194 static_assert(not std::is_same<Imp::DeducedCoefficientTag,Entry<MultiIndex>>::value, "Coefficient type for HierarchicVectorWrapper and given multi-index type cannot be determined automatically!");
│ │ │ │ +
195 return hybridMultiIndexAccess<Entry<MultiIndex>&>(*vector_, index);
│ │ │ │ +
196 }
│ │ │ │ +
197
│ │ │ │ +
198 template<class MultiIndex>
│ │ │ │ +
199 const Entry<MultiIndex>& operator()(const MultiIndex& index) const
│ │ │ │ +
200 {
│ │ │ │ +
201 static_assert(not std::is_same<Imp::DeducedCoefficientTag,Entry<MultiIndex>>::value, "Coefficient type for HierarchicVectorWrapper and given multi-index type cannot be determined automatically!");
│ │ │ │ +
202 return (*this)[index];
│ │ │ │ +
203 }
│ │ │ │ +
204
│ │ │ │ +
205 template<class MultiIndex>
│ │ │ │ +
206 Entry<MultiIndex>& operator()(const MultiIndex& index)
│ │ │ │ +
207 {
│ │ │ │ +
208 static_assert(not std::is_same<Imp::DeducedCoefficientTag,Entry<MultiIndex>>::value, "Coefficient type for HierarchicVectorWrapper and given multi-index type cannot be determined automatically!");
│ │ │ │ +
209 return (*this)[index];
│ │ │ │ +
210 }
│ │ │ │ +
211
│ │ │ │ +
212 const Vector& vector() const
│ │ │ │ +
213 {
│ │ │ │ +
214 return *vector_;
│ │ │ │ +
215 }
│ │ │ │ +
216
│ │ │ │ + │ │ │ │ +
218 {
│ │ │ │ +
219 return *vector_;
│ │ │ │ +
220 }
│ │ │ │ +
221
│ │ │ │ +
222private:
│ │ │ │ +
223
│ │ │ │ +
224 Vector* vector_;
│ │ │ │ +
225};
│ │ │ │ +
226
│ │ │ │ +
227
│ │ │ │ +
228
│ │ │ │ +
229
│ │ │ │ +
230template<class V>
│ │ │ │ + │ │ │ │ +
232{
│ │ │ │ + │ │ │ │ +
234}
│ │ │ │ +
235
│ │ │ │ +
236
│ │ │ │ +
237
│ │ │ │ +
238template<class MultiIndex, class V,
│ │ │ │ +
239 typename std::enable_if< models<Concept::HasIndexAccess, V, MultiIndex>(), int>::type = 0>
│ │ │ │ + │ │ │ │ +
241{
│ │ │ │ +
242 return v;
│ │ │ │ +
243}
│ │ │ │ +
244
│ │ │ │ +
245
│ │ │ │ +
246
│ │ │ │ +
247template<class MultiIndex, class V,
│ │ │ │ +
248 typename std::enable_if< not models<Concept::HasIndexAccess, V, MultiIndex>(), int>::type = 0>
│ │ │ │ + │ │ │ │ +
250{
│ │ │ │ + │ │ │ │ +
252}
│ │ │ │ +
253
│ │ │ │ +
254
│ │ │ │ +
255
│ │ │ │ +
256} // namespace Dune::Functions
│ │ │ │ +
257} // namespace Dune
│ │ │ │ +
258
│ │ │ │ +
259
│ │ │ │ +
260#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICVECTORWRAPPER_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
void bindTree(Tree &tree, const Entity &entity, std::size_t offset=0)
Definition: nodes.hh:253
│ │ │ │ -
void initializeTree(Tree &tree, std::size_t treeIndexOffset=0)
Definition: nodes.hh:260
│ │ │ │ -
A statically sized MultiIndex type.
Definition: multiindex.hh:25
│ │ │ │ -
A dynamically sized array-like class with overflow.
Definition: overflowarray.hh:45
│ │ │ │ -
The restriction of a finite element basis to a single element.
Definition: defaultlocalview.hh:28
│ │ │ │ -
typename GlobalBasis::PreBasis PreBasis
Definition: defaultlocalview.hh:48
│ │ │ │ -
void unbind()
Unbind from the current element.
Definition: defaultlocalview.hh:116
│ │ │ │ -
bool bound() const
Return if the view is bound to a grid element.
Definition: defaultlocalview.hh:98
│ │ │ │ -
typename GlobalBasis::GridView GridView
The grid view the global FE basis lives on.
Definition: defaultlocalview.hh:35
│ │ │ │ -
const MultiIndex & index(size_type i) const
Maps from subtree index set [0..size-1] to a globally unique multi index in global basis.
Definition: defaultlocalview.hh:149
│ │ │ │ -
std::optional< Element > element_
Definition: defaultlocalview.hh:168
│ │ │ │ -
typename GridView::template Codim< 0 >::Entity Element
Type of the grid element we are bound to.
Definition: defaultlocalview.hh:38
│ │ │ │ -
const Tree & tree() const
Return the local ansatz tree associated to the bound entity.
Definition: defaultlocalview.hh:125
│ │ │ │ -
void bind(const Element &e)
Bind the view to a grid element.
Definition: defaultlocalview.hh:81
│ │ │ │ -
const Element & element() const
Return the grid element that the view is bound to.
Definition: defaultlocalview.hh:107
│ │ │ │ -
size_type size() const
Total number of degrees of freedom on this element.
Definition: defaultlocalview.hh:132
│ │ │ │ -
GB GlobalBasis
The global FE basis that this is a view on.
Definition: defaultlocalview.hh:32
│ │ │ │ -
Tree tree_
Definition: defaultlocalview.hh:169
│ │ │ │ -
size_type maxSize() const
Maximum local size for any element on the GridView.
Definition: defaultlocalview.hh:143
│ │ │ │ -
std::size_t size_type
The type used for sizes.
Definition: defaultlocalview.hh:41
│ │ │ │ -
bool isBound() const
Return if the view is bound to a grid element.
Definition: defaultlocalview.hh:92
│ │ │ │ -
const DefaultLocalView & rootLocalView() const
Definition: defaultlocalview.hh:161
│ │ │ │ -
std::conditional_t<(PreBasis::minMultiIndexSize==PreBasis::maxMultiIndexSize), OverflowArray< StaticMultiIndex< size_type, PreBasis::maxMultiIndexSize >, PreBasis::multiIndexBufferSize >, Dune::ReservedVector< size_type, PreBasis::multiIndexBufferSize > > MultiIndexStorage
Definition: defaultlocalview.hh:56
│ │ │ │ -
std::conditional_t<(PreBasis::minMultiIndexSize==PreBasis::maxMultiIndexSize), StaticMultiIndex< size_type, PreBasis::maxMultiIndexSize >, Dune::ReservedVector< size_type, PreBasis::multiIndexBufferSize > > MultiIndex
Type used for global numbering of the basis vectors.
Definition: defaultlocalview.hh:64
│ │ │ │ -
std::vector< MultiIndexStorage > indices_
Definition: defaultlocalview.hh:170
│ │ │ │ -
typename GlobalBasis::PreBasis::Node Tree
Tree of local finite elements / local shape function sets.
Definition: defaultlocalview.hh:44
│ │ │ │ -
DefaultLocalView(const GlobalBasis &globalBasis)
Construct local view for a given global finite element basis.
Definition: defaultlocalview.hh:68
│ │ │ │ -
const GlobalBasis * globalBasis_
Definition: defaultlocalview.hh:167
│ │ │ │ -
const GlobalBasis & globalBasis() const
Return the global basis that we are a view on.
Definition: defaultlocalview.hh:156
│ │ │ │ +
V & makeHierarchicVectorForMultiIndex(V &v)
Definition: hierarchicvectorwrapper.hh:240
│ │ │ │ +
HierarchicVectorWrapper< V > hierarchicVector(V &v)
Definition: hierarchicvectorwrapper.hh:231
│ │ │ │ +
Check if type is a statically sized container.
Definition: type_traits.hh:83
│ │ │ │ +
A wrapper providing multiindex access to vector entries.
Definition: hierarchicvectorwrapper.hh:92
│ │ │ │ +
Entry< MultiIndex > & operator()(const MultiIndex &index)
Definition: hierarchicvectorwrapper.hh:206
│ │ │ │ +
Entry< MultiIndex > & operator[](const MultiIndex &index)
Definition: hierarchicvectorwrapper.hh:192
│ │ │ │ +
const Entry< MultiIndex > & operator[](const MultiIndex &index) const
Definition: hierarchicvectorwrapper.hh:185
│ │ │ │ +
Vector & vector()
Definition: hierarchicvectorwrapper.hh:217
│ │ │ │ +
V Vector
Definition: hierarchicvectorwrapper.hh:167
│ │ │ │ +
Coefficient< MultiIndex > Entry
Definition: hierarchicvectorwrapper.hh:170
│ │ │ │ +
const Vector & vector() const
Definition: hierarchicvectorwrapper.hh:212
│ │ │ │ +
HierarchicVectorWrapper(Vector &vector)
Definition: hierarchicvectorwrapper.hh:172
│ │ │ │ +
const Entry< MultiIndex > & operator()(const MultiIndex &index) const
Definition: hierarchicvectorwrapper.hh:199
│ │ │ │ +
void resize(const SizeProvider &sizeProvider)
Definition: hierarchicvectorwrapper.hh:177
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,271 +5,328 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -defaultlocalview.hh │ │ │ │ │ +hierarchicvectorwrapper.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALVIEW_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALVIEW_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICVECTORWRAPPER_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICVECTORWRAPPER_HH │ │ │ │ │ 5 │ │ │ │ │ - 6 │ │ │ │ │ - 7#include │ │ │ │ │ - 8#include │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8#include │ │ │ │ │ 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13 │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ - 16#include │ │ │ │ │ - 17 │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14 │ │ │ │ │ + 15 │ │ │ │ │ + 16namespace Dune { │ │ │ │ │ + 17namespace Functions { │ │ │ │ │ 18 │ │ │ │ │ 19 │ │ │ │ │ - 20namespace Dune { │ │ │ │ │ - 21namespace Functions { │ │ │ │ │ + 20 │ │ │ │ │ + 21namespace Imp { │ │ │ │ │ 22 │ │ │ │ │ - 23 │ │ │ │ │ - 24 │ │ │ │ │ - 26template │ │ │ │ │ -27class DefaultLocalView │ │ │ │ │ - 28{ │ │ │ │ │ - 29public: │ │ │ │ │ - 30 │ │ │ │ │ -32 using GlobalBasis = GB; │ │ │ │ │ - 33 │ │ │ │ │ -35 using GridView = typename GlobalBasis::GridView; │ │ │ │ │ - 36 │ │ │ │ │ -38 using Element = typename GridView::template Codim<0>::Entity; │ │ │ │ │ - 39 │ │ │ │ │ -41 using size_type = std::size_t; │ │ │ │ │ - 42 │ │ │ │ │ -44 using Tree = typename GlobalBasis::PreBasis::Node; │ │ │ │ │ - 45 │ │ │ │ │ - 46protected: │ │ │ │ │ - 47 │ │ │ │ │ -48 using PreBasis = typename GlobalBasis::PreBasis; │ │ │ │ │ - 49 │ │ │ │ │ - 50 // Type used to store the multi indices of the basis vectors. │ │ │ │ │ - 51 // In contrast to MultiIndex this always has dynamic size. │ │ │ │ │ - 52 // It's guaranteed, that you can always cast it to MultiIndex │ │ │ │ │ -53 using MultiIndexStorage = │ │ │ │ │ - 54 std::conditional_t<(PreBasis::minMultiIndexSize == PreBasis:: │ │ │ │ │ -maxMultiIndexSize), │ │ │ │ │ - 55 OverflowArray, │ │ │ │ │ -PreBasis::multiIndexBufferSize>, │ │ │ │ │ - 56 Dune::ReservedVector>; │ │ │ │ │ - 57 │ │ │ │ │ - 58public: │ │ │ │ │ + 23 // Construct default coefficient type from vector and multiindex type │ │ │ │ │ + 24 // This requires that MultiIndex has a static size. Otherwise the │ │ │ │ │ + 25 // vector type itself is returned. │ │ │ │ │ + 26 template │ │ │ │ │ + 27 struct CoefficientType │ │ │ │ │ + 28 { │ │ │ │ │ + 29 template │ │ │ │ │ + 30 struct DefaultCoefficientTypeHelper │ │ │ │ │ + 31 { │ │ │ │ │ + 32 using E0 = decltype(std::declval()[Dune::Indices::_0]); │ │ │ │ │ + 33 using type = typename DefaultCoefficientTypeHelper::type; │ │ │ │ │ + 34 }; │ │ │ │ │ + 35 │ │ │ │ │ + 36 template │ │ │ │ │ + 37 struct DefaultCoefficientTypeHelper │ │ │ │ │ + 38 { │ │ │ │ │ + 39 using type = E; │ │ │ │ │ + 40 }; │ │ │ │ │ + 41 │ │ │ │ │ + 42 template::value, int>::type = 0> │ │ │ │ │ + 44 static constexpr std::size_t getStaticSizeOrZero() │ │ │ │ │ + 45 { │ │ │ │ │ + 46 return StaticSize::value; │ │ │ │ │ + 47 } │ │ │ │ │ + 48 │ │ │ │ │ + 49 template::value, int>::type = 0> │ │ │ │ │ + 51 static constexpr std::size_t getStaticSizeOrZero() │ │ │ │ │ + 52 { │ │ │ │ │ + 53 return 0; │ │ │ │ │ + 54 } │ │ │ │ │ + 55 │ │ │ │ │ + 56 using type = typename DefaultCoefficientTypeHelper()>::type; │ │ │ │ │ + 57 }; │ │ │ │ │ + 58 │ │ │ │ │ 59 │ │ │ │ │ -61 using MultiIndex = │ │ │ │ │ - 62 std::conditional_t<(PreBasis::minMultiIndexSize == PreBasis:: │ │ │ │ │ -maxMultiIndexSize), │ │ │ │ │ - 63 StaticMultiIndex, │ │ │ │ │ - 64 Dune::ReservedVector>; │ │ │ │ │ + 60 │ │ │ │ │ + 61 // This tag class is used as Coefficient template parameter │ │ │ │ │ + 62 // for HierarchicVectorWrapper if the coefficient type should │ │ │ │ │ + 63 // be deduced. │ │ │ │ │ + 64 struct DeducedCoefficientTag {}; │ │ │ │ │ 65 │ │ │ │ │ - 66 │ │ │ │ │ -68 DefaultLocalView(const GlobalBasis& globalBasis) : │ │ │ │ │ - 69 globalBasis_(&globalBasis), │ │ │ │ │ - 70 tree_(globalBasis_->preBasis().makeNode()) │ │ │ │ │ - 71 { │ │ │ │ │ - 72 static_assert(models, Tree>(), "Tree type │ │ │ │ │ -passed to DefaultLocalView does not model the BasisNode concept."); │ │ │ │ │ - 73 initializeTree(tree_); │ │ │ │ │ - 74 } │ │ │ │ │ - 75 │ │ │ │ │ -81 void bind(const Element& e) │ │ │ │ │ - 82 { │ │ │ │ │ - 83 element_ = e; │ │ │ │ │ - 84 bindTree(tree_, *element_); │ │ │ │ │ - 85 indices_.resize(size()); │ │ │ │ │ - 86 globalBasis_->preBasis().indices(tree_, indices_.begin()); │ │ │ │ │ - 87 } │ │ │ │ │ - 88 │ │ │ │ │ - 91 [[deprecated("Use the bound() method instead")]] │ │ │ │ │ -92 bool isBound() const { │ │ │ │ │ - 93 return static_cast(element_); │ │ │ │ │ - 94 } │ │ │ │ │ - 95 │ │ │ │ │ -98 bool bound() const │ │ │ │ │ - 99 { │ │ │ │ │ - 100 return static_cast(element_); │ │ │ │ │ - 101 } │ │ │ │ │ - 102 │ │ │ │ │ -107 const Element& element() const │ │ │ │ │ - 108 { │ │ │ │ │ - 109 return *element_; │ │ │ │ │ + 66} // namespace Imp │ │ │ │ │ + 67 │ │ │ │ │ + 68 │ │ │ │ │ + 69 │ │ │ │ │ + 90template │ │ │ │ │ +91class HierarchicVectorWrapper │ │ │ │ │ + 92{ │ │ │ │ │ + 93 template │ │ │ │ │ + 94 using Coefficient = typename std::conditional< std::is_same::value and HasStaticSize::value, │ │ │ │ │ + 95 typename Imp::CoefficientType::type, │ │ │ │ │ + 96 CO │ │ │ │ │ + 97 >::type; │ │ │ │ │ + 98 │ │ │ │ │ + 99 │ │ │ │ │ + 100 using size_type = std::size_t; │ │ │ │ │ + 101 │ │ │ │ │ + 102 template(), int>::type = │ │ │ │ │ +0, │ │ │ │ │ + 104 typename std::enable_if< not models(), int>:: │ │ │ │ │ +type = 0> │ │ │ │ │ + 105 static void resizeHelper(C& c, const SizeProvider& sizeProvider, typename │ │ │ │ │ +SizeProvider::SizePrefix prefix) │ │ │ │ │ + 106 { │ │ │ │ │ + 107 auto size = sizeProvider.size(prefix); │ │ │ │ │ + 108 if (size != 0) │ │ │ │ │ + 109 DUNE_THROW(RangeError, "Can't resize scalar vector entry v[" << prefix << │ │ │ │ │ +"] to size(" << prefix << ")=" << size); │ │ │ │ │ 110 } │ │ │ │ │ 111 │ │ │ │ │ -116 void unbind() │ │ │ │ │ - 117 { │ │ │ │ │ - 118 element_.reset(); │ │ │ │ │ + 112 struct StaticResizeHelper │ │ │ │ │ + 113 { │ │ │ │ │ + 114 template │ │ │ │ │ + 115 static void apply(I&& i, C& c, const SizeProvider& sizeProvider, typename │ │ │ │ │ +SizeProvider::SizePrefix prefix) │ │ │ │ │ + 116 { │ │ │ │ │ + 117 prefix.back() = i; │ │ │ │ │ + 118 resizeHelper(c[i], sizeProvider, prefix); │ │ │ │ │ 119 } │ │ │ │ │ - 120 │ │ │ │ │ -125 const Tree& tree() const │ │ │ │ │ + 120 }; │ │ │ │ │ + 121 │ │ │ │ │ + 122 template(), int>::type = │ │ │ │ │ +0, │ │ │ │ │ + 124 typename std::enable_if< models(), int>::type = │ │ │ │ │ +0> │ │ │ │ │ + 125 static void resizeHelper(C& c, const SizeProvider& sizeProvider, typename │ │ │ │ │ +SizeProvider::SizePrefix prefix) │ │ │ │ │ 126 { │ │ │ │ │ - 127 return tree_; │ │ │ │ │ - 128 } │ │ │ │ │ - 129 │ │ │ │ │ -132 size_type size() const │ │ │ │ │ - 133 { │ │ │ │ │ - 134 return tree_.size(); │ │ │ │ │ - 135 } │ │ │ │ │ - 136 │ │ │ │ │ -143 size_type maxSize() const │ │ │ │ │ + 127 auto size = sizeProvider.size(prefix); │ │ │ │ │ + 128 if (size == 0) │ │ │ │ │ + 129 return; │ │ │ │ │ + 130 │ │ │ │ │ + 131 if (c.size() != size) │ │ │ │ │ + 132 DUNE_THROW(RangeError, "Can't resize statically sized vector entry v[" << │ │ │ │ │ +prefix << "] of size " << c.size() << " to size(" << prefix << ")=" << size); │ │ │ │ │ + 133 │ │ │ │ │ + 134 using namespace Dune::Hybrid; │ │ │ │ │ + 135 prefix.push_back(0); │ │ │ │ │ + 136 forEach(integralRange(Hybrid::size(c)), [&](auto&& i) { │ │ │ │ │ + 137 StaticResizeHelper::apply(i, c, sizeProvider, prefix); │ │ │ │ │ + 138 }); │ │ │ │ │ + 139 } │ │ │ │ │ + 140 │ │ │ │ │ + 141 template(), int>::type = 0> │ │ │ │ │ + 143 static void resizeHelper(C& c, const SizeProvider& sizeProvider, typename │ │ │ │ │ +SizeProvider::SizePrefix prefix) │ │ │ │ │ 144 { │ │ │ │ │ - 145 return globalBasis_->preBasis().maxNodeSize(); │ │ │ │ │ - 146 } │ │ │ │ │ - 147 │ │ │ │ │ -149 const MultiIndex& index(size_type i) const │ │ │ │ │ - 150 { │ │ │ │ │ - 151 return indices_[i]; │ │ │ │ │ + 145 auto size = sizeProvider.size(prefix); │ │ │ │ │ + 146 if (size==0) │ │ │ │ │ + 147 { │ │ │ │ │ + 148 if (c.size()==0) │ │ │ │ │ + 149 DUNE_THROW(RangeError, "Can't resize dynamically sized vector entry v[" << │ │ │ │ │ +prefix << "]. Its size is 0 but the target size is unknown due to size(" << │ │ │ │ │ +prefix << ")=0."); │ │ │ │ │ + 150 else │ │ │ │ │ + 151 return; │ │ │ │ │ 152 } │ │ │ │ │ 153 │ │ │ │ │ -156 const GlobalBasis& globalBasis() const │ │ │ │ │ + 154 c.resize(size); │ │ │ │ │ + 155 prefix.push_back(0); │ │ │ │ │ + 156 for(std::size_t i=0; i element_; │ │ │ │ │ -169 Tree tree_; │ │ │ │ │ -170 std::vector indices_; │ │ │ │ │ - 171}; │ │ │ │ │ - 172 │ │ │ │ │ - 173 │ │ │ │ │ - 174 │ │ │ │ │ - 175} // end namespace Functions │ │ │ │ │ - 176} // end namespace Dune │ │ │ │ │ - 177 │ │ │ │ │ - 178 │ │ │ │ │ - 179 │ │ │ │ │ - 180#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALVIEW_HH │ │ │ │ │ -overflowarray.hh │ │ │ │ │ -multiindex.hh │ │ │ │ │ + 158 prefix.back() = i; │ │ │ │ │ + 159 resizeHelper(c[i], sizeProvider, prefix); │ │ │ │ │ + 160 } │ │ │ │ │ + 161 } │ │ │ │ │ + 162 │ │ │ │ │ + 163 │ │ │ │ │ + 164 │ │ │ │ │ + 165public: │ │ │ │ │ + 166 │ │ │ │ │ +167 using Vector = V; │ │ │ │ │ + 168 │ │ │ │ │ + 169 template │ │ │ │ │ +170 using Entry = Coefficient; │ │ │ │ │ + 171 │ │ │ │ │ +172 HierarchicVectorWrapper(Vector& vector) : │ │ │ │ │ + 173 vector_(&vector) │ │ │ │ │ + 174 {} │ │ │ │ │ + 175 │ │ │ │ │ + 176 template │ │ │ │ │ +177 void resize(const SizeProvider& sizeProvider) │ │ │ │ │ + 178 { │ │ │ │ │ + 179 typename SizeProvider::SizePrefix prefix; │ │ │ │ │ + 180 prefix.resize(0); │ │ │ │ │ + 181 resizeHelper(*vector_, sizeProvider, prefix); │ │ │ │ │ + 182 } │ │ │ │ │ + 183 │ │ │ │ │ + 184 template │ │ │ │ │ +185 const Entry& operator[](const MultiIndex& index) const │ │ │ │ │ + 186 { │ │ │ │ │ + 187 static_assert(not std::is_same>::value, "Coefficient type for │ │ │ │ │ +HierarchicVectorWrapper and given multi-index type cannot be determined │ │ │ │ │ +automatically!"); │ │ │ │ │ + 188 return hybridMultiIndexAccess&>(*vector_, index); │ │ │ │ │ + 189 } │ │ │ │ │ + 190 │ │ │ │ │ + 191 template │ │ │ │ │ +192 Entry& operator[](const MultiIndex& index) │ │ │ │ │ + 193 { │ │ │ │ │ + 194 static_assert(not std::is_same>::value, "Coefficient type for │ │ │ │ │ +HierarchicVectorWrapper and given multi-index type cannot be determined │ │ │ │ │ +automatically!"); │ │ │ │ │ + 195 return hybridMultiIndexAccess&>(*vector_, index); │ │ │ │ │ + 196 } │ │ │ │ │ + 197 │ │ │ │ │ + 198 template │ │ │ │ │ +199 const Entry& operator()(const MultiIndex& index) const │ │ │ │ │ + 200 { │ │ │ │ │ + 201 static_assert(not std::is_same>::value, "Coefficient type for │ │ │ │ │ +HierarchicVectorWrapper and given multi-index type cannot be determined │ │ │ │ │ +automatically!"); │ │ │ │ │ + 202 return (*this)[index]; │ │ │ │ │ + 203 } │ │ │ │ │ + 204 │ │ │ │ │ + 205 template │ │ │ │ │ +206 Entry& operator()(const MultiIndex& index) │ │ │ │ │ + 207 { │ │ │ │ │ + 208 static_assert(not std::is_same>::value, "Coefficient type for │ │ │ │ │ +HierarchicVectorWrapper and given multi-index type cannot be determined │ │ │ │ │ +automatically!"); │ │ │ │ │ + 209 return (*this)[index]; │ │ │ │ │ + 210 } │ │ │ │ │ + 211 │ │ │ │ │ +212 const Vector& vector() const │ │ │ │ │ + 213 { │ │ │ │ │ + 214 return *vector_; │ │ │ │ │ + 215 } │ │ │ │ │ + 216 │ │ │ │ │ +217 Vector& vector() │ │ │ │ │ + 218 { │ │ │ │ │ + 219 return *vector_; │ │ │ │ │ + 220 } │ │ │ │ │ + 221 │ │ │ │ │ + 222private: │ │ │ │ │ + 223 │ │ │ │ │ + 224 Vector* vector_; │ │ │ │ │ + 225}; │ │ │ │ │ + 226 │ │ │ │ │ + 227 │ │ │ │ │ + 228 │ │ │ │ │ + 229 │ │ │ │ │ + 230template │ │ │ │ │ +231HierarchicVectorWrapper<_V_> hierarchicVector(V& v) │ │ │ │ │ + 232{ │ │ │ │ │ + 233 return HierarchicVectorWrapper(v); │ │ │ │ │ + 234} │ │ │ │ │ + 235 │ │ │ │ │ + 236 │ │ │ │ │ + 237 │ │ │ │ │ + 238template(), │ │ │ │ │ +int>::type = 0> │ │ │ │ │ +240V& makeHierarchicVectorForMultiIndex(V& v) │ │ │ │ │ + 241{ │ │ │ │ │ + 242 return v; │ │ │ │ │ + 243} │ │ │ │ │ + 244 │ │ │ │ │ + 245 │ │ │ │ │ + 246 │ │ │ │ │ + 247template(), int>::type = 0> │ │ │ │ │ +249HierarchicVectorWrapper<_V_> makeHierarchicVectorForMultiIndex(V& v) │ │ │ │ │ + 250{ │ │ │ │ │ + 251 return HierarchicVectorWrapper(v); │ │ │ │ │ + 252} │ │ │ │ │ + 253 │ │ │ │ │ + 254 │ │ │ │ │ + 255 │ │ │ │ │ + 256} // namespace Dune::Functions │ │ │ │ │ + 257} // namespace Dune │ │ │ │ │ + 258 │ │ │ │ │ + 259 │ │ │ │ │ + 260#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICVECTORWRAPPER_HH │ │ │ │ │ +indexaccess.hh │ │ │ │ │ +type_traits.hh │ │ │ │ │ +utility.hh │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::bindTree │ │ │ │ │ -void bindTree(Tree &tree, const Entity &entity, std::size_t offset=0) │ │ │ │ │ -Definition: nodes.hh:253 │ │ │ │ │ -Dune::Functions::initializeTree │ │ │ │ │ -void initializeTree(Tree &tree, std::size_t treeIndexOffset=0) │ │ │ │ │ -Definition: nodes.hh:260 │ │ │ │ │ -Dune::Functions::StaticMultiIndex │ │ │ │ │ -A statically sized MultiIndex type. │ │ │ │ │ -Definition: multiindex.hh:25 │ │ │ │ │ -Dune::Functions::OverflowArray │ │ │ │ │ -A dynamically sized array-like class with overflow. │ │ │ │ │ -Definition: overflowarray.hh:45 │ │ │ │ │ -Dune::Functions::DefaultLocalView │ │ │ │ │ -The restriction of a finite element basis to a single element. │ │ │ │ │ -Definition: defaultlocalview.hh:28 │ │ │ │ │ -Dune::Functions::DefaultLocalView::PreBasis │ │ │ │ │ -typename GlobalBasis::PreBasis PreBasis │ │ │ │ │ -Definition: defaultlocalview.hh:48 │ │ │ │ │ -Dune::Functions::DefaultLocalView::unbind │ │ │ │ │ -void unbind() │ │ │ │ │ -Unbind from the current element. │ │ │ │ │ -Definition: defaultlocalview.hh:116 │ │ │ │ │ -Dune::Functions::DefaultLocalView::bound │ │ │ │ │ -bool bound() const │ │ │ │ │ -Return if the view is bound to a grid element. │ │ │ │ │ -Definition: defaultlocalview.hh:98 │ │ │ │ │ -Dune::Functions::DefaultLocalView::GridView │ │ │ │ │ -typename GlobalBasis::GridView GridView │ │ │ │ │ -The grid view the global FE basis lives on. │ │ │ │ │ -Definition: defaultlocalview.hh:35 │ │ │ │ │ -Dune::Functions::DefaultLocalView::index │ │ │ │ │ -const MultiIndex & index(size_type i) const │ │ │ │ │ -Maps from subtree index set [0..size-1] to a globally unique multi index in │ │ │ │ │ -global basis. │ │ │ │ │ -Definition: defaultlocalview.hh:149 │ │ │ │ │ -Dune::Functions::DefaultLocalView::element_ │ │ │ │ │ -std::optional< Element > element_ │ │ │ │ │ -Definition: defaultlocalview.hh:168 │ │ │ │ │ -Dune::Functions::DefaultLocalView::Element │ │ │ │ │ -typename GridView::template Codim< 0 >::Entity Element │ │ │ │ │ -Type of the grid element we are bound to. │ │ │ │ │ -Definition: defaultlocalview.hh:38 │ │ │ │ │ -Dune::Functions::DefaultLocalView::tree │ │ │ │ │ -const Tree & tree() const │ │ │ │ │ -Return the local ansatz tree associated to the bound entity. │ │ │ │ │ -Definition: defaultlocalview.hh:125 │ │ │ │ │ -Dune::Functions::DefaultLocalView::bind │ │ │ │ │ -void bind(const Element &e) │ │ │ │ │ -Bind the view to a grid element. │ │ │ │ │ -Definition: defaultlocalview.hh:81 │ │ │ │ │ -Dune::Functions::DefaultLocalView::element │ │ │ │ │ -const Element & element() const │ │ │ │ │ -Return the grid element that the view is bound to. │ │ │ │ │ -Definition: defaultlocalview.hh:107 │ │ │ │ │ -Dune::Functions::DefaultLocalView::size │ │ │ │ │ -size_type size() const │ │ │ │ │ -Total number of degrees of freedom on this element. │ │ │ │ │ -Definition: defaultlocalview.hh:132 │ │ │ │ │ -Dune::Functions::DefaultLocalView::GlobalBasis │ │ │ │ │ -GB GlobalBasis │ │ │ │ │ -The global FE basis that this is a view on. │ │ │ │ │ -Definition: defaultlocalview.hh:32 │ │ │ │ │ -Dune::Functions::DefaultLocalView::tree_ │ │ │ │ │ -Tree tree_ │ │ │ │ │ -Definition: defaultlocalview.hh:169 │ │ │ │ │ -Dune::Functions::DefaultLocalView::maxSize │ │ │ │ │ -size_type maxSize() const │ │ │ │ │ -Maximum local size for any element on the GridView. │ │ │ │ │ -Definition: defaultlocalview.hh:143 │ │ │ │ │ -Dune::Functions::DefaultLocalView::size_type │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -The type used for sizes. │ │ │ │ │ -Definition: defaultlocalview.hh:41 │ │ │ │ │ -Dune::Functions::DefaultLocalView::isBound │ │ │ │ │ -bool isBound() const │ │ │ │ │ -Return if the view is bound to a grid element. │ │ │ │ │ -Definition: defaultlocalview.hh:92 │ │ │ │ │ -Dune::Functions::DefaultLocalView::rootLocalView │ │ │ │ │ -const DefaultLocalView & rootLocalView() const │ │ │ │ │ -Definition: defaultlocalview.hh:161 │ │ │ │ │ -Dune::Functions::DefaultLocalView::MultiIndexStorage │ │ │ │ │ -std::conditional_t<(PreBasis::minMultiIndexSize==PreBasis::maxMultiIndexSize), │ │ │ │ │ -OverflowArray< StaticMultiIndex< size_type, PreBasis::maxMultiIndexSize >, │ │ │ │ │ -PreBasis::multiIndexBufferSize >, Dune::ReservedVector< size_type, PreBasis:: │ │ │ │ │ -multiIndexBufferSize > > MultiIndexStorage │ │ │ │ │ -Definition: defaultlocalview.hh:56 │ │ │ │ │ -Dune::Functions::DefaultLocalView::MultiIndex │ │ │ │ │ -std::conditional_t<(PreBasis::minMultiIndexSize==PreBasis::maxMultiIndexSize), │ │ │ │ │ -StaticMultiIndex< size_type, PreBasis::maxMultiIndexSize >, Dune:: │ │ │ │ │ -ReservedVector< size_type, PreBasis::multiIndexBufferSize > > MultiIndex │ │ │ │ │ -Type used for global numbering of the basis vectors. │ │ │ │ │ -Definition: defaultlocalview.hh:64 │ │ │ │ │ -Dune::Functions::DefaultLocalView::indices_ │ │ │ │ │ -std::vector< MultiIndexStorage > indices_ │ │ │ │ │ -Definition: defaultlocalview.hh:170 │ │ │ │ │ -Dune::Functions::DefaultLocalView::Tree │ │ │ │ │ -typename GlobalBasis::PreBasis::Node Tree │ │ │ │ │ -Tree of local finite elements / local shape function sets. │ │ │ │ │ -Definition: defaultlocalview.hh:44 │ │ │ │ │ -Dune::Functions::DefaultLocalView::DefaultLocalView │ │ │ │ │ -DefaultLocalView(const GlobalBasis &globalBasis) │ │ │ │ │ -Construct local view for a given global finite element basis. │ │ │ │ │ -Definition: defaultlocalview.hh:68 │ │ │ │ │ -Dune::Functions::DefaultLocalView::globalBasis_ │ │ │ │ │ -const GlobalBasis * globalBasis_ │ │ │ │ │ -Definition: defaultlocalview.hh:167 │ │ │ │ │ -Dune::Functions::DefaultLocalView::globalBasis │ │ │ │ │ -const GlobalBasis & globalBasis() const │ │ │ │ │ -Return the global basis that we are a view on. │ │ │ │ │ -Definition: defaultlocalview.hh:156 │ │ │ │ │ +Dune::Functions::makeHierarchicVectorForMultiIndex │ │ │ │ │ +V & makeHierarchicVectorForMultiIndex(V &v) │ │ │ │ │ +Definition: hierarchicvectorwrapper.hh:240 │ │ │ │ │ +Dune::Functions::hierarchicVector │ │ │ │ │ +HierarchicVectorWrapper< V > hierarchicVector(V &v) │ │ │ │ │ +Definition: hierarchicvectorwrapper.hh:231 │ │ │ │ │ +Dune::Functions::HasStaticSize │ │ │ │ │ +Check if type is a statically sized container. │ │ │ │ │ +Definition: type_traits.hh:83 │ │ │ │ │ +Dune::Functions::HierarchicVectorWrapper │ │ │ │ │ +A wrapper providing multiindex access to vector entries. │ │ │ │ │ +Definition: hierarchicvectorwrapper.hh:92 │ │ │ │ │ +Dune::Functions::HierarchicVectorWrapper::operator() │ │ │ │ │ +Entry< MultiIndex > & operator()(const MultiIndex &index) │ │ │ │ │ +Definition: hierarchicvectorwrapper.hh:206 │ │ │ │ │ +Dune::Functions::HierarchicVectorWrapper::operator[] │ │ │ │ │ +Entry< MultiIndex > & operator[](const MultiIndex &index) │ │ │ │ │ +Definition: hierarchicvectorwrapper.hh:192 │ │ │ │ │ +Dune::Functions::HierarchicVectorWrapper::operator[] │ │ │ │ │ +const Entry< MultiIndex > & operator[](const MultiIndex &index) const │ │ │ │ │ +Definition: hierarchicvectorwrapper.hh:185 │ │ │ │ │ +Dune::Functions::HierarchicVectorWrapper::vector │ │ │ │ │ +Vector & vector() │ │ │ │ │ +Definition: hierarchicvectorwrapper.hh:217 │ │ │ │ │ +Dune::Functions::HierarchicVectorWrapper::Vector │ │ │ │ │ +V Vector │ │ │ │ │ +Definition: hierarchicvectorwrapper.hh:167 │ │ │ │ │ +Dune::Functions::HierarchicVectorWrapper::Entry │ │ │ │ │ +Coefficient< MultiIndex > Entry │ │ │ │ │ +Definition: hierarchicvectorwrapper.hh:170 │ │ │ │ │ +Dune::Functions::HierarchicVectorWrapper::vector │ │ │ │ │ +const Vector & vector() const │ │ │ │ │ +Definition: hierarchicvectorwrapper.hh:212 │ │ │ │ │ +Dune::Functions::HierarchicVectorWrapper::HierarchicVectorWrapper │ │ │ │ │ +HierarchicVectorWrapper(Vector &vector) │ │ │ │ │ +Definition: hierarchicvectorwrapper.hh:172 │ │ │ │ │ +Dune::Functions::HierarchicVectorWrapper::operator() │ │ │ │ │ +const Entry< MultiIndex > & operator()(const MultiIndex &index) const │ │ │ │ │ +Definition: hierarchicvectorwrapper.hh:199 │ │ │ │ │ +Dune::Functions::HierarchicVectorWrapper::resize │ │ │ │ │ +void resize(const SizeProvider &sizeProvider) │ │ │ │ │ +Definition: hierarchicvectorwrapper.hh:177 │ │ │ │ │ concepts.hh │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00134.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: lagrangebasis.hh File Reference │ │ │ │ +dune-functions: hierarchicnodetorangemap.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -64,64 +64,38 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Typedefs | │ │ │ │ -Functions
│ │ │ │ -
lagrangebasis.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
hierarchicnodetorangemap.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/localfunctions/lagrange.hh>
│ │ │ │ -#include <dune/localfunctions/lagrange/equidistantpoints.hh>
│ │ │ │ -#include <dune/localfunctions/lagrange/pqkfactory.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │ +
#include <utility>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <dune/common/concept.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │ +#include <dune/functions/common/indexaccess.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::LagrangePreBasis< GV, k, R >
 A pre-basis for a PQ-lagrange bases with given order. More...
 
class  Dune::Functions::LagrangeNode< GV, k, R >
struct  Dune::Functions::HierarchicNodeToRangeMap
 A simple node to range map using the nested tree indices. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
namespace  Dune::Functions::BasisFactory
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Typedefs

template<typename GV , int k = -1, typename R = double>
using Dune::Functions::LagrangeBasis = DefaultGlobalBasis< LagrangePreBasis< GV, k, R > >
 Nodal basis of a scalar k-th-order Lagrangean finite element space. More...
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<std::size_t k, typename R = double>
auto Dune::Functions::BasisFactory::lagrange ()
 Create a pre-basis factory that can create a Lagrange pre-basis. More...
 
template<typename R = double>
auto Dune::Functions::BasisFactory::lagrange (int order)
 Create a pre-basis factory that can create a Lagrange pre-basis with a run-time order. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,50 +5,27 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -Classes | Namespaces | Typedefs | Functions │ │ │ │ │ -lagrangebasis.hh File Reference │ │ │ │ │ +Classes | Namespaces │ │ │ │ │ +hierarchicnodetorangemap.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::LagrangePreBasis<_GV,_k,_R_> │ │ │ │ │ -  A pre-basis for a PQ-lagrange bases with given order. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::Functions::LagrangeNode<_GV,_k,_R_> │ │ │ │ │ +struct  Dune::Functions::HierarchicNodeToRangeMap │ │ │ │ │ +  A simple node to range map using the nested tree indices. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ -namespace  Dune::Functions::BasisFactory │ │ │ │ │ -  │ │ │ │ │ - Typedefs │ │ │ │ │ -template │ │ │ │ │ -using Dune::Functions::LagrangeBasis = DefaultGlobalBasis< LagrangePreBasis< │ │ │ │ │ - GV, k, R > > │ │ │ │ │ -  Nodal basis of a scalar k-th-order Lagrangean finite element space. │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ - Functions │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::BasisFactory::lagrange () │ │ │ │ │ -  Create a pre-basis factory that can create a Lagrange pre-basis. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::BasisFactory::lagrange (int order) │ │ │ │ │ -  Create a pre-basis factory that can create a Lagrange pre-basis with a │ │ │ │ │ - run-time order. More... │ │ │ │ │ -  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00134_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: lagrangebasis.hh Source File │ │ │ │ +dune-functions: hierarchicnodetorangemap.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,548 +62,67 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
lagrangebasis.hh
│ │ │ │ +
hierarchicnodetorangemap.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICNODETORANGEMAP_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICNODETORANGEMAP_HH
│ │ │ │
5
│ │ │ │ -
6#include <type_traits>
│ │ │ │ -
7#include <dune/common/exceptions.hh>
│ │ │ │ -
8
│ │ │ │ -
9#include <dune/localfunctions/lagrange.hh>
│ │ │ │ -
10#include <dune/localfunctions/lagrange/equidistantpoints.hh>
│ │ │ │ -
11#include <dune/localfunctions/lagrange/pqkfactory.hh>
│ │ │ │ -
12
│ │ │ │ - │ │ │ │ - │ │ │ │ -
15
│ │ │ │ -
16
│ │ │ │ -
17namespace Dune {
│ │ │ │ -
18namespace Functions {
│ │ │ │ +
6
│ │ │ │ +
7#include <utility>
│ │ │ │ +
8#include <type_traits>
│ │ │ │ +
9
│ │ │ │ +
10#include <dune/common/concept.hh>
│ │ │ │ +
11
│ │ │ │ + │ │ │ │ + │ │ │ │ +
14
│ │ │ │ +
15namespace Dune {
│ │ │ │ +
16namespace Functions {
│ │ │ │ +
17
│ │ │ │ +
18
│ │ │ │
19
│ │ │ │ -
20// *****************************************************************************
│ │ │ │ -
21// This is the reusable part of the LagrangeBasis. It contains
│ │ │ │ -
22//
│ │ │ │ -
23// LagrangePreBasis
│ │ │ │ -
24// LagrangeNode
│ │ │ │ -
25//
│ │ │ │ -
26// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ -
27// state. These components do _not_ depend on the global basis and local view
│ │ │ │ -
28// and can be used without a global basis.
│ │ │ │ -
29// *****************************************************************************
│ │ │ │ -
30
│ │ │ │ -
31template<typename GV, int k, typename R=double>
│ │ │ │ -
32class LagrangeNode;
│ │ │ │ -
33
│ │ │ │ -
34template<typename GV, int k, typename R=double>
│ │ │ │ -
35class LagrangePreBasis;
│ │ │ │ -
36
│ │ │ │ + │ │ │ │ +
30{
│ │ │ │ +
31 template<class Node, class TreePath, class Range,
│ │ │ │ +
32 std::enable_if_t< models<Concept::HasIndexAccess, Range, Dune::index_constant<0>>(), int> = 0>
│ │ │ │ +
33 decltype(auto) operator()(const Node&, const TreePath& treePath, Range&& y) const
│ │ │ │ +
34 {
│ │ │ │ +
35 return resolveStaticMultiIndex(y, treePath);
│ │ │ │ +
36 }
│ │ │ │
37
│ │ │ │ -
38
│ │ │ │ -
53template<typename GV, int k, typename R>
│ │ │ │ - │ │ │ │ -
55{
│ │ │ │ -
56 static const int dim = GV::dimension;
│ │ │ │ -
57 static const bool useDynamicOrder = (k<0);
│ │ │ │ -
58
│ │ │ │ -
59public:
│ │ │ │ -
60
│ │ │ │ -
62 using GridView = GV;
│ │ │ │ -
63
│ │ │ │ -
65 using size_type = std::size_t;
│ │ │ │ -
66
│ │ │ │ - │ │ │ │ -
69
│ │ │ │ -
70 static constexpr size_type maxMultiIndexSize = 1;
│ │ │ │ -
71 static constexpr size_type minMultiIndexSize = 1;
│ │ │ │ -
72 static constexpr size_type multiIndexBufferSize = 1;
│ │ │ │ -
73
│ │ │ │ - │ │ │ │ -
76 : LagrangePreBasis(gv, std::numeric_limits<unsigned int>::max())
│ │ │ │ -
77 {}
│ │ │ │ -
78
│ │ │ │ -
80 LagrangePreBasis(const GridView& gv, unsigned int order) :
│ │ │ │ - │ │ │ │ -
82 {
│ │ │ │ -
83 if (!useDynamicOrder && order!=std::numeric_limits<unsigned int>::max())
│ │ │ │ -
84 DUNE_THROW(RangeError, "Template argument k has to be -1 when supplying a run-time order!");
│ │ │ │ -
85
│ │ │ │ -
86 for (int i=0; i<=dim; i++)
│ │ │ │ -
87 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
90 }
│ │ │ │ - │ │ │ │ - │ │ │ │ -
93 }
│ │ │ │ -
94
│ │ │ │ - │ │ │ │ -
97 {
│ │ │ │ -
98 vertexOffset_ = 0;
│ │ │ │ - │ │ │ │ -
100
│ │ │ │ -
101 if (dim>=2)
│ │ │ │ -
102 {
│ │ │ │ - │ │ │ │ -
104
│ │ │ │ -
105 quadrilateralOffset_ = triangleOffset_ + dofsPerSimplex(2) * ((size_type)gridView_.size(Dune::GeometryTypes::triangle));
│ │ │ │ -
106 }
│ │ │ │ -
107
│ │ │ │ -
108 if (dim==3) {
│ │ │ │ -
109 tetrahedronOffset_ = quadrilateralOffset_ + dofsPerCube(2) * ((size_type)gridView_.size(Dune::GeometryTypes::quadrilateral));
│ │ │ │ -
110
│ │ │ │ -
111 prismOffset_ = tetrahedronOffset_ + dofsPerSimplex(3) * ((size_type)gridView_.size(Dune::GeometryTypes::tetrahedron));
│ │ │ │ -
112
│ │ │ │ -
113 hexahedronOffset_ = prismOffset_ + dofsPerPrism() * ((size_type)gridView_.size(Dune::GeometryTypes::prism));
│ │ │ │ -
114
│ │ │ │ -
115 pyramidOffset_ = hexahedronOffset_ + dofsPerCube(3) * ((size_type)gridView_.size(Dune::GeometryTypes::hexahedron));
│ │ │ │ -
116 }
│ │ │ │ -
117 }
│ │ │ │ -
118
│ │ │ │ -
120 const GridView& gridView() const
│ │ │ │ -
121 {
│ │ │ │ -
122 return gridView_;
│ │ │ │ -
123 }
│ │ │ │ -
124
│ │ │ │ -
126 void update (const GridView& gv)
│ │ │ │ -
127 {
│ │ │ │ -
128 gridView_ = gv;
│ │ │ │ -
129 }
│ │ │ │ -
130
│ │ │ │ - │ │ │ │ -
135 {
│ │ │ │ -
136 return Node{order_};
│ │ │ │ -
137 }
│ │ │ │ -
138
│ │ │ │ - │ │ │ │ -
141 {
│ │ │ │ -
142 switch (dim)
│ │ │ │ -
143 {
│ │ │ │ -
144 case 1:
│ │ │ │ -
145 return dofsPerCube(0) * ((size_type)gridView_.size(dim))
│ │ │ │ -
146 + dofsPerCube(1) * ((size_type)gridView_.size(dim-1));
│ │ │ │ -
147 case 2:
│ │ │ │ -
148 {
│ │ │ │ -
149 return dofsPerCube(0) * ((size_type)gridView_.size(dim))
│ │ │ │ -
150 + dofsPerCube(1) * ((size_type)gridView_.size(dim-1))
│ │ │ │ -
151 + dofsPerSimplex(2) * ((size_type)gridView_.size(Dune::GeometryTypes::triangle))
│ │ │ │ -
152 + dofsPerCube(2) * ((size_type)gridView_.size(Dune::GeometryTypes::quadrilateral));
│ │ │ │ -
153 }
│ │ │ │ -
154 case 3:
│ │ │ │ -
155 {
│ │ │ │ -
156 return dofsPerCube(0) * ((size_type)gridView_.size(dim))
│ │ │ │ -
157 + dofsPerCube(1) * ((size_type)gridView_.size(dim-1))
│ │ │ │ -
158 + dofsPerSimplex(2) * ((size_type)gridView_.size(Dune::GeometryTypes::triangle))
│ │ │ │ -
159 + dofsPerCube(2) * ((size_type)gridView_.size(Dune::GeometryTypes::quadrilateral))
│ │ │ │ -
160 + dofsPerSimplex(3) * ((size_type)gridView_.size(Dune::GeometryTypes::tetrahedron))
│ │ │ │ -
161 + dofsPerPyramid() * ((size_type)gridView_.size(Dune::GeometryTypes::pyramid))
│ │ │ │ -
162 + dofsPerPrism() * ((size_type)gridView_.size(Dune::GeometryTypes::prism))
│ │ │ │ -
163 + dofsPerCube(3) * ((size_type)gridView_.size(Dune::GeometryTypes::hexahedron));
│ │ │ │ -
164 }
│ │ │ │ -
165 }
│ │ │ │ -
166 DUNE_THROW(Dune::NotImplemented, "No size method for " << dim << "d grids available yet!");
│ │ │ │ -
167 }
│ │ │ │ -
168
│ │ │ │ -
170 template<class SizePrefix>
│ │ │ │ -
171 size_type size(const SizePrefix& prefix) const
│ │ │ │ -
172 {
│ │ │ │ -
173 assert(prefix.size() == 0 || prefix.size() == 1);
│ │ │ │ -
174 return (prefix.size() == 0) ? size() : 0;
│ │ │ │ -
175 }
│ │ │ │ -
176
│ │ │ │ - │ │ │ │ -
179 {
│ │ │ │ -
180 return size();
│ │ │ │ -
181 }
│ │ │ │ -
182
│ │ │ │ - │ │ │ │ -
185 {
│ │ │ │ -
186 // That cast to unsigned int is necessary because GV::dimension is an enum,
│ │ │ │ -
187 // which is not recognized by the power method as an integer type...
│ │ │ │ -
188 return power(order()+1, (unsigned int)GV::dimension);
│ │ │ │ -
189 }
│ │ │ │ -
190
│ │ │ │ -
191 template<typename It>
│ │ │ │ -
192 It indices(const Node& node, It it) const
│ │ │ │ -
193 {
│ │ │ │ -
194 for (size_type i = 0, end = node.finiteElement().size() ; i < end ; ++it, ++i)
│ │ │ │ -
195 {
│ │ │ │ -
196 Dune::LocalKey localKey = node.finiteElement().localCoefficients().localKey(i);
│ │ │ │ -
197 const auto& gridIndexSet = gridView().indexSet();
│ │ │ │ -
198 const auto& element = node.element();
│ │ │ │ -
199
│ │ │ │ -
200 // The dimension of the entity that the current dof is related to
│ │ │ │ -
201 auto dofDim = dim - localKey.codim();
│ │ │ │ -
202
│ │ │ │ -
203 // Test for a vertex dof
│ │ │ │ -
204 // The test for k==1 is redundant, but having it here allows the compiler to conclude
│ │ │ │ -
205 // at compile-time that the dofDim==0 case is the only one that will ever happen.
│ │ │ │ -
206 // This leads to measurable speed-up: see
│ │ │ │ -
207 // https://gitlab.dune-project.org/staging/dune-functions/issues/30
│ │ │ │ -
208 if (k==1 || dofDim==0) {
│ │ │ │ -
209 *it = {{ (size_type)(gridIndexSet.subIndex(element,localKey.subEntity(),dim)) }};
│ │ │ │ -
210 continue;
│ │ │ │ -
211 }
│ │ │ │ -
212
│ │ │ │ -
213 if (dofDim==1)
│ │ │ │ -
214 { // edge dof
│ │ │ │ -
215 if (dim==1) // element dof -- any local numbering is fine
│ │ │ │ -
216 {
│ │ │ │ -
217 *it = {{ edgeOffset_
│ │ │ │ -
218 + dofsPerCube(1) * ((size_type)gridIndexSet.subIndex(element,0,0))
│ │ │ │ -
219 + localKey.index() }};
│ │ │ │ -
220 continue;
│ │ │ │ -
221 }
│ │ │ │ -
222 else
│ │ │ │ -
223 {
│ │ │ │ -
224 const auto refElement
│ │ │ │ -
225 = Dune::referenceElement<double,dim>(element.type());
│ │ │ │ -
226
│ │ │ │ -
227 // We have to reverse the numbering if the local element edge is
│ │ │ │ -
228 // not aligned with the global edge.
│ │ │ │ -
229 auto v0 = (size_type)gridIndexSet.subIndex(element,refElement.subEntity(localKey.subEntity(),localKey.codim(),0,dim),dim);
│ │ │ │ -
230 auto v1 = (size_type)gridIndexSet.subIndex(element,refElement.subEntity(localKey.subEntity(),localKey.codim(),1,dim),dim);
│ │ │ │ -
231 bool flip = (v0 > v1);
│ │ │ │ -
232 *it = {{ (flip)
│ │ │ │ - │ │ │ │ -
234 + dofsPerCube(1)*((size_type)gridIndexSet.subIndex(element,localKey.subEntity(),localKey.codim()))
│ │ │ │ -
235 + (dofsPerCube(1)-1)-localKey.index()
│ │ │ │ - │ │ │ │ -
237 + dofsPerCube(1)*((size_type)gridIndexSet.subIndex(element,localKey.subEntity(),localKey.codim()))
│ │ │ │ -
238 + localKey.index() }};
│ │ │ │ -
239 continue;
│ │ │ │ -
240 }
│ │ │ │ -
241 }
│ │ │ │ -
242
│ │ │ │ -
243 if (dofDim==2)
│ │ │ │ -
244 {
│ │ │ │ -
245 if (dim==2) // element dof -- any local numbering is fine
│ │ │ │ -
246 {
│ │ │ │ -
247 if (element.type().isTriangle())
│ │ │ │ -
248 {
│ │ │ │ -
249 *it = {{ triangleOffset_ + dofsPerSimplex(2)*((size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }};
│ │ │ │ -
250 continue;
│ │ │ │ -
251 }
│ │ │ │ -
252 else if (element.type().isQuadrilateral())
│ │ │ │ -
253 {
│ │ │ │ -
254 *it = {{ quadrilateralOffset_ + dofsPerCube(2)*((size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }};
│ │ │ │ -
255 continue;
│ │ │ │ -
256 }
│ │ │ │ -
257 else
│ │ │ │ -
258 DUNE_THROW(Dune::NotImplemented, "2d elements have to be triangles or quadrilaterals");
│ │ │ │ -
259 } else
│ │ │ │ -
260 {
│ │ │ │ -
261 const auto refElement
│ │ │ │ -
262 = Dune::referenceElement<double,dim>(element.type());
│ │ │ │ -
263
│ │ │ │ -
264 if (order()>3)
│ │ │ │ -
265 DUNE_THROW(Dune::NotImplemented, "LagrangeBasis for 3D grids is only implemented if k<=3");
│ │ │ │ -
266
│ │ │ │ -
267 if (order()==3 and !refElement.type(localKey.subEntity(), localKey.codim()).isTriangle())
│ │ │ │ -
268 DUNE_THROW(Dune::NotImplemented, "LagrangeBasis for 3D grids with k==3 is only implemented if the grid is a simplex grid");
│ │ │ │ -
269
│ │ │ │ -
270 *it = {{ triangleOffset_ + ((size_type)gridIndexSet.subIndex(element,localKey.subEntity(),localKey.codim())) }};
│ │ │ │ -
271 continue;
│ │ │ │ -
272 }
│ │ │ │ -
273 }
│ │ │ │ -
274
│ │ │ │ -
275 if (dofDim==3)
│ │ │ │ -
276 {
│ │ │ │ -
277 if (dim==3) // element dof -- any local numbering is fine
│ │ │ │ -
278 {
│ │ │ │ -
279 if (element.type().isTetrahedron())
│ │ │ │ -
280 {
│ │ │ │ -
281 *it = {{ tetrahedronOffset_ + dofsPerSimplex(3)*((size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }};
│ │ │ │ -
282 continue;
│ │ │ │ -
283 }
│ │ │ │ -
284 else if (element.type().isHexahedron())
│ │ │ │ -
285 {
│ │ │ │ -
286 *it = {{ hexahedronOffset_ + dofsPerCube(3)*((size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }};
│ │ │ │ -
287 continue;
│ │ │ │ -
288 }
│ │ │ │ -
289 else if (element.type().isPrism())
│ │ │ │ -
290 {
│ │ │ │ -
291 *it = {{ prismOffset_ + dofsPerPrism()*((size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }};
│ │ │ │ -
292 continue;
│ │ │ │ -
293 }
│ │ │ │ -
294 else if (element.type().isPyramid())
│ │ │ │ -
295 {
│ │ │ │ -
296 *it = {{ pyramidOffset_ + dofsPerPyramid()*((size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }};
│ │ │ │ -
297 continue;
│ │ │ │ -
298 }
│ │ │ │ -
299 else
│ │ │ │ -
300 DUNE_THROW(Dune::NotImplemented, "3d elements have to be tetrahedra, hexahedra, prisms, or pyramids");
│ │ │ │ -
301 } else
│ │ │ │ -
302 DUNE_THROW(Dune::NotImplemented, "Grids of dimension larger than 3 are no supported");
│ │ │ │ -
303 }
│ │ │ │ -
304 DUNE_THROW(Dune::NotImplemented, "Grid contains elements not supported for the LagrangeBasis");
│ │ │ │ -
305 }
│ │ │ │ -
306 return it;
│ │ │ │ -
307 }
│ │ │ │ -
308
│ │ │ │ -
310 unsigned int order() const
│ │ │ │ -
311 {
│ │ │ │ -
312 return (useDynamicOrder) ? order_ : k;
│ │ │ │ -
313 }
│ │ │ │ -
314
│ │ │ │ -
315protected:
│ │ │ │ - │ │ │ │ -
317
│ │ │ │ -
318 // Run-time order, only valid if k<0
│ │ │ │ -
319 const unsigned int order_;
│ │ │ │ -
320
│ │ │ │ -
322 size_type dofsPerSimplex(std::size_t simplexDim) const
│ │ │ │ -
323 {
│ │ │ │ -
324 return useDynamicOrder ? dofsPerSimplex_[simplexDim] : computeDofsPerSimplex(simplexDim);
│ │ │ │ -
325 }
│ │ │ │ -
326
│ │ │ │ -
328 size_type dofsPerCube(std::size_t cubeDim) const
│ │ │ │ -
329 {
│ │ │ │ -
330 return useDynamicOrder ? dofsPerCube_[cubeDim] : computeDofsPerCube(cubeDim);
│ │ │ │ -
331 }
│ │ │ │ -
332
│ │ │ │ - │ │ │ │ -
334 {
│ │ │ │ -
335 return useDynamicOrder ? dofsPerPrism_ : computeDofsPerPrism();
│ │ │ │ -
336 }
│ │ │ │ -
337
│ │ │ │ - │ │ │ │ -
339 {
│ │ │ │ -
340 return useDynamicOrder ? dofsPerPyramid_ : computeDofsPerPyramid();
│ │ │ │ -
341 }
│ │ │ │ -
342
│ │ │ │ -
344 size_type computeDofsPerSimplex(std::size_t simplexDim) const
│ │ │ │ -
345 {
│ │ │ │ -
346 return order() == 0 ? (dim == simplexDim ? 1 : 0) : Dune::binomial(std::size_t(order()-1),simplexDim);
│ │ │ │ -
347 }
│ │ │ │ -
348
│ │ │ │ -
350 size_type computeDofsPerCube(std::size_t cubeDim) const
│ │ │ │ -
351 {
│ │ │ │ -
352 return order() == 0 ? (dim == cubeDim ? 1 : 0) : Dune::power(order()-1, cubeDim);
│ │ │ │ -
353 }
│ │ │ │ -
354
│ │ │ │ - │ │ │ │ -
356 {
│ │ │ │ -
357 return order() == 0 ? (dim == 3 ? 1 : 0) : (order()-1)*(order()-1)*(order()-2)/2;
│ │ │ │ -
358 }
│ │ │ │ -
359
│ │ │ │ - │ │ │ │ -
361 {
│ │ │ │ -
362 return order() == 0 ? (dim == 3 ? 1 : 0) : (order()-2)*(order()-1)*(2*order()-3)/6;
│ │ │ │ -
363 }
│ │ │ │ -
364
│ │ │ │ -
365 // When the order is given at run-time, the following numbers are pre-computed:
│ │ │ │ -
366 std::array<size_type,dim+1> dofsPerSimplex_;
│ │ │ │ -
367 std::array<size_type,dim+1> dofsPerCube_;
│ │ │ │ - │ │ │ │ - │ │ │ │ -
370
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
379
│ │ │ │ -
380};
│ │ │ │ -
381
│ │ │ │ -
382
│ │ │ │ -
383
│ │ │ │ -
384template<typename GV, int k, typename R>
│ │ │ │ - │ │ │ │ -
386 public LeafBasisNode
│ │ │ │ -
387{
│ │ │ │ -
388 // Stores LocalFiniteElement implementations with run-time order as a function of GeometryType
│ │ │ │ -
389 template<typename Domain, typename Range, int dim>
│ │ │ │ -
390 class LagrangeRunTimeLFECache
│ │ │ │ -
391 {
│ │ │ │ -
392 public:
│ │ │ │ -
393 using FiniteElementType = LagrangeLocalFiniteElement<EquidistantPointSet,dim,Domain,Range>;
│ │ │ │ -
394
│ │ │ │ -
395 const FiniteElementType& get(GeometryType type)
│ │ │ │ -
396 {
│ │ │ │ -
397 auto i = data_.find(type);
│ │ │ │ -
398 if (i==data_.end())
│ │ │ │ -
399 i = data_.emplace(type,FiniteElementType(type,order_)).first;
│ │ │ │ -
400 return (*i).second;
│ │ │ │ -
401 }
│ │ │ │ -
402
│ │ │ │ -
403 std::map<GeometryType, FiniteElementType> data_;
│ │ │ │ -
404 unsigned int order_;
│ │ │ │ -
405 };
│ │ │ │ -
406
│ │ │ │ -
407 static constexpr int dim = GV::dimension;
│ │ │ │ -
408 static constexpr bool useDynamicOrder = (k<0);
│ │ │ │ -
409
│ │ │ │ -
410 using FiniteElementCache = typename std::conditional<(useDynamicOrder),
│ │ │ │ -
411 LagrangeRunTimeLFECache<typename GV::ctype, R, dim>,
│ │ │ │ -
412 PQkLocalFiniteElementCache<typename GV::ctype, R, dim, k>
│ │ │ │ -
413 >::type;
│ │ │ │ -
414
│ │ │ │ -
415public:
│ │ │ │ -
416
│ │ │ │ -
417 using size_type = std::size_t;
│ │ │ │ -
418 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ -
419 using FiniteElement = typename FiniteElementCache::FiniteElementType;
│ │ │ │ -
420
│ │ │ │ - │ │ │ │ -
423 finiteElement_(nullptr),
│ │ │ │ -
424 element_(nullptr)
│ │ │ │ -
425 {}
│ │ │ │ -
426
│ │ │ │ -
428 LagrangeNode(unsigned int order) :
│ │ │ │ -
429 order_(order),
│ │ │ │ -
430 finiteElement_(nullptr),
│ │ │ │ -
431 element_(nullptr)
│ │ │ │ -
432 {
│ │ │ │ -
433 // Only the cache for the run-time-order case (i.e., k<0), has the 'order_' member
│ │ │ │ -
434 if constexpr (useDynamicOrder)
│ │ │ │ -
435 cache_.order_ = order;
│ │ │ │ -
436 }
│ │ │ │ -
437
│ │ │ │ -
439 const Element& element() const
│ │ │ │ -
440 {
│ │ │ │ -
441 return *element_;
│ │ │ │ -
442 }
│ │ │ │ -
443
│ │ │ │ - │ │ │ │ -
449 {
│ │ │ │ -
450 return *finiteElement_;
│ │ │ │ -
451 }
│ │ │ │ -
452
│ │ │ │ -
454 void bind(const Element& e)
│ │ │ │ -
455 {
│ │ │ │ -
456 element_ = &e;
│ │ │ │ -
457 finiteElement_ = &(cache_.get(element_->type()));
│ │ │ │ -
458 this->setSize(finiteElement_->size());
│ │ │ │ -
459 }
│ │ │ │ -
460
│ │ │ │ -
461protected:
│ │ │ │ -
462
│ │ │ │ -
463 unsigned int order() const
│ │ │ │ -
464 {
│ │ │ │ -
465 return (useDynamicOrder) ? order_ : k;
│ │ │ │ -
466 }
│ │ │ │ -
467
│ │ │ │ -
468 // Run-time order, only valid if k<0
│ │ │ │ -
469 unsigned int order_;
│ │ │ │ -
470
│ │ │ │ -
471 FiniteElementCache cache_;
│ │ │ │ - │ │ │ │ - │ │ │ │ -
474};
│ │ │ │ -
475
│ │ │ │ -
476
│ │ │ │ -
477
│ │ │ │ -
478namespace BasisFactory {
│ │ │ │ -
479
│ │ │ │ -
488template<std::size_t k, typename R=double>
│ │ │ │ - │ │ │ │ -
490{
│ │ │ │ -
491 return [](const auto& gridView) {
│ │ │ │ -
492 return LagrangePreBasis<std::decay_t<decltype(gridView)>, k, R>(gridView);
│ │ │ │ -
493 };
│ │ │ │ -
494}
│ │ │ │ -
495
│ │ │ │ -
503template<typename R=double>
│ │ │ │ -
504auto lagrange(int order)
│ │ │ │ -
505{
│ │ │ │ -
506 return [=](const auto& gridView) {
│ │ │ │ -
507 return LagrangePreBasis<std::decay_t<decltype(gridView)>, -1, R>(gridView, order);
│ │ │ │ -
508 };
│ │ │ │ -
509}
│ │ │ │ -
510
│ │ │ │ -
511} // end namespace BasisFactory
│ │ │ │ -
512
│ │ │ │ -
513
│ │ │ │ -
514
│ │ │ │ -
538template<typename GV, int k=-1, typename R=double>
│ │ │ │ - │ │ │ │ -
540
│ │ │ │ -
541
│ │ │ │ -
542
│ │ │ │ -
543
│ │ │ │ -
544
│ │ │ │ -
545} // end namespace Functions
│ │ │ │ -
546} // end namespace Dune
│ │ │ │ -
547
│ │ │ │ -
548
│ │ │ │ -
549#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ -
auto power(ChildPreBasisFactory &&childPreBasisFactory, const IndexMergingStrategy &)
Create a pre-basis factory that can build a PowerPreBasis.
Definition: powerbasis.hh:369
│ │ │ │ -
auto lagrange()
Create a pre-basis factory that can create a Lagrange pre-basis.
Definition: lagrangebasis.hh:489
│ │ │ │ +
38 template<class Node, class TreePath, class Range,
│ │ │ │ +
39 std::enable_if_t<not models<Concept::HasIndexAccess, Range, Dune::index_constant<0>>(), int> = 0>
│ │ │ │ +
40 decltype(auto) operator()(const Node&, const TreePath&, Range&& y) const
│ │ │ │ +
41 {
│ │ │ │ +
42 return std::forward<Range>(y);
│ │ │ │ +
43 }
│ │ │ │ +
44};
│ │ │ │ +
45
│ │ │ │ +
46
│ │ │ │ +
47
│ │ │ │ +
48} // namespace Dune::Functions
│ │ │ │ +
49} // namespace Dune
│ │ │ │ +
50
│ │ │ │ +
51
│ │ │ │ +
52#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICNODETORANGEMAP_HH
│ │ │ │ + │ │ │ │ +
constexpr decltype(auto) resolveStaticMultiIndex(C &&c, const MultiIndex &multiIndex)
Provide multi-index access by chaining operator[].
Definition: indexaccess.hh:398
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
Global basis for given pre-basis.
Definition: defaultglobalbasis.hh:46
│ │ │ │ -
Definition: lagrangebasis.hh:387
│ │ │ │ -
LagrangeNode(unsigned int order)
Constructor with a run-time order.
Definition: lagrangebasis.hh:428
│ │ │ │ -
unsigned int order() const
Definition: lagrangebasis.hh:463
│ │ │ │ -
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition: lagrangebasis.hh:448
│ │ │ │ -
const Element * element_
Definition: lagrangebasis.hh:473
│ │ │ │ -
const Element & element() const
Return current element, throw if unbound.
Definition: lagrangebasis.hh:439
│ │ │ │ -
FiniteElementCache cache_
Definition: lagrangebasis.hh:471
│ │ │ │ -
typename FiniteElementCache::FiniteElementType FiniteElement
Definition: lagrangebasis.hh:419
│ │ │ │ -
void bind(const Element &e)
Bind to element.
Definition: lagrangebasis.hh:454
│ │ │ │ -
typename GV::template Codim< 0 >::Entity Element
Definition: lagrangebasis.hh:418
│ │ │ │ -
const FiniteElement * finiteElement_
Definition: lagrangebasis.hh:472
│ │ │ │ -
unsigned int order_
Definition: lagrangebasis.hh:469
│ │ │ │ -
std::size_t size_type
Definition: lagrangebasis.hh:417
│ │ │ │ -
LagrangeNode()
Constructor without order (uses the compile-time value)
Definition: lagrangebasis.hh:422
│ │ │ │ -
A pre-basis for a PQ-lagrange bases with given order.
Definition: lagrangebasis.hh:55
│ │ │ │ -
size_type dofsPerPrism() const
Definition: lagrangebasis.hh:333
│ │ │ │ -
size_type computeDofsPerCube(std::size_t cubeDim) const
Number of degrees of freedom assigned to a cube (without the ones assigned to its faces!...
Definition: lagrangebasis.hh:350
│ │ │ │ -
size_type computeDofsPerSimplex(std::size_t simplexDim) const
Number of degrees of freedom assigned to a simplex (without the ones assigned to its faces!...
Definition: lagrangebasis.hh:344
│ │ │ │ -
static constexpr size_type maxMultiIndexSize
Definition: lagrangebasis.hh:70
│ │ │ │ -
size_type computeDofsPerPrism() const
Definition: lagrangebasis.hh:355
│ │ │ │ -
size_type edgeOffset_
Definition: lagrangebasis.hh:372
│ │ │ │ -
std::array< size_type, dim+1 > dofsPerSimplex_
Definition: lagrangebasis.hh:366
│ │ │ │ -
It indices(const Node &node, It it) const
Definition: lagrangebasis.hh:192
│ │ │ │ -
size_type vertexOffset_
Definition: lagrangebasis.hh:371
│ │ │ │ -
size_type dofsPerSimplex(std::size_t simplexDim) const
Number of degrees of freedom assigned to a simplex (without the ones assigned to its faces!...
Definition: lagrangebasis.hh:322
│ │ │ │ -
std::size_t size_type
Type used for indices and size information.
Definition: lagrangebasis.hh:65
│ │ │ │ -
size_type pyramidOffset_
Definition: lagrangebasis.hh:376
│ │ │ │ -
size_type prismOffset_
Definition: lagrangebasis.hh:377
│ │ │ │ -
size_type tetrahedronOffset_
Definition: lagrangebasis.hh:375
│ │ │ │ -
void initializeIndices()
Initialize the global indices.
Definition: lagrangebasis.hh:96
│ │ │ │ -
size_type computeDofsPerPyramid() const
Definition: lagrangebasis.hh:360
│ │ │ │ -
LagrangePreBasis(const GridView &gv, unsigned int order)
Constructor for a given grid view object and run-time order.
Definition: lagrangebasis.hh:80
│ │ │ │ -
size_type dofsPerPyramid_
Definition: lagrangebasis.hh:369
│ │ │ │ -
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition: lagrangebasis.hh:178
│ │ │ │ -
LagrangePreBasis(const GridView &gv)
Constructor for a given grid view object with compile-time order.
Definition: lagrangebasis.hh:75
│ │ │ │ -
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition: lagrangebasis.hh:126
│ │ │ │ -
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition: lagrangebasis.hh:171
│ │ │ │ -
static constexpr size_type multiIndexBufferSize
Definition: lagrangebasis.hh:72
│ │ │ │ -
GV GridView
The grid view that the FE basis is defined on.
Definition: lagrangebasis.hh:62
│ │ │ │ -
size_type quadrilateralOffset_
Definition: lagrangebasis.hh:374
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: lagrangebasis.hh:120
│ │ │ │ -
GridView gridView_
Definition: lagrangebasis.hh:316
│ │ │ │ -
Node makeNode() const
Create tree node.
Definition: lagrangebasis.hh:134
│ │ │ │ -
unsigned int order() const
Polynomial order used in the local Lagrange finite-elements.
Definition: lagrangebasis.hh:310
│ │ │ │ -
const unsigned int order_
Definition: lagrangebasis.hh:319
│ │ │ │ -
std::array< size_type, dim+1 > dofsPerCube_
Definition: lagrangebasis.hh:367
│ │ │ │ -
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition: lagrangebasis.hh:184
│ │ │ │ -
size_type size() const
Same as size(prefix) with empty prefix.
Definition: lagrangebasis.hh:140
│ │ │ │ -
size_type dofsPerPrism_
Definition: lagrangebasis.hh:368
│ │ │ │ -
size_type dofsPerCube(std::size_t cubeDim) const
Number of degrees of freedom assigned to a cube (without the ones assigned to its faces!...
Definition: lagrangebasis.hh:328
│ │ │ │ -
size_type triangleOffset_
Definition: lagrangebasis.hh:373
│ │ │ │ -
size_type hexahedronOffset_
Definition: lagrangebasis.hh:378
│ │ │ │ -
static constexpr size_type minMultiIndexSize
Definition: lagrangebasis.hh:71
│ │ │ │ -
size_type dofsPerPyramid() const
Definition: lagrangebasis.hh:338
│ │ │ │ -
void setSize(const size_type size)
Definition: nodes.hh:164
│ │ │ │ -
Definition: nodes.hh:186
│ │ │ │ +
A simple node to range map using the nested tree indices.
Definition: hierarchicnodetorangemap.hh:30
│ │ │ │ +
decltype(auto) operator()(const Node &, const TreePath &treePath, Range &&y) const
Definition: hierarchicnodetorangemap.hh:33
│ │ │ │ +
decltype(auto) operator()(const Node &, const TreePath &, Range &&y) const
Definition: hierarchicnodetorangemap.hh:40
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,744 +5,77 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -lagrangebasis.hh │ │ │ │ │ +hierarchicnodetorangemap.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICNODETORANGEMAP_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICNODETORANGEMAP_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ - 8 │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12 │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include │ │ │ │ │ - 15 │ │ │ │ │ - 16 │ │ │ │ │ - 17namespace Dune { │ │ │ │ │ - 18namespace Functions { │ │ │ │ │ + 6 │ │ │ │ │ + 7#include │ │ │ │ │ + 8#include │ │ │ │ │ + 9 │ │ │ │ │ + 10#include │ │ │ │ │ + 11 │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14 │ │ │ │ │ + 15namespace Dune { │ │ │ │ │ + 16namespace Functions { │ │ │ │ │ + 17 │ │ │ │ │ + 18 │ │ │ │ │ 19 │ │ │ │ │ - 20/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 21// This is the reusable part of the LagrangeBasis. It contains │ │ │ │ │ - 22// │ │ │ │ │ - 23// LagrangePreBasis │ │ │ │ │ - 24// LagrangeNode │ │ │ │ │ - 25// │ │ │ │ │ - 26// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ -shared │ │ │ │ │ - 27// state. These components do _not_ depend on the global basis and local │ │ │ │ │ -view │ │ │ │ │ - 28// and can be used without a global basis. │ │ │ │ │ - 29/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 30 │ │ │ │ │ - 31template │ │ │ │ │ - 32class LagrangeNode; │ │ │ │ │ - 33 │ │ │ │ │ - 34template │ │ │ │ │ - 35class LagrangePreBasis; │ │ │ │ │ - 36 │ │ │ │ │ +29struct HierarchicNodeToRangeMap │ │ │ │ │ + 30{ │ │ │ │ │ + 31 template>(), int> = 0> │ │ │ │ │ +33 decltype(auto) operator()(const Node&, const TreePath& treePath, Range&& y) │ │ │ │ │ +const │ │ │ │ │ + 34 { │ │ │ │ │ + 35 return resolveStaticMultiIndex(y, treePath); │ │ │ │ │ + 36 } │ │ │ │ │ 37 │ │ │ │ │ - 38 │ │ │ │ │ - 53template │ │ │ │ │ -54class LagrangePreBasis │ │ │ │ │ - 55{ │ │ │ │ │ - 56 static const int dim = GV::dimension; │ │ │ │ │ - 57 static const bool useDynamicOrder = (k<0); │ │ │ │ │ - 58 │ │ │ │ │ - 59public: │ │ │ │ │ - 60 │ │ │ │ │ -62 using GridView = GV; │ │ │ │ │ - 63 │ │ │ │ │ -65 using size_type = std::size_t; │ │ │ │ │ - 66 │ │ │ │ │ -68 using Node = LagrangeNode; │ │ │ │ │ - 69 │ │ │ │ │ -70 static constexpr size_type maxMultiIndexSize = 1; │ │ │ │ │ -71 static constexpr size_type minMultiIndexSize = 1; │ │ │ │ │ -72 static constexpr size_type multiIndexBufferSize = 1; │ │ │ │ │ - 73 │ │ │ │ │ -75 LagrangePreBasis(const GridView& gv) │ │ │ │ │ - 76 : LagrangePreBasis(gv, std::numeric_limits::max()) │ │ │ │ │ - 77 {} │ │ │ │ │ - 78 │ │ │ │ │ -80 LagrangePreBasis(const GridView& gv, unsigned int order) : │ │ │ │ │ - 81 gridView_(gv), order_(order) │ │ │ │ │ - 82 { │ │ │ │ │ - 83 if (!useDynamicOrder && order!=std::numeric_limits::max()) │ │ │ │ │ - 84 DUNE_THROW(RangeError, "Template argument k has to be -1 when supplying a │ │ │ │ │ -run-time order!"); │ │ │ │ │ - 85 │ │ │ │ │ - 86 for (int i=0; i<=dim; i++) │ │ │ │ │ - 87 { │ │ │ │ │ - 88 dofsPerCube_[i] = computeDofsPerCube(i); │ │ │ │ │ - 89 dofsPerSimplex_[i] = computeDofsPerSimplex(i); │ │ │ │ │ - 90 } │ │ │ │ │ - 91 dofsPerPrism_ = computeDofsPerPrism(); │ │ │ │ │ - 92 dofsPerPyramid_ = computeDofsPerPyramid(); │ │ │ │ │ - 93 } │ │ │ │ │ - 94 │ │ │ │ │ -96 void initializeIndices() │ │ │ │ │ - 97 { │ │ │ │ │ - 98 vertexOffset_ = 0; │ │ │ │ │ - 99 edgeOffset_ = vertexOffset_ + dofsPerCube(0) * ((size_type)gridView_.size │ │ │ │ │ -(dim)); │ │ │ │ │ - 100 │ │ │ │ │ - 101 if (dim>=2) │ │ │ │ │ - 102 { │ │ │ │ │ - 103 triangleOffset_ = edgeOffset_ + dofsPerCube(1) * ((size_type) │ │ │ │ │ -gridView_.size(dim-1)); │ │ │ │ │ - 104 │ │ │ │ │ - 105 quadrilateralOffset_ = triangleOffset_ + dofsPerSimplex(2) * ( │ │ │ │ │ -(size_type)gridView_.size(Dune::GeometryTypes::triangle)); │ │ │ │ │ - 106 } │ │ │ │ │ - 107 │ │ │ │ │ - 108 if (dim==3) { │ │ │ │ │ - 109 tetrahedronOffset_ = quadrilateralOffset_ + dofsPerCube(2) * ( │ │ │ │ │ -(size_type)gridView_.size(Dune::GeometryTypes::quadrilateral)); │ │ │ │ │ - 110 │ │ │ │ │ - 111 prismOffset_ = tetrahedronOffset_ + dofsPerSimplex(3) * ( │ │ │ │ │ -(size_type)gridView_.size(Dune::GeometryTypes::tetrahedron)); │ │ │ │ │ - 112 │ │ │ │ │ - 113 hexahedronOffset_ = prismOffset_ + dofsPerPrism() * ( │ │ │ │ │ -(size_type)gridView_.size(Dune::GeometryTypes::prism)); │ │ │ │ │ - 114 │ │ │ │ │ - 115 pyramidOffset_ = hexahedronOffset_ + dofsPerCube(3) * ( │ │ │ │ │ -(size_type)gridView_.size(Dune::GeometryTypes::hexahedron)); │ │ │ │ │ - 116 } │ │ │ │ │ - 117 } │ │ │ │ │ - 118 │ │ │ │ │ -120 const GridView& gridView() const │ │ │ │ │ - 121 { │ │ │ │ │ - 122 return gridView_; │ │ │ │ │ - 123 } │ │ │ │ │ - 124 │ │ │ │ │ -126 void update (const GridView& gv) │ │ │ │ │ - 127 { │ │ │ │ │ - 128 gridView_ = gv; │ │ │ │ │ - 129 } │ │ │ │ │ - 130 │ │ │ │ │ -134 Node makeNode() const │ │ │ │ │ - 135 { │ │ │ │ │ - 136 return Node{order_}; │ │ │ │ │ - 137 } │ │ │ │ │ - 138 │ │ │ │ │ -140 size_type size() const │ │ │ │ │ - 141 { │ │ │ │ │ - 142 switch (dim) │ │ │ │ │ - 143 { │ │ │ │ │ - 144 case 1: │ │ │ │ │ - 145 return dofsPerCube(0) * ((size_type)gridView_.size(dim)) │ │ │ │ │ - 146 + dofsPerCube(1) * ((size_type)gridView_.size(dim-1)); │ │ │ │ │ - 147 case 2: │ │ │ │ │ - 148 { │ │ │ │ │ - 149 return dofsPerCube(0) * ((size_type)gridView_.size(dim)) │ │ │ │ │ - 150 + dofsPerCube(1) * ((size_type)gridView_.size(dim-1)) │ │ │ │ │ - 151 + dofsPerSimplex(2) * ((size_type)gridView_.size(Dune::GeometryTypes:: │ │ │ │ │ -triangle)) │ │ │ │ │ - 152 + dofsPerCube(2) * ((size_type)gridView_.size(Dune::GeometryTypes:: │ │ │ │ │ -quadrilateral)); │ │ │ │ │ - 153 } │ │ │ │ │ - 154 case 3: │ │ │ │ │ - 155 { │ │ │ │ │ - 156 return dofsPerCube(0) * ((size_type)gridView_.size(dim)) │ │ │ │ │ - 157 + dofsPerCube(1) * ((size_type)gridView_.size(dim-1)) │ │ │ │ │ - 158 + dofsPerSimplex(2) * ((size_type)gridView_.size(Dune::GeometryTypes:: │ │ │ │ │ -triangle)) │ │ │ │ │ - 159 + dofsPerCube(2) * ((size_type)gridView_.size(Dune::GeometryTypes:: │ │ │ │ │ -quadrilateral)) │ │ │ │ │ - 160 + dofsPerSimplex(3) * ((size_type)gridView_.size(Dune::GeometryTypes:: │ │ │ │ │ -tetrahedron)) │ │ │ │ │ - 161 + dofsPerPyramid() * ((size_type)gridView_.size(Dune::GeometryTypes:: │ │ │ │ │ -pyramid)) │ │ │ │ │ - 162 + dofsPerPrism() * ((size_type)gridView_.size(Dune::GeometryTypes::prism)) │ │ │ │ │ - 163 + dofsPerCube(3) * ((size_type)gridView_.size(Dune::GeometryTypes:: │ │ │ │ │ -hexahedron)); │ │ │ │ │ - 164 } │ │ │ │ │ - 165 } │ │ │ │ │ - 166 DUNE_THROW(Dune::NotImplemented, "No size method for " << dim << "d grids │ │ │ │ │ -available yet!"); │ │ │ │ │ - 167 } │ │ │ │ │ - 168 │ │ │ │ │ - 170 template │ │ │ │ │ -171 size_type size(const SizePrefix& prefix) const │ │ │ │ │ - 172 { │ │ │ │ │ - 173 assert(prefix.size() == 0 || prefix.size() == 1); │ │ │ │ │ - 174 return (prefix.size() == 0) ? size() : 0; │ │ │ │ │ - 175 } │ │ │ │ │ - 176 │ │ │ │ │ -178 size_type dimension() const │ │ │ │ │ - 179 { │ │ │ │ │ - 180 return size(); │ │ │ │ │ - 181 } │ │ │ │ │ - 182 │ │ │ │ │ -184 size_type maxNodeSize() const │ │ │ │ │ - 185 { │ │ │ │ │ - 186 // That cast to unsigned int is necessary because GV::dimension is an │ │ │ │ │ -enum, │ │ │ │ │ - 187 // which is not recognized by the power method as an integer type... │ │ │ │ │ - 188 return power(order()+1, (unsigned int)GV::dimension); │ │ │ │ │ - 189 } │ │ │ │ │ - 190 │ │ │ │ │ - 191 template │ │ │ │ │ -192 It indices(const Node& node, It it) const │ │ │ │ │ - 193 { │ │ │ │ │ - 194 for (size_type i = 0, end = node.finiteElement().size() ; i < end ; ++it, │ │ │ │ │ -++i) │ │ │ │ │ - 195 { │ │ │ │ │ - 196 Dune::LocalKey localKey = node.finiteElement().localCoefficients │ │ │ │ │ -().localKey(i); │ │ │ │ │ - 197 const auto& gridIndexSet = gridView().indexSet(); │ │ │ │ │ - 198 const auto& element = node.element(); │ │ │ │ │ - 199 │ │ │ │ │ - 200 // The dimension of the entity that the current dof is related to │ │ │ │ │ - 201 auto dofDim = dim - localKey.codim(); │ │ │ │ │ - 202 │ │ │ │ │ - 203 // Test for a vertex dof │ │ │ │ │ - 204 // The test for k==1 is redundant, but having it here allows the compiler │ │ │ │ │ -to conclude │ │ │ │ │ - 205 // at compile-time that the dofDim==0 case is the only one that will ever │ │ │ │ │ -happen. │ │ │ │ │ - 206 // This leads to measurable speed-up: see │ │ │ │ │ - 207 // https://gitlab.dune-project.org/staging/dune-functions/issues/30 │ │ │ │ │ - 208 if (k==1 || dofDim==0) { │ │ │ │ │ - 209 *it = {{ (size_type)(gridIndexSet.subIndex(element,localKey.subEntity │ │ │ │ │ -(),dim)) }}; │ │ │ │ │ - 210 continue; │ │ │ │ │ - 211 } │ │ │ │ │ - 212 │ │ │ │ │ - 213 if (dofDim==1) │ │ │ │ │ - 214 { // edge dof │ │ │ │ │ - 215 if (dim==1) // element dof -- any local numbering is fine │ │ │ │ │ - 216 { │ │ │ │ │ - 217 *it = {{ edgeOffset_ │ │ │ │ │ - 218 + dofsPerCube(1) * ((size_type)gridIndexSet.subIndex(element,0,0)) │ │ │ │ │ - 219 + localKey.index() }}; │ │ │ │ │ - 220 continue; │ │ │ │ │ - 221 } │ │ │ │ │ - 222 else │ │ │ │ │ - 223 { │ │ │ │ │ - 224 const auto refElement │ │ │ │ │ - 225 = Dune::referenceElement(element.type()); │ │ │ │ │ - 226 │ │ │ │ │ - 227 // We have to reverse the numbering if the local element edge is │ │ │ │ │ - 228 // not aligned with the global edge. │ │ │ │ │ - 229 auto v0 = (size_type)gridIndexSet.subIndex(element,refElement.subEntity │ │ │ │ │ -(localKey.subEntity(),localKey.codim(),0,dim),dim); │ │ │ │ │ - 230 auto v1 = (size_type)gridIndexSet.subIndex(element,refElement.subEntity │ │ │ │ │ -(localKey.subEntity(),localKey.codim(),1,dim),dim); │ │ │ │ │ - 231 bool flip = (v0 > v1); │ │ │ │ │ - 232 *it = {{ (flip) │ │ │ │ │ - 233 ? edgeOffset_ │ │ │ │ │ - 234 + dofsPerCube(1)*((size_type)gridIndexSet.subIndex │ │ │ │ │ -(element,localKey.subEntity(),localKey.codim())) │ │ │ │ │ - 235 + (dofsPerCube(1)-1)-localKey.index() │ │ │ │ │ - 236 : edgeOffset_ │ │ │ │ │ - 237 + dofsPerCube(1)*((size_type)gridIndexSet.subIndex │ │ │ │ │ -(element,localKey.subEntity(),localKey.codim())) │ │ │ │ │ - 238 + localKey.index() }}; │ │ │ │ │ - 239 continue; │ │ │ │ │ - 240 } │ │ │ │ │ - 241 } │ │ │ │ │ - 242 │ │ │ │ │ - 243 if (dofDim==2) │ │ │ │ │ - 244 { │ │ │ │ │ - 245 if (dim==2) // element dof -- any local numbering is fine │ │ │ │ │ - 246 { │ │ │ │ │ - 247 if (element.type().isTriangle()) │ │ │ │ │ - 248 { │ │ │ │ │ - 249 *it = {{ triangleOffset_ + dofsPerSimplex(2)*( │ │ │ │ │ -(size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }}; │ │ │ │ │ - 250 continue; │ │ │ │ │ - 251 } │ │ │ │ │ - 252 else if (element.type().isQuadrilateral()) │ │ │ │ │ - 253 { │ │ │ │ │ - 254 *it = {{ quadrilateralOffset_ + dofsPerCube(2)*( │ │ │ │ │ -(size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }}; │ │ │ │ │ - 255 continue; │ │ │ │ │ - 256 } │ │ │ │ │ - 257 else │ │ │ │ │ - 258 DUNE_THROW(Dune::NotImplemented, "2d elements have to be triangles or │ │ │ │ │ -quadrilaterals"); │ │ │ │ │ - 259 } else │ │ │ │ │ - 260 { │ │ │ │ │ - 261 const auto refElement │ │ │ │ │ - 262 = Dune::referenceElement(element.type()); │ │ │ │ │ - 263 │ │ │ │ │ - 264 if (order()>3) │ │ │ │ │ - 265 DUNE_THROW(Dune::NotImplemented, "LagrangeBasis for 3D grids is only │ │ │ │ │ -implemented if k<=3"); │ │ │ │ │ - 266 │ │ │ │ │ - 267 if (order()==3 and !refElement.type(localKey.subEntity(), localKey.codim │ │ │ │ │ -()).isTriangle()) │ │ │ │ │ - 268 DUNE_THROW(Dune::NotImplemented, "LagrangeBasis for 3D grids with k==3 is │ │ │ │ │ -only implemented if the grid is a simplex grid"); │ │ │ │ │ - 269 │ │ │ │ │ - 270 *it = {{ triangleOffset_ + ((size_type)gridIndexSet.subIndex │ │ │ │ │ -(element,localKey.subEntity(),localKey.codim())) }}; │ │ │ │ │ - 271 continue; │ │ │ │ │ - 272 } │ │ │ │ │ - 273 } │ │ │ │ │ - 274 │ │ │ │ │ - 275 if (dofDim==3) │ │ │ │ │ - 276 { │ │ │ │ │ - 277 if (dim==3) // element dof -- any local numbering is fine │ │ │ │ │ - 278 { │ │ │ │ │ - 279 if (element.type().isTetrahedron()) │ │ │ │ │ - 280 { │ │ │ │ │ - 281 *it = {{ tetrahedronOffset_ + dofsPerSimplex(3)*( │ │ │ │ │ -(size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }}; │ │ │ │ │ - 282 continue; │ │ │ │ │ - 283 } │ │ │ │ │ - 284 else if (element.type().isHexahedron()) │ │ │ │ │ - 285 { │ │ │ │ │ - 286 *it = {{ hexahedronOffset_ + dofsPerCube(3)*( │ │ │ │ │ -(size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }}; │ │ │ │ │ - 287 continue; │ │ │ │ │ - 288 } │ │ │ │ │ - 289 else if (element.type().isPrism()) │ │ │ │ │ - 290 { │ │ │ │ │ - 291 *it = {{ prismOffset_ + dofsPerPrism()*((size_type)gridIndexSet.subIndex │ │ │ │ │ -(element,0,0)) + localKey.index() }}; │ │ │ │ │ - 292 continue; │ │ │ │ │ - 293 } │ │ │ │ │ - 294 else if (element.type().isPyramid()) │ │ │ │ │ - 295 { │ │ │ │ │ - 296 *it = {{ pyramidOffset_ + dofsPerPyramid()*( │ │ │ │ │ -(size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }}; │ │ │ │ │ - 297 continue; │ │ │ │ │ - 298 } │ │ │ │ │ - 299 else │ │ │ │ │ - 300 DUNE_THROW(Dune::NotImplemented, "3d elements have to be tetrahedra, │ │ │ │ │ -hexahedra, prisms, or pyramids"); │ │ │ │ │ - 301 } else │ │ │ │ │ - 302 DUNE_THROW(Dune::NotImplemented, "Grids of dimension larger than 3 are no │ │ │ │ │ -supported"); │ │ │ │ │ - 303 } │ │ │ │ │ - 304 DUNE_THROW(Dune::NotImplemented, "Grid contains elements not supported for │ │ │ │ │ -the LagrangeBasis"); │ │ │ │ │ - 305 } │ │ │ │ │ - 306 return it; │ │ │ │ │ - 307 } │ │ │ │ │ - 308 │ │ │ │ │ -310 unsigned int order() const │ │ │ │ │ - 311 { │ │ │ │ │ - 312 return (useDynamicOrder) ? order_ : k; │ │ │ │ │ - 313 } │ │ │ │ │ - 314 │ │ │ │ │ - 315protected: │ │ │ │ │ -316 GridView gridView_; │ │ │ │ │ - 317 │ │ │ │ │ - 318 // Run-time order, only valid if k<0 │ │ │ │ │ -319 const unsigned int order_; │ │ │ │ │ - 320 │ │ │ │ │ -322 size_type dofsPerSimplex(std::size_t simplexDim) const │ │ │ │ │ - 323 { │ │ │ │ │ - 324 return useDynamicOrder ? dofsPerSimplex_[simplexDim] : │ │ │ │ │ -computeDofsPerSimplex(simplexDim); │ │ │ │ │ - 325 } │ │ │ │ │ - 326 │ │ │ │ │ -328 size_type dofsPerCube(std::size_t cubeDim) const │ │ │ │ │ - 329 { │ │ │ │ │ - 330 return useDynamicOrder ? dofsPerCube_[cubeDim] : computeDofsPerCube │ │ │ │ │ -(cubeDim); │ │ │ │ │ - 331 } │ │ │ │ │ - 332 │ │ │ │ │ -333 size_type dofsPerPrism() const │ │ │ │ │ - 334 { │ │ │ │ │ - 335 return useDynamicOrder ? dofsPerPrism_ : computeDofsPerPrism(); │ │ │ │ │ - 336 } │ │ │ │ │ - 337 │ │ │ │ │ -338 size_type dofsPerPyramid() const │ │ │ │ │ - 339 { │ │ │ │ │ - 340 return useDynamicOrder ? dofsPerPyramid_ : computeDofsPerPyramid(); │ │ │ │ │ - 341 } │ │ │ │ │ - 342 │ │ │ │ │ -344 size_type computeDofsPerSimplex(std::size_t simplexDim) const │ │ │ │ │ - 345 { │ │ │ │ │ - 346 return order() == 0 ? (dim == simplexDim ? 1 : 0) : Dune::binomial(std:: │ │ │ │ │ -size_t(order()-1),simplexDim); │ │ │ │ │ - 347 } │ │ │ │ │ - 348 │ │ │ │ │ -350 size_type computeDofsPerCube(std::size_t cubeDim) const │ │ │ │ │ - 351 { │ │ │ │ │ - 352 return order() == 0 ? (dim == cubeDim ? 1 : 0) : Dune::power(order()-1, │ │ │ │ │ -cubeDim); │ │ │ │ │ - 353 } │ │ │ │ │ - 354 │ │ │ │ │ -355 size_type computeDofsPerPrism() const │ │ │ │ │ - 356 { │ │ │ │ │ - 357 return order() == 0 ? (dim == 3 ? 1 : 0) : (order()-1)*(order()-1)*(order │ │ │ │ │ -()-2)/2; │ │ │ │ │ - 358 } │ │ │ │ │ - 359 │ │ │ │ │ -360 size_type computeDofsPerPyramid() const │ │ │ │ │ - 361 { │ │ │ │ │ - 362 return order() == 0 ? (dim == 3 ? 1 : 0) : (order()-2)*(order()-1)* │ │ │ │ │ -(2*order()-3)/6; │ │ │ │ │ - 363 } │ │ │ │ │ - 364 │ │ │ │ │ - 365 // When the order is given at run-time, the following numbers are pre- │ │ │ │ │ -computed: │ │ │ │ │ -366 std::array dofsPerSimplex_; │ │ │ │ │ -367 std::array dofsPerCube_; │ │ │ │ │ -368 size_type dofsPerPrism_; │ │ │ │ │ -369 size_type dofsPerPyramid_; │ │ │ │ │ - 370 │ │ │ │ │ -371 size_type vertexOffset_; │ │ │ │ │ -372 size_type edgeOffset_; │ │ │ │ │ -373 size_type triangleOffset_; │ │ │ │ │ -374 size_type quadrilateralOffset_; │ │ │ │ │ -375 size_type tetrahedronOffset_; │ │ │ │ │ -376 size_type pyramidOffset_; │ │ │ │ │ -377 size_type prismOffset_; │ │ │ │ │ -378 size_type hexahedronOffset_; │ │ │ │ │ - 379 │ │ │ │ │ - 380}; │ │ │ │ │ - 381 │ │ │ │ │ - 382 │ │ │ │ │ - 383 │ │ │ │ │ - 384template │ │ │ │ │ -385class LagrangeNode : │ │ │ │ │ - 386 public LeafBasisNode │ │ │ │ │ - 387{ │ │ │ │ │ - 388 // Stores LocalFiniteElement implementations with run-time order as a │ │ │ │ │ -function of GeometryType │ │ │ │ │ - 389 template │ │ │ │ │ - 390 class LagrangeRunTimeLFECache │ │ │ │ │ - 391 { │ │ │ │ │ - 392 public: │ │ │ │ │ - 393 using FiniteElementType = │ │ │ │ │ -LagrangeLocalFiniteElement; │ │ │ │ │ - 394 │ │ │ │ │ - 395 const FiniteElementType& get(GeometryType type) │ │ │ │ │ - 396 { │ │ │ │ │ - 397 auto i = data_.find(type); │ │ │ │ │ - 398 if (i==data_.end()) │ │ │ │ │ - 399 i = data_.emplace(type,FiniteElementType(type,order_)).first; │ │ │ │ │ - 400 return (*i).second; │ │ │ │ │ - 401 } │ │ │ │ │ - 402 │ │ │ │ │ - 403 std::map data_; │ │ │ │ │ - 404 unsigned int order_; │ │ │ │ │ - 405 }; │ │ │ │ │ - 406 │ │ │ │ │ - 407 static constexpr int dim = GV::dimension; │ │ │ │ │ - 408 static constexpr bool useDynamicOrder = (k<0); │ │ │ │ │ - 409 │ │ │ │ │ - 410 using FiniteElementCache = typename std::conditional<(useDynamicOrder), │ │ │ │ │ - 411 LagrangeRunTimeLFECache, │ │ │ │ │ - 412 PQkLocalFiniteElementCache │ │ │ │ │ - 413 >::type; │ │ │ │ │ - 414 │ │ │ │ │ - 415public: │ │ │ │ │ - 416 │ │ │ │ │ -417 using size_type = std::size_t; │ │ │ │ │ -418 using Element = typename GV::template Codim<0>::Entity; │ │ │ │ │ -419 using FiniteElement = typename FiniteElementCache::FiniteElementType; │ │ │ │ │ - 420 │ │ │ │ │ -422 LagrangeNode() : │ │ │ │ │ - 423 finiteElement_(nullptr), │ │ │ │ │ - 424 element_(nullptr) │ │ │ │ │ - 425 {} │ │ │ │ │ - 426 │ │ │ │ │ -428 LagrangeNode(unsigned int order) : │ │ │ │ │ - 429 order_(order), │ │ │ │ │ - 430 finiteElement_(nullptr), │ │ │ │ │ - 431 element_(nullptr) │ │ │ │ │ - 432 { │ │ │ │ │ - 433 // Only the cache for the run-time-order case (i.e., k<0), has the │ │ │ │ │ -'order_' member │ │ │ │ │ - 434 if constexpr (useDynamicOrder) │ │ │ │ │ - 435 cache_.order_ = order; │ │ │ │ │ - 436 } │ │ │ │ │ - 437 │ │ │ │ │ -439 const Element& element() const │ │ │ │ │ - 440 { │ │ │ │ │ - 441 return *element_; │ │ │ │ │ - 442 } │ │ │ │ │ - 443 │ │ │ │ │ -448 const FiniteElement& finiteElement() const │ │ │ │ │ - 449 { │ │ │ │ │ - 450 return *finiteElement_; │ │ │ │ │ - 451 } │ │ │ │ │ - 452 │ │ │ │ │ -454 void bind(const Element& e) │ │ │ │ │ - 455 { │ │ │ │ │ - 456 element_ = &e; │ │ │ │ │ - 457 finiteElement_ = &(cache_.get(element_->type())); │ │ │ │ │ - 458 this->setSize(finiteElement_->size()); │ │ │ │ │ - 459 } │ │ │ │ │ - 460 │ │ │ │ │ - 461protected: │ │ │ │ │ - 462 │ │ │ │ │ -463 unsigned int order() const │ │ │ │ │ - 464 { │ │ │ │ │ - 465 return (useDynamicOrder) ? order_ : k; │ │ │ │ │ - 466 } │ │ │ │ │ - 467 │ │ │ │ │ - 468 // Run-time order, only valid if k<0 │ │ │ │ │ -469 unsigned int order_; │ │ │ │ │ - 470 │ │ │ │ │ -471 FiniteElementCache cache_; │ │ │ │ │ -472 const FiniteElement* finiteElement_; │ │ │ │ │ -473 const Element* element_; │ │ │ │ │ - 474}; │ │ │ │ │ - 475 │ │ │ │ │ - 476 │ │ │ │ │ - 477 │ │ │ │ │ - 478namespace BasisFactory { │ │ │ │ │ - 479 │ │ │ │ │ - 488template │ │ │ │ │ -489auto lagrange() │ │ │ │ │ - 490{ │ │ │ │ │ - 491 return [](const auto& gridView) { │ │ │ │ │ - 492 return LagrangePreBasis, k, R>(gridView); │ │ │ │ │ - 493 }; │ │ │ │ │ - 494} │ │ │ │ │ - 495 │ │ │ │ │ - 503template │ │ │ │ │ -504auto lagrange(int order) │ │ │ │ │ - 505{ │ │ │ │ │ - 506 return [=](const auto& gridView) { │ │ │ │ │ - 507 return LagrangePreBasis, -1, R>(gridView, │ │ │ │ │ -order); │ │ │ │ │ - 508 }; │ │ │ │ │ - 509} │ │ │ │ │ - 510 │ │ │ │ │ - 511} // end namespace BasisFactory │ │ │ │ │ - 512 │ │ │ │ │ - 513 │ │ │ │ │ - 514 │ │ │ │ │ - 538template │ │ │ │ │ -539using LagrangeBasis = DefaultGlobalBasis >; │ │ │ │ │ - 540 │ │ │ │ │ - 541 │ │ │ │ │ - 542 │ │ │ │ │ - 543 │ │ │ │ │ - 544 │ │ │ │ │ - 545} // end namespace Functions │ │ │ │ │ - 546} // end namespace Dune │ │ │ │ │ - 547 │ │ │ │ │ - 548 │ │ │ │ │ - 549#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH │ │ │ │ │ -nodes.hh │ │ │ │ │ -defaultglobalbasis.hh │ │ │ │ │ -Dune::Functions::BasisFactory::power │ │ │ │ │ -auto power(ChildPreBasisFactory &&childPreBasisFactory, const │ │ │ │ │ -IndexMergingStrategy &) │ │ │ │ │ -Create a pre-basis factory that can build a PowerPreBasis. │ │ │ │ │ -Definition: powerbasis.hh:369 │ │ │ │ │ -Dune::Functions::BasisFactory::lagrange │ │ │ │ │ -auto lagrange() │ │ │ │ │ -Create a pre-basis factory that can create a Lagrange pre-basis. │ │ │ │ │ -Definition: lagrangebasis.hh:489 │ │ │ │ │ + 38 template>(), int> = 0> │ │ │ │ │ +40 decltype(auto) operator()(const Node&, const TreePath&, Range&& y) const │ │ │ │ │ + 41 { │ │ │ │ │ + 42 return std::forward(y); │ │ │ │ │ + 43 } │ │ │ │ │ + 44}; │ │ │ │ │ + 45 │ │ │ │ │ + 46 │ │ │ │ │ + 47 │ │ │ │ │ + 48} // namespace Dune::Functions │ │ │ │ │ + 49} // namespace Dune │ │ │ │ │ + 50 │ │ │ │ │ + 51 │ │ │ │ │ + 52#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICNODETORANGEMAP_HH │ │ │ │ │ +indexaccess.hh │ │ │ │ │ +Dune::Functions::resolveStaticMultiIndex │ │ │ │ │ +constexpr decltype(auto) resolveStaticMultiIndex(C &&c, const MultiIndex │ │ │ │ │ +&multiIndex) │ │ │ │ │ +Provide multi-index access by chaining operator[]. │ │ │ │ │ +Definition: indexaccess.hh:398 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis │ │ │ │ │ -Global basis for given pre-basis. │ │ │ │ │ -Definition: defaultglobalbasis.hh:46 │ │ │ │ │ -Dune::Functions::LagrangeNode │ │ │ │ │ -Definition: lagrangebasis.hh:387 │ │ │ │ │ -Dune::Functions::LagrangeNode::LagrangeNode │ │ │ │ │ -LagrangeNode(unsigned int order) │ │ │ │ │ -Constructor with a run-time order. │ │ │ │ │ -Definition: lagrangebasis.hh:428 │ │ │ │ │ -Dune::Functions::LagrangeNode::order │ │ │ │ │ -unsigned int order() const │ │ │ │ │ -Definition: lagrangebasis.hh:463 │ │ │ │ │ -Dune::Functions::LagrangeNode::finiteElement │ │ │ │ │ -const FiniteElement & finiteElement() const │ │ │ │ │ -Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ -Definition: lagrangebasis.hh:448 │ │ │ │ │ -Dune::Functions::LagrangeNode::element_ │ │ │ │ │ -const Element * element_ │ │ │ │ │ -Definition: lagrangebasis.hh:473 │ │ │ │ │ -Dune::Functions::LagrangeNode::element │ │ │ │ │ -const Element & element() const │ │ │ │ │ -Return current element, throw if unbound. │ │ │ │ │ -Definition: lagrangebasis.hh:439 │ │ │ │ │ -Dune::Functions::LagrangeNode::cache_ │ │ │ │ │ -FiniteElementCache cache_ │ │ │ │ │ -Definition: lagrangebasis.hh:471 │ │ │ │ │ -Dune::Functions::LagrangeNode::FiniteElement │ │ │ │ │ -typename FiniteElementCache::FiniteElementType FiniteElement │ │ │ │ │ -Definition: lagrangebasis.hh:419 │ │ │ │ │ -Dune::Functions::LagrangeNode::bind │ │ │ │ │ -void bind(const Element &e) │ │ │ │ │ -Bind to element. │ │ │ │ │ -Definition: lagrangebasis.hh:454 │ │ │ │ │ -Dune::Functions::LagrangeNode::Element │ │ │ │ │ -typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ -Definition: lagrangebasis.hh:418 │ │ │ │ │ -Dune::Functions::LagrangeNode::finiteElement_ │ │ │ │ │ -const FiniteElement * finiteElement_ │ │ │ │ │ -Definition: lagrangebasis.hh:472 │ │ │ │ │ -Dune::Functions::LagrangeNode::order_ │ │ │ │ │ -unsigned int order_ │ │ │ │ │ -Definition: lagrangebasis.hh:469 │ │ │ │ │ -Dune::Functions::LagrangeNode::size_type │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Definition: lagrangebasis.hh:417 │ │ │ │ │ -Dune::Functions::LagrangeNode::LagrangeNode │ │ │ │ │ -LagrangeNode() │ │ │ │ │ -Constructor without order (uses the compile-time value) │ │ │ │ │ -Definition: lagrangebasis.hh:422 │ │ │ │ │ -Dune::Functions::LagrangePreBasis │ │ │ │ │ -A pre-basis for a PQ-lagrange bases with given order. │ │ │ │ │ -Definition: lagrangebasis.hh:55 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::dofsPerPrism │ │ │ │ │ -size_type dofsPerPrism() const │ │ │ │ │ -Definition: lagrangebasis.hh:333 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::computeDofsPerCube │ │ │ │ │ -size_type computeDofsPerCube(std::size_t cubeDim) const │ │ │ │ │ -Number of degrees of freedom assigned to a cube (without the ones assigned to │ │ │ │ │ -its faces!... │ │ │ │ │ -Definition: lagrangebasis.hh:350 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::computeDofsPerSimplex │ │ │ │ │ -size_type computeDofsPerSimplex(std::size_t simplexDim) const │ │ │ │ │ -Number of degrees of freedom assigned to a simplex (without the ones assigned │ │ │ │ │ -to its faces!... │ │ │ │ │ -Definition: lagrangebasis.hh:344 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::maxMultiIndexSize │ │ │ │ │ -static constexpr size_type maxMultiIndexSize │ │ │ │ │ -Definition: lagrangebasis.hh:70 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::computeDofsPerPrism │ │ │ │ │ -size_type computeDofsPerPrism() const │ │ │ │ │ -Definition: lagrangebasis.hh:355 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::edgeOffset_ │ │ │ │ │ -size_type edgeOffset_ │ │ │ │ │ -Definition: lagrangebasis.hh:372 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::dofsPerSimplex_ │ │ │ │ │ -std::array< size_type, dim+1 > dofsPerSimplex_ │ │ │ │ │ -Definition: lagrangebasis.hh:366 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::indices │ │ │ │ │ -It indices(const Node &node, It it) const │ │ │ │ │ -Definition: lagrangebasis.hh:192 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::vertexOffset_ │ │ │ │ │ -size_type vertexOffset_ │ │ │ │ │ -Definition: lagrangebasis.hh:371 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::dofsPerSimplex │ │ │ │ │ -size_type dofsPerSimplex(std::size_t simplexDim) const │ │ │ │ │ -Number of degrees of freedom assigned to a simplex (without the ones assigned │ │ │ │ │ -to its faces!... │ │ │ │ │ -Definition: lagrangebasis.hh:322 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::size_type │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Type used for indices and size information. │ │ │ │ │ -Definition: lagrangebasis.hh:65 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::pyramidOffset_ │ │ │ │ │ -size_type pyramidOffset_ │ │ │ │ │ -Definition: lagrangebasis.hh:376 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::prismOffset_ │ │ │ │ │ -size_type prismOffset_ │ │ │ │ │ -Definition: lagrangebasis.hh:377 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::tetrahedronOffset_ │ │ │ │ │ -size_type tetrahedronOffset_ │ │ │ │ │ -Definition: lagrangebasis.hh:375 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::initializeIndices │ │ │ │ │ -void initializeIndices() │ │ │ │ │ -Initialize the global indices. │ │ │ │ │ -Definition: lagrangebasis.hh:96 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::computeDofsPerPyramid │ │ │ │ │ -size_type computeDofsPerPyramid() const │ │ │ │ │ -Definition: lagrangebasis.hh:360 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::LagrangePreBasis │ │ │ │ │ -LagrangePreBasis(const GridView &gv, unsigned int order) │ │ │ │ │ -Constructor for a given grid view object and run-time order. │ │ │ │ │ -Definition: lagrangebasis.hh:80 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::dofsPerPyramid_ │ │ │ │ │ -size_type dofsPerPyramid_ │ │ │ │ │ -Definition: lagrangebasis.hh:369 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::dimension │ │ │ │ │ -size_type dimension() const │ │ │ │ │ -Get the total dimension of the space spanned by this basis. │ │ │ │ │ -Definition: lagrangebasis.hh:178 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::LagrangePreBasis │ │ │ │ │ -LagrangePreBasis(const GridView &gv) │ │ │ │ │ -Constructor for a given grid view object with compile-time order. │ │ │ │ │ -Definition: lagrangebasis.hh:75 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::update │ │ │ │ │ -void update(const GridView &gv) │ │ │ │ │ -Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ -Definition: lagrangebasis.hh:126 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::size │ │ │ │ │ -size_type size(const SizePrefix &prefix) const │ │ │ │ │ -Return number of possible values for next position in multi index. │ │ │ │ │ -Definition: lagrangebasis.hh:171 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::multiIndexBufferSize │ │ │ │ │ -static constexpr size_type multiIndexBufferSize │ │ │ │ │ -Definition: lagrangebasis.hh:72 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::GridView │ │ │ │ │ -GV GridView │ │ │ │ │ -The grid view that the FE basis is defined on. │ │ │ │ │ -Definition: lagrangebasis.hh:62 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::quadrilateralOffset_ │ │ │ │ │ -size_type quadrilateralOffset_ │ │ │ │ │ -Definition: lagrangebasis.hh:374 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::gridView │ │ │ │ │ -const GridView & gridView() const │ │ │ │ │ -Obtain the grid view that the basis is defined on. │ │ │ │ │ -Definition: lagrangebasis.hh:120 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::gridView_ │ │ │ │ │ -GridView gridView_ │ │ │ │ │ -Definition: lagrangebasis.hh:316 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::makeNode │ │ │ │ │ -Node makeNode() const │ │ │ │ │ -Create tree node. │ │ │ │ │ -Definition: lagrangebasis.hh:134 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::order │ │ │ │ │ -unsigned int order() const │ │ │ │ │ -Polynomial order used in the local Lagrange finite-elements. │ │ │ │ │ -Definition: lagrangebasis.hh:310 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::order_ │ │ │ │ │ -const unsigned int order_ │ │ │ │ │ -Definition: lagrangebasis.hh:319 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::dofsPerCube_ │ │ │ │ │ -std::array< size_type, dim+1 > dofsPerCube_ │ │ │ │ │ -Definition: lagrangebasis.hh:367 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::maxNodeSize │ │ │ │ │ -size_type maxNodeSize() const │ │ │ │ │ -Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ -Definition: lagrangebasis.hh:184 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::size │ │ │ │ │ -size_type size() const │ │ │ │ │ -Same as size(prefix) with empty prefix. │ │ │ │ │ -Definition: lagrangebasis.hh:140 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::dofsPerPrism_ │ │ │ │ │ -size_type dofsPerPrism_ │ │ │ │ │ -Definition: lagrangebasis.hh:368 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::dofsPerCube │ │ │ │ │ -size_type dofsPerCube(std::size_t cubeDim) const │ │ │ │ │ -Number of degrees of freedom assigned to a cube (without the ones assigned to │ │ │ │ │ -its faces!... │ │ │ │ │ -Definition: lagrangebasis.hh:328 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::triangleOffset_ │ │ │ │ │ -size_type triangleOffset_ │ │ │ │ │ -Definition: lagrangebasis.hh:373 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::hexahedronOffset_ │ │ │ │ │ -size_type hexahedronOffset_ │ │ │ │ │ -Definition: lagrangebasis.hh:378 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::minMultiIndexSize │ │ │ │ │ -static constexpr size_type minMultiIndexSize │ │ │ │ │ -Definition: lagrangebasis.hh:71 │ │ │ │ │ -Dune::Functions::LagrangePreBasis::dofsPerPyramid │ │ │ │ │ -size_type dofsPerPyramid() const │ │ │ │ │ -Definition: lagrangebasis.hh:338 │ │ │ │ │ -Dune::Functions::BasisNodeMixin::setSize │ │ │ │ │ -void setSize(const size_type size) │ │ │ │ │ -Definition: nodes.hh:164 │ │ │ │ │ -Dune::Functions::LeafBasisNode │ │ │ │ │ -Definition: nodes.hh:186 │ │ │ │ │ +Dune::Functions::HierarchicNodeToRangeMap │ │ │ │ │ +A simple node to range map using the nested tree indices. │ │ │ │ │ +Definition: hierarchicnodetorangemap.hh:30 │ │ │ │ │ +Dune::Functions::HierarchicNodeToRangeMap::operator() │ │ │ │ │ +decltype(auto) operator()(const Node &, const TreePath &treePath, Range &&y) │ │ │ │ │ +const │ │ │ │ │ +Definition: hierarchicnodetorangemap.hh:33 │ │ │ │ │ +Dune::Functions::HierarchicNodeToRangeMap::operator() │ │ │ │ │ +decltype(auto) operator()(const Node &, const TreePath &, Range &&y) const │ │ │ │ │ +Definition: hierarchicnodetorangemap.hh:40 │ │ │ │ │ +concepts.hh │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00137.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: sizeinfo.hh File Reference │ │ │ │ +dune-functions: transformedindexbasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -66,39 +66,70 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
sizeinfo.hh File Reference
│ │ │ │ +
transformedindexbasis.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <array>
│ │ │ │ +
#include <tuple>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <dune/common/std/apply.hh>
│ │ │ │ +#include <dune/common/hybridutilities.hh>
│ │ │ │ +#include <dune/common/reservedvector.hh>
│ │ │ │ +#include <dune/common/typeutilities.hh>
│ │ │ │ +#include <dune/typetree/compositenode.hh>
│ │ │ │ +#include <dune/typetree/utility.hh>
│ │ │ │ +#include <dune/functions/common/staticforloop.hh>
│ │ │ │ +#include <dune/functions/common/type_traits.hh>
│ │ │ │ +#include <dune/functions/common/utility.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/basistags.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::SizeInfo< B >
 A class encapsulating size information. More...
class  Dune::Functions::Experimental::TransformedIndexPreBasis< RPB, T >
 A pre-basis transforming multi-indices. More...
 
class  Dune::Functions::BasisFactory::Experimental::GenericIndexingTransformation< IndexTransformation, SizeImplementation, minIS, maxIS >
 A generic implementation of a transformation. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
namespace  Dune::Functions::Experimental
 
namespace  Dune::Functions::BasisFactory
 
namespace  Dune::Functions::BasisFactory::Experimental
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<class Basis >
SizeInfo< Basis > Dune::Functions::sizeInfo (const Basis &basis)
 
template<class RPB , class T >
 Dune::Functions::Experimental::TransformedIndexPreBasis (RPB &&, T &&) -> TransformedIndexPreBasis< std::decay_t< RPB >, std::decay_t< T > >
 
template<class RawPreBasisFactory , class Transformation >
auto Dune::Functions::BasisFactory::Experimental::transformIndices (RawPreBasisFactory &&preBasisFactory, Transformation &&transformation)
 Create a TransformedIndexPreBasisFactory. More...
 
template<class IndexTransformation , class SizeImplementation , std::size_t minIndexSize, std::size_t maxIndexSize>
auto Dune::Functions::BasisFactory::Experimental::indexTransformation (IndexTransformation &&indexTransformation, SizeImplementation &&sizeImplementation, Dune::index_constant< minIndexSize >, Dune::index_constant< maxIndexSize >)
 A generic implementation of a transformation. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -6,26 +6,65 @@ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ Classes | Namespaces | Functions │ │ │ │ │ -sizeinfo.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +transformedindexbasis.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::SizeInfo<_B_> │ │ │ │ │ -  A class encapsulating size information. More... │ │ │ │ │ +class  Dune::Functions::Experimental::TransformedIndexPreBasis<_RPB,_T_> │ │ │ │ │ +  A pre-basis transforming multi-indices. More... │ │ │ │ │ +  │ │ │ │ │ +class  Dune::Functions::BasisFactory::Experimental:: │ │ │ │ │ + GenericIndexingTransformation<_IndexTransformation,_SizeImplementation, │ │ │ │ │ + minIS,_maxIS_> │ │ │ │ │ +  A generic implementation of a transformation. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ +namespace  Dune::Functions::Experimental │ │ │ │ │ +  │ │ │ │ │ +namespace  Dune::Functions::BasisFactory │ │ │ │ │ +  │ │ │ │ │ +namespace  Dune::Functions::BasisFactory::Experimental │ │ │ │ │ +  │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ -SizeInfo< Basis > Dune::Functions::sizeInfo (const Basis &basis) │ │ │ │ │ +template │ │ │ │ │ +  Dune::Functions::Experimental::TransformedIndexPreBasis (RPB &&, T &&) - │ │ │ │ │ + > TransformedIndexPreBasis< std::decay_t< RPB >, std::decay_t< T > > │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::BasisFactory::Experimental::transformIndices │ │ │ │ │ + (RawPreBasisFactory &&preBasisFactory, Transformation &&transformation) │ │ │ │ │ +  Create a TransformedIndexPreBasisFactory. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::BasisFactory::Experimental::indexTransformation │ │ │ │ │ + (IndexTransformation &&indexTransformation, SizeImplementation │ │ │ │ │ + &&sizeImplementation, Dune::index_constant< minIndexSize >, Dune:: │ │ │ │ │ + index_constant< maxIndexSize >) │ │ │ │ │ +  A generic implementation of a transformation. More... │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00137_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: sizeinfo.hh Source File │ │ │ │ +dune-functions: transformedindexbasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,84 +62,275 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
sizeinfo.hh
│ │ │ │ +
transformedindexbasis.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SIZEINFO_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SIZEINFO_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH
│ │ │ │
5
│ │ │ │ -
6#include <array>
│ │ │ │ -
7
│ │ │ │ -
8namespace Dune {
│ │ │ │ -
9namespace Functions {
│ │ │ │ -
10
│ │ │ │ -
11
│ │ │ │ -
12
│ │ │ │ -
23template<class B>
│ │ │ │ - │ │ │ │ -
25{
│ │ │ │ -
26public:
│ │ │ │ -
27 using Basis = B;
│ │ │ │ -
28 using size_type = typename Basis::size_type;
│ │ │ │ -
29 using SizePrefix = typename Basis::SizePrefix;
│ │ │ │ +
6#include <tuple>
│ │ │ │ +
7#include <utility>
│ │ │ │ +
8
│ │ │ │ +
9#include <dune/common/std/apply.hh>
│ │ │ │ +
10#include <dune/common/hybridutilities.hh>
│ │ │ │ +
11#include <dune/common/reservedvector.hh>
│ │ │ │ +
12#include <dune/common/typeutilities.hh>
│ │ │ │ +
13#include <dune/common/hybridutilities.hh>
│ │ │ │ +
14
│ │ │ │ +
15#include <dune/typetree/compositenode.hh>
│ │ │ │ +
16#include <dune/typetree/utility.hh>
│ │ │ │ +
17
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
25
│ │ │ │ +
26
│ │ │ │ +
27namespace Dune {
│ │ │ │ +
28namespace Functions {
│ │ │ │ +
29namespace Experimental {
│ │ │ │
30
│ │ │ │ -
34 SizeInfo(const Basis& basis) :
│ │ │ │ -
35 basis_(&basis)
│ │ │ │ -
36 {}
│ │ │ │ -
37
│ │ │ │ -
41 size_type operator()(const SizePrefix& prefix) const
│ │ │ │ -
42 {
│ │ │ │ -
43 return basis_->size(prefix);
│ │ │ │ -
44 }
│ │ │ │ -
45
│ │ │ │ -
52 size_type size(const SizePrefix& prefix) const
│ │ │ │ -
53 {
│ │ │ │ -
54 return basis_->size(prefix);
│ │ │ │ -
55 }
│ │ │ │ +
31// *****************************************************************************
│ │ │ │ +
32// *****************************************************************************
│ │ │ │ +
33
│ │ │ │ +
50template<class RPB, class T>
│ │ │ │ + │ │ │ │ +
52{
│ │ │ │ +
53 using Transformation = T;
│ │ │ │ +
54
│ │ │ │ + │ │ │ │
56
│ │ │ │ -
57 operator size_type () const
│ │ │ │ -
58 {
│ │ │ │ -
59 return basis_->dimension();
│ │ │ │ -
60 }
│ │ │ │ -
61
│ │ │ │ -
62protected:
│ │ │ │ +
57public:
│ │ │ │ +
58
│ │ │ │ +
59 using RawPreBasis = RPB;
│ │ │ │ +
60
│ │ │ │ +
62 using GridView = typename RawPreBasis::GridView;
│ │ │ │
63
│ │ │ │ -
64 const Basis* basis_;
│ │ │ │ -
65};
│ │ │ │ +
65 using size_type = std::size_t;
│ │ │ │
66
│ │ │ │ -
67
│ │ │ │ -
68template<class Basis>
│ │ │ │ -
69SizeInfo<Basis> sizeInfo(const Basis& basis)
│ │ │ │ -
70{
│ │ │ │ -
71 return SizeInfo<Basis>(basis);
│ │ │ │ -
72}
│ │ │ │ +
68 using Node = typename RawPreBasis::Node;
│ │ │ │ +
69
│ │ │ │ +
70 static constexpr size_type maxMultiIndexSize = Transformation::maxIndexSize;
│ │ │ │ +
71 static constexpr size_type minMultiIndexSize = Transformation::minIndexSize;
│ │ │ │ +
72 static constexpr size_type multiIndexBufferSize = std::max(RawPreBasis::multiIndexBufferSize, maxMultiIndexSize);
│ │ │ │
73
│ │ │ │ -
74
│ │ │ │ -
75
│ │ │ │ -
76} // end namespace Functions
│ │ │ │ -
77} // end namespace Dune
│ │ │ │ -
78
│ │ │ │ -
79#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SIZEINFO_HH
│ │ │ │ +
79 template<class RPB_R, class T_R>
│ │ │ │ +
80 TransformedIndexPreBasis(RPB_R&& rawPreBasis, T_R&& transformation) :
│ │ │ │ +
81 rawPreBasis_(std::forward<RPB_R>(rawPreBasis)),
│ │ │ │ +
82 transformation_(std::forward<T_R>(transformation))
│ │ │ │ +
83 {}
│ │ │ │ +
84
│ │ │ │ + │ │ │ │ +
87 {
│ │ │ │ +
88 rawPreBasis_.initializeIndices();
│ │ │ │ +
89 }
│ │ │ │ +
90
│ │ │ │ +
92 const GridView& gridView() const
│ │ │ │ +
93 {
│ │ │ │ +
94 return rawPreBasis_.gridView();
│ │ │ │ +
95 }
│ │ │ │ +
96
│ │ │ │ +
98 void update(const GridView& gv)
│ │ │ │ +
99 {
│ │ │ │ +
100 rawPreBasis_.update(gv);
│ │ │ │ +
101 }
│ │ │ │ +
102
│ │ │ │ + │ │ │ │ +
114 {
│ │ │ │ +
115 return rawPreBasis_.makeNode();
│ │ │ │ +
116 }
│ │ │ │ +
117
│ │ │ │ + │ │ │ │ +
120 {
│ │ │ │ +
121 return size(Dune::ReservedVector<size_type, multiIndexBufferSize>{});
│ │ │ │ +
122 }
│ │ │ │ +
123
│ │ │ │ +
125 template<class SizePrefix>
│ │ │ │ +
126 size_type size(const SizePrefix& prefix) const
│ │ │ │ +
127 {
│ │ │ │ +
128 return transformation_.size(prefix, rawPreBasis_);
│ │ │ │ +
129 }
│ │ │ │ +
130
│ │ │ │ + │ │ │ │ +
133 {
│ │ │ │ +
134 return transformation_.dimension(rawPreBasis_);
│ │ │ │ +
135 }
│ │ │ │ +
136
│ │ │ │ + │ │ │ │ +
139 {
│ │ │ │ +
140 return rawPreBasis_.maxNodeSize();
│ │ │ │ +
141 }
│ │ │ │ +
142
│ │ │ │ + │ │ │ │ +
144 {
│ │ │ │ +
145 return rawPreBasis_;
│ │ │ │ +
146 }
│ │ │ │ +
147
│ │ │ │ + │ │ │ │ +
149 {
│ │ │ │ +
150 return rawPreBasis_;
│ │ │ │ +
151 }
│ │ │ │ +
152
│ │ │ │ +
153 template<class MultiIndex>
│ │ │ │ +
154 void transformIndex(MultiIndex& multiIndex) const
│ │ │ │ +
155 {
│ │ │ │ +
156 transformation_.transformIndex(multiIndex, rawPreBasis_);
│ │ │ │ +
157 }
│ │ │ │ +
158
│ │ │ │ +
159 template<typename It>
│ │ │ │ +
160 It indices(const Node& node, It it) const
│ │ │ │ +
161 {
│ │ │ │ +
162 rawPreBasis().indices(node, it);
│ │ │ │ +
163 for(std::size_t i=0; i<node.size(); ++i)
│ │ │ │ +
164 {
│ │ │ │ +
165 transformIndex(*it);
│ │ │ │ +
166 ++it;
│ │ │ │ +
167 }
│ │ │ │ +
168 return it;
│ │ │ │ +
169 }
│ │ │ │ +
170
│ │ │ │ +
171protected:
│ │ │ │ + │ │ │ │ +
173 Transformation transformation_;
│ │ │ │ +
174};
│ │ │ │ +
175
│ │ │ │ +
176template<class RPB, class T>
│ │ │ │ + │ │ │ │ +
178
│ │ │ │ +
179
│ │ │ │ +
180} // end namespace Experimental
│ │ │ │ +
181
│ │ │ │ +
182
│ │ │ │ +
183namespace BasisFactory {
│ │ │ │ +
184namespace Experimental {
│ │ │ │ +
185
│ │ │ │ +
197template<class RawPreBasisFactory, class Transformation>
│ │ │ │ + │ │ │ │ +
199 RawPreBasisFactory&& preBasisFactory,
│ │ │ │ +
200 Transformation&& transformation)
│ │ │ │ +
201{
│ │ │ │ +
202 return [
│ │ │ │ +
203 preBasisFactory=std::forward<RawPreBasisFactory>(preBasisFactory),
│ │ │ │ +
204 transformation =std::forward<Transformation>(transformation)
│ │ │ │ +
205 ](const auto& gridView) {
│ │ │ │ +
206 return Dune::Functions::Experimental::TransformedIndexPreBasis(preBasisFactory(gridView), std::move(transformation));
│ │ │ │ +
207 };
│ │ │ │ +
208}
│ │ │ │ +
209
│ │ │ │ +
210
│ │ │ │ +
211
│ │ │ │ +
230template<class IndexTransformation, class SizeImplementation, std::size_t minIS, std::size_t maxIS>
│ │ │ │ + │ │ │ │ +
232{
│ │ │ │ +
233public:
│ │ │ │ +
234
│ │ │ │ +
235 static constexpr std::size_t minIndexSize = minIS;
│ │ │ │ +
236 static constexpr std::size_t maxIndexSize = maxIS;
│ │ │ │ +
237
│ │ │ │ +
238 template<class IT_R, class SI_R>
│ │ │ │ +
239 GenericIndexingTransformation(IT_R&& indexTransformation, SI_R&& sizeImplementation) :
│ │ │ │ +
240 indexTransformation_(std::forward<IT_R>(indexTransformation)),
│ │ │ │ +
241 sizeImplementation_(std::forward<SI_R>(sizeImplementation))
│ │ │ │ +
242 {}
│ │ │ │ +
243
│ │ │ │ +
244 template<class MultiIndex, class PreBasis>
│ │ │ │ +
245 void transformIndex(MultiIndex& multiIndex, const PreBasis& preBasis) const
│ │ │ │ +
246 {
│ │ │ │ +
247 indexTransformation_(multiIndex, preBasis);
│ │ │ │ +
248 }
│ │ │ │ +
249
│ │ │ │ +
250 template<class Prefix, class PreBasis>
│ │ │ │ +
251 auto size(const Prefix& prefix, const PreBasis& preBasis) const
│ │ │ │ +
252 {
│ │ │ │ +
253 return sizeImplementation_(prefix, preBasis);
│ │ │ │ +
254 }
│ │ │ │ +
255
│ │ │ │ +
256 template<class PreBasis>
│ │ │ │ +
257 auto dimension(const PreBasis& preBasis) const
│ │ │ │ +
258 {
│ │ │ │ +
259 return preBasis.dimension();
│ │ │ │ +
260 }
│ │ │ │ +
261
│ │ │ │ +
262private:
│ │ │ │ +
263 IndexTransformation indexTransformation_;
│ │ │ │ +
264 SizeImplementation sizeImplementation_;
│ │ │ │ +
265};
│ │ │ │ +
266
│ │ │ │ +
267
│ │ │ │ +
268
│ │ │ │ +
287template<class IndexTransformation, class SizeImplementation, std::size_t minIndexSize, std::size_t maxIndexSize>
│ │ │ │ +
288auto indexTransformation(IndexTransformation&& indexTransformation, SizeImplementation&& sizeImplementation, Dune::index_constant<minIndexSize>, Dune::index_constant<maxIndexSize>)
│ │ │ │ +
289{
│ │ │ │ + │ │ │ │ +
291 std::decay_t<IndexTransformation>,
│ │ │ │ +
292 std::decay_t<SizeImplementation>,
│ │ │ │ +
293 minIndexSize, maxIndexSize>(
│ │ │ │ +
294 std::forward<IndexTransformation>(indexTransformation),
│ │ │ │ +
295 std::forward<SizeImplementation>(sizeImplementation));
│ │ │ │ +
296}
│ │ │ │ +
297
│ │ │ │ +
298
│ │ │ │ +
299} // end namespace Experimental
│ │ │ │ +
300} // end namespace BasisFactory
│ │ │ │ +
301} // end namespace Functions
│ │ │ │ +
302} // end namespace Dune
│ │ │ │ +
303
│ │ │ │ +
304
│ │ │ │ +
305#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
SizeInfo< Basis > sizeInfo(const Basis &basis)
Definition: sizeinfo.hh:69
│ │ │ │ -
A class encapsulating size information.
Definition: sizeinfo.hh:25
│ │ │ │ -
typename Basis::SizePrefix SizePrefix
Definition: sizeinfo.hh:29
│ │ │ │ -
size_type size(const SizePrefix &prefix) const
Return number possible values for next position in multi index.
Definition: sizeinfo.hh:52
│ │ │ │ -
size_type operator()(const SizePrefix &prefix) const
Return number possible values for next position in multi index.
Definition: sizeinfo.hh:41
│ │ │ │ -
typename Basis::size_type size_type
Definition: sizeinfo.hh:28
│ │ │ │ -
B Basis
Definition: sizeinfo.hh:27
│ │ │ │ -
SizeInfo(const Basis &basis)
Construct from basis.
Definition: sizeinfo.hh:34
│ │ │ │ -
const Basis * basis_
Definition: sizeinfo.hh:64
│ │ │ │ +
auto transformIndices(RawPreBasisFactory &&preBasisFactory, Transformation &&transformation)
Create a TransformedIndexPreBasisFactory.
Definition: transformedindexbasis.hh:198
│ │ │ │ +
auto indexTransformation(IndexTransformation &&indexTransformation, SizeImplementation &&sizeImplementation, Dune::index_constant< minIndexSize >, Dune::index_constant< maxIndexSize >)
A generic implementation of a transformation.
Definition: transformedindexbasis.hh:288
│ │ │ │ +
TransformedIndexPreBasis(RPB &&, T &&) -> TransformedIndexPreBasis< std::decay_t< RPB >, std::decay_t< T > >
│ │ │ │ +
A pre-basis transforming multi-indices.
Definition: transformedindexbasis.hh:52
│ │ │ │ +
It indices(const Node &node, It it) const
Definition: transformedindexbasis.hh:160
│ │ │ │ +
Transformation transformation_
Definition: transformedindexbasis.hh:173
│ │ │ │ +
void initializeIndices()
Initialize the global indices.
Definition: transformedindexbasis.hh:86
│ │ │ │ +
typename RawPreBasis::GridView GridView
The grid view that the FE basis is defined on.
Definition: transformedindexbasis.hh:62
│ │ │ │ +
void transformIndex(MultiIndex &multiIndex) const
Definition: transformedindexbasis.hh:154
│ │ │ │ +
RawPreBasis rawPreBasis_
Definition: transformedindexbasis.hh:172
│ │ │ │ +
typename RawPreBasis::Node Node
Template mapping root tree path to type of created tree node.
Definition: transformedindexbasis.hh:68
│ │ │ │ +
TransformedIndexPreBasis(RPB_R &&rawPreBasis, T_R &&transformation)
Constructor for given child pre-basis objects.
Definition: transformedindexbasis.hh:80
│ │ │ │ +
RawPreBasis & rawPreBasis()
Definition: transformedindexbasis.hh:148
│ │ │ │ +
static constexpr size_type maxMultiIndexSize
Definition: transformedindexbasis.hh:70
│ │ │ │ +
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition: transformedindexbasis.hh:98
│ │ │ │ +
Node makeNode() const
Create tree node with given root tree path.
Definition: transformedindexbasis.hh:113
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: transformedindexbasis.hh:92
│ │ │ │ +
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition: transformedindexbasis.hh:126
│ │ │ │ +
RPB RawPreBasis
Definition: transformedindexbasis.hh:59
│ │ │ │ +
size_type size() const
Same as size(prefix) with empty prefix.
Definition: transformedindexbasis.hh:119
│ │ │ │ +
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition: transformedindexbasis.hh:138
│ │ │ │ +
std::size_t size_type
Type used for indices and size information.
Definition: transformedindexbasis.hh:65
│ │ │ │ +
static constexpr size_type multiIndexBufferSize
Definition: transformedindexbasis.hh:72
│ │ │ │ +
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition: transformedindexbasis.hh:132
│ │ │ │ +
const RawPreBasis & rawPreBasis() const
Definition: transformedindexbasis.hh:143
│ │ │ │ +
static constexpr size_type minMultiIndexSize
Definition: transformedindexbasis.hh:71
│ │ │ │ +
A generic implementation of a transformation.
Definition: transformedindexbasis.hh:232
│ │ │ │ +
auto dimension(const PreBasis &preBasis) const
Definition: transformedindexbasis.hh:257
│ │ │ │ +
GenericIndexingTransformation(IT_R &&indexTransformation, SI_R &&sizeImplementation)
Definition: transformedindexbasis.hh:239
│ │ │ │ +
void transformIndex(MultiIndex &multiIndex, const PreBasis &preBasis) const
Definition: transformedindexbasis.hh:245
│ │ │ │ +
static constexpr std::size_t maxIndexSize
Definition: transformedindexbasis.hh:236
│ │ │ │ +
static constexpr std::size_t minIndexSize
Definition: transformedindexbasis.hh:235
│ │ │ │ +
auto size(const Prefix &prefix, const PreBasis &preBasis) const
Definition: transformedindexbasis.hh:251
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,101 +5,372 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -sizeinfo.hh │ │ │ │ │ +transformedindexbasis.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SIZEINFO_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SIZEINFO_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7 │ │ │ │ │ - 8namespace Dune { │ │ │ │ │ - 9namespace Functions { │ │ │ │ │ - 10 │ │ │ │ │ - 11 │ │ │ │ │ - 12 │ │ │ │ │ - 23template │ │ │ │ │ -24class SizeInfo │ │ │ │ │ - 25{ │ │ │ │ │ - 26public: │ │ │ │ │ -27 using Basis = B; │ │ │ │ │ -28 using size_type = typename Basis::size_type; │ │ │ │ │ -29 using SizePrefix = typename Basis::SizePrefix; │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8 │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14 │ │ │ │ │ + 15#include │ │ │ │ │ + 16#include │ │ │ │ │ + 17 │ │ │ │ │ + 18#include │ │ │ │ │ + 19#include │ │ │ │ │ + 20#include │ │ │ │ │ + 21#include │ │ │ │ │ + 22#include │ │ │ │ │ + 23#include │ │ │ │ │ + 24#include │ │ │ │ │ + 25 │ │ │ │ │ + 26 │ │ │ │ │ + 27namespace Dune { │ │ │ │ │ + 28namespace Functions { │ │ │ │ │ +29namespace Experimental { │ │ │ │ │ 30 │ │ │ │ │ -34 SizeInfo(const Basis& basis) : │ │ │ │ │ - 35 basis_(&basis) │ │ │ │ │ - 36 {} │ │ │ │ │ - 37 │ │ │ │ │ -41 size_type operator()(const SizePrefix& prefix) const │ │ │ │ │ - 42 { │ │ │ │ │ - 43 return basis_->size(prefix); │ │ │ │ │ - 44 } │ │ │ │ │ - 45 │ │ │ │ │ -52 size_type size(const SizePrefix& prefix) const │ │ │ │ │ - 53 { │ │ │ │ │ - 54 return basis_->size(prefix); │ │ │ │ │ - 55 } │ │ │ │ │ + 31/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ + 32/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ + 33 │ │ │ │ │ + 50template │ │ │ │ │ +51class TransformedIndexPreBasis │ │ │ │ │ + 52{ │ │ │ │ │ + 53 using Transformation = T; │ │ │ │ │ + 54 │ │ │ │ │ + 55 using This = TransformedIndexPreBasis; │ │ │ │ │ 56 │ │ │ │ │ -57 operator size_type () const │ │ │ │ │ - 58 { │ │ │ │ │ - 59 return basis_->dimension(); │ │ │ │ │ - 60 } │ │ │ │ │ - 61 │ │ │ │ │ - 62protected: │ │ │ │ │ + 57public: │ │ │ │ │ + 58 │ │ │ │ │ +59 using RawPreBasis = RPB; │ │ │ │ │ + 60 │ │ │ │ │ +62 using GridView = typename RawPreBasis::GridView; │ │ │ │ │ 63 │ │ │ │ │ -64 const Basis* basis_; │ │ │ │ │ - 65}; │ │ │ │ │ +65 using size_type = std::size_t; │ │ │ │ │ 66 │ │ │ │ │ - 67 │ │ │ │ │ - 68template │ │ │ │ │ -69SizeInfo sizeInfo(const Basis& basis) │ │ │ │ │ - 70{ │ │ │ │ │ - 71 return SizeInfo(basis); │ │ │ │ │ - 72} │ │ │ │ │ +68 using Node = typename RawPreBasis::Node; │ │ │ │ │ + 69 │ │ │ │ │ +70 static constexpr size_type maxMultiIndexSize = Transformation::maxIndexSize; │ │ │ │ │ +71 static constexpr size_type minMultiIndexSize = Transformation::minIndexSize; │ │ │ │ │ +72 static constexpr size_type multiIndexBufferSize = std::max(RawPreBasis:: │ │ │ │ │ +multiIndexBufferSize, maxMultiIndexSize); │ │ │ │ │ 73 │ │ │ │ │ - 74 │ │ │ │ │ - 75 │ │ │ │ │ - 76} // end namespace Functions │ │ │ │ │ - 77} // end namespace Dune │ │ │ │ │ - 78 │ │ │ │ │ - 79#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SIZEINFO_HH │ │ │ │ │ + 79 template │ │ │ │ │ +80 TransformedIndexPreBasis(RPB_R&& rawPreBasis, T_R&& transformation) : │ │ │ │ │ + 81 rawPreBasis_(std::forward(rawPreBasis)), │ │ │ │ │ + 82 transformation_(std::forward(transformation)) │ │ │ │ │ + 83 {} │ │ │ │ │ + 84 │ │ │ │ │ +86 void initializeIndices() │ │ │ │ │ + 87 { │ │ │ │ │ + 88 rawPreBasis_.initializeIndices(); │ │ │ │ │ + 89 } │ │ │ │ │ + 90 │ │ │ │ │ +92 const GridView& gridView() const │ │ │ │ │ + 93 { │ │ │ │ │ + 94 return rawPreBasis_.gridView(); │ │ │ │ │ + 95 } │ │ │ │ │ + 96 │ │ │ │ │ +98 void update(const GridView& gv) │ │ │ │ │ + 99 { │ │ │ │ │ + 100 rawPreBasis_.update(gv); │ │ │ │ │ + 101 } │ │ │ │ │ + 102 │ │ │ │ │ +113 Node makeNode() const │ │ │ │ │ + 114 { │ │ │ │ │ + 115 return rawPreBasis_.makeNode(); │ │ │ │ │ + 116 } │ │ │ │ │ + 117 │ │ │ │ │ +119 size_type size() const │ │ │ │ │ + 120 { │ │ │ │ │ + 121 return size(Dune::ReservedVector{}); │ │ │ │ │ + 122 } │ │ │ │ │ + 123 │ │ │ │ │ + 125 template │ │ │ │ │ +126 size_type size(const SizePrefix& prefix) const │ │ │ │ │ + 127 { │ │ │ │ │ + 128 return transformation_.size(prefix, rawPreBasis_); │ │ │ │ │ + 129 } │ │ │ │ │ + 130 │ │ │ │ │ +132 size_type dimension() const │ │ │ │ │ + 133 { │ │ │ │ │ + 134 return transformation_.dimension(rawPreBasis_); │ │ │ │ │ + 135 } │ │ │ │ │ + 136 │ │ │ │ │ +138 size_type maxNodeSize() const │ │ │ │ │ + 139 { │ │ │ │ │ + 140 return rawPreBasis_.maxNodeSize(); │ │ │ │ │ + 141 } │ │ │ │ │ + 142 │ │ │ │ │ +143 const RawPreBasis& rawPreBasis() const │ │ │ │ │ + 144 { │ │ │ │ │ + 145 return rawPreBasis_; │ │ │ │ │ + 146 } │ │ │ │ │ + 147 │ │ │ │ │ +148 RawPreBasis& rawPreBasis() │ │ │ │ │ + 149 { │ │ │ │ │ + 150 return rawPreBasis_; │ │ │ │ │ + 151 } │ │ │ │ │ + 152 │ │ │ │ │ + 153 template │ │ │ │ │ +154 void transformIndex(MultiIndex& multiIndex) const │ │ │ │ │ + 155 { │ │ │ │ │ + 156 transformation_.transformIndex(multiIndex, rawPreBasis_); │ │ │ │ │ + 157 } │ │ │ │ │ + 158 │ │ │ │ │ + 159 template │ │ │ │ │ +160 It indices(const Node& node, It it) const │ │ │ │ │ + 161 { │ │ │ │ │ + 162 rawPreBasis().indices(node, it); │ │ │ │ │ + 163 for(std::size_t i=0; i │ │ │ │ │ +177TransformedIndexPreBasis(RPB&&, T&&) -> TransformedIndexPreBasis, std::decay_t>; │ │ │ │ │ + 178 │ │ │ │ │ + 179 │ │ │ │ │ + 180} // end namespace Experimental │ │ │ │ │ + 181 │ │ │ │ │ + 182 │ │ │ │ │ + 183namespace BasisFactory { │ │ │ │ │ + 184namespace Experimental { │ │ │ │ │ + 185 │ │ │ │ │ + 197template │ │ │ │ │ +198auto transformIndices( │ │ │ │ │ + 199 RawPreBasisFactory&& preBasisFactory, │ │ │ │ │ + 200 Transformation&& transformation) │ │ │ │ │ + 201{ │ │ │ │ │ + 202 return [ │ │ │ │ │ + 203 preBasisFactory=std::forward(preBasisFactory), │ │ │ │ │ + 204 transformation =std::forward(transformation) │ │ │ │ │ + 205 ](const auto& gridView) { │ │ │ │ │ + 206 return Dune::Functions::Experimental::TransformedIndexPreBasis │ │ │ │ │ +(preBasisFactory(gridView), std::move(transformation)); │ │ │ │ │ + 207 }; │ │ │ │ │ + 208} │ │ │ │ │ + 209 │ │ │ │ │ + 210 │ │ │ │ │ + 211 │ │ │ │ │ + 230template │ │ │ │ │ +231class GenericIndexingTransformation │ │ │ │ │ + 232{ │ │ │ │ │ + 233public: │ │ │ │ │ + 234 │ │ │ │ │ +235 static constexpr std::size_t minIndexSize = minIS; │ │ │ │ │ +236 static constexpr std::size_t maxIndexSize = maxIS; │ │ │ │ │ + 237 │ │ │ │ │ + 238 template │ │ │ │ │ +239 GenericIndexingTransformation(IT_R&& indexTransformation, SI_R&& │ │ │ │ │ +sizeImplementation) : │ │ │ │ │ + 240 indexTransformation_(std::forward(indexTransformation)), │ │ │ │ │ + 241 sizeImplementation_(std::forward(sizeImplementation)) │ │ │ │ │ + 242 {} │ │ │ │ │ + 243 │ │ │ │ │ + 244 template │ │ │ │ │ +245 void transformIndex(MultiIndex& multiIndex, const PreBasis& preBasis) const │ │ │ │ │ + 246 { │ │ │ │ │ + 247 indexTransformation_(multiIndex, preBasis); │ │ │ │ │ + 248 } │ │ │ │ │ + 249 │ │ │ │ │ + 250 template │ │ │ │ │ +251 auto size(const Prefix& prefix, const PreBasis& preBasis) const │ │ │ │ │ + 252 { │ │ │ │ │ + 253 return sizeImplementation_(prefix, preBasis); │ │ │ │ │ + 254 } │ │ │ │ │ + 255 │ │ │ │ │ + 256 template │ │ │ │ │ +257 auto dimension(const PreBasis& preBasis) const │ │ │ │ │ + 258 { │ │ │ │ │ + 259 return preBasis.dimension(); │ │ │ │ │ + 260 } │ │ │ │ │ + 261 │ │ │ │ │ + 262private: │ │ │ │ │ + 263 IndexTransformation indexTransformation_; │ │ │ │ │ + 264 SizeImplementation sizeImplementation_; │ │ │ │ │ + 265}; │ │ │ │ │ + 266 │ │ │ │ │ + 267 │ │ │ │ │ + 268 │ │ │ │ │ + 287template │ │ │ │ │ +288auto indexTransformation(IndexTransformation&& indexTransformation, │ │ │ │ │ +SizeImplementation&& sizeImplementation, Dune::index_constant, │ │ │ │ │ +Dune::index_constant) │ │ │ │ │ + 289{ │ │ │ │ │ + 290 return GenericIndexingTransformation< │ │ │ │ │ + 291 std::decay_t, │ │ │ │ │ + 292 std::decay_t, │ │ │ │ │ + 293 minIndexSize, maxIndexSize>( │ │ │ │ │ + 294 std::forward(indexTransformation), │ │ │ │ │ + 295 std::forward(sizeImplementation)); │ │ │ │ │ + 296} │ │ │ │ │ + 297 │ │ │ │ │ + 298 │ │ │ │ │ + 299} // end namespace Experimental │ │ │ │ │ + 300} // end namespace BasisFactory │ │ │ │ │ + 301} // end namespace Functions │ │ │ │ │ + 302} // end namespace Dune │ │ │ │ │ + 303 │ │ │ │ │ + 304 │ │ │ │ │ + 305#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH │ │ │ │ │ +type_traits.hh │ │ │ │ │ +utility.hh │ │ │ │ │ +staticforloop.hh │ │ │ │ │ +basistags.hh │ │ │ │ │ +nodes.hh │ │ │ │ │ +defaultglobalbasis.hh │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::sizeInfo │ │ │ │ │ -SizeInfo< Basis > sizeInfo(const Basis &basis) │ │ │ │ │ -Definition: sizeinfo.hh:69 │ │ │ │ │ -Dune::Functions::SizeInfo │ │ │ │ │ -A class encapsulating size information. │ │ │ │ │ -Definition: sizeinfo.hh:25 │ │ │ │ │ -Dune::Functions::SizeInfo::SizePrefix │ │ │ │ │ -typename Basis::SizePrefix SizePrefix │ │ │ │ │ -Definition: sizeinfo.hh:29 │ │ │ │ │ -Dune::Functions::SizeInfo::size │ │ │ │ │ +Dune::Functions::BasisFactory::Experimental::transformIndices │ │ │ │ │ +auto transformIndices(RawPreBasisFactory &&preBasisFactory, Transformation │ │ │ │ │ +&&transformation) │ │ │ │ │ +Create a TransformedIndexPreBasisFactory. │ │ │ │ │ +Definition: transformedindexbasis.hh:198 │ │ │ │ │ +Dune::Functions::BasisFactory::Experimental::indexTransformation │ │ │ │ │ +auto indexTransformation(IndexTransformation &&indexTransformation, │ │ │ │ │ +SizeImplementation &&sizeImplementation, Dune::index_constant< minIndexSize >, │ │ │ │ │ +Dune::index_constant< maxIndexSize >) │ │ │ │ │ +A generic implementation of a transformation. │ │ │ │ │ +Definition: transformedindexbasis.hh:288 │ │ │ │ │ +Dune::Functions::Experimental::TransformedIndexPreBasis │ │ │ │ │ +TransformedIndexPreBasis(RPB &&, T &&) -> TransformedIndexPreBasis< std:: │ │ │ │ │ +decay_t< RPB >, std::decay_t< T > > │ │ │ │ │ +Dune::Functions::Experimental::TransformedIndexPreBasis │ │ │ │ │ +A pre-basis transforming multi-indices. │ │ │ │ │ +Definition: transformedindexbasis.hh:52 │ │ │ │ │ +Dune::Functions::Experimental::TransformedIndexPreBasis::indices │ │ │ │ │ +It indices(const Node &node, It it) const │ │ │ │ │ +Definition: transformedindexbasis.hh:160 │ │ │ │ │ +Dune::Functions::Experimental::TransformedIndexPreBasis::transformation_ │ │ │ │ │ +Transformation transformation_ │ │ │ │ │ +Definition: transformedindexbasis.hh:173 │ │ │ │ │ +Dune::Functions::Experimental::TransformedIndexPreBasis::initializeIndices │ │ │ │ │ +void initializeIndices() │ │ │ │ │ +Initialize the global indices. │ │ │ │ │ +Definition: transformedindexbasis.hh:86 │ │ │ │ │ +Dune::Functions::Experimental::TransformedIndexPreBasis::GridView │ │ │ │ │ +typename RawPreBasis::GridView GridView │ │ │ │ │ +The grid view that the FE basis is defined on. │ │ │ │ │ +Definition: transformedindexbasis.hh:62 │ │ │ │ │ +Dune::Functions::Experimental::TransformedIndexPreBasis::transformIndex │ │ │ │ │ +void transformIndex(MultiIndex &multiIndex) const │ │ │ │ │ +Definition: transformedindexbasis.hh:154 │ │ │ │ │ +Dune::Functions::Experimental::TransformedIndexPreBasis::rawPreBasis_ │ │ │ │ │ +RawPreBasis rawPreBasis_ │ │ │ │ │ +Definition: transformedindexbasis.hh:172 │ │ │ │ │ +Dune::Functions::Experimental::TransformedIndexPreBasis::Node │ │ │ │ │ +typename RawPreBasis::Node Node │ │ │ │ │ +Template mapping root tree path to type of created tree node. │ │ │ │ │ +Definition: transformedindexbasis.hh:68 │ │ │ │ │ +Dune::Functions::Experimental::TransformedIndexPreBasis:: │ │ │ │ │ +TransformedIndexPreBasis │ │ │ │ │ +TransformedIndexPreBasis(RPB_R &&rawPreBasis, T_R &&transformation) │ │ │ │ │ +Constructor for given child pre-basis objects. │ │ │ │ │ +Definition: transformedindexbasis.hh:80 │ │ │ │ │ +Dune::Functions::Experimental::TransformedIndexPreBasis::rawPreBasis │ │ │ │ │ +RawPreBasis & rawPreBasis() │ │ │ │ │ +Definition: transformedindexbasis.hh:148 │ │ │ │ │ +Dune::Functions::Experimental::TransformedIndexPreBasis::maxMultiIndexSize │ │ │ │ │ +static constexpr size_type maxMultiIndexSize │ │ │ │ │ +Definition: transformedindexbasis.hh:70 │ │ │ │ │ +Dune::Functions::Experimental::TransformedIndexPreBasis::update │ │ │ │ │ +void update(const GridView &gv) │ │ │ │ │ +Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ +Definition: transformedindexbasis.hh:98 │ │ │ │ │ +Dune::Functions::Experimental::TransformedIndexPreBasis::makeNode │ │ │ │ │ +Node makeNode() const │ │ │ │ │ +Create tree node with given root tree path. │ │ │ │ │ +Definition: transformedindexbasis.hh:113 │ │ │ │ │ +Dune::Functions::Experimental::TransformedIndexPreBasis::gridView │ │ │ │ │ +const GridView & gridView() const │ │ │ │ │ +Obtain the grid view that the basis is defined on. │ │ │ │ │ +Definition: transformedindexbasis.hh:92 │ │ │ │ │ +Dune::Functions::Experimental::TransformedIndexPreBasis::size │ │ │ │ │ size_type size(const SizePrefix &prefix) const │ │ │ │ │ -Return number possible values for next position in multi index. │ │ │ │ │ -Definition: sizeinfo.hh:52 │ │ │ │ │ -Dune::Functions::SizeInfo::operator() │ │ │ │ │ -size_type operator()(const SizePrefix &prefix) const │ │ │ │ │ -Return number possible values for next position in multi index. │ │ │ │ │ -Definition: sizeinfo.hh:41 │ │ │ │ │ -Dune::Functions::SizeInfo::size_type │ │ │ │ │ -typename Basis::size_type size_type │ │ │ │ │ -Definition: sizeinfo.hh:28 │ │ │ │ │ -Dune::Functions::SizeInfo::Basis │ │ │ │ │ -B Basis │ │ │ │ │ -Definition: sizeinfo.hh:27 │ │ │ │ │ -Dune::Functions::SizeInfo::SizeInfo │ │ │ │ │ -SizeInfo(const Basis &basis) │ │ │ │ │ -Construct from basis. │ │ │ │ │ -Definition: sizeinfo.hh:34 │ │ │ │ │ -Dune::Functions::SizeInfo::basis_ │ │ │ │ │ -const Basis * basis_ │ │ │ │ │ -Definition: sizeinfo.hh:64 │ │ │ │ │ +Return number of possible values for next position in multi index. │ │ │ │ │ +Definition: transformedindexbasis.hh:126 │ │ │ │ │ +Dune::Functions::Experimental::TransformedIndexPreBasis::RawPreBasis │ │ │ │ │ +RPB RawPreBasis │ │ │ │ │ +Definition: transformedindexbasis.hh:59 │ │ │ │ │ +Dune::Functions::Experimental::TransformedIndexPreBasis::size │ │ │ │ │ +size_type size() const │ │ │ │ │ +Same as size(prefix) with empty prefix. │ │ │ │ │ +Definition: transformedindexbasis.hh:119 │ │ │ │ │ +Dune::Functions::Experimental::TransformedIndexPreBasis::maxNodeSize │ │ │ │ │ +size_type maxNodeSize() const │ │ │ │ │ +Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ +Definition: transformedindexbasis.hh:138 │ │ │ │ │ +Dune::Functions::Experimental::TransformedIndexPreBasis::size_type │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +Type used for indices and size information. │ │ │ │ │ +Definition: transformedindexbasis.hh:65 │ │ │ │ │ +Dune::Functions::Experimental::TransformedIndexPreBasis::multiIndexBufferSize │ │ │ │ │ +static constexpr size_type multiIndexBufferSize │ │ │ │ │ +Definition: transformedindexbasis.hh:72 │ │ │ │ │ +Dune::Functions::Experimental::TransformedIndexPreBasis::dimension │ │ │ │ │ +size_type dimension() const │ │ │ │ │ +Get the total dimension of the space spanned by this basis. │ │ │ │ │ +Definition: transformedindexbasis.hh:132 │ │ │ │ │ +Dune::Functions::Experimental::TransformedIndexPreBasis::rawPreBasis │ │ │ │ │ +const RawPreBasis & rawPreBasis() const │ │ │ │ │ +Definition: transformedindexbasis.hh:143 │ │ │ │ │ +Dune::Functions::Experimental::TransformedIndexPreBasis::minMultiIndexSize │ │ │ │ │ +static constexpr size_type minMultiIndexSize │ │ │ │ │ +Definition: transformedindexbasis.hh:71 │ │ │ │ │ +Dune::Functions::BasisFactory::Experimental::GenericIndexingTransformation │ │ │ │ │ +A generic implementation of a transformation. │ │ │ │ │ +Definition: transformedindexbasis.hh:232 │ │ │ │ │ +Dune::Functions::BasisFactory::Experimental::GenericIndexingTransformation:: │ │ │ │ │ +dimension │ │ │ │ │ +auto dimension(const PreBasis &preBasis) const │ │ │ │ │ +Definition: transformedindexbasis.hh:257 │ │ │ │ │ +Dune::Functions::BasisFactory::Experimental::GenericIndexingTransformation:: │ │ │ │ │ +GenericIndexingTransformation │ │ │ │ │ +GenericIndexingTransformation(IT_R &&indexTransformation, SI_R │ │ │ │ │ +&&sizeImplementation) │ │ │ │ │ +Definition: transformedindexbasis.hh:239 │ │ │ │ │ +Dune::Functions::BasisFactory::Experimental::GenericIndexingTransformation:: │ │ │ │ │ +transformIndex │ │ │ │ │ +void transformIndex(MultiIndex &multiIndex, const PreBasis &preBasis) const │ │ │ │ │ +Definition: transformedindexbasis.hh:245 │ │ │ │ │ +Dune::Functions::BasisFactory::Experimental::GenericIndexingTransformation:: │ │ │ │ │ +maxIndexSize │ │ │ │ │ +static constexpr std::size_t maxIndexSize │ │ │ │ │ +Definition: transformedindexbasis.hh:236 │ │ │ │ │ +Dune::Functions::BasisFactory::Experimental::GenericIndexingTransformation:: │ │ │ │ │ +minIndexSize │ │ │ │ │ +static constexpr std::size_t minIndexSize │ │ │ │ │ +Definition: transformedindexbasis.hh:235 │ │ │ │ │ +Dune::Functions::BasisFactory::Experimental::GenericIndexingTransformation:: │ │ │ │ │ +size │ │ │ │ │ +auto size(const Prefix &prefix, const PreBasis &preBasis) const │ │ │ │ │ +Definition: transformedindexbasis.hh:251 │ │ │ │ │ +concepts.hh │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00140.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: flatvectorview.hh File Reference │ │ │ │ +dune-functions: raviartthomasbasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,48 +63,70 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces | │ │ │ │ +Typedefs | │ │ │ │ Functions
│ │ │ │ -
flatvectorview.hh File Reference
│ │ │ │ +
raviartthomasbasis.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │
#include <array>
│ │ │ │ -#include <dune/common/concept.hh>
│ │ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ │ -#include <dune/common/indices.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/grid/common/capabilities.hh>
│ │ │ │ +#include <dune/grid/common/mcmgmapper.hh>
│ │ │ │ +#include <dune/localfunctions/common/localfiniteelementvariant.hh>
│ │ │ │ +#include <dune/localfunctions/raviartthomas.hh>
│ │ │ │ +#include <dune/localfunctions/raviartthomas/raviartthomas0cube2d.hh>
│ │ │ │ +#include <dune/localfunctions/raviartthomas/raviartthomas0cube3d.hh>
│ │ │ │ +#include <dune/localfunctions/raviartthomas/raviartthomas02d.hh>
│ │ │ │ +#include <dune/localfunctions/raviartthomas/raviartthomas03d.hh>
│ │ │ │ +#include <dune/localfunctions/raviartthomas/raviartthomas1cube2d.hh>
│ │ │ │ +#include <dune/localfunctions/raviartthomas/raviartthomas1cube3d.hh>
│ │ │ │ +#include <dune/localfunctions/raviartthomas/raviartthomas12d.hh>
│ │ │ │ +#include <dune/localfunctions/raviartthomas/raviartthomas2cube2d.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/globalvaluedlocalfiniteelement.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ +Classes

class  Dune::Functions::RaviartThomasPreBasis< GV, k >
 
class  Dune::Functions::RaviartThomasNode< GV, k >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
namespace  Dune::Functions::BasisFactory
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Typedefs

template<typename GV , int k>
using Dune::Functions::RaviartThomasBasis = DefaultGlobalBasis< RaviartThomasPreBasis< GV, k > >
 Basis of a k-th-order Raviart Thomas finite element space. More...
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<class T >
auto Dune::Functions::flatVectorView (T &t)
 Create flat vector view of passed mutable container. More...
 
template<class T >
auto Dune::Functions::flatVectorView (const T &t)
 Create flat vector view of passed const container. More...
 
template<class T >
auto Dune::Functions::flatVectorView (T &&t)
 Create flat vector view of passed container temporary. More...
 
template<std::size_t k>
auto Dune::Functions::BasisFactory::raviartThomas ()
 Create a pre-basis factory that can create a Raviart-Thomas pre-basis. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,36 +5,54 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -Namespaces | Functions │ │ │ │ │ -flatvectorview.hh File Reference │ │ │ │ │ +Classes | Namespaces | Typedefs | Functions │ │ │ │ │ +raviartthomasbasis.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ + Classes │ │ │ │ │ +class  Dune::Functions::RaviartThomasPreBasis<_GV,_k_> │ │ │ │ │ +  │ │ │ │ │ +class  Dune::Functions::RaviartThomasNode<_GV,_k_> │ │ │ │ │ +  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ +namespace  Dune::Functions::BasisFactory │ │ │ │ │ +  │ │ │ │ │ + Typedefs │ │ │ │ │ +template │ │ │ │ │ +using Dune::Functions::RaviartThomasBasis = DefaultGlobalBasis< │ │ │ │ │ + RaviartThomasPreBasis< GV, k > > │ │ │ │ │ +  Basis of a k-th-order Raviart Thomas finite element space. More... │ │ │ │ │ +  │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::flatVectorView (T &t) │ │ │ │ │ -  Create flat vector view of passed mutable container. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::flatVectorView (const T &t) │ │ │ │ │ -  Create flat vector view of passed const container. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::flatVectorView (T &&t) │ │ │ │ │ -  Create flat vector view of passed container temporary. More... │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::BasisFactory::raviartThomas () │ │ │ │ │ +  Create a pre-basis factory that can create a Raviart-Thomas pre-basis. │ │ │ │ │ + More... │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00140_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: flatvectorview.hh Source File │ │ │ │ +dune-functions: raviartthomasbasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,209 +62,445 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
flatvectorview.hh
│ │ │ │ +
raviartthomasbasis.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATVECTORVIEW_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATVECTORVIEW_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH
│ │ │ │
5
│ │ │ │ -
6
│ │ │ │ -
7#include <array>
│ │ │ │ +
6#include <array>
│ │ │ │ +
7#include <dune/common/exceptions.hh>
│ │ │ │
8
│ │ │ │ -
9#include <dune/common/concept.hh>
│ │ │ │ -
10#include <dune/common/hybridutilities.hh>
│ │ │ │ -
11#include <dune/common/indices.hh>
│ │ │ │ -
12
│ │ │ │ - │ │ │ │ -
14
│ │ │ │ -
15
│ │ │ │ -
16
│ │ │ │ -
17
│ │ │ │ -
18namespace Dune {
│ │ │ │ -
19namespace Functions {
│ │ │ │ -
20namespace Impl {
│ │ │ │ -
21
│ │ │ │ +
9#include <dune/grid/common/capabilities.hh>
│ │ │ │ +
10#include <dune/grid/common/mcmgmapper.hh>
│ │ │ │ +
11
│ │ │ │ +
12#include <dune/localfunctions/common/localfiniteelementvariant.hh>
│ │ │ │ +
13#include <dune/localfunctions/raviartthomas.hh>
│ │ │ │ +
14#include <dune/localfunctions/raviartthomas/raviartthomas0cube2d.hh>
│ │ │ │ +
15#include <dune/localfunctions/raviartthomas/raviartthomas0cube3d.hh>
│ │ │ │ +
16#include <dune/localfunctions/raviartthomas/raviartthomas02d.hh>
│ │ │ │ +
17#include <dune/localfunctions/raviartthomas/raviartthomas03d.hh>
│ │ │ │ +
18#include <dune/localfunctions/raviartthomas/raviartthomas1cube2d.hh>
│ │ │ │ +
19#include <dune/localfunctions/raviartthomas/raviartthomas1cube3d.hh>
│ │ │ │ +
20#include <dune/localfunctions/raviartthomas/raviartthomas12d.hh>
│ │ │ │ +
21#include <dune/localfunctions/raviartthomas/raviartthomas2cube2d.hh>
│ │ │ │
22
│ │ │ │ -
23template<class V>
│ │ │ │ -
24struct FlatVectorBackend
│ │ │ │ -
25{
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
26
│ │ │ │ -
27 template<class VV, class Index,
│ │ │ │ -
28 typename std::enable_if< models<Concept::HasIndexAccess, VV, Index>(), int>::type = 0>
│ │ │ │ -
29 static decltype(auto) getEntry(VV&& v, const Index& i)
│ │ │ │ -
30 {
│ │ │ │ -
31 return v[i];
│ │ │ │ -
32 }
│ │ │ │ -
33
│ │ │ │ -
34 template<class VV, class Index,
│ │ │ │ -
35 typename std::enable_if< not models<Concept::HasIndexAccess, VV, Index>(), int>::type = 0>
│ │ │ │ -
36 static decltype(auto) getEntry(VV&& v, const Index&)
│ │ │ │ -
37 {
│ │ │ │ -
38 return std::forward<VV>(v);
│ │ │ │ -
39 }
│ │ │ │ -
40
│ │ │ │ -
41 template<class VV,
│ │ │ │ -
42 typename std::enable_if< models<Concept::HasSizeMethod, VV>(), int>::type = 0>
│ │ │ │ -
43 static auto size(VV&& v)
│ │ │ │ -
44 {
│ │ │ │ -
45 return Dune::Hybrid::size(v);
│ │ │ │ -
46 }
│ │ │ │ -
47
│ │ │ │ -
48 template<class VV,
│ │ │ │ -
49 typename std::enable_if< not models<Concept::HasSizeMethod, VV>(), int>::type = 0>
│ │ │ │ -
50 static auto size(VV&&)
│ │ │ │ -
51 {
│ │ │ │ -
52 return Dune::index_constant<1>{};
│ │ │ │ -
53 }
│ │ │ │ -
54};
│ │ │ │ -
55
│ │ │ │ +
27namespace Dune {
│ │ │ │ +
28namespace Functions {
│ │ │ │ +
29
│ │ │ │ +
30namespace Impl {
│ │ │ │ +
31
│ │ │ │ +
32 template<int dim, typename D, typename R, std::size_t k>
│ │ │ │ +
33 struct RaviartThomasSimplexLocalInfo
│ │ │ │ +
34 {
│ │ │ │ +
35 // Dummy type, must be something that we can have a std::unique_ptr to
│ │ │ │ +
36 using FiniteElement = void*;
│ │ │ │ +
37 };
│ │ │ │ +
38
│ │ │ │ +
39 template<typename D, typename R>
│ │ │ │ +
40 struct RaviartThomasSimplexLocalInfo<2,D,R,0>
│ │ │ │ +
41 {
│ │ │ │ +
42 using FiniteElement = RT02DLocalFiniteElement<D,R>;
│ │ │ │ +
43 };
│ │ │ │ +
44
│ │ │ │ +
45 template<typename D, typename R>
│ │ │ │ +
46 struct RaviartThomasSimplexLocalInfo<2,D,R,1>
│ │ │ │ +
47 {
│ │ │ │ +
48 using FiniteElement = RT12DLocalFiniteElement<D,R>;
│ │ │ │ +
49 };
│ │ │ │ +
50
│ │ │ │ +
51 template<typename D, typename R>
│ │ │ │ +
52 struct RaviartThomasSimplexLocalInfo<3,D,R,0>
│ │ │ │ +
53 {
│ │ │ │ +
54 using FiniteElement = RT03DLocalFiniteElement<D,R>;
│ │ │ │ +
55 };
│ │ │ │
56
│ │ │ │ -
57
│ │ │ │ -
58
│ │ │ │ -
59template<class K, int n, int m>
│ │ │ │ -
60struct FlatVectorBackend<typename Dune::FieldMatrix<K, n, m> >
│ │ │ │ -
61{
│ │ │ │ -
62
│ │ │ │ -
63 template<class VV, class Index>
│ │ │ │ -
64 static decltype(auto) getEntry(VV&& v, const Index& i)
│ │ │ │ -
65 {
│ │ │ │ -
66 return v[i/m][i%m];
│ │ │ │ -
67 }
│ │ │ │ -
68
│ │ │ │ -
69 template<class VV>
│ │ │ │ -
70 static auto size(VV&& v)
│ │ │ │ -
71 {
│ │ │ │ -
72 return Dune::index_constant<n*m>{};
│ │ │ │ -
73 }
│ │ │ │ -
74};
│ │ │ │ +
57 template<int dim, typename D, typename R, std::size_t k>
│ │ │ │ +
58 struct RaviartThomasCubeLocalInfo
│ │ │ │ +
59 {
│ │ │ │ +
60 // Dummy type, must be something that we can have a std::unique_ptr to
│ │ │ │ +
61 using FiniteElement = void*;
│ │ │ │ +
62 };
│ │ │ │ +
63
│ │ │ │ +
64 template<typename D, typename R>
│ │ │ │ +
65 struct RaviartThomasCubeLocalInfo<2,D,R,0>
│ │ │ │ +
66 {
│ │ │ │ +
67 using FiniteElement = RT0Cube2DLocalFiniteElement<D,R>;
│ │ │ │ +
68 };
│ │ │ │ +
69
│ │ │ │ +
70 template<typename D, typename R>
│ │ │ │ +
71 struct RaviartThomasCubeLocalInfo<2,D,R,1>
│ │ │ │ +
72 {
│ │ │ │ +
73 using FiniteElement = RT1Cube2DLocalFiniteElement<D,R>;
│ │ │ │ +
74 };
│ │ │ │
75
│ │ │ │ -
76
│ │ │ │ -
77
│ │ │ │ -
78template<class K, std::size_t n>
│ │ │ │ -
79struct FlatVectorBackend< std::array<K, n> >
│ │ │ │ -
80{
│ │ │ │ +
76 template<typename D, typename R>
│ │ │ │ +
77 struct RaviartThomasCubeLocalInfo<2,D,R,2>
│ │ │ │ +
78 {
│ │ │ │ +
79 using FiniteElement = RT2Cube2DLocalFiniteElement<D,R>;
│ │ │ │ +
80 };
│ │ │ │
81
│ │ │ │ -
82 template<class VV, class Index>
│ │ │ │ -
83 static decltype(auto) getEntry(VV&& v, const Index& i)
│ │ │ │ +
82 template<typename D, typename R>
│ │ │ │ +
83 struct RaviartThomasCubeLocalInfo<3,D,R,0>
│ │ │ │
84 {
│ │ │ │ -
85 const auto innerSize = decltype(FlatVectorBackend<K>::size(v[0]))::value;
│ │ │ │ -
86 return FlatVectorBackend<K>::getEntry(v[i/innerSize], i%innerSize);
│ │ │ │ -
87 }
│ │ │ │ -
88
│ │ │ │ -
89 template<class VV>
│ │ │ │ -
90 static auto size(VV&& v)
│ │ │ │ -
91 {
│ │ │ │ -
92 const auto innerSize = decltype(FlatVectorBackend<K>::size(v[0]))::value;
│ │ │ │ -
93 return Dune::index_constant<n*innerSize>{};
│ │ │ │ -
94 }
│ │ │ │ -
95
│ │ │ │ -
96};
│ │ │ │ -
97
│ │ │ │ -
98
│ │ │ │ +
85 using FiniteElement = RT0Cube3DLocalFiniteElement<D,R>;
│ │ │ │ +
86 };
│ │ │ │ +
87
│ │ │ │ +
88 template<typename D, typename R>
│ │ │ │ +
89 struct RaviartThomasCubeLocalInfo<3,D,R,1>
│ │ │ │ +
90 {
│ │ │ │ +
91 using FiniteElement = RT1Cube3DLocalFiniteElement<D,R>;
│ │ │ │ +
92 };
│ │ │ │ +
93
│ │ │ │ +
94 template<typename GV, int dim, typename R, std::size_t k>
│ │ │ │ +
95 class RaviartThomasLocalFiniteElementMap
│ │ │ │ +
96 {
│ │ │ │ +
97 using D = typename GV::ctype;
│ │ │ │ +
98 constexpr static bool hasFixedElementType = Capabilities::hasSingleGeometryType<typename GV::Grid>::v;
│ │ │ │
99
│ │ │ │ -
100
│ │ │ │ -
101template<class T>
│ │ │ │ -
102class FlatVectorView
│ │ │ │ -
103{
│ │ │ │ -
104 using Backend = FlatVectorBackend<std::decay_t<T>>;
│ │ │ │ -
105public:
│ │ │ │ -
106 FlatVectorView(T& t) :
│ │ │ │ -
107 t_(&t)
│ │ │ │ -
108 {}
│ │ │ │ +
100 using CubeFiniteElement = typename RaviartThomasCubeLocalInfo<dim, D, R, k>::FiniteElement;
│ │ │ │ +
101 using SimplexFiniteElement = typename RaviartThomasSimplexLocalInfo<dim, D, R, k>::FiniteElement;
│ │ │ │ +
102
│ │ │ │ +
103 public:
│ │ │ │ +
104
│ │ │ │ +
105 using T = LocalBasisTraits<D, dim, FieldVector<D,dim>, R, dim, FieldVector<R,dim>, FieldMatrix<D,dim,dim> >;
│ │ │ │ +
106
│ │ │ │ +
107 constexpr static unsigned int topologyId = Capabilities::hasSingleGeometryType<typename GV::Grid>::topologyId; // meaningless if hasFixedElementType is false
│ │ │ │ +
108 constexpr static GeometryType type = GeometryType(topologyId, GV::dimension);
│ │ │ │
109
│ │ │ │ -
110 auto size() const
│ │ │ │ -
111 {
│ │ │ │ -
112 return Backend::size(*t_);
│ │ │ │ -
113 }
│ │ │ │ -
114
│ │ │ │ -
115 template<class Index>
│ │ │ │ -
116 decltype(auto) operator[](const Index& i) const
│ │ │ │ -
117 {
│ │ │ │ -
118 return Backend::getEntry(*t_, i);
│ │ │ │ -
119 }
│ │ │ │ -
120
│ │ │ │ -
121 template<class Index>
│ │ │ │ -
122 decltype(auto) operator[](const Index& i)
│ │ │ │ -
123 {
│ │ │ │ -
124 return Backend::getEntry(*t_, i);
│ │ │ │ -
125 }
│ │ │ │ -
126
│ │ │ │ -
127private:
│ │ │ │ -
128 T* t_;
│ │ │ │ -
129};
│ │ │ │ -
130
│ │ │ │ -
131
│ │ │ │ -
132template<class T>
│ │ │ │ -
133class FlatVectorView<T&&>
│ │ │ │ -
134{
│ │ │ │ -
135 using Backend = FlatVectorBackend<std::decay_t<T>>;
│ │ │ │ -
136public:
│ │ │ │ -
137 FlatVectorView(T&& t) :
│ │ │ │ -
138 t_(std::move(t))
│ │ │ │ -
139 {}
│ │ │ │ -
140
│ │ │ │ -
141 auto size() const
│ │ │ │ -
142 {
│ │ │ │ -
143 return Backend::size(t_);
│ │ │ │ -
144 }
│ │ │ │ -
145
│ │ │ │ -
146 template<class Index>
│ │ │ │ -
147 decltype(auto) operator[](const Index& i) const
│ │ │ │ -
148 {
│ │ │ │ -
149 return Backend::getEntry(t_, i);
│ │ │ │ -
150 }
│ │ │ │ -
151
│ │ │ │ -
152 template<class Index>
│ │ │ │ -
153 decltype(auto) operator[](const Index& i)
│ │ │ │ -
154 {
│ │ │ │ -
155 return Backend::getEntry(t_, i);
│ │ │ │ -
156 }
│ │ │ │ -
157
│ │ │ │ -
158private:
│ │ │ │ -
159 T t_;
│ │ │ │ -
160};
│ │ │ │ -
161
│ │ │ │ -
162} // namespace Impl
│ │ │ │ -
163
│ │ │ │ -
164
│ │ │ │ +
110 using FiniteElement = std::conditional_t<hasFixedElementType,
│ │ │ │ +
111 std::conditional_t<type.isCube(),CubeFiniteElement,SimplexFiniteElement>,
│ │ │ │ +
112 LocalFiniteElementVariant<CubeFiniteElement, SimplexFiniteElement> >;
│ │ │ │ +
113
│ │ │ │ +
114 // Each element facet can have its orientation reversed, hence there are
│ │ │ │ +
115 // 2^#facets different variants.
│ │ │ │ +
116 static std::size_t numVariants(GeometryType type)
│ │ │ │ +
117 {
│ │ │ │ +
118 auto numFacets = referenceElement<D,dim>(type).size(1);
│ │ │ │ +
119 return power(2,numFacets);
│ │ │ │ +
120 }
│ │ │ │ +
121
│ │ │ │ +
122 RaviartThomasLocalFiniteElementMap(const GV& gv)
│ │ │ │ +
123 : elementMapper_(gv, mcmgElementLayout()),
│ │ │ │ +
124 orient_(gv.size(0))
│ │ │ │ +
125 {
│ │ │ │ +
126 if constexpr (hasFixedElementType)
│ │ │ │ +
127 {
│ │ │ │ +
128 variants_.resize(numVariants(type));
│ │ │ │ +
129 for (size_t i = 0; i < numVariants(type); i++)
│ │ │ │ +
130 variants_[i] = FiniteElement(i);
│ │ │ │ +
131 }
│ │ │ │ +
132 else
│ │ │ │ +
133 {
│ │ │ │ +
134 // for mixed grids add offset for cubes
│ │ │ │ +
135 variants_.resize(numVariants(GeometryTypes::simplex(dim)) + numVariants(GeometryTypes::cube(dim)));
│ │ │ │ +
136 for (size_t i = 0; i < numVariants(GeometryTypes::simplex(dim)); i++)
│ │ │ │ +
137 variants_[i] = SimplexFiniteElement(i);
│ │ │ │ +
138 for (size_t i = 0; i < numVariants(GeometryTypes::cube(dim)); i++)
│ │ │ │ +
139 variants_[i + numVariants(GeometryTypes::simplex(dim))] = CubeFiniteElement(i);
│ │ │ │ +
140 }
│ │ │ │ +
141
│ │ │ │ +
142 for(const auto& cell : elements(gv))
│ │ │ │ +
143 {
│ │ │ │ +
144 unsigned int myId = elementMapper_.index(cell);
│ │ │ │ +
145 orient_[myId] = 0;
│ │ │ │ +
146
│ │ │ │ +
147 for (const auto& intersection : intersections(gv,cell))
│ │ │ │ +
148 {
│ │ │ │ +
149 if (intersection.neighbor() && (elementMapper_.index(intersection.outside()) > myId))
│ │ │ │ +
150 orient_[myId] |= (1 << intersection.indexInInside());
│ │ │ │ +
151 }
│ │ │ │ +
152
│ │ │ │ +
153 // for mixed grids add offset for cubes
│ │ │ │ +
154 if constexpr (!hasFixedElementType)
│ │ │ │ +
155 if (cell.type().isCube())
│ │ │ │ +
156 orient_[myId] += numVariants(GeometryTypes::simplex(dim));
│ │ │ │ +
157 }
│ │ │ │ +
158 }
│ │ │ │ +
159
│ │ │ │ +
160 template<class EntityType>
│ │ │ │ +
161 const FiniteElement& find(const EntityType& e) const
│ │ │ │ +
162 {
│ │ │ │ +
163 return variants_[orient_[elementMapper_.index(e)]];
│ │ │ │ +
164 }
│ │ │ │
165
│ │ │ │ -
178template<class T>
│ │ │ │ - │ │ │ │ -
180{
│ │ │ │ -
181 return Impl::FlatVectorView<T>(t);
│ │ │ │ -
182}
│ │ │ │ -
183
│ │ │ │ -
196template<class T>
│ │ │ │ -
197auto flatVectorView(const T& t)
│ │ │ │ -
198{
│ │ │ │ -
199 return Impl::FlatVectorView<const T>(t);
│ │ │ │ -
200}
│ │ │ │ +
166 private:
│ │ │ │ +
167 std::vector<FiniteElement> variants_;
│ │ │ │ +
168 const Dune::MultipleCodimMultipleGeomTypeMapper<GV> elementMapper_;
│ │ │ │ +
169 std::vector<unsigned char> orient_;
│ │ │ │ +
170 };
│ │ │ │ +
171
│ │ │ │ +
172
│ │ │ │ +
173} // namespace Impl
│ │ │ │ +
174
│ │ │ │ +
175
│ │ │ │ +
176// *****************************************************************************
│ │ │ │ +
177// This is the reusable part of the basis. It contains
│ │ │ │ +
178//
│ │ │ │ +
179// RaviartThomasPreBasis
│ │ │ │ +
180// RaviartThomasNode
│ │ │ │ +
181//
│ │ │ │ +
182// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ +
183// state. These components do _not_ depend on the global basis and local view
│ │ │ │ +
184// and can be used without a global basis.
│ │ │ │ +
185// *****************************************************************************
│ │ │ │ +
186
│ │ │ │ +
187template<typename GV, int k>
│ │ │ │ +
188class RaviartThomasNode;
│ │ │ │ +
189
│ │ │ │ +
190template<typename GV, int k>
│ │ │ │ + │ │ │ │ +
192{
│ │ │ │ +
193 static const int dim = GV::dimension;
│ │ │ │ +
194 using FiniteElementMap = typename Impl::RaviartThomasLocalFiniteElementMap<GV, dim, double, k>;
│ │ │ │ +
195
│ │ │ │ +
196public:
│ │ │ │ +
197
│ │ │ │ +
199 using GridView = GV;
│ │ │ │ +
200 using size_type = std::size_t;
│ │ │ │
201
│ │ │ │ -
214template<class T>
│ │ │ │ -
215auto flatVectorView(T&& t)
│ │ │ │ -
216{
│ │ │ │ -
217 return Impl::FlatVectorView<T&&>(std::move(t));
│ │ │ │ -
218}
│ │ │ │ -
219
│ │ │ │ + │ │ │ │ +
203
│ │ │ │ +
204 static constexpr size_type maxMultiIndexSize = 1;
│ │ │ │ +
205 static constexpr size_type minMultiIndexSize = 1;
│ │ │ │ +
206 static constexpr size_type multiIndexBufferSize = 1;
│ │ │ │ +
207
│ │ │ │ + │ │ │ │ +
210 gridView_(gv),
│ │ │ │ + │ │ │ │ +
212 {
│ │ │ │ +
213 // Currently there are some unresolved bugs with hybrid grids and higher order Raviart-Thomas elements
│ │ │ │ +
214 if (gv.indexSet().types(0).size() > 1 and k>0)
│ │ │ │ +
215 DUNE_THROW(Dune::NotImplemented, "Raviart-Thomas basis with index k>0 is only implemented for grids with a single element type");
│ │ │ │ +
216
│ │ │ │ +
217 for(auto type : gv.indexSet().types(0))
│ │ │ │ +
218 if (!type.isSimplex() && !type.isCube())
│ │ │ │ +
219 DUNE_THROW(Dune::NotImplemented, "Raviart-Thomas elements are only implemented for grids with simplex or cube elements.");
│ │ │ │
220
│ │ │ │ -
221} // namespace Dune::Functions
│ │ │ │ -
222} // namespace Dune
│ │ │ │ -
223
│ │ │ │ +
221 GeometryType type = gv.template begin<0>()->type();
│ │ │ │ +
222 const static int dofsPerElement = type.isCube() ? ((dim == 2) ? k*(k+1)*dim : k*(k+1)*(k+1)*dim) : k*dim;
│ │ │ │ +
223 const static int dofsPerFace = type.isCube() ? (dim-2)*2*k+k+1 : (dim-1)*k+1 ;
│ │ │ │
224
│ │ │ │ -
225#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATVECTORVIEW_HH
│ │ │ │ +
225 dofsPerCodim_ = {{dofsPerElement, dofsPerFace}};
│ │ │ │ +
226 }
│ │ │ │ +
227
│ │ │ │ + │ │ │ │ +
229 {
│ │ │ │ +
230 codimOffset_[0] = 0;
│ │ │ │ +
231 codimOffset_[1] = codimOffset_[0] + dofsPerCodim_[0] * gridView_.size(0);
│ │ │ │ +
232 }
│ │ │ │ +
233
│ │ │ │ +
236 const GridView& gridView() const
│ │ │ │ +
237 {
│ │ │ │ +
238 return gridView_;
│ │ │ │ +
239 }
│ │ │ │ +
240
│ │ │ │ +
241 /* \brief Update the stored grid view, to be called if the grid has changed */
│ │ │ │ +
242 void update (const GridView& gv)
│ │ │ │ +
243 {
│ │ │ │ +
244 gridView_ = gv;
│ │ │ │ +
245 }
│ │ │ │ +
246
│ │ │ │ + │ │ │ │ +
251 {
│ │ │ │ +
252 return Node{&finiteElementMap_};
│ │ │ │ +
253 }
│ │ │ │ +
254
│ │ │ │ + │ │ │ │ +
256 {
│ │ │ │ +
257 return dofsPerCodim_[0] * gridView_.size(0) + dofsPerCodim_[1] * gridView_.size(1);
│ │ │ │ +
258 }
│ │ │ │ +
259
│ │ │ │ +
261 template<class SizePrefix>
│ │ │ │ +
262 size_type size(const SizePrefix& prefix) const
│ │ │ │ +
263 {
│ │ │ │ +
264 assert(prefix.size() == 0 || prefix.size() == 1);
│ │ │ │ +
265 return (prefix.size() == 0) ? size() : 0;
│ │ │ │ +
266 }
│ │ │ │ +
267
│ │ │ │ + │ │ │ │ +
270 {
│ │ │ │ +
271 return size();
│ │ │ │ +
272 }
│ │ │ │ +
273
│ │ │ │ + │ │ │ │ +
275 {
│ │ │ │ +
276 size_type result = 0;
│ │ │ │ +
277 for (auto&& type : gridView_.indexSet().types(0))
│ │ │ │ +
278 {
│ │ │ │ +
279 size_t numFaces = ReferenceElements<double,dim>::general(type).size(1);
│ │ │ │ +
280 const static int dofsPerElement = type.isCube() ? ((dim == 2) ? k*(k+1)*dim : k*(k+1)*(k+1)*dim) : k*dim;
│ │ │ │ +
281 const static int dofsPerFace = type.isCube() ? (dim-2)*2*k+k+1 : (dim-1)*k+1 ;
│ │ │ │ +
282 result = std::max(result, dofsPerElement + dofsPerFace * numFaces);
│ │ │ │ +
283 }
│ │ │ │ +
284
│ │ │ │ +
285 return result;
│ │ │ │ +
286 }
│ │ │ │ +
287
│ │ │ │ +
293 template<typename It>
│ │ │ │ +
294 It indices(const Node& node, It it) const
│ │ │ │ +
295 {
│ │ │ │ +
296 const auto& gridIndexSet = gridView().indexSet();
│ │ │ │ +
297 const auto& element = node.element();
│ │ │ │ +
298
│ │ │ │ +
299 // throw if Element is not of predefined type
│ │ │ │ +
300 if (not(element.type().isCube()) and not(element.type().isSimplex()))
│ │ │ │ +
301 DUNE_THROW(Dune::NotImplemented, "RaviartThomasBasis only implemented for cube and simplex elements.");
│ │ │ │ +
302
│ │ │ │ +
303 for(std::size_t i=0, end=node.size(); i<end; ++i, ++it)
│ │ │ │ +
304 {
│ │ │ │ +
305 Dune::LocalKey localKey = node.finiteElement().localCoefficients().localKey(i);
│ │ │ │ +
306
│ │ │ │ +
307 // The dimension of the entity that the current dof is related to
│ │ │ │ +
308 size_t subentity = localKey.subEntity();
│ │ │ │ +
309 size_t codim = localKey.codim();
│ │ │ │ +
310
│ │ │ │ +
311 if (not(codim==0 or codim==1))
│ │ │ │ +
312 DUNE_THROW(Dune::NotImplemented, "Grid contains elements not supported for the RaviartThomasBasis");
│ │ │ │ +
313
│ │ │ │ +
314 *it = { codimOffset_[codim] +
│ │ │ │ +
315 dofsPerCodim_[codim] * gridIndexSet.subIndex(element, subentity, codim) + localKey.index() };
│ │ │ │ +
316 }
│ │ │ │ +
317
│ │ │ │ +
318 return it;
│ │ │ │ +
319 }
│ │ │ │ +
320
│ │ │ │ +
321protected:
│ │ │ │ + │ │ │ │ +
323 std::array<size_t,dim+1> codimOffset_;
│ │ │ │ +
324 FiniteElementMap finiteElementMap_;
│ │ │ │ +
325 // Number of dofs per entity type depending on the entity's codimension and type
│ │ │ │ +
326 std::array<int,dim+1> dofsPerCodim_;
│ │ │ │ +
327};
│ │ │ │ +
328
│ │ │ │ +
329
│ │ │ │ +
330
│ │ │ │ +
331template<typename GV, int k>
│ │ │ │ + │ │ │ │ +
333 public LeafBasisNode
│ │ │ │ +
334{
│ │ │ │ +
335 static const int dim = GV::dimension;
│ │ │ │ +
336
│ │ │ │ +
337public:
│ │ │ │ +
338
│ │ │ │ +
339 using size_type = std::size_t;
│ │ │ │ +
340 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ +
341 using FiniteElementMap = typename Impl::RaviartThomasLocalFiniteElementMap<GV, dim, double, k>;
│ │ │ │ +
342 using FiniteElement = Impl::GlobalValuedLocalFiniteElement<Impl::ContravariantPiolaTransformator,
│ │ │ │ +
343 typename FiniteElementMap::FiniteElement,
│ │ │ │ +
344 Element>;
│ │ │ │ +
345
│ │ │ │ +
346 RaviartThomasNode(const FiniteElementMap* finiteElementMap) :
│ │ │ │ +
347 element_(nullptr),
│ │ │ │ +
348 finiteElementMap_(finiteElementMap)
│ │ │ │ +
349 { }
│ │ │ │ +
350
│ │ │ │ +
352 const Element& element() const
│ │ │ │ +
353 {
│ │ │ │ +
354 return *element_;
│ │ │ │ +
355 }
│ │ │ │ +
356
│ │ │ │ + │ │ │ │ +
362 {
│ │ │ │ +
363 return finiteElement_;
│ │ │ │ +
364 }
│ │ │ │ +
365
│ │ │ │ +
367 void bind(const Element& e)
│ │ │ │ +
368 {
│ │ │ │ +
369 element_ = &e;
│ │ │ │ +
370 finiteElement_.bind((finiteElementMap_->find(*element_)), e);
│ │ │ │ +
371 this->setSize(finiteElement_.size());
│ │ │ │ +
372 }
│ │ │ │ +
373
│ │ │ │ +
374protected:
│ │ │ │ +
375
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
379};
│ │ │ │ +
380
│ │ │ │ +
381namespace BasisFactory {
│ │ │ │ +
382
│ │ │ │ +
390template<std::size_t k>
│ │ │ │ + │ │ │ │ +
392{
│ │ │ │ +
393 return [](const auto& gridView) {
│ │ │ │ +
394 return RaviartThomasPreBasis<std::decay_t<decltype(gridView)>, k>(gridView);
│ │ │ │ +
395 };
│ │ │ │ +
396}
│ │ │ │ +
397
│ │ │ │ +
398} // end namespace BasisFactory
│ │ │ │ +
399
│ │ │ │ +
400
│ │ │ │ +
401
│ │ │ │ +
402// *****************************************************************************
│ │ │ │ +
403// This is the actual global basis implementation based on the reusable parts.
│ │ │ │ +
404// *****************************************************************************
│ │ │ │ +
405
│ │ │ │ +
413template<typename GV, int k>
│ │ │ │ + │ │ │ │ +
415
│ │ │ │ +
416} // end namespace Functions
│ │ │ │ +
417} // end namespace Dune
│ │ │ │ +
418
│ │ │ │ +
419
│ │ │ │ +
420#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
auto power(ChildPreBasisFactory &&childPreBasisFactory, const IndexMergingStrategy &)
Create a pre-basis factory that can build a PowerPreBasis.
Definition: powerbasis.hh:369
│ │ │ │ +
auto raviartThomas()
Create a pre-basis factory that can create a Raviart-Thomas pre-basis.
Definition: raviartthomasbasis.hh:391
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
auto flatVectorView(T &t)
Create flat vector view of passed mutable container.
Definition: flatvectorview.hh:179
│ │ │ │ - │ │ │ │ +
Global basis for given pre-basis.
Definition: defaultglobalbasis.hh:46
│ │ │ │ +
size_type size() const
Definition: nodes.hh:142
│ │ │ │ +
std::size_t size_type
Definition: nodes.hh:128
│ │ │ │ +
void setSize(const size_type size)
Definition: nodes.hh:164
│ │ │ │ +
Definition: nodes.hh:186
│ │ │ │ +
Definition: raviartthomasbasis.hh:334
│ │ │ │ +
typename Impl::RaviartThomasLocalFiniteElementMap< GV, dim, double, k > FiniteElementMap
Definition: raviartthomasbasis.hh:341
│ │ │ │ +
void bind(const Element &e)
Bind to element.
Definition: raviartthomasbasis.hh:367
│ │ │ │ +
Impl::GlobalValuedLocalFiniteElement< Impl::ContravariantPiolaTransformator, typename FiniteElementMap::FiniteElement, Element > FiniteElement
Definition: raviartthomasbasis.hh:344
│ │ │ │ +
typename GV::template Codim< 0 >::Entity Element
Definition: raviartthomasbasis.hh:340
│ │ │ │ +
const Element * element_
Definition: raviartthomasbasis.hh:377
│ │ │ │ +
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition: raviartthomasbasis.hh:361
│ │ │ │ +
RaviartThomasNode(const FiniteElementMap *finiteElementMap)
Definition: raviartthomasbasis.hh:346
│ │ │ │ +
const Element & element() const
Return current element, throw if unbound.
Definition: raviartthomasbasis.hh:352
│ │ │ │ +
FiniteElement finiteElement_
Definition: raviartthomasbasis.hh:376
│ │ │ │ +
const FiniteElementMap * finiteElementMap_
Definition: raviartthomasbasis.hh:378
│ │ │ │ +
Definition: raviartthomasbasis.hh:192
│ │ │ │ +
static constexpr size_type minMultiIndexSize
Definition: raviartthomasbasis.hh:205
│ │ │ │ +
static constexpr size_type maxMultiIndexSize
Definition: raviartthomasbasis.hh:204
│ │ │ │ +
Node makeNode() const
Create tree node.
Definition: raviartthomasbasis.hh:250
│ │ │ │ +
std::array< int, dim+1 > dofsPerCodim_
Definition: raviartthomasbasis.hh:326
│ │ │ │ +
void update(const GridView &gv)
Definition: raviartthomasbasis.hh:242
│ │ │ │ +
RaviartThomasPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition: raviartthomasbasis.hh:209
│ │ │ │ +
std::size_t size_type
Definition: raviartthomasbasis.hh:200
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: raviartthomasbasis.hh:236
│ │ │ │ +
It indices(const Node &node, It it) const
Maps from subtree index set [0..size-1] to a globally unique multi index in global basis.
Definition: raviartthomasbasis.hh:294
│ │ │ │ +
static constexpr size_type multiIndexBufferSize
Definition: raviartthomasbasis.hh:206
│ │ │ │ +
FiniteElementMap finiteElementMap_
Definition: raviartthomasbasis.hh:324
│ │ │ │ +
size_type size() const
Definition: raviartthomasbasis.hh:255
│ │ │ │ +
size_type dimension() const
Definition: raviartthomasbasis.hh:269
│ │ │ │ +
GV GridView
The grid view that the FE space is defined on.
Definition: raviartthomasbasis.hh:199
│ │ │ │ +
size_type maxNodeSize() const
Definition: raviartthomasbasis.hh:274
│ │ │ │ +
GridView gridView_
Definition: raviartthomasbasis.hh:322
│ │ │ │ +
size_type size(const SizePrefix &prefix) const
Return number possible values for next position in multi index.
Definition: raviartthomasbasis.hh:262
│ │ │ │ +
void initializeIndices()
Definition: raviartthomasbasis.hh:228
│ │ │ │ +
std::array< size_t, dim+1 > codimOffset_
Definition: raviartthomasbasis.hh:323
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,212 +5,566 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -flatvectorview.hh │ │ │ │ │ +raviartthomasbasis.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATVECTORVIEW_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATVECTORVIEW_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH │ │ │ │ │ 5 │ │ │ │ │ - 6 │ │ │ │ │ - 7#include │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ 8 │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12 │ │ │ │ │ - 13#include │ │ │ │ │ - 14 │ │ │ │ │ - 15 │ │ │ │ │ - 16 │ │ │ │ │ - 17 │ │ │ │ │ - 18namespace Dune { │ │ │ │ │ - 19namespace Functions { │ │ │ │ │ - 20namespace Impl { │ │ │ │ │ - 21 │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11 │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14#include │ │ │ │ │ + 15#include │ │ │ │ │ + 16#include │ │ │ │ │ + 17#include │ │ │ │ │ + 18#include │ │ │ │ │ + 19#include │ │ │ │ │ + 20#include │ │ │ │ │ + 21#include │ │ │ │ │ 22 │ │ │ │ │ - 23template │ │ │ │ │ - 24struct FlatVectorBackend │ │ │ │ │ - 25{ │ │ │ │ │ + 23#include │ │ │ │ │ + 24#include │ │ │ │ │ + 25#include │ │ │ │ │ 26 │ │ │ │ │ - 27 template(), │ │ │ │ │ -int>::type = 0> │ │ │ │ │ - 29 static decltype(auto) getEntry(VV&& v, const Index& i) │ │ │ │ │ - 30 { │ │ │ │ │ - 31 return v[i]; │ │ │ │ │ - 32 } │ │ │ │ │ - 33 │ │ │ │ │ - 34 template(), │ │ │ │ │ -int>::type = 0> │ │ │ │ │ - 36 static decltype(auto) getEntry(VV&& v, const Index&) │ │ │ │ │ - 37 { │ │ │ │ │ - 38 return std::forward(v); │ │ │ │ │ - 39 } │ │ │ │ │ - 40 │ │ │ │ │ - 41 template(), int>::type = │ │ │ │ │ -0> │ │ │ │ │ - 43 static auto size(VV&& v) │ │ │ │ │ - 44 { │ │ │ │ │ - 45 return Dune::Hybrid::size(v); │ │ │ │ │ - 46 } │ │ │ │ │ - 47 │ │ │ │ │ - 48 template(), int>:: │ │ │ │ │ -type = 0> │ │ │ │ │ - 50 static auto size(VV&&) │ │ │ │ │ - 51 { │ │ │ │ │ - 52 return Dune::index_constant<1>{}; │ │ │ │ │ - 53 } │ │ │ │ │ - 54}; │ │ │ │ │ - 55 │ │ │ │ │ + 27namespace Dune { │ │ │ │ │ + 28namespace Functions { │ │ │ │ │ + 29 │ │ │ │ │ + 30namespace Impl { │ │ │ │ │ + 31 │ │ │ │ │ + 32 template │ │ │ │ │ + 33 struct RaviartThomasSimplexLocalInfo │ │ │ │ │ + 34 { │ │ │ │ │ + 35 // Dummy type, must be something that we can have a std::unique_ptr to │ │ │ │ │ + 36 using FiniteElement = void*; │ │ │ │ │ + 37 }; │ │ │ │ │ + 38 │ │ │ │ │ + 39 template │ │ │ │ │ + 40 struct RaviartThomasSimplexLocalInfo<2,D,R,0> │ │ │ │ │ + 41 { │ │ │ │ │ + 42 using FiniteElement = RT02DLocalFiniteElement; │ │ │ │ │ + 43 }; │ │ │ │ │ + 44 │ │ │ │ │ + 45 template │ │ │ │ │ + 46 struct RaviartThomasSimplexLocalInfo<2,D,R,1> │ │ │ │ │ + 47 { │ │ │ │ │ + 48 using FiniteElement = RT12DLocalFiniteElement; │ │ │ │ │ + 49 }; │ │ │ │ │ + 50 │ │ │ │ │ + 51 template │ │ │ │ │ + 52 struct RaviartThomasSimplexLocalInfo<3,D,R,0> │ │ │ │ │ + 53 { │ │ │ │ │ + 54 using FiniteElement = RT03DLocalFiniteElement; │ │ │ │ │ + 55 }; │ │ │ │ │ 56 │ │ │ │ │ - 57 │ │ │ │ │ - 58 │ │ │ │ │ - 59template │ │ │ │ │ - 60struct FlatVectorBackend > │ │ │ │ │ - 61{ │ │ │ │ │ - 62 │ │ │ │ │ - 63 template │ │ │ │ │ - 64 static decltype(auto) getEntry(VV&& v, const Index& i) │ │ │ │ │ - 65 { │ │ │ │ │ - 66 return v[i/m][i%m]; │ │ │ │ │ - 67 } │ │ │ │ │ - 68 │ │ │ │ │ - 69 template │ │ │ │ │ - 70 static auto size(VV&& v) │ │ │ │ │ - 71 { │ │ │ │ │ - 72 return Dune::index_constant{}; │ │ │ │ │ - 73 } │ │ │ │ │ - 74}; │ │ │ │ │ + 57 template │ │ │ │ │ + 58 struct RaviartThomasCubeLocalInfo │ │ │ │ │ + 59 { │ │ │ │ │ + 60 // Dummy type, must be something that we can have a std::unique_ptr to │ │ │ │ │ + 61 using FiniteElement = void*; │ │ │ │ │ + 62 }; │ │ │ │ │ + 63 │ │ │ │ │ + 64 template │ │ │ │ │ + 65 struct RaviartThomasCubeLocalInfo<2,D,R,0> │ │ │ │ │ + 66 { │ │ │ │ │ + 67 using FiniteElement = RT0Cube2DLocalFiniteElement; │ │ │ │ │ + 68 }; │ │ │ │ │ + 69 │ │ │ │ │ + 70 template │ │ │ │ │ + 71 struct RaviartThomasCubeLocalInfo<2,D,R,1> │ │ │ │ │ + 72 { │ │ │ │ │ + 73 using FiniteElement = RT1Cube2DLocalFiniteElement; │ │ │ │ │ + 74 }; │ │ │ │ │ 75 │ │ │ │ │ - 76 │ │ │ │ │ - 77 │ │ │ │ │ - 78template │ │ │ │ │ - 79struct FlatVectorBackend< std::array > │ │ │ │ │ - 80{ │ │ │ │ │ + 76 template │ │ │ │ │ + 77 struct RaviartThomasCubeLocalInfo<2,D,R,2> │ │ │ │ │ + 78 { │ │ │ │ │ + 79 using FiniteElement = RT2Cube2DLocalFiniteElement; │ │ │ │ │ + 80 }; │ │ │ │ │ 81 │ │ │ │ │ - 82 template │ │ │ │ │ - 83 static decltype(auto) getEntry(VV&& v, const Index& i) │ │ │ │ │ + 82 template │ │ │ │ │ + 83 struct RaviartThomasCubeLocalInfo<3,D,R,0> │ │ │ │ │ 84 { │ │ │ │ │ - 85 const auto innerSize = decltype(FlatVectorBackend::size(v[0]))::value; │ │ │ │ │ - 86 return FlatVectorBackend::getEntry(v[i/innerSize], i%innerSize); │ │ │ │ │ - 87 } │ │ │ │ │ - 88 │ │ │ │ │ - 89 template │ │ │ │ │ - 90 static auto size(VV&& v) │ │ │ │ │ - 91 { │ │ │ │ │ - 92 const auto innerSize = decltype(FlatVectorBackend::size(v[0]))::value; │ │ │ │ │ - 93 return Dune::index_constant{}; │ │ │ │ │ - 94 } │ │ │ │ │ - 95 │ │ │ │ │ - 96}; │ │ │ │ │ - 97 │ │ │ │ │ - 98 │ │ │ │ │ + 85 using FiniteElement = RT0Cube3DLocalFiniteElement; │ │ │ │ │ + 86 }; │ │ │ │ │ + 87 │ │ │ │ │ + 88 template │ │ │ │ │ + 89 struct RaviartThomasCubeLocalInfo<3,D,R,1> │ │ │ │ │ + 90 { │ │ │ │ │ + 91 using FiniteElement = RT1Cube3DLocalFiniteElement; │ │ │ │ │ + 92 }; │ │ │ │ │ + 93 │ │ │ │ │ + 94 template │ │ │ │ │ + 95 class RaviartThomasLocalFiniteElementMap │ │ │ │ │ + 96 { │ │ │ │ │ + 97 using D = typename GV::ctype; │ │ │ │ │ + 98 constexpr static bool hasFixedElementType = Capabilities:: │ │ │ │ │ +hasSingleGeometryType::v; │ │ │ │ │ 99 │ │ │ │ │ - 100 │ │ │ │ │ - 101template │ │ │ │ │ - 102class FlatVectorView │ │ │ │ │ - 103{ │ │ │ │ │ - 104 using Backend = FlatVectorBackend>; │ │ │ │ │ - 105public: │ │ │ │ │ - 106 FlatVectorView(T& t) : │ │ │ │ │ - 107 t_(&t) │ │ │ │ │ - 108 {} │ │ │ │ │ + 100 using CubeFiniteElement = typename RaviartThomasCubeLocalInfo::FiniteElement; │ │ │ │ │ + 101 using SimplexFiniteElement = typename RaviartThomasSimplexLocalInfo::FiniteElement; │ │ │ │ │ + 102 │ │ │ │ │ + 103 public: │ │ │ │ │ + 104 │ │ │ │ │ + 105 using T = LocalBasisTraits, R, dim, │ │ │ │ │ +FieldVector, FieldMatrix >; │ │ │ │ │ + 106 │ │ │ │ │ + 107 constexpr static unsigned int topologyId = Capabilities:: │ │ │ │ │ +hasSingleGeometryType::topologyId; // meaningless if │ │ │ │ │ +hasFixedElementType is false │ │ │ │ │ + 108 constexpr static GeometryType type = GeometryType(topologyId, GV:: │ │ │ │ │ +dimension); │ │ │ │ │ 109 │ │ │ │ │ - 110 auto size() const │ │ │ │ │ - 111 { │ │ │ │ │ - 112 return Backend::size(*t_); │ │ │ │ │ - 113 } │ │ │ │ │ - 114 │ │ │ │ │ - 115 template │ │ │ │ │ - 116 decltype(auto) operator[](const Index& i) const │ │ │ │ │ + 110 using FiniteElement = std::conditional_t, │ │ │ │ │ + 112 LocalFiniteElementVariant >; │ │ │ │ │ + 113 │ │ │ │ │ + 114 // Each element facet can have its orientation reversed, hence there are │ │ │ │ │ + 115 // 2^#facets different variants. │ │ │ │ │ + 116 static std::size_t numVariants(GeometryType type) │ │ │ │ │ 117 { │ │ │ │ │ - 118 return Backend::getEntry(*t_, i); │ │ │ │ │ - 119 } │ │ │ │ │ - 120 │ │ │ │ │ - 121 template │ │ │ │ │ - 122 decltype(auto) operator[](const Index& i) │ │ │ │ │ - 123 { │ │ │ │ │ - 124 return Backend::getEntry(*t_, i); │ │ │ │ │ - 125 } │ │ │ │ │ - 126 │ │ │ │ │ - 127private: │ │ │ │ │ - 128 T* t_; │ │ │ │ │ - 129}; │ │ │ │ │ - 130 │ │ │ │ │ - 131 │ │ │ │ │ - 132template │ │ │ │ │ - 133class FlatVectorView │ │ │ │ │ - 134{ │ │ │ │ │ - 135 using Backend = FlatVectorBackend>; │ │ │ │ │ - 136public: │ │ │ │ │ - 137 FlatVectorView(T&& t) : │ │ │ │ │ - 138 t_(std::move(t)) │ │ │ │ │ - 139 {} │ │ │ │ │ - 140 │ │ │ │ │ - 141 auto size() const │ │ │ │ │ - 142 { │ │ │ │ │ - 143 return Backend::size(t_); │ │ │ │ │ - 144 } │ │ │ │ │ - 145 │ │ │ │ │ - 146 template │ │ │ │ │ - 147 decltype(auto) operator[](const Index& i) const │ │ │ │ │ + 118 auto numFacets = referenceElement(type).size(1); │ │ │ │ │ + 119 return power(2,numFacets); │ │ │ │ │ + 120 } │ │ │ │ │ + 121 │ │ │ │ │ + 122 RaviartThomasLocalFiniteElementMap(const GV& gv) │ │ │ │ │ + 123 : elementMapper_(gv, mcmgElementLayout()), │ │ │ │ │ + 124 orient_(gv.size(0)) │ │ │ │ │ + 125 { │ │ │ │ │ + 126 if constexpr (hasFixedElementType) │ │ │ │ │ + 127 { │ │ │ │ │ + 128 variants_.resize(numVariants(type)); │ │ │ │ │ + 129 for (size_t i = 0; i < numVariants(type); i++) │ │ │ │ │ + 130 variants_[i] = FiniteElement(i); │ │ │ │ │ + 131 } │ │ │ │ │ + 132 else │ │ │ │ │ + 133 { │ │ │ │ │ + 134 // for mixed grids add offset for cubes │ │ │ │ │ + 135 variants_.resize(numVariants(GeometryTypes::simplex(dim)) + numVariants │ │ │ │ │ +(GeometryTypes::cube(dim))); │ │ │ │ │ + 136 for (size_t i = 0; i < numVariants(GeometryTypes::simplex(dim)); i++) │ │ │ │ │ + 137 variants_[i] = SimplexFiniteElement(i); │ │ │ │ │ + 138 for (size_t i = 0; i < numVariants(GeometryTypes::cube(dim)); i++) │ │ │ │ │ + 139 variants_[i + numVariants(GeometryTypes::simplex(dim))] = │ │ │ │ │ +CubeFiniteElement(i); │ │ │ │ │ + 140 } │ │ │ │ │ + 141 │ │ │ │ │ + 142 for(const auto& cell : elements(gv)) │ │ │ │ │ + 143 { │ │ │ │ │ + 144 unsigned int myId = elementMapper_.index(cell); │ │ │ │ │ + 145 orient_[myId] = 0; │ │ │ │ │ + 146 │ │ │ │ │ + 147 for (const auto& intersection : intersections(gv,cell)) │ │ │ │ │ 148 { │ │ │ │ │ - 149 return Backend::getEntry(t_, i); │ │ │ │ │ - 150 } │ │ │ │ │ - 151 │ │ │ │ │ - 152 template │ │ │ │ │ - 153 decltype(auto) operator[](const Index& i) │ │ │ │ │ - 154 { │ │ │ │ │ - 155 return Backend::getEntry(t_, i); │ │ │ │ │ - 156 } │ │ │ │ │ - 157 │ │ │ │ │ - 158private: │ │ │ │ │ - 159 T t_; │ │ │ │ │ - 160}; │ │ │ │ │ - 161 │ │ │ │ │ - 162} // namespace Impl │ │ │ │ │ - 163 │ │ │ │ │ - 164 │ │ │ │ │ + 149 if (intersection.neighbor() && (elementMapper_.index(intersection.outside │ │ │ │ │ +()) > myId)) │ │ │ │ │ + 150 orient_[myId] |= (1 << intersection.indexInInside()); │ │ │ │ │ + 151 } │ │ │ │ │ + 152 │ │ │ │ │ + 153 // for mixed grids add offset for cubes │ │ │ │ │ + 154 if constexpr (!hasFixedElementType) │ │ │ │ │ + 155 if (cell.type().isCube()) │ │ │ │ │ + 156 orient_[myId] += numVariants(GeometryTypes::simplex(dim)); │ │ │ │ │ + 157 } │ │ │ │ │ + 158 } │ │ │ │ │ + 159 │ │ │ │ │ + 160 template │ │ │ │ │ + 161 const FiniteElement& find(const EntityType& e) const │ │ │ │ │ + 162 { │ │ │ │ │ + 163 return variants_[orient_[elementMapper_.index(e)]]; │ │ │ │ │ + 164 } │ │ │ │ │ 165 │ │ │ │ │ - 178template │ │ │ │ │ -179auto flatVectorView(T& t) │ │ │ │ │ - 180{ │ │ │ │ │ - 181 return Impl::FlatVectorView(t); │ │ │ │ │ - 182} │ │ │ │ │ - 183 │ │ │ │ │ - 196template │ │ │ │ │ -197auto flatVectorView(const T& t) │ │ │ │ │ - 198{ │ │ │ │ │ - 199 return Impl::FlatVectorView(t); │ │ │ │ │ - 200} │ │ │ │ │ + 166 private: │ │ │ │ │ + 167 std::vector variants_; │ │ │ │ │ + 168 const Dune::MultipleCodimMultipleGeomTypeMapper elementMapper_; │ │ │ │ │ + 169 std::vector orient_; │ │ │ │ │ + 170 }; │ │ │ │ │ + 171 │ │ │ │ │ + 172 │ │ │ │ │ + 173} // namespace Impl │ │ │ │ │ + 174 │ │ │ │ │ + 175 │ │ │ │ │ + 176/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ + 177// This is the reusable part of the basis. It contains │ │ │ │ │ + 178// │ │ │ │ │ + 179// RaviartThomasPreBasis │ │ │ │ │ + 180// RaviartThomasNode │ │ │ │ │ + 181// │ │ │ │ │ + 182// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ +shared │ │ │ │ │ + 183// state. These components do _not_ depend on the global basis and local │ │ │ │ │ +view │ │ │ │ │ + 184// and can be used without a global basis. │ │ │ │ │ + 185/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ + 186 │ │ │ │ │ + 187template │ │ │ │ │ + 188class RaviartThomasNode; │ │ │ │ │ + 189 │ │ │ │ │ + 190template │ │ │ │ │ +191class RaviartThomasPreBasis │ │ │ │ │ + 192{ │ │ │ │ │ + 193 static const int dim = GV::dimension; │ │ │ │ │ + 194 using FiniteElementMap = typename Impl:: │ │ │ │ │ +RaviartThomasLocalFiniteElementMap; │ │ │ │ │ + 195 │ │ │ │ │ + 196public: │ │ │ │ │ + 197 │ │ │ │ │ +199 using GridView = GV; │ │ │ │ │ +200 using size_type = std::size_t; │ │ │ │ │ 201 │ │ │ │ │ - 214template │ │ │ │ │ -215auto flatVectorView(T&& t) │ │ │ │ │ - 216{ │ │ │ │ │ - 217 return Impl::FlatVectorView(std::move(t)); │ │ │ │ │ - 218} │ │ │ │ │ - 219 │ │ │ │ │ +202 using Node = RaviartThomasNode; │ │ │ │ │ + 203 │ │ │ │ │ +204 static constexpr size_type maxMultiIndexSize = 1; │ │ │ │ │ +205 static constexpr size_type minMultiIndexSize = 1; │ │ │ │ │ +206 static constexpr size_type multiIndexBufferSize = 1; │ │ │ │ │ + 207 │ │ │ │ │ +209 RaviartThomasPreBasis(const GridView& gv) : │ │ │ │ │ + 210 gridView_(gv), │ │ │ │ │ + 211 finiteElementMap_(gv) │ │ │ │ │ + 212 { │ │ │ │ │ + 213 // Currently there are some unresolved bugs with hybrid grids and higher │ │ │ │ │ +order Raviart-Thomas elements │ │ │ │ │ + 214 if (gv.indexSet().types(0).size() > 1 and k>0) │ │ │ │ │ + 215 DUNE_THROW(Dune::NotImplemented, "Raviart-Thomas basis with index k>0 is │ │ │ │ │ +only implemented for grids with a single element type"); │ │ │ │ │ + 216 │ │ │ │ │ + 217 for(auto type : gv.indexSet().types(0)) │ │ │ │ │ + 218 if (!type.isSimplex() && !type.isCube()) │ │ │ │ │ + 219 DUNE_THROW(Dune::NotImplemented, "Raviart-Thomas elements are only │ │ │ │ │ +implemented for grids with simplex or cube elements."); │ │ │ │ │ 220 │ │ │ │ │ - 221} // namespace Dune::Functions │ │ │ │ │ - 222} // namespace Dune │ │ │ │ │ - 223 │ │ │ │ │ + 221 GeometryType type = gv.template begin<0>()->type(); │ │ │ │ │ + 222 const static int dofsPerElement = type.isCube() ? ((dim == 2) ? k* │ │ │ │ │ +(k+1)*dim : k*(k+1)*(k+1)*dim) : k*dim; │ │ │ │ │ + 223 const static int dofsPerFace = type.isCube() ? (dim-2)*2*k+k+1 : (dim- │ │ │ │ │ +1)*k+1 ; │ │ │ │ │ 224 │ │ │ │ │ - 225#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATVECTORVIEW_HH │ │ │ │ │ + 225 dofsPerCodim_ = {{dofsPerElement, dofsPerFace}}; │ │ │ │ │ + 226 } │ │ │ │ │ + 227 │ │ │ │ │ +228 void initializeIndices() │ │ │ │ │ + 229 { │ │ │ │ │ + 230 codimOffset_[0] = 0; │ │ │ │ │ + 231 codimOffset_[1] = codimOffset_[0] + dofsPerCodim_[0] * gridView_.size(0); │ │ │ │ │ + 232 } │ │ │ │ │ + 233 │ │ │ │ │ +236 const GridView& gridView() const │ │ │ │ │ + 237 { │ │ │ │ │ + 238 return gridView_; │ │ │ │ │ + 239 } │ │ │ │ │ + 240 │ │ │ │ │ + 241 /* \brief Update the stored grid view, to be called if the grid has │ │ │ │ │ +changed */ │ │ │ │ │ +242 void update (const GridView& gv) │ │ │ │ │ + 243 { │ │ │ │ │ + 244 gridView_ = gv; │ │ │ │ │ + 245 } │ │ │ │ │ + 246 │ │ │ │ │ +250 Node makeNode() const │ │ │ │ │ + 251 { │ │ │ │ │ + 252 return Node{&finiteElementMap_}; │ │ │ │ │ + 253 } │ │ │ │ │ + 254 │ │ │ │ │ +255 size_type size() const │ │ │ │ │ + 256 { │ │ │ │ │ + 257 return dofsPerCodim_[0] * gridView_.size(0) + dofsPerCodim_[1] * │ │ │ │ │ +gridView_.size(1); │ │ │ │ │ + 258 } │ │ │ │ │ + 259 │ │ │ │ │ + 261 template │ │ │ │ │ +262 size_type size(const SizePrefix& prefix) const │ │ │ │ │ + 263 { │ │ │ │ │ + 264 assert(prefix.size() == 0 || prefix.size() == 1); │ │ │ │ │ + 265 return (prefix.size() == 0) ? size() : 0; │ │ │ │ │ + 266 } │ │ │ │ │ + 267 │ │ │ │ │ +269 size_type dimension() const │ │ │ │ │ + 270 { │ │ │ │ │ + 271 return size(); │ │ │ │ │ + 272 } │ │ │ │ │ + 273 │ │ │ │ │ +274 size_type maxNodeSize() const │ │ │ │ │ + 275 { │ │ │ │ │ + 276 size_type result = 0; │ │ │ │ │ + 277 for (auto&& type : gridView_.indexSet().types(0)) │ │ │ │ │ + 278 { │ │ │ │ │ + 279 size_t numFaces = ReferenceElements::general(type).size(1); │ │ │ │ │ + 280 const static int dofsPerElement = type.isCube() ? ((dim == 2) ? k* │ │ │ │ │ +(k+1)*dim : k*(k+1)*(k+1)*dim) : k*dim; │ │ │ │ │ + 281 const static int dofsPerFace = type.isCube() ? (dim-2)*2*k+k+1 : (dim- │ │ │ │ │ +1)*k+1 ; │ │ │ │ │ + 282 result = std::max(result, dofsPerElement + dofsPerFace * numFaces); │ │ │ │ │ + 283 } │ │ │ │ │ + 284 │ │ │ │ │ + 285 return result; │ │ │ │ │ + 286 } │ │ │ │ │ + 287 │ │ │ │ │ + 293 template │ │ │ │ │ +294 It indices(const Node& node, It it) const │ │ │ │ │ + 295 { │ │ │ │ │ + 296 const auto& gridIndexSet = gridView().indexSet(); │ │ │ │ │ + 297 const auto& element = node.element(); │ │ │ │ │ + 298 │ │ │ │ │ + 299 // throw if Element is not of predefined type │ │ │ │ │ + 300 if (not(element.type().isCube()) and not(element.type().isSimplex())) │ │ │ │ │ + 301 DUNE_THROW(Dune::NotImplemented, "RaviartThomasBasis only implemented for │ │ │ │ │ +cube and simplex elements."); │ │ │ │ │ + 302 │ │ │ │ │ + 303 for(std::size_t i=0, end=node.size(); i codimOffset_; │ │ │ │ │ +324 FiniteElementMap finiteElementMap_; │ │ │ │ │ + 325 // Number of dofs per entity type depending on the entity's codimension │ │ │ │ │ +and type │ │ │ │ │ +326 std::array dofsPerCodim_; │ │ │ │ │ + 327}; │ │ │ │ │ + 328 │ │ │ │ │ + 329 │ │ │ │ │ + 330 │ │ │ │ │ + 331template │ │ │ │ │ +332class RaviartThomasNode : │ │ │ │ │ + 333 public LeafBasisNode │ │ │ │ │ + 334{ │ │ │ │ │ + 335 static const int dim = GV::dimension; │ │ │ │ │ + 336 │ │ │ │ │ + 337public: │ │ │ │ │ + 338 │ │ │ │ │ +339 using size_type = std::size_t; │ │ │ │ │ +340 using Element = typename GV::template Codim<0>::Entity; │ │ │ │ │ +341 using FiniteElementMap = typename Impl:: │ │ │ │ │ +RaviartThomasLocalFiniteElementMap; │ │ │ │ │ +342 using FiniteElement = Impl::GlobalValuedLocalFiniteElement; │ │ │ │ │ + 345 │ │ │ │ │ +346 RaviartThomasNode(const FiniteElementMap* finiteElementMap) : │ │ │ │ │ + 347 element_(nullptr), │ │ │ │ │ + 348 finiteElementMap_(finiteElementMap) │ │ │ │ │ + 349 { } │ │ │ │ │ + 350 │ │ │ │ │ +352 const Element& element() const │ │ │ │ │ + 353 { │ │ │ │ │ + 354 return *element_; │ │ │ │ │ + 355 } │ │ │ │ │ + 356 │ │ │ │ │ +361 const FiniteElement& finiteElement() const │ │ │ │ │ + 362 { │ │ │ │ │ + 363 return finiteElement_; │ │ │ │ │ + 364 } │ │ │ │ │ + 365 │ │ │ │ │ +367 void bind(const Element& e) │ │ │ │ │ + 368 { │ │ │ │ │ + 369 element_ = &e; │ │ │ │ │ + 370 finiteElement_.bind((finiteElementMap_->find(*element_)), e); │ │ │ │ │ + 371 this->setSize(finiteElement_.size()); │ │ │ │ │ + 372 } │ │ │ │ │ + 373 │ │ │ │ │ + 374protected: │ │ │ │ │ + 375 │ │ │ │ │ +376 FiniteElement finiteElement_; │ │ │ │ │ +377 const Element* element_; │ │ │ │ │ +378 const FiniteElementMap* finiteElementMap_; │ │ │ │ │ + 379}; │ │ │ │ │ + 380 │ │ │ │ │ + 381namespace BasisFactory { │ │ │ │ │ + 382 │ │ │ │ │ + 390template │ │ │ │ │ +391auto raviartThomas() │ │ │ │ │ + 392{ │ │ │ │ │ + 393 return [](const auto& gridView) { │ │ │ │ │ + 394 return RaviartThomasPreBasis, k> │ │ │ │ │ +(gridView); │ │ │ │ │ + 395 }; │ │ │ │ │ + 396} │ │ │ │ │ + 397 │ │ │ │ │ + 398} // end namespace BasisFactory │ │ │ │ │ + 399 │ │ │ │ │ + 400 │ │ │ │ │ + 401 │ │ │ │ │ + 402/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ + 403// This is the actual global basis implementation based on the reusable │ │ │ │ │ +parts. │ │ │ │ │ + 404/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ + 405 │ │ │ │ │ + 413template │ │ │ │ │ +414using RaviartThomasBasis = DefaultGlobalBasis │ │ │ │ │ +>; │ │ │ │ │ + 415 │ │ │ │ │ + 416} // end namespace Functions │ │ │ │ │ + 417} // end namespace Dune │ │ │ │ │ + 418 │ │ │ │ │ + 419 │ │ │ │ │ + 420#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH │ │ │ │ │ +nodes.hh │ │ │ │ │ +defaultglobalbasis.hh │ │ │ │ │ +globalvaluedlocalfiniteelement.hh │ │ │ │ │ +Dune::Functions::BasisFactory::power │ │ │ │ │ +auto power(ChildPreBasisFactory &&childPreBasisFactory, const │ │ │ │ │ +IndexMergingStrategy &) │ │ │ │ │ +Create a pre-basis factory that can build a PowerPreBasis. │ │ │ │ │ +Definition: powerbasis.hh:369 │ │ │ │ │ +Dune::Functions::BasisFactory::raviartThomas │ │ │ │ │ +auto raviartThomas() │ │ │ │ │ +Create a pre-basis factory that can create a Raviart-Thomas pre-basis. │ │ │ │ │ +Definition: raviartthomasbasis.hh:391 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::flatVectorView │ │ │ │ │ -auto flatVectorView(T &t) │ │ │ │ │ -Create flat vector view of passed mutable container. │ │ │ │ │ -Definition: flatvectorview.hh:179 │ │ │ │ │ -concepts.hh │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis │ │ │ │ │ +Global basis for given pre-basis. │ │ │ │ │ +Definition: defaultglobalbasis.hh:46 │ │ │ │ │ +Dune::Functions::BasisNodeMixin::size │ │ │ │ │ +size_type size() const │ │ │ │ │ +Definition: nodes.hh:142 │ │ │ │ │ +Dune::Functions::BasisNodeMixin::size_type │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +Definition: nodes.hh:128 │ │ │ │ │ +Dune::Functions::BasisNodeMixin::setSize │ │ │ │ │ +void setSize(const size_type size) │ │ │ │ │ +Definition: nodes.hh:164 │ │ │ │ │ +Dune::Functions::LeafBasisNode │ │ │ │ │ +Definition: nodes.hh:186 │ │ │ │ │ +Dune::Functions::RaviartThomasNode │ │ │ │ │ +Definition: raviartthomasbasis.hh:334 │ │ │ │ │ +Dune::Functions::RaviartThomasNode::FiniteElementMap │ │ │ │ │ +typename Impl::RaviartThomasLocalFiniteElementMap< GV, dim, double, k > │ │ │ │ │ +FiniteElementMap │ │ │ │ │ +Definition: raviartthomasbasis.hh:341 │ │ │ │ │ +Dune::Functions::RaviartThomasNode::bind │ │ │ │ │ +void bind(const Element &e) │ │ │ │ │ +Bind to element. │ │ │ │ │ +Definition: raviartthomasbasis.hh:367 │ │ │ │ │ +Dune::Functions::RaviartThomasNode::FiniteElement │ │ │ │ │ +Impl::GlobalValuedLocalFiniteElement< Impl::ContravariantPiolaTransformator, │ │ │ │ │ +typename FiniteElementMap::FiniteElement, Element > FiniteElement │ │ │ │ │ +Definition: raviartthomasbasis.hh:344 │ │ │ │ │ +Dune::Functions::RaviartThomasNode::Element │ │ │ │ │ +typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ +Definition: raviartthomasbasis.hh:340 │ │ │ │ │ +Dune::Functions::RaviartThomasNode::element_ │ │ │ │ │ +const Element * element_ │ │ │ │ │ +Definition: raviartthomasbasis.hh:377 │ │ │ │ │ +Dune::Functions::RaviartThomasNode::finiteElement │ │ │ │ │ +const FiniteElement & finiteElement() const │ │ │ │ │ +Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ +Definition: raviartthomasbasis.hh:361 │ │ │ │ │ +Dune::Functions::RaviartThomasNode::RaviartThomasNode │ │ │ │ │ +RaviartThomasNode(const FiniteElementMap *finiteElementMap) │ │ │ │ │ +Definition: raviartthomasbasis.hh:346 │ │ │ │ │ +Dune::Functions::RaviartThomasNode::element │ │ │ │ │ +const Element & element() const │ │ │ │ │ +Return current element, throw if unbound. │ │ │ │ │ +Definition: raviartthomasbasis.hh:352 │ │ │ │ │ +Dune::Functions::RaviartThomasNode::finiteElement_ │ │ │ │ │ +FiniteElement finiteElement_ │ │ │ │ │ +Definition: raviartthomasbasis.hh:376 │ │ │ │ │ +Dune::Functions::RaviartThomasNode::finiteElementMap_ │ │ │ │ │ +const FiniteElementMap * finiteElementMap_ │ │ │ │ │ +Definition: raviartthomasbasis.hh:378 │ │ │ │ │ +Dune::Functions::RaviartThomasPreBasis │ │ │ │ │ +Definition: raviartthomasbasis.hh:192 │ │ │ │ │ +Dune::Functions::RaviartThomasPreBasis::minMultiIndexSize │ │ │ │ │ +static constexpr size_type minMultiIndexSize │ │ │ │ │ +Definition: raviartthomasbasis.hh:205 │ │ │ │ │ +Dune::Functions::RaviartThomasPreBasis::maxMultiIndexSize │ │ │ │ │ +static constexpr size_type maxMultiIndexSize │ │ │ │ │ +Definition: raviartthomasbasis.hh:204 │ │ │ │ │ +Dune::Functions::RaviartThomasPreBasis::makeNode │ │ │ │ │ +Node makeNode() const │ │ │ │ │ +Create tree node. │ │ │ │ │ +Definition: raviartthomasbasis.hh:250 │ │ │ │ │ +Dune::Functions::RaviartThomasPreBasis::dofsPerCodim_ │ │ │ │ │ +std::array< int, dim+1 > dofsPerCodim_ │ │ │ │ │ +Definition: raviartthomasbasis.hh:326 │ │ │ │ │ +Dune::Functions::RaviartThomasPreBasis::update │ │ │ │ │ +void update(const GridView &gv) │ │ │ │ │ +Definition: raviartthomasbasis.hh:242 │ │ │ │ │ +Dune::Functions::RaviartThomasPreBasis::RaviartThomasPreBasis │ │ │ │ │ +RaviartThomasPreBasis(const GridView &gv) │ │ │ │ │ +Constructor for a given grid view object. │ │ │ │ │ +Definition: raviartthomasbasis.hh:209 │ │ │ │ │ +Dune::Functions::RaviartThomasPreBasis::size_type │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +Definition: raviartthomasbasis.hh:200 │ │ │ │ │ +Dune::Functions::RaviartThomasPreBasis::gridView │ │ │ │ │ +const GridView & gridView() const │ │ │ │ │ +Obtain the grid view that the basis is defined on. │ │ │ │ │ +Definition: raviartthomasbasis.hh:236 │ │ │ │ │ +Dune::Functions::RaviartThomasPreBasis::indices │ │ │ │ │ +It indices(const Node &node, It it) const │ │ │ │ │ +Maps from subtree index set [0..size-1] to a globally unique multi index in │ │ │ │ │ +global basis. │ │ │ │ │ +Definition: raviartthomasbasis.hh:294 │ │ │ │ │ +Dune::Functions::RaviartThomasPreBasis::multiIndexBufferSize │ │ │ │ │ +static constexpr size_type multiIndexBufferSize │ │ │ │ │ +Definition: raviartthomasbasis.hh:206 │ │ │ │ │ +Dune::Functions::RaviartThomasPreBasis::finiteElementMap_ │ │ │ │ │ +FiniteElementMap finiteElementMap_ │ │ │ │ │ +Definition: raviartthomasbasis.hh:324 │ │ │ │ │ +Dune::Functions::RaviartThomasPreBasis::size │ │ │ │ │ +size_type size() const │ │ │ │ │ +Definition: raviartthomasbasis.hh:255 │ │ │ │ │ +Dune::Functions::RaviartThomasPreBasis::dimension │ │ │ │ │ +size_type dimension() const │ │ │ │ │ +Definition: raviartthomasbasis.hh:269 │ │ │ │ │ +Dune::Functions::RaviartThomasPreBasis::GridView │ │ │ │ │ +GV GridView │ │ │ │ │ +The grid view that the FE space is defined on. │ │ │ │ │ +Definition: raviartthomasbasis.hh:199 │ │ │ │ │ +Dune::Functions::RaviartThomasPreBasis::maxNodeSize │ │ │ │ │ +size_type maxNodeSize() const │ │ │ │ │ +Definition: raviartthomasbasis.hh:274 │ │ │ │ │ +Dune::Functions::RaviartThomasPreBasis::gridView_ │ │ │ │ │ +GridView gridView_ │ │ │ │ │ +Definition: raviartthomasbasis.hh:322 │ │ │ │ │ +Dune::Functions::RaviartThomasPreBasis::size │ │ │ │ │ +size_type size(const SizePrefix &prefix) const │ │ │ │ │ +Return number possible values for next position in multi index. │ │ │ │ │ +Definition: raviartthomasbasis.hh:262 │ │ │ │ │ +Dune::Functions::RaviartThomasPreBasis::initializeIndices │ │ │ │ │ +void initializeIndices() │ │ │ │ │ +Definition: raviartthomasbasis.hh:228 │ │ │ │ │ +Dune::Functions::RaviartThomasPreBasis::codimOffset_ │ │ │ │ │ +std::array< size_t, dim+1 > codimOffset_ │ │ │ │ │ +Definition: raviartthomasbasis.hh:323 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00143.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: nedelecbasis.hh File Reference │ │ │ │ +dune-functions: defaultlocalview.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -64,61 +64,41 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Typedefs | │ │ │ │ -Functions
│ │ │ │ -
nedelecbasis.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
defaultlocalview.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <array>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/grid/common/capabilities.hh>
│ │ │ │ -#include <dune/grid/common/mcmgmapper.hh>
│ │ │ │ -#include <dune/localfunctions/common/localfiniteelementvariant.hh>
│ │ │ │ -#include <dune/localfunctions/nedelec.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/globalvaluedlocalfiniteelement.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ +
#include <tuple>
│ │ │ │ +#include <optional>
│ │ │ │ +#include <dune/common/concept.hh>
│ │ │ │ +#include <dune/common/hybridutilities.hh>
│ │ │ │ +#include <dune/common/reservedvector.hh>
│ │ │ │ +#include <dune/functions/common/overflowarray.hh>
│ │ │ │ +#include <dune/functions/common/multiindex.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::NedelecPreBasis< GV, Range, kind, order >
 
class  Dune::Functions::NedelecNode< GV, Range, kind, order >
class  Dune::Functions::DefaultLocalView< GB >
 The restriction of a finite element basis to a single element. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
namespace  Dune::Functions::BasisFactory
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Typedefs

template<typename GV , std::size_t kind, std::size_t order, typename Range = double>
using Dune::Functions::NedelecBasis = DefaultGlobalBasis< NedelecPreBasis< GV, Range, kind, order > >
 Basis of a k-th-order Nédélec finite element space. More...
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<std::size_t kind, std::size_t order, typename Range = double>
auto Dune::Functions::BasisFactory::nedelec ()
 Create a pre-basis factory that can create a Nédélec pre-basis. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -utf-8 │ │ │ │ │ +us-ascii │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,46 +5,30 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -Classes | Namespaces | Typedefs | Functions │ │ │ │ │ -nedelecbasis.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces │ │ │ │ │ +defaultlocalview.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::NedelecPreBasis<_GV,_Range,_kind,_order_> │ │ │ │ │ -  │ │ │ │ │ -class  Dune::Functions::NedelecNode<_GV,_Range,_kind,_order_> │ │ │ │ │ +class  Dune::Functions::DefaultLocalView<_GB_> │ │ │ │ │ +  The restriction of a finite element basis to a single element. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ -namespace  Dune::Functions::BasisFactory │ │ │ │ │ -  │ │ │ │ │ - Typedefs │ │ │ │ │ -template │ │ │ │ │ -using Dune::Functions::NedelecBasis = DefaultGlobalBasis< NedelecPreBasis< GV, │ │ │ │ │ - Range, kind, order > > │ │ │ │ │ -  Basis of a k-th-order Nédélec finite element space. More... │ │ │ │ │ -  │ │ │ │ │ - Functions │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::BasisFactory::nedelec () │ │ │ │ │ -  Create a pre-basis factory that can create a Nédélec pre-basis. More... │ │ │ │ │ -  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00143_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: nedelecbasis.hh Source File │ │ │ │ +dune-functions: defaultlocalview.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,381 +62,190 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
nedelecbasis.hh
│ │ │ │ +
defaultlocalview.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NEDELECBASIS_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NEDELECBASIS_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALVIEW_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALVIEW_HH
│ │ │ │
5
│ │ │ │ -
6#include <array>
│ │ │ │ -
7#include <dune/common/exceptions.hh>
│ │ │ │ -
8
│ │ │ │ -
9#include <dune/grid/common/capabilities.hh>
│ │ │ │ -
10#include <dune/grid/common/mcmgmapper.hh>
│ │ │ │ -
11
│ │ │ │ -
12#include <dune/localfunctions/common/localfiniteelementvariant.hh>
│ │ │ │ -
13#include <dune/localfunctions/nedelec.hh>
│ │ │ │ -
14
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +
6
│ │ │ │ +
7#include <tuple>
│ │ │ │ +
8#include <optional>
│ │ │ │ +
9
│ │ │ │ +
10#include <dune/common/concept.hh>
│ │ │ │ +
11#include <dune/common/hybridutilities.hh>
│ │ │ │ +
12#include <dune/common/reservedvector.hh>
│ │ │ │ +
13
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
17
│ │ │ │
18
│ │ │ │ -
19namespace Dune::Functions
│ │ │ │ -
20{
│ │ │ │ -
21
│ │ │ │ -
22namespace Impl
│ │ │ │ -
23{
│ │ │ │ -
24 template<typename GV, int dim, typename R, std::size_t order>
│ │ │ │ -
25 class Nedelec1stKindLocalFiniteElementMap
│ │ │ │ -
26 {
│ │ │ │ -
27 using D = typename GV::ctype;
│ │ │ │ -
28 constexpr static bool hasFixedElementType = Capabilities::hasSingleGeometryType<typename GV::Grid>::v;
│ │ │ │ -
29
│ │ │ │ -
30 using CubeFiniteElement = Nedelec1stKindCubeLocalFiniteElement<D,R,dim,order>;
│ │ │ │ -
31 using SimplexFiniteElement = Nedelec1stKindSimplexLocalFiniteElement<D,R,dim,order>;
│ │ │ │ -
32
│ │ │ │ -
33 public:
│ │ │ │ -
34
│ │ │ │ -
35 using T = LocalBasisTraits<D, dim, FieldVector<D,dim>, R, dim, FieldVector<R,dim>, FieldMatrix<D,dim,dim> >;
│ │ │ │ +
19
│ │ │ │ +
20namespace Dune {
│ │ │ │ +
21namespace Functions {
│ │ │ │ +
22
│ │ │ │ +
23
│ │ │ │ +
24
│ │ │ │ +
26template<class GB>
│ │ │ │ + │ │ │ │ +
28{
│ │ │ │ +
29public:
│ │ │ │ +
30
│ │ │ │ +
32 using GlobalBasis = GB;
│ │ │ │ +
33
│ │ │ │ +
35 using GridView = typename GlobalBasis::GridView;
│ │ │ │
36
│ │ │ │ -
37 constexpr static unsigned int topologyId = Capabilities::hasSingleGeometryType<typename GV::Grid>::topologyId; // meaningless if hasFixedElementType is false
│ │ │ │ -
38 constexpr static GeometryType type = GeometryType(topologyId, GV::dimension);
│ │ │ │ +
38 using Element = typename GridView::template Codim<0>::Entity;
│ │ │ │
39
│ │ │ │ -
40 using FiniteElement = std::conditional_t<hasFixedElementType,
│ │ │ │ -
41 std::conditional_t<type.isCube(),CubeFiniteElement,SimplexFiniteElement>,
│ │ │ │ -
42 LocalFiniteElementVariant<CubeFiniteElement, SimplexFiniteElement> >;
│ │ │ │ -
43
│ │ │ │ -
44 static std::size_t numVariants(GeometryType type)
│ │ │ │ -
45 {
│ │ │ │ -
46 if (order!=1) // I am not sure whether the formula below is correct for all orders.
│ │ │ │ -
47 DUNE_THROW(NotImplemented, "Only Nedelec elements of order 1 are implemented!");
│ │ │ │ -
48
│ │ │ │ -
49 auto numEdges = referenceElement<D,dim>(type).size(dim-1);
│ │ │ │ -
50 return power(2,numEdges);
│ │ │ │ -
51 }
│ │ │ │ -
52
│ │ │ │ -
53 Nedelec1stKindLocalFiniteElementMap(const GV& gv)
│ │ │ │ -
54 : elementMapper_(gv, mcmgElementLayout()),
│ │ │ │ -
55 orientation_(gv.size(0))
│ │ │ │ -
56 {
│ │ │ │ -
57 // create all variants
│ │ │ │ -
58 if constexpr (hasFixedElementType)
│ │ │ │ -
59 {
│ │ │ │ -
60 variants_.resize(numVariants(type));
│ │ │ │ -
61 for (size_t i = 0; i < numVariants(type); i++)
│ │ │ │ -
62 variants_[i] = FiniteElement(i);
│ │ │ │ -
63 }
│ │ │ │ -
64 else
│ │ │ │ -
65 {
│ │ │ │ -
66 // for mixed grids add offset for cubes
│ │ │ │ -
67 variants_.resize(numVariants(GeometryTypes::simplex(dim)) + numVariants(GeometryTypes::cube(dim)));
│ │ │ │ -
68 for (size_t i = 0; i < numVariants(GeometryTypes::simplex(dim)); i++)
│ │ │ │ -
69 variants_[i] = SimplexFiniteElement(i);
│ │ │ │ -
70 for (size_t i = 0; i < numVariants(GeometryTypes::cube(dim)); i++)
│ │ │ │ -
71 variants_[i + numVariants(GeometryTypes::simplex(dim))] = CubeFiniteElement(i);
│ │ │ │ -
72 }
│ │ │ │ -
73
│ │ │ │ -
74
│ │ │ │ -
75 // compute orientation for all elements
│ │ │ │ -
76 const auto& indexSet = gv.indexSet();
│ │ │ │ -
77
│ │ │ │ -
78 for(const auto& element : elements(gv))
│ │ │ │ -
79 {
│ │ │ │ -
80 const auto& refElement = referenceElement(element);
│ │ │ │ -
81 auto elementIndex = elementMapper_.index(element);
│ │ │ │ -
82 orientation_[elementIndex] = 0;
│ │ │ │ -
83
│ │ │ │ -
84 for (std::size_t i=0; i<element.subEntities(dim-1); i++)
│ │ │ │ -
85 {
│ │ │ │ -
86 // Local vertex indices within the element
│ │ │ │ -
87 auto localV0 = refElement.subEntity(i,dim-1, 0,dim);
│ │ │ │ -
88 auto localV1 = refElement.subEntity(i,dim-1, 1,dim);
│ │ │ │ -
89
│ │ │ │ -
90 // Global vertex indices within the grid
│ │ │ │ -
91 auto globalV0 = indexSet.subIndex(element,localV0,dim);
│ │ │ │ -
92 auto globalV1 = indexSet.subIndex(element,localV1,dim);
│ │ │ │ -
93
│ │ │ │ -
94 if ( (localV0<localV1 && globalV0>globalV1) || (localV0>localV1 && globalV0<globalV1) )
│ │ │ │ -
95 orientation_[elementIndex] |= (1 << i);
│ │ │ │ -
96 }
│ │ │ │ -
97 // for mixed grids add offset for cubes
│ │ │ │ -
98 if constexpr (!hasFixedElementType)
│ │ │ │ -
99 if (element.type().isCube())
│ │ │ │ -
100 orientation_[elementIndex] += numVariants(GeometryTypes::simplex(dim));
│ │ │ │ -
101 }
│ │ │ │ -
102 }
│ │ │ │ -
103
│ │ │ │ -
104 template<class Element>
│ │ │ │ -
105 const auto& find(const Element& element) const
│ │ │ │ -
106 {
│ │ │ │ -
107 return variants_[orientation_[elementMapper_.index(element)]];
│ │ │ │ -
108 }
│ │ │ │ -
109
│ │ │ │ -
110 private:
│ │ │ │ -
111 std::vector<FiniteElement> variants_;
│ │ │ │ -
112 const Dune::MultipleCodimMultipleGeomTypeMapper<GV> elementMapper_;
│ │ │ │ -
113 std::vector<unsigned short> orientation_;
│ │ │ │ -
114 };
│ │ │ │ -
115
│ │ │ │ -
116
│ │ │ │ -
117} // namespace Impl
│ │ │ │ -
118
│ │ │ │ -
119
│ │ │ │ -
120// *****************************************************************************
│ │ │ │ -
121// This is the reusable part of the basis. It contains
│ │ │ │ -
122//
│ │ │ │ -
123// NedelecPreBasis
│ │ │ │ -
124// NedelecNode
│ │ │ │ -
125//
│ │ │ │ -
126// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ -
127// state. These components do _not_ depend on the global basis and local view
│ │ │ │ -
128// and can be used without a global basis.
│ │ │ │ -
129// *****************************************************************************
│ │ │ │ -
130
│ │ │ │ -
131template<typename GV, typename Range, std::size_t kind, int order>
│ │ │ │ -
132class NedelecNode;
│ │ │ │ -
133
│ │ │ │ -
134template<typename GV, typename Range, std::size_t kind, int order>
│ │ │ │ - │ │ │ │ -
136{
│ │ │ │ -
137 static const int dim = GV::dimension;
│ │ │ │ -
138 static_assert(kind==1, "Only the Nedelec basis of the first kind is currently implemented!");
│ │ │ │ -
139 using FiniteElementMap = typename Impl::Nedelec1stKindLocalFiniteElementMap<GV, dim, Range, order>;
│ │ │ │ -
140
│ │ │ │ -
141 using Mapper = Dune::MultipleCodimMultipleGeomTypeMapper<GV>;
│ │ │ │ -
142public:
│ │ │ │ -
143
│ │ │ │ -
145 using GridView = GV;
│ │ │ │ -
146 using size_type = std::size_t;
│ │ │ │ +
41 using size_type = std::size_t;
│ │ │ │ +
42
│ │ │ │ +
44 using Tree = typename GlobalBasis::PreBasis::Node;
│ │ │ │ +
45
│ │ │ │ +
46protected:
│ │ │ │ +
47
│ │ │ │ +
48 using PreBasis = typename GlobalBasis::PreBasis;
│ │ │ │ +
49
│ │ │ │ +
50 // Type used to store the multi indices of the basis vectors.
│ │ │ │ +
51 // In contrast to MultiIndex this always has dynamic size.
│ │ │ │ +
52 // It's guaranteed, that you can always cast it to MultiIndex
│ │ │ │ + │ │ │ │ +
54 std::conditional_t<(PreBasis::minMultiIndexSize == PreBasis::maxMultiIndexSize),
│ │ │ │ + │ │ │ │ +
56 Dune::ReservedVector<size_type, PreBasis::multiIndexBufferSize>>;
│ │ │ │ +
57
│ │ │ │ +
58public:
│ │ │ │ +
59
│ │ │ │ +
61 using MultiIndex =
│ │ │ │ +
62 std::conditional_t<(PreBasis::minMultiIndexSize == PreBasis::maxMultiIndexSize),
│ │ │ │ + │ │ │ │ +
64 Dune::ReservedVector<size_type, PreBasis::multiIndexBufferSize>>;
│ │ │ │ +
65
│ │ │ │ +
66
│ │ │ │ + │ │ │ │ + │ │ │ │ +
70 tree_(globalBasis_->preBasis().makeNode())
│ │ │ │ +
71 {
│ │ │ │ +
72 static_assert(models<Concept::BasisTree<GridView>, Tree>(), "Tree type passed to DefaultLocalView does not model the BasisNode concept.");
│ │ │ │ + │ │ │ │ +
74 }
│ │ │ │ +
75
│ │ │ │ +
81 void bind(const Element& e)
│ │ │ │ +
82 {
│ │ │ │ +
83 element_ = e;
│ │ │ │ + │ │ │ │ +
85 indices_.resize(size());
│ │ │ │ +
86 globalBasis_->preBasis().indices(tree_, indices_.begin());
│ │ │ │ +
87 }
│ │ │ │ +
88
│ │ │ │ +
91 [[deprecated("Use the bound() method instead")]]
│ │ │ │ +
92 bool isBound() const {
│ │ │ │ +
93 return static_cast<bool>(element_);
│ │ │ │ +
94 }
│ │ │ │ +
95
│ │ │ │ +
98 bool bound() const
│ │ │ │ +
99 {
│ │ │ │ +
100 return static_cast<bool>(element_);
│ │ │ │ +
101 }
│ │ │ │ +
102
│ │ │ │ +
107 const Element& element() const
│ │ │ │ +
108 {
│ │ │ │ +
109 return *element_;
│ │ │ │ +
110 }
│ │ │ │ +
111
│ │ │ │ +
116 void unbind()
│ │ │ │ +
117 {
│ │ │ │ +
118 element_.reset();
│ │ │ │ +
119 }
│ │ │ │ +
120
│ │ │ │ +
125 const Tree& tree() const
│ │ │ │ +
126 {
│ │ │ │ +
127 return tree_;
│ │ │ │ +
128 }
│ │ │ │ +
129
│ │ │ │ + │ │ │ │ +
133 {
│ │ │ │ +
134 return tree_.size();
│ │ │ │ +
135 }
│ │ │ │ +
136
│ │ │ │ + │ │ │ │ +
144 {
│ │ │ │ +
145 return globalBasis_->preBasis().maxNodeSize();
│ │ │ │ +
146 }
│ │ │ │
147
│ │ │ │ - │ │ │ │ -
149
│ │ │ │ -
150 static constexpr size_type maxMultiIndexSize = 1;
│ │ │ │ -
151 static constexpr size_type minMultiIndexSize = 1;
│ │ │ │ -
152 static constexpr size_type multiIndexBufferSize = 1;
│ │ │ │ +
149 const MultiIndex& index(size_type i) const
│ │ │ │ +
150 {
│ │ │ │ +
151 return indices_[i];
│ │ │ │ +
152 }
│ │ │ │
153
│ │ │ │ - │ │ │ │ -
156 gridView_(gv),
│ │ │ │ - │ │ │ │ -
158 mapper_(gridView_, mcmgLayout(Dim<1>{}))
│ │ │ │ -
159 {
│ │ │ │ -
160 if (kind!=1)
│ │ │ │ -
161 DUNE_THROW(NotImplemented, "Only Nedelec elements of the first kind are implemented!");
│ │ │ │ -
162
│ │ │ │ -
163 // There is no inherent reason why the basis shouldn't work for grids with more than two
│ │ │ │ -
164 // element types. Somebody simply has to sit down and implement the missing bits.
│ │ │ │ -
165 if (gv.indexSet().types(0).size() > 2)
│ │ │ │ -
166 DUNE_THROW(NotImplemented, "Nédélec basis is only implemented for grids with simplex and cube elements");
│ │ │ │ -
167
│ │ │ │ -
168 for(auto type : gv.indexSet().types(0))
│ │ │ │ -
169 if (!type.isSimplex() && !type.isCube())
│ │ │ │ -
170 DUNE_THROW(NotImplemented, "Nédélec basis is only implemented for grids with simplex or cube elements.");
│ │ │ │ -
171
│ │ │ │ -
172 if (order>1)
│ │ │ │ -
173 DUNE_THROW(NotImplemented, "Only first-order elements are implemented");
│ │ │ │ + │ │ │ │ +
157 {
│ │ │ │ +
158 return *globalBasis_;
│ │ │ │ +
159 }
│ │ │ │ +
160
│ │ │ │ + │ │ │ │ +
162 {
│ │ │ │ +
163 return *this;
│ │ │ │ +
164 }
│ │ │ │ +
165
│ │ │ │ +
166protected:
│ │ │ │ + │ │ │ │ +
168 std::optional<Element> element_;
│ │ │ │ + │ │ │ │ +
170 std::vector<MultiIndexStorage> indices_;
│ │ │ │ +
171};
│ │ │ │ +
172
│ │ │ │ +
173
│ │ │ │
174
│ │ │ │ -
175 if (dim!=2 && dim!=3)
│ │ │ │ -
176 DUNE_THROW(NotImplemented, "Only 2d and 3d Nédélec elements are implemented");
│ │ │ │ -
177 }
│ │ │ │ +
175} // end namespace Functions
│ │ │ │ +
176} // end namespace Dune
│ │ │ │ +
177
│ │ │ │
178
│ │ │ │ - │ │ │ │ -
180 {}
│ │ │ │ -
181
│ │ │ │ -
184 const GridView& gridView() const
│ │ │ │ -
185 {
│ │ │ │ -
186 return gridView_;
│ │ │ │ -
187 }
│ │ │ │ -
188
│ │ │ │ -
189 /* \brief Update the stored grid view, to be called if the grid has changed */
│ │ │ │ -
190 void update (const GridView& gv)
│ │ │ │ -
191 {
│ │ │ │ -
192 gridView_ = gv;
│ │ │ │ -
193 mapper_.update(gridView_);
│ │ │ │ -
194 }
│ │ │ │ -
195
│ │ │ │ - │ │ │ │ -
200 {
│ │ │ │ -
201 return Node{&finiteElementMap_};
│ │ │ │ -
202 }
│ │ │ │ -
203
│ │ │ │ - │ │ │ │ -
205 {
│ │ │ │ -
206 return mapper_.size();
│ │ │ │ -
207 }
│ │ │ │ -
208
│ │ │ │ -
210 template<class SizePrefix>
│ │ │ │ -
211 size_type size(const SizePrefix& prefix) const
│ │ │ │ -
212 {
│ │ │ │ -
213 assert(prefix.size() == 0 || prefix.size() == 1);
│ │ │ │ -
214 return (prefix.size() == 0) ? size() : 0;
│ │ │ │ -
215 }
│ │ │ │ -
216
│ │ │ │ - │ │ │ │ -
218 {
│ │ │ │ -
219 return size();
│ │ │ │ -
220 }
│ │ │ │ -
221
│ │ │ │ - │ │ │ │ -
223 {
│ │ │ │ -
224 size_type result = 0;
│ │ │ │ -
225 for (auto&& type : gridView_.indexSet().types(0))
│ │ │ │ -
226 {
│ │ │ │ -
227 size_type numEdges = referenceElement<typename GV::ctype,dim>(type).size(dim-1);
│ │ │ │ -
228 result = std::max(result, numEdges);
│ │ │ │ -
229 }
│ │ │ │ -
230
│ │ │ │ -
231 return result;
│ │ │ │ -
232 }
│ │ │ │ -
233
│ │ │ │ -
237 template<typename It>
│ │ │ │ -
238 It indices(const Node& node, It it) const
│ │ │ │ -
239 {
│ │ │ │ -
240 const auto& element = node.element();
│ │ │ │ -
241
│ │ │ │ -
242 // throw if Element is not of predefined type
│ │ │ │ -
243 if (not(element.type().isCube()) and not(element.type().isSimplex()))
│ │ │ │ -
244 DUNE_THROW(NotImplemented, "NedelecBasis only implemented for cube and simplex elements.");
│ │ │ │ -
245
│ │ │ │ -
246 for(std::size_t i=0, end=node.size(); i<end; ++i, ++it)
│ │ │ │ -
247 {
│ │ │ │ -
248 Dune::LocalKey localKey = node.finiteElement().localCoefficients().localKey(i);
│ │ │ │ -
249 *it = { mapper_.subIndex(element, localKey.subEntity(), localKey.codim()) + localKey.index() };
│ │ │ │ -
250 }
│ │ │ │ -
251
│ │ │ │ -
252 return it;
│ │ │ │ -
253 }
│ │ │ │ -
254
│ │ │ │ -
255protected:
│ │ │ │ - │ │ │ │ -
257 FiniteElementMap finiteElementMap_;
│ │ │ │ -
258 Mapper mapper_;
│ │ │ │ -
259};
│ │ │ │ -
260
│ │ │ │ -
261
│ │ │ │ -
262
│ │ │ │ -
263template<typename GV, typename Range, size_t kind, int order>
│ │ │ │ - │ │ │ │ -
265 public LeafBasisNode
│ │ │ │ -
266{
│ │ │ │ -
267 static const int dim = GV::dimension;
│ │ │ │ -
268
│ │ │ │ -
269public:
│ │ │ │ -
270
│ │ │ │ -
271 using size_type = std::size_t;
│ │ │ │ -
272 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ -
273 static_assert(kind==1, "Only Nedelec elements of the first kind are implemented!");
│ │ │ │ -
274 using FiniteElementMap = typename Impl::Nedelec1stKindLocalFiniteElementMap<GV, dim, Range, order>;
│ │ │ │ -
275 using FiniteElement = Impl::GlobalValuedLocalFiniteElement<Impl::CovariantPiolaTransformator,
│ │ │ │ -
276 typename FiniteElementMap::FiniteElement,
│ │ │ │ -
277 Element>;
│ │ │ │ -
278
│ │ │ │ -
279 NedelecNode(const FiniteElementMap* finiteElementMap) :
│ │ │ │ -
280 element_(nullptr),
│ │ │ │ -
281 finiteElementMap_(finiteElementMap)
│ │ │ │ -
282 { }
│ │ │ │ -
283
│ │ │ │ -
285 const Element& element() const
│ │ │ │ -
286 {
│ │ │ │ -
287 return *element_;
│ │ │ │ -
288 }
│ │ │ │ -
289
│ │ │ │ - │ │ │ │ -
295 {
│ │ │ │ -
296 return finiteElement_;
│ │ │ │ -
297 }
│ │ │ │ -
298
│ │ │ │ -
300 void bind(const Element& e)
│ │ │ │ -
301 {
│ │ │ │ -
302 element_ = &e;
│ │ │ │ -
303 finiteElement_.bind((finiteElementMap_->find(*element_)), e);
│ │ │ │ -
304 this->setSize(finiteElement_.size());
│ │ │ │ -
305 }
│ │ │ │ -
306
│ │ │ │ -
307protected:
│ │ │ │ -
308
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
312};
│ │ │ │ -
313
│ │ │ │ -
314
│ │ │ │ -
315
│ │ │ │ -
316namespace BasisFactory {
│ │ │ │ -
317
│ │ │ │ -
327template<std::size_t kind, std::size_t order, typename Range=double>
│ │ │ │ - │ │ │ │ -
329{
│ │ │ │ -
330 return [](const auto& gridView) {
│ │ │ │ -
331 return NedelecPreBasis<std::decay_t<decltype(gridView)>, Range, kind, order>(gridView);
│ │ │ │ -
332 };
│ │ │ │ -
333}
│ │ │ │ -
334
│ │ │ │ -
335} // end namespace BasisFactory
│ │ │ │ -
336
│ │ │ │ -
337
│ │ │ │ -
338
│ │ │ │ -
339// *****************************************************************************
│ │ │ │ -
340// This is the actual global basis implementation based on the reusable parts.
│ │ │ │ -
341// *****************************************************************************
│ │ │ │ -
342
│ │ │ │ -
350template<typename GV, std::size_t kind, std::size_t order, typename Range=double>
│ │ │ │ - │ │ │ │ -
352
│ │ │ │ -
353} // end namespace Dune::Functions
│ │ │ │ -
354
│ │ │ │ -
355
│ │ │ │ -
356#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NEDELECBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
auto power(ChildPreBasisFactory &&childPreBasisFactory, const IndexMergingStrategy &)
Create a pre-basis factory that can build a PowerPreBasis.
Definition: powerbasis.hh:369
│ │ │ │ -
auto nedelec()
Create a pre-basis factory that can create a Nédélec pre-basis.
Definition: nedelecbasis.hh:328
│ │ │ │ -
Definition: polynomial.hh:11
│ │ │ │ -
Global basis for given pre-basis.
Definition: defaultglobalbasis.hh:46
│ │ │ │ -
Definition: nedelecbasis.hh:266
│ │ │ │ -
const FiniteElementMap * finiteElementMap_
Definition: nedelecbasis.hh:311
│ │ │ │ -
FiniteElement finiteElement_
Definition: nedelecbasis.hh:309
│ │ │ │ -
Impl::GlobalValuedLocalFiniteElement< Impl::CovariantPiolaTransformator, typename FiniteElementMap::FiniteElement, Element > FiniteElement
Definition: nedelecbasis.hh:277
│ │ │ │ -
void bind(const Element &e)
Bind to element.
Definition: nedelecbasis.hh:300
│ │ │ │ -
const Element & element() const
Return current element, throw if unbound.
Definition: nedelecbasis.hh:285
│ │ │ │ -
typename GV::template Codim< 0 >::Entity Element
Definition: nedelecbasis.hh:272
│ │ │ │ -
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition: nedelecbasis.hh:294
│ │ │ │ -
NedelecNode(const FiniteElementMap *finiteElementMap)
Definition: nedelecbasis.hh:279
│ │ │ │ -
typename Impl::Nedelec1stKindLocalFiniteElementMap< GV, dim, Range, order > FiniteElementMap
Definition: nedelecbasis.hh:274
│ │ │ │ -
const Element * element_
Definition: nedelecbasis.hh:310
│ │ │ │ -
std::size_t size_type
Definition: nedelecbasis.hh:271
│ │ │ │ -
Definition: nedelecbasis.hh:136
│ │ │ │ -
It indices(const Node &node, It it) const
Maps from subtree index set [0..size-1] to a globally unique multi index in global basis.
Definition: nedelecbasis.hh:238
│ │ │ │ -
size_type size(const SizePrefix &prefix) const
Return number possible values for next position in multi index.
Definition: nedelecbasis.hh:211
│ │ │ │ -
std::size_t size_type
Definition: nedelecbasis.hh:146
│ │ │ │ -
NedelecPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition: nedelecbasis.hh:155
│ │ │ │ -
GV GridView
The grid view that the FE space is defined on.
Definition: nedelecbasis.hh:145
│ │ │ │ -
size_type dimension() const
Definition: nedelecbasis.hh:217
│ │ │ │ -
static constexpr size_type maxMultiIndexSize
Definition: nedelecbasis.hh:150
│ │ │ │ -
static constexpr size_type multiIndexBufferSize
Definition: nedelecbasis.hh:152
│ │ │ │ -
GridView gridView_
Definition: nedelecbasis.hh:256
│ │ │ │ -
FiniteElementMap finiteElementMap_
Definition: nedelecbasis.hh:257
│ │ │ │ -
static constexpr size_type minMultiIndexSize
Definition: nedelecbasis.hh:151
│ │ │ │ -
void initializeIndices()
Definition: nedelecbasis.hh:179
│ │ │ │ -
void update(const GridView &gv)
Definition: nedelecbasis.hh:190
│ │ │ │ -
size_type maxNodeSize() const
Definition: nedelecbasis.hh:222
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: nedelecbasis.hh:184
│ │ │ │ -
Node makeNode() const
Create tree node.
Definition: nedelecbasis.hh:199
│ │ │ │ -
size_type size() const
Definition: nedelecbasis.hh:204
│ │ │ │ -
Mapper mapper_
Definition: nedelecbasis.hh:258
│ │ │ │ -
size_type size() const
Definition: nodes.hh:142
│ │ │ │ -
void setSize(const size_type size)
Definition: nodes.hh:164
│ │ │ │ -
Definition: nodes.hh:186
│ │ │ │ +
179
│ │ │ │ +
180#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALVIEW_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ +
Definition: polynomial.hh:10
│ │ │ │ +
void bindTree(Tree &tree, const Entity &entity, std::size_t offset=0)
Definition: nodes.hh:253
│ │ │ │ +
void initializeTree(Tree &tree, std::size_t treeIndexOffset=0)
Definition: nodes.hh:260
│ │ │ │ +
A statically sized MultiIndex type.
Definition: multiindex.hh:25
│ │ │ │ +
A dynamically sized array-like class with overflow.
Definition: overflowarray.hh:45
│ │ │ │ +
The restriction of a finite element basis to a single element.
Definition: defaultlocalview.hh:28
│ │ │ │ +
typename GlobalBasis::PreBasis PreBasis
Definition: defaultlocalview.hh:48
│ │ │ │ +
void unbind()
Unbind from the current element.
Definition: defaultlocalview.hh:116
│ │ │ │ +
bool bound() const
Return if the view is bound to a grid element.
Definition: defaultlocalview.hh:98
│ │ │ │ +
typename GlobalBasis::GridView GridView
The grid view the global FE basis lives on.
Definition: defaultlocalview.hh:35
│ │ │ │ +
const MultiIndex & index(size_type i) const
Maps from subtree index set [0..size-1] to a globally unique multi index in global basis.
Definition: defaultlocalview.hh:149
│ │ │ │ +
std::optional< Element > element_
Definition: defaultlocalview.hh:168
│ │ │ │ +
typename GridView::template Codim< 0 >::Entity Element
Type of the grid element we are bound to.
Definition: defaultlocalview.hh:38
│ │ │ │ +
const Tree & tree() const
Return the local ansatz tree associated to the bound entity.
Definition: defaultlocalview.hh:125
│ │ │ │ +
void bind(const Element &e)
Bind the view to a grid element.
Definition: defaultlocalview.hh:81
│ │ │ │ +
const Element & element() const
Return the grid element that the view is bound to.
Definition: defaultlocalview.hh:107
│ │ │ │ +
size_type size() const
Total number of degrees of freedom on this element.
Definition: defaultlocalview.hh:132
│ │ │ │ +
GB GlobalBasis
The global FE basis that this is a view on.
Definition: defaultlocalview.hh:32
│ │ │ │ +
Tree tree_
Definition: defaultlocalview.hh:169
│ │ │ │ +
size_type maxSize() const
Maximum local size for any element on the GridView.
Definition: defaultlocalview.hh:143
│ │ │ │ +
std::size_t size_type
The type used for sizes.
Definition: defaultlocalview.hh:41
│ │ │ │ +
bool isBound() const
Return if the view is bound to a grid element.
Definition: defaultlocalview.hh:92
│ │ │ │ +
const DefaultLocalView & rootLocalView() const
Definition: defaultlocalview.hh:161
│ │ │ │ +
std::conditional_t<(PreBasis::minMultiIndexSize==PreBasis::maxMultiIndexSize), OverflowArray< StaticMultiIndex< size_type, PreBasis::maxMultiIndexSize >, PreBasis::multiIndexBufferSize >, Dune::ReservedVector< size_type, PreBasis::multiIndexBufferSize > > MultiIndexStorage
Definition: defaultlocalview.hh:56
│ │ │ │ +
std::conditional_t<(PreBasis::minMultiIndexSize==PreBasis::maxMultiIndexSize), StaticMultiIndex< size_type, PreBasis::maxMultiIndexSize >, Dune::ReservedVector< size_type, PreBasis::multiIndexBufferSize > > MultiIndex
Type used for global numbering of the basis vectors.
Definition: defaultlocalview.hh:64
│ │ │ │ +
std::vector< MultiIndexStorage > indices_
Definition: defaultlocalview.hh:170
│ │ │ │ +
typename GlobalBasis::PreBasis::Node Tree
Tree of local finite elements / local shape function sets.
Definition: defaultlocalview.hh:44
│ │ │ │ +
DefaultLocalView(const GlobalBasis &globalBasis)
Construct local view for a given global finite element basis.
Definition: defaultlocalview.hh:68
│ │ │ │ +
const GlobalBasis * globalBasis_
Definition: defaultlocalview.hh:167
│ │ │ │ +
const GlobalBasis & globalBasis() const
Return the global basis that we are a view on.
Definition: defaultlocalview.hh:156
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -utf-8 │ │ │ │ │ +us-ascii │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,502 +5,271 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -nedelecbasis.hh │ │ │ │ │ +defaultlocalview.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NEDELECBASIS_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NEDELECBASIS_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALVIEW_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALVIEW_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ - 8 │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11 │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14 │ │ │ │ │ - 15#include │ │ │ │ │ - 16#include │ │ │ │ │ - 17#include │ │ │ │ │ + 6 │ │ │ │ │ + 7#include │ │ │ │ │ + 8#include │ │ │ │ │ + 9 │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ + 13 │ │ │ │ │ + 14#include │ │ │ │ │ + 15#include │ │ │ │ │ + 16#include │ │ │ │ │ + 17 │ │ │ │ │ 18 │ │ │ │ │ - 19namespace Dune::Functions │ │ │ │ │ - 20{ │ │ │ │ │ - 21 │ │ │ │ │ - 22namespace Impl │ │ │ │ │ - 23{ │ │ │ │ │ - 24 template │ │ │ │ │ - 25 class Nedelec1stKindLocalFiniteElementMap │ │ │ │ │ - 26 { │ │ │ │ │ - 27 using D = typename GV::ctype; │ │ │ │ │ - 28 constexpr static bool hasFixedElementType = Capabilities:: │ │ │ │ │ -hasSingleGeometryType::v; │ │ │ │ │ - 29 │ │ │ │ │ - 30 using CubeFiniteElement = │ │ │ │ │ -Nedelec1stKindCubeLocalFiniteElement; │ │ │ │ │ - 31 using SimplexFiniteElement = │ │ │ │ │ -Nedelec1stKindSimplexLocalFiniteElement; │ │ │ │ │ - 32 │ │ │ │ │ - 33 public: │ │ │ │ │ - 34 │ │ │ │ │ - 35 using T = LocalBasisTraits, R, dim, │ │ │ │ │ -FieldVector, FieldMatrix >; │ │ │ │ │ + 19 │ │ │ │ │ + 20namespace Dune { │ │ │ │ │ + 21namespace Functions { │ │ │ │ │ + 22 │ │ │ │ │ + 23 │ │ │ │ │ + 24 │ │ │ │ │ + 26template │ │ │ │ │ +27class DefaultLocalView │ │ │ │ │ + 28{ │ │ │ │ │ + 29public: │ │ │ │ │ + 30 │ │ │ │ │ +32 using GlobalBasis = GB; │ │ │ │ │ + 33 │ │ │ │ │ +35 using GridView = typename GlobalBasis::GridView; │ │ │ │ │ 36 │ │ │ │ │ - 37 constexpr static unsigned int topologyId = Capabilities:: │ │ │ │ │ -hasSingleGeometryType::topologyId; // meaningless if │ │ │ │ │ -hasFixedElementType is false │ │ │ │ │ - 38 constexpr static GeometryType type = GeometryType(topologyId, GV:: │ │ │ │ │ -dimension); │ │ │ │ │ +38 using Element = typename GridView::template Codim<0>::Entity; │ │ │ │ │ 39 │ │ │ │ │ - 40 using FiniteElement = std::conditional_t, │ │ │ │ │ - 42 LocalFiniteElementVariant >; │ │ │ │ │ - 43 │ │ │ │ │ - 44 static std::size_t numVariants(GeometryType type) │ │ │ │ │ - 45 { │ │ │ │ │ - 46 if (order!=1) // I am not sure whether the formula below is correct for all │ │ │ │ │ -orders. │ │ │ │ │ - 47 DUNE_THROW(NotImplemented, "Only Nedelec elements of order 1 are │ │ │ │ │ -implemented!"); │ │ │ │ │ - 48 │ │ │ │ │ - 49 auto numEdges = referenceElement(type).size(dim-1); │ │ │ │ │ - 50 return power(2,numEdges); │ │ │ │ │ - 51 } │ │ │ │ │ - 52 │ │ │ │ │ - 53 Nedelec1stKindLocalFiniteElementMap(const GV& gv) │ │ │ │ │ - 54 : elementMapper_(gv, mcmgElementLayout()), │ │ │ │ │ - 55 orientation_(gv.size(0)) │ │ │ │ │ - 56 { │ │ │ │ │ - 57 // create all variants │ │ │ │ │ - 58 if constexpr (hasFixedElementType) │ │ │ │ │ - 59 { │ │ │ │ │ - 60 variants_.resize(numVariants(type)); │ │ │ │ │ - 61 for (size_t i = 0; i < numVariants(type); i++) │ │ │ │ │ - 62 variants_[i] = FiniteElement(i); │ │ │ │ │ - 63 } │ │ │ │ │ - 64 else │ │ │ │ │ - 65 { │ │ │ │ │ - 66 // for mixed grids add offset for cubes │ │ │ │ │ - 67 variants_.resize(numVariants(GeometryTypes::simplex(dim)) + numVariants │ │ │ │ │ -(GeometryTypes::cube(dim))); │ │ │ │ │ - 68 for (size_t i = 0; i < numVariants(GeometryTypes::simplex(dim)); i++) │ │ │ │ │ - 69 variants_[i] = SimplexFiniteElement(i); │ │ │ │ │ - 70 for (size_t i = 0; i < numVariants(GeometryTypes::cube(dim)); i++) │ │ │ │ │ - 71 variants_[i + numVariants(GeometryTypes::simplex(dim))] = CubeFiniteElement │ │ │ │ │ -(i); │ │ │ │ │ - 72 } │ │ │ │ │ - 73 │ │ │ │ │ - 74 │ │ │ │ │ - 75 // compute orientation for all elements │ │ │ │ │ - 76 const auto& indexSet = gv.indexSet(); │ │ │ │ │ - 77 │ │ │ │ │ - 78 for(const auto& element : elements(gv)) │ │ │ │ │ - 79 { │ │ │ │ │ - 80 const auto& refElement = referenceElement(element); │ │ │ │ │ - 81 auto elementIndex = elementMapper_.index(element); │ │ │ │ │ - 82 orientation_[elementIndex] = 0; │ │ │ │ │ - 83 │ │ │ │ │ - 84 for (std::size_t i=0; iglobalV1) || (localV0>localV1 && │ │ │ │ │ -globalV0, │ │ │ │ │ +PreBasis::multiIndexBufferSize>, │ │ │ │ │ + 56 Dune::ReservedVector>; │ │ │ │ │ + 57 │ │ │ │ │ + 58public: │ │ │ │ │ + 59 │ │ │ │ │ +61 using MultiIndex = │ │ │ │ │ + 62 std::conditional_t<(PreBasis::minMultiIndexSize == PreBasis:: │ │ │ │ │ +maxMultiIndexSize), │ │ │ │ │ + 63 StaticMultiIndex, │ │ │ │ │ + 64 Dune::ReservedVector>; │ │ │ │ │ + 65 │ │ │ │ │ + 66 │ │ │ │ │ +68 DefaultLocalView(const GlobalBasis& globalBasis) : │ │ │ │ │ + 69 globalBasis_(&globalBasis), │ │ │ │ │ + 70 tree_(globalBasis_->preBasis().makeNode()) │ │ │ │ │ + 71 { │ │ │ │ │ + 72 static_assert(models, Tree>(), "Tree type │ │ │ │ │ +passed to DefaultLocalView does not model the BasisNode concept."); │ │ │ │ │ + 73 initializeTree(tree_); │ │ │ │ │ + 74 } │ │ │ │ │ + 75 │ │ │ │ │ +81 void bind(const Element& e) │ │ │ │ │ + 82 { │ │ │ │ │ + 83 element_ = e; │ │ │ │ │ + 84 bindTree(tree_, *element_); │ │ │ │ │ + 85 indices_.resize(size()); │ │ │ │ │ + 86 globalBasis_->preBasis().indices(tree_, indices_.begin()); │ │ │ │ │ + 87 } │ │ │ │ │ + 88 │ │ │ │ │ + 91 [[deprecated("Use the bound() method instead")]] │ │ │ │ │ +92 bool isBound() const { │ │ │ │ │ + 93 return static_cast(element_); │ │ │ │ │ + 94 } │ │ │ │ │ + 95 │ │ │ │ │ +98 bool bound() const │ │ │ │ │ + 99 { │ │ │ │ │ + 100 return static_cast(element_); │ │ │ │ │ 101 } │ │ │ │ │ - 102 } │ │ │ │ │ - 103 │ │ │ │ │ - 104 template │ │ │ │ │ - 105 const auto& find(const Element& element) const │ │ │ │ │ - 106 { │ │ │ │ │ - 107 return variants_[orientation_[elementMapper_.index(element)]]; │ │ │ │ │ - 108 } │ │ │ │ │ - 109 │ │ │ │ │ - 110 private: │ │ │ │ │ - 111 std::vector variants_; │ │ │ │ │ - 112 const Dune::MultipleCodimMultipleGeomTypeMapper elementMapper_; │ │ │ │ │ - 113 std::vector orientation_; │ │ │ │ │ - 114 }; │ │ │ │ │ - 115 │ │ │ │ │ - 116 │ │ │ │ │ - 117} // namespace Impl │ │ │ │ │ - 118 │ │ │ │ │ - 119 │ │ │ │ │ - 120/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 121// This is the reusable part of the basis. It contains │ │ │ │ │ - 122// │ │ │ │ │ - 123// NedelecPreBasis │ │ │ │ │ - 124// NedelecNode │ │ │ │ │ - 125// │ │ │ │ │ - 126// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ -shared │ │ │ │ │ - 127// state. These components do _not_ depend on the global basis and local │ │ │ │ │ -view │ │ │ │ │ - 128// and can be used without a global basis. │ │ │ │ │ - 129/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 130 │ │ │ │ │ - 131template │ │ │ │ │ - 132class NedelecNode; │ │ │ │ │ - 133 │ │ │ │ │ - 134template │ │ │ │ │ -135class NedelecPreBasis │ │ │ │ │ - 136{ │ │ │ │ │ - 137 static const int dim = GV::dimension; │ │ │ │ │ - 138 static_assert(kind==1, "Only the Nedelec basis of the first kind is │ │ │ │ │ -currently implemented!"); │ │ │ │ │ - 139 using FiniteElementMap = typename Impl:: │ │ │ │ │ -Nedelec1stKindLocalFiniteElementMap; │ │ │ │ │ - 140 │ │ │ │ │ - 141 using Mapper = Dune::MultipleCodimMultipleGeomTypeMapper; │ │ │ │ │ - 142public: │ │ │ │ │ - 143 │ │ │ │ │ -145 using GridView = GV; │ │ │ │ │ -146 using size_type = std::size_t; │ │ │ │ │ + 102 │ │ │ │ │ +107 const Element& element() const │ │ │ │ │ + 108 { │ │ │ │ │ + 109 return *element_; │ │ │ │ │ + 110 } │ │ │ │ │ + 111 │ │ │ │ │ +116 void unbind() │ │ │ │ │ + 117 { │ │ │ │ │ + 118 element_.reset(); │ │ │ │ │ + 119 } │ │ │ │ │ + 120 │ │ │ │ │ +125 const Tree& tree() const │ │ │ │ │ + 126 { │ │ │ │ │ + 127 return tree_; │ │ │ │ │ + 128 } │ │ │ │ │ + 129 │ │ │ │ │ +132 size_type size() const │ │ │ │ │ + 133 { │ │ │ │ │ + 134 return tree_.size(); │ │ │ │ │ + 135 } │ │ │ │ │ + 136 │ │ │ │ │ +143 size_type maxSize() const │ │ │ │ │ + 144 { │ │ │ │ │ + 145 return globalBasis_->preBasis().maxNodeSize(); │ │ │ │ │ + 146 } │ │ │ │ │ 147 │ │ │ │ │ -148 using Node = NedelecNode; │ │ │ │ │ - 149 │ │ │ │ │ -150 static constexpr size_type maxMultiIndexSize = 1; │ │ │ │ │ -151 static constexpr size_type minMultiIndexSize = 1; │ │ │ │ │ -152 static constexpr size_type multiIndexBufferSize = 1; │ │ │ │ │ +149 const MultiIndex& index(size_type i) const │ │ │ │ │ + 150 { │ │ │ │ │ + 151 return indices_[i]; │ │ │ │ │ + 152 } │ │ │ │ │ 153 │ │ │ │ │ -155 NedelecPreBasis(const GridView& gv) : │ │ │ │ │ - 156 gridView_(gv), │ │ │ │ │ - 157 finiteElementMap_(gv), │ │ │ │ │ - 158 mapper_(gridView_, mcmgLayout(Dim<1>{})) │ │ │ │ │ - 159 { │ │ │ │ │ - 160 if (kind!=1) │ │ │ │ │ - 161 DUNE_THROW(NotImplemented, "Only Nedelec elements of the first kind are │ │ │ │ │ -implemented!"); │ │ │ │ │ - 162 │ │ │ │ │ - 163 // There is no inherent reason why the basis shouldn't work for grids with │ │ │ │ │ -more than two │ │ │ │ │ - 164 // element types. Somebody simply has to sit down and implement the │ │ │ │ │ -missing bits. │ │ │ │ │ - 165 if (gv.indexSet().types(0).size() > 2) │ │ │ │ │ - 166 DUNE_THROW(NotImplemented, "Nédélec basis is only implemented for grids │ │ │ │ │ -with simplex and cube elements"); │ │ │ │ │ - 167 │ │ │ │ │ - 168 for(auto type : gv.indexSet().types(0)) │ │ │ │ │ - 169 if (!type.isSimplex() && !type.isCube()) │ │ │ │ │ - 170 DUNE_THROW(NotImplemented, "Nédélec basis is only implemented for grids │ │ │ │ │ -with simplex or cube elements."); │ │ │ │ │ - 171 │ │ │ │ │ - 172 if (order>1) │ │ │ │ │ - 173 DUNE_THROW(NotImplemented, "Only first-order elements are implemented"); │ │ │ │ │ +156 const GlobalBasis& globalBasis() const │ │ │ │ │ + 157 { │ │ │ │ │ + 158 return *globalBasis_; │ │ │ │ │ + 159 } │ │ │ │ │ + 160 │ │ │ │ │ +161 const DefaultLocalView& rootLocalView() const │ │ │ │ │ + 162 { │ │ │ │ │ + 163 return *this; │ │ │ │ │ + 164 } │ │ │ │ │ + 165 │ │ │ │ │ + 166protected: │ │ │ │ │ +167 const GlobalBasis* globalBasis_; │ │ │ │ │ +168 std::optional element_; │ │ │ │ │ +169 Tree tree_; │ │ │ │ │ +170 std::vector indices_; │ │ │ │ │ + 171}; │ │ │ │ │ + 172 │ │ │ │ │ + 173 │ │ │ │ │ 174 │ │ │ │ │ - 175 if (dim!=2 && dim!=3) │ │ │ │ │ - 176 DUNE_THROW(NotImplemented, "Only 2d and 3d Nédélec elements are │ │ │ │ │ -implemented"); │ │ │ │ │ - 177 } │ │ │ │ │ + 175} // end namespace Functions │ │ │ │ │ + 176} // end namespace Dune │ │ │ │ │ + 177 │ │ │ │ │ 178 │ │ │ │ │ -179 void initializeIndices() │ │ │ │ │ - 180 {} │ │ │ │ │ - 181 │ │ │ │ │ -184 const GridView& gridView() const │ │ │ │ │ - 185 { │ │ │ │ │ - 186 return gridView_; │ │ │ │ │ - 187 } │ │ │ │ │ - 188 │ │ │ │ │ - 189 /* \brief Update the stored grid view, to be called if the grid has │ │ │ │ │ -changed */ │ │ │ │ │ -190 void update (const GridView& gv) │ │ │ │ │ - 191 { │ │ │ │ │ - 192 gridView_ = gv; │ │ │ │ │ - 193 mapper_.update(gridView_); │ │ │ │ │ - 194 } │ │ │ │ │ - 195 │ │ │ │ │ -199 Node makeNode() const │ │ │ │ │ - 200 { │ │ │ │ │ - 201 return Node{&finiteElementMap_}; │ │ │ │ │ - 202 } │ │ │ │ │ - 203 │ │ │ │ │ -204 size_type size() const │ │ │ │ │ - 205 { │ │ │ │ │ - 206 return mapper_.size(); │ │ │ │ │ - 207 } │ │ │ │ │ - 208 │ │ │ │ │ - 210 template │ │ │ │ │ -211 size_type size(const SizePrefix& prefix) const │ │ │ │ │ - 212 { │ │ │ │ │ - 213 assert(prefix.size() == 0 || prefix.size() == 1); │ │ │ │ │ - 214 return (prefix.size() == 0) ? size() : 0; │ │ │ │ │ - 215 } │ │ │ │ │ - 216 │ │ │ │ │ -217 size_type dimension() const │ │ │ │ │ - 218 { │ │ │ │ │ - 219 return size(); │ │ │ │ │ - 220 } │ │ │ │ │ - 221 │ │ │ │ │ -222 size_type maxNodeSize() const │ │ │ │ │ - 223 { │ │ │ │ │ - 224 size_type result = 0; │ │ │ │ │ - 225 for (auto&& type : gridView_.indexSet().types(0)) │ │ │ │ │ - 226 { │ │ │ │ │ - 227 size_type numEdges = referenceElement(type).size │ │ │ │ │ -(dim-1); │ │ │ │ │ - 228 result = std::max(result, numEdges); │ │ │ │ │ - 229 } │ │ │ │ │ - 230 │ │ │ │ │ - 231 return result; │ │ │ │ │ - 232 } │ │ │ │ │ - 233 │ │ │ │ │ - 237 template │ │ │ │ │ -238 It indices(const Node& node, It it) const │ │ │ │ │ - 239 { │ │ │ │ │ - 240 const auto& element = node.element(); │ │ │ │ │ - 241 │ │ │ │ │ - 242 // throw if Element is not of predefined type │ │ │ │ │ - 243 if (not(element.type().isCube()) and not(element.type().isSimplex())) │ │ │ │ │ - 244 DUNE_THROW(NotImplemented, "NedelecBasis only implemented for cube and │ │ │ │ │ -simplex elements."); │ │ │ │ │ - 245 │ │ │ │ │ - 246 for(std::size_t i=0, end=node.size(); i │ │ │ │ │ -264class NedelecNode : │ │ │ │ │ - 265 public LeafBasisNode │ │ │ │ │ - 266{ │ │ │ │ │ - 267 static const int dim = GV::dimension; │ │ │ │ │ - 268 │ │ │ │ │ - 269public: │ │ │ │ │ - 270 │ │ │ │ │ -271 using size_type = std::size_t; │ │ │ │ │ -272 using Element = typename GV::template Codim<0>::Entity; │ │ │ │ │ - 273 static_assert(kind==1, "Only Nedelec elements of the first kind are │ │ │ │ │ -implemented!"); │ │ │ │ │ -274 using FiniteElementMap = typename Impl:: │ │ │ │ │ -Nedelec1stKindLocalFiniteElementMap; │ │ │ │ │ -275 using FiniteElement = Impl::GlobalValuedLocalFiniteElement; │ │ │ │ │ - 278 │ │ │ │ │ -279 NedelecNode(const FiniteElementMap* finiteElementMap) : │ │ │ │ │ - 280 element_(nullptr), │ │ │ │ │ - 281 finiteElementMap_(finiteElementMap) │ │ │ │ │ - 282 { } │ │ │ │ │ - 283 │ │ │ │ │ -285 const Element& element() const │ │ │ │ │ - 286 { │ │ │ │ │ - 287 return *element_; │ │ │ │ │ - 288 } │ │ │ │ │ - 289 │ │ │ │ │ -294 const FiniteElement& finiteElement() const │ │ │ │ │ - 295 { │ │ │ │ │ - 296 return finiteElement_; │ │ │ │ │ - 297 } │ │ │ │ │ - 298 │ │ │ │ │ -300 void bind(const Element& e) │ │ │ │ │ - 301 { │ │ │ │ │ - 302 element_ = &e; │ │ │ │ │ - 303 finiteElement_.bind((finiteElementMap_->find(*element_)), e); │ │ │ │ │ - 304 this->setSize(finiteElement_.size()); │ │ │ │ │ - 305 } │ │ │ │ │ - 306 │ │ │ │ │ - 307protected: │ │ │ │ │ - 308 │ │ │ │ │ -309 FiniteElement finiteElement_; │ │ │ │ │ -310 const Element* element_; │ │ │ │ │ -311 const FiniteElementMap* finiteElementMap_; │ │ │ │ │ - 312}; │ │ │ │ │ - 313 │ │ │ │ │ - 314 │ │ │ │ │ - 315 │ │ │ │ │ - 316namespace BasisFactory { │ │ │ │ │ - 317 │ │ │ │ │ - 327template │ │ │ │ │ -328auto nedelec() │ │ │ │ │ - 329{ │ │ │ │ │ - 330 return [](const auto& gridView) { │ │ │ │ │ - 331 return NedelecPreBasis, Range, kind, │ │ │ │ │ -order>(gridView); │ │ │ │ │ - 332 }; │ │ │ │ │ - 333} │ │ │ │ │ - 334 │ │ │ │ │ - 335} // end namespace BasisFactory │ │ │ │ │ - 336 │ │ │ │ │ - 337 │ │ │ │ │ - 338 │ │ │ │ │ - 339/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 340// This is the actual global basis implementation based on the reusable │ │ │ │ │ -parts. │ │ │ │ │ - 341/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 342 │ │ │ │ │ - 350template │ │ │ │ │ -351using NedelecBasis = DefaultGlobalBasis >; │ │ │ │ │ - 352 │ │ │ │ │ - 353} // end namespace Dune::Functions │ │ │ │ │ - 354 │ │ │ │ │ - 355 │ │ │ │ │ - 356#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NEDELECBASIS_HH │ │ │ │ │ -nodes.hh │ │ │ │ │ -defaultglobalbasis.hh │ │ │ │ │ -globalvaluedlocalfiniteelement.hh │ │ │ │ │ -Dune::Functions::BasisFactory::power │ │ │ │ │ -auto power(ChildPreBasisFactory &&childPreBasisFactory, const │ │ │ │ │ -IndexMergingStrategy &) │ │ │ │ │ -Create a pre-basis factory that can build a PowerPreBasis. │ │ │ │ │ -Definition: powerbasis.hh:369 │ │ │ │ │ -Dune::Functions::BasisFactory::nedelec │ │ │ │ │ -auto nedelec() │ │ │ │ │ -Create a pre-basis factory that can create a Nédélec pre-basis. │ │ │ │ │ -Definition: nedelecbasis.hh:328 │ │ │ │ │ -Dune::Functions │ │ │ │ │ -Definition: polynomial.hh:11 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis │ │ │ │ │ -Global basis for given pre-basis. │ │ │ │ │ -Definition: defaultglobalbasis.hh:46 │ │ │ │ │ -Dune::Functions::NedelecNode │ │ │ │ │ -Definition: nedelecbasis.hh:266 │ │ │ │ │ -Dune::Functions::NedelecNode::finiteElementMap_ │ │ │ │ │ -const FiniteElementMap * finiteElementMap_ │ │ │ │ │ -Definition: nedelecbasis.hh:311 │ │ │ │ │ -Dune::Functions::NedelecNode::finiteElement_ │ │ │ │ │ -FiniteElement finiteElement_ │ │ │ │ │ -Definition: nedelecbasis.hh:309 │ │ │ │ │ -Dune::Functions::NedelecNode::FiniteElement │ │ │ │ │ -Impl::GlobalValuedLocalFiniteElement< Impl::CovariantPiolaTransformator, │ │ │ │ │ -typename FiniteElementMap::FiniteElement, Element > FiniteElement │ │ │ │ │ -Definition: nedelecbasis.hh:277 │ │ │ │ │ -Dune::Functions::NedelecNode::bind │ │ │ │ │ -void bind(const Element &e) │ │ │ │ │ -Bind to element. │ │ │ │ │ -Definition: nedelecbasis.hh:300 │ │ │ │ │ -Dune::Functions::NedelecNode::element │ │ │ │ │ -const Element & element() const │ │ │ │ │ -Return current element, throw if unbound. │ │ │ │ │ -Definition: nedelecbasis.hh:285 │ │ │ │ │ -Dune::Functions::NedelecNode::Element │ │ │ │ │ -typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ -Definition: nedelecbasis.hh:272 │ │ │ │ │ -Dune::Functions::NedelecNode::finiteElement │ │ │ │ │ -const FiniteElement & finiteElement() const │ │ │ │ │ -Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ -Definition: nedelecbasis.hh:294 │ │ │ │ │ -Dune::Functions::NedelecNode::NedelecNode │ │ │ │ │ -NedelecNode(const FiniteElementMap *finiteElementMap) │ │ │ │ │ -Definition: nedelecbasis.hh:279 │ │ │ │ │ -Dune::Functions::NedelecNode::FiniteElementMap │ │ │ │ │ -typename Impl::Nedelec1stKindLocalFiniteElementMap< GV, dim, Range, order > │ │ │ │ │ -FiniteElementMap │ │ │ │ │ -Definition: nedelecbasis.hh:274 │ │ │ │ │ -Dune::Functions::NedelecNode::element_ │ │ │ │ │ -const Element * element_ │ │ │ │ │ -Definition: nedelecbasis.hh:310 │ │ │ │ │ -Dune::Functions::NedelecNode::size_type │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Definition: nedelecbasis.hh:271 │ │ │ │ │ -Dune::Functions::NedelecPreBasis │ │ │ │ │ -Definition: nedelecbasis.hh:136 │ │ │ │ │ -Dune::Functions::NedelecPreBasis::indices │ │ │ │ │ -It indices(const Node &node, It it) const │ │ │ │ │ + 179 │ │ │ │ │ + 180#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALVIEW_HH │ │ │ │ │ +multiindex.hh │ │ │ │ │ +overflowarray.hh │ │ │ │ │ +Dune │ │ │ │ │ +Definition: polynomial.hh:10 │ │ │ │ │ +Dune::Functions::bindTree │ │ │ │ │ +void bindTree(Tree &tree, const Entity &entity, std::size_t offset=0) │ │ │ │ │ +Definition: nodes.hh:253 │ │ │ │ │ +Dune::Functions::initializeTree │ │ │ │ │ +void initializeTree(Tree &tree, std::size_t treeIndexOffset=0) │ │ │ │ │ +Definition: nodes.hh:260 │ │ │ │ │ +Dune::Functions::StaticMultiIndex │ │ │ │ │ +A statically sized MultiIndex type. │ │ │ │ │ +Definition: multiindex.hh:25 │ │ │ │ │ +Dune::Functions::OverflowArray │ │ │ │ │ +A dynamically sized array-like class with overflow. │ │ │ │ │ +Definition: overflowarray.hh:45 │ │ │ │ │ +Dune::Functions::DefaultLocalView │ │ │ │ │ +The restriction of a finite element basis to a single element. │ │ │ │ │ +Definition: defaultlocalview.hh:28 │ │ │ │ │ +Dune::Functions::DefaultLocalView::PreBasis │ │ │ │ │ +typename GlobalBasis::PreBasis PreBasis │ │ │ │ │ +Definition: defaultlocalview.hh:48 │ │ │ │ │ +Dune::Functions::DefaultLocalView::unbind │ │ │ │ │ +void unbind() │ │ │ │ │ +Unbind from the current element. │ │ │ │ │ +Definition: defaultlocalview.hh:116 │ │ │ │ │ +Dune::Functions::DefaultLocalView::bound │ │ │ │ │ +bool bound() const │ │ │ │ │ +Return if the view is bound to a grid element. │ │ │ │ │ +Definition: defaultlocalview.hh:98 │ │ │ │ │ +Dune::Functions::DefaultLocalView::GridView │ │ │ │ │ +typename GlobalBasis::GridView GridView │ │ │ │ │ +The grid view the global FE basis lives on. │ │ │ │ │ +Definition: defaultlocalview.hh:35 │ │ │ │ │ +Dune::Functions::DefaultLocalView::index │ │ │ │ │ +const MultiIndex & index(size_type i) const │ │ │ │ │ Maps from subtree index set [0..size-1] to a globally unique multi index in │ │ │ │ │ global basis. │ │ │ │ │ -Definition: nedelecbasis.hh:238 │ │ │ │ │ -Dune::Functions::NedelecPreBasis::size │ │ │ │ │ -size_type size(const SizePrefix &prefix) const │ │ │ │ │ -Return number possible values for next position in multi index. │ │ │ │ │ -Definition: nedelecbasis.hh:211 │ │ │ │ │ -Dune::Functions::NedelecPreBasis::size_type │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Definition: nedelecbasis.hh:146 │ │ │ │ │ -Dune::Functions::NedelecPreBasis::NedelecPreBasis │ │ │ │ │ -NedelecPreBasis(const GridView &gv) │ │ │ │ │ -Constructor for a given grid view object. │ │ │ │ │ -Definition: nedelecbasis.hh:155 │ │ │ │ │ -Dune::Functions::NedelecPreBasis::GridView │ │ │ │ │ -GV GridView │ │ │ │ │ -The grid view that the FE space is defined on. │ │ │ │ │ -Definition: nedelecbasis.hh:145 │ │ │ │ │ -Dune::Functions::NedelecPreBasis::dimension │ │ │ │ │ -size_type dimension() const │ │ │ │ │ -Definition: nedelecbasis.hh:217 │ │ │ │ │ -Dune::Functions::NedelecPreBasis::maxMultiIndexSize │ │ │ │ │ -static constexpr size_type maxMultiIndexSize │ │ │ │ │ -Definition: nedelecbasis.hh:150 │ │ │ │ │ -Dune::Functions::NedelecPreBasis::multiIndexBufferSize │ │ │ │ │ -static constexpr size_type multiIndexBufferSize │ │ │ │ │ -Definition: nedelecbasis.hh:152 │ │ │ │ │ -Dune::Functions::NedelecPreBasis::gridView_ │ │ │ │ │ -GridView gridView_ │ │ │ │ │ -Definition: nedelecbasis.hh:256 │ │ │ │ │ -Dune::Functions::NedelecPreBasis::finiteElementMap_ │ │ │ │ │ -FiniteElementMap finiteElementMap_ │ │ │ │ │ -Definition: nedelecbasis.hh:257 │ │ │ │ │ -Dune::Functions::NedelecPreBasis::minMultiIndexSize │ │ │ │ │ -static constexpr size_type minMultiIndexSize │ │ │ │ │ -Definition: nedelecbasis.hh:151 │ │ │ │ │ -Dune::Functions::NedelecPreBasis::initializeIndices │ │ │ │ │ -void initializeIndices() │ │ │ │ │ -Definition: nedelecbasis.hh:179 │ │ │ │ │ -Dune::Functions::NedelecPreBasis::update │ │ │ │ │ -void update(const GridView &gv) │ │ │ │ │ -Definition: nedelecbasis.hh:190 │ │ │ │ │ -Dune::Functions::NedelecPreBasis::maxNodeSize │ │ │ │ │ -size_type maxNodeSize() const │ │ │ │ │ -Definition: nedelecbasis.hh:222 │ │ │ │ │ -Dune::Functions::NedelecPreBasis::gridView │ │ │ │ │ -const GridView & gridView() const │ │ │ │ │ -Obtain the grid view that the basis is defined on. │ │ │ │ │ -Definition: nedelecbasis.hh:184 │ │ │ │ │ -Dune::Functions::NedelecPreBasis::makeNode │ │ │ │ │ -Node makeNode() const │ │ │ │ │ -Create tree node. │ │ │ │ │ -Definition: nedelecbasis.hh:199 │ │ │ │ │ -Dune::Functions::NedelecPreBasis::size │ │ │ │ │ -size_type size() const │ │ │ │ │ -Definition: nedelecbasis.hh:204 │ │ │ │ │ -Dune::Functions::NedelecPreBasis::mapper_ │ │ │ │ │ -Mapper mapper_ │ │ │ │ │ -Definition: nedelecbasis.hh:258 │ │ │ │ │ -Dune::Functions::BasisNodeMixin::size │ │ │ │ │ +Definition: defaultlocalview.hh:149 │ │ │ │ │ +Dune::Functions::DefaultLocalView::element_ │ │ │ │ │ +std::optional< Element > element_ │ │ │ │ │ +Definition: defaultlocalview.hh:168 │ │ │ │ │ +Dune::Functions::DefaultLocalView::Element │ │ │ │ │ +typename GridView::template Codim< 0 >::Entity Element │ │ │ │ │ +Type of the grid element we are bound to. │ │ │ │ │ +Definition: defaultlocalview.hh:38 │ │ │ │ │ +Dune::Functions::DefaultLocalView::tree │ │ │ │ │ +const Tree & tree() const │ │ │ │ │ +Return the local ansatz tree associated to the bound entity. │ │ │ │ │ +Definition: defaultlocalview.hh:125 │ │ │ │ │ +Dune::Functions::DefaultLocalView::bind │ │ │ │ │ +void bind(const Element &e) │ │ │ │ │ +Bind the view to a grid element. │ │ │ │ │ +Definition: defaultlocalview.hh:81 │ │ │ │ │ +Dune::Functions::DefaultLocalView::element │ │ │ │ │ +const Element & element() const │ │ │ │ │ +Return the grid element that the view is bound to. │ │ │ │ │ +Definition: defaultlocalview.hh:107 │ │ │ │ │ +Dune::Functions::DefaultLocalView::size │ │ │ │ │ size_type size() const │ │ │ │ │ -Definition: nodes.hh:142 │ │ │ │ │ -Dune::Functions::BasisNodeMixin::setSize │ │ │ │ │ -void setSize(const size_type size) │ │ │ │ │ -Definition: nodes.hh:164 │ │ │ │ │ -Dune::Functions::LeafBasisNode │ │ │ │ │ -Definition: nodes.hh:186 │ │ │ │ │ +Total number of degrees of freedom on this element. │ │ │ │ │ +Definition: defaultlocalview.hh:132 │ │ │ │ │ +Dune::Functions::DefaultLocalView::GlobalBasis │ │ │ │ │ +GB GlobalBasis │ │ │ │ │ +The global FE basis that this is a view on. │ │ │ │ │ +Definition: defaultlocalview.hh:32 │ │ │ │ │ +Dune::Functions::DefaultLocalView::tree_ │ │ │ │ │ +Tree tree_ │ │ │ │ │ +Definition: defaultlocalview.hh:169 │ │ │ │ │ +Dune::Functions::DefaultLocalView::maxSize │ │ │ │ │ +size_type maxSize() const │ │ │ │ │ +Maximum local size for any element on the GridView. │ │ │ │ │ +Definition: defaultlocalview.hh:143 │ │ │ │ │ +Dune::Functions::DefaultLocalView::size_type │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +The type used for sizes. │ │ │ │ │ +Definition: defaultlocalview.hh:41 │ │ │ │ │ +Dune::Functions::DefaultLocalView::isBound │ │ │ │ │ +bool isBound() const │ │ │ │ │ +Return if the view is bound to a grid element. │ │ │ │ │ +Definition: defaultlocalview.hh:92 │ │ │ │ │ +Dune::Functions::DefaultLocalView::rootLocalView │ │ │ │ │ +const DefaultLocalView & rootLocalView() const │ │ │ │ │ +Definition: defaultlocalview.hh:161 │ │ │ │ │ +Dune::Functions::DefaultLocalView::MultiIndexStorage │ │ │ │ │ +std::conditional_t<(PreBasis::minMultiIndexSize==PreBasis::maxMultiIndexSize), │ │ │ │ │ +OverflowArray< StaticMultiIndex< size_type, PreBasis::maxMultiIndexSize >, │ │ │ │ │ +PreBasis::multiIndexBufferSize >, Dune::ReservedVector< size_type, PreBasis:: │ │ │ │ │ +multiIndexBufferSize > > MultiIndexStorage │ │ │ │ │ +Definition: defaultlocalview.hh:56 │ │ │ │ │ +Dune::Functions::DefaultLocalView::MultiIndex │ │ │ │ │ +std::conditional_t<(PreBasis::minMultiIndexSize==PreBasis::maxMultiIndexSize), │ │ │ │ │ +StaticMultiIndex< size_type, PreBasis::maxMultiIndexSize >, Dune:: │ │ │ │ │ +ReservedVector< size_type, PreBasis::multiIndexBufferSize > > MultiIndex │ │ │ │ │ +Type used for global numbering of the basis vectors. │ │ │ │ │ +Definition: defaultlocalview.hh:64 │ │ │ │ │ +Dune::Functions::DefaultLocalView::indices_ │ │ │ │ │ +std::vector< MultiIndexStorage > indices_ │ │ │ │ │ +Definition: defaultlocalview.hh:170 │ │ │ │ │ +Dune::Functions::DefaultLocalView::Tree │ │ │ │ │ +typename GlobalBasis::PreBasis::Node Tree │ │ │ │ │ +Tree of local finite elements / local shape function sets. │ │ │ │ │ +Definition: defaultlocalview.hh:44 │ │ │ │ │ +Dune::Functions::DefaultLocalView::DefaultLocalView │ │ │ │ │ +DefaultLocalView(const GlobalBasis &globalBasis) │ │ │ │ │ +Construct local view for a given global finite element basis. │ │ │ │ │ +Definition: defaultlocalview.hh:68 │ │ │ │ │ +Dune::Functions::DefaultLocalView::globalBasis_ │ │ │ │ │ +const GlobalBasis * globalBasis_ │ │ │ │ │ +Definition: defaultlocalview.hh:167 │ │ │ │ │ +Dune::Functions::DefaultLocalView::globalBasis │ │ │ │ │ +const GlobalBasis & globalBasis() const │ │ │ │ │ +Return the global basis that we are a view on. │ │ │ │ │ +Definition: defaultlocalview.hh:156 │ │ │ │ │ +concepts.hh │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00146.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: brezzidouglasmarinibasis.hh File Reference │ │ │ │ +dune-functions: lagrangedgbasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -67,62 +67,56 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Typedefs | │ │ │ │ Functions
│ │ │ │ -
brezzidouglasmarinibasis.hh File Reference
│ │ │ │ +
lagrangedgbasis.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │
#include <array>
│ │ │ │ #include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/geometry/referenceelements.hh>
│ │ │ │ -#include <dune/localfunctions/common/virtualinterface.hh>
│ │ │ │ -#include <dune/localfunctions/common/virtualwrappers.hh>
│ │ │ │ -#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini1cube2d.hh>
│ │ │ │ -#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini1cube3d.hh>
│ │ │ │ -#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini1simplex2d.hh>
│ │ │ │ -#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini2cube2d.hh>
│ │ │ │ -#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini2simplex2d.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/globalvaluedlocalfiniteelement.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │ +#include <dune/common/math.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/lagrangebasis.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::BrezziDouglasMariniPreBasis< GV, k >
 
class  Dune::Functions::BrezziDouglasMariniNode< GV, k >
class  Dune::Functions::LagrangeDGPreBasis< GV, k >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
namespace  Dune::Functions::BasisFactory
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Typedefs

template<typename GV , int k>
using Dune::Functions::BrezziDouglasMariniBasis = DefaultGlobalBasis< BrezziDouglasMariniPreBasis< GV, k > >
 Basis of a scalar k-th-order BDM finite element space on simplex and cube grids. More...
 
template<typename GV , int k>
using Dune::Functions::LagrangeDGNode = LagrangeNode< GV, k >
 
template<typename GV , int k>
using Dune::Functions::LagrangeDGBasis = DefaultGlobalBasis< LagrangeDGPreBasis< GV, k > >
 Basis of a scalar k-th-order Lagrangean-DG finite element space. More...
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<std::size_t k>
auto Dune::Functions::BasisFactory::brezziDouglasMarini ()
 Create a pre-basis factory that can create a Brezzi-Douglas-Marini pre-basis. More...
 
template<std::size_t k>
auto Dune::Functions::BasisFactory::lagrangeDG ()
 Create a pre-basis factory that can create a LagrangeDG pre-basis. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -6,55 +6,43 @@ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ Classes | Namespaces | Typedefs | Functions │ │ │ │ │ -brezzidouglasmarinibasis.hh File Reference │ │ │ │ │ +lagrangedgbasis.hh File Reference │ │ │ │ │ #include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ #include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::BrezziDouglasMariniPreBasis<_GV,_k_> │ │ │ │ │ -  │ │ │ │ │ -class  Dune::Functions::BrezziDouglasMariniNode<_GV,_k_> │ │ │ │ │ +class  Dune::Functions::LagrangeDGPreBasis<_GV,_k_> │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions::BasisFactory │ │ │ │ │   │ │ │ │ │ Typedefs │ │ │ │ │ template │ │ │ │ │ -using Dune::Functions::BrezziDouglasMariniBasis = DefaultGlobalBasis< │ │ │ │ │ - BrezziDouglasMariniPreBasis< GV, k > > │ │ │ │ │ -  Basis of a scalar k-th-order BDM finite element space on simplex and │ │ │ │ │ - cube grids. More... │ │ │ │ │ +using Dune::Functions::LagrangeDGNode = LagrangeNode< GV, k > │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +using Dune::Functions::LagrangeDGBasis = DefaultGlobalBasis< │ │ │ │ │ + LagrangeDGPreBasis< GV, k > > │ │ │ │ │ +  Basis of a scalar k-th-order Lagrangean-DG finite element space. More... │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ template │ │ │ │ │ -auto Dune::Functions::BasisFactory::brezziDouglasMarini () │ │ │ │ │ -  Create a pre-basis factory that can create a Brezzi-Douglas-Marini pre- │ │ │ │ │ - basis. More... │ │ │ │ │ +auto Dune::Functions::BasisFactory::lagrangeDG () │ │ │ │ │ +  Create a pre-basis factory that can create a LagrangeDG pre-basis. │ │ │ │ │ + More... │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00146_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: brezzidouglasmarinibasis.hh Source File │ │ │ │ +dune-functions: lagrangedgbasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,389 +62,283 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
brezzidouglasmarinibasis.hh
│ │ │ │ +
lagrangedgbasis.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BREZZIDOUGLASMARINIBASIS_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BREZZIDOUGLASMARINIBASIS_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH
│ │ │ │
5
│ │ │ │
6#include <array>
│ │ │ │
7#include <dune/common/exceptions.hh>
│ │ │ │ -
8#include <dune/geometry/referenceelements.hh>
│ │ │ │ +
8#include <dune/common/math.hh>
│ │ │ │
9
│ │ │ │ -
10#include <dune/localfunctions/common/virtualinterface.hh>
│ │ │ │ -
11#include <dune/localfunctions/common/virtualwrappers.hh>
│ │ │ │ -
12
│ │ │ │ -
13#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini1cube2d.hh>
│ │ │ │ -
14#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini1cube3d.hh>
│ │ │ │ -
15#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini1simplex2d.hh>
│ │ │ │ -
16#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini2cube2d.hh>
│ │ │ │ -
17#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini2simplex2d.hh>
│ │ │ │ -
18
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
22
│ │ │ │ -
23namespace Dune {
│ │ │ │ -
24namespace Functions {
│ │ │ │ -
25
│ │ │ │ -
26namespace Impl {
│ │ │ │ -
27
│ │ │ │ -
28 template<int dim, typename D, typename R, std::size_t k>
│ │ │ │ -
29 struct BDMSimplexLocalInfo
│ │ │ │ -
30 {
│ │ │ │ -
31 static_assert((AlwaysFalse<D>::value),"The requested type of BDM element is not implemented, sorry!");
│ │ │ │ -
32 };
│ │ │ │ -
33
│ │ │ │ -
34 template<typename D, typename R>
│ │ │ │ -
35 struct BDMSimplexLocalInfo<2,D,R,1>
│ │ │ │ -
36 {
│ │ │ │ -
37 using FiniteElement = BDM1Simplex2DLocalFiniteElement<D,R>;
│ │ │ │ -
38 static const std::size_t Variants = 8;
│ │ │ │ -
39 };
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
13
│ │ │ │ +
14
│ │ │ │ +
15
│ │ │ │ +
16
│ │ │ │ +
17namespace Dune {
│ │ │ │ +
18namespace Functions {
│ │ │ │ +
19
│ │ │ │ +
20
│ │ │ │ +
21
│ │ │ │ +
22// *****************************************************************************
│ │ │ │ +
23// This is the reusable part of the basis. It contains
│ │ │ │ +
24//
│ │ │ │ +
25// LagrangeDGPreBasis
│ │ │ │ +
26// LagrangeDGNode
│ │ │ │ +
27//
│ │ │ │ +
28// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ +
29// state. These components do _not_ depend on the global basis and local view
│ │ │ │ +
30// and can be used without a global basis.
│ │ │ │ +
31// *****************************************************************************
│ │ │ │ +
32
│ │ │ │ +
33template<typename GV, int k>
│ │ │ │ + │ │ │ │ +
35
│ │ │ │ +
36template<typename GV, int k>
│ │ │ │ + │ │ │ │ +
38{
│ │ │ │ +
39 static const int dim = GV::dimension;
│ │ │ │
40
│ │ │ │ -
41 template<typename D, typename R>
│ │ │ │ -
42 struct BDMSimplexLocalInfo<2,D,R,2>
│ │ │ │ -
43 {
│ │ │ │ -
44 using FiniteElement = BDM2Simplex2DLocalFiniteElement<D,R>;
│ │ │ │ -
45 static const std::size_t Variants = 8;
│ │ │ │ -
46 };
│ │ │ │ +
41public:
│ │ │ │ +
42
│ │ │ │ +
44 using GridView = GV;
│ │ │ │ +
45 using size_type = std::size_t;
│ │ │ │ +
46
│ │ │ │
47
│ │ │ │ -
48 template<int dim, typename D, typename R, std::size_t k>
│ │ │ │ -
49 struct BDMCubeLocalInfo
│ │ │ │ -
50 {
│ │ │ │ -
51 static_assert((AlwaysFalse<D>::value),"The requested type of BDM element is not implemented, sorry!");
│ │ │ │ -
52 };
│ │ │ │ -
53
│ │ │ │ -
54 template<typename D, typename R>
│ │ │ │ -
55 struct BDMCubeLocalInfo<2,D,R,1>
│ │ │ │ -
56 {
│ │ │ │ -
57 using FiniteElement = BDM1Cube2DLocalFiniteElement<D,R>;
│ │ │ │ -
58 static const std::size_t Variants = 16;
│ │ │ │ -
59 };
│ │ │ │ -
60
│ │ │ │ -
61 template<typename D, typename R>
│ │ │ │ -
62 struct BDMCubeLocalInfo<2,D,R,2>
│ │ │ │ -
63 {
│ │ │ │ -
64 using FiniteElement = BDM2Cube2DLocalFiniteElement<D,R>;
│ │ │ │ -
65 static const std::size_t Variants = 16;
│ │ │ │ -
66 };
│ │ │ │ -
67
│ │ │ │ -
68 template<typename D, typename R>
│ │ │ │ -
69 struct BDMCubeLocalInfo<3,D,R,1>
│ │ │ │ -
70 {
│ │ │ │ -
71 using FiniteElement = BDM1Cube3DLocalFiniteElement<D,R>;
│ │ │ │ -
72 static const std::size_t Variants = 64;
│ │ │ │ -
73 };
│ │ │ │ -
74
│ │ │ │ -
75 template<typename GV, int dim, typename R, std::size_t k>
│ │ │ │ -
76 class BDMLocalFiniteElementMap
│ │ │ │ -
77 {
│ │ │ │ -
78 using D = typename GV::ctype;
│ │ │ │ -
79 using CubeFiniteElement = typename BDMCubeLocalInfo<dim, D, R, k>::FiniteElement;
│ │ │ │ -
80 using SimplexFiniteElement = typename BDMSimplexLocalInfo<dim, D, R, k>::FiniteElement;
│ │ │ │ -
81
│ │ │ │ -
82 public:
│ │ │ │ -
83
│ │ │ │ -
84 using T = LocalBasisTraits<D, dim, FieldVector<D,dim>, R, dim, FieldVector<R,dim>, FieldMatrix<D,dim,dim> >;
│ │ │ │ -
85 using FiniteElement = LocalFiniteElementVirtualInterface<T>;
│ │ │ │ +
48 // Precompute the number of dofs per entity type
│ │ │ │ +
49 const static int dofsPerEdge = k+1;
│ │ │ │ +
50 const static int dofsPerTriangle = (k+1)*(k+2)/2;
│ │ │ │ +
51 const static int dofsPerQuad = (k+1)*(k+1);
│ │ │ │ +
52 const static int dofsPerTetrahedron = (k+1)*(k+2)*(k+3)/6;
│ │ │ │ +
53 const static int dofsPerPrism = (k+1)*(k+1)*(k+2)/2;
│ │ │ │ +
54 const static int dofsPerHexahedron = (k+1)*(k+1)*(k+1);
│ │ │ │ +
55 const static int dofsPerPyramid = (k+1)*(k+2)*(2*k+3)/6;
│ │ │ │ +
56
│ │ │ │ +
57
│ │ │ │ + │ │ │ │ +
59
│ │ │ │ +
60 static constexpr size_type maxMultiIndexSize = 1;
│ │ │ │ +
61 static constexpr size_type minMultiIndexSize = 1;
│ │ │ │ +
62 static constexpr size_type multiIndexBufferSize = 1;
│ │ │ │ +
63
│ │ │ │ + │ │ │ │ +
66 gridView_(gv)
│ │ │ │ +
67 {}
│ │ │ │ +
68
│ │ │ │ +
69
│ │ │ │ + │ │ │ │ +
71 {
│ │ │ │ +
72 switch (dim)
│ │ │ │ +
73 {
│ │ │ │ +
74 case 1:
│ │ │ │ +
75 {
│ │ │ │ +
76 break;
│ │ │ │ +
77 }
│ │ │ │ +
78 case 2:
│ │ │ │ +
79 {
│ │ │ │ +
80 quadrilateralOffset_ = dofsPerTriangle * gridView_.size(Dune::GeometryTypes::triangle);
│ │ │ │ +
81 break;
│ │ │ │ +
82 }
│ │ │ │ +
83 case 3:
│ │ │ │ +
84 {
│ │ │ │ +
85 prismOffset_ = dofsPerTetrahedron * gridView_.size(Dune::GeometryTypes::tetrahedron);
│ │ │ │
86
│ │ │ │ -
87 BDMLocalFiniteElementMap(const GV& gv)
│ │ │ │ -
88 : is_(&(gv.indexSet())), orient_(gv.size(0))
│ │ │ │ -
89 {
│ │ │ │ -
90 cubeVariant_.resize(BDMCubeLocalInfo<dim, D, R, k>::Variants);
│ │ │ │ -
91 simplexVariant_.resize(BDMSimplexLocalInfo<dim, D, R, k>::Variants);
│ │ │ │ -
92
│ │ │ │ -
93 // create all variants
│ │ │ │ -
94 for (size_t i = 0; i < cubeVariant_.size(); i++)
│ │ │ │ -
95 cubeVariant_[i] = std::make_unique<LocalFiniteElementVirtualImp<CubeFiniteElement> >(CubeFiniteElement(i));
│ │ │ │ -
96
│ │ │ │ -
97 for (size_t i = 0; i < simplexVariant_.size(); i++)
│ │ │ │ -
98 simplexVariant_[i] = std::make_unique<LocalFiniteElementVirtualImp<SimplexFiniteElement> >(SimplexFiniteElement(i));
│ │ │ │ -
99
│ │ │ │ -
100 // compute orientation for all elements
│ │ │ │ -
101 // loop once over the grid
│ │ │ │ -
102 for(const auto& cell : elements(gv))
│ │ │ │ -
103 {
│ │ │ │ -
104 unsigned int myId = is_->index(cell);
│ │ │ │ -
105 orient_[myId] = 0;
│ │ │ │ +
87 hexahedronOffset_ = prismOffset_ + dofsPerPrism * gridView_.size(Dune::GeometryTypes::prism);
│ │ │ │ +
88
│ │ │ │ +
89 pyramidOffset_ = hexahedronOffset_ + dofsPerHexahedron * gridView_.size(Dune::GeometryTypes::hexahedron);
│ │ │ │ +
90 break;
│ │ │ │ +
91 }
│ │ │ │ +
92 }
│ │ │ │ +
93 }
│ │ │ │ +
94
│ │ │ │ +
97 const GridView& gridView() const
│ │ │ │ +
98 {
│ │ │ │ +
99 return gridView_;
│ │ │ │ +
100 }
│ │ │ │ +
101
│ │ │ │ +
102 void update(const GridView& gv)
│ │ │ │ +
103 {
│ │ │ │ +
104 gridView_ = gv;
│ │ │ │ +
105 }
│ │ │ │
106
│ │ │ │ -
107 for (const auto& intersection : intersections(gv,cell))
│ │ │ │ -
108 {
│ │ │ │ -
109 if (intersection.neighbor() && (is_->index(intersection.outside()) > myId))
│ │ │ │ -
110 orient_[myId] |= (1 << intersection.indexInInside());
│ │ │ │ -
111 }
│ │ │ │ -
112 }
│ │ │ │ -
113 }
│ │ │ │ + │ │ │ │ +
111 {
│ │ │ │ +
112 return Node{};
│ │ │ │ +
113 }
│ │ │ │
114
│ │ │ │ -
116 template<class EntityType>
│ │ │ │ -
117 const FiniteElement& find(const EntityType& e) const
│ │ │ │ -
118 {
│ │ │ │ -
119 if (e.type().isCube())
│ │ │ │ -
120 return *cubeVariant_[orient_[is_->index(e)]];
│ │ │ │ -
121 else
│ │ │ │ -
122 return *simplexVariant_[orient_[is_->index(e)]];
│ │ │ │ -
123 }
│ │ │ │ -
124
│ │ │ │ -
125 private:
│ │ │ │ -
126 std::vector<std::unique_ptr<LocalFiniteElementVirtualImp<CubeFiniteElement> > > cubeVariant_;
│ │ │ │ -
127 std::vector<std::unique_ptr<LocalFiniteElementVirtualImp<SimplexFiniteElement> > > simplexVariant_;
│ │ │ │ -
128 const typename GV::IndexSet* is_;
│ │ │ │ -
129 std::vector<unsigned char> orient_;
│ │ │ │ -
130 };
│ │ │ │ -
131
│ │ │ │ -
132
│ │ │ │ -
133} // namespace Impl
│ │ │ │ -
134
│ │ │ │ + │ │ │ │ +
116 {
│ │ │ │ +
117 switch (dim)
│ │ │ │ +
118 {
│ │ │ │ +
119 case 1:
│ │ │ │ +
120 return dofsPerEdge*gridView_.size(0);
│ │ │ │ +
121 case 2:
│ │ │ │ +
122 {
│ │ │ │ +
123 return dofsPerTriangle*gridView_.size(Dune::GeometryTypes::triangle) + dofsPerQuad*gridView_.size(Dune::GeometryTypes::quadrilateral);
│ │ │ │ +
124 }
│ │ │ │ +
125 case 3:
│ │ │ │ +
126 {
│ │ │ │ +
127 return dofsPerTetrahedron*gridView_.size(Dune::GeometryTypes::tetrahedron)
│ │ │ │ +
128 + dofsPerPyramid*gridView_.size(Dune::GeometryTypes::pyramid)
│ │ │ │ +
129 + dofsPerPrism*gridView_.size(Dune::GeometryTypes::prism)
│ │ │ │ +
130 + dofsPerHexahedron*gridView_.size(Dune::GeometryTypes::hexahedron);
│ │ │ │ +
131 }
│ │ │ │ +
132 }
│ │ │ │ +
133 DUNE_THROW(Dune::NotImplemented, "No size method for " << dim << "d grids available yet!");
│ │ │ │ +
134 }
│ │ │ │
135
│ │ │ │ -
136// *****************************************************************************
│ │ │ │ -
137// This is the reusable part of the basis. It contains
│ │ │ │ -
138//
│ │ │ │ -
139// BrezziDouglasMariniPreBasis
│ │ │ │ -
140// BrezziDouglasMariniNode
│ │ │ │ -
141//
│ │ │ │ -
142// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ -
143// state. These components do _not_ depend on the global basis and local view
│ │ │ │ -
144// and can be used without a global basis.
│ │ │ │ -
145// *****************************************************************************
│ │ │ │ -
146
│ │ │ │ -
147template<typename GV, int k>
│ │ │ │ -
148class BrezziDouglasMariniNode;
│ │ │ │ +
137 template<class SizePrefix>
│ │ │ │ +
138 size_type size(const SizePrefix& prefix) const
│ │ │ │ +
139 {
│ │ │ │ +
140 assert(prefix.size() == 0 || prefix.size() == 1);
│ │ │ │ +
141 return (prefix.size() == 0) ? size() : 0;
│ │ │ │ +
142 }
│ │ │ │ +
143
│ │ │ │ + │ │ │ │ +
146 {
│ │ │ │ +
147 return size();
│ │ │ │ +
148 }
│ │ │ │
149
│ │ │ │ -
150template<typename GV, int k>
│ │ │ │ - │ │ │ │ -
152{
│ │ │ │ -
153 static const int dim = GV::dimension;
│ │ │ │ -
154 using FiniteElementMap = typename Impl::BDMLocalFiniteElementMap<GV, dim, double, k>;
│ │ │ │ -
155
│ │ │ │ -
156public:
│ │ │ │ -
157
│ │ │ │ -
159 using GridView = GV;
│ │ │ │ -
160 using size_type = std::size_t;
│ │ │ │ -
161
│ │ │ │ - │ │ │ │ -
163
│ │ │ │ -
164 static constexpr size_type maxMultiIndexSize = 1;
│ │ │ │ -
165 static constexpr size_type minMultiIndexSize = 1;
│ │ │ │ -
166 static constexpr size_type multiIndexBufferSize = 1;
│ │ │ │ -
167
│ │ │ │ - │ │ │ │ -
170 gridView_(gv),
│ │ │ │ - │ │ │ │ -
172 {
│ │ │ │ -
173 // There is no inherent reason why the basis shouldn't work for grids with more than one
│ │ │ │ -
174 // element types. Somebody simply has to sit down and implement the missing bits.
│ │ │ │ -
175 if (gv.indexSet().types(0).size() > 1)
│ │ │ │ -
176 DUNE_THROW(Dune::NotImplemented, "Brezzi-Douglas-Marini basis is only implemented for grids with a single element type");
│ │ │ │ -
177 }
│ │ │ │ -
178
│ │ │ │ - │ │ │ │ -
180 {
│ │ │ │ -
181 codimOffset_[0] = 0;
│ │ │ │ -
182 codimOffset_[1] = codimOffset_[0] + dofsPerCodim_[0] * gridView_.size(0);
│ │ │ │ -
183 //if (dim==3) codimOffset_[2] = codimOffset_[1] + dofsPerCodim[1] * gridView_.size(1);
│ │ │ │ -
184 }
│ │ │ │ -
185
│ │ │ │ -
188 const GridView& gridView() const
│ │ │ │ -
189 {
│ │ │ │ -
190 return gridView_;
│ │ │ │ + │ │ │ │ +
151 {
│ │ │ │ +
152 return Dune::power(k+1, int(GV::dimension));
│ │ │ │ +
153 }
│ │ │ │ +
154
│ │ │ │ +
155 template<typename It>
│ │ │ │ +
156 It indices(const Node& node, It it) const
│ │ │ │ +
157 {
│ │ │ │ +
158 const auto& gridIndexSet = gridView().indexSet();
│ │ │ │ +
159 const auto& element = node.element();
│ │ │ │ +
160
│ │ │ │ +
161 size_type offset = 0;
│ │ │ │ +
162 if constexpr (dim==1)
│ │ │ │ +
163 offset = dofsPerEdge*gridIndexSet.subIndex(element,0,0);
│ │ │ │ +
164 else if constexpr (dim==2)
│ │ │ │ +
165 {
│ │ │ │ +
166 if (element.type().isTriangle())
│ │ │ │ +
167 offset = dofsPerTriangle*gridIndexSet.subIndex(element,0,0);
│ │ │ │ +
168 else if (element.type().isQuadrilateral())
│ │ │ │ +
169 offset = quadrilateralOffset_ + dofsPerQuad*gridIndexSet.subIndex(element,0,0);
│ │ │ │ +
170 else
│ │ │ │ +
171 DUNE_THROW(Dune::NotImplemented, "2d elements have to be triangles or quadrilaterals");
│ │ │ │ +
172 }
│ │ │ │ +
173 else if constexpr (dim==3)
│ │ │ │ +
174 {
│ │ │ │ +
175 if (element.type().isTetrahedron())
│ │ │ │ +
176 offset = dofsPerTetrahedron*gridIndexSet.subIndex(element,0,0);
│ │ │ │ +
177 else if (element.type().isPrism())
│ │ │ │ +
178 offset = prismOffset_ + dofsPerPrism*gridIndexSet.subIndex(element,0,0);
│ │ │ │ +
179 else if (element.type().isHexahedron())
│ │ │ │ +
180 offset = hexahedronOffset_ + dofsPerHexahedron*gridIndexSet.subIndex(element,0,0);
│ │ │ │ +
181 else if (element.type().isPyramid())
│ │ │ │ +
182 offset = pyramidOffset_ + dofsPerPyramid*gridIndexSet.subIndex(element,0,0);
│ │ │ │ +
183 else
│ │ │ │ +
184 DUNE_THROW(Dune::NotImplemented, "3d elements have to be tetrahedrons, prisms, hexahedrons or pyramids");
│ │ │ │ +
185 }
│ │ │ │ +
186 else
│ │ │ │ +
187 DUNE_THROW(Dune::NotImplemented, "No index method for " << dim << "d grids available yet!");
│ │ │ │ +
188 for (size_type i = 0, end = node.size() ; i < end ; ++i, ++it)
│ │ │ │ +
189 *it = {offset + i};
│ │ │ │ +
190 return it;
│ │ │ │
191 }
│ │ │ │
192
│ │ │ │ -
193 /* \brief Update the stored grid view, to be called if the grid has changed */
│ │ │ │ -
194 void update (const GridView& gv)
│ │ │ │ -
195 {
│ │ │ │ -
196 gridView_ = gv;
│ │ │ │ +
194 unsigned int order() const
│ │ │ │ +
195 {
│ │ │ │ +
196 return k;
│ │ │ │
197 }
│ │ │ │
198
│ │ │ │ - │ │ │ │ -
203 {
│ │ │ │ -
204 return Node{&finiteElementMap_};
│ │ │ │ -
205 }
│ │ │ │ -
206
│ │ │ │ - │ │ │ │ -
208 {
│ │ │ │ -
209 return dofsPerCodim_[0] * gridView_.size(0) + dofsPerCodim_[1] * gridView_.size(1); // only 2d
│ │ │ │ -
210 }
│ │ │ │ +
199protected:
│ │ │ │ + │ │ │ │ +
201
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
206};
│ │ │ │ +
207
│ │ │ │ +
208
│ │ │ │ +
209
│ │ │ │ +
210namespace BasisFactory {
│ │ │ │
211
│ │ │ │ -
213 template<class SizePrefix>
│ │ │ │ -
214 size_type size(const SizePrefix prefix) const
│ │ │ │ -
215 {
│ │ │ │ -
216 assert(prefix.size() == 0 || prefix.size() == 1);
│ │ │ │ -
217 return (prefix.size() == 0) ? size() : 0;
│ │ │ │ -
218 }
│ │ │ │ -
219
│ │ │ │ - │ │ │ │ -
222 {
│ │ │ │ -
223 return size();
│ │ │ │ -
224 }
│ │ │ │ -
225
│ │ │ │ - │ │ │ │ -
227 {
│ │ │ │ -
228 // The implementation currently only supports grids with a single element type.
│ │ │ │ -
229 // We can therefore return the actual number of dofs here.
│ │ │ │ -
230 GeometryType elementType = *(gridView_.indexSet().types(0).begin());
│ │ │ │ -
231 size_t numFaces = ReferenceElements<double,dim>::general(elementType).size(1);
│ │ │ │ -
232 return dofsPerCodim_[0] + dofsPerCodim_[1] * numFaces;
│ │ │ │ -
233 }
│ │ │ │ +
219template<std::size_t k>
│ │ │ │ + │ │ │ │ +
221{
│ │ │ │ +
222 return [](const auto& gridView) {
│ │ │ │ +
223 return LagrangeDGPreBasis<std::decay_t<decltype(gridView)>, k>(gridView);
│ │ │ │ +
224 };
│ │ │ │ +
225}
│ │ │ │ +
226
│ │ │ │ +
227} // end namespace BasisFactory
│ │ │ │ +
228
│ │ │ │ +
229
│ │ │ │ +
230
│ │ │ │ +
231// *****************************************************************************
│ │ │ │ +
232// This is the actual global basis implementation based on the reusable parts.
│ │ │ │ +
233// *****************************************************************************
│ │ │ │
234
│ │ │ │ -
240 template<typename It>
│ │ │ │ -
241 It indices(const Node& node, It it) const
│ │ │ │ -
242 {
│ │ │ │ -
243 const auto& gridIndexSet = gridView().indexSet();
│ │ │ │ -
244 const auto& element = node.element();
│ │ │ │ +
242template<typename GV, int k>
│ │ │ │ + │ │ │ │ +
244
│ │ │ │
245
│ │ │ │ -
246 // throw if element is not of predefined type
│ │ │ │ -
247 if (not(element.type().isCube()) and not(element.type().isSimplex()))
│ │ │ │ -
248 DUNE_THROW(Dune::NotImplemented, "BrezziDouglasMariniBasis only implemented for cube and simplex elements.");
│ │ │ │ +
246
│ │ │ │ +
247} // end namespace Functions
│ │ │ │ +
248} // end namespace Dune
│ │ │ │
249
│ │ │ │ -
250 for(std::size_t i=0, end=node.size(); i<end; ++i, ++it)
│ │ │ │ -
251 {
│ │ │ │ -
252 Dune::LocalKey localKey = node.finiteElement().localCoefficients().localKey(i);
│ │ │ │ -
253
│ │ │ │ -
254 // The dimension of the entity that the current dof is related to
│ │ │ │ -
255 size_t subentity = localKey.subEntity();
│ │ │ │ -
256 size_t codim = localKey.codim();
│ │ │ │ -
257
│ │ │ │ -
258 *it = { codimOffset_[codim] +
│ │ │ │ -
259 dofsPerCodim_[codim] * gridIndexSet.subIndex(element, subentity, codim) + localKey.index() };
│ │ │ │ -
260 }
│ │ │ │ -
261
│ │ │ │ -
262 return it;
│ │ │ │ -
263 }
│ │ │ │ -
264
│ │ │ │ -
265protected:
│ │ │ │ - │ │ │ │ -
267 std::array<size_t,dim+1> codimOffset_;
│ │ │ │ -
268 FiniteElementMap finiteElementMap_;
│ │ │ │ -
269 // Number of dofs per entity type depending on the entity's codimension and type
│ │ │ │ -
270 std::array<int,2> dofsPerCodim_ {{dim*(k-1)*3, dim+(k-1)}};
│ │ │ │ -
271};
│ │ │ │ -
272
│ │ │ │ -
273
│ │ │ │ -
274
│ │ │ │ -
275template<typename GV, int k>
│ │ │ │ - │ │ │ │ -
277 public LeafBasisNode
│ │ │ │ -
278{
│ │ │ │ -
279 static const int dim = GV::dimension;
│ │ │ │ -
280
│ │ │ │ -
281public:
│ │ │ │ -
282
│ │ │ │ -
283 using size_type = std::size_t;
│ │ │ │ -
284 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ -
285 using FiniteElementMap = typename Impl::BDMLocalFiniteElementMap<GV, dim, double, k>;
│ │ │ │ -
286 using FiniteElement = Impl::GlobalValuedLocalFiniteElement<Impl::ContravariantPiolaTransformator,
│ │ │ │ -
287 typename FiniteElementMap::FiniteElement,
│ │ │ │ -
288 Element>;
│ │ │ │ -
289
│ │ │ │ -
290 BrezziDouglasMariniNode(const FiniteElementMap* finiteElementMap) :
│ │ │ │ -
291 element_(nullptr),
│ │ │ │ -
292 finiteElementMap_(finiteElementMap)
│ │ │ │ -
293 {}
│ │ │ │ -
294
│ │ │ │ -
296 const Element& element() const
│ │ │ │ -
297 {
│ │ │ │ -
298 return *element_;
│ │ │ │ -
299 }
│ │ │ │ -
300
│ │ │ │ - │ │ │ │ -
306 {
│ │ │ │ -
307 return finiteElement_;
│ │ │ │ -
308 }
│ │ │ │ -
309
│ │ │ │ -
311 void bind(const Element& e)
│ │ │ │ -
312 {
│ │ │ │ -
313 element_ = &e;
│ │ │ │ -
314 finiteElement_.bind((finiteElementMap_->find(*element_)), e);
│ │ │ │ -
315 this->setSize(finiteElement_.size());
│ │ │ │ -
316 }
│ │ │ │ -
317
│ │ │ │ -
318protected:
│ │ │ │ -
319
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
323};
│ │ │ │ -
324
│ │ │ │ -
325
│ │ │ │ -
326
│ │ │ │ -
327namespace BasisFactory {
│ │ │ │ -
328
│ │ │ │ -
336template<std::size_t k>
│ │ │ │ - │ │ │ │ -
338{
│ │ │ │ -
339 return [](const auto& gridView) {
│ │ │ │ -
340 return BrezziDouglasMariniPreBasis<std::decay_t<decltype(gridView)>, k>(gridView);
│ │ │ │ -
341 };
│ │ │ │ -
342}
│ │ │ │ -
343
│ │ │ │ -
344} // end namespace BasisFactory
│ │ │ │ -
345
│ │ │ │ -
346
│ │ │ │ -
347
│ │ │ │ -
348// *****************************************************************************
│ │ │ │ -
349// This is the actual global basis implementation based on the reusable parts.
│ │ │ │ -
350// *****************************************************************************
│ │ │ │ -
351
│ │ │ │ -
359template<typename GV, int k>
│ │ │ │ - │ │ │ │ -
361
│ │ │ │ -
362} // end namespace Functions
│ │ │ │ -
363} // end namespace Dune
│ │ │ │ -
364
│ │ │ │ -
365
│ │ │ │ -
366#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BREZZIDOUGLASMARINIBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
auto brezziDouglasMarini()
Create a pre-basis factory that can create a Brezzi-Douglas-Marini pre-basis.
Definition: brezzidouglasmarinibasis.hh:337
│ │ │ │ +
250
│ │ │ │ +
251#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
auto power(ChildPreBasisFactory &&childPreBasisFactory, const IndexMergingStrategy &)
Create a pre-basis factory that can build a PowerPreBasis.
Definition: powerbasis.hh:369
│ │ │ │ +
auto lagrangeDG()
Create a pre-basis factory that can create a LagrangeDG pre-basis.
Definition: lagrangedgbasis.hh:220
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
Definition: brezzidouglasmarinibasis.hh:278
│ │ │ │ -
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition: brezzidouglasmarinibasis.hh:305
│ │ │ │ -
typename GV::template Codim< 0 >::Entity Element
Definition: brezzidouglasmarinibasis.hh:284
│ │ │ │ -
const FiniteElementMap * finiteElementMap_
Definition: brezzidouglasmarinibasis.hh:322
│ │ │ │ -
std::size_t size_type
Definition: brezzidouglasmarinibasis.hh:283
│ │ │ │ -
FiniteElement finiteElement_
Definition: brezzidouglasmarinibasis.hh:320
│ │ │ │ -
typename Impl::BDMLocalFiniteElementMap< GV, dim, double, k > FiniteElementMap
Definition: brezzidouglasmarinibasis.hh:285
│ │ │ │ -
const Element * element_
Definition: brezzidouglasmarinibasis.hh:321
│ │ │ │ -
Impl::GlobalValuedLocalFiniteElement< Impl::ContravariantPiolaTransformator, typename FiniteElementMap::FiniteElement, Element > FiniteElement
Definition: brezzidouglasmarinibasis.hh:288
│ │ │ │ -
void bind(const Element &e)
Bind to element.
Definition: brezzidouglasmarinibasis.hh:311
│ │ │ │ -
BrezziDouglasMariniNode(const FiniteElementMap *finiteElementMap)
Definition: brezzidouglasmarinibasis.hh:290
│ │ │ │ -
const Element & element() const
Return current element, throw if unbound.
Definition: brezzidouglasmarinibasis.hh:296
│ │ │ │ -
Definition: brezzidouglasmarinibasis.hh:152
│ │ │ │ -
std::size_t size_type
Definition: brezzidouglasmarinibasis.hh:160
│ │ │ │ -
std::array< int, 2 > dofsPerCodim_
Definition: brezzidouglasmarinibasis.hh:270
│ │ │ │ -
size_type dimension() const
Definition: brezzidouglasmarinibasis.hh:221
│ │ │ │ -
static constexpr size_type minMultiIndexSize
Definition: brezzidouglasmarinibasis.hh:165
│ │ │ │ -
static constexpr size_type maxMultiIndexSize
Definition: brezzidouglasmarinibasis.hh:164
│ │ │ │ -
std::array< size_t, dim+1 > codimOffset_
Definition: brezzidouglasmarinibasis.hh:267
│ │ │ │ -
size_type size(const SizePrefix prefix) const
Return number possible values for next position in multi index.
Definition: brezzidouglasmarinibasis.hh:214
│ │ │ │ -
Node makeNode() const
Create tree node.
Definition: brezzidouglasmarinibasis.hh:202
│ │ │ │ -
GV GridView
The grid view that the FE space is defined on.
Definition: brezzidouglasmarinibasis.hh:159
│ │ │ │ -
BrezziDouglasMariniPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition: brezzidouglasmarinibasis.hh:169
│ │ │ │ -
FiniteElementMap finiteElementMap_
Definition: brezzidouglasmarinibasis.hh:268
│ │ │ │ -
void update(const GridView &gv)
Definition: brezzidouglasmarinibasis.hh:194
│ │ │ │ -
void initializeIndices()
Definition: brezzidouglasmarinibasis.hh:179
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: brezzidouglasmarinibasis.hh:188
│ │ │ │ -
size_type size() const
Definition: brezzidouglasmarinibasis.hh:207
│ │ │ │ -
static constexpr size_type multiIndexBufferSize
Definition: brezzidouglasmarinibasis.hh:166
│ │ │ │ -
size_type maxNodeSize() const
Definition: brezzidouglasmarinibasis.hh:226
│ │ │ │ -
GridView gridView_
Definition: brezzidouglasmarinibasis.hh:266
│ │ │ │ -
It indices(const Node &node, It it) const
Maps from subtree index set [0..size-1] to a globally unique multi index in global basis.
Definition: brezzidouglasmarinibasis.hh:241
│ │ │ │
Global basis for given pre-basis.
Definition: defaultglobalbasis.hh:46
│ │ │ │ +
Definition: lagrangebasis.hh:387
│ │ │ │ +
const Element & element() const
Return current element, throw if unbound.
Definition: lagrangebasis.hh:439
│ │ │ │ +
Definition: lagrangedgbasis.hh:38
│ │ │ │ +
size_type size() const
Definition: lagrangedgbasis.hh:115
│ │ │ │ +
It indices(const Node &node, It it) const
Definition: lagrangedgbasis.hh:156
│ │ │ │ +
size_type maxNodeSize() const
Definition: lagrangedgbasis.hh:150
│ │ │ │ +
static constexpr size_type multiIndexBufferSize
Definition: lagrangedgbasis.hh:62
│ │ │ │ +
unsigned int order() const
Polynomial order used in the local Lagrange finite-elements.
Definition: lagrangedgbasis.hh:194
│ │ │ │ +
void update(const GridView &gv)
Definition: lagrangedgbasis.hh:102
│ │ │ │ +
size_t hexahedronOffset_
Definition: lagrangedgbasis.hh:205
│ │ │ │ +
Node makeNode() const
Create tree node.
Definition: lagrangedgbasis.hh:110
│ │ │ │ +
static constexpr size_type maxMultiIndexSize
Definition: lagrangedgbasis.hh:60
│ │ │ │ +
static const int dofsPerHexahedron
Definition: lagrangedgbasis.hh:54
│ │ │ │ +
LagrangeDGPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition: lagrangedgbasis.hh:65
│ │ │ │ +
size_t pyramidOffset_
Definition: lagrangedgbasis.hh:203
│ │ │ │ +
static const int dofsPerTetrahedron
Definition: lagrangedgbasis.hh:52
│ │ │ │ +
size_type size(const SizePrefix &prefix) const
Return number possible values for next position in multi index.
Definition: lagrangedgbasis.hh:138
│ │ │ │ +
GV GridView
The grid view that the FE space is defined on.
Definition: lagrangedgbasis.hh:44
│ │ │ │ +
void initializeIndices()
Definition: lagrangedgbasis.hh:70
│ │ │ │ +
size_t quadrilateralOffset_
Definition: lagrangedgbasis.hh:202
│ │ │ │ +
static const int dofsPerEdge
Definition: lagrangedgbasis.hh:49
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: lagrangedgbasis.hh:97
│ │ │ │ +
static const int dofsPerQuad
Definition: lagrangedgbasis.hh:51
│ │ │ │ +
static const int dofsPerTriangle
Definition: lagrangedgbasis.hh:50
│ │ │ │ +
static const int dofsPerPyramid
Definition: lagrangedgbasis.hh:55
│ │ │ │ +
GridView gridView_
Definition: lagrangedgbasis.hh:200
│ │ │ │ +
static constexpr size_type minMultiIndexSize
Definition: lagrangedgbasis.hh:61
│ │ │ │ +
std::size_t size_type
Definition: lagrangedgbasis.hh:45
│ │ │ │ +
size_type dimension() const
Definition: lagrangedgbasis.hh:145
│ │ │ │ +
size_t prismOffset_
Definition: lagrangedgbasis.hh:204
│ │ │ │ +
static const int dofsPerPrism
Definition: lagrangedgbasis.hh:53
│ │ │ │
size_type size() const
Definition: nodes.hh:142
│ │ │ │ -
void setSize(const size_type size)
Definition: nodes.hh:164
│ │ │ │ -
Definition: nodes.hh:186
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,511 +5,376 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -brezzidouglasmarinibasis.hh │ │ │ │ │ +lagrangedgbasis.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BREZZIDOUGLASMARINIBASIS_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BREZZIDOUGLASMARINIBASIS_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH │ │ │ │ │ 5 │ │ │ │ │ 6#include │ │ │ │ │ 7#include │ │ │ │ │ - 8#include │ │ │ │ │ + 8#include │ │ │ │ │ 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12 │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ - 16#include │ │ │ │ │ - 17#include │ │ │ │ │ - 18 │ │ │ │ │ - 19#include │ │ │ │ │ - 20#include │ │ │ │ │ - 21#include │ │ │ │ │ - 22 │ │ │ │ │ - 23namespace Dune { │ │ │ │ │ - 24namespace Functions { │ │ │ │ │ - 25 │ │ │ │ │ - 26namespace Impl { │ │ │ │ │ - 27 │ │ │ │ │ - 28 template │ │ │ │ │ - 29 struct BDMSimplexLocalInfo │ │ │ │ │ - 30 { │ │ │ │ │ - 31 static_assert((AlwaysFalse::value),"The requested type of BDM element is │ │ │ │ │ -not implemented, sorry!"); │ │ │ │ │ - 32 }; │ │ │ │ │ - 33 │ │ │ │ │ - 34 template │ │ │ │ │ - 35 struct BDMSimplexLocalInfo<2,D,R,1> │ │ │ │ │ - 36 { │ │ │ │ │ - 37 using FiniteElement = BDM1Simplex2DLocalFiniteElement; │ │ │ │ │ - 38 static const std::size_t Variants = 8; │ │ │ │ │ - 39 }; │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ + 13 │ │ │ │ │ + 14 │ │ │ │ │ + 15 │ │ │ │ │ + 16 │ │ │ │ │ + 17namespace Dune { │ │ │ │ │ + 18namespace Functions { │ │ │ │ │ + 19 │ │ │ │ │ + 20 │ │ │ │ │ + 21 │ │ │ │ │ + 22/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ + 23// This is the reusable part of the basis. It contains │ │ │ │ │ + 24// │ │ │ │ │ + 25// LagrangeDGPreBasis │ │ │ │ │ + 26// LagrangeDGNode │ │ │ │ │ + 27// │ │ │ │ │ + 28// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ +shared │ │ │ │ │ + 29// state. These components do _not_ depend on the global basis and local │ │ │ │ │ +view │ │ │ │ │ + 30// and can be used without a global basis. │ │ │ │ │ + 31/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ + 32 │ │ │ │ │ + 33template │ │ │ │ │ +34using LagrangeDGNode = LagrangeNode; │ │ │ │ │ + 35 │ │ │ │ │ + 36template │ │ │ │ │ +37class LagrangeDGPreBasis │ │ │ │ │ + 38{ │ │ │ │ │ + 39 static const int dim = GV::dimension; │ │ │ │ │ 40 │ │ │ │ │ - 41 template │ │ │ │ │ - 42 struct BDMSimplexLocalInfo<2,D,R,2> │ │ │ │ │ - 43 { │ │ │ │ │ - 44 using FiniteElement = BDM2Simplex2DLocalFiniteElement; │ │ │ │ │ - 45 static const std::size_t Variants = 8; │ │ │ │ │ - 46 }; │ │ │ │ │ + 41public: │ │ │ │ │ + 42 │ │ │ │ │ +44 using GridView = GV; │ │ │ │ │ +45 using size_type = std::size_t; │ │ │ │ │ + 46 │ │ │ │ │ 47 │ │ │ │ │ - 48 template │ │ │ │ │ - 49 struct BDMCubeLocalInfo │ │ │ │ │ - 50 { │ │ │ │ │ - 51 static_assert((AlwaysFalse::value),"The requested type of BDM element is │ │ │ │ │ -not implemented, sorry!"); │ │ │ │ │ - 52 }; │ │ │ │ │ - 53 │ │ │ │ │ - 54 template │ │ │ │ │ - 55 struct BDMCubeLocalInfo<2,D,R,1> │ │ │ │ │ - 56 { │ │ │ │ │ - 57 using FiniteElement = BDM1Cube2DLocalFiniteElement; │ │ │ │ │ - 58 static const std::size_t Variants = 16; │ │ │ │ │ - 59 }; │ │ │ │ │ - 60 │ │ │ │ │ - 61 template │ │ │ │ │ - 62 struct BDMCubeLocalInfo<2,D,R,2> │ │ │ │ │ - 63 { │ │ │ │ │ - 64 using FiniteElement = BDM2Cube2DLocalFiniteElement; │ │ │ │ │ - 65 static const std::size_t Variants = 16; │ │ │ │ │ - 66 }; │ │ │ │ │ - 67 │ │ │ │ │ - 68 template │ │ │ │ │ - 69 struct BDMCubeLocalInfo<3,D,R,1> │ │ │ │ │ - 70 { │ │ │ │ │ - 71 using FiniteElement = BDM1Cube3DLocalFiniteElement; │ │ │ │ │ - 72 static const std::size_t Variants = 64; │ │ │ │ │ - 73 }; │ │ │ │ │ - 74 │ │ │ │ │ - 75 template │ │ │ │ │ - 76 class BDMLocalFiniteElementMap │ │ │ │ │ - 77 { │ │ │ │ │ - 78 using D = typename GV::ctype; │ │ │ │ │ - 79 using CubeFiniteElement = typename BDMCubeLocalInfo:: │ │ │ │ │ -FiniteElement; │ │ │ │ │ - 80 using SimplexFiniteElement = typename BDMSimplexLocalInfo:: │ │ │ │ │ -FiniteElement; │ │ │ │ │ - 81 │ │ │ │ │ - 82 public: │ │ │ │ │ - 83 │ │ │ │ │ - 84 using T = LocalBasisTraits, R, dim, │ │ │ │ │ -FieldVector, FieldMatrix >; │ │ │ │ │ - 85 using FiniteElement = LocalFiniteElementVirtualInterface; │ │ │ │ │ + 48 // Precompute the number of dofs per entity type │ │ │ │ │ +49 const static int dofsPerEdge = k+1; │ │ │ │ │ +50 const static int dofsPerTriangle = (k+1)*(k+2)/2; │ │ │ │ │ +51 const static int dofsPerQuad = (k+1)*(k+1); │ │ │ │ │ +52 const static int dofsPerTetrahedron = (k+1)*(k+2)*(k+3)/6; │ │ │ │ │ +53 const static int dofsPerPrism = (k+1)*(k+1)*(k+2)/2; │ │ │ │ │ +54 const static int dofsPerHexahedron = (k+1)*(k+1)*(k+1); │ │ │ │ │ +55 const static int dofsPerPyramid = (k+1)*(k+2)*(2*k+3)/6; │ │ │ │ │ + 56 │ │ │ │ │ + 57 │ │ │ │ │ +58 using Node = LagrangeDGNode; │ │ │ │ │ + 59 │ │ │ │ │ +60 static constexpr size_type maxMultiIndexSize = 1; │ │ │ │ │ +61 static constexpr size_type minMultiIndexSize = 1; │ │ │ │ │ +62 static constexpr size_type multiIndexBufferSize = 1; │ │ │ │ │ + 63 │ │ │ │ │ +65 LagrangeDGPreBasis(const GridView& gv) : │ │ │ │ │ + 66 gridView_(gv) │ │ │ │ │ + 67 {} │ │ │ │ │ + 68 │ │ │ │ │ + 69 │ │ │ │ │ +70 void initializeIndices() │ │ │ │ │ + 71 { │ │ │ │ │ + 72 switch (dim) │ │ │ │ │ + 73 { │ │ │ │ │ + 74 case 1: │ │ │ │ │ + 75 { │ │ │ │ │ + 76 break; │ │ │ │ │ + 77 } │ │ │ │ │ + 78 case 2: │ │ │ │ │ + 79 { │ │ │ │ │ + 80 quadrilateralOffset_ = dofsPerTriangle * gridView_.size(Dune:: │ │ │ │ │ +GeometryTypes::triangle); │ │ │ │ │ + 81 break; │ │ │ │ │ + 82 } │ │ │ │ │ + 83 case 3: │ │ │ │ │ + 84 { │ │ │ │ │ + 85 prismOffset_ = dofsPerTetrahedron * gridView_.size(Dune::GeometryTypes:: │ │ │ │ │ +tetrahedron); │ │ │ │ │ 86 │ │ │ │ │ - 87 BDMLocalFiniteElementMap(const GV& gv) │ │ │ │ │ - 88 : is_(&(gv.indexSet())), orient_(gv.size(0)) │ │ │ │ │ - 89 { │ │ │ │ │ - 90 cubeVariant_.resize(BDMCubeLocalInfo::Variants); │ │ │ │ │ - 91 simplexVariant_.resize(BDMSimplexLocalInfo::Variants); │ │ │ │ │ - 92 │ │ │ │ │ - 93 // create all variants │ │ │ │ │ - 94 for (size_t i = 0; i < cubeVariant_.size(); i++) │ │ │ │ │ - 95 cubeVariant_[i] = std:: │ │ │ │ │ -make_unique >(CubeFiniteElement │ │ │ │ │ -(i)); │ │ │ │ │ - 96 │ │ │ │ │ - 97 for (size_t i = 0; i < simplexVariant_.size(); i++) │ │ │ │ │ - 98 simplexVariant_[i] = std:: │ │ │ │ │ -make_unique > │ │ │ │ │ -(SimplexFiniteElement(i)); │ │ │ │ │ - 99 │ │ │ │ │ - 100 // compute orientation for all elements │ │ │ │ │ - 101 // loop once over the grid │ │ │ │ │ - 102 for(const auto& cell : elements(gv)) │ │ │ │ │ + 87 hexahedronOffset_ = prismOffset_ + dofsPerPrism * gridView_.size(Dune:: │ │ │ │ │ +GeometryTypes::prism); │ │ │ │ │ + 88 │ │ │ │ │ + 89 pyramidOffset_ = hexahedronOffset_ + dofsPerHexahedron * gridView_.size │ │ │ │ │ +(Dune::GeometryTypes::hexahedron); │ │ │ │ │ + 90 break; │ │ │ │ │ + 91 } │ │ │ │ │ + 92 } │ │ │ │ │ + 93 } │ │ │ │ │ + 94 │ │ │ │ │ +97 const GridView& gridView() const │ │ │ │ │ + 98 { │ │ │ │ │ + 99 return gridView_; │ │ │ │ │ + 100 } │ │ │ │ │ + 101 │ │ │ │ │ +102 void update(const GridView& gv) │ │ │ │ │ 103 { │ │ │ │ │ - 104 unsigned int myId = is_->index(cell); │ │ │ │ │ - 105 orient_[myId] = 0; │ │ │ │ │ + 104 gridView_ = gv; │ │ │ │ │ + 105 } │ │ │ │ │ 106 │ │ │ │ │ - 107 for (const auto& intersection : intersections(gv,cell)) │ │ │ │ │ - 108 { │ │ │ │ │ - 109 if (intersection.neighbor() && (is_->index(intersection.outside()) > │ │ │ │ │ -myId)) │ │ │ │ │ - 110 orient_[myId] |= (1 << intersection.indexInInside()); │ │ │ │ │ - 111 } │ │ │ │ │ - 112 } │ │ │ │ │ +110 Node makeNode() const │ │ │ │ │ + 111 { │ │ │ │ │ + 112 return Node{}; │ │ │ │ │ 113 } │ │ │ │ │ 114 │ │ │ │ │ - 116 template │ │ │ │ │ - 117 const FiniteElement& find(const EntityType& e) const │ │ │ │ │ +115 size_type size() const │ │ │ │ │ + 116 { │ │ │ │ │ + 117 switch (dim) │ │ │ │ │ 118 { │ │ │ │ │ - 119 if (e.type().isCube()) │ │ │ │ │ - 120 return *cubeVariant_[orient_[is_->index(e)]]; │ │ │ │ │ - 121 else │ │ │ │ │ - 122 return *simplexVariant_[orient_[is_->index(e)]]; │ │ │ │ │ - 123 } │ │ │ │ │ - 124 │ │ │ │ │ - 125 private: │ │ │ │ │ - 126 std::vector > > cubeVariant_; │ │ │ │ │ - 127 std::vector > > │ │ │ │ │ -simplexVariant_; │ │ │ │ │ - 128 const typename GV::IndexSet* is_; │ │ │ │ │ - 129 std::vector orient_; │ │ │ │ │ - 130 }; │ │ │ │ │ - 131 │ │ │ │ │ - 132 │ │ │ │ │ - 133} // namespace Impl │ │ │ │ │ - 134 │ │ │ │ │ + 119 case 1: │ │ │ │ │ + 120 return dofsPerEdge*gridView_.size(0); │ │ │ │ │ + 121 case 2: │ │ │ │ │ + 122 { │ │ │ │ │ + 123 return dofsPerTriangle*gridView_.size(Dune::GeometryTypes::triangle) + │ │ │ │ │ +dofsPerQuad*gridView_.size(Dune::GeometryTypes::quadrilateral); │ │ │ │ │ + 124 } │ │ │ │ │ + 125 case 3: │ │ │ │ │ + 126 { │ │ │ │ │ + 127 return dofsPerTetrahedron*gridView_.size(Dune::GeometryTypes::tetrahedron) │ │ │ │ │ + 128 + dofsPerPyramid*gridView_.size(Dune::GeometryTypes::pyramid) │ │ │ │ │ + 129 + dofsPerPrism*gridView_.size(Dune::GeometryTypes::prism) │ │ │ │ │ + 130 + dofsPerHexahedron*gridView_.size(Dune::GeometryTypes::hexahedron); │ │ │ │ │ + 131 } │ │ │ │ │ + 132 } │ │ │ │ │ + 133 DUNE_THROW(Dune::NotImplemented, "No size method for " << dim << "d grids │ │ │ │ │ +available yet!"); │ │ │ │ │ + 134 } │ │ │ │ │ 135 │ │ │ │ │ - 136/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 137// This is the reusable part of the basis. It contains │ │ │ │ │ - 138// │ │ │ │ │ - 139// BrezziDouglasMariniPreBasis │ │ │ │ │ - 140// BrezziDouglasMariniNode │ │ │ │ │ - 141// │ │ │ │ │ - 142// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ -shared │ │ │ │ │ - 143// state. These components do _not_ depend on the global basis and local │ │ │ │ │ -view │ │ │ │ │ - 144// and can be used without a global basis. │ │ │ │ │ - 145/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 146 │ │ │ │ │ - 147template │ │ │ │ │ - 148class BrezziDouglasMariniNode; │ │ │ │ │ + 137 template │ │ │ │ │ +138 size_type size(const SizePrefix& prefix) const │ │ │ │ │ + 139 { │ │ │ │ │ + 140 assert(prefix.size() == 0 || prefix.size() == 1); │ │ │ │ │ + 141 return (prefix.size() == 0) ? size() : 0; │ │ │ │ │ + 142 } │ │ │ │ │ + 143 │ │ │ │ │ +145 size_type dimension() const │ │ │ │ │ + 146 { │ │ │ │ │ + 147 return size(); │ │ │ │ │ + 148 } │ │ │ │ │ 149 │ │ │ │ │ - 150template │ │ │ │ │ -151class BrezziDouglasMariniPreBasis │ │ │ │ │ - 152{ │ │ │ │ │ - 153 static const int dim = GV::dimension; │ │ │ │ │ - 154 using FiniteElementMap = typename Impl::BDMLocalFiniteElementMap; │ │ │ │ │ - 155 │ │ │ │ │ - 156public: │ │ │ │ │ - 157 │ │ │ │ │ -159 using GridView = GV; │ │ │ │ │ -160 using size_type = std::size_t; │ │ │ │ │ - 161 │ │ │ │ │ -162 using Node = BrezziDouglasMariniNode; │ │ │ │ │ - 163 │ │ │ │ │ -164 static constexpr size_type maxMultiIndexSize = 1; │ │ │ │ │ -165 static constexpr size_type minMultiIndexSize = 1; │ │ │ │ │ -166 static constexpr size_type multiIndexBufferSize = 1; │ │ │ │ │ - 167 │ │ │ │ │ -169 BrezziDouglasMariniPreBasis(const GridView& gv) : │ │ │ │ │ - 170 gridView_(gv), │ │ │ │ │ - 171 finiteElementMap_(gv) │ │ │ │ │ - 172 { │ │ │ │ │ - 173 // There is no inherent reason why the basis shouldn't work for grids with │ │ │ │ │ -more than one │ │ │ │ │ - 174 // element types. Somebody simply has to sit down and implement the │ │ │ │ │ -missing bits. │ │ │ │ │ - 175 if (gv.indexSet().types(0).size() > 1) │ │ │ │ │ - 176 DUNE_THROW(Dune::NotImplemented, "Brezzi-Douglas-Marini basis is only │ │ │ │ │ -implemented for grids with a single element type"); │ │ │ │ │ - 177 } │ │ │ │ │ - 178 │ │ │ │ │ -179 void initializeIndices() │ │ │ │ │ - 180 { │ │ │ │ │ - 181 codimOffset_[0] = 0; │ │ │ │ │ - 182 codimOffset_[1] = codimOffset_[0] + dofsPerCodim_[0] * gridView_.size(0); │ │ │ │ │ - 183 //if (dim==3) codimOffset_[2] = codimOffset_[1] + dofsPerCodim[1] * │ │ │ │ │ -gridView_.size(1); │ │ │ │ │ - 184 } │ │ │ │ │ - 185 │ │ │ │ │ -188 const GridView& gridView() const │ │ │ │ │ - 189 { │ │ │ │ │ - 190 return gridView_; │ │ │ │ │ +150 size_type maxNodeSize() const │ │ │ │ │ + 151 { │ │ │ │ │ + 152 return Dune::power(k+1, int(GV::dimension)); │ │ │ │ │ + 153 } │ │ │ │ │ + 154 │ │ │ │ │ + 155 template │ │ │ │ │ +156 It indices(const Node& node, It it) const │ │ │ │ │ + 157 { │ │ │ │ │ + 158 const auto& gridIndexSet = gridView().indexSet(); │ │ │ │ │ + 159 const auto& element = node.element(); │ │ │ │ │ + 160 │ │ │ │ │ + 161 size_type offset = 0; │ │ │ │ │ + 162 if constexpr (dim==1) │ │ │ │ │ + 163 offset = dofsPerEdge*gridIndexSet.subIndex(element,0,0); │ │ │ │ │ + 164 else if constexpr (dim==2) │ │ │ │ │ + 165 { │ │ │ │ │ + 166 if (element.type().isTriangle()) │ │ │ │ │ + 167 offset = dofsPerTriangle*gridIndexSet.subIndex(element,0,0); │ │ │ │ │ + 168 else if (element.type().isQuadrilateral()) │ │ │ │ │ + 169 offset = quadrilateralOffset_ + dofsPerQuad*gridIndexSet.subIndex │ │ │ │ │ +(element,0,0); │ │ │ │ │ + 170 else │ │ │ │ │ + 171 DUNE_THROW(Dune::NotImplemented, "2d elements have to be triangles or │ │ │ │ │ +quadrilaterals"); │ │ │ │ │ + 172 } │ │ │ │ │ + 173 else if constexpr (dim==3) │ │ │ │ │ + 174 { │ │ │ │ │ + 175 if (element.type().isTetrahedron()) │ │ │ │ │ + 176 offset = dofsPerTetrahedron*gridIndexSet.subIndex(element,0,0); │ │ │ │ │ + 177 else if (element.type().isPrism()) │ │ │ │ │ + 178 offset = prismOffset_ + dofsPerPrism*gridIndexSet.subIndex(element,0,0); │ │ │ │ │ + 179 else if (element.type().isHexahedron()) │ │ │ │ │ + 180 offset = hexahedronOffset_ + dofsPerHexahedron*gridIndexSet.subIndex │ │ │ │ │ +(element,0,0); │ │ │ │ │ + 181 else if (element.type().isPyramid()) │ │ │ │ │ + 182 offset = pyramidOffset_ + dofsPerPyramid*gridIndexSet.subIndex │ │ │ │ │ +(element,0,0); │ │ │ │ │ + 183 else │ │ │ │ │ + 184 DUNE_THROW(Dune::NotImplemented, "3d elements have to be tetrahedrons, │ │ │ │ │ +prisms, hexahedrons or pyramids"); │ │ │ │ │ + 185 } │ │ │ │ │ + 186 else │ │ │ │ │ + 187 DUNE_THROW(Dune::NotImplemented, "No index method for " << dim << "d grids │ │ │ │ │ +available yet!"); │ │ │ │ │ + 188 for (size_type i = 0, end = node.size() ; i < end ; ++i, ++it) │ │ │ │ │ + 189 *it = {offset + i}; │ │ │ │ │ + 190 return it; │ │ │ │ │ 191 } │ │ │ │ │ 192 │ │ │ │ │ - 193 /* \brief Update the stored grid view, to be called if the grid has │ │ │ │ │ -changed */ │ │ │ │ │ -194 void update (const GridView& gv) │ │ │ │ │ +194 unsigned int order() const │ │ │ │ │ 195 { │ │ │ │ │ - 196 gridView_ = gv; │ │ │ │ │ + 196 return k; │ │ │ │ │ 197 } │ │ │ │ │ 198 │ │ │ │ │ -202 Node makeNode() const │ │ │ │ │ - 203 { │ │ │ │ │ - 204 return Node{&finiteElementMap_}; │ │ │ │ │ - 205 } │ │ │ │ │ - 206 │ │ │ │ │ -207 size_type size() const │ │ │ │ │ - 208 { │ │ │ │ │ - 209 return dofsPerCodim_[0] * gridView_.size(0) + dofsPerCodim_[1] * │ │ │ │ │ -gridView_.size(1); // only 2d │ │ │ │ │ - 210 } │ │ │ │ │ + 199protected: │ │ │ │ │ +200 GridView gridView_; │ │ │ │ │ + 201 │ │ │ │ │ +202 size_t quadrilateralOffset_; │ │ │ │ │ +203 size_t pyramidOffset_; │ │ │ │ │ +204 size_t prismOffset_; │ │ │ │ │ +205 size_t hexahedronOffset_; │ │ │ │ │ + 206}; │ │ │ │ │ + 207 │ │ │ │ │ + 208 │ │ │ │ │ + 209 │ │ │ │ │ + 210namespace BasisFactory { │ │ │ │ │ 211 │ │ │ │ │ - 213 template │ │ │ │ │ -214 size_type size(const SizePrefix prefix) const │ │ │ │ │ - 215 { │ │ │ │ │ - 216 assert(prefix.size() == 0 || prefix.size() == 1); │ │ │ │ │ - 217 return (prefix.size() == 0) ? size() : 0; │ │ │ │ │ - 218 } │ │ │ │ │ - 219 │ │ │ │ │ -221 size_type dimension() const │ │ │ │ │ - 222 { │ │ │ │ │ - 223 return size(); │ │ │ │ │ - 224 } │ │ │ │ │ - 225 │ │ │ │ │ -226 size_type maxNodeSize() const │ │ │ │ │ - 227 { │ │ │ │ │ - 228 // The implementation currently only supports grids with a single element │ │ │ │ │ -type. │ │ │ │ │ - 229 // We can therefore return the actual number of dofs here. │ │ │ │ │ - 230 GeometryType elementType = *(gridView_.indexSet().types(0).begin()); │ │ │ │ │ - 231 size_t numFaces = ReferenceElements::general(elementType).size │ │ │ │ │ -(1); │ │ │ │ │ - 232 return dofsPerCodim_[0] + dofsPerCodim_[1] * numFaces; │ │ │ │ │ - 233 } │ │ │ │ │ - 234 │ │ │ │ │ - 240 template │ │ │ │ │ -241 It indices(const Node& node, It it) const │ │ │ │ │ - 242 { │ │ │ │ │ - 243 const auto& gridIndexSet = gridView().indexSet(); │ │ │ │ │ - 244 const auto& element = node.element(); │ │ │ │ │ - 245 │ │ │ │ │ - 246 // throw if element is not of predefined type │ │ │ │ │ - 247 if (not(element.type().isCube()) and not(element.type().isSimplex())) │ │ │ │ │ - 248 DUNE_THROW(Dune::NotImplemented, "BrezziDouglasMariniBasis only │ │ │ │ │ -implemented for cube and simplex elements."); │ │ │ │ │ - 249 │ │ │ │ │ - 250 for(std::size_t i=0, end=node.size(); i codimOffset_; │ │ │ │ │ -268 FiniteElementMap finiteElementMap_; │ │ │ │ │ - 269 // Number of dofs per entity type depending on the entity's codimension │ │ │ │ │ -and type │ │ │ │ │ -270 std::array dofsPerCodim_ {{dim*(k-1)*3, dim+(k-1)}}; │ │ │ │ │ - 271}; │ │ │ │ │ - 272 │ │ │ │ │ - 273 │ │ │ │ │ - 274 │ │ │ │ │ - 275template │ │ │ │ │ -276class BrezziDouglasMariniNode : │ │ │ │ │ - 277 public LeafBasisNode │ │ │ │ │ - 278{ │ │ │ │ │ - 279 static const int dim = GV::dimension; │ │ │ │ │ - 280 │ │ │ │ │ - 281public: │ │ │ │ │ - 282 │ │ │ │ │ -283 using size_type = std::size_t; │ │ │ │ │ -284 using Element = typename GV::template Codim<0>::Entity; │ │ │ │ │ -285 using FiniteElementMap = typename Impl::BDMLocalFiniteElementMap; │ │ │ │ │ -286 using FiniteElement = Impl::GlobalValuedLocalFiniteElement; │ │ │ │ │ - 289 │ │ │ │ │ -290 BrezziDouglasMariniNode(const FiniteElementMap* finiteElementMap) : │ │ │ │ │ - 291 element_(nullptr), │ │ │ │ │ - 292 finiteElementMap_(finiteElementMap) │ │ │ │ │ - 293 {} │ │ │ │ │ - 294 │ │ │ │ │ -296 const Element& element() const │ │ │ │ │ - 297 { │ │ │ │ │ - 298 return *element_; │ │ │ │ │ - 299 } │ │ │ │ │ - 300 │ │ │ │ │ -305 const FiniteElement& finiteElement() const │ │ │ │ │ - 306 { │ │ │ │ │ - 307 return finiteElement_; │ │ │ │ │ - 308 } │ │ │ │ │ - 309 │ │ │ │ │ -311 void bind(const Element& e) │ │ │ │ │ - 312 { │ │ │ │ │ - 313 element_ = &e; │ │ │ │ │ - 314 finiteElement_.bind((finiteElementMap_->find(*element_)), e); │ │ │ │ │ - 315 this->setSize(finiteElement_.size()); │ │ │ │ │ - 316 } │ │ │ │ │ - 317 │ │ │ │ │ - 318protected: │ │ │ │ │ - 319 │ │ │ │ │ -320 FiniteElement finiteElement_; │ │ │ │ │ -321 const Element* element_; │ │ │ │ │ -322 const FiniteElementMap* finiteElementMap_; │ │ │ │ │ - 323}; │ │ │ │ │ - 324 │ │ │ │ │ - 325 │ │ │ │ │ - 326 │ │ │ │ │ - 327namespace BasisFactory { │ │ │ │ │ - 328 │ │ │ │ │ - 336template │ │ │ │ │ -337auto brezziDouglasMarini() │ │ │ │ │ - 338{ │ │ │ │ │ - 339 return [](const auto& gridView) { │ │ │ │ │ - 340 return BrezziDouglasMariniPreBasis, k> │ │ │ │ │ -(gridView); │ │ │ │ │ - 341 }; │ │ │ │ │ - 342} │ │ │ │ │ - 343 │ │ │ │ │ - 344} // end namespace BasisFactory │ │ │ │ │ - 345 │ │ │ │ │ - 346 │ │ │ │ │ - 347 │ │ │ │ │ - 348/ │ │ │ │ │ + 219template │ │ │ │ │ +220auto lagrangeDG() │ │ │ │ │ + 221{ │ │ │ │ │ + 222 return [](const auto& gridView) { │ │ │ │ │ + 223 return LagrangeDGPreBasis, k>(gridView); │ │ │ │ │ + 224 }; │ │ │ │ │ + 225} │ │ │ │ │ + 226 │ │ │ │ │ + 227} // end namespace BasisFactory │ │ │ │ │ + 228 │ │ │ │ │ + 229 │ │ │ │ │ + 230 │ │ │ │ │ + 231/ │ │ │ │ │ / ***************************************************************************** │ │ │ │ │ - 349// This is the actual global basis implementation based on the reusable │ │ │ │ │ + 232// This is the actual global basis implementation based on the reusable │ │ │ │ │ parts. │ │ │ │ │ - 350/ │ │ │ │ │ + 233/ │ │ │ │ │ / ***************************************************************************** │ │ │ │ │ - 351 │ │ │ │ │ - 359template │ │ │ │ │ -360using BrezziDouglasMariniBasis = │ │ │ │ │ -DefaultGlobalBasis >; │ │ │ │ │ - 361 │ │ │ │ │ - 362} // end namespace Functions │ │ │ │ │ - 363} // end namespace Dune │ │ │ │ │ - 364 │ │ │ │ │ - 365 │ │ │ │ │ - 366#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BREZZIDOUGLASMARINIBASIS_HH │ │ │ │ │ + 234 │ │ │ │ │ + 242template │ │ │ │ │ +243using LagrangeDGBasis = DefaultGlobalBasis >; │ │ │ │ │ + 244 │ │ │ │ │ + 245 │ │ │ │ │ + 246 │ │ │ │ │ + 247} // end namespace Functions │ │ │ │ │ + 248} // end namespace Dune │ │ │ │ │ + 249 │ │ │ │ │ + 250 │ │ │ │ │ + 251#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH │ │ │ │ │ nodes.hh │ │ │ │ │ +lagrangebasis.hh │ │ │ │ │ defaultglobalbasis.hh │ │ │ │ │ -globalvaluedlocalfiniteelement.hh │ │ │ │ │ -Dune::Functions::BasisFactory::brezziDouglasMarini │ │ │ │ │ -auto brezziDouglasMarini() │ │ │ │ │ -Create a pre-basis factory that can create a Brezzi-Douglas-Marini pre-basis. │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:337 │ │ │ │ │ +Dune::Functions::BasisFactory::power │ │ │ │ │ +auto power(ChildPreBasisFactory &&childPreBasisFactory, const │ │ │ │ │ +IndexMergingStrategy &) │ │ │ │ │ +Create a pre-basis factory that can build a PowerPreBasis. │ │ │ │ │ +Definition: powerbasis.hh:369 │ │ │ │ │ +Dune::Functions::BasisFactory::lagrangeDG │ │ │ │ │ +auto lagrangeDG() │ │ │ │ │ +Create a pre-basis factory that can create a LagrangeDG pre-basis. │ │ │ │ │ +Definition: lagrangedgbasis.hh:220 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniNode │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:278 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniNode::finiteElement │ │ │ │ │ -const FiniteElement & finiteElement() const │ │ │ │ │ -Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:305 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniNode::Element │ │ │ │ │ -typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:284 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniNode::finiteElementMap_ │ │ │ │ │ -const FiniteElementMap * finiteElementMap_ │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:322 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniNode::size_type │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:283 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniNode::finiteElement_ │ │ │ │ │ -FiniteElement finiteElement_ │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:320 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniNode::FiniteElementMap │ │ │ │ │ -typename Impl::BDMLocalFiniteElementMap< GV, dim, double, k > FiniteElementMap │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:285 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniNode::element_ │ │ │ │ │ -const Element * element_ │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:321 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniNode::FiniteElement │ │ │ │ │ -Impl::GlobalValuedLocalFiniteElement< Impl::ContravariantPiolaTransformator, │ │ │ │ │ -typename FiniteElementMap::FiniteElement, Element > FiniteElement │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:288 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniNode::bind │ │ │ │ │ -void bind(const Element &e) │ │ │ │ │ -Bind to element. │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:311 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniNode::BrezziDouglasMariniNode │ │ │ │ │ -BrezziDouglasMariniNode(const FiniteElementMap *finiteElementMap) │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:290 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniNode::element │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis │ │ │ │ │ +Global basis for given pre-basis. │ │ │ │ │ +Definition: defaultglobalbasis.hh:46 │ │ │ │ │ +Dune::Functions::LagrangeNode │ │ │ │ │ +Definition: lagrangebasis.hh:387 │ │ │ │ │ +Dune::Functions::LagrangeNode::element │ │ │ │ │ const Element & element() const │ │ │ │ │ Return current element, throw if unbound. │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:296 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniPreBasis │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:152 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniPreBasis::size_type │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:160 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniPreBasis::dofsPerCodim_ │ │ │ │ │ -std::array< int, 2 > dofsPerCodim_ │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:270 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniPreBasis::dimension │ │ │ │ │ -size_type dimension() const │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:221 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniPreBasis::minMultiIndexSize │ │ │ │ │ -static constexpr size_type minMultiIndexSize │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:165 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniPreBasis::maxMultiIndexSize │ │ │ │ │ -static constexpr size_type maxMultiIndexSize │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:164 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniPreBasis::codimOffset_ │ │ │ │ │ -std::array< size_t, dim+1 > codimOffset_ │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:267 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniPreBasis::size │ │ │ │ │ -size_type size(const SizePrefix prefix) const │ │ │ │ │ -Return number possible values for next position in multi index. │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:214 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniPreBasis::makeNode │ │ │ │ │ +Definition: lagrangebasis.hh:439 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis │ │ │ │ │ +Definition: lagrangedgbasis.hh:38 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::size │ │ │ │ │ +size_type size() const │ │ │ │ │ +Definition: lagrangedgbasis.hh:115 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::indices │ │ │ │ │ +It indices(const Node &node, It it) const │ │ │ │ │ +Definition: lagrangedgbasis.hh:156 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::maxNodeSize │ │ │ │ │ +size_type maxNodeSize() const │ │ │ │ │ +Definition: lagrangedgbasis.hh:150 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::multiIndexBufferSize │ │ │ │ │ +static constexpr size_type multiIndexBufferSize │ │ │ │ │ +Definition: lagrangedgbasis.hh:62 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::order │ │ │ │ │ +unsigned int order() const │ │ │ │ │ +Polynomial order used in the local Lagrange finite-elements. │ │ │ │ │ +Definition: lagrangedgbasis.hh:194 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::update │ │ │ │ │ +void update(const GridView &gv) │ │ │ │ │ +Definition: lagrangedgbasis.hh:102 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::hexahedronOffset_ │ │ │ │ │ +size_t hexahedronOffset_ │ │ │ │ │ +Definition: lagrangedgbasis.hh:205 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::makeNode │ │ │ │ │ Node makeNode() const │ │ │ │ │ Create tree node. │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:202 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniPreBasis::GridView │ │ │ │ │ +Definition: lagrangedgbasis.hh:110 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::maxMultiIndexSize │ │ │ │ │ +static constexpr size_type maxMultiIndexSize │ │ │ │ │ +Definition: lagrangedgbasis.hh:60 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::dofsPerHexahedron │ │ │ │ │ +static const int dofsPerHexahedron │ │ │ │ │ +Definition: lagrangedgbasis.hh:54 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::LagrangeDGPreBasis │ │ │ │ │ +LagrangeDGPreBasis(const GridView &gv) │ │ │ │ │ +Constructor for a given grid view object. │ │ │ │ │ +Definition: lagrangedgbasis.hh:65 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::pyramidOffset_ │ │ │ │ │ +size_t pyramidOffset_ │ │ │ │ │ +Definition: lagrangedgbasis.hh:203 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::dofsPerTetrahedron │ │ │ │ │ +static const int dofsPerTetrahedron │ │ │ │ │ +Definition: lagrangedgbasis.hh:52 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::size │ │ │ │ │ +size_type size(const SizePrefix &prefix) const │ │ │ │ │ +Return number possible values for next position in multi index. │ │ │ │ │ +Definition: lagrangedgbasis.hh:138 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::GridView │ │ │ │ │ GV GridView │ │ │ │ │ The grid view that the FE space is defined on. │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:159 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniPreBasis::BrezziDouglasMariniPreBasis │ │ │ │ │ -BrezziDouglasMariniPreBasis(const GridView &gv) │ │ │ │ │ -Constructor for a given grid view object. │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:169 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniPreBasis::finiteElementMap_ │ │ │ │ │ -FiniteElementMap finiteElementMap_ │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:268 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniPreBasis::update │ │ │ │ │ -void update(const GridView &gv) │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:194 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniPreBasis::initializeIndices │ │ │ │ │ +Definition: lagrangedgbasis.hh:44 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::initializeIndices │ │ │ │ │ void initializeIndices() │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:179 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniPreBasis::gridView │ │ │ │ │ +Definition: lagrangedgbasis.hh:70 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::quadrilateralOffset_ │ │ │ │ │ +size_t quadrilateralOffset_ │ │ │ │ │ +Definition: lagrangedgbasis.hh:202 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::dofsPerEdge │ │ │ │ │ +static const int dofsPerEdge │ │ │ │ │ +Definition: lagrangedgbasis.hh:49 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::gridView │ │ │ │ │ const GridView & gridView() const │ │ │ │ │ Obtain the grid view that the basis is defined on. │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:188 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniPreBasis::size │ │ │ │ │ -size_type size() const │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:207 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniPreBasis::multiIndexBufferSize │ │ │ │ │ -static constexpr size_type multiIndexBufferSize │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:166 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniPreBasis::maxNodeSize │ │ │ │ │ -size_type maxNodeSize() const │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:226 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniPreBasis::gridView_ │ │ │ │ │ +Definition: lagrangedgbasis.hh:97 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::dofsPerQuad │ │ │ │ │ +static const int dofsPerQuad │ │ │ │ │ +Definition: lagrangedgbasis.hh:51 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::dofsPerTriangle │ │ │ │ │ +static const int dofsPerTriangle │ │ │ │ │ +Definition: lagrangedgbasis.hh:50 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::dofsPerPyramid │ │ │ │ │ +static const int dofsPerPyramid │ │ │ │ │ +Definition: lagrangedgbasis.hh:55 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::gridView_ │ │ │ │ │ GridView gridView_ │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:266 │ │ │ │ │ -Dune::Functions::BrezziDouglasMariniPreBasis::indices │ │ │ │ │ -It indices(const Node &node, It it) const │ │ │ │ │ -Maps from subtree index set [0..size-1] to a globally unique multi index in │ │ │ │ │ -global basis. │ │ │ │ │ -Definition: brezzidouglasmarinibasis.hh:241 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis │ │ │ │ │ -Global basis for given pre-basis. │ │ │ │ │ -Definition: defaultglobalbasis.hh:46 │ │ │ │ │ +Definition: lagrangedgbasis.hh:200 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::minMultiIndexSize │ │ │ │ │ +static constexpr size_type minMultiIndexSize │ │ │ │ │ +Definition: lagrangedgbasis.hh:61 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::size_type │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +Definition: lagrangedgbasis.hh:45 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::dimension │ │ │ │ │ +size_type dimension() const │ │ │ │ │ +Definition: lagrangedgbasis.hh:145 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::prismOffset_ │ │ │ │ │ +size_t prismOffset_ │ │ │ │ │ +Definition: lagrangedgbasis.hh:204 │ │ │ │ │ +Dune::Functions::LagrangeDGPreBasis::dofsPerPrism │ │ │ │ │ +static const int dofsPerPrism │ │ │ │ │ +Definition: lagrangedgbasis.hh:53 │ │ │ │ │ Dune::Functions::BasisNodeMixin::size │ │ │ │ │ size_type size() const │ │ │ │ │ Definition: nodes.hh:142 │ │ │ │ │ -Dune::Functions::BasisNodeMixin::setSize │ │ │ │ │ -void setSize(const size_type size) │ │ │ │ │ -Definition: nodes.hh:164 │ │ │ │ │ -Dune::Functions::LeafBasisNode │ │ │ │ │ -Definition: nodes.hh:186 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00149.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: raviartthomasbasis.hh File Reference │ │ │ │ +dune-functions: defaultglobalbasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,68 +65,58 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Typedefs | │ │ │ │ Functions
│ │ │ │ -
raviartthomasbasis.hh File Reference
│ │ │ │ +
defaultglobalbasis.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <array>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/grid/common/capabilities.hh>
│ │ │ │ -#include <dune/grid/common/mcmgmapper.hh>
│ │ │ │ -#include <dune/localfunctions/common/localfiniteelementvariant.hh>
│ │ │ │ -#include <dune/localfunctions/raviartthomas.hh>
│ │ │ │ -#include <dune/localfunctions/raviartthomas/raviartthomas0cube2d.hh>
│ │ │ │ -#include <dune/localfunctions/raviartthomas/raviartthomas0cube3d.hh>
│ │ │ │ -#include <dune/localfunctions/raviartthomas/raviartthomas02d.hh>
│ │ │ │ -#include <dune/localfunctions/raviartthomas/raviartthomas03d.hh>
│ │ │ │ -#include <dune/localfunctions/raviartthomas/raviartthomas1cube2d.hh>
│ │ │ │ -#include <dune/localfunctions/raviartthomas/raviartthomas1cube3d.hh>
│ │ │ │ -#include <dune/localfunctions/raviartthomas/raviartthomas12d.hh>
│ │ │ │ -#include <dune/localfunctions/raviartthomas/raviartthomas2cube2d.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/globalvaluedlocalfiniteelement.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │ +
#include <cstddef>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <dune/common/reservedvector.hh>
│ │ │ │ +#include <dune/common/typeutilities.hh>
│ │ │ │ +#include <dune/common/concept.hh>
│ │ │ │ +#include <dune/functions/common/type_traits.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/defaultlocalview.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::RaviartThomasPreBasis< GV, k >
 
class  Dune::Functions::RaviartThomasNode< GV, k >
class  Dune::Functions::DefaultGlobalBasis< PB >
 Global basis for given pre-basis. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
namespace  Dune::Functions::BasisFactory
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Typedefs

template<typename GV , int k>
using Dune::Functions::RaviartThomasBasis = DefaultGlobalBasis< RaviartThomasPreBasis< GV, k > >
 Basis of a k-th-order Raviart Thomas finite element space. More...
 
namespace  Dune::Functions::BasisBuilder
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<std::size_t k>
auto Dune::Functions::BasisFactory::raviartThomas ()
 Create a pre-basis factory that can create a Raviart-Thomas pre-basis. More...
 
template<class PreBasis >
 Dune::Functions::DefaultGlobalBasis (PreBasis &&) -> DefaultGlobalBasis< std::decay_t< PreBasis > >
 
template<class GridView , class PreBasisFactory >
 Dune::Functions::DefaultGlobalBasis (const GridView &gv, PreBasisFactory &&f) -> DefaultGlobalBasis< std::decay_t< decltype(f(gv))> >
 
template<class GridView , class PreBasisFactory >
auto Dune::Functions::BasisFactory::makeBasis (const GridView &gridView, PreBasisFactory &&preBasisFactory)
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,54 +5,48 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -Classes | Namespaces | Typedefs | Functions │ │ │ │ │ -raviartthomasbasis.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Functions │ │ │ │ │ +defaultglobalbasis.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::RaviartThomasPreBasis<_GV,_k_> │ │ │ │ │ -  │ │ │ │ │ -class  Dune::Functions::RaviartThomasNode<_GV,_k_> │ │ │ │ │ +class  Dune::Functions::DefaultGlobalBasis<_PB_> │ │ │ │ │ +  Global basis for given pre-basis. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions::BasisFactory │ │ │ │ │   │ │ │ │ │ - Typedefs │ │ │ │ │ -template │ │ │ │ │ -using Dune::Functions::RaviartThomasBasis = DefaultGlobalBasis< │ │ │ │ │ - RaviartThomasPreBasis< GV, k > > │ │ │ │ │ -  Basis of a k-th-order Raviart Thomas finite element space. More... │ │ │ │ │ +namespace  Dune::Functions::BasisBuilder │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::BasisFactory::raviartThomas () │ │ │ │ │ -  Create a pre-basis factory that can create a Raviart-Thomas pre-basis. │ │ │ │ │ - More... │ │ │ │ │ +template │ │ │ │ │ +  Dune::Functions::DefaultGlobalBasis (PreBasis &&) -> DefaultGlobalBasis< │ │ │ │ │ + std::decay_t< PreBasis > > │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +  Dune::Functions::DefaultGlobalBasis (const GridView &gv, PreBasisFactory │ │ │ │ │ + &&f) -> DefaultGlobalBasis< std::decay_t< decltype(f(gv))> > │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::BasisFactory::makeBasis (const GridView &gridView, │ │ │ │ │ + PreBasisFactory &&preBasisFactory) │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00149_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: raviartthomasbasis.hh Source File │ │ │ │ +dune-functions: defaultglobalbasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,445 +62,203 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
raviartthomasbasis.hh
│ │ │ │ +
defaultglobalbasis.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH
│ │ │ │
5
│ │ │ │ -
6#include <array>
│ │ │ │ -
7#include <dune/common/exceptions.hh>
│ │ │ │ -
8
│ │ │ │ -
9#include <dune/grid/common/capabilities.hh>
│ │ │ │ -
10#include <dune/grid/common/mcmgmapper.hh>
│ │ │ │ -
11
│ │ │ │ -
12#include <dune/localfunctions/common/localfiniteelementvariant.hh>
│ │ │ │ -
13#include <dune/localfunctions/raviartthomas.hh>
│ │ │ │ -
14#include <dune/localfunctions/raviartthomas/raviartthomas0cube2d.hh>
│ │ │ │ -
15#include <dune/localfunctions/raviartthomas/raviartthomas0cube3d.hh>
│ │ │ │ -
16#include <dune/localfunctions/raviartthomas/raviartthomas02d.hh>
│ │ │ │ -
17#include <dune/localfunctions/raviartthomas/raviartthomas03d.hh>
│ │ │ │ -
18#include <dune/localfunctions/raviartthomas/raviartthomas1cube2d.hh>
│ │ │ │ -
19#include <dune/localfunctions/raviartthomas/raviartthomas1cube3d.hh>
│ │ │ │ -
20#include <dune/localfunctions/raviartthomas/raviartthomas12d.hh>
│ │ │ │ -
21#include <dune/localfunctions/raviartthomas/raviartthomas2cube2d.hh>
│ │ │ │ +
6#include <cstddef>
│ │ │ │ +
7#include <type_traits>
│ │ │ │ +
8#include <utility>
│ │ │ │ +
9
│ │ │ │ +
10#include <dune/common/reservedvector.hh>
│ │ │ │ +
11#include <dune/common/typeutilities.hh>
│ │ │ │ +
12#include <dune/common/concept.hh>
│ │ │ │ +
13
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
17
│ │ │ │ +
18
│ │ │ │ +
19
│ │ │ │ +
20namespace Dune {
│ │ │ │ +
21namespace Functions {
│ │ │ │
22
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
26
│ │ │ │ -
27namespace Dune {
│ │ │ │ -
28namespace Functions {
│ │ │ │ -
29
│ │ │ │ -
30namespace Impl {
│ │ │ │ -
31
│ │ │ │ -
32 template<int dim, typename D, typename R, std::size_t k>
│ │ │ │ -
33 struct RaviartThomasSimplexLocalInfo
│ │ │ │ -
34 {
│ │ │ │ -
35 // Dummy type, must be something that we can have a std::unique_ptr to
│ │ │ │ -
36 using FiniteElement = void*;
│ │ │ │ -
37 };
│ │ │ │ -
38
│ │ │ │ -
39 template<typename D, typename R>
│ │ │ │ -
40 struct RaviartThomasSimplexLocalInfo<2,D,R,0>
│ │ │ │ -
41 {
│ │ │ │ -
42 using FiniteElement = RT02DLocalFiniteElement<D,R>;
│ │ │ │ -
43 };
│ │ │ │ -
44
│ │ │ │ -
45 template<typename D, typename R>
│ │ │ │ -
46 struct RaviartThomasSimplexLocalInfo<2,D,R,1>
│ │ │ │ -
47 {
│ │ │ │ -
48 using FiniteElement = RT12DLocalFiniteElement<D,R>;
│ │ │ │ -
49 };
│ │ │ │ -
50
│ │ │ │ -
51 template<typename D, typename R>
│ │ │ │ -
52 struct RaviartThomasSimplexLocalInfo<3,D,R,0>
│ │ │ │ -
53 {
│ │ │ │ -
54 using FiniteElement = RT03DLocalFiniteElement<D,R>;
│ │ │ │ -
55 };
│ │ │ │ -
56
│ │ │ │ -
57 template<int dim, typename D, typename R, std::size_t k>
│ │ │ │ -
58 struct RaviartThomasCubeLocalInfo
│ │ │ │ -
59 {
│ │ │ │ -
60 // Dummy type, must be something that we can have a std::unique_ptr to
│ │ │ │ -
61 using FiniteElement = void*;
│ │ │ │ -
62 };
│ │ │ │ -
63
│ │ │ │ -
64 template<typename D, typename R>
│ │ │ │ -
65 struct RaviartThomasCubeLocalInfo<2,D,R,0>
│ │ │ │ -
66 {
│ │ │ │ -
67 using FiniteElement = RT0Cube2DLocalFiniteElement<D,R>;
│ │ │ │ -
68 };
│ │ │ │ -
69
│ │ │ │ -
70 template<typename D, typename R>
│ │ │ │ -
71 struct RaviartThomasCubeLocalInfo<2,D,R,1>
│ │ │ │ -
72 {
│ │ │ │ -
73 using FiniteElement = RT1Cube2DLocalFiniteElement<D,R>;
│ │ │ │ -
74 };
│ │ │ │ -
75
│ │ │ │ -
76 template<typename D, typename R>
│ │ │ │ -
77 struct RaviartThomasCubeLocalInfo<2,D,R,2>
│ │ │ │ -
78 {
│ │ │ │ -
79 using FiniteElement = RT2Cube2DLocalFiniteElement<D,R>;
│ │ │ │ -
80 };
│ │ │ │ -
81
│ │ │ │ -
82 template<typename D, typename R>
│ │ │ │ -
83 struct RaviartThomasCubeLocalInfo<3,D,R,0>
│ │ │ │ -
84 {
│ │ │ │ -
85 using FiniteElement = RT0Cube3DLocalFiniteElement<D,R>;
│ │ │ │ -
86 };
│ │ │ │ -
87
│ │ │ │ -
88 template<typename D, typename R>
│ │ │ │ -
89 struct RaviartThomasCubeLocalInfo<3,D,R,1>
│ │ │ │ -
90 {
│ │ │ │ -
91 using FiniteElement = RT1Cube3DLocalFiniteElement<D,R>;
│ │ │ │ -
92 };
│ │ │ │ -
93
│ │ │ │ -
94 template<typename GV, int dim, typename R, std::size_t k>
│ │ │ │ -
95 class RaviartThomasLocalFiniteElementMap
│ │ │ │ -
96 {
│ │ │ │ -
97 using D = typename GV::ctype;
│ │ │ │ -
98 constexpr static bool hasFixedElementType = Capabilities::hasSingleGeometryType<typename GV::Grid>::v;
│ │ │ │ -
99
│ │ │ │ -
100 using CubeFiniteElement = typename RaviartThomasCubeLocalInfo<dim, D, R, k>::FiniteElement;
│ │ │ │ -
101 using SimplexFiniteElement = typename RaviartThomasSimplexLocalInfo<dim, D, R, k>::FiniteElement;
│ │ │ │ -
102
│ │ │ │ -
103 public:
│ │ │ │ -
104
│ │ │ │ -
105 using T = LocalBasisTraits<D, dim, FieldVector<D,dim>, R, dim, FieldVector<R,dim>, FieldMatrix<D,dim,dim> >;
│ │ │ │ -
106
│ │ │ │ -
107 constexpr static unsigned int topologyId = Capabilities::hasSingleGeometryType<typename GV::Grid>::topologyId; // meaningless if hasFixedElementType is false
│ │ │ │ -
108 constexpr static GeometryType type = GeometryType(topologyId, GV::dimension);
│ │ │ │ -
109
│ │ │ │ -
110 using FiniteElement = std::conditional_t<hasFixedElementType,
│ │ │ │ -
111 std::conditional_t<type.isCube(),CubeFiniteElement,SimplexFiniteElement>,
│ │ │ │ -
112 LocalFiniteElementVariant<CubeFiniteElement, SimplexFiniteElement> >;
│ │ │ │ -
113
│ │ │ │ -
114 // Each element facet can have its orientation reversed, hence there are
│ │ │ │ -
115 // 2^#facets different variants.
│ │ │ │ -
116 static std::size_t numVariants(GeometryType type)
│ │ │ │ -
117 {
│ │ │ │ -
118 auto numFacets = referenceElement<D,dim>(type).size(1);
│ │ │ │ -
119 return power(2,numFacets);
│ │ │ │ -
120 }
│ │ │ │ -
121
│ │ │ │ -
122 RaviartThomasLocalFiniteElementMap(const GV& gv)
│ │ │ │ -
123 : elementMapper_(gv, mcmgElementLayout()),
│ │ │ │ -
124 orient_(gv.size(0))
│ │ │ │ -
125 {
│ │ │ │ -
126 if constexpr (hasFixedElementType)
│ │ │ │ -
127 {
│ │ │ │ -
128 variants_.resize(numVariants(type));
│ │ │ │ -
129 for (size_t i = 0; i < numVariants(type); i++)
│ │ │ │ -
130 variants_[i] = FiniteElement(i);
│ │ │ │ -
131 }
│ │ │ │ -
132 else
│ │ │ │ -
133 {
│ │ │ │ -
134 // for mixed grids add offset for cubes
│ │ │ │ -
135 variants_.resize(numVariants(GeometryTypes::simplex(dim)) + numVariants(GeometryTypes::cube(dim)));
│ │ │ │ -
136 for (size_t i = 0; i < numVariants(GeometryTypes::simplex(dim)); i++)
│ │ │ │ -
137 variants_[i] = SimplexFiniteElement(i);
│ │ │ │ -
138 for (size_t i = 0; i < numVariants(GeometryTypes::cube(dim)); i++)
│ │ │ │ -
139 variants_[i + numVariants(GeometryTypes::simplex(dim))] = CubeFiniteElement(i);
│ │ │ │ -
140 }
│ │ │ │ +
23
│ │ │ │ +
24
│ │ │ │ +
44template<class PB>
│ │ │ │ + │ │ │ │ +
46{
│ │ │ │ +
47
│ │ │ │ +
48public:
│ │ │ │ +
49
│ │ │ │ +
51 using PreBasis = PB;
│ │ │ │ +
52
│ │ │ │ +
54 using PrefixPath = TypeTree::HybridTreePath<>;
│ │ │ │ +
55
│ │ │ │ +
57 using GridView = typename PreBasis::GridView;
│ │ │ │ +
58
│ │ │ │ +
60 using size_type = std::size_t;
│ │ │ │ +
61
│ │ │ │ + │ │ │ │ +
64
│ │ │ │ + │ │ │ │ +
67
│ │ │ │ +
69 using SizePrefix = Dune::ReservedVector<std::size_t, PreBasis::multiIndexBufferSize>;
│ │ │ │ +
70
│ │ │ │ +
79 template<class... T,
│ │ │ │ +
80 disableCopyMove<DefaultGlobalBasis, T...> = 0,
│ │ │ │ + │ │ │ │ + │ │ │ │ +
83 preBasis_(std::forward<T>(t)...),
│ │ │ │ + │ │ │ │ +
85 {
│ │ │ │ +
86 static_assert(models<Concept::PreBasis<GridView>, PreBasis>(), "Type passed to DefaultGlobalBasis does not model the PreBasis concept.");
│ │ │ │ +
87 preBasis_.initializeIndices();
│ │ │ │ +
88 }
│ │ │ │ +
89
│ │ │ │ +
96 template<class PreBasisFactory,
│ │ │ │ +
97 std::enable_if_t<Dune::IsCallable<PreBasisFactory(GridView), PreBasis>::value, int> = 0>
│ │ │ │ +
98 DefaultGlobalBasis(const GridView& gridView, PreBasisFactory&& factory) :
│ │ │ │ +
99 preBasis_(factory(gridView)),
│ │ │ │ + │ │ │ │ +
101 {
│ │ │ │ +
102 static_assert(models<Concept::PreBasis<GridView>, PreBasis>(), "Type passed to DefaultGlobalBasis does not model the PreBasis concept.");
│ │ │ │ +
103 preBasis_.initializeIndices();
│ │ │ │ +
104 }
│ │ │ │ +
105
│ │ │ │ +
107 const GridView& gridView() const
│ │ │ │ +
108 {
│ │ │ │ +
109 return preBasis_.gridView();
│ │ │ │ +
110 }
│ │ │ │ +
111
│ │ │ │ +
113 const PreBasis& preBasis() const
│ │ │ │ +
114 {
│ │ │ │ +
115 return preBasis_;
│ │ │ │ +
116 }
│ │ │ │ +
117
│ │ │ │ + │ │ │ │ +
120 {
│ │ │ │ +
121 return preBasis_;
│ │ │ │ +
122 }
│ │ │ │ +
123
│ │ │ │ +
130 void update(const GridView & gv)
│ │ │ │ +
131 {
│ │ │ │ +
132 preBasis_.update(gv);
│ │ │ │ +
133 preBasis_.initializeIndices();
│ │ │ │ +
134 }
│ │ │ │ +
135
│ │ │ │ + │ │ │ │ +
138 {
│ │ │ │ +
139 return preBasis_.dimension();
│ │ │ │ +
140 }
│ │ │ │
141
│ │ │ │ -
142 for(const auto& cell : elements(gv))
│ │ │ │ -
143 {
│ │ │ │ -
144 unsigned int myId = elementMapper_.index(cell);
│ │ │ │ -
145 orient_[myId] = 0;
│ │ │ │ -
146
│ │ │ │ -
147 for (const auto& intersection : intersections(gv,cell))
│ │ │ │ -
148 {
│ │ │ │ -
149 if (intersection.neighbor() && (elementMapper_.index(intersection.outside()) > myId))
│ │ │ │ -
150 orient_[myId] |= (1 << intersection.indexInInside());
│ │ │ │ -
151 }
│ │ │ │ -
152
│ │ │ │ -
153 // for mixed grids add offset for cubes
│ │ │ │ -
154 if constexpr (!hasFixedElementType)
│ │ │ │ -
155 if (cell.type().isCube())
│ │ │ │ -
156 orient_[myId] += numVariants(GeometryTypes::simplex(dim));
│ │ │ │ -
157 }
│ │ │ │ -
158 }
│ │ │ │ + │ │ │ │ +
144 {
│ │ │ │ +
145 return preBasis_.size();
│ │ │ │ +
146 }
│ │ │ │ +
147
│ │ │ │ +
149 size_type size(const SizePrefix& prefix) const
│ │ │ │ +
150 {
│ │ │ │ +
151 return preBasis_.size(prefix);
│ │ │ │ +
152 }
│ │ │ │ +
153
│ │ │ │ + │ │ │ │ +
156 {
│ │ │ │ +
157 return LocalView(*this);
│ │ │ │ +
158 }
│ │ │ │
159
│ │ │ │ -
160 template<class EntityType>
│ │ │ │ -
161 const FiniteElement& find(const EntityType& e) const
│ │ │ │ -
162 {
│ │ │ │ -
163 return variants_[orient_[elementMapper_.index(e)]];
│ │ │ │ -
164 }
│ │ │ │ + │ │ │ │ +
162 {
│ │ │ │ +
163 return *this;
│ │ │ │ +
164 }
│ │ │ │
165
│ │ │ │ -
166 private:
│ │ │ │ -
167 std::vector<FiniteElement> variants_;
│ │ │ │ -
168 const Dune::MultipleCodimMultipleGeomTypeMapper<GV> elementMapper_;
│ │ │ │ -
169 std::vector<unsigned char> orient_;
│ │ │ │ -
170 };
│ │ │ │ +
167 const PrefixPath& prefixPath() const
│ │ │ │ +
168 {
│ │ │ │ +
169 return prefixPath_;
│ │ │ │ +
170 }
│ │ │ │
171
│ │ │ │ -
172
│ │ │ │ -
173} // namespace Impl
│ │ │ │ -
174
│ │ │ │ -
175
│ │ │ │ -
176// *****************************************************************************
│ │ │ │ -
177// This is the reusable part of the basis. It contains
│ │ │ │ -
178//
│ │ │ │ -
179// RaviartThomasPreBasis
│ │ │ │ -
180// RaviartThomasNode
│ │ │ │ -
181//
│ │ │ │ -
182// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ -
183// state. These components do _not_ depend on the global basis and local view
│ │ │ │ -
184// and can be used without a global basis.
│ │ │ │ -
185// *****************************************************************************
│ │ │ │ +
172protected:
│ │ │ │ + │ │ │ │ + │ │ │ │ +
175};
│ │ │ │ +
176
│ │ │ │ +
177
│ │ │ │ +
178
│ │ │ │ +
179template<class PreBasis>
│ │ │ │ + │ │ │ │ +
181
│ │ │ │ +
182template<class GridView, class PreBasisFactory>
│ │ │ │ +
183DefaultGlobalBasis(const GridView& gv, PreBasisFactory&& f) -> DefaultGlobalBasis<std::decay_t<decltype(f(gv))>>;
│ │ │ │ +
184
│ │ │ │ +
185
│ │ │ │
186
│ │ │ │ -
187template<typename GV, int k>
│ │ │ │ -
188class RaviartThomasNode;
│ │ │ │ -
189
│ │ │ │ -
190template<typename GV, int k>
│ │ │ │ - │ │ │ │ -
192{
│ │ │ │ -
193 static const int dim = GV::dimension;
│ │ │ │ -
194 using FiniteElementMap = typename Impl::RaviartThomasLocalFiniteElementMap<GV, dim, double, k>;
│ │ │ │ -
195
│ │ │ │ -
196public:
│ │ │ │ -
197
│ │ │ │ -
199 using GridView = GV;
│ │ │ │ -
200 using size_type = std::size_t;
│ │ │ │ +
187namespace BasisFactory {
│ │ │ │ +
188
│ │ │ │ +
189template<class GridView, class PreBasisFactory>
│ │ │ │ +
190auto makeBasis(const GridView& gridView, PreBasisFactory&& preBasisFactory)
│ │ │ │ +
191{
│ │ │ │ +
192 return DefaultGlobalBasis(preBasisFactory(gridView));
│ │ │ │ +
193}
│ │ │ │ +
194
│ │ │ │ +
195} // end namespace BasisFactory
│ │ │ │ +
196
│ │ │ │ +
197// Backward compatibility
│ │ │ │ +
198namespace BasisBuilder {
│ │ │ │ +
199
│ │ │ │ +
200 using namespace BasisFactory;
│ │ │ │
201
│ │ │ │ - │ │ │ │ +
202}
│ │ │ │
203
│ │ │ │ -
204 static constexpr size_type maxMultiIndexSize = 1;
│ │ │ │ -
205 static constexpr size_type minMultiIndexSize = 1;
│ │ │ │ -
206 static constexpr size_type multiIndexBufferSize = 1;
│ │ │ │ +
204
│ │ │ │ +
205} // end namespace Functions
│ │ │ │ +
206} // end namespace Dune
│ │ │ │
207
│ │ │ │ - │ │ │ │ -
210 gridView_(gv),
│ │ │ │ - │ │ │ │ -
212 {
│ │ │ │ -
213 // Currently there are some unresolved bugs with hybrid grids and higher order Raviart-Thomas elements
│ │ │ │ -
214 if (gv.indexSet().types(0).size() > 1 and k>0)
│ │ │ │ -
215 DUNE_THROW(Dune::NotImplemented, "Raviart-Thomas basis with index k>0 is only implemented for grids with a single element type");
│ │ │ │ -
216
│ │ │ │ -
217 for(auto type : gv.indexSet().types(0))
│ │ │ │ -
218 if (!type.isSimplex() && !type.isCube())
│ │ │ │ -
219 DUNE_THROW(Dune::NotImplemented, "Raviart-Thomas elements are only implemented for grids with simplex or cube elements.");
│ │ │ │ -
220
│ │ │ │ -
221 GeometryType type = gv.template begin<0>()->type();
│ │ │ │ -
222 const static int dofsPerElement = type.isCube() ? ((dim == 2) ? k*(k+1)*dim : k*(k+1)*(k+1)*dim) : k*dim;
│ │ │ │ -
223 const static int dofsPerFace = type.isCube() ? (dim-2)*2*k+k+1 : (dim-1)*k+1 ;
│ │ │ │ -
224
│ │ │ │ -
225 dofsPerCodim_ = {{dofsPerElement, dofsPerFace}};
│ │ │ │ -
226 }
│ │ │ │ -
227
│ │ │ │ - │ │ │ │ -
229 {
│ │ │ │ -
230 codimOffset_[0] = 0;
│ │ │ │ -
231 codimOffset_[1] = codimOffset_[0] + dofsPerCodim_[0] * gridView_.size(0);
│ │ │ │ -
232 }
│ │ │ │ -
233
│ │ │ │ -
236 const GridView& gridView() const
│ │ │ │ -
237 {
│ │ │ │ -
238 return gridView_;
│ │ │ │ -
239 }
│ │ │ │ -
240
│ │ │ │ -
241 /* \brief Update the stored grid view, to be called if the grid has changed */
│ │ │ │ -
242 void update (const GridView& gv)
│ │ │ │ -
243 {
│ │ │ │ -
244 gridView_ = gv;
│ │ │ │ -
245 }
│ │ │ │ -
246
│ │ │ │ - │ │ │ │ -
251 {
│ │ │ │ -
252 return Node{&finiteElementMap_};
│ │ │ │ -
253 }
│ │ │ │ -
254
│ │ │ │ - │ │ │ │ -
256 {
│ │ │ │ -
257 return dofsPerCodim_[0] * gridView_.size(0) + dofsPerCodim_[1] * gridView_.size(1);
│ │ │ │ -
258 }
│ │ │ │ -
259
│ │ │ │ -
261 template<class SizePrefix>
│ │ │ │ -
262 size_type size(const SizePrefix& prefix) const
│ │ │ │ -
263 {
│ │ │ │ -
264 assert(prefix.size() == 0 || prefix.size() == 1);
│ │ │ │ -
265 return (prefix.size() == 0) ? size() : 0;
│ │ │ │ -
266 }
│ │ │ │ -
267
│ │ │ │ - │ │ │ │ -
270 {
│ │ │ │ -
271 return size();
│ │ │ │ -
272 }
│ │ │ │ -
273
│ │ │ │ - │ │ │ │ -
275 {
│ │ │ │ -
276 size_type result = 0;
│ │ │ │ -
277 for (auto&& type : gridView_.indexSet().types(0))
│ │ │ │ -
278 {
│ │ │ │ -
279 size_t numFaces = ReferenceElements<double,dim>::general(type).size(1);
│ │ │ │ -
280 const static int dofsPerElement = type.isCube() ? ((dim == 2) ? k*(k+1)*dim : k*(k+1)*(k+1)*dim) : k*dim;
│ │ │ │ -
281 const static int dofsPerFace = type.isCube() ? (dim-2)*2*k+k+1 : (dim-1)*k+1 ;
│ │ │ │ -
282 result = std::max(result, dofsPerElement + dofsPerFace * numFaces);
│ │ │ │ -
283 }
│ │ │ │ -
284
│ │ │ │ -
285 return result;
│ │ │ │ -
286 }
│ │ │ │ -
287
│ │ │ │ -
293 template<typename It>
│ │ │ │ -
294 It indices(const Node& node, It it) const
│ │ │ │ -
295 {
│ │ │ │ -
296 const auto& gridIndexSet = gridView().indexSet();
│ │ │ │ -
297 const auto& element = node.element();
│ │ │ │ -
298
│ │ │ │ -
299 // throw if Element is not of predefined type
│ │ │ │ -
300 if (not(element.type().isCube()) and not(element.type().isSimplex()))
│ │ │ │ -
301 DUNE_THROW(Dune::NotImplemented, "RaviartThomasBasis only implemented for cube and simplex elements.");
│ │ │ │ -
302
│ │ │ │ -
303 for(std::size_t i=0, end=node.size(); i<end; ++i, ++it)
│ │ │ │ -
304 {
│ │ │ │ -
305 Dune::LocalKey localKey = node.finiteElement().localCoefficients().localKey(i);
│ │ │ │ -
306
│ │ │ │ -
307 // The dimension of the entity that the current dof is related to
│ │ │ │ -
308 size_t subentity = localKey.subEntity();
│ │ │ │ -
309 size_t codim = localKey.codim();
│ │ │ │ -
310
│ │ │ │ -
311 if (not(codim==0 or codim==1))
│ │ │ │ -
312 DUNE_THROW(Dune::NotImplemented, "Grid contains elements not supported for the RaviartThomasBasis");
│ │ │ │ -
313
│ │ │ │ -
314 *it = { codimOffset_[codim] +
│ │ │ │ -
315 dofsPerCodim_[codim] * gridIndexSet.subIndex(element, subentity, codim) + localKey.index() };
│ │ │ │ -
316 }
│ │ │ │ -
317
│ │ │ │ -
318 return it;
│ │ │ │ -
319 }
│ │ │ │ -
320
│ │ │ │ -
321protected:
│ │ │ │ - │ │ │ │ -
323 std::array<size_t,dim+1> codimOffset_;
│ │ │ │ -
324 FiniteElementMap finiteElementMap_;
│ │ │ │ -
325 // Number of dofs per entity type depending on the entity's codimension and type
│ │ │ │ -
326 std::array<int,dim+1> dofsPerCodim_;
│ │ │ │ -
327};
│ │ │ │ -
328
│ │ │ │ -
329
│ │ │ │ -
330
│ │ │ │ -
331template<typename GV, int k>
│ │ │ │ - │ │ │ │ -
333 public LeafBasisNode
│ │ │ │ -
334{
│ │ │ │ -
335 static const int dim = GV::dimension;
│ │ │ │ -
336
│ │ │ │ -
337public:
│ │ │ │ -
338
│ │ │ │ -
339 using size_type = std::size_t;
│ │ │ │ -
340 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ -
341 using FiniteElementMap = typename Impl::RaviartThomasLocalFiniteElementMap<GV, dim, double, k>;
│ │ │ │ -
342 using FiniteElement = Impl::GlobalValuedLocalFiniteElement<Impl::ContravariantPiolaTransformator,
│ │ │ │ -
343 typename FiniteElementMap::FiniteElement,
│ │ │ │ -
344 Element>;
│ │ │ │ -
345
│ │ │ │ -
346 RaviartThomasNode(const FiniteElementMap* finiteElementMap) :
│ │ │ │ -
347 element_(nullptr),
│ │ │ │ -
348 finiteElementMap_(finiteElementMap)
│ │ │ │ -
349 { }
│ │ │ │ -
350
│ │ │ │ -
352 const Element& element() const
│ │ │ │ -
353 {
│ │ │ │ -
354 return *element_;
│ │ │ │ -
355 }
│ │ │ │ -
356
│ │ │ │ - │ │ │ │ -
362 {
│ │ │ │ -
363 return finiteElement_;
│ │ │ │ -
364 }
│ │ │ │ -
365
│ │ │ │ -
367 void bind(const Element& e)
│ │ │ │ -
368 {
│ │ │ │ -
369 element_ = &e;
│ │ │ │ -
370 finiteElement_.bind((finiteElementMap_->find(*element_)), e);
│ │ │ │ -
371 this->setSize(finiteElement_.size());
│ │ │ │ -
372 }
│ │ │ │ -
373
│ │ │ │ -
374protected:
│ │ │ │ -
375
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
379};
│ │ │ │ -
380
│ │ │ │ -
381namespace BasisFactory {
│ │ │ │ -
382
│ │ │ │ -
390template<std::size_t k>
│ │ │ │ - │ │ │ │ -
392{
│ │ │ │ -
393 return [](const auto& gridView) {
│ │ │ │ -
394 return RaviartThomasPreBasis<std::decay_t<decltype(gridView)>, k>(gridView);
│ │ │ │ -
395 };
│ │ │ │ -
396}
│ │ │ │ -
397
│ │ │ │ -
398} // end namespace BasisFactory
│ │ │ │ -
399
│ │ │ │ -
400
│ │ │ │ -
401
│ │ │ │ -
402// *****************************************************************************
│ │ │ │ -
403// This is the actual global basis implementation based on the reusable parts.
│ │ │ │ -
404// *****************************************************************************
│ │ │ │ -
405
│ │ │ │ -
413template<typename GV, int k>
│ │ │ │ - │ │ │ │ -
415
│ │ │ │ -
416} // end namespace Functions
│ │ │ │ -
417} // end namespace Dune
│ │ │ │ -
418
│ │ │ │ -
419
│ │ │ │ -
420#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
auto power(ChildPreBasisFactory &&childPreBasisFactory, const IndexMergingStrategy &)
Create a pre-basis factory that can build a PowerPreBasis.
Definition: powerbasis.hh:369
│ │ │ │ -
auto raviartThomas()
Create a pre-basis factory that can create a Raviart-Thomas pre-basis.
Definition: raviartthomasbasis.hh:391
│ │ │ │ +
208
│ │ │ │ +
209
│ │ │ │ +
210#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ +
typename std::enable_if< std::is_constructible< T, Args... >::value, int >::type enableIfConstructible
Helper to constrain forwarding constructors.
Definition: type_traits.hh:26
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ +
DefaultGlobalBasis(PreBasis &&) -> DefaultGlobalBasis< std::decay_t< PreBasis > >
│ │ │ │ +
auto makeBasis(const GridView &gridView, PreBasisFactory &&preBasisFactory)
Definition: defaultglobalbasis.hh:190
│ │ │ │
Global basis for given pre-basis.
Definition: defaultglobalbasis.hh:46
│ │ │ │ -
size_type size() const
Definition: nodes.hh:142
│ │ │ │ -
std::size_t size_type
Definition: nodes.hh:128
│ │ │ │ -
void setSize(const size_type size)
Definition: nodes.hh:164
│ │ │ │ -
Definition: nodes.hh:186
│ │ │ │ -
Definition: raviartthomasbasis.hh:334
│ │ │ │ -
typename Impl::RaviartThomasLocalFiniteElementMap< GV, dim, double, k > FiniteElementMap
Definition: raviartthomasbasis.hh:341
│ │ │ │ -
void bind(const Element &e)
Bind to element.
Definition: raviartthomasbasis.hh:367
│ │ │ │ -
Impl::GlobalValuedLocalFiniteElement< Impl::ContravariantPiolaTransformator, typename FiniteElementMap::FiniteElement, Element > FiniteElement
Definition: raviartthomasbasis.hh:344
│ │ │ │ -
typename GV::template Codim< 0 >::Entity Element
Definition: raviartthomasbasis.hh:340
│ │ │ │ -
const Element * element_
Definition: raviartthomasbasis.hh:377
│ │ │ │ -
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition: raviartthomasbasis.hh:361
│ │ │ │ -
RaviartThomasNode(const FiniteElementMap *finiteElementMap)
Definition: raviartthomasbasis.hh:346
│ │ │ │ -
const Element & element() const
Return current element, throw if unbound.
Definition: raviartthomasbasis.hh:352
│ │ │ │ -
FiniteElement finiteElement_
Definition: raviartthomasbasis.hh:376
│ │ │ │ -
const FiniteElementMap * finiteElementMap_
Definition: raviartthomasbasis.hh:378
│ │ │ │ -
Definition: raviartthomasbasis.hh:192
│ │ │ │ -
static constexpr size_type minMultiIndexSize
Definition: raviartthomasbasis.hh:205
│ │ │ │ -
static constexpr size_type maxMultiIndexSize
Definition: raviartthomasbasis.hh:204
│ │ │ │ -
Node makeNode() const
Create tree node.
Definition: raviartthomasbasis.hh:250
│ │ │ │ -
std::array< int, dim+1 > dofsPerCodim_
Definition: raviartthomasbasis.hh:326
│ │ │ │ -
void update(const GridView &gv)
Definition: raviartthomasbasis.hh:242
│ │ │ │ -
RaviartThomasPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition: raviartthomasbasis.hh:209
│ │ │ │ -
std::size_t size_type
Definition: raviartthomasbasis.hh:200
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: raviartthomasbasis.hh:236
│ │ │ │ -
It indices(const Node &node, It it) const
Maps from subtree index set [0..size-1] to a globally unique multi index in global basis.
Definition: raviartthomasbasis.hh:294
│ │ │ │ -
static constexpr size_type multiIndexBufferSize
Definition: raviartthomasbasis.hh:206
│ │ │ │ -
FiniteElementMap finiteElementMap_
Definition: raviartthomasbasis.hh:324
│ │ │ │ -
size_type size() const
Definition: raviartthomasbasis.hh:255
│ │ │ │ -
size_type dimension() const
Definition: raviartthomasbasis.hh:269
│ │ │ │ -
GV GridView
The grid view that the FE space is defined on.
Definition: raviartthomasbasis.hh:199
│ │ │ │ -
size_type maxNodeSize() const
Definition: raviartthomasbasis.hh:274
│ │ │ │ -
GridView gridView_
Definition: raviartthomasbasis.hh:322
│ │ │ │ -
size_type size(const SizePrefix &prefix) const
Return number possible values for next position in multi index.
Definition: raviartthomasbasis.hh:262
│ │ │ │ -
void initializeIndices()
Definition: raviartthomasbasis.hh:228
│ │ │ │ -
std::array< size_t, dim+1 > codimOffset_
Definition: raviartthomasbasis.hh:323
│ │ │ │ +
Dune::ReservedVector< std::size_t, PreBasis::multiIndexBufferSize > SizePrefix
Type used for prefixes handed to the size() method.
Definition: defaultglobalbasis.hh:69
│ │ │ │ +
std::size_t size_type
Type used for indices and size information.
Definition: defaultglobalbasis.hh:60
│ │ │ │ +
typename PreBasis::GridView GridView
The grid view that the FE space is defined on.
Definition: defaultglobalbasis.hh:57
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: defaultglobalbasis.hh:107
│ │ │ │ +
PB PreBasis
Pre-basis providing the implementation details.
Definition: defaultglobalbasis.hh:51
│ │ │ │ +
PreBasis & preBasis()
Obtain the pre-basis providing the implementation details.
Definition: defaultglobalbasis.hh:119
│ │ │ │ +
void update(const GridView &gv)
Update the stored grid view.
Definition: defaultglobalbasis.hh:130
│ │ │ │ +
DefaultLocalView< DefaultGlobalBasis< PreBasis > > LocalView
Type of the local view on the restriction of the basis to a single element.
Definition: defaultglobalbasis.hh:63
│ │ │ │ +
typename LocalView::MultiIndex MultiIndex
Type used for global numbering of the basis vectors.
Definition: defaultglobalbasis.hh:66
│ │ │ │ +
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition: defaultglobalbasis.hh:149
│ │ │ │ +
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition: defaultglobalbasis.hh:137
│ │ │ │ +
PreBasis preBasis_
Definition: defaultglobalbasis.hh:173
│ │ │ │ +
LocalView localView() const
Return local view for basis.
Definition: defaultglobalbasis.hh:155
│ │ │ │ +
TypeTree::HybridTreePath<> PrefixPath
The empty prefix path that identifies the root in the local ansatz tree.
Definition: defaultglobalbasis.hh:54
│ │ │ │ +
DefaultGlobalBasis(T &&... t)
Constructor.
Definition: defaultglobalbasis.hh:82
│ │ │ │ +
DefaultGlobalBasis(const GridView &gridView, PreBasisFactory &&factory)
Constructor from a PreBasis factory.
Definition: defaultglobalbasis.hh:98
│ │ │ │ +
size_type size() const
Return number of possible values for next position in empty multi index.
Definition: defaultglobalbasis.hh:143
│ │ │ │ +
const PreBasis & preBasis() const
Obtain the pre-basis providing the implementation details.
Definition: defaultglobalbasis.hh:113
│ │ │ │ +
PrefixPath prefixPath_
Definition: defaultglobalbasis.hh:174
│ │ │ │ +
const DefaultGlobalBasis & rootBasis() const
Return *this because we are not embedded in a larger basis.
Definition: defaultglobalbasis.hh:161
│ │ │ │ +
const PrefixPath & prefixPath() const
Return empty path, because this is the root in the local ansatz tree.
Definition: defaultglobalbasis.hh:167
│ │ │ │ +
The restriction of a finite element basis to a single element.
Definition: defaultlocalview.hh:28
│ │ │ │ +
std::conditional_t<(PreBasis::minMultiIndexSize==PreBasis::maxMultiIndexSize), StaticMultiIndex< size_type, PreBasis::maxMultiIndexSize >, Dune::ReservedVector< size_type, PreBasis::multiIndexBufferSize > > MultiIndex
Type used for global numbering of the basis vectors.
Definition: defaultlocalview.hh:64
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,566 +5,283 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -raviartthomasbasis.hh │ │ │ │ │ +defaultglobalbasis.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ - 8 │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11 │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ - 16#include │ │ │ │ │ - 17#include │ │ │ │ │ - 18#include │ │ │ │ │ - 19#include │ │ │ │ │ - 20#include │ │ │ │ │ - 21#include │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8#include │ │ │ │ │ + 9 │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ + 13 │ │ │ │ │ + 14#include │ │ │ │ │ + 15#include │ │ │ │ │ + 16#include │ │ │ │ │ + 17 │ │ │ │ │ + 18 │ │ │ │ │ + 19 │ │ │ │ │ + 20namespace Dune { │ │ │ │ │ + 21namespace Functions { │ │ │ │ │ 22 │ │ │ │ │ - 23#include │ │ │ │ │ - 24#include │ │ │ │ │ - 25#include │ │ │ │ │ - 26 │ │ │ │ │ - 27namespace Dune { │ │ │ │ │ - 28namespace Functions { │ │ │ │ │ - 29 │ │ │ │ │ - 30namespace Impl { │ │ │ │ │ - 31 │ │ │ │ │ - 32 template │ │ │ │ │ - 33 struct RaviartThomasSimplexLocalInfo │ │ │ │ │ - 34 { │ │ │ │ │ - 35 // Dummy type, must be something that we can have a std::unique_ptr to │ │ │ │ │ - 36 using FiniteElement = void*; │ │ │ │ │ - 37 }; │ │ │ │ │ - 38 │ │ │ │ │ - 39 template │ │ │ │ │ - 40 struct RaviartThomasSimplexLocalInfo<2,D,R,0> │ │ │ │ │ - 41 { │ │ │ │ │ - 42 using FiniteElement = RT02DLocalFiniteElement; │ │ │ │ │ - 43 }; │ │ │ │ │ - 44 │ │ │ │ │ - 45 template │ │ │ │ │ - 46 struct RaviartThomasSimplexLocalInfo<2,D,R,1> │ │ │ │ │ - 47 { │ │ │ │ │ - 48 using FiniteElement = RT12DLocalFiniteElement; │ │ │ │ │ - 49 }; │ │ │ │ │ - 50 │ │ │ │ │ - 51 template │ │ │ │ │ - 52 struct RaviartThomasSimplexLocalInfo<3,D,R,0> │ │ │ │ │ - 53 { │ │ │ │ │ - 54 using FiniteElement = RT03DLocalFiniteElement; │ │ │ │ │ - 55 }; │ │ │ │ │ - 56 │ │ │ │ │ - 57 template │ │ │ │ │ - 58 struct RaviartThomasCubeLocalInfo │ │ │ │ │ - 59 { │ │ │ │ │ - 60 // Dummy type, must be something that we can have a std::unique_ptr to │ │ │ │ │ - 61 using FiniteElement = void*; │ │ │ │ │ - 62 }; │ │ │ │ │ - 63 │ │ │ │ │ - 64 template │ │ │ │ │ - 65 struct RaviartThomasCubeLocalInfo<2,D,R,0> │ │ │ │ │ - 66 { │ │ │ │ │ - 67 using FiniteElement = RT0Cube2DLocalFiniteElement; │ │ │ │ │ - 68 }; │ │ │ │ │ - 69 │ │ │ │ │ - 70 template │ │ │ │ │ - 71 struct RaviartThomasCubeLocalInfo<2,D,R,1> │ │ │ │ │ - 72 { │ │ │ │ │ - 73 using FiniteElement = RT1Cube2DLocalFiniteElement; │ │ │ │ │ - 74 }; │ │ │ │ │ - 75 │ │ │ │ │ - 76 template │ │ │ │ │ - 77 struct RaviartThomasCubeLocalInfo<2,D,R,2> │ │ │ │ │ - 78 { │ │ │ │ │ - 79 using FiniteElement = RT2Cube2DLocalFiniteElement; │ │ │ │ │ - 80 }; │ │ │ │ │ - 81 │ │ │ │ │ - 82 template │ │ │ │ │ - 83 struct RaviartThomasCubeLocalInfo<3,D,R,0> │ │ │ │ │ - 84 { │ │ │ │ │ - 85 using FiniteElement = RT0Cube3DLocalFiniteElement; │ │ │ │ │ - 86 }; │ │ │ │ │ - 87 │ │ │ │ │ - 88 template │ │ │ │ │ - 89 struct RaviartThomasCubeLocalInfo<3,D,R,1> │ │ │ │ │ - 90 { │ │ │ │ │ - 91 using FiniteElement = RT1Cube3DLocalFiniteElement; │ │ │ │ │ - 92 }; │ │ │ │ │ - 93 │ │ │ │ │ - 94 template │ │ │ │ │ - 95 class RaviartThomasLocalFiniteElementMap │ │ │ │ │ - 96 { │ │ │ │ │ - 97 using D = typename GV::ctype; │ │ │ │ │ - 98 constexpr static bool hasFixedElementType = Capabilities:: │ │ │ │ │ -hasSingleGeometryType::v; │ │ │ │ │ - 99 │ │ │ │ │ - 100 using CubeFiniteElement = typename RaviartThomasCubeLocalInfo::FiniteElement; │ │ │ │ │ - 101 using SimplexFiniteElement = typename RaviartThomasSimplexLocalInfo::FiniteElement; │ │ │ │ │ - 102 │ │ │ │ │ - 103 public: │ │ │ │ │ - 104 │ │ │ │ │ - 105 using T = LocalBasisTraits, R, dim, │ │ │ │ │ -FieldVector, FieldMatrix >; │ │ │ │ │ - 106 │ │ │ │ │ - 107 constexpr static unsigned int topologyId = Capabilities:: │ │ │ │ │ -hasSingleGeometryType::topologyId; // meaningless if │ │ │ │ │ -hasFixedElementType is false │ │ │ │ │ - 108 constexpr static GeometryType type = GeometryType(topologyId, GV:: │ │ │ │ │ -dimension); │ │ │ │ │ - 109 │ │ │ │ │ - 110 using FiniteElement = std::conditional_t, │ │ │ │ │ - 112 LocalFiniteElementVariant >; │ │ │ │ │ - 113 │ │ │ │ │ - 114 // Each element facet can have its orientation reversed, hence there are │ │ │ │ │ - 115 // 2^#facets different variants. │ │ │ │ │ - 116 static std::size_t numVariants(GeometryType type) │ │ │ │ │ - 117 { │ │ │ │ │ - 118 auto numFacets = referenceElement(type).size(1); │ │ │ │ │ - 119 return power(2,numFacets); │ │ │ │ │ - 120 } │ │ │ │ │ - 121 │ │ │ │ │ - 122 RaviartThomasLocalFiniteElementMap(const GV& gv) │ │ │ │ │ - 123 : elementMapper_(gv, mcmgElementLayout()), │ │ │ │ │ - 124 orient_(gv.size(0)) │ │ │ │ │ - 125 { │ │ │ │ │ - 126 if constexpr (hasFixedElementType) │ │ │ │ │ - 127 { │ │ │ │ │ - 128 variants_.resize(numVariants(type)); │ │ │ │ │ - 129 for (size_t i = 0; i < numVariants(type); i++) │ │ │ │ │ - 130 variants_[i] = FiniteElement(i); │ │ │ │ │ - 131 } │ │ │ │ │ - 132 else │ │ │ │ │ - 133 { │ │ │ │ │ - 134 // for mixed grids add offset for cubes │ │ │ │ │ - 135 variants_.resize(numVariants(GeometryTypes::simplex(dim)) + numVariants │ │ │ │ │ -(GeometryTypes::cube(dim))); │ │ │ │ │ - 136 for (size_t i = 0; i < numVariants(GeometryTypes::simplex(dim)); i++) │ │ │ │ │ - 137 variants_[i] = SimplexFiniteElement(i); │ │ │ │ │ - 138 for (size_t i = 0; i < numVariants(GeometryTypes::cube(dim)); i++) │ │ │ │ │ - 139 variants_[i + numVariants(GeometryTypes::simplex(dim))] = │ │ │ │ │ -CubeFiniteElement(i); │ │ │ │ │ + 23 │ │ │ │ │ + 24 │ │ │ │ │ + 44template │ │ │ │ │ +45class DefaultGlobalBasis │ │ │ │ │ + 46{ │ │ │ │ │ + 47 │ │ │ │ │ + 48public: │ │ │ │ │ + 49 │ │ │ │ │ +51 using PreBasis = PB; │ │ │ │ │ + 52 │ │ │ │ │ +54 using PrefixPath = TypeTree::HybridTreePath<>; │ │ │ │ │ + 55 │ │ │ │ │ +57 using GridView = typename PreBasis::GridView; │ │ │ │ │ + 58 │ │ │ │ │ +60 using size_type = std::size_t; │ │ │ │ │ + 61 │ │ │ │ │ +63 using LocalView = DefaultLocalView>; │ │ │ │ │ + 64 │ │ │ │ │ +66 using MultiIndex = typename LocalView::MultiIndex; │ │ │ │ │ + 67 │ │ │ │ │ +69 using SizePrefix = Dune::ReservedVector; │ │ │ │ │ + 70 │ │ │ │ │ + 79 template = 0, │ │ │ │ │ + 81 enableIfConstructible = 0> │ │ │ │ │ +82 DefaultGlobalBasis(T&&... t) : │ │ │ │ │ + 83 preBasis_(std::forward(t)...), │ │ │ │ │ + 84 prefixPath_() │ │ │ │ │ + 85 { │ │ │ │ │ + 86 static_assert(models, PreBasis>(), "Type passed │ │ │ │ │ +to DefaultGlobalBasis does not model the PreBasis concept."); │ │ │ │ │ + 87 preBasis_.initializeIndices(); │ │ │ │ │ + 88 } │ │ │ │ │ + 89 │ │ │ │ │ + 96 template:: │ │ │ │ │ +value, int> = 0> │ │ │ │ │ +98 DefaultGlobalBasis(const GridView& gridView, PreBasisFactory&& factory) : │ │ │ │ │ + 99 preBasis_(factory(gridView)), │ │ │ │ │ + 100 prefixPath_() │ │ │ │ │ + 101 { │ │ │ │ │ + 102 static_assert(models, PreBasis>(), "Type │ │ │ │ │ +passed to DefaultGlobalBasis does not model the PreBasis concept."); │ │ │ │ │ + 103 preBasis_.initializeIndices(); │ │ │ │ │ + 104 } │ │ │ │ │ + 105 │ │ │ │ │ +107 const GridView& gridView() const │ │ │ │ │ + 108 { │ │ │ │ │ + 109 return preBasis_.gridView(); │ │ │ │ │ + 110 } │ │ │ │ │ + 111 │ │ │ │ │ +113 const PreBasis& preBasis() const │ │ │ │ │ + 114 { │ │ │ │ │ + 115 return preBasis_; │ │ │ │ │ + 116 } │ │ │ │ │ + 117 │ │ │ │ │ +119 PreBasis& preBasis() │ │ │ │ │ + 120 { │ │ │ │ │ + 121 return preBasis_; │ │ │ │ │ + 122 } │ │ │ │ │ + 123 │ │ │ │ │ +130 void update(const GridView & gv) │ │ │ │ │ + 131 { │ │ │ │ │ + 132 preBasis_.update(gv); │ │ │ │ │ + 133 preBasis_.initializeIndices(); │ │ │ │ │ + 134 } │ │ │ │ │ + 135 │ │ │ │ │ +137 size_type dimension() const │ │ │ │ │ + 138 { │ │ │ │ │ + 139 return preBasis_.dimension(); │ │ │ │ │ 140 } │ │ │ │ │ 141 │ │ │ │ │ - 142 for(const auto& cell : elements(gv)) │ │ │ │ │ - 143 { │ │ │ │ │ - 144 unsigned int myId = elementMapper_.index(cell); │ │ │ │ │ - 145 orient_[myId] = 0; │ │ │ │ │ - 146 │ │ │ │ │ - 147 for (const auto& intersection : intersections(gv,cell)) │ │ │ │ │ - 148 { │ │ │ │ │ - 149 if (intersection.neighbor() && (elementMapper_.index(intersection.outside │ │ │ │ │ -()) > myId)) │ │ │ │ │ - 150 orient_[myId] |= (1 << intersection.indexInInside()); │ │ │ │ │ - 151 } │ │ │ │ │ - 152 │ │ │ │ │ - 153 // for mixed grids add offset for cubes │ │ │ │ │ - 154 if constexpr (!hasFixedElementType) │ │ │ │ │ - 155 if (cell.type().isCube()) │ │ │ │ │ - 156 orient_[myId] += numVariants(GeometryTypes::simplex(dim)); │ │ │ │ │ - 157 } │ │ │ │ │ +143 size_type size() const │ │ │ │ │ + 144 { │ │ │ │ │ + 145 return preBasis_.size(); │ │ │ │ │ + 146 } │ │ │ │ │ + 147 │ │ │ │ │ +149 size_type size(const SizePrefix& prefix) const │ │ │ │ │ + 150 { │ │ │ │ │ + 151 return preBasis_.size(prefix); │ │ │ │ │ + 152 } │ │ │ │ │ + 153 │ │ │ │ │ +155 LocalView localView() const │ │ │ │ │ + 156 { │ │ │ │ │ + 157 return LocalView(*this); │ │ │ │ │ 158 } │ │ │ │ │ 159 │ │ │ │ │ - 160 template │ │ │ │ │ - 161 const FiniteElement& find(const EntityType& e) const │ │ │ │ │ +161 const DefaultGlobalBasis& rootBasis() const │ │ │ │ │ 162 { │ │ │ │ │ - 163 return variants_[orient_[elementMapper_.index(e)]]; │ │ │ │ │ + 163 return *this; │ │ │ │ │ 164 } │ │ │ │ │ 165 │ │ │ │ │ - 166 private: │ │ │ │ │ - 167 std::vector variants_; │ │ │ │ │ - 168 const Dune::MultipleCodimMultipleGeomTypeMapper elementMapper_; │ │ │ │ │ - 169 std::vector orient_; │ │ │ │ │ - 170 }; │ │ │ │ │ +167 const PrefixPath& prefixPath() const │ │ │ │ │ + 168 { │ │ │ │ │ + 169 return prefixPath_; │ │ │ │ │ + 170 } │ │ │ │ │ 171 │ │ │ │ │ - 172 │ │ │ │ │ - 173} // namespace Impl │ │ │ │ │ - 174 │ │ │ │ │ - 175 │ │ │ │ │ - 176/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 177// This is the reusable part of the basis. It contains │ │ │ │ │ - 178// │ │ │ │ │ - 179// RaviartThomasPreBasis │ │ │ │ │ - 180// RaviartThomasNode │ │ │ │ │ - 181// │ │ │ │ │ - 182// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ -shared │ │ │ │ │ - 183// state. These components do _not_ depend on the global basis and local │ │ │ │ │ -view │ │ │ │ │ - 184// and can be used without a global basis. │ │ │ │ │ - 185/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ + 172protected: │ │ │ │ │ +173 PreBasis preBasis_; │ │ │ │ │ +174 PrefixPath prefixPath_; │ │ │ │ │ + 175}; │ │ │ │ │ + 176 │ │ │ │ │ + 177 │ │ │ │ │ + 178 │ │ │ │ │ + 179template │ │ │ │ │ +180DefaultGlobalBasis(PreBasis&&) -> DefaultGlobalBasis>; │ │ │ │ │ + 181 │ │ │ │ │ + 182template │ │ │ │ │ +183DefaultGlobalBasis(const GridView& gv, PreBasisFactory&& f) - │ │ │ │ │ +> DefaultGlobalBasis>; │ │ │ │ │ + 184 │ │ │ │ │ + 185 │ │ │ │ │ 186 │ │ │ │ │ - 187template │ │ │ │ │ - 188class RaviartThomasNode; │ │ │ │ │ - 189 │ │ │ │ │ - 190template │ │ │ │ │ -191class RaviartThomasPreBasis │ │ │ │ │ - 192{ │ │ │ │ │ - 193 static const int dim = GV::dimension; │ │ │ │ │ - 194 using FiniteElementMap = typename Impl:: │ │ │ │ │ -RaviartThomasLocalFiniteElementMap; │ │ │ │ │ - 195 │ │ │ │ │ - 196public: │ │ │ │ │ - 197 │ │ │ │ │ -199 using GridView = GV; │ │ │ │ │ -200 using size_type = std::size_t; │ │ │ │ │ + 187namespace BasisFactory { │ │ │ │ │ + 188 │ │ │ │ │ + 189template │ │ │ │ │ +190auto makeBasis(const GridView& gridView, PreBasisFactory&& preBasisFactory) │ │ │ │ │ + 191{ │ │ │ │ │ + 192 return DefaultGlobalBasis(preBasisFactory(gridView)); │ │ │ │ │ + 193} │ │ │ │ │ + 194 │ │ │ │ │ + 195} // end namespace BasisFactory │ │ │ │ │ + 196 │ │ │ │ │ + 197// Backward compatibility │ │ │ │ │ + 198namespace BasisBuilder { │ │ │ │ │ + 199 │ │ │ │ │ + 200 using namespace BasisFactory; │ │ │ │ │ 201 │ │ │ │ │ -202 using Node = RaviartThomasNode; │ │ │ │ │ + 202} │ │ │ │ │ 203 │ │ │ │ │ -204 static constexpr size_type maxMultiIndexSize = 1; │ │ │ │ │ -205 static constexpr size_type minMultiIndexSize = 1; │ │ │ │ │ -206 static constexpr size_type multiIndexBufferSize = 1; │ │ │ │ │ + 204 │ │ │ │ │ + 205} // end namespace Functions │ │ │ │ │ + 206} // end namespace Dune │ │ │ │ │ 207 │ │ │ │ │ -209 RaviartThomasPreBasis(const GridView& gv) : │ │ │ │ │ - 210 gridView_(gv), │ │ │ │ │ - 211 finiteElementMap_(gv) │ │ │ │ │ - 212 { │ │ │ │ │ - 213 // Currently there are some unresolved bugs with hybrid grids and higher │ │ │ │ │ -order Raviart-Thomas elements │ │ │ │ │ - 214 if (gv.indexSet().types(0).size() > 1 and k>0) │ │ │ │ │ - 215 DUNE_THROW(Dune::NotImplemented, "Raviart-Thomas basis with index k>0 is │ │ │ │ │ -only implemented for grids with a single element type"); │ │ │ │ │ - 216 │ │ │ │ │ - 217 for(auto type : gv.indexSet().types(0)) │ │ │ │ │ - 218 if (!type.isSimplex() && !type.isCube()) │ │ │ │ │ - 219 DUNE_THROW(Dune::NotImplemented, "Raviart-Thomas elements are only │ │ │ │ │ -implemented for grids with simplex or cube elements."); │ │ │ │ │ - 220 │ │ │ │ │ - 221 GeometryType type = gv.template begin<0>()->type(); │ │ │ │ │ - 222 const static int dofsPerElement = type.isCube() ? ((dim == 2) ? k* │ │ │ │ │ -(k+1)*dim : k*(k+1)*(k+1)*dim) : k*dim; │ │ │ │ │ - 223 const static int dofsPerFace = type.isCube() ? (dim-2)*2*k+k+1 : (dim- │ │ │ │ │ -1)*k+1 ; │ │ │ │ │ - 224 │ │ │ │ │ - 225 dofsPerCodim_ = {{dofsPerElement, dofsPerFace}}; │ │ │ │ │ - 226 } │ │ │ │ │ - 227 │ │ │ │ │ -228 void initializeIndices() │ │ │ │ │ - 229 { │ │ │ │ │ - 230 codimOffset_[0] = 0; │ │ │ │ │ - 231 codimOffset_[1] = codimOffset_[0] + dofsPerCodim_[0] * gridView_.size(0); │ │ │ │ │ - 232 } │ │ │ │ │ - 233 │ │ │ │ │ -236 const GridView& gridView() const │ │ │ │ │ - 237 { │ │ │ │ │ - 238 return gridView_; │ │ │ │ │ - 239 } │ │ │ │ │ - 240 │ │ │ │ │ - 241 /* \brief Update the stored grid view, to be called if the grid has │ │ │ │ │ -changed */ │ │ │ │ │ -242 void update (const GridView& gv) │ │ │ │ │ - 243 { │ │ │ │ │ - 244 gridView_ = gv; │ │ │ │ │ - 245 } │ │ │ │ │ - 246 │ │ │ │ │ -250 Node makeNode() const │ │ │ │ │ - 251 { │ │ │ │ │ - 252 return Node{&finiteElementMap_}; │ │ │ │ │ - 253 } │ │ │ │ │ - 254 │ │ │ │ │ -255 size_type size() const │ │ │ │ │ - 256 { │ │ │ │ │ - 257 return dofsPerCodim_[0] * gridView_.size(0) + dofsPerCodim_[1] * │ │ │ │ │ -gridView_.size(1); │ │ │ │ │ - 258 } │ │ │ │ │ - 259 │ │ │ │ │ - 261 template │ │ │ │ │ -262 size_type size(const SizePrefix& prefix) const │ │ │ │ │ - 263 { │ │ │ │ │ - 264 assert(prefix.size() == 0 || prefix.size() == 1); │ │ │ │ │ - 265 return (prefix.size() == 0) ? size() : 0; │ │ │ │ │ - 266 } │ │ │ │ │ - 267 │ │ │ │ │ -269 size_type dimension() const │ │ │ │ │ - 270 { │ │ │ │ │ - 271 return size(); │ │ │ │ │ - 272 } │ │ │ │ │ - 273 │ │ │ │ │ -274 size_type maxNodeSize() const │ │ │ │ │ - 275 { │ │ │ │ │ - 276 size_type result = 0; │ │ │ │ │ - 277 for (auto&& type : gridView_.indexSet().types(0)) │ │ │ │ │ - 278 { │ │ │ │ │ - 279 size_t numFaces = ReferenceElements::general(type).size(1); │ │ │ │ │ - 280 const static int dofsPerElement = type.isCube() ? ((dim == 2) ? k* │ │ │ │ │ -(k+1)*dim : k*(k+1)*(k+1)*dim) : k*dim; │ │ │ │ │ - 281 const static int dofsPerFace = type.isCube() ? (dim-2)*2*k+k+1 : (dim- │ │ │ │ │ -1)*k+1 ; │ │ │ │ │ - 282 result = std::max(result, dofsPerElement + dofsPerFace * numFaces); │ │ │ │ │ - 283 } │ │ │ │ │ - 284 │ │ │ │ │ - 285 return result; │ │ │ │ │ - 286 } │ │ │ │ │ - 287 │ │ │ │ │ - 293 template │ │ │ │ │ -294 It indices(const Node& node, It it) const │ │ │ │ │ - 295 { │ │ │ │ │ - 296 const auto& gridIndexSet = gridView().indexSet(); │ │ │ │ │ - 297 const auto& element = node.element(); │ │ │ │ │ - 298 │ │ │ │ │ - 299 // throw if Element is not of predefined type │ │ │ │ │ - 300 if (not(element.type().isCube()) and not(element.type().isSimplex())) │ │ │ │ │ - 301 DUNE_THROW(Dune::NotImplemented, "RaviartThomasBasis only implemented for │ │ │ │ │ -cube and simplex elements."); │ │ │ │ │ - 302 │ │ │ │ │ - 303 for(std::size_t i=0, end=node.size(); i codimOffset_; │ │ │ │ │ -324 FiniteElementMap finiteElementMap_; │ │ │ │ │ - 325 // Number of dofs per entity type depending on the entity's codimension │ │ │ │ │ -and type │ │ │ │ │ -326 std::array dofsPerCodim_; │ │ │ │ │ - 327}; │ │ │ │ │ - 328 │ │ │ │ │ - 329 │ │ │ │ │ - 330 │ │ │ │ │ - 331template │ │ │ │ │ -332class RaviartThomasNode : │ │ │ │ │ - 333 public LeafBasisNode │ │ │ │ │ - 334{ │ │ │ │ │ - 335 static const int dim = GV::dimension; │ │ │ │ │ - 336 │ │ │ │ │ - 337public: │ │ │ │ │ - 338 │ │ │ │ │ -339 using size_type = std::size_t; │ │ │ │ │ -340 using Element = typename GV::template Codim<0>::Entity; │ │ │ │ │ -341 using FiniteElementMap = typename Impl:: │ │ │ │ │ -RaviartThomasLocalFiniteElementMap; │ │ │ │ │ -342 using FiniteElement = Impl::GlobalValuedLocalFiniteElement; │ │ │ │ │ - 345 │ │ │ │ │ -346 RaviartThomasNode(const FiniteElementMap* finiteElementMap) : │ │ │ │ │ - 347 element_(nullptr), │ │ │ │ │ - 348 finiteElementMap_(finiteElementMap) │ │ │ │ │ - 349 { } │ │ │ │ │ - 350 │ │ │ │ │ -352 const Element& element() const │ │ │ │ │ - 353 { │ │ │ │ │ - 354 return *element_; │ │ │ │ │ - 355 } │ │ │ │ │ - 356 │ │ │ │ │ -361 const FiniteElement& finiteElement() const │ │ │ │ │ - 362 { │ │ │ │ │ - 363 return finiteElement_; │ │ │ │ │ - 364 } │ │ │ │ │ - 365 │ │ │ │ │ -367 void bind(const Element& e) │ │ │ │ │ - 368 { │ │ │ │ │ - 369 element_ = &e; │ │ │ │ │ - 370 finiteElement_.bind((finiteElementMap_->find(*element_)), e); │ │ │ │ │ - 371 this->setSize(finiteElement_.size()); │ │ │ │ │ - 372 } │ │ │ │ │ - 373 │ │ │ │ │ - 374protected: │ │ │ │ │ - 375 │ │ │ │ │ -376 FiniteElement finiteElement_; │ │ │ │ │ -377 const Element* element_; │ │ │ │ │ -378 const FiniteElementMap* finiteElementMap_; │ │ │ │ │ - 379}; │ │ │ │ │ - 380 │ │ │ │ │ - 381namespace BasisFactory { │ │ │ │ │ - 382 │ │ │ │ │ - 390template │ │ │ │ │ -391auto raviartThomas() │ │ │ │ │ - 392{ │ │ │ │ │ - 393 return [](const auto& gridView) { │ │ │ │ │ - 394 return RaviartThomasPreBasis, k> │ │ │ │ │ -(gridView); │ │ │ │ │ - 395 }; │ │ │ │ │ - 396} │ │ │ │ │ - 397 │ │ │ │ │ - 398} // end namespace BasisFactory │ │ │ │ │ - 399 │ │ │ │ │ - 400 │ │ │ │ │ - 401 │ │ │ │ │ - 402/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 403// This is the actual global basis implementation based on the reusable │ │ │ │ │ -parts. │ │ │ │ │ - 404/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 405 │ │ │ │ │ - 413template │ │ │ │ │ -414using RaviartThomasBasis = DefaultGlobalBasis │ │ │ │ │ ->; │ │ │ │ │ - 415 │ │ │ │ │ - 416} // end namespace Functions │ │ │ │ │ - 417} // end namespace Dune │ │ │ │ │ - 418 │ │ │ │ │ - 419 │ │ │ │ │ - 420#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH │ │ │ │ │ -nodes.hh │ │ │ │ │ -defaultglobalbasis.hh │ │ │ │ │ -globalvaluedlocalfiniteelement.hh │ │ │ │ │ -Dune::Functions::BasisFactory::power │ │ │ │ │ -auto power(ChildPreBasisFactory &&childPreBasisFactory, const │ │ │ │ │ -IndexMergingStrategy &) │ │ │ │ │ -Create a pre-basis factory that can build a PowerPreBasis. │ │ │ │ │ -Definition: powerbasis.hh:369 │ │ │ │ │ -Dune::Functions::BasisFactory::raviartThomas │ │ │ │ │ -auto raviartThomas() │ │ │ │ │ -Create a pre-basis factory that can create a Raviart-Thomas pre-basis. │ │ │ │ │ -Definition: raviartthomasbasis.hh:391 │ │ │ │ │ + 208 │ │ │ │ │ + 209 │ │ │ │ │ + 210#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH │ │ │ │ │ +type_traits.hh │ │ │ │ │ +defaultlocalview.hh │ │ │ │ │ +Dune::Functions::enableIfConstructible │ │ │ │ │ +typename std::enable_if< std::is_constructible< T, Args... >::value, int >:: │ │ │ │ │ +type enableIfConstructible │ │ │ │ │ +Helper to constrain forwarding constructors. │ │ │ │ │ +Definition: type_traits.hh:26 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ Dune::Functions::DefaultGlobalBasis │ │ │ │ │ +DefaultGlobalBasis(PreBasis &&) -> DefaultGlobalBasis< std::decay_t< PreBasis > │ │ │ │ │ +> │ │ │ │ │ +Dune::Functions::BasisFactory::makeBasis │ │ │ │ │ +auto makeBasis(const GridView &gridView, PreBasisFactory &&preBasisFactory) │ │ │ │ │ +Definition: defaultglobalbasis.hh:190 │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis │ │ │ │ │ Global basis for given pre-basis. │ │ │ │ │ Definition: defaultglobalbasis.hh:46 │ │ │ │ │ -Dune::Functions::BasisNodeMixin::size │ │ │ │ │ -size_type size() const │ │ │ │ │ -Definition: nodes.hh:142 │ │ │ │ │ -Dune::Functions::BasisNodeMixin::size_type │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis::SizePrefix │ │ │ │ │ +Dune::ReservedVector< std::size_t, PreBasis::multiIndexBufferSize > SizePrefix │ │ │ │ │ +Type used for prefixes handed to the size() method. │ │ │ │ │ +Definition: defaultglobalbasis.hh:69 │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis::size_type │ │ │ │ │ std::size_t size_type │ │ │ │ │ -Definition: nodes.hh:128 │ │ │ │ │ -Dune::Functions::BasisNodeMixin::setSize │ │ │ │ │ -void setSize(const size_type size) │ │ │ │ │ -Definition: nodes.hh:164 │ │ │ │ │ -Dune::Functions::LeafBasisNode │ │ │ │ │ -Definition: nodes.hh:186 │ │ │ │ │ -Dune::Functions::RaviartThomasNode │ │ │ │ │ -Definition: raviartthomasbasis.hh:334 │ │ │ │ │ -Dune::Functions::RaviartThomasNode::FiniteElementMap │ │ │ │ │ -typename Impl::RaviartThomasLocalFiniteElementMap< GV, dim, double, k > │ │ │ │ │ -FiniteElementMap │ │ │ │ │ -Definition: raviartthomasbasis.hh:341 │ │ │ │ │ -Dune::Functions::RaviartThomasNode::bind │ │ │ │ │ -void bind(const Element &e) │ │ │ │ │ -Bind to element. │ │ │ │ │ -Definition: raviartthomasbasis.hh:367 │ │ │ │ │ -Dune::Functions::RaviartThomasNode::FiniteElement │ │ │ │ │ -Impl::GlobalValuedLocalFiniteElement< Impl::ContravariantPiolaTransformator, │ │ │ │ │ -typename FiniteElementMap::FiniteElement, Element > FiniteElement │ │ │ │ │ -Definition: raviartthomasbasis.hh:344 │ │ │ │ │ -Dune::Functions::RaviartThomasNode::Element │ │ │ │ │ -typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ -Definition: raviartthomasbasis.hh:340 │ │ │ │ │ -Dune::Functions::RaviartThomasNode::element_ │ │ │ │ │ -const Element * element_ │ │ │ │ │ -Definition: raviartthomasbasis.hh:377 │ │ │ │ │ -Dune::Functions::RaviartThomasNode::finiteElement │ │ │ │ │ -const FiniteElement & finiteElement() const │ │ │ │ │ -Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ -Definition: raviartthomasbasis.hh:361 │ │ │ │ │ -Dune::Functions::RaviartThomasNode::RaviartThomasNode │ │ │ │ │ -RaviartThomasNode(const FiniteElementMap *finiteElementMap) │ │ │ │ │ -Definition: raviartthomasbasis.hh:346 │ │ │ │ │ -Dune::Functions::RaviartThomasNode::element │ │ │ │ │ -const Element & element() const │ │ │ │ │ -Return current element, throw if unbound. │ │ │ │ │ -Definition: raviartthomasbasis.hh:352 │ │ │ │ │ -Dune::Functions::RaviartThomasNode::finiteElement_ │ │ │ │ │ -FiniteElement finiteElement_ │ │ │ │ │ -Definition: raviartthomasbasis.hh:376 │ │ │ │ │ -Dune::Functions::RaviartThomasNode::finiteElementMap_ │ │ │ │ │ -const FiniteElementMap * finiteElementMap_ │ │ │ │ │ -Definition: raviartthomasbasis.hh:378 │ │ │ │ │ -Dune::Functions::RaviartThomasPreBasis │ │ │ │ │ -Definition: raviartthomasbasis.hh:192 │ │ │ │ │ -Dune::Functions::RaviartThomasPreBasis::minMultiIndexSize │ │ │ │ │ -static constexpr size_type minMultiIndexSize │ │ │ │ │ -Definition: raviartthomasbasis.hh:205 │ │ │ │ │ -Dune::Functions::RaviartThomasPreBasis::maxMultiIndexSize │ │ │ │ │ -static constexpr size_type maxMultiIndexSize │ │ │ │ │ -Definition: raviartthomasbasis.hh:204 │ │ │ │ │ -Dune::Functions::RaviartThomasPreBasis::makeNode │ │ │ │ │ -Node makeNode() const │ │ │ │ │ -Create tree node. │ │ │ │ │ -Definition: raviartthomasbasis.hh:250 │ │ │ │ │ -Dune::Functions::RaviartThomasPreBasis::dofsPerCodim_ │ │ │ │ │ -std::array< int, dim+1 > dofsPerCodim_ │ │ │ │ │ -Definition: raviartthomasbasis.hh:326 │ │ │ │ │ -Dune::Functions::RaviartThomasPreBasis::update │ │ │ │ │ -void update(const GridView &gv) │ │ │ │ │ -Definition: raviartthomasbasis.hh:242 │ │ │ │ │ -Dune::Functions::RaviartThomasPreBasis::RaviartThomasPreBasis │ │ │ │ │ -RaviartThomasPreBasis(const GridView &gv) │ │ │ │ │ -Constructor for a given grid view object. │ │ │ │ │ -Definition: raviartthomasbasis.hh:209 │ │ │ │ │ -Dune::Functions::RaviartThomasPreBasis::size_type │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Definition: raviartthomasbasis.hh:200 │ │ │ │ │ -Dune::Functions::RaviartThomasPreBasis::gridView │ │ │ │ │ +Type used for indices and size information. │ │ │ │ │ +Definition: defaultglobalbasis.hh:60 │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis::GridView │ │ │ │ │ +typename PreBasis::GridView GridView │ │ │ │ │ +The grid view that the FE space is defined on. │ │ │ │ │ +Definition: defaultglobalbasis.hh:57 │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis::gridView │ │ │ │ │ const GridView & gridView() const │ │ │ │ │ Obtain the grid view that the basis is defined on. │ │ │ │ │ -Definition: raviartthomasbasis.hh:236 │ │ │ │ │ -Dune::Functions::RaviartThomasPreBasis::indices │ │ │ │ │ -It indices(const Node &node, It it) const │ │ │ │ │ -Maps from subtree index set [0..size-1] to a globally unique multi index in │ │ │ │ │ -global basis. │ │ │ │ │ -Definition: raviartthomasbasis.hh:294 │ │ │ │ │ -Dune::Functions::RaviartThomasPreBasis::multiIndexBufferSize │ │ │ │ │ -static constexpr size_type multiIndexBufferSize │ │ │ │ │ -Definition: raviartthomasbasis.hh:206 │ │ │ │ │ -Dune::Functions::RaviartThomasPreBasis::finiteElementMap_ │ │ │ │ │ -FiniteElementMap finiteElementMap_ │ │ │ │ │ -Definition: raviartthomasbasis.hh:324 │ │ │ │ │ -Dune::Functions::RaviartThomasPreBasis::size │ │ │ │ │ -size_type size() const │ │ │ │ │ -Definition: raviartthomasbasis.hh:255 │ │ │ │ │ -Dune::Functions::RaviartThomasPreBasis::dimension │ │ │ │ │ -size_type dimension() const │ │ │ │ │ -Definition: raviartthomasbasis.hh:269 │ │ │ │ │ -Dune::Functions::RaviartThomasPreBasis::GridView │ │ │ │ │ -GV GridView │ │ │ │ │ -The grid view that the FE space is defined on. │ │ │ │ │ -Definition: raviartthomasbasis.hh:199 │ │ │ │ │ -Dune::Functions::RaviartThomasPreBasis::maxNodeSize │ │ │ │ │ -size_type maxNodeSize() const │ │ │ │ │ -Definition: raviartthomasbasis.hh:274 │ │ │ │ │ -Dune::Functions::RaviartThomasPreBasis::gridView_ │ │ │ │ │ -GridView gridView_ │ │ │ │ │ -Definition: raviartthomasbasis.hh:322 │ │ │ │ │ -Dune::Functions::RaviartThomasPreBasis::size │ │ │ │ │ +Definition: defaultglobalbasis.hh:107 │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis::PreBasis │ │ │ │ │ +PB PreBasis │ │ │ │ │ +Pre-basis providing the implementation details. │ │ │ │ │ +Definition: defaultglobalbasis.hh:51 │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis::preBasis │ │ │ │ │ +PreBasis & preBasis() │ │ │ │ │ +Obtain the pre-basis providing the implementation details. │ │ │ │ │ +Definition: defaultglobalbasis.hh:119 │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis::update │ │ │ │ │ +void update(const GridView &gv) │ │ │ │ │ +Update the stored grid view. │ │ │ │ │ +Definition: defaultglobalbasis.hh:130 │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis::LocalView │ │ │ │ │ +DefaultLocalView< DefaultGlobalBasis< PreBasis > > LocalView │ │ │ │ │ +Type of the local view on the restriction of the basis to a single element. │ │ │ │ │ +Definition: defaultglobalbasis.hh:63 │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis::MultiIndex │ │ │ │ │ +typename LocalView::MultiIndex MultiIndex │ │ │ │ │ +Type used for global numbering of the basis vectors. │ │ │ │ │ +Definition: defaultglobalbasis.hh:66 │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis::size │ │ │ │ │ size_type size(const SizePrefix &prefix) const │ │ │ │ │ -Return number possible values for next position in multi index. │ │ │ │ │ -Definition: raviartthomasbasis.hh:262 │ │ │ │ │ -Dune::Functions::RaviartThomasPreBasis::initializeIndices │ │ │ │ │ -void initializeIndices() │ │ │ │ │ -Definition: raviartthomasbasis.hh:228 │ │ │ │ │ -Dune::Functions::RaviartThomasPreBasis::codimOffset_ │ │ │ │ │ -std::array< size_t, dim+1 > codimOffset_ │ │ │ │ │ -Definition: raviartthomasbasis.hh:323 │ │ │ │ │ +Return number of possible values for next position in multi index. │ │ │ │ │ +Definition: defaultglobalbasis.hh:149 │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis::dimension │ │ │ │ │ +size_type dimension() const │ │ │ │ │ +Get the total dimension of the space spanned by this basis. │ │ │ │ │ +Definition: defaultglobalbasis.hh:137 │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis::preBasis_ │ │ │ │ │ +PreBasis preBasis_ │ │ │ │ │ +Definition: defaultglobalbasis.hh:173 │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis::localView │ │ │ │ │ +LocalView localView() const │ │ │ │ │ +Return local view for basis. │ │ │ │ │ +Definition: defaultglobalbasis.hh:155 │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis::PrefixPath │ │ │ │ │ +TypeTree::HybridTreePath<> PrefixPath │ │ │ │ │ +The empty prefix path that identifies the root in the local ansatz tree. │ │ │ │ │ +Definition: defaultglobalbasis.hh:54 │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis::DefaultGlobalBasis │ │ │ │ │ +DefaultGlobalBasis(T &&... t) │ │ │ │ │ +Constructor. │ │ │ │ │ +Definition: defaultglobalbasis.hh:82 │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis::DefaultGlobalBasis │ │ │ │ │ +DefaultGlobalBasis(const GridView &gridView, PreBasisFactory &&factory) │ │ │ │ │ +Constructor from a PreBasis factory. │ │ │ │ │ +Definition: defaultglobalbasis.hh:98 │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis::size │ │ │ │ │ +size_type size() const │ │ │ │ │ +Return number of possible values for next position in empty multi index. │ │ │ │ │ +Definition: defaultglobalbasis.hh:143 │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis::preBasis │ │ │ │ │ +const PreBasis & preBasis() const │ │ │ │ │ +Obtain the pre-basis providing the implementation details. │ │ │ │ │ +Definition: defaultglobalbasis.hh:113 │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis::prefixPath_ │ │ │ │ │ +PrefixPath prefixPath_ │ │ │ │ │ +Definition: defaultglobalbasis.hh:174 │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis::rootBasis │ │ │ │ │ +const DefaultGlobalBasis & rootBasis() const │ │ │ │ │ +Return *this because we are not embedded in a larger basis. │ │ │ │ │ +Definition: defaultglobalbasis.hh:161 │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis::prefixPath │ │ │ │ │ +const PrefixPath & prefixPath() const │ │ │ │ │ +Return empty path, because this is the root in the local ansatz tree. │ │ │ │ │ +Definition: defaultglobalbasis.hh:167 │ │ │ │ │ +Dune::Functions::DefaultLocalView │ │ │ │ │ +The restriction of a finite element basis to a single element. │ │ │ │ │ +Definition: defaultlocalview.hh:28 │ │ │ │ │ +Dune::Functions::DefaultLocalView::MultiIndex │ │ │ │ │ +std::conditional_t<(PreBasis::minMultiIndexSize==PreBasis::maxMultiIndexSize), │ │ │ │ │ +StaticMultiIndex< size_type, PreBasis::maxMultiIndexSize >, Dune:: │ │ │ │ │ +ReservedVector< size_type, PreBasis::multiIndexBufferSize > > MultiIndex │ │ │ │ │ +Type used for global numbering of the basis vectors. │ │ │ │ │ +Definition: defaultlocalview.hh:64 │ │ │ │ │ +concepts.hh │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00152.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: powerbasis.hh File Reference │ │ │ │ +dune-functions: nedelecbasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,57 +65,60 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ +Typedefs | │ │ │ │ Functions
│ │ │ │ -
powerbasis.hh File Reference
│ │ │ │ +
nedelecbasis.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <dune/common/reservedvector.hh>
│ │ │ │ -#include <dune/common/typeutilities.hh>
│ │ │ │ -#include <dune/common/indices.hh>
│ │ │ │ -#include <dune/functions/common/utility.hh>
│ │ │ │ -#include <dune/functions/common/type_traits.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/basistags.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │ +
#include <array>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/grid/common/capabilities.hh>
│ │ │ │ +#include <dune/grid/common/mcmgmapper.hh>
│ │ │ │ +#include <dune/localfunctions/common/localfiniteelementvariant.hh>
│ │ │ │ +#include <dune/localfunctions/nedelec.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/globalvaluedlocalfiniteelement.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::PowerPreBasis< IMS, SPB, C >
 A pre-basis for power bases. More...
class  Dune::Functions::NedelecPreBasis< GV, Range, kind, order >
 
class  Dune::Functions::NedelecNode< GV, Range, kind, order >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
namespace  Dune::Functions::BasisFactory
 
namespace  Dune::Functions::BasisBuilder
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Typedefs

template<typename GV , std::size_t kind, std::size_t order, typename Range = double>
using Dune::Functions::NedelecBasis = DefaultGlobalBasis< NedelecPreBasis< GV, Range, kind, order > >
 Basis of a k-th-order Nédélec finite element space. More...
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<std::size_t k, class ChildPreBasisFactory , class IndexMergingStrategy >
auto Dune::Functions::BasisFactory::power (ChildPreBasisFactory &&childPreBasisFactory, const IndexMergingStrategy &)
 Create a pre-basis factory that can build a PowerPreBasis. More...
 
template<std::size_t k, class ChildPreBasisFactory >
auto Dune::Functions::BasisFactory::power (ChildPreBasisFactory &&childPreBasisFactory)
 Create a factory builder that can build a PowerPreBasis. More...
 
template<std::size_t kind, std::size_t order, typename Range = double>
auto Dune::Functions::BasisFactory::nedelec ()
 Create a pre-basis factory that can create a Nédélec pre-basis. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -us-ascii │ │ │ │ │ +utf-8 │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,47 +5,46 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -Classes | Namespaces | Functions │ │ │ │ │ -powerbasis.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Typedefs | Functions │ │ │ │ │ +nedelecbasis.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::PowerPreBasis<_IMS,_SPB,_C_> │ │ │ │ │ -  A pre-basis for power bases. More... │ │ │ │ │ +class  Dune::Functions::NedelecPreBasis<_GV,_Range,_kind,_order_> │ │ │ │ │ +  │ │ │ │ │ +class  Dune::Functions::NedelecNode<_GV,_Range,_kind,_order_> │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions::BasisFactory │ │ │ │ │   │ │ │ │ │ -namespace  Dune::Functions::BasisBuilder │ │ │ │ │ + Typedefs │ │ │ │ │ +template │ │ │ │ │ +using Dune::Functions::NedelecBasis = DefaultGlobalBasis< NedelecPreBasis< GV, │ │ │ │ │ + Range, kind, order > > │ │ │ │ │ +  Basis of a k-th-order Nédélec finite element space. More... │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::BasisFactory::power (ChildPreBasisFactory │ │ │ │ │ - &&childPreBasisFactory, const IndexMergingStrategy &) │ │ │ │ │ -  Create a pre-basis factory that can build a PowerPreBasis. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::BasisFactory::power (ChildPreBasisFactory │ │ │ │ │ - &&childPreBasisFactory) │ │ │ │ │ -  Create a factory builder that can build a PowerPreBasis. More... │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::BasisFactory::nedelec () │ │ │ │ │ +  Create a pre-basis factory that can create a Nédélec pre-basis. More... │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00152_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: powerbasis.hh Source File │ │ │ │ +dune-functions: nedelecbasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,406 +62,381 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
powerbasis.hh
│ │ │ │ +
nedelecbasis.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_POWERBASIS_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_POWERBASIS_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NEDELECBASIS_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NEDELECBASIS_HH
│ │ │ │
5
│ │ │ │ -
6#include <dune/common/reservedvector.hh>
│ │ │ │ -
7#include <dune/common/typeutilities.hh>
│ │ │ │ -
8#include <dune/common/indices.hh>
│ │ │ │ -
9
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
16
│ │ │ │ -
17
│ │ │ │ +
6#include <array>
│ │ │ │ +
7#include <dune/common/exceptions.hh>
│ │ │ │ +
8
│ │ │ │ +
9#include <dune/grid/common/capabilities.hh>
│ │ │ │ +
10#include <dune/grid/common/mcmgmapper.hh>
│ │ │ │ +
11
│ │ │ │ +
12#include <dune/localfunctions/common/localfiniteelementvariant.hh>
│ │ │ │ +
13#include <dune/localfunctions/nedelec.hh>
│ │ │ │ +
14
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
18
│ │ │ │ -
19namespace Dune {
│ │ │ │ -
20namespace Functions {
│ │ │ │ +
19namespace Dune::Functions
│ │ │ │ +
20{
│ │ │ │
21
│ │ │ │ -
22
│ │ │ │ -
23// *****************************************************************************
│ │ │ │ -
24// This is the reusable part of the power bases. It contains
│ │ │ │ -
25//
│ │ │ │ -
26// PowerPreBasis
│ │ │ │ -
27//
│ │ │ │ -
28// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ -
29// state. These components do _not_ depend on the global basis and local view
│ │ │ │ -
30// and can be used without a global basis.
│ │ │ │ -
31// *****************************************************************************
│ │ │ │ +
22namespace Impl
│ │ │ │ +
23{
│ │ │ │ +
24 template<typename GV, int dim, typename R, std::size_t order>
│ │ │ │ +
25 class Nedelec1stKindLocalFiniteElementMap
│ │ │ │ +
26 {
│ │ │ │ +
27 using D = typename GV::ctype;
│ │ │ │ +
28 constexpr static bool hasFixedElementType = Capabilities::hasSingleGeometryType<typename GV::Grid>::v;
│ │ │ │ +
29
│ │ │ │ +
30 using CubeFiniteElement = Nedelec1stKindCubeLocalFiniteElement<D,R,dim,order>;
│ │ │ │ +
31 using SimplexFiniteElement = Nedelec1stKindSimplexLocalFiniteElement<D,R,dim,order>;
│ │ │ │
32
│ │ │ │ -
43template<class IMS, class SPB, std::size_t C>
│ │ │ │ - │ │ │ │ -
45{
│ │ │ │ -
46 static const std::size_t children = C;
│ │ │ │ -
47 static const bool isBlocked = std::is_same_v<IMS,BasisFactory::BlockedLexicographic> or std::is_same_v<IMS,BasisFactory::BlockedInterleaved>;
│ │ │ │ +
33 public:
│ │ │ │ +
34
│ │ │ │ +
35 using T = LocalBasisTraits<D, dim, FieldVector<D,dim>, R, dim, FieldVector<R,dim>, FieldMatrix<D,dim,dim> >;
│ │ │ │ +
36
│ │ │ │ +
37 constexpr static unsigned int topologyId = Capabilities::hasSingleGeometryType<typename GV::Grid>::topologyId; // meaningless if hasFixedElementType is false
│ │ │ │ +
38 constexpr static GeometryType type = GeometryType(topologyId, GV::dimension);
│ │ │ │ +
39
│ │ │ │ +
40 using FiniteElement = std::conditional_t<hasFixedElementType,
│ │ │ │ +
41 std::conditional_t<type.isCube(),CubeFiniteElement,SimplexFiniteElement>,
│ │ │ │ +
42 LocalFiniteElementVariant<CubeFiniteElement, SimplexFiniteElement> >;
│ │ │ │ +
43
│ │ │ │ +
44 static std::size_t numVariants(GeometryType type)
│ │ │ │ +
45 {
│ │ │ │ +
46 if (order!=1) // I am not sure whether the formula below is correct for all orders.
│ │ │ │ +
47 DUNE_THROW(NotImplemented, "Only Nedelec elements of order 1 are implemented!");
│ │ │ │
48
│ │ │ │ -
49public:
│ │ │ │ -
50
│ │ │ │ -
52 using SubPreBasis = SPB;
│ │ │ │ -
53
│ │ │ │ -
55 using GridView = typename SPB::GridView;
│ │ │ │ -
56
│ │ │ │ -
58 using size_type = std::size_t;
│ │ │ │ -
59
│ │ │ │ - │ │ │ │ -
62
│ │ │ │ -
63 using SubNode = typename SubPreBasis::Node;
│ │ │ │ -
64
│ │ │ │ - │ │ │ │ -
67
│ │ │ │ -
68 static constexpr size_type maxMultiIndexSize = SubPreBasis::maxMultiIndexSize + isBlocked;
│ │ │ │ -
69 static constexpr size_type minMultiIndexSize = SubPreBasis::minMultiIndexSize + isBlocked;
│ │ │ │ -
70 static constexpr size_type multiIndexBufferSize = SubPreBasis::multiIndexBufferSize + isBlocked;
│ │ │ │ -
71
│ │ │ │ -
77 template<class... SFArgs,
│ │ │ │ -
78 disableCopyMove<PowerPreBasis, SFArgs...> = 0,
│ │ │ │ -
79 enableIfConstructible<SubPreBasis, SFArgs...> = 0>
│ │ │ │ -
80 PowerPreBasis(SFArgs&&... sfArgs) :
│ │ │ │ -
81 subPreBasis_(std::forward<SFArgs>(sfArgs)...)
│ │ │ │ -
82 {
│ │ │ │ -
83 static_assert(models<Concept::PreBasis<GridView>, SubPreBasis>(), "Subprebasis passed to PowerPreBasis does not model the PreBasis concept.");
│ │ │ │ -
84 }
│ │ │ │ -
85
│ │ │ │ - │ │ │ │ -
88 {
│ │ │ │ -
89 subPreBasis_.initializeIndices();
│ │ │ │ -
90 }
│ │ │ │ -
91
│ │ │ │ -
93 const GridView& gridView() const
│ │ │ │ -
94 {
│ │ │ │ -
95 return subPreBasis_.gridView();
│ │ │ │ -
96 }
│ │ │ │ -
97
│ │ │ │ -
99 void update(const GridView& gv)
│ │ │ │ -
100 {
│ │ │ │ -
101 subPreBasis_.update(gv);
│ │ │ │ -
102 }
│ │ │ │ +
49 auto numEdges = referenceElement<D,dim>(type).size(dim-1);
│ │ │ │ +
50 return power(2,numEdges);
│ │ │ │ +
51 }
│ │ │ │ +
52
│ │ │ │ +
53 Nedelec1stKindLocalFiniteElementMap(const GV& gv)
│ │ │ │ +
54 : elementMapper_(gv, mcmgElementLayout()),
│ │ │ │ +
55 orientation_(gv.size(0))
│ │ │ │ +
56 {
│ │ │ │ +
57 // create all variants
│ │ │ │ +
58 if constexpr (hasFixedElementType)
│ │ │ │ +
59 {
│ │ │ │ +
60 variants_.resize(numVariants(type));
│ │ │ │ +
61 for (size_t i = 0; i < numVariants(type); i++)
│ │ │ │ +
62 variants_[i] = FiniteElement(i);
│ │ │ │ +
63 }
│ │ │ │ +
64 else
│ │ │ │ +
65 {
│ │ │ │ +
66 // for mixed grids add offset for cubes
│ │ │ │ +
67 variants_.resize(numVariants(GeometryTypes::simplex(dim)) + numVariants(GeometryTypes::cube(dim)));
│ │ │ │ +
68 for (size_t i = 0; i < numVariants(GeometryTypes::simplex(dim)); i++)
│ │ │ │ +
69 variants_[i] = SimplexFiniteElement(i);
│ │ │ │ +
70 for (size_t i = 0; i < numVariants(GeometryTypes::cube(dim)); i++)
│ │ │ │ +
71 variants_[i + numVariants(GeometryTypes::simplex(dim))] = CubeFiniteElement(i);
│ │ │ │ +
72 }
│ │ │ │ +
73
│ │ │ │ +
74
│ │ │ │ +
75 // compute orientation for all elements
│ │ │ │ +
76 const auto& indexSet = gv.indexSet();
│ │ │ │ +
77
│ │ │ │ +
78 for(const auto& element : elements(gv))
│ │ │ │ +
79 {
│ │ │ │ +
80 const auto& refElement = referenceElement(element);
│ │ │ │ +
81 auto elementIndex = elementMapper_.index(element);
│ │ │ │ +
82 orientation_[elementIndex] = 0;
│ │ │ │ +
83
│ │ │ │ +
84 for (std::size_t i=0; i<element.subEntities(dim-1); i++)
│ │ │ │ +
85 {
│ │ │ │ +
86 // Local vertex indices within the element
│ │ │ │ +
87 auto localV0 = refElement.subEntity(i,dim-1, 0,dim);
│ │ │ │ +
88 auto localV1 = refElement.subEntity(i,dim-1, 1,dim);
│ │ │ │ +
89
│ │ │ │ +
90 // Global vertex indices within the grid
│ │ │ │ +
91 auto globalV0 = indexSet.subIndex(element,localV0,dim);
│ │ │ │ +
92 auto globalV1 = indexSet.subIndex(element,localV1,dim);
│ │ │ │ +
93
│ │ │ │ +
94 if ( (localV0<localV1 && globalV0>globalV1) || (localV0>localV1 && globalV0<globalV1) )
│ │ │ │ +
95 orientation_[elementIndex] |= (1 << i);
│ │ │ │ +
96 }
│ │ │ │ +
97 // for mixed grids add offset for cubes
│ │ │ │ +
98 if constexpr (!hasFixedElementType)
│ │ │ │ +
99 if (element.type().isCube())
│ │ │ │ +
100 orientation_[elementIndex] += numVariants(GeometryTypes::simplex(dim));
│ │ │ │ +
101 }
│ │ │ │ +
102 }
│ │ │ │
103
│ │ │ │ - │ │ │ │ -
108 {
│ │ │ │ -
109 auto node = Node{};
│ │ │ │ -
110 for (std::size_t i=0; i<children; ++i)
│ │ │ │ -
111 node.setChild(i, subPreBasis_.makeNode());
│ │ │ │ -
112 return node;
│ │ │ │ -
113 }
│ │ │ │ -
114
│ │ │ │ - │ │ │ │ -
117 {
│ │ │ │ -
118 return size(Dune::ReservedVector<size_type, multiIndexBufferSize>{});
│ │ │ │ -
119 }
│ │ │ │ -
120
│ │ │ │ -
122
│ │ │ │ -
123 template<class SizePrefix>
│ │ │ │ -
124 size_type size(const SizePrefix& prefix) const
│ │ │ │ -
125 {
│ │ │ │ -
126 return size(prefix, IndexMergingStrategy{});
│ │ │ │ -
127 }
│ │ │ │ -
128
│ │ │ │ -
129private:
│ │ │ │ +
104 template<class Element>
│ │ │ │ +
105 const auto& find(const Element& element) const
│ │ │ │ +
106 {
│ │ │ │ +
107 return variants_[orientation_[elementMapper_.index(element)]];
│ │ │ │ +
108 }
│ │ │ │ +
109
│ │ │ │ +
110 private:
│ │ │ │ +
111 std::vector<FiniteElement> variants_;
│ │ │ │ +
112 const Dune::MultipleCodimMultipleGeomTypeMapper<GV> elementMapper_;
│ │ │ │ +
113 std::vector<unsigned short> orientation_;
│ │ │ │ +
114 };
│ │ │ │ +
115
│ │ │ │ +
116
│ │ │ │ +
117} // namespace Impl
│ │ │ │ +
118
│ │ │ │ +
119
│ │ │ │ +
120// *****************************************************************************
│ │ │ │ +
121// This is the reusable part of the basis. It contains
│ │ │ │ +
122//
│ │ │ │ +
123// NedelecPreBasis
│ │ │ │ +
124// NedelecNode
│ │ │ │ +
125//
│ │ │ │ +
126// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ +
127// state. These components do _not_ depend on the global basis and local view
│ │ │ │ +
128// and can be used without a global basis.
│ │ │ │ +
129// *****************************************************************************
│ │ │ │
130
│ │ │ │ -
131 template<class SizePrefix>
│ │ │ │ -
132 size_type size(const SizePrefix& prefix, BasisFactory::FlatInterleaved) const
│ │ │ │ -
133 {
│ │ │ │ -
134 // The root index size is the root index size of a single subnode
│ │ │ │ -
135 // multiplied by the number of subnodes because we enumerate all
│ │ │ │ -
136 // child indices in a row.
│ │ │ │ -
137 if (prefix.size() == 0)
│ │ │ │ -
138 return children*subPreBasis_.size();
│ │ │ │ -
139
│ │ │ │ -
140 // The first prefix entry refers to one of the (root index size)
│ │ │ │ -
141 // subindex trees. Hence we have to first compute the corresponding
│ │ │ │ -
142 // prefix entry for a single subnode subnode. The we can append
│ │ │ │ -
143 // the other prefix entries unmodified, because the index tree
│ │ │ │ -
144 // looks the same after the first level.
│ │ │ │ -
145 SizePrefix subPrefix;
│ │ │ │ -
146 subPrefix.push_back(prefix[0] / children);
│ │ │ │ -
147 for(std::size_t i=1; i<prefix.size(); ++i)
│ │ │ │ -
148 subPrefix.push_back(prefix[i]);
│ │ │ │ -
149 return subPreBasis_.size(subPrefix);
│ │ │ │ -
150 }
│ │ │ │ -
151
│ │ │ │ -
152 template<class SizePrefix>
│ │ │ │ -
153 size_type size(const SizePrefix& prefix, BasisFactory::FlatLexicographic) const
│ │ │ │ -
154 {
│ │ │ │ -
155 // The size at the index tree root is the size of at the index tree
│ │ │ │ -
156 // root of a single subnode multiplied by the number of subnodes
│ │ │ │ -
157 // because we enumerate all child indices in a row.
│ │ │ │ -
158 if (prefix.size() == 0)
│ │ │ │ -
159 return children*subPreBasis_.size();
│ │ │ │ -
160
│ │ │ │ -
161 // The first prefix entry refers to one of the (root index size)
│ │ │ │ -
162 // subindex trees. Hence we have to first compute the corresponding
│ │ │ │ -
163 // prefix entry for a single subnode subnode. The we can append
│ │ │ │ -
164 // the other prefix entries unmodified, because the index tree
│ │ │ │ -
165 // looks the same after the first level.
│ │ │ │ -
166 SizePrefix subPrefix;
│ │ │ │ -
167 subPrefix.push_back(prefix[0] % children);
│ │ │ │ -
168 for(std::size_t i=1; i<prefix.size(); ++i)
│ │ │ │ -
169 subPrefix.push_back(prefix[i]);
│ │ │ │ -
170 return subPreBasis_.size(subPrefix);
│ │ │ │ -
171 }
│ │ │ │ -
172
│ │ │ │ -
173 template<class SizePrefix>
│ │ │ │ -
174 size_type size(const SizePrefix& prefix, BasisFactory::BlockedLexicographic) const
│ │ │ │ -
175 {
│ │ │ │ -
176 if (prefix.size() == 0)
│ │ │ │ -
177 return children;
│ │ │ │ -
178 SizePrefix subPrefix;
│ │ │ │ -
179 for(std::size_t i=1; i<prefix.size(); ++i)
│ │ │ │ -
180 subPrefix.push_back(prefix[i]);
│ │ │ │ -
181 return subPreBasis_.size(subPrefix);
│ │ │ │ -
182 }
│ │ │ │ -
183
│ │ │ │ -
184 template<class SizePrefix>
│ │ │ │ -
185 size_type size(const SizePrefix& prefix, BasisFactory::BlockedInterleaved) const
│ │ │ │ -
186 {
│ │ │ │ -
187 if (prefix.size() == 0)
│ │ │ │ -
188 return subPreBasis_.size();
│ │ │ │ -
189
│ │ │ │ -
190 SizePrefix subPrefix;
│ │ │ │ -
191 for(std::size_t i=0; i<prefix.size()-1; ++i)
│ │ │ │ -
192 subPrefix.push_back(prefix[i]);
│ │ │ │ -
193
│ │ │ │ -
194 size_type r = subPreBasis_.size(subPrefix);
│ │ │ │ -
195 if (r==0)
│ │ │ │ -
196 return 0;
│ │ │ │ -
197 subPrefix.push_back(prefix.back());
│ │ │ │ -
198 r = subPreBasis_.size(subPrefix);
│ │ │ │ -
199 if (r==0)
│ │ │ │ -
200 return children;
│ │ │ │ -
201 return r;
│ │ │ │ +
131template<typename GV, typename Range, std::size_t kind, int order>
│ │ │ │ +
132class NedelecNode;
│ │ │ │ +
133
│ │ │ │ +
134template<typename GV, typename Range, std::size_t kind, int order>
│ │ │ │ + │ │ │ │ +
136{
│ │ │ │ +
137 static const int dim = GV::dimension;
│ │ │ │ +
138 static_assert(kind==1, "Only the Nedelec basis of the first kind is currently implemented!");
│ │ │ │ +
139 using FiniteElementMap = typename Impl::Nedelec1stKindLocalFiniteElementMap<GV, dim, Range, order>;
│ │ │ │ +
140
│ │ │ │ +
141 using Mapper = Dune::MultipleCodimMultipleGeomTypeMapper<GV>;
│ │ │ │ +
142public:
│ │ │ │ +
143
│ │ │ │ +
145 using GridView = GV;
│ │ │ │ +
146 using size_type = std::size_t;
│ │ │ │ +
147
│ │ │ │ + │ │ │ │ +
149
│ │ │ │ +
150 static constexpr size_type maxMultiIndexSize = 1;
│ │ │ │ +
151 static constexpr size_type minMultiIndexSize = 1;
│ │ │ │ +
152 static constexpr size_type multiIndexBufferSize = 1;
│ │ │ │ +
153
│ │ │ │ + │ │ │ │ +
156 gridView_(gv),
│ │ │ │ + │ │ │ │ +
158 mapper_(gridView_, mcmgLayout(Dim<1>{}))
│ │ │ │ +
159 {
│ │ │ │ +
160 if (kind!=1)
│ │ │ │ +
161 DUNE_THROW(NotImplemented, "Only Nedelec elements of the first kind are implemented!");
│ │ │ │ +
162
│ │ │ │ +
163 // There is no inherent reason why the basis shouldn't work for grids with more than two
│ │ │ │ +
164 // element types. Somebody simply has to sit down and implement the missing bits.
│ │ │ │ +
165 if (gv.indexSet().types(0).size() > 2)
│ │ │ │ +
166 DUNE_THROW(NotImplemented, "Nédélec basis is only implemented for grids with simplex and cube elements");
│ │ │ │ +
167
│ │ │ │ +
168 for(auto type : gv.indexSet().types(0))
│ │ │ │ +
169 if (!type.isSimplex() && !type.isCube())
│ │ │ │ +
170 DUNE_THROW(NotImplemented, "Nédélec basis is only implemented for grids with simplex or cube elements.");
│ │ │ │ +
171
│ │ │ │ +
172 if (order>1)
│ │ │ │ +
173 DUNE_THROW(NotImplemented, "Only first-order elements are implemented");
│ │ │ │ +
174
│ │ │ │ +
175 if (dim!=2 && dim!=3)
│ │ │ │ +
176 DUNE_THROW(NotImplemented, "Only 2d and 3d Nédélec elements are implemented");
│ │ │ │ +
177 }
│ │ │ │ +
178
│ │ │ │ + │ │ │ │ +
180 {}
│ │ │ │ +
181
│ │ │ │ +
184 const GridView& gridView() const
│ │ │ │ +
185 {
│ │ │ │ +
186 return gridView_;
│ │ │ │ +
187 }
│ │ │ │ +
188
│ │ │ │ +
189 /* \brief Update the stored grid view, to be called if the grid has changed */
│ │ │ │ +
190 void update (const GridView& gv)
│ │ │ │ +
191 {
│ │ │ │ +
192 gridView_ = gv;
│ │ │ │ +
193 mapper_.update(gridView_);
│ │ │ │ +
194 }
│ │ │ │ +
195
│ │ │ │ + │ │ │ │ +
200 {
│ │ │ │ +
201 return Node{&finiteElementMap_};
│ │ │ │
202 }
│ │ │ │
203
│ │ │ │ -
204public:
│ │ │ │ -
205
│ │ │ │ - │ │ │ │ -
208 {
│ │ │ │ -
209 return subPreBasis_.dimension() * children;
│ │ │ │ -
210 }
│ │ │ │ -
211
│ │ │ │ - │ │ │ │ -
214 {
│ │ │ │ -
215 return subPreBasis_.maxNodeSize() * children;
│ │ │ │ -
216 }
│ │ │ │ -
217
│ │ │ │ - │ │ │ │ -
220 {
│ │ │ │ -
221 return subPreBasis_;
│ │ │ │ -
222 }
│ │ │ │ -
223
│ │ │ │ - │ │ │ │ -
226 {
│ │ │ │ -
227 return subPreBasis_;
│ │ │ │ -
228 }
│ │ │ │ -
229
│ │ │ │ -
231 template<typename It>
│ │ │ │ -
232 It indices(const Node& node, It it) const
│ │ │ │ -
233 {
│ │ │ │ -
234 return indices(node, it, IndexMergingStrategy{});
│ │ │ │ -
235 }
│ │ │ │ -
236
│ │ │ │ -
237private:
│ │ │ │ -
238
│ │ │ │ -
239 template<typename It>
│ │ │ │ -
240 It indices(const Node& node, It multiIndices, BasisFactory::FlatInterleaved) const
│ │ │ │ -
241 {
│ │ │ │ -
242 using namespace Dune::Indices;
│ │ │ │ -
243 size_type subTreeSize = node.child(_0).size();
│ │ │ │ -
244 // Fill indices for first child at the beginning.
│ │ │ │ -
245 auto next = subPreBasis().indices(node.child(_0), multiIndices);
│ │ │ │ -
246 // Multiply first component of all indices for first child by
│ │ │ │ -
247 // number of children to stretch the index range for interleaving.
│ │ │ │ -
248 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
249 multiIndices[i][0] *= children;
│ │ │ │ -
250 for (std::size_t child = 1; child<children; ++child)
│ │ │ │ -
251 {
│ │ │ │ -
252 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
253 {
│ │ │ │ -
254 // Copy indices from first child for all other children
│ │ │ │ -
255 // and shift them by child index to interleave indices.
│ │ │ │ -
256 // multiIndices[child*subTreeSize+i] = multiIndices[i];
│ │ │ │ -
257 // multiIndices[child*subTreeSize+i][0] = multiIndices[i][0]+child;
│ │ │ │ -
258 (*next) = multiIndices[i];
│ │ │ │ -
259 (*next)[0] = multiIndices[i][0]+child;
│ │ │ │ -
260 ++next;
│ │ │ │ -
261 }
│ │ │ │ -
262 }
│ │ │ │ -
263 return next;
│ │ │ │ -
264 }
│ │ │ │ -
265
│ │ │ │ -
266 template<typename It>
│ │ │ │ -
267 It indices(const Node& node, It multiIndices, BasisFactory::FlatLexicographic) const
│ │ │ │ -
268 {
│ │ │ │ -
269 using namespace Dune::Indices;
│ │ │ │ -
270 size_type subTreeSize = node.child(_0).size();
│ │ │ │ -
271 size_type firstIndexEntrySize = subPreBasis().size();
│ │ │ │ -
272 // Fill indices for first child at the beginning.
│ │ │ │ -
273 auto next = subPreBasis().indices(node.child(_0), multiIndices);
│ │ │ │ -
274 for (std::size_t child = 1; child<children; ++child)
│ │ │ │ -
275 {
│ │ │ │ -
276 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
277 {
│ │ │ │ -
278 // Copy indices from first child for all other children
│ │ │ │ -
279 // and shift them by suitable offset to get lexicographic indices.
│ │ │ │ -
280 // multiIndices[child*subTreeSize+i] = multiIndices[i];
│ │ │ │ -
281 // multiIndices[child*subTreeSize+i][0] += child*firstIndexEntrySize;
│ │ │ │ -
282 (*next) = multiIndices[i];
│ │ │ │ -
283 (*next)[0] += child*firstIndexEntrySize;
│ │ │ │ -
284 ++next;
│ │ │ │ -
285 }
│ │ │ │ -
286 }
│ │ │ │ -
287 return next;
│ │ │ │ + │ │ │ │ +
205 {
│ │ │ │ +
206 return mapper_.size();
│ │ │ │ +
207 }
│ │ │ │ +
208
│ │ │ │ +
210 template<class SizePrefix>
│ │ │ │ +
211 size_type size(const SizePrefix& prefix) const
│ │ │ │ +
212 {
│ │ │ │ +
213 assert(prefix.size() == 0 || prefix.size() == 1);
│ │ │ │ +
214 return (prefix.size() == 0) ? size() : 0;
│ │ │ │ +
215 }
│ │ │ │ +
216
│ │ │ │ + │ │ │ │ +
218 {
│ │ │ │ +
219 return size();
│ │ │ │ +
220 }
│ │ │ │ +
221
│ │ │ │ + │ │ │ │ +
223 {
│ │ │ │ +
224 size_type result = 0;
│ │ │ │ +
225 for (auto&& type : gridView_.indexSet().types(0))
│ │ │ │ +
226 {
│ │ │ │ +
227 size_type numEdges = referenceElement<typename GV::ctype,dim>(type).size(dim-1);
│ │ │ │ +
228 result = std::max(result, numEdges);
│ │ │ │ +
229 }
│ │ │ │ +
230
│ │ │ │ +
231 return result;
│ │ │ │ +
232 }
│ │ │ │ +
233
│ │ │ │ +
237 template<typename It>
│ │ │ │ +
238 It indices(const Node& node, It it) const
│ │ │ │ +
239 {
│ │ │ │ +
240 const auto& element = node.element();
│ │ │ │ +
241
│ │ │ │ +
242 // throw if Element is not of predefined type
│ │ │ │ +
243 if (not(element.type().isCube()) and not(element.type().isSimplex()))
│ │ │ │ +
244 DUNE_THROW(NotImplemented, "NedelecBasis only implemented for cube and simplex elements.");
│ │ │ │ +
245
│ │ │ │ +
246 for(std::size_t i=0, end=node.size(); i<end; ++i, ++it)
│ │ │ │ +
247 {
│ │ │ │ +
248 Dune::LocalKey localKey = node.finiteElement().localCoefficients().localKey(i);
│ │ │ │ +
249 *it = { mapper_.subIndex(element, localKey.subEntity(), localKey.codim()) + localKey.index() };
│ │ │ │ +
250 }
│ │ │ │ +
251
│ │ │ │ +
252 return it;
│ │ │ │ +
253 }
│ │ │ │ +
254
│ │ │ │ +
255protected:
│ │ │ │ + │ │ │ │ +
257 FiniteElementMap finiteElementMap_;
│ │ │ │ +
258 Mapper mapper_;
│ │ │ │ +
259};
│ │ │ │ +
260
│ │ │ │ +
261
│ │ │ │ +
262
│ │ │ │ +
263template<typename GV, typename Range, size_t kind, int order>
│ │ │ │ + │ │ │ │ +
265 public LeafBasisNode
│ │ │ │ +
266{
│ │ │ │ +
267 static const int dim = GV::dimension;
│ │ │ │ +
268
│ │ │ │ +
269public:
│ │ │ │ +
270
│ │ │ │ +
271 using size_type = std::size_t;
│ │ │ │ +
272 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ +
273 static_assert(kind==1, "Only Nedelec elements of the first kind are implemented!");
│ │ │ │ +
274 using FiniteElementMap = typename Impl::Nedelec1stKindLocalFiniteElementMap<GV, dim, Range, order>;
│ │ │ │ +
275 using FiniteElement = Impl::GlobalValuedLocalFiniteElement<Impl::CovariantPiolaTransformator,
│ │ │ │ +
276 typename FiniteElementMap::FiniteElement,
│ │ │ │ +
277 Element>;
│ │ │ │ +
278
│ │ │ │ +
279 NedelecNode(const FiniteElementMap* finiteElementMap) :
│ │ │ │ +
280 element_(nullptr),
│ │ │ │ +
281 finiteElementMap_(finiteElementMap)
│ │ │ │ +
282 { }
│ │ │ │ +
283
│ │ │ │ +
285 const Element& element() const
│ │ │ │ +
286 {
│ │ │ │ +
287 return *element_;
│ │ │ │
288 }
│ │ │ │
289
│ │ │ │ -
290 template<class MultiIndex>
│ │ │ │ -
291 static void multiIndexPushFront(MultiIndex& M, size_type M0)
│ │ │ │ -
292 {
│ │ │ │ -
293 M.resize(M.size()+1);
│ │ │ │ -
294 for(std::size_t i=M.size()-1; i>0; --i)
│ │ │ │ -
295 M[i] = M[i-1];
│ │ │ │ -
296 M[0] = M0;
│ │ │ │ + │ │ │ │ +
295 {
│ │ │ │ +
296 return finiteElement_;
│ │ │ │
297 }
│ │ │ │
298
│ │ │ │ -
299 template<typename It>
│ │ │ │ -
300 It indices(const Node& node, It multiIndices, BasisFactory::BlockedLexicographic) const
│ │ │ │ -
301 {
│ │ │ │ -
302 using namespace Dune::Indices;
│ │ │ │ -
303 size_type subTreeSize = node.child(_0).size();
│ │ │ │ -
304 // Fill indices for first child at the beginning.
│ │ │ │ -
305 auto next = subPreBasis().indices(node.child(_0), multiIndices);
│ │ │ │ -
306 // Insert 0 before first component of all indices for first child.
│ │ │ │ -
307 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
308 multiIndexPushFront(multiIndices[i], 0);
│ │ │ │ -
309 for (std::size_t child = 1; child<children; ++child)
│ │ │ │ -
310 {
│ │ │ │ -
311 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
312 {
│ │ │ │ -
313 // Copy indices from first child for all other children and overwrite
│ │ │ │ -
314 // zero in first component as inserted above by child index.
│ │ │ │ -
315 // multiIndices[child*subTreeSize+i] = multiIndices[i];
│ │ │ │ -
316 // multiIndices[child*subTreeSize+i][0] = child;
│ │ │ │ -
317 (*next) = multiIndices[i];
│ │ │ │ -
318 (*next)[0] = child;
│ │ │ │ -
319 ++next;
│ │ │ │ -
320 }
│ │ │ │ -
321 }
│ │ │ │ -
322 return next;
│ │ │ │ -
323 }
│ │ │ │ -
324
│ │ │ │ -
325 template<typename It>
│ │ │ │ -
326 It indices(const Node& node, It multiIndices, BasisFactory::BlockedInterleaved) const
│ │ │ │ -
327 {
│ │ │ │ -
328 using namespace Dune::Indices;
│ │ │ │ -
329 size_type subTreeSize = node.child(_0).size();
│ │ │ │ -
330 // Fill indices for first child at the beginning.
│ │ │ │ -
331 auto next = subPreBasis().indices(node.child(_0), multiIndices);
│ │ │ │ -
332 // Append 0 after last component of all indices for first child.
│ │ │ │ -
333 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
334 multiIndices[i].push_back(0);
│ │ │ │ -
335 for (std::size_t child = 1; child<children; ++child)
│ │ │ │ -
336 {
│ │ │ │ -
337 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
338 {
│ │ │ │ -
339 // Copy indices from first child for all other children and overwrite
│ │ │ │ -
340 // zero in last component as appended above by child index.
│ │ │ │ -
341 (*next) = multiIndices[i];
│ │ │ │ -
342 (*next).back() = child;
│ │ │ │ -
343 ++next;
│ │ │ │ -
344 }
│ │ │ │ -
345 }
│ │ │ │ -
346 return next;
│ │ │ │ -
347 }
│ │ │ │ -
348
│ │ │ │ -
349 SubPreBasis subPreBasis_;
│ │ │ │ -
350};
│ │ │ │ -
351
│ │ │ │ +
300 void bind(const Element& e)
│ │ │ │ +
301 {
│ │ │ │ +
302 element_ = &e;
│ │ │ │ +
303 finiteElement_.bind((finiteElementMap_->find(*element_)), e);
│ │ │ │ +
304 this->setSize(finiteElement_.size());
│ │ │ │ +
305 }
│ │ │ │ +
306
│ │ │ │ +
307protected:
│ │ │ │ +
308
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
312};
│ │ │ │ +
313
│ │ │ │ +
314
│ │ │ │ +
315
│ │ │ │ +
316namespace BasisFactory {
│ │ │ │ +
317
│ │ │ │ +
327template<std::size_t kind, std::size_t order, typename Range=double>
│ │ │ │ + │ │ │ │ +
329{
│ │ │ │ +
330 return [](const auto& gridView) {
│ │ │ │ +
331 return NedelecPreBasis<std::decay_t<decltype(gridView)>, Range, kind, order>(gridView);
│ │ │ │ +
332 };
│ │ │ │ +
333}
│ │ │ │ +
334
│ │ │ │ +
335} // end namespace BasisFactory
│ │ │ │ +
336
│ │ │ │ +
337
│ │ │ │ +
338
│ │ │ │ +
339// *****************************************************************************
│ │ │ │ +
340// This is the actual global basis implementation based on the reusable parts.
│ │ │ │ +
341// *****************************************************************************
│ │ │ │ +
342
│ │ │ │ +
350template<typename GV, std::size_t kind, std::size_t order, typename Range=double>
│ │ │ │ + │ │ │ │
352
│ │ │ │ -
353
│ │ │ │ -
354namespace BasisFactory {
│ │ │ │ +
353} // end namespace Dune::Functions
│ │ │ │ +
354
│ │ │ │
355
│ │ │ │ -
368template<std::size_t k, class ChildPreBasisFactory, class IndexMergingStrategy>
│ │ │ │ -
369auto power(ChildPreBasisFactory&& childPreBasisFactory, const IndexMergingStrategy&)
│ │ │ │ -
370{
│ │ │ │ -
371 return [childPreBasisFactory](const auto& gridView) {
│ │ │ │ -
372 auto childPreBasis = childPreBasisFactory(gridView);
│ │ │ │ - │ │ │ │ -
374 };
│ │ │ │ -
375}
│ │ │ │ -
376
│ │ │ │ -
387template<std::size_t k, class ChildPreBasisFactory>
│ │ │ │ -
388auto power(ChildPreBasisFactory&& childPreBasisFactory)
│ │ │ │ -
389{
│ │ │ │ -
390 return [childPreBasisFactory](const auto& gridView) {
│ │ │ │ -
391 auto childPreBasis = childPreBasisFactory(gridView);
│ │ │ │ - │ │ │ │ -
393 };
│ │ │ │ -
394}
│ │ │ │ -
395
│ │ │ │ -
396} // end namespace BasisFactory
│ │ │ │ -
397
│ │ │ │ -
398// Backward compatibility
│ │ │ │ -
399namespace BasisBuilder {
│ │ │ │ -
400
│ │ │ │ -
401 using namespace BasisFactory;
│ │ │ │ -
402
│ │ │ │ -
403}
│ │ │ │ -
404
│ │ │ │ -
405
│ │ │ │ -
406} // end namespace Functions
│ │ │ │ -
407} // end namespace Dune
│ │ │ │ -
408
│ │ │ │ -
409
│ │ │ │ -
410#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_POWERBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
auto power(ChildPreBasisFactory &&childPreBasisFactory)
Create a factory builder that can build a PowerPreBasis.
Definition: powerbasis.hh:388
│ │ │ │ -
typename std::enable_if< std::is_constructible< T, Args... >::value, int >::type enableIfConstructible
Helper to constrain forwarding constructors.
Definition: type_traits.hh:26
│ │ │ │ -
Definition: polynomial.hh:10
│ │ │ │ -
Base class for index merging strategies to simplify detection.
Definition: basistags.hh:44
│ │ │ │ -
Interleaved merging of direct children without blocking.
Definition: basistags.hh:114
│ │ │ │ -
Definition: nodes.hh:193
│ │ │ │ -
A pre-basis for power bases.
Definition: powerbasis.hh:45
│ │ │ │ -
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition: powerbasis.hh:207
│ │ │ │ -
std::size_t size_type
Type used for indices and size information.
Definition: powerbasis.hh:58
│ │ │ │ -
IMS IndexMergingStrategy
Strategy used to merge the global indices of the child factories.
Definition: powerbasis.hh:61
│ │ │ │ -
PowerBasisNode< SubNode, children > Node
Template mapping root tree path to type of created tree node.
Definition: powerbasis.hh:66
│ │ │ │ -
typename SPB::GridView GridView
The grid view that the FE basis is defined on.
Definition: powerbasis.hh:55
│ │ │ │ -
static constexpr size_type multiIndexBufferSize
Definition: powerbasis.hh:70
│ │ │ │ -
SPB SubPreBasis
The child pre-basis.
Definition: powerbasis.hh:52
│ │ │ │ -
typename SubPreBasis::Node SubNode
Definition: powerbasis.hh:63
│ │ │ │ -
void initializeIndices()
Initialize the global indices.
Definition: powerbasis.hh:87
│ │ │ │ -
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition: powerbasis.hh:99
│ │ │ │ -
It indices(const Node &node, It it) const
Maps from subtree index set [0..size-1] to a globally unique multi index in global basis.
Definition: powerbasis.hh:232
│ │ │ │ -
PowerPreBasis(SFArgs &&... sfArgs)
Constructor for given child pre-basis objects.
Definition: powerbasis.hh:80
│ │ │ │ -
size_type size() const
Same as size(prefix) with empty prefix.
Definition: powerbasis.hh:116
│ │ │ │ -
SubPreBasis & subPreBasis()
Mutable access to the stored prebasis of the factor in the power space.
Definition: powerbasis.hh:225
│ │ │ │ -
Node makeNode() const
Create tree node.
Definition: powerbasis.hh:107
│ │ │ │ -
static constexpr size_type maxMultiIndexSize
Definition: powerbasis.hh:68
│ │ │ │ -
static constexpr size_type minMultiIndexSize
Definition: powerbasis.hh:69
│ │ │ │ -
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition: powerbasis.hh:213
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: powerbasis.hh:93
│ │ │ │ -
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition: powerbasis.hh:124
│ │ │ │ -
const SubPreBasis & subPreBasis() const
Const access to the stored prebasis of the factor in the power space.
Definition: powerbasis.hh:219
│ │ │ │ - │ │ │ │ +
356#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NEDELECBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
auto power(ChildPreBasisFactory &&childPreBasisFactory, const IndexMergingStrategy &)
Create a pre-basis factory that can build a PowerPreBasis.
Definition: powerbasis.hh:369
│ │ │ │ +
auto nedelec()
Create a pre-basis factory that can create a Nédélec pre-basis.
Definition: nedelecbasis.hh:328
│ │ │ │ +
Definition: polynomial.hh:11
│ │ │ │ +
Global basis for given pre-basis.
Definition: defaultglobalbasis.hh:46
│ │ │ │ +
Definition: nedelecbasis.hh:266
│ │ │ │ +
const FiniteElementMap * finiteElementMap_
Definition: nedelecbasis.hh:311
│ │ │ │ +
FiniteElement finiteElement_
Definition: nedelecbasis.hh:309
│ │ │ │ +
Impl::GlobalValuedLocalFiniteElement< Impl::CovariantPiolaTransformator, typename FiniteElementMap::FiniteElement, Element > FiniteElement
Definition: nedelecbasis.hh:277
│ │ │ │ +
void bind(const Element &e)
Bind to element.
Definition: nedelecbasis.hh:300
│ │ │ │ +
const Element & element() const
Return current element, throw if unbound.
Definition: nedelecbasis.hh:285
│ │ │ │ +
typename GV::template Codim< 0 >::Entity Element
Definition: nedelecbasis.hh:272
│ │ │ │ +
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition: nedelecbasis.hh:294
│ │ │ │ +
NedelecNode(const FiniteElementMap *finiteElementMap)
Definition: nedelecbasis.hh:279
│ │ │ │ +
typename Impl::Nedelec1stKindLocalFiniteElementMap< GV, dim, Range, order > FiniteElementMap
Definition: nedelecbasis.hh:274
│ │ │ │ +
const Element * element_
Definition: nedelecbasis.hh:310
│ │ │ │ +
std::size_t size_type
Definition: nedelecbasis.hh:271
│ │ │ │ +
Definition: nedelecbasis.hh:136
│ │ │ │ +
It indices(const Node &node, It it) const
Maps from subtree index set [0..size-1] to a globally unique multi index in global basis.
Definition: nedelecbasis.hh:238
│ │ │ │ +
size_type size(const SizePrefix &prefix) const
Return number possible values for next position in multi index.
Definition: nedelecbasis.hh:211
│ │ │ │ +
std::size_t size_type
Definition: nedelecbasis.hh:146
│ │ │ │ +
NedelecPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition: nedelecbasis.hh:155
│ │ │ │ +
GV GridView
The grid view that the FE space is defined on.
Definition: nedelecbasis.hh:145
│ │ │ │ +
size_type dimension() const
Definition: nedelecbasis.hh:217
│ │ │ │ +
static constexpr size_type maxMultiIndexSize
Definition: nedelecbasis.hh:150
│ │ │ │ +
static constexpr size_type multiIndexBufferSize
Definition: nedelecbasis.hh:152
│ │ │ │ +
GridView gridView_
Definition: nedelecbasis.hh:256
│ │ │ │ +
FiniteElementMap finiteElementMap_
Definition: nedelecbasis.hh:257
│ │ │ │ +
static constexpr size_type minMultiIndexSize
Definition: nedelecbasis.hh:151
│ │ │ │ +
void initializeIndices()
Definition: nedelecbasis.hh:179
│ │ │ │ +
void update(const GridView &gv)
Definition: nedelecbasis.hh:190
│ │ │ │ +
size_type maxNodeSize() const
Definition: nedelecbasis.hh:222
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: nedelecbasis.hh:184
│ │ │ │ +
Node makeNode() const
Create tree node.
Definition: nedelecbasis.hh:199
│ │ │ │ +
size_type size() const
Definition: nedelecbasis.hh:204
│ │ │ │ +
Mapper mapper_
Definition: nedelecbasis.hh:258
│ │ │ │ +
size_type size() const
Definition: nodes.hh:142
│ │ │ │ +
void setSize(const size_type size)
Definition: nodes.hh:164
│ │ │ │ +
Definition: nodes.hh:186
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -us-ascii │ │ │ │ │ +utf-8 │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,497 +5,502 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -powerbasis.hh │ │ │ │ │ +nedelecbasis.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_POWERBASIS_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_POWERBASIS_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NEDELECBASIS_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NEDELECBASIS_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ - 8#include │ │ │ │ │ - 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8 │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11 │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14 │ │ │ │ │ 15#include │ │ │ │ │ - 16 │ │ │ │ │ - 17 │ │ │ │ │ + 16#include │ │ │ │ │ + 17#include │ │ │ │ │ 18 │ │ │ │ │ - 19namespace Dune { │ │ │ │ │ - 20namespace Functions { │ │ │ │ │ + 19namespace Dune::Functions │ │ │ │ │ + 20{ │ │ │ │ │ 21 │ │ │ │ │ - 22 │ │ │ │ │ - 23/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 24// This is the reusable part of the power bases. It contains │ │ │ │ │ - 25// │ │ │ │ │ - 26// PowerPreBasis │ │ │ │ │ - 27// │ │ │ │ │ - 28// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ -shared │ │ │ │ │ - 29// state. These components do _not_ depend on the global basis and local │ │ │ │ │ -view │ │ │ │ │ - 30// and can be used without a global basis. │ │ │ │ │ - 31/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ + 22namespace Impl │ │ │ │ │ + 23{ │ │ │ │ │ + 24 template │ │ │ │ │ + 25 class Nedelec1stKindLocalFiniteElementMap │ │ │ │ │ + 26 { │ │ │ │ │ + 27 using D = typename GV::ctype; │ │ │ │ │ + 28 constexpr static bool hasFixedElementType = Capabilities:: │ │ │ │ │ +hasSingleGeometryType::v; │ │ │ │ │ + 29 │ │ │ │ │ + 30 using CubeFiniteElement = │ │ │ │ │ +Nedelec1stKindCubeLocalFiniteElement; │ │ │ │ │ + 31 using SimplexFiniteElement = │ │ │ │ │ +Nedelec1stKindSimplexLocalFiniteElement; │ │ │ │ │ 32 │ │ │ │ │ - 43template │ │ │ │ │ -44class PowerPreBasis │ │ │ │ │ - 45{ │ │ │ │ │ - 46 static const std::size_t children = C; │ │ │ │ │ - 47 static const bool isBlocked = std::is_same_v or std::is_same_v; │ │ │ │ │ + 33 public: │ │ │ │ │ + 34 │ │ │ │ │ + 35 using T = LocalBasisTraits, R, dim, │ │ │ │ │ +FieldVector, FieldMatrix >; │ │ │ │ │ + 36 │ │ │ │ │ + 37 constexpr static unsigned int topologyId = Capabilities:: │ │ │ │ │ +hasSingleGeometryType::topologyId; // meaningless if │ │ │ │ │ +hasFixedElementType is false │ │ │ │ │ + 38 constexpr static GeometryType type = GeometryType(topologyId, GV:: │ │ │ │ │ +dimension); │ │ │ │ │ + 39 │ │ │ │ │ + 40 using FiniteElement = std::conditional_t, │ │ │ │ │ + 42 LocalFiniteElementVariant >; │ │ │ │ │ + 43 │ │ │ │ │ + 44 static std::size_t numVariants(GeometryType type) │ │ │ │ │ + 45 { │ │ │ │ │ + 46 if (order!=1) // I am not sure whether the formula below is correct for all │ │ │ │ │ +orders. │ │ │ │ │ + 47 DUNE_THROW(NotImplemented, "Only Nedelec elements of order 1 are │ │ │ │ │ +implemented!"); │ │ │ │ │ 48 │ │ │ │ │ - 49public: │ │ │ │ │ - 50 │ │ │ │ │ -52 using SubPreBasis = SPB; │ │ │ │ │ - 53 │ │ │ │ │ -55 using GridView = typename SPB::GridView; │ │ │ │ │ - 56 │ │ │ │ │ -58 using size_type = std::size_t; │ │ │ │ │ - 59 │ │ │ │ │ -61 using IndexMergingStrategy = IMS; │ │ │ │ │ - 62 │ │ │ │ │ -63 using SubNode = typename SubPreBasis::Node; │ │ │ │ │ - 64 │ │ │ │ │ -66 using Node = PowerBasisNode; │ │ │ │ │ - 67 │ │ │ │ │ -68 static constexpr size_type maxMultiIndexSize = SubPreBasis:: │ │ │ │ │ -maxMultiIndexSize + isBlocked; │ │ │ │ │ -69 static constexpr size_type minMultiIndexSize = SubPreBasis:: │ │ │ │ │ -minMultiIndexSize + isBlocked; │ │ │ │ │ -70 static constexpr size_type multiIndexBufferSize = SubPreBasis:: │ │ │ │ │ -multiIndexBufferSize + isBlocked; │ │ │ │ │ - 71 │ │ │ │ │ - 77 template = 0, │ │ │ │ │ - 79 enableIfConstructible = 0> │ │ │ │ │ -80 PowerPreBasis(SFArgs&&... sfArgs) : │ │ │ │ │ - 81 subPreBasis_(std::forward(sfArgs)...) │ │ │ │ │ - 82 { │ │ │ │ │ - 83 static_assert(models, SubPreBasis>(), │ │ │ │ │ -"Subprebasis passed to PowerPreBasis does not model the PreBasis concept."); │ │ │ │ │ - 84 } │ │ │ │ │ - 85 │ │ │ │ │ -87 void initializeIndices() │ │ │ │ │ - 88 { │ │ │ │ │ - 89 subPreBasis_.initializeIndices(); │ │ │ │ │ - 90 } │ │ │ │ │ - 91 │ │ │ │ │ -93 const GridView& gridView() const │ │ │ │ │ - 94 { │ │ │ │ │ - 95 return subPreBasis_.gridView(); │ │ │ │ │ + 49 auto numEdges = referenceElement(type).size(dim-1); │ │ │ │ │ + 50 return power(2,numEdges); │ │ │ │ │ + 51 } │ │ │ │ │ + 52 │ │ │ │ │ + 53 Nedelec1stKindLocalFiniteElementMap(const GV& gv) │ │ │ │ │ + 54 : elementMapper_(gv, mcmgElementLayout()), │ │ │ │ │ + 55 orientation_(gv.size(0)) │ │ │ │ │ + 56 { │ │ │ │ │ + 57 // create all variants │ │ │ │ │ + 58 if constexpr (hasFixedElementType) │ │ │ │ │ + 59 { │ │ │ │ │ + 60 variants_.resize(numVariants(type)); │ │ │ │ │ + 61 for (size_t i = 0; i < numVariants(type); i++) │ │ │ │ │ + 62 variants_[i] = FiniteElement(i); │ │ │ │ │ + 63 } │ │ │ │ │ + 64 else │ │ │ │ │ + 65 { │ │ │ │ │ + 66 // for mixed grids add offset for cubes │ │ │ │ │ + 67 variants_.resize(numVariants(GeometryTypes::simplex(dim)) + numVariants │ │ │ │ │ +(GeometryTypes::cube(dim))); │ │ │ │ │ + 68 for (size_t i = 0; i < numVariants(GeometryTypes::simplex(dim)); i++) │ │ │ │ │ + 69 variants_[i] = SimplexFiniteElement(i); │ │ │ │ │ + 70 for (size_t i = 0; i < numVariants(GeometryTypes::cube(dim)); i++) │ │ │ │ │ + 71 variants_[i + numVariants(GeometryTypes::simplex(dim))] = CubeFiniteElement │ │ │ │ │ +(i); │ │ │ │ │ + 72 } │ │ │ │ │ + 73 │ │ │ │ │ + 74 │ │ │ │ │ + 75 // compute orientation for all elements │ │ │ │ │ + 76 const auto& indexSet = gv.indexSet(); │ │ │ │ │ + 77 │ │ │ │ │ + 78 for(const auto& element : elements(gv)) │ │ │ │ │ + 79 { │ │ │ │ │ + 80 const auto& refElement = referenceElement(element); │ │ │ │ │ + 81 auto elementIndex = elementMapper_.index(element); │ │ │ │ │ + 82 orientation_[elementIndex] = 0; │ │ │ │ │ + 83 │ │ │ │ │ + 84 for (std::size_t i=0; iglobalV1) || (localV0>localV1 && │ │ │ │ │ +globalV0{}); │ │ │ │ │ - 119 } │ │ │ │ │ - 120 │ │ │ │ │ - 122 │ │ │ │ │ - 123 template │ │ │ │ │ -124 size_type size(const SizePrefix& prefix) const │ │ │ │ │ - 125 { │ │ │ │ │ - 126 return size(prefix, IndexMergingStrategy{}); │ │ │ │ │ - 127 } │ │ │ │ │ - 128 │ │ │ │ │ - 129private: │ │ │ │ │ + 104 template │ │ │ │ │ + 105 const auto& find(const Element& element) const │ │ │ │ │ + 106 { │ │ │ │ │ + 107 return variants_[orientation_[elementMapper_.index(element)]]; │ │ │ │ │ + 108 } │ │ │ │ │ + 109 │ │ │ │ │ + 110 private: │ │ │ │ │ + 111 std::vector variants_; │ │ │ │ │ + 112 const Dune::MultipleCodimMultipleGeomTypeMapper elementMapper_; │ │ │ │ │ + 113 std::vector orientation_; │ │ │ │ │ + 114 }; │ │ │ │ │ + 115 │ │ │ │ │ + 116 │ │ │ │ │ + 117} // namespace Impl │ │ │ │ │ + 118 │ │ │ │ │ + 119 │ │ │ │ │ + 120/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ + 121// This is the reusable part of the basis. It contains │ │ │ │ │ + 122// │ │ │ │ │ + 123// NedelecPreBasis │ │ │ │ │ + 124// NedelecNode │ │ │ │ │ + 125// │ │ │ │ │ + 126// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ +shared │ │ │ │ │ + 127// state. These components do _not_ depend on the global basis and local │ │ │ │ │ +view │ │ │ │ │ + 128// and can be used without a global basis. │ │ │ │ │ + 129/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ 130 │ │ │ │ │ - 131 template │ │ │ │ │ - 132 size_type size(const SizePrefix& prefix, BasisFactory::FlatInterleaved) │ │ │ │ │ -const │ │ │ │ │ - 133 { │ │ │ │ │ - 134 // The root index size is the root index size of a single subnode │ │ │ │ │ - 135 // multiplied by the number of subnodes because we enumerate all │ │ │ │ │ - 136 // child indices in a row. │ │ │ │ │ - 137 if (prefix.size() == 0) │ │ │ │ │ - 138 return children*subPreBasis_.size(); │ │ │ │ │ - 139 │ │ │ │ │ - 140 // The first prefix entry refers to one of the (root index size) │ │ │ │ │ - 141 // subindex trees. Hence we have to first compute the corresponding │ │ │ │ │ - 142 // prefix entry for a single subnode subnode. The we can append │ │ │ │ │ - 143 // the other prefix entries unmodified, because the index tree │ │ │ │ │ - 144 // looks the same after the first level. │ │ │ │ │ - 145 SizePrefix subPrefix; │ │ │ │ │ - 146 subPrefix.push_back(prefix[0] / children); │ │ │ │ │ - 147 for(std::size_t i=1; i │ │ │ │ │ - 153 size_type size(const SizePrefix& prefix, BasisFactory::FlatLexicographic) │ │ │ │ │ -const │ │ │ │ │ - 154 { │ │ │ │ │ - 155 // The size at the index tree root is the size of at the index tree │ │ │ │ │ - 156 // root of a single subnode multiplied by the number of subnodes │ │ │ │ │ - 157 // because we enumerate all child indices in a row. │ │ │ │ │ - 158 if (prefix.size() == 0) │ │ │ │ │ - 159 return children*subPreBasis_.size(); │ │ │ │ │ - 160 │ │ │ │ │ - 161 // The first prefix entry refers to one of the (root index size) │ │ │ │ │ - 162 // subindex trees. Hence we have to first compute the corresponding │ │ │ │ │ - 163 // prefix entry for a single subnode subnode. The we can append │ │ │ │ │ - 164 // the other prefix entries unmodified, because the index tree │ │ │ │ │ - 165 // looks the same after the first level. │ │ │ │ │ - 166 SizePrefix subPrefix; │ │ │ │ │ - 167 subPrefix.push_back(prefix[0] % children); │ │ │ │ │ - 168 for(std::size_t i=1; i │ │ │ │ │ - 174 size_type size(const SizePrefix& prefix, BasisFactory:: │ │ │ │ │ -BlockedLexicographic) const │ │ │ │ │ - 175 { │ │ │ │ │ - 176 if (prefix.size() == 0) │ │ │ │ │ - 177 return children; │ │ │ │ │ - 178 SizePrefix subPrefix; │ │ │ │ │ - 179 for(std::size_t i=1; i │ │ │ │ │ - 185 size_type size(const SizePrefix& prefix, BasisFactory::BlockedInterleaved) │ │ │ │ │ -const │ │ │ │ │ - 186 { │ │ │ │ │ - 187 if (prefix.size() == 0) │ │ │ │ │ - 188 return subPreBasis_.size(); │ │ │ │ │ - 189 │ │ │ │ │ - 190 SizePrefix subPrefix; │ │ │ │ │ - 191 for(std::size_t i=0; i │ │ │ │ │ + 132class NedelecNode; │ │ │ │ │ + 133 │ │ │ │ │ + 134template │ │ │ │ │ +135class NedelecPreBasis │ │ │ │ │ + 136{ │ │ │ │ │ + 137 static const int dim = GV::dimension; │ │ │ │ │ + 138 static_assert(kind==1, "Only the Nedelec basis of the first kind is │ │ │ │ │ +currently implemented!"); │ │ │ │ │ + 139 using FiniteElementMap = typename Impl:: │ │ │ │ │ +Nedelec1stKindLocalFiniteElementMap; │ │ │ │ │ + 140 │ │ │ │ │ + 141 using Mapper = Dune::MultipleCodimMultipleGeomTypeMapper; │ │ │ │ │ + 142public: │ │ │ │ │ + 143 │ │ │ │ │ +145 using GridView = GV; │ │ │ │ │ +146 using size_type = std::size_t; │ │ │ │ │ + 147 │ │ │ │ │ +148 using Node = NedelecNode; │ │ │ │ │ + 149 │ │ │ │ │ +150 static constexpr size_type maxMultiIndexSize = 1; │ │ │ │ │ +151 static constexpr size_type minMultiIndexSize = 1; │ │ │ │ │ +152 static constexpr size_type multiIndexBufferSize = 1; │ │ │ │ │ + 153 │ │ │ │ │ +155 NedelecPreBasis(const GridView& gv) : │ │ │ │ │ + 156 gridView_(gv), │ │ │ │ │ + 157 finiteElementMap_(gv), │ │ │ │ │ + 158 mapper_(gridView_, mcmgLayout(Dim<1>{})) │ │ │ │ │ + 159 { │ │ │ │ │ + 160 if (kind!=1) │ │ │ │ │ + 161 DUNE_THROW(NotImplemented, "Only Nedelec elements of the first kind are │ │ │ │ │ +implemented!"); │ │ │ │ │ + 162 │ │ │ │ │ + 163 // There is no inherent reason why the basis shouldn't work for grids with │ │ │ │ │ +more than two │ │ │ │ │ + 164 // element types. Somebody simply has to sit down and implement the │ │ │ │ │ +missing bits. │ │ │ │ │ + 165 if (gv.indexSet().types(0).size() > 2) │ │ │ │ │ + 166 DUNE_THROW(NotImplemented, "Nédélec basis is only implemented for grids │ │ │ │ │ +with simplex and cube elements"); │ │ │ │ │ + 167 │ │ │ │ │ + 168 for(auto type : gv.indexSet().types(0)) │ │ │ │ │ + 169 if (!type.isSimplex() && !type.isCube()) │ │ │ │ │ + 170 DUNE_THROW(NotImplemented, "Nédélec basis is only implemented for grids │ │ │ │ │ +with simplex or cube elements."); │ │ │ │ │ + 171 │ │ │ │ │ + 172 if (order>1) │ │ │ │ │ + 173 DUNE_THROW(NotImplemented, "Only first-order elements are implemented"); │ │ │ │ │ + 174 │ │ │ │ │ + 175 if (dim!=2 && dim!=3) │ │ │ │ │ + 176 DUNE_THROW(NotImplemented, "Only 2d and 3d Nédélec elements are │ │ │ │ │ +implemented"); │ │ │ │ │ + 177 } │ │ │ │ │ + 178 │ │ │ │ │ +179 void initializeIndices() │ │ │ │ │ + 180 {} │ │ │ │ │ + 181 │ │ │ │ │ +184 const GridView& gridView() const │ │ │ │ │ + 185 { │ │ │ │ │ + 186 return gridView_; │ │ │ │ │ + 187 } │ │ │ │ │ + 188 │ │ │ │ │ + 189 /* \brief Update the stored grid view, to be called if the grid has │ │ │ │ │ +changed */ │ │ │ │ │ +190 void update (const GridView& gv) │ │ │ │ │ + 191 { │ │ │ │ │ + 192 gridView_ = gv; │ │ │ │ │ + 193 mapper_.update(gridView_); │ │ │ │ │ + 194 } │ │ │ │ │ + 195 │ │ │ │ │ +199 Node makeNode() const │ │ │ │ │ + 200 { │ │ │ │ │ + 201 return Node{&finiteElementMap_}; │ │ │ │ │ 202 } │ │ │ │ │ 203 │ │ │ │ │ - 204public: │ │ │ │ │ - 205 │ │ │ │ │ -207 size_type dimension() const │ │ │ │ │ - 208 { │ │ │ │ │ - 209 return subPreBasis_.dimension() * children; │ │ │ │ │ - 210 } │ │ │ │ │ - 211 │ │ │ │ │ -213 size_type maxNodeSize() const │ │ │ │ │ - 214 { │ │ │ │ │ - 215 return subPreBasis_.maxNodeSize() * children; │ │ │ │ │ - 216 } │ │ │ │ │ - 217 │ │ │ │ │ -219 const SubPreBasis& subPreBasis() const │ │ │ │ │ - 220 { │ │ │ │ │ - 221 return subPreBasis_; │ │ │ │ │ - 222 } │ │ │ │ │ - 223 │ │ │ │ │ -225 SubPreBasis& subPreBasis() │ │ │ │ │ +204 size_type size() const │ │ │ │ │ + 205 { │ │ │ │ │ + 206 return mapper_.size(); │ │ │ │ │ + 207 } │ │ │ │ │ + 208 │ │ │ │ │ + 210 template │ │ │ │ │ +211 size_type size(const SizePrefix& prefix) const │ │ │ │ │ + 212 { │ │ │ │ │ + 213 assert(prefix.size() == 0 || prefix.size() == 1); │ │ │ │ │ + 214 return (prefix.size() == 0) ? size() : 0; │ │ │ │ │ + 215 } │ │ │ │ │ + 216 │ │ │ │ │ +217 size_type dimension() const │ │ │ │ │ + 218 { │ │ │ │ │ + 219 return size(); │ │ │ │ │ + 220 } │ │ │ │ │ + 221 │ │ │ │ │ +222 size_type maxNodeSize() const │ │ │ │ │ + 223 { │ │ │ │ │ + 224 size_type result = 0; │ │ │ │ │ + 225 for (auto&& type : gridView_.indexSet().types(0)) │ │ │ │ │ 226 { │ │ │ │ │ - 227 return subPreBasis_; │ │ │ │ │ - 228 } │ │ │ │ │ - 229 │ │ │ │ │ - 231 template │ │ │ │ │ -232 It indices(const Node& node, It it) const │ │ │ │ │ - 233 { │ │ │ │ │ - 234 return indices(node, it, IndexMergingStrategy{}); │ │ │ │ │ - 235 } │ │ │ │ │ - 236 │ │ │ │ │ - 237private: │ │ │ │ │ - 238 │ │ │ │ │ - 239 template │ │ │ │ │ - 240 It indices(const Node& node, It multiIndices, BasisFactory:: │ │ │ │ │ -FlatInterleaved) const │ │ │ │ │ - 241 { │ │ │ │ │ - 242 using namespace Dune::Indices; │ │ │ │ │ - 243 size_type subTreeSize = node.child(_0).size(); │ │ │ │ │ - 244 // Fill indices for first child at the beginning. │ │ │ │ │ - 245 auto next = subPreBasis().indices(node.child(_0), multiIndices); │ │ │ │ │ - 246 // Multiply first component of all indices for first child by │ │ │ │ │ - 247 // number of children to stretch the index range for interleaving. │ │ │ │ │ - 248 for (std::size_t i = 0; i │ │ │ │ │ - 267 It indices(const Node& node, It multiIndices, BasisFactory:: │ │ │ │ │ -FlatLexicographic) const │ │ │ │ │ - 268 { │ │ │ │ │ - 269 using namespace Dune::Indices; │ │ │ │ │ - 270 size_type subTreeSize = node.child(_0).size(); │ │ │ │ │ - 271 size_type firstIndexEntrySize = subPreBasis().size(); │ │ │ │ │ - 272 // Fill indices for first child at the beginning. │ │ │ │ │ - 273 auto next = subPreBasis().indices(node.child(_0), multiIndices); │ │ │ │ │ - 274 for (std::size_t child = 1; child(type).size │ │ │ │ │ +(dim-1); │ │ │ │ │ + 228 result = std::max(result, numEdges); │ │ │ │ │ + 229 } │ │ │ │ │ + 230 │ │ │ │ │ + 231 return result; │ │ │ │ │ + 232 } │ │ │ │ │ + 233 │ │ │ │ │ + 237 template │ │ │ │ │ +238 It indices(const Node& node, It it) const │ │ │ │ │ + 239 { │ │ │ │ │ + 240 const auto& element = node.element(); │ │ │ │ │ + 241 │ │ │ │ │ + 242 // throw if Element is not of predefined type │ │ │ │ │ + 243 if (not(element.type().isCube()) and not(element.type().isSimplex())) │ │ │ │ │ + 244 DUNE_THROW(NotImplemented, "NedelecBasis only implemented for cube and │ │ │ │ │ +simplex elements."); │ │ │ │ │ + 245 │ │ │ │ │ + 246 for(std::size_t i=0, end=node.size(); i │ │ │ │ │ +264class NedelecNode : │ │ │ │ │ + 265 public LeafBasisNode │ │ │ │ │ + 266{ │ │ │ │ │ + 267 static const int dim = GV::dimension; │ │ │ │ │ + 268 │ │ │ │ │ + 269public: │ │ │ │ │ + 270 │ │ │ │ │ +271 using size_type = std::size_t; │ │ │ │ │ +272 using Element = typename GV::template Codim<0>::Entity; │ │ │ │ │ + 273 static_assert(kind==1, "Only Nedelec elements of the first kind are │ │ │ │ │ +implemented!"); │ │ │ │ │ +274 using FiniteElementMap = typename Impl:: │ │ │ │ │ +Nedelec1stKindLocalFiniteElementMap; │ │ │ │ │ +275 using FiniteElement = Impl::GlobalValuedLocalFiniteElement; │ │ │ │ │ + 278 │ │ │ │ │ +279 NedelecNode(const FiniteElementMap* finiteElementMap) : │ │ │ │ │ + 280 element_(nullptr), │ │ │ │ │ + 281 finiteElementMap_(finiteElementMap) │ │ │ │ │ + 282 { } │ │ │ │ │ + 283 │ │ │ │ │ +285 const Element& element() const │ │ │ │ │ + 286 { │ │ │ │ │ + 287 return *element_; │ │ │ │ │ 288 } │ │ │ │ │ 289 │ │ │ │ │ - 290 template │ │ │ │ │ - 291 static void multiIndexPushFront(MultiIndex& M, size_type M0) │ │ │ │ │ - 292 { │ │ │ │ │ - 293 M.resize(M.size()+1); │ │ │ │ │ - 294 for(std::size_t i=M.size()-1; i>0; --i) │ │ │ │ │ - 295 M[i] = M[i-1]; │ │ │ │ │ - 296 M[0] = M0; │ │ │ │ │ +294 const FiniteElement& finiteElement() const │ │ │ │ │ + 295 { │ │ │ │ │ + 296 return finiteElement_; │ │ │ │ │ 297 } │ │ │ │ │ 298 │ │ │ │ │ - 299 template │ │ │ │ │ - 300 It indices(const Node& node, It multiIndices, BasisFactory:: │ │ │ │ │ -BlockedLexicographic) const │ │ │ │ │ +300 void bind(const Element& e) │ │ │ │ │ 301 { │ │ │ │ │ - 302 using namespace Dune::Indices; │ │ │ │ │ - 303 size_type subTreeSize = node.child(_0).size(); │ │ │ │ │ - 304 // Fill indices for first child at the beginning. │ │ │ │ │ - 305 auto next = subPreBasis().indices(node.child(_0), multiIndices); │ │ │ │ │ - 306 // Insert 0 before first component of all indices for first child. │ │ │ │ │ - 307 for (std::size_t i = 0; i │ │ │ │ │ - 326 It indices(const Node& node, It multiIndices, BasisFactory:: │ │ │ │ │ -BlockedInterleaved) const │ │ │ │ │ - 327 { │ │ │ │ │ - 328 using namespace Dune::Indices; │ │ │ │ │ - 329 size_type subTreeSize = node.child(_0).size(); │ │ │ │ │ - 330 // Fill indices for first child at the beginning. │ │ │ │ │ - 331 auto next = subPreBasis().indices(node.child(_0), multiIndices); │ │ │ │ │ - 332 // Append 0 after last component of all indices for first child. │ │ │ │ │ - 333 for (std::size_t i = 0; ifind(*element_)), e); │ │ │ │ │ + 304 this->setSize(finiteElement_.size()); │ │ │ │ │ + 305 } │ │ │ │ │ + 306 │ │ │ │ │ + 307protected: │ │ │ │ │ + 308 │ │ │ │ │ +309 FiniteElement finiteElement_; │ │ │ │ │ +310 const Element* element_; │ │ │ │ │ +311 const FiniteElementMap* finiteElementMap_; │ │ │ │ │ + 312}; │ │ │ │ │ + 313 │ │ │ │ │ + 314 │ │ │ │ │ + 315 │ │ │ │ │ + 316namespace BasisFactory { │ │ │ │ │ + 317 │ │ │ │ │ + 327template │ │ │ │ │ +328auto nedelec() │ │ │ │ │ + 329{ │ │ │ │ │ + 330 return [](const auto& gridView) { │ │ │ │ │ + 331 return NedelecPreBasis, Range, kind, │ │ │ │ │ +order>(gridView); │ │ │ │ │ + 332 }; │ │ │ │ │ + 333} │ │ │ │ │ + 334 │ │ │ │ │ + 335} // end namespace BasisFactory │ │ │ │ │ + 336 │ │ │ │ │ + 337 │ │ │ │ │ + 338 │ │ │ │ │ + 339/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ + 340// This is the actual global basis implementation based on the reusable │ │ │ │ │ +parts. │ │ │ │ │ + 341/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ + 342 │ │ │ │ │ + 350template │ │ │ │ │ +351using NedelecBasis = DefaultGlobalBasis >; │ │ │ │ │ 352 │ │ │ │ │ - 353 │ │ │ │ │ - 354namespace BasisFactory { │ │ │ │ │ + 353} // end namespace Dune::Functions │ │ │ │ │ + 354 │ │ │ │ │ 355 │ │ │ │ │ - 368template │ │ │ │ │ -369auto power(ChildPreBasisFactory&& childPreBasisFactory, const │ │ │ │ │ -IndexMergingStrategy&) │ │ │ │ │ - 370{ │ │ │ │ │ - 371 return [childPreBasisFactory](const auto& gridView) { │ │ │ │ │ - 372 auto childPreBasis = childPreBasisFactory(gridView); │ │ │ │ │ - 373 return PowerPreBasis │ │ │ │ │ -(std::move(childPreBasis)); │ │ │ │ │ - 374 }; │ │ │ │ │ - 375} │ │ │ │ │ - 376 │ │ │ │ │ - 387template │ │ │ │ │ -388auto power(ChildPreBasisFactory&& childPreBasisFactory) │ │ │ │ │ - 389{ │ │ │ │ │ - 390 return [childPreBasisFactory](const auto& gridView) { │ │ │ │ │ - 391 auto childPreBasis = childPreBasisFactory(gridView); │ │ │ │ │ - 392 return PowerPreBasis(std:: │ │ │ │ │ -move(childPreBasis)); │ │ │ │ │ - 393 }; │ │ │ │ │ - 394} │ │ │ │ │ - 395 │ │ │ │ │ - 396} // end namespace BasisFactory │ │ │ │ │ - 397 │ │ │ │ │ - 398// Backward compatibility │ │ │ │ │ - 399namespace BasisBuilder { │ │ │ │ │ - 400 │ │ │ │ │ - 401 using namespace BasisFactory; │ │ │ │ │ - 402 │ │ │ │ │ - 403} │ │ │ │ │ - 404 │ │ │ │ │ - 405 │ │ │ │ │ - 406} // end namespace Functions │ │ │ │ │ - 407} // end namespace Dune │ │ │ │ │ - 408 │ │ │ │ │ - 409 │ │ │ │ │ - 410#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_POWERBASIS_HH │ │ │ │ │ -type_traits.hh │ │ │ │ │ -utility.hh │ │ │ │ │ + 356#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NEDELECBASIS_HH │ │ │ │ │ nodes.hh │ │ │ │ │ defaultglobalbasis.hh │ │ │ │ │ -basistags.hh │ │ │ │ │ +globalvaluedlocalfiniteelement.hh │ │ │ │ │ Dune::Functions::BasisFactory::power │ │ │ │ │ -auto power(ChildPreBasisFactory &&childPreBasisFactory) │ │ │ │ │ -Create a factory builder that can build a PowerPreBasis. │ │ │ │ │ -Definition: powerbasis.hh:388 │ │ │ │ │ -Dune::Functions::enableIfConstructible │ │ │ │ │ -typename std::enable_if< std::is_constructible< T, Args... >::value, int >:: │ │ │ │ │ -type enableIfConstructible │ │ │ │ │ -Helper to constrain forwarding constructors. │ │ │ │ │ -Definition: type_traits.hh:26 │ │ │ │ │ -Dune │ │ │ │ │ -Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::BasisFactory::IndexMergingStrategy │ │ │ │ │ -Base class for index merging strategies to simplify detection. │ │ │ │ │ -Definition: basistags.hh:44 │ │ │ │ │ -Dune::Functions::BasisFactory::FlatInterleaved │ │ │ │ │ -Interleaved merging of direct children without blocking. │ │ │ │ │ -Definition: basistags.hh:114 │ │ │ │ │ -Dune::Functions::PowerBasisNode │ │ │ │ │ -Definition: nodes.hh:193 │ │ │ │ │ -Dune::Functions::PowerPreBasis │ │ │ │ │ -A pre-basis for power bases. │ │ │ │ │ -Definition: powerbasis.hh:45 │ │ │ │ │ -Dune::Functions::PowerPreBasis::dimension │ │ │ │ │ -size_type dimension() const │ │ │ │ │ -Get the total dimension of the space spanned by this basis. │ │ │ │ │ -Definition: powerbasis.hh:207 │ │ │ │ │ -Dune::Functions::PowerPreBasis::size_type │ │ │ │ │ +auto power(ChildPreBasisFactory &&childPreBasisFactory, const │ │ │ │ │ +IndexMergingStrategy &) │ │ │ │ │ +Create a pre-basis factory that can build a PowerPreBasis. │ │ │ │ │ +Definition: powerbasis.hh:369 │ │ │ │ │ +Dune::Functions::BasisFactory::nedelec │ │ │ │ │ +auto nedelec() │ │ │ │ │ +Create a pre-basis factory that can create a Nédélec pre-basis. │ │ │ │ │ +Definition: nedelecbasis.hh:328 │ │ │ │ │ +Dune::Functions │ │ │ │ │ +Definition: polynomial.hh:11 │ │ │ │ │ +Dune::Functions::DefaultGlobalBasis │ │ │ │ │ +Global basis for given pre-basis. │ │ │ │ │ +Definition: defaultglobalbasis.hh:46 │ │ │ │ │ +Dune::Functions::NedelecNode │ │ │ │ │ +Definition: nedelecbasis.hh:266 │ │ │ │ │ +Dune::Functions::NedelecNode::finiteElementMap_ │ │ │ │ │ +const FiniteElementMap * finiteElementMap_ │ │ │ │ │ +Definition: nedelecbasis.hh:311 │ │ │ │ │ +Dune::Functions::NedelecNode::finiteElement_ │ │ │ │ │ +FiniteElement finiteElement_ │ │ │ │ │ +Definition: nedelecbasis.hh:309 │ │ │ │ │ +Dune::Functions::NedelecNode::FiniteElement │ │ │ │ │ +Impl::GlobalValuedLocalFiniteElement< Impl::CovariantPiolaTransformator, │ │ │ │ │ +typename FiniteElementMap::FiniteElement, Element > FiniteElement │ │ │ │ │ +Definition: nedelecbasis.hh:277 │ │ │ │ │ +Dune::Functions::NedelecNode::bind │ │ │ │ │ +void bind(const Element &e) │ │ │ │ │ +Bind to element. │ │ │ │ │ +Definition: nedelecbasis.hh:300 │ │ │ │ │ +Dune::Functions::NedelecNode::element │ │ │ │ │ +const Element & element() const │ │ │ │ │ +Return current element, throw if unbound. │ │ │ │ │ +Definition: nedelecbasis.hh:285 │ │ │ │ │ +Dune::Functions::NedelecNode::Element │ │ │ │ │ +typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ +Definition: nedelecbasis.hh:272 │ │ │ │ │ +Dune::Functions::NedelecNode::finiteElement │ │ │ │ │ +const FiniteElement & finiteElement() const │ │ │ │ │ +Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ +Definition: nedelecbasis.hh:294 │ │ │ │ │ +Dune::Functions::NedelecNode::NedelecNode │ │ │ │ │ +NedelecNode(const FiniteElementMap *finiteElementMap) │ │ │ │ │ +Definition: nedelecbasis.hh:279 │ │ │ │ │ +Dune::Functions::NedelecNode::FiniteElementMap │ │ │ │ │ +typename Impl::Nedelec1stKindLocalFiniteElementMap< GV, dim, Range, order > │ │ │ │ │ +FiniteElementMap │ │ │ │ │ +Definition: nedelecbasis.hh:274 │ │ │ │ │ +Dune::Functions::NedelecNode::element_ │ │ │ │ │ +const Element * element_ │ │ │ │ │ +Definition: nedelecbasis.hh:310 │ │ │ │ │ +Dune::Functions::NedelecNode::size_type │ │ │ │ │ std::size_t size_type │ │ │ │ │ -Type used for indices and size information. │ │ │ │ │ -Definition: powerbasis.hh:58 │ │ │ │ │ -Dune::Functions::PowerPreBasis::IndexMergingStrategy │ │ │ │ │ -IMS IndexMergingStrategy │ │ │ │ │ -Strategy used to merge the global indices of the child factories. │ │ │ │ │ -Definition: powerbasis.hh:61 │ │ │ │ │ -Dune::Functions::PowerPreBasis::Node │ │ │ │ │ -PowerBasisNode< SubNode, children > Node │ │ │ │ │ -Template mapping root tree path to type of created tree node. │ │ │ │ │ -Definition: powerbasis.hh:66 │ │ │ │ │ -Dune::Functions::PowerPreBasis::GridView │ │ │ │ │ -typename SPB::GridView GridView │ │ │ │ │ -The grid view that the FE basis is defined on. │ │ │ │ │ -Definition: powerbasis.hh:55 │ │ │ │ │ -Dune::Functions::PowerPreBasis::multiIndexBufferSize │ │ │ │ │ -static constexpr size_type multiIndexBufferSize │ │ │ │ │ -Definition: powerbasis.hh:70 │ │ │ │ │ -Dune::Functions::PowerPreBasis::SubPreBasis │ │ │ │ │ -SPB SubPreBasis │ │ │ │ │ -The child pre-basis. │ │ │ │ │ -Definition: powerbasis.hh:52 │ │ │ │ │ -Dune::Functions::PowerPreBasis::SubNode │ │ │ │ │ -typename SubPreBasis::Node SubNode │ │ │ │ │ -Definition: powerbasis.hh:63 │ │ │ │ │ -Dune::Functions::PowerPreBasis::initializeIndices │ │ │ │ │ -void initializeIndices() │ │ │ │ │ -Initialize the global indices. │ │ │ │ │ -Definition: powerbasis.hh:87 │ │ │ │ │ -Dune::Functions::PowerPreBasis::update │ │ │ │ │ -void update(const GridView &gv) │ │ │ │ │ -Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ -Definition: powerbasis.hh:99 │ │ │ │ │ -Dune::Functions::PowerPreBasis::indices │ │ │ │ │ +Definition: nedelecbasis.hh:271 │ │ │ │ │ +Dune::Functions::NedelecPreBasis │ │ │ │ │ +Definition: nedelecbasis.hh:136 │ │ │ │ │ +Dune::Functions::NedelecPreBasis::indices │ │ │ │ │ It indices(const Node &node, It it) const │ │ │ │ │ Maps from subtree index set [0..size-1] to a globally unique multi index in │ │ │ │ │ global basis. │ │ │ │ │ -Definition: powerbasis.hh:232 │ │ │ │ │ -Dune::Functions::PowerPreBasis::PowerPreBasis │ │ │ │ │ -PowerPreBasis(SFArgs &&... sfArgs) │ │ │ │ │ -Constructor for given child pre-basis objects. │ │ │ │ │ -Definition: powerbasis.hh:80 │ │ │ │ │ -Dune::Functions::PowerPreBasis::size │ │ │ │ │ -size_type size() const │ │ │ │ │ -Same as size(prefix) with empty prefix. │ │ │ │ │ -Definition: powerbasis.hh:116 │ │ │ │ │ -Dune::Functions::PowerPreBasis::subPreBasis │ │ │ │ │ -SubPreBasis & subPreBasis() │ │ │ │ │ -Mutable access to the stored prebasis of the factor in the power space. │ │ │ │ │ -Definition: powerbasis.hh:225 │ │ │ │ │ -Dune::Functions::PowerPreBasis::makeNode │ │ │ │ │ -Node makeNode() const │ │ │ │ │ -Create tree node. │ │ │ │ │ -Definition: powerbasis.hh:107 │ │ │ │ │ -Dune::Functions::PowerPreBasis::maxMultiIndexSize │ │ │ │ │ +Definition: nedelecbasis.hh:238 │ │ │ │ │ +Dune::Functions::NedelecPreBasis::size │ │ │ │ │ +size_type size(const SizePrefix &prefix) const │ │ │ │ │ +Return number possible values for next position in multi index. │ │ │ │ │ +Definition: nedelecbasis.hh:211 │ │ │ │ │ +Dune::Functions::NedelecPreBasis::size_type │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +Definition: nedelecbasis.hh:146 │ │ │ │ │ +Dune::Functions::NedelecPreBasis::NedelecPreBasis │ │ │ │ │ +NedelecPreBasis(const GridView &gv) │ │ │ │ │ +Constructor for a given grid view object. │ │ │ │ │ +Definition: nedelecbasis.hh:155 │ │ │ │ │ +Dune::Functions::NedelecPreBasis::GridView │ │ │ │ │ +GV GridView │ │ │ │ │ +The grid view that the FE space is defined on. │ │ │ │ │ +Definition: nedelecbasis.hh:145 │ │ │ │ │ +Dune::Functions::NedelecPreBasis::dimension │ │ │ │ │ +size_type dimension() const │ │ │ │ │ +Definition: nedelecbasis.hh:217 │ │ │ │ │ +Dune::Functions::NedelecPreBasis::maxMultiIndexSize │ │ │ │ │ static constexpr size_type maxMultiIndexSize │ │ │ │ │ -Definition: powerbasis.hh:68 │ │ │ │ │ -Dune::Functions::PowerPreBasis::minMultiIndexSize │ │ │ │ │ +Definition: nedelecbasis.hh:150 │ │ │ │ │ +Dune::Functions::NedelecPreBasis::multiIndexBufferSize │ │ │ │ │ +static constexpr size_type multiIndexBufferSize │ │ │ │ │ +Definition: nedelecbasis.hh:152 │ │ │ │ │ +Dune::Functions::NedelecPreBasis::gridView_ │ │ │ │ │ +GridView gridView_ │ │ │ │ │ +Definition: nedelecbasis.hh:256 │ │ │ │ │ +Dune::Functions::NedelecPreBasis::finiteElementMap_ │ │ │ │ │ +FiniteElementMap finiteElementMap_ │ │ │ │ │ +Definition: nedelecbasis.hh:257 │ │ │ │ │ +Dune::Functions::NedelecPreBasis::minMultiIndexSize │ │ │ │ │ static constexpr size_type minMultiIndexSize │ │ │ │ │ -Definition: powerbasis.hh:69 │ │ │ │ │ -Dune::Functions::PowerPreBasis::maxNodeSize │ │ │ │ │ +Definition: nedelecbasis.hh:151 │ │ │ │ │ +Dune::Functions::NedelecPreBasis::initializeIndices │ │ │ │ │ +void initializeIndices() │ │ │ │ │ +Definition: nedelecbasis.hh:179 │ │ │ │ │ +Dune::Functions::NedelecPreBasis::update │ │ │ │ │ +void update(const GridView &gv) │ │ │ │ │ +Definition: nedelecbasis.hh:190 │ │ │ │ │ +Dune::Functions::NedelecPreBasis::maxNodeSize │ │ │ │ │ size_type maxNodeSize() const │ │ │ │ │ -Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ -Definition: powerbasis.hh:213 │ │ │ │ │ -Dune::Functions::PowerPreBasis::gridView │ │ │ │ │ +Definition: nedelecbasis.hh:222 │ │ │ │ │ +Dune::Functions::NedelecPreBasis::gridView │ │ │ │ │ const GridView & gridView() const │ │ │ │ │ Obtain the grid view that the basis is defined on. │ │ │ │ │ -Definition: powerbasis.hh:93 │ │ │ │ │ -Dune::Functions::PowerPreBasis::size │ │ │ │ │ -size_type size(const SizePrefix &prefix) const │ │ │ │ │ -Return number of possible values for next position in multi index. │ │ │ │ │ -Definition: powerbasis.hh:124 │ │ │ │ │ -Dune::Functions::PowerPreBasis::subPreBasis │ │ │ │ │ -const SubPreBasis & subPreBasis() const │ │ │ │ │ -Const access to the stored prebasis of the factor in the power space. │ │ │ │ │ -Definition: powerbasis.hh:219 │ │ │ │ │ -concepts.hh │ │ │ │ │ +Definition: nedelecbasis.hh:184 │ │ │ │ │ +Dune::Functions::NedelecPreBasis::makeNode │ │ │ │ │ +Node makeNode() const │ │ │ │ │ +Create tree node. │ │ │ │ │ +Definition: nedelecbasis.hh:199 │ │ │ │ │ +Dune::Functions::NedelecPreBasis::size │ │ │ │ │ +size_type size() const │ │ │ │ │ +Definition: nedelecbasis.hh:204 │ │ │ │ │ +Dune::Functions::NedelecPreBasis::mapper_ │ │ │ │ │ +Mapper mapper_ │ │ │ │ │ +Definition: nedelecbasis.hh:258 │ │ │ │ │ +Dune::Functions::BasisNodeMixin::size │ │ │ │ │ +size_type size() const │ │ │ │ │ +Definition: nodes.hh:142 │ │ │ │ │ +Dune::Functions::BasisNodeMixin::setSize │ │ │ │ │ +void setSize(const size_type size) │ │ │ │ │ +Definition: nodes.hh:164 │ │ │ │ │ +Dune::Functions::LeafBasisNode │ │ │ │ │ +Definition: nodes.hh:186 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00155.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: lagrangedgbasis.hh File Reference │ │ │ │ +dune-functions: globalvaluedlocalfiniteelement.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,60 +63,37 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces | │ │ │ │ -Typedefs | │ │ │ │ -Functions
│ │ │ │ -
lagrangedgbasis.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
globalvaluedlocalfiniteelement.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │
#include <array>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ +#include <numeric>
│ │ │ │ +#include <dune/common/fmatrix.hh>
│ │ │ │ +#include <dune/common/fvector.hh>
│ │ │ │ #include <dune/common/math.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/lagrangebasis.hh>
│ │ │ │ +#include <dune/common/rangeutilities.hh>
│ │ │ │ +#include <dune/geometry/referenceelements.hh>
│ │ │ │ +#include <dune/localfunctions/common/localbasis.hh>
│ │ │ │ +#include <dune/localfunctions/common/localfiniteelementtraits.hh>
│ │ │ │ +#include <dune/localfunctions/common/localinterpolation.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::Functions::LagrangeDGPreBasis< GV, k >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
namespace  Dune::Functions::BasisFactory
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Typedefs

template<typename GV , int k>
using Dune::Functions::LagrangeDGNode = LagrangeNode< GV, k >
 
template<typename GV , int k>
using Dune::Functions::LagrangeDGBasis = DefaultGlobalBasis< LagrangeDGPreBasis< GV, k > >
 Basis of a scalar k-th-order Lagrangean-DG finite element space. More...
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<std::size_t k>
auto Dune::Functions::BasisFactory::lagrangeDG ()
 Create a pre-basis factory that can create a LagrangeDG pre-basis. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,44 +5,28 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -Classes | Namespaces | Typedefs | Functions │ │ │ │ │ -lagrangedgbasis.hh File Reference │ │ │ │ │ +Namespaces │ │ │ │ │ +globalvaluedlocalfiniteelement.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ - Classes │ │ │ │ │ -class  Dune::Functions::LagrangeDGPreBasis<_GV,_k_> │ │ │ │ │ -  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ -namespace  Dune::Functions::BasisFactory │ │ │ │ │ -  │ │ │ │ │ - Typedefs │ │ │ │ │ -template │ │ │ │ │ -using Dune::Functions::LagrangeDGNode = LagrangeNode< GV, k > │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -using Dune::Functions::LagrangeDGBasis = DefaultGlobalBasis< │ │ │ │ │ - LagrangeDGPreBasis< GV, k > > │ │ │ │ │ -  Basis of a scalar k-th-order Lagrangean-DG finite element space. More... │ │ │ │ │ -  │ │ │ │ │ - Functions │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::BasisFactory::lagrangeDG () │ │ │ │ │ -  Create a pre-basis factory that can create a LagrangeDG pre-basis. │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00155_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: lagrangedgbasis.hh Source File │ │ │ │ +dune-functions: globalvaluedlocalfiniteelement.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,283 +62,324 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
lagrangedgbasis.hh
│ │ │ │ +
globalvaluedlocalfiniteelement.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_GLOBALVALUEDLOCALFINITEELEMENT_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_GLOBALVALUEDLOCALFINITEELEMENT_HH
│ │ │ │
5
│ │ │ │
6#include <array>
│ │ │ │ -
7#include <dune/common/exceptions.hh>
│ │ │ │ -
8#include <dune/common/math.hh>
│ │ │ │ -
9
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +
7#include <numeric>
│ │ │ │ +
8
│ │ │ │ +
9#include <dune/common/fmatrix.hh>
│ │ │ │ +
10#include <dune/common/fvector.hh>
│ │ │ │ +
11#include <dune/common/math.hh>
│ │ │ │ +
12#include <dune/common/rangeutilities.hh>
│ │ │ │
13
│ │ │ │ -
14
│ │ │ │ +
14#include <dune/geometry/referenceelements.hh>
│ │ │ │
15
│ │ │ │ -
16
│ │ │ │ -
17namespace Dune {
│ │ │ │ -
18namespace Functions {
│ │ │ │ +
16#include <dune/localfunctions/common/localbasis.hh>
│ │ │ │ +
17#include <dune/localfunctions/common/localfiniteelementtraits.hh>
│ │ │ │ +
18#include <dune/localfunctions/common/localinterpolation.hh>
│ │ │ │
19
│ │ │ │ -
20
│ │ │ │ -
21
│ │ │ │ -
22// *****************************************************************************
│ │ │ │ -
23// This is the reusable part of the basis. It contains
│ │ │ │ -
24//
│ │ │ │ -
25// LagrangeDGPreBasis
│ │ │ │ -
26// LagrangeDGNode
│ │ │ │ -
27//
│ │ │ │ -
28// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ -
29// state. These components do _not_ depend on the global basis and local view
│ │ │ │ -
30// and can be used without a global basis.
│ │ │ │ -
31// *****************************************************************************
│ │ │ │ -
32
│ │ │ │ -
33template<typename GV, int k>
│ │ │ │ - │ │ │ │ -
35
│ │ │ │ -
36template<typename GV, int k>
│ │ │ │ - │ │ │ │ -
38{
│ │ │ │ -
39 static const int dim = GV::dimension;
│ │ │ │ -
40
│ │ │ │ -
41public:
│ │ │ │ -
42
│ │ │ │ -
44 using GridView = GV;
│ │ │ │ -
45 using size_type = std::size_t;
│ │ │ │ -
46
│ │ │ │ -
47
│ │ │ │ -
48 // Precompute the number of dofs per entity type
│ │ │ │ -
49 const static int dofsPerEdge = k+1;
│ │ │ │ -
50 const static int dofsPerTriangle = (k+1)*(k+2)/2;
│ │ │ │ -
51 const static int dofsPerQuad = (k+1)*(k+1);
│ │ │ │ -
52 const static int dofsPerTetrahedron = (k+1)*(k+2)*(k+3)/6;
│ │ │ │ -
53 const static int dofsPerPrism = (k+1)*(k+1)*(k+2)/2;
│ │ │ │ -
54 const static int dofsPerHexahedron = (k+1)*(k+1)*(k+1);
│ │ │ │ -
55 const static int dofsPerPyramid = (k+1)*(k+2)*(2*k+3)/6;
│ │ │ │ -
56
│ │ │ │ +
20namespace Dune::Functions::Impl
│ │ │ │ +
21{
│ │ │ │ +
22
│ │ │ │ +
36 struct ContravariantPiolaTransformator
│ │ │ │ +
37 {
│ │ │ │ +
42 template<typename Values, typename LocalCoordinate, typename Geometry>
│ │ │ │ +
43 static auto apply(Values& values,
│ │ │ │ +
44 const LocalCoordinate& xi,
│ │ │ │ +
45 const Geometry& geometry)
│ │ │ │ +
46 {
│ │ │ │ +
47 auto jacobianTransposed = geometry.jacobianTransposed(xi);
│ │ │ │ +
48 auto integrationElement = geometry.integrationElement(xi);
│ │ │ │ +
49
│ │ │ │ +
50 for (auto& value : values)
│ │ │ │ +
51 {
│ │ │ │ +
52 auto tmp = value;
│ │ │ │ +
53 jacobianTransposed.mtv(tmp, value);
│ │ │ │ +
54 value /= integrationElement;
│ │ │ │ +
55 }
│ │ │ │ +
56 }
│ │ │ │
57
│ │ │ │ - │ │ │ │ -
59
│ │ │ │ -
60 static constexpr size_type maxMultiIndexSize = 1;
│ │ │ │ -
61 static constexpr size_type minMultiIndexSize = 1;
│ │ │ │ -
62 static constexpr size_type multiIndexBufferSize = 1;
│ │ │ │ -
63
│ │ │ │ - │ │ │ │ -
66 gridView_(gv)
│ │ │ │ -
67 {}
│ │ │ │ -
68
│ │ │ │ -
69
│ │ │ │ - │ │ │ │ -
71 {
│ │ │ │ -
72 switch (dim)
│ │ │ │ -
73 {
│ │ │ │ -
74 case 1:
│ │ │ │ +
67 template<typename Gradients, typename LocalCoordinate, typename Geometry>
│ │ │ │ +
68 static auto applyJacobian(Gradients& gradients,
│ │ │ │ +
69 const LocalCoordinate& xi,
│ │ │ │ +
70 const Geometry& geometry)
│ │ │ │ +
71 {
│ │ │ │ +
72 auto jacobianTransposed = geometry.jacobianTransposed(xi);
│ │ │ │ +
73 auto integrationElement = geometry.integrationElement(xi);
│ │ │ │ +
74 for (auto& gradient : gradients)
│ │ │ │
75 {
│ │ │ │ -
76 break;
│ │ │ │ -
77 }
│ │ │ │ -
78 case 2:
│ │ │ │ -
79 {
│ │ │ │ -
80 quadrilateralOffset_ = dofsPerTriangle * gridView_.size(Dune::GeometryTypes::triangle);
│ │ │ │ -
81 break;
│ │ │ │ -
82 }
│ │ │ │ -
83 case 3:
│ │ │ │ -
84 {
│ │ │ │ -
85 prismOffset_ = dofsPerTetrahedron * gridView_.size(Dune::GeometryTypes::tetrahedron);
│ │ │ │ +
76 auto tmp = gradient;
│ │ │ │ +
77 gradient = 0;
│ │ │ │ +
78 for (size_t k=0; k<gradient.M(); k++)
│ │ │ │ +
79 for (size_t l=0; l<tmp.N(); l++)
│ │ │ │ +
80 // Use sparseRange because jacobianTransposed may be a sparse DiagonalMatrix
│ │ │ │ +
81 for(auto&& [jacobianTransposed_l_j, j] : sparseRange(jacobianTransposed[l]))
│ │ │ │ +
82 gradient[j][k] += jacobianTransposed_l_j * tmp[l][k];
│ │ │ │ +
83 gradient /= integrationElement;
│ │ │ │ +
84 }
│ │ │ │ +
85 }
│ │ │ │
86
│ │ │ │ -
87 hexahedronOffset_ = prismOffset_ + dofsPerPrism * gridView_.size(Dune::GeometryTypes::prism);
│ │ │ │ -
88
│ │ │ │ -
89 pyramidOffset_ = hexahedronOffset_ + dofsPerHexahedron * gridView_.size(Dune::GeometryTypes::hexahedron);
│ │ │ │ -
90 break;
│ │ │ │ -
91 }
│ │ │ │ -
92 }
│ │ │ │ -
93 }
│ │ │ │ -
94
│ │ │ │ -
97 const GridView& gridView() const
│ │ │ │ -
98 {
│ │ │ │ -
99 return gridView_;
│ │ │ │ -
100 }
│ │ │ │ +
94 template<class Function, class LocalCoordinate, class Element>
│ │ │ │ +
95 class LocalValuedFunction
│ │ │ │ +
96 {
│ │ │ │ +
97 const Function& f_;
│ │ │ │ +
98 const Element& element_;
│ │ │ │ +
99
│ │ │ │ +
100 public:
│ │ │ │
101
│ │ │ │ -
102 void update(const GridView& gv)
│ │ │ │ -
103 {
│ │ │ │ -
104 gridView_ = gv;
│ │ │ │ -
105 }
│ │ │ │ -
106
│ │ │ │ - │ │ │ │ -
111 {
│ │ │ │ -
112 return Node{};
│ │ │ │ -
113 }
│ │ │ │ +
102 LocalValuedFunction(const Function& f, const Element& element)
│ │ │ │ +
103 : f_(f), element_(element)
│ │ │ │ +
104 {}
│ │ │ │ +
105
│ │ │ │ +
106 auto operator()(const LocalCoordinate& xi) const
│ │ │ │ +
107 {
│ │ │ │ +
108 auto&& f = Dune::Impl::makeFunctionWithCallOperator<LocalCoordinate>(f_);
│ │ │ │ +
109 auto globalValue = f(xi);
│ │ │ │ +
110
│ │ │ │ +
111 // Apply the inverse Piola transform
│ │ │ │ +
112 auto jacobianInverseTransposed = element_.geometry().jacobianInverseTransposed(xi);
│ │ │ │ +
113 auto integrationElement = element_.geometry().integrationElement(xi);
│ │ │ │
114
│ │ │ │ - │ │ │ │ -
116 {
│ │ │ │ -
117 switch (dim)
│ │ │ │ -
118 {
│ │ │ │ -
119 case 1:
│ │ │ │ -
120 return dofsPerEdge*gridView_.size(0);
│ │ │ │ -
121 case 2:
│ │ │ │ -
122 {
│ │ │ │ -
123 return dofsPerTriangle*gridView_.size(Dune::GeometryTypes::triangle) + dofsPerQuad*gridView_.size(Dune::GeometryTypes::quadrilateral);
│ │ │ │ -
124 }
│ │ │ │ -
125 case 3:
│ │ │ │ -
126 {
│ │ │ │ -
127 return dofsPerTetrahedron*gridView_.size(Dune::GeometryTypes::tetrahedron)
│ │ │ │ -
128 + dofsPerPyramid*gridView_.size(Dune::GeometryTypes::pyramid)
│ │ │ │ -
129 + dofsPerPrism*gridView_.size(Dune::GeometryTypes::prism)
│ │ │ │ -
130 + dofsPerHexahedron*gridView_.size(Dune::GeometryTypes::hexahedron);
│ │ │ │ -
131 }
│ │ │ │ -
132 }
│ │ │ │ -
133 DUNE_THROW(Dune::NotImplemented, "No size method for " << dim << "d grids available yet!");
│ │ │ │ -
134 }
│ │ │ │ -
135
│ │ │ │ -
137 template<class SizePrefix>
│ │ │ │ -
138 size_type size(const SizePrefix& prefix) const
│ │ │ │ -
139 {
│ │ │ │ -
140 assert(prefix.size() == 0 || prefix.size() == 1);
│ │ │ │ -
141 return (prefix.size() == 0) ? size() : 0;
│ │ │ │ -
142 }
│ │ │ │ -
143
│ │ │ │ - │ │ │ │ -
146 {
│ │ │ │ -
147 return size();
│ │ │ │ -
148 }
│ │ │ │ +
115 auto localValue = globalValue;
│ │ │ │ +
116 jacobianInverseTransposed.mtv(globalValue, localValue);
│ │ │ │ +
117 localValue *= integrationElement;
│ │ │ │ +
118
│ │ │ │ +
119 return localValue;
│ │ │ │ +
120 }
│ │ │ │ +
121 };
│ │ │ │ +
122 };
│ │ │ │ +
123
│ │ │ │ +
137 struct CovariantPiolaTransformator
│ │ │ │ +
138 {
│ │ │ │ +
143 template<typename Values, typename LocalCoordinate, typename Geometry>
│ │ │ │ +
144 static auto apply(Values& values,
│ │ │ │ +
145 const LocalCoordinate& xi,
│ │ │ │ +
146 const Geometry& geometry)
│ │ │ │ +
147 {
│ │ │ │ +
148 auto jacobianInverseTransposed = geometry.jacobianInverseTransposed(xi);
│ │ │ │
149
│ │ │ │ - │ │ │ │ -
151 {
│ │ │ │ -
152 return Dune::power(k+1, int(GV::dimension));
│ │ │ │ -
153 }
│ │ │ │ -
154
│ │ │ │ -
155 template<typename It>
│ │ │ │ -
156 It indices(const Node& node, It it) const
│ │ │ │ -
157 {
│ │ │ │ -
158 const auto& gridIndexSet = gridView().indexSet();
│ │ │ │ -
159 const auto& element = node.element();
│ │ │ │ -
160
│ │ │ │ -
161 size_type offset = 0;
│ │ │ │ -
162 if constexpr (dim==1)
│ │ │ │ -
163 offset = dofsPerEdge*gridIndexSet.subIndex(element,0,0);
│ │ │ │ -
164 else if constexpr (dim==2)
│ │ │ │ -
165 {
│ │ │ │ -
166 if (element.type().isTriangle())
│ │ │ │ -
167 offset = dofsPerTriangle*gridIndexSet.subIndex(element,0,0);
│ │ │ │ -
168 else if (element.type().isQuadrilateral())
│ │ │ │ -
169 offset = quadrilateralOffset_ + dofsPerQuad*gridIndexSet.subIndex(element,0,0);
│ │ │ │ -
170 else
│ │ │ │ -
171 DUNE_THROW(Dune::NotImplemented, "2d elements have to be triangles or quadrilaterals");
│ │ │ │ -
172 }
│ │ │ │ -
173 else if constexpr (dim==3)
│ │ │ │ -
174 {
│ │ │ │ -
175 if (element.type().isTetrahedron())
│ │ │ │ -
176 offset = dofsPerTetrahedron*gridIndexSet.subIndex(element,0,0);
│ │ │ │ -
177 else if (element.type().isPrism())
│ │ │ │ -
178 offset = prismOffset_ + dofsPerPrism*gridIndexSet.subIndex(element,0,0);
│ │ │ │ -
179 else if (element.type().isHexahedron())
│ │ │ │ -
180 offset = hexahedronOffset_ + dofsPerHexahedron*gridIndexSet.subIndex(element,0,0);
│ │ │ │ -
181 else if (element.type().isPyramid())
│ │ │ │ -
182 offset = pyramidOffset_ + dofsPerPyramid*gridIndexSet.subIndex(element,0,0);
│ │ │ │ -
183 else
│ │ │ │ -
184 DUNE_THROW(Dune::NotImplemented, "3d elements have to be tetrahedrons, prisms, hexahedrons or pyramids");
│ │ │ │ -
185 }
│ │ │ │ -
186 else
│ │ │ │ -
187 DUNE_THROW(Dune::NotImplemented, "No index method for " << dim << "d grids available yet!");
│ │ │ │ -
188 for (size_type i = 0, end = node.size() ; i < end ; ++i, ++it)
│ │ │ │ -
189 *it = {offset + i};
│ │ │ │ -
190 return it;
│ │ │ │ -
191 }
│ │ │ │ -
192
│ │ │ │ -
194 unsigned int order() const
│ │ │ │ -
195 {
│ │ │ │ -
196 return k;
│ │ │ │ -
197 }
│ │ │ │ -
198
│ │ │ │ -
199protected:
│ │ │ │ - │ │ │ │ -
201
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
206};
│ │ │ │ -
207
│ │ │ │ +
150 for (auto& value : values)
│ │ │ │ +
151 {
│ │ │ │ +
152 auto tmp = value;
│ │ │ │ +
153 jacobianInverseTransposed.mv(tmp, value);
│ │ │ │ +
154 }
│ │ │ │ +
155 }
│ │ │ │ +
156
│ │ │ │ +
166 template<typename Gradients, typename LocalCoordinate, typename Geometry>
│ │ │ │ +
167 static auto applyJacobian(Gradients& gradients,
│ │ │ │ +
168 const LocalCoordinate& xi,
│ │ │ │ +
169 const Geometry& geometry)
│ │ │ │ +
170 {
│ │ │ │ +
171 auto jacobianInverseTransposed = geometry.jacobianInverseTransposed(xi);
│ │ │ │ +
172
│ │ │ │ +
173 for (auto& gradient : gradients)
│ │ │ │ +
174 {
│ │ │ │ +
175 auto tmp = gradient;
│ │ │ │ +
176 gradient = 0;
│ │ │ │ +
177 for (size_t j=0; j<gradient.N(); j++)
│ │ │ │ +
178 for (size_t k=0; k<gradient.M(); k++)
│ │ │ │ +
179 // Use sparseRange because jacobianTransposed may be a sparse DiagonalMatrix
│ │ │ │ +
180 for(auto&& [jacobianInverseTransposed_j_l, l] : sparseRange(jacobianInverseTransposed[j]))
│ │ │ │ +
181 gradient[j][k] += jacobianInverseTransposed_j_l * tmp[l][k];
│ │ │ │ +
182 }
│ │ │ │ +
183 }
│ │ │ │ +
184
│ │ │ │ +
192 template<class Function, class LocalCoordinate, class Element>
│ │ │ │ +
193 class LocalValuedFunction
│ │ │ │ +
194 {
│ │ │ │ +
195 const Function& f_;
│ │ │ │ +
196 const Element& element_;
│ │ │ │ +
197
│ │ │ │ +
198 public:
│ │ │ │ +
199
│ │ │ │ +
200 LocalValuedFunction(const Function& f, const Element& element)
│ │ │ │ +
201 : f_(f), element_(element)
│ │ │ │ +
202 {}
│ │ │ │ +
203
│ │ │ │ +
204 auto operator()(const LocalCoordinate& xi) const
│ │ │ │ +
205 {
│ │ │ │ +
206 auto&& f = Dune::Impl::makeFunctionWithCallOperator<LocalCoordinate>(f_);
│ │ │ │ +
207 auto globalValue = f(xi);
│ │ │ │
208
│ │ │ │ -
209
│ │ │ │ -
210namespace BasisFactory {
│ │ │ │ +
209 // Apply the inverse Piola transform
│ │ │ │ +
210 auto jacobianTransposed = element_.geometry().jacobianTransposed(xi);
│ │ │ │
211
│ │ │ │ -
219template<std::size_t k>
│ │ │ │ - │ │ │ │ -
221{
│ │ │ │ -
222 return [](const auto& gridView) {
│ │ │ │ -
223 return LagrangeDGPreBasis<std::decay_t<decltype(gridView)>, k>(gridView);
│ │ │ │ -
224 };
│ │ │ │ -
225}
│ │ │ │ -
226
│ │ │ │ -
227} // end namespace BasisFactory
│ │ │ │ -
228
│ │ │ │ -
229
│ │ │ │ -
230
│ │ │ │ -
231// *****************************************************************************
│ │ │ │ -
232// This is the actual global basis implementation based on the reusable parts.
│ │ │ │ -
233// *****************************************************************************
│ │ │ │ -
234
│ │ │ │ -
242template<typename GV, int k>
│ │ │ │ - │ │ │ │ -
244
│ │ │ │ -
245
│ │ │ │ +
212 auto localValue = globalValue;
│ │ │ │ +
213 jacobianTransposed.mv(globalValue, localValue);
│ │ │ │ +
214
│ │ │ │ +
215 return localValue;
│ │ │ │ +
216 }
│ │ │ │ +
217 };
│ │ │ │ +
218 };
│ │ │ │ +
219
│ │ │ │ +
226 template<class Transformator, class LocalValuedLocalBasis, class Element>
│ │ │ │ +
227 class GlobalValuedLocalBasis
│ │ │ │ +
228 {
│ │ │ │ +
229 public:
│ │ │ │ +
230 using Traits = typename LocalValuedLocalBasis::Traits;
│ │ │ │ +
231
│ │ │ │ +
234 void bind(const LocalValuedLocalBasis& localValuedLocalBasis, const Element& element)
│ │ │ │ +
235 {
│ │ │ │ +
236 localValuedLocalBasis_ = &localValuedLocalBasis;
│ │ │ │ +
237 element_ = &element;
│ │ │ │ +
238 }
│ │ │ │ +
239
│ │ │ │ +
242 auto size() const
│ │ │ │ +
243 {
│ │ │ │ +
244 return localValuedLocalBasis_->size();
│ │ │ │ +
245 }
│ │ │ │
246
│ │ │ │ -
247} // end namespace Functions
│ │ │ │ -
248} // end namespace Dune
│ │ │ │ -
249
│ │ │ │ -
250
│ │ │ │ -
251#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
auto power(ChildPreBasisFactory &&childPreBasisFactory, const IndexMergingStrategy &)
Create a pre-basis factory that can build a PowerPreBasis.
Definition: powerbasis.hh:369
│ │ │ │ -
auto lagrangeDG()
Create a pre-basis factory that can create a LagrangeDG pre-basis.
Definition: lagrangedgbasis.hh:220
│ │ │ │ -
Definition: polynomial.hh:10
│ │ │ │ -
Global basis for given pre-basis.
Definition: defaultglobalbasis.hh:46
│ │ │ │ -
Definition: lagrangebasis.hh:387
│ │ │ │ -
const Element & element() const
Return current element, throw if unbound.
Definition: lagrangebasis.hh:439
│ │ │ │ -
Definition: lagrangedgbasis.hh:38
│ │ │ │ -
size_type size() const
Definition: lagrangedgbasis.hh:115
│ │ │ │ -
It indices(const Node &node, It it) const
Definition: lagrangedgbasis.hh:156
│ │ │ │ -
size_type maxNodeSize() const
Definition: lagrangedgbasis.hh:150
│ │ │ │ -
static constexpr size_type multiIndexBufferSize
Definition: lagrangedgbasis.hh:62
│ │ │ │ -
unsigned int order() const
Polynomial order used in the local Lagrange finite-elements.
Definition: lagrangedgbasis.hh:194
│ │ │ │ -
void update(const GridView &gv)
Definition: lagrangedgbasis.hh:102
│ │ │ │ -
size_t hexahedronOffset_
Definition: lagrangedgbasis.hh:205
│ │ │ │ -
Node makeNode() const
Create tree node.
Definition: lagrangedgbasis.hh:110
│ │ │ │ -
static constexpr size_type maxMultiIndexSize
Definition: lagrangedgbasis.hh:60
│ │ │ │ -
static const int dofsPerHexahedron
Definition: lagrangedgbasis.hh:54
│ │ │ │ -
LagrangeDGPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition: lagrangedgbasis.hh:65
│ │ │ │ -
size_t pyramidOffset_
Definition: lagrangedgbasis.hh:203
│ │ │ │ -
static const int dofsPerTetrahedron
Definition: lagrangedgbasis.hh:52
│ │ │ │ -
size_type size(const SizePrefix &prefix) const
Return number possible values for next position in multi index.
Definition: lagrangedgbasis.hh:138
│ │ │ │ -
GV GridView
The grid view that the FE space is defined on.
Definition: lagrangedgbasis.hh:44
│ │ │ │ -
void initializeIndices()
Definition: lagrangedgbasis.hh:70
│ │ │ │ -
size_t quadrilateralOffset_
Definition: lagrangedgbasis.hh:202
│ │ │ │ -
static const int dofsPerEdge
Definition: lagrangedgbasis.hh:49
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: lagrangedgbasis.hh:97
│ │ │ │ -
static const int dofsPerQuad
Definition: lagrangedgbasis.hh:51
│ │ │ │ -
static const int dofsPerTriangle
Definition: lagrangedgbasis.hh:50
│ │ │ │ -
static const int dofsPerPyramid
Definition: lagrangedgbasis.hh:55
│ │ │ │ -
GridView gridView_
Definition: lagrangedgbasis.hh:200
│ │ │ │ -
static constexpr size_type minMultiIndexSize
Definition: lagrangedgbasis.hh:61
│ │ │ │ -
std::size_t size_type
Definition: lagrangedgbasis.hh:45
│ │ │ │ -
size_type dimension() const
Definition: lagrangedgbasis.hh:145
│ │ │ │ -
size_t prismOffset_
Definition: lagrangedgbasis.hh:204
│ │ │ │ -
static const int dofsPerPrism
Definition: lagrangedgbasis.hh:53
│ │ │ │ -
size_type size() const
Definition: nodes.hh:142
│ │ │ │ +
248 void evaluateFunction(const typename Traits::DomainType& x,
│ │ │ │ +
249 std::vector<typename Traits::RangeType>& out) const
│ │ │ │ +
250 {
│ │ │ │ +
251 localValuedLocalBasis_->evaluateFunction(x,out);
│ │ │ │ +
252
│ │ │ │ +
253 Transformator::apply(out, x, element_->geometry());
│ │ │ │ +
254 }
│ │ │ │ +
255
│ │ │ │ +
261 void evaluateJacobian(const typename Traits::DomainType& x,
│ │ │ │ +
262 std::vector<typename Traits::JacobianType>& out) const
│ │ │ │ +
263 {
│ │ │ │ +
264 localValuedLocalBasis_->evaluateJacobian(x,out);
│ │ │ │ +
265
│ │ │ │ +
266 Transformator::applyJacobian(out, x, element_->geometry());
│ │ │ │ +
267 }
│ │ │ │ +
268
│ │ │ │ +
275 void partial(const std::array<unsigned int,2>& order,
│ │ │ │ +
276 const typename Traits::DomainType& x,
│ │ │ │ +
277 std::vector<typename Traits::RangeType>& out) const
│ │ │ │ +
278 {
│ │ │ │ +
279 auto totalOrder = std::accumulate(order.begin(), order.end(), 0);
│ │ │ │ +
280 if (totalOrder == 0) {
│ │ │ │ +
281 evaluateFunction(x, out);
│ │ │ │ +
282 } else if (totalOrder == 1) {
│ │ │ │ +
283 auto const direction = std::distance(order.begin(), std::find(order.begin(), order.end(), 1));
│ │ │ │ +
284 out.resize(size());
│ │ │ │ +
285
│ │ │ │ +
286 // TODO: The following is wasteful: We compute the full Jacobian and then return
│ │ │ │ +
287 // only a part of it. While we need the full Jacobian of the underlying local-valued LFE,
│ │ │ │ +
288 // it should be possible to compute only a partial Piola transform for the requested
│ │ │ │ +
289 // partial derivatives.
│ │ │ │ +
290 std::vector<typename Traits::JacobianType> fullJacobian;
│ │ │ │ +
291 localValuedLocalBasis_->evaluateJacobian(x,fullJacobian);
│ │ │ │ +
292
│ │ │ │ +
293 Transformator::applyJacobian(fullJacobian, x, element_->geometry());
│ │ │ │ +
294
│ │ │ │ +
295 for (std::size_t i=0; i<out.size(); i++)
│ │ │ │ +
296 for (std::size_t j=0; j<out[i].size(); j++)
│ │ │ │ +
297 out[i][j] = fullJacobian[i][j][direction];
│ │ │ │ +
298
│ │ │ │ +
299 } else
│ │ │ │ +
300 DUNE_THROW(NotImplemented, "Partial derivatives of order 2 or higher");
│ │ │ │ +
301 }
│ │ │ │ +
302
│ │ │ │ +
304 auto order() const
│ │ │ │ +
305 {
│ │ │ │ +
306 return localValuedLocalBasis_->order();
│ │ │ │ +
307 }
│ │ │ │ +
308
│ │ │ │ +
309 const LocalValuedLocalBasis* localValuedLocalBasis_;
│ │ │ │ +
310 const Element* element_;
│ │ │ │ +
311 };
│ │ │ │ +
312
│ │ │ │ +
321 template<class Transformator, class LocalValuedLocalInterpolation, class Element>
│ │ │ │ +
322 class GlobalValuedLocalInterpolation
│ │ │ │ +
323 {
│ │ │ │ +
324 public:
│ │ │ │ +
327 void bind(const LocalValuedLocalInterpolation& localValuedLocalInterpolation, const Element& element)
│ │ │ │ +
328 {
│ │ │ │ +
329 localValuedLocalInterpolation_ = &localValuedLocalInterpolation;
│ │ │ │ +
330 element_ = &element;
│ │ │ │ +
331 }
│ │ │ │ +
332
│ │ │ │ +
333 template<typename F, typename C>
│ │ │ │ +
334 void interpolate (const F& f, std::vector<C>& out) const
│ │ │ │ +
335 {
│ │ │ │ +
336 using LocalCoordinate = typename Element::Geometry::LocalCoordinate;
│ │ │ │ +
337 typename Transformator::template LocalValuedFunction<F,LocalCoordinate,Element> localValuedFunction(f, *element_);
│ │ │ │ +
338 localValuedLocalInterpolation_->interpolate(localValuedFunction, out);
│ │ │ │ +
339 }
│ │ │ │ +
340
│ │ │ │ +
341 private:
│ │ │ │ +
342 const LocalValuedLocalInterpolation* localValuedLocalInterpolation_;
│ │ │ │ +
343 const Element* element_;
│ │ │ │ +
344 };
│ │ │ │ +
345
│ │ │ │ +
346
│ │ │ │ +
353 template<class Transformator, class LocalValuedLFE, class Element>
│ │ │ │ +
354 class GlobalValuedLocalFiniteElement
│ │ │ │ +
355 {
│ │ │ │ +
356 using LocalBasis = GlobalValuedLocalBasis<Transformator,
│ │ │ │ +
357 typename LocalValuedLFE::Traits::LocalBasisType,
│ │ │ │ +
358 Element>;
│ │ │ │ +
359 using LocalInterpolation = GlobalValuedLocalInterpolation<Transformator,
│ │ │ │ +
360 typename LocalValuedLFE::Traits::LocalInterpolationType,
│ │ │ │ +
361 Element>;
│ │ │ │ +
362
│ │ │ │ +
363 public:
│ │ │ │ +
366 using Traits = LocalFiniteElementTraits<LocalBasis,
│ │ │ │ +
367 typename LocalValuedLFE::Traits::LocalCoefficientsType,
│ │ │ │ +
368 LocalInterpolation>;
│ │ │ │ +
369
│ │ │ │ +
370 GlobalValuedLocalFiniteElement() {}
│ │ │ │ +
371
│ │ │ │ +
372 void bind(const LocalValuedLFE& localValuedLFE, const Element& element)
│ │ │ │ +
373 {
│ │ │ │ +
374 globalValuedLocalBasis_.bind(localValuedLFE.localBasis(), element);
│ │ │ │ +
375 globalValuedLocalInterpolation_.bind(localValuedLFE.localInterpolation(), element);
│ │ │ │ +
376 localValuedLFE_ = &localValuedLFE;
│ │ │ │ +
377 }
│ │ │ │ +
378
│ │ │ │ +
381 const typename Traits::LocalBasisType& localBasis() const
│ │ │ │ +
382 {
│ │ │ │ +
383 return globalValuedLocalBasis_;
│ │ │ │ +
384 }
│ │ │ │ +
385
│ │ │ │ +
388 const typename Traits::LocalCoefficientsType& localCoefficients() const
│ │ │ │ +
389 {
│ │ │ │ +
390 return localValuedLFE_->localCoefficients();
│ │ │ │ +
391 }
│ │ │ │ +
392
│ │ │ │ +
395 const typename Traits::LocalInterpolationType& localInterpolation() const
│ │ │ │ +
396 {
│ │ │ │ +
397 return globalValuedLocalInterpolation_;
│ │ │ │ +
398 }
│ │ │ │ +
399
│ │ │ │ +
401 std::size_t size() const
│ │ │ │ +
402 {
│ │ │ │ +
403 return localValuedLFE_->size();
│ │ │ │ +
404 }
│ │ │ │ +
405
│ │ │ │ +
408 GeometryType type() const
│ │ │ │ +
409 {
│ │ │ │ +
410 return localValuedLFE_->type();
│ │ │ │ +
411 }
│ │ │ │ +
412
│ │ │ │ +
413 private:
│ │ │ │ +
414
│ │ │ │ +
415 typename Traits::LocalBasisType globalValuedLocalBasis_;
│ │ │ │ +
416 typename Traits::LocalInterpolationType globalValuedLocalInterpolation_;
│ │ │ │ +
417 const LocalValuedLFE* localValuedLFE_;
│ │ │ │ +
418 };
│ │ │ │ +
419
│ │ │ │ +
420} // namespace Dune::Functions::Impl
│ │ │ │ +
421
│ │ │ │ +
422#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_GLOBALVALUEDLOCALFINITEELEMENT_HH
│ │ │ │ +
void interpolate(const B &basis, C &&coeff, const F &f, const BV &bv, const NTRE &nodeToRangeEntry)
Interpolate given function in discrete function space.
Definition: interpolate.hh:202
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,376 +5,339 @@ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ * functionspacebases │ │ │ │ │ -lagrangedgbasis.hh │ │ │ │ │ +globalvaluedlocalfiniteelement.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_GLOBALVALUEDLOCALFINITEELEMENT_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_GLOBALVALUEDLOCALFINITEELEMENT_HH │ │ │ │ │ 5 │ │ │ │ │ 6#include │ │ │ │ │ - 7#include │ │ │ │ │ - 8#include │ │ │ │ │ - 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8 │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ 13 │ │ │ │ │ - 14 │ │ │ │ │ + 14#include │ │ │ │ │ 15 │ │ │ │ │ - 16 │ │ │ │ │ - 17namespace Dune { │ │ │ │ │ - 18namespace Functions { │ │ │ │ │ + 16#include │ │ │ │ │ + 17#include │ │ │ │ │ + 18#include │ │ │ │ │ 19 │ │ │ │ │ - 20 │ │ │ │ │ - 21 │ │ │ │ │ - 22/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 23// This is the reusable part of the basis. It contains │ │ │ │ │ - 24// │ │ │ │ │ - 25// LagrangeDGPreBasis │ │ │ │ │ - 26// LagrangeDGNode │ │ │ │ │ - 27// │ │ │ │ │ - 28// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ -shared │ │ │ │ │ - 29// state. These components do _not_ depend on the global basis and local │ │ │ │ │ -view │ │ │ │ │ - 30// and can be used without a global basis. │ │ │ │ │ - 31/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 32 │ │ │ │ │ - 33template │ │ │ │ │ -34using LagrangeDGNode = LagrangeNode; │ │ │ │ │ - 35 │ │ │ │ │ - 36template │ │ │ │ │ -37class LagrangeDGPreBasis │ │ │ │ │ - 38{ │ │ │ │ │ - 39 static const int dim = GV::dimension; │ │ │ │ │ - 40 │ │ │ │ │ - 41public: │ │ │ │ │ - 42 │ │ │ │ │ -44 using GridView = GV; │ │ │ │ │ -45 using size_type = std::size_t; │ │ │ │ │ - 46 │ │ │ │ │ - 47 │ │ │ │ │ - 48 // Precompute the number of dofs per entity type │ │ │ │ │ -49 const static int dofsPerEdge = k+1; │ │ │ │ │ -50 const static int dofsPerTriangle = (k+1)*(k+2)/2; │ │ │ │ │ -51 const static int dofsPerQuad = (k+1)*(k+1); │ │ │ │ │ -52 const static int dofsPerTetrahedron = (k+1)*(k+2)*(k+3)/6; │ │ │ │ │ -53 const static int dofsPerPrism = (k+1)*(k+1)*(k+2)/2; │ │ │ │ │ -54 const static int dofsPerHexahedron = (k+1)*(k+1)*(k+1); │ │ │ │ │ -55 const static int dofsPerPyramid = (k+1)*(k+2)*(2*k+3)/6; │ │ │ │ │ - 56 │ │ │ │ │ + 20namespace Dune::Functions::Impl │ │ │ │ │ + 21{ │ │ │ │ │ + 22 │ │ │ │ │ + 36 struct ContravariantPiolaTransformator │ │ │ │ │ + 37 { │ │ │ │ │ + 42 template │ │ │ │ │ + 43 static auto apply(Values& values, │ │ │ │ │ + 44 const LocalCoordinate& xi, │ │ │ │ │ + 45 const Geometry& geometry) │ │ │ │ │ + 46 { │ │ │ │ │ + 47 auto jacobianTransposed = geometry.jacobianTransposed(xi); │ │ │ │ │ + 48 auto integrationElement = geometry.integrationElement(xi); │ │ │ │ │ + 49 │ │ │ │ │ + 50 for (auto& value : values) │ │ │ │ │ + 51 { │ │ │ │ │ + 52 auto tmp = value; │ │ │ │ │ + 53 jacobianTransposed.mtv(tmp, value); │ │ │ │ │ + 54 value /= integrationElement; │ │ │ │ │ + 55 } │ │ │ │ │ + 56 } │ │ │ │ │ 57 │ │ │ │ │ -58 using Node = LagrangeDGNode; │ │ │ │ │ - 59 │ │ │ │ │ -60 static constexpr size_type maxMultiIndexSize = 1; │ │ │ │ │ -61 static constexpr size_type minMultiIndexSize = 1; │ │ │ │ │ -62 static constexpr size_type multiIndexBufferSize = 1; │ │ │ │ │ - 63 │ │ │ │ │ -65 LagrangeDGPreBasis(const GridView& gv) : │ │ │ │ │ - 66 gridView_(gv) │ │ │ │ │ - 67 {} │ │ │ │ │ - 68 │ │ │ │ │ - 69 │ │ │ │ │ -70 void initializeIndices() │ │ │ │ │ + 67 template │ │ │ │ │ + 68 static auto applyJacobian(Gradients& gradients, │ │ │ │ │ + 69 const LocalCoordinate& xi, │ │ │ │ │ + 70 const Geometry& geometry) │ │ │ │ │ 71 { │ │ │ │ │ - 72 switch (dim) │ │ │ │ │ - 73 { │ │ │ │ │ - 74 case 1: │ │ │ │ │ + 72 auto jacobianTransposed = geometry.jacobianTransposed(xi); │ │ │ │ │ + 73 auto integrationElement = geometry.integrationElement(xi); │ │ │ │ │ + 74 for (auto& gradient : gradients) │ │ │ │ │ 75 { │ │ │ │ │ - 76 break; │ │ │ │ │ - 77 } │ │ │ │ │ - 78 case 2: │ │ │ │ │ - 79 { │ │ │ │ │ - 80 quadrilateralOffset_ = dofsPerTriangle * gridView_.size(Dune:: │ │ │ │ │ -GeometryTypes::triangle); │ │ │ │ │ - 81 break; │ │ │ │ │ - 82 } │ │ │ │ │ - 83 case 3: │ │ │ │ │ - 84 { │ │ │ │ │ - 85 prismOffset_ = dofsPerTetrahedron * gridView_.size(Dune::GeometryTypes:: │ │ │ │ │ -tetrahedron); │ │ │ │ │ + 76 auto tmp = gradient; │ │ │ │ │ + 77 gradient = 0; │ │ │ │ │ + 78 for (size_t k=0; k │ │ │ │ │ + 95 class LocalValuedFunction │ │ │ │ │ + 96 { │ │ │ │ │ + 97 const Function& f_; │ │ │ │ │ + 98 const Element& element_; │ │ │ │ │ + 99 │ │ │ │ │ + 100 public: │ │ │ │ │ 101 │ │ │ │ │ -102 void update(const GridView& gv) │ │ │ │ │ - 103 { │ │ │ │ │ - 104 gridView_ = gv; │ │ │ │ │ - 105 } │ │ │ │ │ - 106 │ │ │ │ │ -110 Node makeNode() const │ │ │ │ │ - 111 { │ │ │ │ │ - 112 return Node{}; │ │ │ │ │ - 113 } │ │ │ │ │ + 102 LocalValuedFunction(const Function& f, const Element& element) │ │ │ │ │ + 103 : f_(f), element_(element) │ │ │ │ │ + 104 {} │ │ │ │ │ + 105 │ │ │ │ │ + 106 auto operator()(const LocalCoordinate& xi) const │ │ │ │ │ + 107 { │ │ │ │ │ + 108 auto&& f = Dune::Impl::makeFunctionWithCallOperator(f_); │ │ │ │ │ + 109 auto globalValue = f(xi); │ │ │ │ │ + 110 │ │ │ │ │ + 111 // Apply the inverse Piola transform │ │ │ │ │ + 112 auto jacobianInverseTransposed = element_.geometry │ │ │ │ │ +().jacobianInverseTransposed(xi); │ │ │ │ │ + 113 auto integrationElement = element_.geometry().integrationElement(xi); │ │ │ │ │ 114 │ │ │ │ │ -115 size_type size() const │ │ │ │ │ - 116 { │ │ │ │ │ - 117 switch (dim) │ │ │ │ │ - 118 { │ │ │ │ │ - 119 case 1: │ │ │ │ │ - 120 return dofsPerEdge*gridView_.size(0); │ │ │ │ │ - 121 case 2: │ │ │ │ │ - 122 { │ │ │ │ │ - 123 return dofsPerTriangle*gridView_.size(Dune::GeometryTypes::triangle) + │ │ │ │ │ -dofsPerQuad*gridView_.size(Dune::GeometryTypes::quadrilateral); │ │ │ │ │ - 124 } │ │ │ │ │ - 125 case 3: │ │ │ │ │ - 126 { │ │ │ │ │ - 127 return dofsPerTetrahedron*gridView_.size(Dune::GeometryTypes::tetrahedron) │ │ │ │ │ - 128 + dofsPerPyramid*gridView_.size(Dune::GeometryTypes::pyramid) │ │ │ │ │ - 129 + dofsPerPrism*gridView_.size(Dune::GeometryTypes::prism) │ │ │ │ │ - 130 + dofsPerHexahedron*gridView_.size(Dune::GeometryTypes::hexahedron); │ │ │ │ │ - 131 } │ │ │ │ │ - 132 } │ │ │ │ │ - 133 DUNE_THROW(Dune::NotImplemented, "No size method for " << dim << "d grids │ │ │ │ │ -available yet!"); │ │ │ │ │ - 134 } │ │ │ │ │ - 135 │ │ │ │ │ - 137 template │ │ │ │ │ -138 size_type size(const SizePrefix& prefix) const │ │ │ │ │ - 139 { │ │ │ │ │ - 140 assert(prefix.size() == 0 || prefix.size() == 1); │ │ │ │ │ - 141 return (prefix.size() == 0) ? size() : 0; │ │ │ │ │ - 142 } │ │ │ │ │ - 143 │ │ │ │ │ -145 size_type dimension() const │ │ │ │ │ - 146 { │ │ │ │ │ - 147 return size(); │ │ │ │ │ - 148 } │ │ │ │ │ + 115 auto localValue = globalValue; │ │ │ │ │ + 116 jacobianInverseTransposed.mtv(globalValue, localValue); │ │ │ │ │ + 117 localValue *= integrationElement; │ │ │ │ │ + 118 │ │ │ │ │ + 119 return localValue; │ │ │ │ │ + 120 } │ │ │ │ │ + 121 }; │ │ │ │ │ + 122 }; │ │ │ │ │ + 123 │ │ │ │ │ + 137 struct CovariantPiolaTransformator │ │ │ │ │ + 138 { │ │ │ │ │ + 143 template │ │ │ │ │ + 144 static auto apply(Values& values, │ │ │ │ │ + 145 const LocalCoordinate& xi, │ │ │ │ │ + 146 const Geometry& geometry) │ │ │ │ │ + 147 { │ │ │ │ │ + 148 auto jacobianInverseTransposed = geometry.jacobianInverseTransposed(xi); │ │ │ │ │ 149 │ │ │ │ │ -150 size_type maxNodeSize() const │ │ │ │ │ + 150 for (auto& value : values) │ │ │ │ │ 151 { │ │ │ │ │ - 152 return Dune::power(k+1, int(GV::dimension)); │ │ │ │ │ - 153 } │ │ │ │ │ - 154 │ │ │ │ │ - 155 template │ │ │ │ │ -156 It indices(const Node& node, It it) const │ │ │ │ │ - 157 { │ │ │ │ │ - 158 const auto& gridIndexSet = gridView().indexSet(); │ │ │ │ │ - 159 const auto& element = node.element(); │ │ │ │ │ - 160 │ │ │ │ │ - 161 size_type offset = 0; │ │ │ │ │ - 162 if constexpr (dim==1) │ │ │ │ │ - 163 offset = dofsPerEdge*gridIndexSet.subIndex(element,0,0); │ │ │ │ │ - 164 else if constexpr (dim==2) │ │ │ │ │ - 165 { │ │ │ │ │ - 166 if (element.type().isTriangle()) │ │ │ │ │ - 167 offset = dofsPerTriangle*gridIndexSet.subIndex(element,0,0); │ │ │ │ │ - 168 else if (element.type().isQuadrilateral()) │ │ │ │ │ - 169 offset = quadrilateralOffset_ + dofsPerQuad*gridIndexSet.subIndex │ │ │ │ │ -(element,0,0); │ │ │ │ │ - 170 else │ │ │ │ │ - 171 DUNE_THROW(Dune::NotImplemented, "2d elements have to be triangles or │ │ │ │ │ -quadrilaterals"); │ │ │ │ │ - 172 } │ │ │ │ │ - 173 else if constexpr (dim==3) │ │ │ │ │ + 152 auto tmp = value; │ │ │ │ │ + 153 jacobianInverseTransposed.mv(tmp, value); │ │ │ │ │ + 154 } │ │ │ │ │ + 155 } │ │ │ │ │ + 156 │ │ │ │ │ + 166 template │ │ │ │ │ + 167 static auto applyJacobian(Gradients& gradients, │ │ │ │ │ + 168 const LocalCoordinate& xi, │ │ │ │ │ + 169 const Geometry& geometry) │ │ │ │ │ + 170 { │ │ │ │ │ + 171 auto jacobianInverseTransposed = geometry.jacobianInverseTransposed(xi); │ │ │ │ │ + 172 │ │ │ │ │ + 173 for (auto& gradient : gradients) │ │ │ │ │ 174 { │ │ │ │ │ - 175 if (element.type().isTetrahedron()) │ │ │ │ │ - 176 offset = dofsPerTetrahedron*gridIndexSet.subIndex(element,0,0); │ │ │ │ │ - 177 else if (element.type().isPrism()) │ │ │ │ │ - 178 offset = prismOffset_ + dofsPerPrism*gridIndexSet.subIndex(element,0,0); │ │ │ │ │ - 179 else if (element.type().isHexahedron()) │ │ │ │ │ - 180 offset = hexahedronOffset_ + dofsPerHexahedron*gridIndexSet.subIndex │ │ │ │ │ -(element,0,0); │ │ │ │ │ - 181 else if (element.type().isPyramid()) │ │ │ │ │ - 182 offset = pyramidOffset_ + dofsPerPyramid*gridIndexSet.subIndex │ │ │ │ │ -(element,0,0); │ │ │ │ │ - 183 else │ │ │ │ │ - 184 DUNE_THROW(Dune::NotImplemented, "3d elements have to be tetrahedrons, │ │ │ │ │ -prisms, hexahedrons or pyramids"); │ │ │ │ │ - 185 } │ │ │ │ │ - 186 else │ │ │ │ │ - 187 DUNE_THROW(Dune::NotImplemented, "No index method for " << dim << "d grids │ │ │ │ │ -available yet!"); │ │ │ │ │ - 188 for (size_type i = 0, end = node.size() ; i < end ; ++i, ++it) │ │ │ │ │ - 189 *it = {offset + i}; │ │ │ │ │ - 190 return it; │ │ │ │ │ - 191 } │ │ │ │ │ - 192 │ │ │ │ │ -194 unsigned int order() const │ │ │ │ │ - 195 { │ │ │ │ │ - 196 return k; │ │ │ │ │ - 197 } │ │ │ │ │ - 198 │ │ │ │ │ - 199protected: │ │ │ │ │ -200 GridView gridView_; │ │ │ │ │ - 201 │ │ │ │ │ -202 size_t quadrilateralOffset_; │ │ │ │ │ -203 size_t pyramidOffset_; │ │ │ │ │ -204 size_t prismOffset_; │ │ │ │ │ -205 size_t hexahedronOffset_; │ │ │ │ │ - 206}; │ │ │ │ │ - 207 │ │ │ │ │ + 175 auto tmp = gradient; │ │ │ │ │ + 176 gradient = 0; │ │ │ │ │ + 177 for (size_t j=0; j │ │ │ │ │ + 193 class LocalValuedFunction │ │ │ │ │ + 194 { │ │ │ │ │ + 195 const Function& f_; │ │ │ │ │ + 196 const Element& element_; │ │ │ │ │ + 197 │ │ │ │ │ + 198 public: │ │ │ │ │ + 199 │ │ │ │ │ + 200 LocalValuedFunction(const Function& f, const Element& element) │ │ │ │ │ + 201 : f_(f), element_(element) │ │ │ │ │ + 202 {} │ │ │ │ │ + 203 │ │ │ │ │ + 204 auto operator()(const LocalCoordinate& xi) const │ │ │ │ │ + 205 { │ │ │ │ │ + 206 auto&& f = Dune::Impl::makeFunctionWithCallOperator(f_); │ │ │ │ │ + 207 auto globalValue = f(xi); │ │ │ │ │ 208 │ │ │ │ │ - 209 │ │ │ │ │ - 210namespace BasisFactory { │ │ │ │ │ + 209 // Apply the inverse Piola transform │ │ │ │ │ + 210 auto jacobianTransposed = element_.geometry().jacobianTransposed(xi); │ │ │ │ │ 211 │ │ │ │ │ - 219template │ │ │ │ │ -220auto lagrangeDG() │ │ │ │ │ - 221{ │ │ │ │ │ - 222 return [](const auto& gridView) { │ │ │ │ │ - 223 return LagrangeDGPreBasis, k>(gridView); │ │ │ │ │ - 224 }; │ │ │ │ │ - 225} │ │ │ │ │ - 226 │ │ │ │ │ - 227} // end namespace BasisFactory │ │ │ │ │ - 228 │ │ │ │ │ - 229 │ │ │ │ │ - 230 │ │ │ │ │ - 231/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 232// This is the actual global basis implementation based on the reusable │ │ │ │ │ -parts. │ │ │ │ │ - 233/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 234 │ │ │ │ │ - 242template │ │ │ │ │ -243using LagrangeDGBasis = DefaultGlobalBasis >; │ │ │ │ │ - 244 │ │ │ │ │ - 245 │ │ │ │ │ + 212 auto localValue = globalValue; │ │ │ │ │ + 213 jacobianTransposed.mv(globalValue, localValue); │ │ │ │ │ + 214 │ │ │ │ │ + 215 return localValue; │ │ │ │ │ + 216 } │ │ │ │ │ + 217 }; │ │ │ │ │ + 218 }; │ │ │ │ │ + 219 │ │ │ │ │ + 226 template │ │ │ │ │ + 227 class GlobalValuedLocalBasis │ │ │ │ │ + 228 { │ │ │ │ │ + 229 public: │ │ │ │ │ + 230 using Traits = typename LocalValuedLocalBasis::Traits; │ │ │ │ │ + 231 │ │ │ │ │ + 234 void bind(const LocalValuedLocalBasis& localValuedLocalBasis, const │ │ │ │ │ +Element& element) │ │ │ │ │ + 235 { │ │ │ │ │ + 236 localValuedLocalBasis_ = &localValuedLocalBasis; │ │ │ │ │ + 237 element_ = &element; │ │ │ │ │ + 238 } │ │ │ │ │ + 239 │ │ │ │ │ + 242 auto size() const │ │ │ │ │ + 243 { │ │ │ │ │ + 244 return localValuedLocalBasis_->size(); │ │ │ │ │ + 245 } │ │ │ │ │ 246 │ │ │ │ │ - 247} // end namespace Functions │ │ │ │ │ - 248} // end namespace Dune │ │ │ │ │ - 249 │ │ │ │ │ - 250 │ │ │ │ │ - 251#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH │ │ │ │ │ -nodes.hh │ │ │ │ │ -defaultglobalbasis.hh │ │ │ │ │ -lagrangebasis.hh │ │ │ │ │ -Dune::Functions::BasisFactory::power │ │ │ │ │ -auto power(ChildPreBasisFactory &&childPreBasisFactory, const │ │ │ │ │ -IndexMergingStrategy &) │ │ │ │ │ -Create a pre-basis factory that can build a PowerPreBasis. │ │ │ │ │ -Definition: powerbasis.hh:369 │ │ │ │ │ -Dune::Functions::BasisFactory::lagrangeDG │ │ │ │ │ -auto lagrangeDG() │ │ │ │ │ -Create a pre-basis factory that can create a LagrangeDG pre-basis. │ │ │ │ │ -Definition: lagrangedgbasis.hh:220 │ │ │ │ │ -Dune │ │ │ │ │ -Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis │ │ │ │ │ -Global basis for given pre-basis. │ │ │ │ │ -Definition: defaultglobalbasis.hh:46 │ │ │ │ │ -Dune::Functions::LagrangeNode │ │ │ │ │ -Definition: lagrangebasis.hh:387 │ │ │ │ │ -Dune::Functions::LagrangeNode::element │ │ │ │ │ -const Element & element() const │ │ │ │ │ -Return current element, throw if unbound. │ │ │ │ │ -Definition: lagrangebasis.hh:439 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis │ │ │ │ │ -Definition: lagrangedgbasis.hh:38 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::size │ │ │ │ │ -size_type size() const │ │ │ │ │ -Definition: lagrangedgbasis.hh:115 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::indices │ │ │ │ │ -It indices(const Node &node, It it) const │ │ │ │ │ -Definition: lagrangedgbasis.hh:156 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::maxNodeSize │ │ │ │ │ -size_type maxNodeSize() const │ │ │ │ │ -Definition: lagrangedgbasis.hh:150 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::multiIndexBufferSize │ │ │ │ │ -static constexpr size_type multiIndexBufferSize │ │ │ │ │ -Definition: lagrangedgbasis.hh:62 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::order │ │ │ │ │ -unsigned int order() const │ │ │ │ │ -Polynomial order used in the local Lagrange finite-elements. │ │ │ │ │ -Definition: lagrangedgbasis.hh:194 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::update │ │ │ │ │ -void update(const GridView &gv) │ │ │ │ │ -Definition: lagrangedgbasis.hh:102 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::hexahedronOffset_ │ │ │ │ │ -size_t hexahedronOffset_ │ │ │ │ │ -Definition: lagrangedgbasis.hh:205 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::makeNode │ │ │ │ │ -Node makeNode() const │ │ │ │ │ -Create tree node. │ │ │ │ │ -Definition: lagrangedgbasis.hh:110 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::maxMultiIndexSize │ │ │ │ │ -static constexpr size_type maxMultiIndexSize │ │ │ │ │ -Definition: lagrangedgbasis.hh:60 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::dofsPerHexahedron │ │ │ │ │ -static const int dofsPerHexahedron │ │ │ │ │ -Definition: lagrangedgbasis.hh:54 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::LagrangeDGPreBasis │ │ │ │ │ -LagrangeDGPreBasis(const GridView &gv) │ │ │ │ │ -Constructor for a given grid view object. │ │ │ │ │ -Definition: lagrangedgbasis.hh:65 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::pyramidOffset_ │ │ │ │ │ -size_t pyramidOffset_ │ │ │ │ │ -Definition: lagrangedgbasis.hh:203 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::dofsPerTetrahedron │ │ │ │ │ -static const int dofsPerTetrahedron │ │ │ │ │ -Definition: lagrangedgbasis.hh:52 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::size │ │ │ │ │ -size_type size(const SizePrefix &prefix) const │ │ │ │ │ -Return number possible values for next position in multi index. │ │ │ │ │ -Definition: lagrangedgbasis.hh:138 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::GridView │ │ │ │ │ -GV GridView │ │ │ │ │ -The grid view that the FE space is defined on. │ │ │ │ │ -Definition: lagrangedgbasis.hh:44 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::initializeIndices │ │ │ │ │ -void initializeIndices() │ │ │ │ │ -Definition: lagrangedgbasis.hh:70 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::quadrilateralOffset_ │ │ │ │ │ -size_t quadrilateralOffset_ │ │ │ │ │ -Definition: lagrangedgbasis.hh:202 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::dofsPerEdge │ │ │ │ │ -static const int dofsPerEdge │ │ │ │ │ -Definition: lagrangedgbasis.hh:49 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::gridView │ │ │ │ │ -const GridView & gridView() const │ │ │ │ │ -Obtain the grid view that the basis is defined on. │ │ │ │ │ -Definition: lagrangedgbasis.hh:97 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::dofsPerQuad │ │ │ │ │ -static const int dofsPerQuad │ │ │ │ │ -Definition: lagrangedgbasis.hh:51 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::dofsPerTriangle │ │ │ │ │ -static const int dofsPerTriangle │ │ │ │ │ -Definition: lagrangedgbasis.hh:50 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::dofsPerPyramid │ │ │ │ │ -static const int dofsPerPyramid │ │ │ │ │ -Definition: lagrangedgbasis.hh:55 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::gridView_ │ │ │ │ │ -GridView gridView_ │ │ │ │ │ -Definition: lagrangedgbasis.hh:200 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::minMultiIndexSize │ │ │ │ │ -static constexpr size_type minMultiIndexSize │ │ │ │ │ -Definition: lagrangedgbasis.hh:61 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::size_type │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Definition: lagrangedgbasis.hh:45 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::dimension │ │ │ │ │ -size_type dimension() const │ │ │ │ │ -Definition: lagrangedgbasis.hh:145 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::prismOffset_ │ │ │ │ │ -size_t prismOffset_ │ │ │ │ │ -Definition: lagrangedgbasis.hh:204 │ │ │ │ │ -Dune::Functions::LagrangeDGPreBasis::dofsPerPrism │ │ │ │ │ -static const int dofsPerPrism │ │ │ │ │ -Definition: lagrangedgbasis.hh:53 │ │ │ │ │ -Dune::Functions::BasisNodeMixin::size │ │ │ │ │ -size_type size() const │ │ │ │ │ -Definition: nodes.hh:142 │ │ │ │ │ + 248 void evaluateFunction(const typename Traits::DomainType& x, │ │ │ │ │ + 249 std::vector& out) const │ │ │ │ │ + 250 { │ │ │ │ │ + 251 localValuedLocalBasis_->evaluateFunction(x,out); │ │ │ │ │ + 252 │ │ │ │ │ + 253 Transformator::apply(out, x, element_->geometry()); │ │ │ │ │ + 254 } │ │ │ │ │ + 255 │ │ │ │ │ + 261 void evaluateJacobian(const typename Traits::DomainType& x, │ │ │ │ │ + 262 std::vector& out) const │ │ │ │ │ + 263 { │ │ │ │ │ + 264 localValuedLocalBasis_->evaluateJacobian(x,out); │ │ │ │ │ + 265 │ │ │ │ │ + 266 Transformator::applyJacobian(out, x, element_->geometry()); │ │ │ │ │ + 267 } │ │ │ │ │ + 268 │ │ │ │ │ + 275 void partial(const std::array& order, │ │ │ │ │ + 276 const typename Traits::DomainType& x, │ │ │ │ │ + 277 std::vector& out) const │ │ │ │ │ + 278 { │ │ │ │ │ + 279 auto totalOrder = std::accumulate(order.begin(), order.end(), 0); │ │ │ │ │ + 280 if (totalOrder == 0) { │ │ │ │ │ + 281 evaluateFunction(x, out); │ │ │ │ │ + 282 } else if (totalOrder == 1) { │ │ │ │ │ + 283 auto const direction = std::distance(order.begin(), std::find(order.begin │ │ │ │ │ +(), order.end(), 1)); │ │ │ │ │ + 284 out.resize(size()); │ │ │ │ │ + 285 │ │ │ │ │ + 286 // TODO: The following is wasteful: We compute the full Jacobian and then │ │ │ │ │ +return │ │ │ │ │ + 287 // only a part of it. While we need the full Jacobian of the underlying │ │ │ │ │ +local-valued LFE, │ │ │ │ │ + 288 // it should be possible to compute only a partial Piola transform for the │ │ │ │ │ +requested │ │ │ │ │ + 289 // partial derivatives. │ │ │ │ │ + 290 std::vector fullJacobian; │ │ │ │ │ + 291 localValuedLocalBasis_->evaluateJacobian(x,fullJacobian); │ │ │ │ │ + 292 │ │ │ │ │ + 293 Transformator::applyJacobian(fullJacobian, x, element_->geometry()); │ │ │ │ │ + 294 │ │ │ │ │ + 295 for (std::size_t i=0; iorder(); │ │ │ │ │ + 307 } │ │ │ │ │ + 308 │ │ │ │ │ + 309 const LocalValuedLocalBasis* localValuedLocalBasis_; │ │ │ │ │ + 310 const Element* element_; │ │ │ │ │ + 311 }; │ │ │ │ │ + 312 │ │ │ │ │ + 321 template │ │ │ │ │ + 322 class GlobalValuedLocalInterpolation │ │ │ │ │ + 323 { │ │ │ │ │ + 324 public: │ │ │ │ │ + 327 void bind(const LocalValuedLocalInterpolation& │ │ │ │ │ +localValuedLocalInterpolation, const Element& element) │ │ │ │ │ + 328 { │ │ │ │ │ + 329 localValuedLocalInterpolation_ = &localValuedLocalInterpolation; │ │ │ │ │ + 330 element_ = &element; │ │ │ │ │ + 331 } │ │ │ │ │ + 332 │ │ │ │ │ + 333 template │ │ │ │ │ + 334 void interpolate (const F& f, std::vector& out) const │ │ │ │ │ + 335 { │ │ │ │ │ + 336 using LocalCoordinate = typename Element::Geometry::LocalCoordinate; │ │ │ │ │ + 337 typename Transformator::template │ │ │ │ │ +LocalValuedFunction localValuedFunction(f, │ │ │ │ │ +*element_); │ │ │ │ │ + 338 localValuedLocalInterpolation_->interpolate(localValuedFunction, out); │ │ │ │ │ + 339 } │ │ │ │ │ + 340 │ │ │ │ │ + 341 private: │ │ │ │ │ + 342 const LocalValuedLocalInterpolation* localValuedLocalInterpolation_; │ │ │ │ │ + 343 const Element* element_; │ │ │ │ │ + 344 }; │ │ │ │ │ + 345 │ │ │ │ │ + 346 │ │ │ │ │ + 353 template │ │ │ │ │ + 354 class GlobalValuedLocalFiniteElement │ │ │ │ │ + 355 { │ │ │ │ │ + 356 using LocalBasis = GlobalValuedLocalBasis; │ │ │ │ │ + 359 using LocalInterpolation = GlobalValuedLocalInterpolation; │ │ │ │ │ + 362 │ │ │ │ │ + 363 public: │ │ │ │ │ + 366 using Traits = LocalFiniteElementTraits; │ │ │ │ │ + 369 │ │ │ │ │ + 370 GlobalValuedLocalFiniteElement() {} │ │ │ │ │ + 371 │ │ │ │ │ + 372 void bind(const LocalValuedLFE& localValuedLFE, const Element& element) │ │ │ │ │ + 373 { │ │ │ │ │ + 374 globalValuedLocalBasis_.bind(localValuedLFE.localBasis(), element); │ │ │ │ │ + 375 globalValuedLocalInterpolation_.bind(localValuedLFE.localInterpolation(), │ │ │ │ │ +element); │ │ │ │ │ + 376 localValuedLFE_ = &localValuedLFE; │ │ │ │ │ + 377 } │ │ │ │ │ + 378 │ │ │ │ │ + 381 const typename Traits::LocalBasisType& localBasis() const │ │ │ │ │ + 382 { │ │ │ │ │ + 383 return globalValuedLocalBasis_; │ │ │ │ │ + 384 } │ │ │ │ │ + 385 │ │ │ │ │ + 388 const typename Traits::LocalCoefficientsType& localCoefficients() const │ │ │ │ │ + 389 { │ │ │ │ │ + 390 return localValuedLFE_->localCoefficients(); │ │ │ │ │ + 391 } │ │ │ │ │ + 392 │ │ │ │ │ + 395 const typename Traits::LocalInterpolationType& localInterpolation() const │ │ │ │ │ + 396 { │ │ │ │ │ + 397 return globalValuedLocalInterpolation_; │ │ │ │ │ + 398 } │ │ │ │ │ + 399 │ │ │ │ │ + 401 std::size_t size() const │ │ │ │ │ + 402 { │ │ │ │ │ + 403 return localValuedLFE_->size(); │ │ │ │ │ + 404 } │ │ │ │ │ + 405 │ │ │ │ │ + 408 GeometryType type() const │ │ │ │ │ + 409 { │ │ │ │ │ + 410 return localValuedLFE_->type(); │ │ │ │ │ + 411 } │ │ │ │ │ + 412 │ │ │ │ │ + 413 private: │ │ │ │ │ + 414 │ │ │ │ │ + 415 typename Traits::LocalBasisType globalValuedLocalBasis_; │ │ │ │ │ + 416 typename Traits::LocalInterpolationType globalValuedLocalInterpolation_; │ │ │ │ │ + 417 const LocalValuedLFE* localValuedLFE_; │ │ │ │ │ + 418 }; │ │ │ │ │ + 419 │ │ │ │ │ + 420} // namespace Dune::Functions::Impl │ │ │ │ │ + 421 │ │ │ │ │ + 422#endif / │ │ │ │ │ +/ DUNE_FUNCTIONS_FUNCTIONSPACEBASES_GLOBALVALUEDLOCALFINITEELEMENT_HH │ │ │ │ │ +Dune::Functions::interpolate │ │ │ │ │ +void interpolate(const B &basis, C &&coeff, const F &f, const BV &bv, const │ │ │ │ │ +NTRE &nodeToRangeEntry) │ │ │ │ │ +Interpolate given function in discrete function space. │ │ │ │ │ +Definition: interpolate.hh:202 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00158.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: subspacebasis.hh File Reference │ │ │ │ +dune-functions: istlvectorbackend.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,61 +58,61 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
subspacebasis.hh File Reference
│ │ │ │ +
istlvectorbackend.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <dune/common/reservedvector.hh>
│ │ │ │ -#include <dune/common/typeutilities.hh>
│ │ │ │ +
#include <cstddef>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <dune/common/std/type_traits.hh>
│ │ │ │ +#include <dune/common/indices.hh>
│ │ │ │ +#include <dune/common/hybridutilities.hh>
│ │ │ │ #include <dune/common/concept.hh>
│ │ │ │ -#include <dune/functions/common/type_traits.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/subspacelocalview.hh>
│ │ │ │ +#include <dune/functions/common/indexaccess.hh>
│ │ │ │ #include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::Functions::SubspaceBasis< RB, TP >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<class RB , class TP >
 Dune::Functions::SubspaceBasis (const RB &, const TP) -> SubspaceBasis< RB, TP >
 
template<class RootRootBasis , class InnerTP , class OuterTP >
 Dune::Functions::SubspaceBasis (const SubspaceBasis< RootRootBasis, InnerTP > &rootBasis, const OuterTP &prefixPath) -> SubspaceBasis< std::decay_t< decltype(rootBasis.rootBasis())>, Impl::JoinTreePath_t< InnerTP, OuterTP > >
 
template<class RootBasis , class... PrefixTreeIndices>
auto Dune::Functions::subspaceBasis (const RootBasis &rootBasis, const TypeTree::HybridTreePath< PrefixTreeIndices... > &prefixPath)
 Create SubspaceBasis from a root basis and a prefixPath. More...
 
template<class RootBasis , class... PrefixTreeIndices>
auto Dune::Functions::subspaceBasis (const RootBasis &rootBasis, const PrefixTreeIndices &... prefixTreeIndices)
 
template<class V >
constexpr auto Dune::Functions::fieldTypes ()
 Generate list of field types in container. More...
 
template<class V >
constexpr bool Dune::Functions::hasUniqueFieldType ()
 Check if container has a unique field type. More...
 
template<class Vector >
auto Dune::Functions::istlVectorBackend (Vector &v)
 Return a vector backend wrapping non-const ISTL like containers. More...
 
template<class Vector >
auto Dune::Functions::istlVectorBackend (const Vector &v)
 Return a vector backend wrapping const ISTL like containers. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,48 +4,47 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * functionspacebases │ │ │ │ │ -Classes | Namespaces | Functions │ │ │ │ │ -subspacebasis.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * backends │ │ │ │ │ +Namespaces | Functions │ │ │ │ │ +istlvectorbackend.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ - Classes │ │ │ │ │ -class  Dune::Functions::SubspaceBasis<_RB,_TP_> │ │ │ │ │ -  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ -  Dune::Functions::SubspaceBasis (const RB &, const TP) -> SubspaceBasis< │ │ │ │ │ - RB, TP > │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -  Dune::Functions::SubspaceBasis (const SubspaceBasis< RootRootBasis, │ │ │ │ │ - InnerTP > &rootBasis, const OuterTP &prefixPath) -> SubspaceBasis< std:: │ │ │ │ │ - decay_t< decltype(rootBasis.rootBasis())>, Impl::JoinTreePath_t< InnerTP, │ │ │ │ │ - OuterTP > > │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::subspaceBasis (const RootBasis &rootBasis, const │ │ │ │ │ - TypeTree::HybridTreePath< PrefixTreeIndices... > &prefixPath) │ │ │ │ │ -  Create SubspaceBasis from a root basis and a prefixPath. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::subspaceBasis (const RootBasis &rootBasis, const │ │ │ │ │ - PrefixTreeIndices &... prefixTreeIndices) │ │ │ │ │ +template │ │ │ │ │ +constexpr auto Dune::Functions::fieldTypes () │ │ │ │ │ +  Generate list of field types in container. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +constexpr bool Dune::Functions::hasUniqueFieldType () │ │ │ │ │ +  Check if container has a unique field type. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::Functions::istlVectorBackend (Vector &v) │ │ │ │ │ +  Return a vector backend wrapping non-const ISTL like │ │ │ │ │ + containers. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::Functions::istlVectorBackend (const Vector &v) │ │ │ │ │ +  Return a vector backend wrapping const ISTL like containers. │ │ │ │ │ + More... │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00158_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: subspacebasis.hh Source File │ │ │ │ +dune-functions: istlvectorbackend.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,187 +58,338 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
subspacebasis.hh
│ │ │ │ +
istlvectorbackend.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACEBASIS_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACEBASIS_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_ISTLVECTORBACKEND_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_ISTLVECTORBACKEND_HH
│ │ │ │
5
│ │ │ │ -
6#include <dune/common/reservedvector.hh>
│ │ │ │ -
7#include <dune/common/typeutilities.hh>
│ │ │ │ -
8#include <dune/common/concept.hh>
│ │ │ │ +
6#include <cstddef>
│ │ │ │ +
7#include <utility>
│ │ │ │ +
8#include <type_traits>
│ │ │ │
9
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
13
│ │ │ │ +
10#include <dune/common/std/type_traits.hh>
│ │ │ │ +
11#include <dune/common/indices.hh>
│ │ │ │ +
12#include <dune/common/hybridutilities.hh>
│ │ │ │ +
13#include <dune/common/concept.hh>
│ │ │ │
14
│ │ │ │ -
15
│ │ │ │ -
16namespace Dune {
│ │ │ │ -
17namespace Functions {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
17
│ │ │ │
18
│ │ │ │ -
19
│ │ │ │ -
20
│ │ │ │ -
21namespace Impl {
│ │ │ │ -
22
│ │ │ │ -
23 template<class... Inner, class... Outer>
│ │ │ │ -
24 auto joinTreePaths(const TypeTree::HybridTreePath<Inner...>& inner, const TypeTree::HybridTreePath<Outer...> outer)
│ │ │ │ -
25 {
│ │ │ │ -
26 return TypeTree::HybridTreePath<Inner..., Outer...>(std::tuple_cat(inner._data, outer._data));
│ │ │ │ -
27 }
│ │ │ │ -
28
│ │ │ │ -
29 template<class InnerTP, class OuterTP>
│ │ │ │ -
30 using JoinTreePath_t = std::decay_t<decltype(joinTreePaths(std::declval<InnerTP>(), std::declval<OuterTP>()))>;
│ │ │ │ -
31
│ │ │ │ -
32}
│ │ │ │ -
33
│ │ │ │ -
34
│ │ │ │ -
35
│ │ │ │ -
36template<class RB, class TP>
│ │ │ │ - │ │ │ │ -
38{
│ │ │ │ -
39public:
│ │ │ │ -
40
│ │ │ │ -
41 using RootBasis = RB;
│ │ │ │ -
42
│ │ │ │ -
43 using RootLocalView = typename RootBasis::LocalView;
│ │ │ │ -
44
│ │ │ │ -
45 using PrefixPath = TP;
│ │ │ │ -
46
│ │ │ │ -
48 using GridView = typename RootBasis::GridView;
│ │ │ │ +
19namespace Dune {
│ │ │ │ +
20namespace Functions {
│ │ │ │ +
21
│ │ │ │ +
22namespace Impl {
│ │ │ │ +
23
│ │ │ │ +
24template<class V,
│ │ │ │ +
25 std::enable_if_t<not Dune::models<Imp::Concept::HasStaticIndexAccess, V>() , int> = 0>
│ │ │ │ +
26auto fieldTypes(V&& /*v*/)
│ │ │ │ +
27{
│ │ │ │ +
28 return TypeList<V>{};
│ │ │ │ +
29}
│ │ │ │ +
30
│ │ │ │ +
31template<class V,
│ │ │ │ +
32 std::enable_if_t<Dune::models<Imp::Concept::HasStaticIndexAccess, V>(), int> = 0>
│ │ │ │ +
33auto fieldTypes(V&& v)
│ │ │ │ +
34{
│ │ │ │ +
35 if constexpr (Dune::models<Imp::Concept::HasDynamicIndexAccess<std::size_t>, V>())
│ │ │ │ +
36 return fieldTypes(v[std::size_t{0}]);
│ │ │ │ +
37 else
│ │ │ │ +
38 {
│ │ │ │ +
39 auto indexRange = typename decltype(range(Hybrid::size(v)))::integer_sequence();
│ │ │ │ +
40 return unpackIntegerSequence([&](auto... i) {
│ │ │ │ +
41 return uniqueTypeList(std::tuple_cat(fieldTypes(v[i])...));
│ │ │ │ +
42 }, indexRange);
│ │ │ │ +
43 }
│ │ │ │ +
44}
│ │ │ │ +
45
│ │ │ │ +
46} // namespace Impl
│ │ │ │ +
47
│ │ │ │ +
48
│ │ │ │
49
│ │ │ │ -
51 using MultiIndex = typename RootBasis::MultiIndex;
│ │ │ │ -
52
│ │ │ │ -
53 using size_type = std::size_t;
│ │ │ │ -
54
│ │ │ │ - │ │ │ │ -
57
│ │ │ │ -
58 using SizePrefix = typename RootBasis::SizePrefix;
│ │ │ │ -
59
│ │ │ │ -
60
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
65 {}
│ │ │ │ -
66
│ │ │ │ -
72 template<class RootRootBasis, class InnerTP, class OuterTP>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
75 {}
│ │ │ │ -
76
│ │ │ │ -
77
│ │ │ │ -
80 const GridView& gridView() const
│ │ │ │ -
81 {
│ │ │ │ -
82 return rootBasis_->gridView();
│ │ │ │ -
83 }
│ │ │ │ -
84
│ │ │ │ - │ │ │ │ -
89 {
│ │ │ │ -
90 return rootBasis_->dimension();
│ │ │ │ -
91 }
│ │ │ │ -
92
│ │ │ │ - │ │ │ │ -
95 {
│ │ │ │ -
96 return rootBasis_->size();
│ │ │ │ -
97 }
│ │ │ │ -
98
│ │ │ │ -
100 size_type size(const SizePrefix& prefix) const
│ │ │ │ -
101 {
│ │ │ │ -
102 return rootBasis_->size(prefix);
│ │ │ │ -
103 }
│ │ │ │ -
104
│ │ │ │ - │ │ │ │ -
109 {
│ │ │ │ -
110 return LocalView(*this, prefixPath_);
│ │ │ │ -
111 }
│ │ │ │ -
112
│ │ │ │ -
113 const RootBasis& rootBasis() const
│ │ │ │ -
114 {
│ │ │ │ -
115 return *rootBasis_;
│ │ │ │ -
116 }
│ │ │ │ -
117
│ │ │ │ -
118 const PrefixPath& prefixPath() const
│ │ │ │ -
119 {
│ │ │ │ -
120 return prefixPath_;
│ │ │ │ -
121 }
│ │ │ │ +
62template<class V>
│ │ │ │ +
63constexpr auto fieldTypes()
│ │ │ │ +
64{
│ │ │ │ +
65 return decltype(Impl::fieldTypes(std::declval<V>())){};
│ │ │ │ +
66}
│ │ │ │ +
67
│ │ │ │ +
73template<class V>
│ │ │ │ +
74constexpr bool hasUniqueFieldType()
│ │ │ │ +
75{
│ │ │ │ +
76 return std::tuple_size<std::decay_t<decltype(fieldTypes<V>())>>::value==1;
│ │ │ │ +
77}
│ │ │ │ +
78
│ │ │ │ +
79
│ │ │ │ +
80
│ │ │ │ +
81namespace Impl {
│ │ │ │ +
82
│ │ │ │ +
83/*
│ │ │ │ +
84 * \brief A wrapper providing multi-index access to vector entries
│ │ │ │ +
85 *
│ │ │ │ +
86 * The wrapped vector type should be an istl like random
│ │ │ │ +
87 * access container providing operator[] and size() methods.
│ │ │ │ +
88 * For classical containers this should support indices
│ │ │ │ +
89 * of type std::size_t. For multi-type containers indices
│ │ │ │ +
90 * of the form Dune::index_constant<i> should be supported
│ │ │ │ +
91 * while size() should be a static constexpr method.
│ │ │ │ +
92 *
│ │ │ │ +
93 * When resolving multi-indices the backend appends indices
│ │ │ │ +
94 * using operator[] as long as the result is not a scalar.
│ │ │ │ +
95 * If this exhausts the digits of the multi-index, additional
│ │ │ │ +
96 * zero`s are appended.
│ │ │ │ +
97 *
│ │ │ │ +
98 * \tparam V Type of the raw wrapper vector
│ │ │ │ +
99 */
│ │ │ │ +
100template<class V>
│ │ │ │ +
101class ISTLVectorBackend
│ │ │ │ +
102{
│ │ │ │ +
103
│ │ │ │ +
104 // Template aliases for using detection idiom.
│ │ │ │ +
105 template<class C>
│ │ │ │ +
106 using dynamicIndexAccess_t = decltype(std::declval<C>()[0]);
│ │ │ │ +
107
│ │ │ │ +
108 template<class C>
│ │ │ │ +
109 using staticIndexAccess_t = decltype(std::declval<C>()[Dune::Indices::_0]);
│ │ │ │ +
110
│ │ │ │ +
111 template<class C>
│ │ │ │ +
112 using resizeMethod_t = decltype(std::declval<C>().resize(0));
│ │ │ │ +
113
│ │ │ │ +
114
│ │ │ │ +
115
│ │ │ │ +
116 // Short cuts for feature detection
│ │ │ │ +
117 template<class C>
│ │ │ │ +
118 using hasDynamicIndexAccess = Dune::Std::is_detected<dynamicIndexAccess_t, std::remove_reference_t<C>>;
│ │ │ │ +
119
│ │ │ │ +
120 template<class C>
│ │ │ │ +
121 using hasStaticIndexAccess = Dune::Std::is_detected<staticIndexAccess_t, std::remove_reference_t<C>>;
│ │ │ │
122
│ │ │ │ -
123protected:
│ │ │ │ - │ │ │ │ - │ │ │ │ -
126};
│ │ │ │ -
127
│ │ │ │ +
123 template<class C>
│ │ │ │ +
124 using hasResizeMethod = Dune::Std::is_detected<resizeMethod_t, std::remove_reference_t<C>>;
│ │ │ │ +
125
│ │ │ │ +
126 template<class C>
│ │ │ │ +
127 using isDynamicVector = Dune::Std::is_detected<dynamicIndexAccess_t, std::remove_reference_t<C>>;
│ │ │ │
128
│ │ │ │ -
129// CTAD guide for a non-SubspaceBasis root basis
│ │ │ │ -
130template<class RB, class TP>
│ │ │ │ -
131SubspaceBasis(const RB&, const TP) -> SubspaceBasis<RB, TP>;
│ │ │ │ -
132
│ │ │ │ -
133// CTAD guide for a SubspaceBasis root basis
│ │ │ │ -
134template<class RootRootBasis, class InnerTP, class OuterTP>
│ │ │ │ -
135SubspaceBasis(const SubspaceBasis<RootRootBasis, InnerTP>& rootBasis, const OuterTP& prefixPath)
│ │ │ │ -
136 -> SubspaceBasis<std::decay_t<decltype(rootBasis.rootBasis())>, Impl::JoinTreePath_t<InnerTP, OuterTP>>;
│ │ │ │ -
137
│ │ │ │ -
138
│ │ │ │ +
129 template<class C>
│ │ │ │ +
130 using isStaticVector = Dune::Std::bool_constant<
│ │ │ │ +
131 Dune::Std::is_detected_v<staticIndexAccess_t, std::remove_reference_t<C>>
│ │ │ │ +
132 and not Dune::Std::is_detected_v<dynamicIndexAccess_t, std::remove_reference_t<C>>>;
│ │ │ │ +
133
│ │ │ │ +
134 template<class C>
│ │ │ │ +
135 using isScalar = Dune::Std::bool_constant<not Dune::Std::is_detected_v<staticIndexAccess_t, std::remove_reference_t<C>>>;
│ │ │ │ +
136
│ │ │ │ +
137 template<class C>
│ │ │ │ +
138 using isVector = Dune::Std::bool_constant<Dune::Std::is_detected_v<staticIndexAccess_t, std::remove_reference_t<C>>>;
│ │ │ │
139
│ │ │ │ -
150template<class RootBasis, class... PrefixTreeIndices>
│ │ │ │ -
151auto subspaceBasis(const RootBasis& rootBasis, const TypeTree::HybridTreePath<PrefixTreeIndices...>& prefixPath)
│ │ │ │ -
152{
│ │ │ │ -
153 return SubspaceBasis(rootBasis, prefixPath);
│ │ │ │ -
154}
│ │ │ │ -
155
│ │ │ │ -
156template<class RootBasis, class... PrefixTreeIndices>
│ │ │ │ -
157auto subspaceBasis(const RootBasis& rootBasis, const PrefixTreeIndices&... prefixTreeIndices)
│ │ │ │ -
158{
│ │ │ │ -
159 return subspaceBasis(rootBasis, TypeTree::hybridTreePath(prefixTreeIndices...));
│ │ │ │ -
160}
│ │ │ │ -
161
│ │ │ │ -
162
│ │ │ │ -
163
│ │ │ │ -
164} // end namespace Functions
│ │ │ │ -
165} // end namespace Dune
│ │ │ │ -
166
│ │ │ │ -
167
│ │ │ │ -
168
│ │ │ │ -
169#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ +
140
│ │ │ │ +
141
│ │ │ │ +
142 template<class... Args>
│ │ │ │ +
143 static void forwardToResize(Args&&... args)
│ │ │ │ +
144 {
│ │ │ │ +
145 resize(std::forward<Args>(args)...);
│ │ │ │ +
146 }
│ │ │ │ +
147
│ │ │ │ +
148
│ │ │ │ +
149 template<class C, class SizeProvider,
│ │ │ │ +
150 std::enable_if_t<hasResizeMethod<C>::value, int> = 0>
│ │ │ │ +
151 static void resize(C&& c, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ +
152 {
│ │ │ │ +
153 auto size = sizeProvider.size(prefix);
│ │ │ │ +
154 if (size==0)
│ │ │ │ +
155 {
│ │ │ │ +
156 // If size==0 this prefix refers to a single coefficient c.
│ │ │ │ +
157 // But being in this overload means that c is not a scalar
│ │ │ │ +
158 // because is has a resize() method. Since operator[] deliberately
│ │ │ │ +
159 // supports implicit padding of multi-indices by as many
│ │ │ │ +
160 // [0]'s as needed to resolve a scalar entry, we should also
│ │ │ │ +
161 // except a non-scalar c here. However, this requires that
│ │ │ │ +
162 // we silently believe that whatever size c already has is
│ │ │ │ +
163 // intended by the user. The only exception is c.size()==0
│ │ │ │ +
164 // which is not acceptable but we also cannot know the desired size.
│ │ │ │ +
165 if (c.size()==0)
│ │ │ │ +
166 DUNE_THROW(RangeError, "The vector entry v[" << prefix << "] should refer to a "
│ │ │ │ +
167 << "scalar coefficient, but is a dynamically sized vector of size==0");
│ │ │ │ +
168 else
│ │ │ │ +
169 // Accept non-zero sized coefficients to avoid that resize(basis)
│ │ │ │ +
170 // fails for a vector that works with operator[] and already
│ │ │ │ +
171 // has the appropriate size.
│ │ │ │ +
172 return;
│ │ │ │ +
173 }
│ │ │ │ +
174 c.resize(size);
│ │ │ │ +
175 prefix.push_back(0);
│ │ │ │ +
176 for(std::size_t i=0; i<size; ++i)
│ │ │ │ +
177 {
│ │ │ │ +
178 prefix.back() = i;
│ │ │ │ +
179 resize(c[i], sizeProvider, prefix);
│ │ │ │ +
180 }
│ │ │ │ +
181 }
│ │ │ │ +
182
│ │ │ │ +
183 template<class C, class SizeProvider,
│ │ │ │ +
184 std::enable_if_t<not hasResizeMethod<C>::value, int> = 0,
│ │ │ │ +
185 std::enable_if_t<isVector<C>::value, int> = 0>
│ │ │ │ +
186 static void resize(C&& c, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ +
187 {
│ │ │ │ +
188 auto size = sizeProvider.size(prefix);
│ │ │ │ +
189 // If size == 0 there's nothing to do:
│ │ │ │ +
190 // We can't resize c and it's already
│ │ │ │ +
191 // large enough anyway.
│ │ │ │ +
192 if (size == 0)
│ │ │ │ +
193 return;
│ │ │ │ +
194
│ │ │ │ +
195 // If size>0 but c does not have the appropriate
│ │ │ │ +
196 // size we throw an exception.
│ │ │ │ +
197 //
│ │ │ │ +
198 // We could perhaps also allow c.size()>size.
│ │ │ │ +
199 // But then looping the loop below gets complicated:
│ │ │ │ +
200 // We're not allowed to loop until c.size(). But
│ │ │ │ +
201 // we also cannot use size for termination,
│ │ │ │ +
202 // because this fails if c is a static vector.
│ │ │ │ +
203 if (c.size() != size)
│ │ │ │ +
204 DUNE_THROW(RangeError, "Can't resize non-resizable entry v[" << prefix << "] of size " << c.size() << " to size(" << prefix << ")=" << size);
│ │ │ │ +
205
│ │ │ │ +
206 // Recursively resize all entries of c now.
│ │ │ │ +
207 using namespace Dune::Hybrid;
│ │ │ │ +
208 prefix.push_back(0);
│ │ │ │ +
209 forEach(integralRange(Hybrid::size(c)), [&](auto&& i) {
│ │ │ │ +
210 prefix.back() = i;
│ │ │ │ +
211 // Here we'd simply like to call resize(c[i], sizeProvider, prefix);
│ │ │ │ +
212 // but even gcc-7 does not except this bus reports
│ │ │ │ +
213 // "error: ‘this’ was not captured for this lambda function"
│ │ │ │ +
214 // although there's no 'this' because we're in a static method.
│ │ │ │ +
215 // Bypassing this by and additional method that does perfect
│ │ │ │ +
216 // forwarding allows to workaround this.
│ │ │ │ +
217 ISTLVectorBackend<V>::forwardToResize(c[i], sizeProvider, prefix);
│ │ │ │ +
218 });
│ │ │ │ +
219 }
│ │ │ │ +
220
│ │ │ │ +
221 template<class C, class SizeProvider,
│ │ │ │ +
222 std::enable_if_t<not hasResizeMethod<C>::value, int> = 0,
│ │ │ │ +
223 std::enable_if_t<isScalar<C>::value, int> = 0>
│ │ │ │ +
224 static void resize(C&&, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ +
225 {
│ │ │ │ +
226 auto size = sizeProvider.size(prefix);
│ │ │ │ +
227 if (size != 0)
│ │ │ │ +
228 DUNE_THROW(RangeError, "Can't resize scalar vector entry v[" << prefix << "] to size(" << prefix << ")=" << size);
│ │ │ │ +
229 }
│ │ │ │ +
230
│ │ │ │ +
231 template<class C, class T,
│ │ │ │ +
232 std::enable_if_t<std::is_assignable<C&,T>::value, int> = 0>
│ │ │ │ +
233 void recursiveAssign(C& c, const T& t)
│ │ │ │ +
234 {
│ │ │ │ +
235 c = t;
│ │ │ │ +
236 }
│ │ │ │ +
237
│ │ │ │ +
238 template<class C, class T,
│ │ │ │ +
239 std::enable_if_t<not std::is_assignable<C&,T>::value, int> = 0>
│ │ │ │ +
240 void recursiveAssign(C& c, const T& t)
│ │ │ │ +
241 {
│ │ │ │ +
242 Dune::Hybrid::forEach(c, [&](auto&& ci) {
│ │ │ │ +
243 recursiveAssign(ci, t);
│ │ │ │ +
244 });
│ │ │ │ +
245 }
│ │ │ │ +
246
│ │ │ │ +
247public:
│ │ │ │ +
248
│ │ │ │ +
249 using Vector = V;
│ │ │ │ +
250
│ │ │ │ +
251 ISTLVectorBackend(Vector& vector) :
│ │ │ │ +
252 vector_(&vector)
│ │ │ │ +
253 {}
│ │ │ │ +
254
│ │ │ │ +
255 template<class SizeProvider>
│ │ │ │ +
256 void resize(const SizeProvider& sizeProvider)
│ │ │ │ +
257 {
│ │ │ │ +
258 auto prefix = typename SizeProvider::SizePrefix();
│ │ │ │ +
259 prefix.resize(0);
│ │ │ │ +
260 resize(*vector_, sizeProvider, prefix);
│ │ │ │ +
261 }
│ │ │ │ +
262
│ │ │ │ +
263 template<class MultiIndex>
│ │ │ │ +
264 decltype(auto) operator[](const MultiIndex& index) const
│ │ │ │ +
265 {
│ │ │ │ +
266 return resolveDynamicMultiIndex(*vector_, index);
│ │ │ │ +
267 }
│ │ │ │ +
268
│ │ │ │ +
269 template<class MultiIndex>
│ │ │ │ +
270 decltype(auto) operator[](const MultiIndex& index)
│ │ │ │ +
271 {
│ │ │ │ +
272 return resolveDynamicMultiIndex(*vector_, index);
│ │ │ │ +
273 }
│ │ │ │ +
274
│ │ │ │ +
283 template<typename T>
│ │ │ │ +
284 void operator= (const T& other)
│ │ │ │ +
285 {
│ │ │ │ +
286 recursiveAssign(vector(), other);
│ │ │ │ +
287 }
│ │ │ │ +
288
│ │ │ │ +
289 template<typename T>
│ │ │ │ +
290 void operator= (const ISTLVectorBackend<T>& other)
│ │ │ │ +
291 {
│ │ │ │ +
292 vector() = other.vector();
│ │ │ │ +
293 }
│ │ │ │ +
294
│ │ │ │ +
295 const Vector& vector() const
│ │ │ │ +
296 {
│ │ │ │ +
297 return *vector_;
│ │ │ │ +
298 }
│ │ │ │ +
299
│ │ │ │ +
300 Vector& vector()
│ │ │ │ +
301 {
│ │ │ │ +
302 return *vector_;
│ │ │ │ +
303 }
│ │ │ │ +
304
│ │ │ │ +
305private:
│ │ │ │ +
306
│ │ │ │ +
307 Vector* vector_;
│ │ │ │ +
308};
│ │ │ │ +
309
│ │ │ │ +
310} // end namespace Impl
│ │ │ │ +
311
│ │ │ │ +
312
│ │ │ │ +
313
│ │ │ │ +
345template<class Vector>
│ │ │ │ +
346auto istlVectorBackend(Vector& v)
│ │ │ │ +
347{
│ │ │ │ +
348 static_assert(hasUniqueFieldType<Vector&>(), "Vector type passed to istlVectorBackend() does not have a unique field type.");
│ │ │ │ +
349 return Impl::ISTLVectorBackend<Vector>(v);
│ │ │ │ +
350}
│ │ │ │ +
351
│ │ │ │ +
352
│ │ │ │ +
353
│ │ │ │ +
383template<class Vector>
│ │ │ │ +
384auto istlVectorBackend(const Vector& v)
│ │ │ │ +
385{
│ │ │ │ +
386 static_assert(hasUniqueFieldType<const Vector&>(), "Vector type passed to istlVectorBackend() does not have a unique field type.");
│ │ │ │ +
387 return Impl::ISTLVectorBackend<const Vector>(v);
│ │ │ │ +
388}
│ │ │ │ +
389
│ │ │ │ +
390
│ │ │ │ +
391
│ │ │ │ +
392} // namespace Functions
│ │ │ │ +
393} // namespace Dune
│ │ │ │ +
394
│ │ │ │ +
395
│ │ │ │ +
396#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_ISTLVECTORBACKEND_HH
│ │ │ │ + │ │ │ │ +
auto istlVectorBackend(Vector &v)
Return a vector backend wrapping non-const ISTL like containers.
Definition: istlvectorbackend.hh:346
│ │ │ │ +
constexpr decltype(auto) resolveDynamicMultiIndex(C &&c, const MultiIndex &multiIndex, const IsFinal &isFinal)
Provide multi-index access by chaining operator[].
Definition: indexaccess.hh:354
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
SubspaceBasis(const RB &, const TP) -> SubspaceBasis< RB, TP >
│ │ │ │ -
auto subspaceBasis(const RootBasis &rootBasis, const TypeTree::HybridTreePath< PrefixTreeIndices... > &prefixPath)
Create SubspaceBasis from a root basis and a prefixPath.
Definition: subspacebasis.hh:151
│ │ │ │ -
Definition: subspacebasis.hh:38
│ │ │ │ -
typename RootBasis::LocalView RootLocalView
Definition: subspacebasis.hh:43
│ │ │ │ -
LocalView localView() const
Return local view for basis.
Definition: subspacebasis.hh:108
│ │ │ │ -
const RootBasis * rootBasis_
Definition: subspacebasis.hh:124
│ │ │ │ -
typename RootBasis::SizePrefix SizePrefix
Definition: subspacebasis.hh:58
│ │ │ │ -
TP PrefixPath
Definition: subspacebasis.hh:45
│ │ │ │ -
SubspaceLocalView< RootLocalView, PrefixPath > LocalView
Type of the local view on the restriction of the basis to a single element.
Definition: subspacebasis.hh:56
│ │ │ │ -
size_type size(const SizePrefix &prefix) const
Return number possible values for next position in multi index.
Definition: subspacebasis.hh:100
│ │ │ │ -
typename RootBasis::GridView GridView
The grid view that the FE space is defined on.
Definition: subspacebasis.hh:48
│ │ │ │ -
const PrefixPath & prefixPath() const
Definition: subspacebasis.hh:118
│ │ │ │ -
SubspaceBasis(const SubspaceBasis< RootRootBasis, InnerTP > &rootBasis, const OuterTP &prefixPath)
Constructor from another SubspaceBasis.
Definition: subspacebasis.hh:73
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: subspacebasis.hh:80
│ │ │ │ -
RB RootBasis
Definition: subspacebasis.hh:41
│ │ │ │ -
PrefixPath prefixPath_
Definition: subspacebasis.hh:125
│ │ │ │ -
size_type size() const
Return number of possible values for next position in empty multi index.
Definition: subspacebasis.hh:94
│ │ │ │ -
const RootBasis & rootBasis() const
Definition: subspacebasis.hh:113
│ │ │ │ -
typename RootBasis::MultiIndex MultiIndex
Type used for global numbering of the basis vectors.
Definition: subspacebasis.hh:51
│ │ │ │ -
size_type dimension() const
Definition: subspacebasis.hh:88
│ │ │ │ -
std::size_t size_type
Definition: subspacebasis.hh:53
│ │ │ │ -
SubspaceBasis(const RootBasis &rootBasis, const PrefixPath &prefixPath)
Constructor for a given grid view object.
Definition: subspacebasis.hh:62
│ │ │ │ -
The restriction of a finite element basis to a single element.
Definition: subspacelocalview.hh:30
│ │ │ │ +
constexpr auto fieldTypes()
Generate list of field types in container.
Definition: istlvectorbackend.hh:63
│ │ │ │ +
constexpr bool hasUniqueFieldType()
Check if container has a unique field type.
Definition: istlvectorbackend.hh:74
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -us-ascii │ │ │ │ │ +utf-8 │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,247 +4,365 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * functionspacebases │ │ │ │ │ -subspacebasis.hh │ │ │ │ │ + * backends │ │ │ │ │ +istlvectorbackend.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACEBASIS_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACEBASIS_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_ISTLVECTORBACKEND_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_ISTLVECTORBACKEND_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ - 8#include │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8#include │ │ │ │ │ 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13 │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ 14 │ │ │ │ │ - 15 │ │ │ │ │ - 16namespace Dune { │ │ │ │ │ - 17namespace Functions { │ │ │ │ │ + 15#include │ │ │ │ │ + 16#include │ │ │ │ │ + 17 │ │ │ │ │ 18 │ │ │ │ │ - 19 │ │ │ │ │ - 20 │ │ │ │ │ - 21namespace Impl { │ │ │ │ │ - 22 │ │ │ │ │ - 23 template │ │ │ │ │ - 24 auto joinTreePaths(const TypeTree::HybridTreePath& inner, const │ │ │ │ │ -TypeTree::HybridTreePath outer) │ │ │ │ │ - 25 { │ │ │ │ │ - 26 return TypeTree::HybridTreePath(std::tuple_cat │ │ │ │ │ -(inner._data, outer._data)); │ │ │ │ │ - 27 } │ │ │ │ │ - 28 │ │ │ │ │ - 29 template │ │ │ │ │ - 30 using JoinTreePath_t = std::decay_t(), std::declval()))>; │ │ │ │ │ - 31 │ │ │ │ │ - 32} │ │ │ │ │ - 33 │ │ │ │ │ - 34 │ │ │ │ │ - 35 │ │ │ │ │ - 36template │ │ │ │ │ -37class SubspaceBasis │ │ │ │ │ - 38{ │ │ │ │ │ - 39public: │ │ │ │ │ - 40 │ │ │ │ │ -41 using RootBasis = RB; │ │ │ │ │ - 42 │ │ │ │ │ -43 using RootLocalView = typename RootBasis::LocalView; │ │ │ │ │ - 44 │ │ │ │ │ -45 using PrefixPath = TP; │ │ │ │ │ - 46 │ │ │ │ │ -48 using GridView = typename RootBasis::GridView; │ │ │ │ │ + 19namespace Dune { │ │ │ │ │ + 20namespace Functions { │ │ │ │ │ + 21 │ │ │ │ │ + 22namespace Impl { │ │ │ │ │ + 23 │ │ │ │ │ + 24template() │ │ │ │ │ +, int> = 0> │ │ │ │ │ + 26auto fieldTypes(V&& /*v*/) │ │ │ │ │ + 27{ │ │ │ │ │ + 28 return TypeList{}; │ │ │ │ │ + 29} │ │ │ │ │ + 30 │ │ │ │ │ + 31template(), │ │ │ │ │ +int> = 0> │ │ │ │ │ + 33auto fieldTypes(V&& v) │ │ │ │ │ + 34{ │ │ │ │ │ + 35 if constexpr (Dune::models, V>()) │ │ │ │ │ + 36 return fieldTypes(v[std::size_t{0}]); │ │ │ │ │ + 37 else │ │ │ │ │ + 38 { │ │ │ │ │ + 39 auto indexRange = typename decltype(range(Hybrid::size(v))):: │ │ │ │ │ +integer_sequence(); │ │ │ │ │ + 40 return unpackIntegerSequence([&](auto... i) { │ │ │ │ │ + 41 return uniqueTypeList(std::tuple_cat(fieldTypes(v[i])...)); │ │ │ │ │ + 42 }, indexRange); │ │ │ │ │ + 43 } │ │ │ │ │ + 44} │ │ │ │ │ + 45 │ │ │ │ │ + 46} // namespace Impl │ │ │ │ │ + 47 │ │ │ │ │ + 48 │ │ │ │ │ 49 │ │ │ │ │ -51 using MultiIndex = typename RootBasis::MultiIndex; │ │ │ │ │ - 52 │ │ │ │ │ -53 using size_type = std::size_t; │ │ │ │ │ - 54 │ │ │ │ │ -56 using LocalView = SubspaceLocalView; │ │ │ │ │ - 57 │ │ │ │ │ -58 using SizePrefix = typename RootBasis::SizePrefix; │ │ │ │ │ - 59 │ │ │ │ │ - 60 │ │ │ │ │ -62 SubspaceBasis(const RootBasis& rootBasis, const PrefixPath& prefixPath) : │ │ │ │ │ - 63 rootBasis_(&rootBasis), │ │ │ │ │ - 64 prefixPath_(prefixPath) │ │ │ │ │ - 65 {} │ │ │ │ │ - 66 │ │ │ │ │ - 72 template │ │ │ │ │ -73 SubspaceBasis(const SubspaceBasis& rootBasis, const │ │ │ │ │ -OuterTP& prefixPath) : │ │ │ │ │ - 74 SubspaceBasis(rootBasis.rootBasis(), Impl::joinTreePaths │ │ │ │ │ -(rootBasis.prefixPath(), prefixPath)) │ │ │ │ │ - 75 {} │ │ │ │ │ - 76 │ │ │ │ │ - 77 │ │ │ │ │ -80 const GridView& gridView() const │ │ │ │ │ - 81 { │ │ │ │ │ - 82 return rootBasis_->gridView(); │ │ │ │ │ - 83 } │ │ │ │ │ - 84 │ │ │ │ │ -88 size_type dimension() const │ │ │ │ │ - 89 { │ │ │ │ │ - 90 return rootBasis_->dimension(); │ │ │ │ │ - 91 } │ │ │ │ │ - 92 │ │ │ │ │ -94 size_type size() const │ │ │ │ │ - 95 { │ │ │ │ │ - 96 return rootBasis_->size(); │ │ │ │ │ - 97 } │ │ │ │ │ - 98 │ │ │ │ │ -100 size_type size(const SizePrefix& prefix) const │ │ │ │ │ - 101 { │ │ │ │ │ - 102 return rootBasis_->size(prefix); │ │ │ │ │ - 103 } │ │ │ │ │ - 104 │ │ │ │ │ -108 LocalView localView() const │ │ │ │ │ - 109 { │ │ │ │ │ - 110 return LocalView(*this, prefixPath_); │ │ │ │ │ - 111 } │ │ │ │ │ - 112 │ │ │ │ │ -113 const RootBasis& rootBasis() const │ │ │ │ │ - 114 { │ │ │ │ │ - 115 return *rootBasis_; │ │ │ │ │ - 116 } │ │ │ │ │ - 117 │ │ │ │ │ -118 const PrefixPath& prefixPath() const │ │ │ │ │ - 119 { │ │ │ │ │ - 120 return prefixPath_; │ │ │ │ │ - 121 } │ │ │ │ │ + 62template │ │ │ │ │ +63constexpr auto fieldTypes() │ │ │ │ │ + 64{ │ │ │ │ │ + 65 return decltype(Impl::fieldTypes(std::declval())){}; │ │ │ │ │ + 66} │ │ │ │ │ + 67 │ │ │ │ │ + 73template │ │ │ │ │ +74constexpr bool hasUniqueFieldType() │ │ │ │ │ + 75{ │ │ │ │ │ + 76 return std::tuple_size())>>::value==1; │ │ │ │ │ + 77} │ │ │ │ │ + 78 │ │ │ │ │ + 79 │ │ │ │ │ + 80 │ │ │ │ │ + 81namespace Impl { │ │ │ │ │ + 82 │ │ │ │ │ + 83/* │ │ │ │ │ + 84 * \brief A wrapper providing multi-index access to vector entries │ │ │ │ │ + 85 * │ │ │ │ │ + 86 * The wrapped vector type should be an istl like random │ │ │ │ │ + 87 * access container providing operator[] and size() methods. │ │ │ │ │ + 88 * For classical containers this should support indices │ │ │ │ │ + 89 * of type std::size_t. For multi-type containers indices │ │ │ │ │ + 90 * of the form Dune::index_constant should be supported │ │ │ │ │ + 91 * while size() should be a static constexpr method. │ │ │ │ │ + 92 * │ │ │ │ │ + 93 * When resolving multi-indices the backend appends indices │ │ │ │ │ + 94 * using operator[] as long as the result is not a scalar. │ │ │ │ │ + 95 * If this exhausts the digits of the multi-index, additional │ │ │ │ │ + 96 * zero`s are appended. │ │ │ │ │ + 97 * │ │ │ │ │ + 98 * \tparam V Type of the raw wrapper vector │ │ │ │ │ + 99 */ │ │ │ │ │ + 100template │ │ │ │ │ + 101class ISTLVectorBackend │ │ │ │ │ + 102{ │ │ │ │ │ + 103 │ │ │ │ │ + 104 // Template aliases for using detection idiom. │ │ │ │ │ + 105 template │ │ │ │ │ + 106 using dynamicIndexAccess_t = decltype(std::declval()[0]); │ │ │ │ │ + 107 │ │ │ │ │ + 108 template │ │ │ │ │ + 109 using staticIndexAccess_t = decltype(std::declval()[Dune::Indices:: │ │ │ │ │ +_0]); │ │ │ │ │ + 110 │ │ │ │ │ + 111 template │ │ │ │ │ + 112 using resizeMethod_t = decltype(std::declval().resize(0)); │ │ │ │ │ + 113 │ │ │ │ │ + 114 │ │ │ │ │ + 115 │ │ │ │ │ + 116 // Short cuts for feature detection │ │ │ │ │ + 117 template │ │ │ │ │ + 118 using hasDynamicIndexAccess = Dune::Std::is_detected>; │ │ │ │ │ + 119 │ │ │ │ │ + 120 template │ │ │ │ │ + 121 using hasStaticIndexAccess = Dune::Std::is_detected>; │ │ │ │ │ 122 │ │ │ │ │ - 123protected: │ │ │ │ │ -124 const RootBasis* rootBasis_; │ │ │ │ │ -125 PrefixPath prefixPath_; │ │ │ │ │ - 126}; │ │ │ │ │ - 127 │ │ │ │ │ + 123 template │ │ │ │ │ + 124 using hasResizeMethod = Dune::Std::is_detected>; │ │ │ │ │ + 125 │ │ │ │ │ + 126 template │ │ │ │ │ + 127 using isDynamicVector = Dune::Std::is_detected>; │ │ │ │ │ 128 │ │ │ │ │ - 129// CTAD guide for a non-SubspaceBasis root basis │ │ │ │ │ - 130template │ │ │ │ │ -131SubspaceBasis(const RB&, const TP) -> SubspaceBasis; │ │ │ │ │ - 132 │ │ │ │ │ - 133// CTAD guide for a SubspaceBasis root basis │ │ │ │ │ - 134template │ │ │ │ │ -135SubspaceBasis(const SubspaceBasis& rootBasis, const │ │ │ │ │ -OuterTP& prefixPath) │ │ │ │ │ - 136 -> SubspaceBasis, Impl:: │ │ │ │ │ -JoinTreePath_t>; │ │ │ │ │ - 137 │ │ │ │ │ - 138 │ │ │ │ │ + 129 template │ │ │ │ │ + 130 using isStaticVector = Dune::Std::bool_constant< │ │ │ │ │ + 131 Dune::Std::is_detected_v> │ │ │ │ │ + 132 and not Dune::Std::is_detected_v>>; │ │ │ │ │ + 133 │ │ │ │ │ + 134 template │ │ │ │ │ + 135 using isScalar = Dune::Std::bool_constant>>; │ │ │ │ │ + 136 │ │ │ │ │ + 137 template │ │ │ │ │ + 138 using isVector = Dune::Std::bool_constant>>; │ │ │ │ │ 139 │ │ │ │ │ - 150template │ │ │ │ │ -151auto subspaceBasis(const RootBasis& rootBasis, const TypeTree:: │ │ │ │ │ -HybridTreePath& prefixPath) │ │ │ │ │ - 152{ │ │ │ │ │ - 153 return SubspaceBasis(rootBasis, prefixPath); │ │ │ │ │ - 154} │ │ │ │ │ - 155 │ │ │ │ │ - 156template │ │ │ │ │ -157auto subspaceBasis(const RootBasis& rootBasis, const PrefixTreeIndices&... │ │ │ │ │ -prefixTreeIndices) │ │ │ │ │ - 158{ │ │ │ │ │ - 159 return subspaceBasis(rootBasis, TypeTree::hybridTreePath │ │ │ │ │ -(prefixTreeIndices...)); │ │ │ │ │ - 160} │ │ │ │ │ - 161 │ │ │ │ │ - 162 │ │ │ │ │ - 163 │ │ │ │ │ - 164} // end namespace Functions │ │ │ │ │ - 165} // end namespace Dune │ │ │ │ │ - 166 │ │ │ │ │ - 167 │ │ │ │ │ - 168 │ │ │ │ │ - 169#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH │ │ │ │ │ -type_traits.hh │ │ │ │ │ -subspacelocalview.hh │ │ │ │ │ + 140 │ │ │ │ │ + 141 │ │ │ │ │ + 142 template │ │ │ │ │ + 143 static void forwardToResize(Args&&... args) │ │ │ │ │ + 144 { │ │ │ │ │ + 145 resize(std::forward(args)...); │ │ │ │ │ + 146 } │ │ │ │ │ + 147 │ │ │ │ │ + 148 │ │ │ │ │ + 149 template::value, int> = 0> │ │ │ │ │ + 151 static void resize(C&& c, const SizeProvider& sizeProvider, typename │ │ │ │ │ +SizeProvider::SizePrefix prefix) │ │ │ │ │ + 152 { │ │ │ │ │ + 153 auto size = sizeProvider.size(prefix); │ │ │ │ │ + 154 if (size==0) │ │ │ │ │ + 155 { │ │ │ │ │ + 156 // If size==0 this prefix refers to a single coefficient c. │ │ │ │ │ + 157 // But being in this overload means that c is not a scalar │ │ │ │ │ + 158 // because is has a resize() method. Since operator[] deliberately │ │ │ │ │ + 159 // supports implicit padding of multi-indices by as many │ │ │ │ │ + 160 // [0]'s as needed to resolve a scalar entry, we should also │ │ │ │ │ + 161 // except a non-scalar c here. However, this requires that │ │ │ │ │ + 162 // we silently believe that whatever size c already has is │ │ │ │ │ + 163 // intended by the user. The only exception is c.size()==0 │ │ │ │ │ + 164 // which is not acceptable but we also cannot know the desired size. │ │ │ │ │ + 165 if (c.size()==0) │ │ │ │ │ + 166 DUNE_THROW(RangeError, "The vector entry v[" << prefix << "] should refer │ │ │ │ │ +to a " │ │ │ │ │ + 167 << "scalar coefficient, but is a dynamically sized vector of size==0"); │ │ │ │ │ + 168 else │ │ │ │ │ + 169 // Accept non-zero sized coefficients to avoid that resize(basis) │ │ │ │ │ + 170 // fails for a vector that works with operator[] and already │ │ │ │ │ + 171 // has the appropriate size. │ │ │ │ │ + 172 return; │ │ │ │ │ + 173 } │ │ │ │ │ + 174 c.resize(size); │ │ │ │ │ + 175 prefix.push_back(0); │ │ │ │ │ + 176 for(std::size_t i=0; i::value, int> = 0, │ │ │ │ │ + 185 std::enable_if_t::value, int> = 0> │ │ │ │ │ + 186 static void resize(C&& c, const SizeProvider& sizeProvider, typename │ │ │ │ │ +SizeProvider::SizePrefix prefix) │ │ │ │ │ + 187 { │ │ │ │ │ + 188 auto size = sizeProvider.size(prefix); │ │ │ │ │ + 189 // If size == 0 there's nothing to do: │ │ │ │ │ + 190 // We can't resize c and it's already │ │ │ │ │ + 191 // large enough anyway. │ │ │ │ │ + 192 if (size == 0) │ │ │ │ │ + 193 return; │ │ │ │ │ + 194 │ │ │ │ │ + 195 // If size>0 but c does not have the appropriate │ │ │ │ │ + 196 // size we throw an exception. │ │ │ │ │ + 197 // │ │ │ │ │ + 198 // We could perhaps also allow c.size()>size. │ │ │ │ │ + 199 // But then looping the loop below gets complicated: │ │ │ │ │ + 200 // We're not allowed to loop until c.size(). But │ │ │ │ │ + 201 // we also cannot use size for termination, │ │ │ │ │ + 202 // because this fails if c is a static vector. │ │ │ │ │ + 203 if (c.size() != size) │ │ │ │ │ + 204 DUNE_THROW(RangeError, "Can't resize non-resizable entry v[" << prefix << │ │ │ │ │ +"] of size " << c.size() << " to size(" << prefix << ")=" << size); │ │ │ │ │ + 205 │ │ │ │ │ + 206 // Recursively resize all entries of c now. │ │ │ │ │ + 207 using namespace Dune::Hybrid; │ │ │ │ │ + 208 prefix.push_back(0); │ │ │ │ │ + 209 forEach(integralRange(Hybrid::size(c)), [&](auto&& i) { │ │ │ │ │ + 210 prefix.back() = i; │ │ │ │ │ + 211 // Here we'd simply like to call resize(c[i], sizeProvider, prefix); │ │ │ │ │ + 212 // but even gcc-7 does not except this bus reports │ │ │ │ │ + 213 // "error: ‘this’ was not captured for this lambda function" │ │ │ │ │ + 214 // although there's no 'this' because we're in a static method. │ │ │ │ │ + 215 // Bypassing this by and additional method that does perfect │ │ │ │ │ + 216 // forwarding allows to workaround this. │ │ │ │ │ + 217 ISTLVectorBackend::forwardToResize(c[i], sizeProvider, prefix); │ │ │ │ │ + 218 }); │ │ │ │ │ + 219 } │ │ │ │ │ + 220 │ │ │ │ │ + 221 template::value, int> = 0, │ │ │ │ │ + 223 std::enable_if_t::value, int> = 0> │ │ │ │ │ + 224 static void resize(C&&, const SizeProvider& sizeProvider, typename │ │ │ │ │ +SizeProvider::SizePrefix prefix) │ │ │ │ │ + 225 { │ │ │ │ │ + 226 auto size = sizeProvider.size(prefix); │ │ │ │ │ + 227 if (size != 0) │ │ │ │ │ + 228 DUNE_THROW(RangeError, "Can't resize scalar vector entry v[" << prefix << │ │ │ │ │ +"] to size(" << prefix << ")=" << size); │ │ │ │ │ + 229 } │ │ │ │ │ + 230 │ │ │ │ │ + 231 template::value, int> = 0> │ │ │ │ │ + 233 void recursiveAssign(C& c, const T& t) │ │ │ │ │ + 234 { │ │ │ │ │ + 235 c = t; │ │ │ │ │ + 236 } │ │ │ │ │ + 237 │ │ │ │ │ + 238 template::value, int> = 0> │ │ │ │ │ + 240 void recursiveAssign(C& c, const T& t) │ │ │ │ │ + 241 { │ │ │ │ │ + 242 Dune::Hybrid::forEach(c, [&](auto&& ci) { │ │ │ │ │ + 243 recursiveAssign(ci, t); │ │ │ │ │ + 244 }); │ │ │ │ │ + 245 } │ │ │ │ │ + 246 │ │ │ │ │ + 247public: │ │ │ │ │ + 248 │ │ │ │ │ + 249 using Vector = V; │ │ │ │ │ + 250 │ │ │ │ │ + 251 ISTLVectorBackend(Vector& vector) : │ │ │ │ │ + 252 vector_(&vector) │ │ │ │ │ + 253 {} │ │ │ │ │ + 254 │ │ │ │ │ + 255 template │ │ │ │ │ + 256 void resize(const SizeProvider& sizeProvider) │ │ │ │ │ + 257 { │ │ │ │ │ + 258 auto prefix = typename SizeProvider::SizePrefix(); │ │ │ │ │ + 259 prefix.resize(0); │ │ │ │ │ + 260 resize(*vector_, sizeProvider, prefix); │ │ │ │ │ + 261 } │ │ │ │ │ + 262 │ │ │ │ │ + 263 template │ │ │ │ │ + 264 decltype(auto) operator[](const MultiIndex& index) const │ │ │ │ │ + 265 { │ │ │ │ │ + 266 return resolveDynamicMultiIndex(*vector_, index); │ │ │ │ │ + 267 } │ │ │ │ │ + 268 │ │ │ │ │ + 269 template │ │ │ │ │ + 270 decltype(auto) operator[](const MultiIndex& index) │ │ │ │ │ + 271 { │ │ │ │ │ + 272 return resolveDynamicMultiIndex(*vector_, index); │ │ │ │ │ + 273 } │ │ │ │ │ + 274 │ │ │ │ │ + 283 template │ │ │ │ │ + 284 void operator= (const T& other) │ │ │ │ │ + 285 { │ │ │ │ │ + 286 recursiveAssign(vector(), other); │ │ │ │ │ + 287 } │ │ │ │ │ + 288 │ │ │ │ │ + 289 template │ │ │ │ │ + 290 void operator= (const ISTLVectorBackend& other) │ │ │ │ │ + 291 { │ │ │ │ │ + 292 vector() = other.vector(); │ │ │ │ │ + 293 } │ │ │ │ │ + 294 │ │ │ │ │ + 295 const Vector& vector() const │ │ │ │ │ + 296 { │ │ │ │ │ + 297 return *vector_; │ │ │ │ │ + 298 } │ │ │ │ │ + 299 │ │ │ │ │ + 300 Vector& vector() │ │ │ │ │ + 301 { │ │ │ │ │ + 302 return *vector_; │ │ │ │ │ + 303 } │ │ │ │ │ + 304 │ │ │ │ │ + 305private: │ │ │ │ │ + 306 │ │ │ │ │ + 307 Vector* vector_; │ │ │ │ │ + 308}; │ │ │ │ │ + 309 │ │ │ │ │ + 310} // end namespace Impl │ │ │ │ │ + 311 │ │ │ │ │ + 312 │ │ │ │ │ + 313 │ │ │ │ │ + 345template │ │ │ │ │ +346auto istlVectorBackend(Vector& v) │ │ │ │ │ + 347{ │ │ │ │ │ + 348 static_assert(hasUniqueFieldType(), "Vector type passed to │ │ │ │ │ +istlVectorBackend() does not have a unique field type."); │ │ │ │ │ + 349 return Impl::ISTLVectorBackend(v); │ │ │ │ │ + 350} │ │ │ │ │ + 351 │ │ │ │ │ + 352 │ │ │ │ │ + 353 │ │ │ │ │ + 383template │ │ │ │ │ +384auto istlVectorBackend(const Vector& v) │ │ │ │ │ + 385{ │ │ │ │ │ + 386 static_assert(hasUniqueFieldType(), "Vector type passed to │ │ │ │ │ +istlVectorBackend() does not have a unique field type."); │ │ │ │ │ + 387 return Impl::ISTLVectorBackend(v); │ │ │ │ │ + 388} │ │ │ │ │ + 389 │ │ │ │ │ + 390 │ │ │ │ │ + 391 │ │ │ │ │ + 392} // namespace Functions │ │ │ │ │ + 393} // namespace Dune │ │ │ │ │ + 394 │ │ │ │ │ + 395 │ │ │ │ │ + 396#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_ISTLVECTORBACKEND_HH │ │ │ │ │ +indexaccess.hh │ │ │ │ │ +Dune::Functions::istlVectorBackend │ │ │ │ │ +auto istlVectorBackend(Vector &v) │ │ │ │ │ +Return a vector backend wrapping non-const ISTL like containers. │ │ │ │ │ +Definition: istlvectorbackend.hh:346 │ │ │ │ │ +Dune::Functions::resolveDynamicMultiIndex │ │ │ │ │ +constexpr decltype(auto) resolveDynamicMultiIndex(C &&c, const MultiIndex │ │ │ │ │ +&multiIndex, const IsFinal &isFinal) │ │ │ │ │ +Provide multi-index access by chaining operator[]. │ │ │ │ │ +Definition: indexaccess.hh:354 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::SubspaceBasis │ │ │ │ │ -SubspaceBasis(const RB &, const TP) -> SubspaceBasis< RB, TP > │ │ │ │ │ -Dune::Functions::subspaceBasis │ │ │ │ │ -auto subspaceBasis(const RootBasis &rootBasis, const TypeTree::HybridTreePath< │ │ │ │ │ -PrefixTreeIndices... > &prefixPath) │ │ │ │ │ -Create SubspaceBasis from a root basis and a prefixPath. │ │ │ │ │ -Definition: subspacebasis.hh:151 │ │ │ │ │ -Dune::Functions::SubspaceBasis │ │ │ │ │ -Definition: subspacebasis.hh:38 │ │ │ │ │ -Dune::Functions::SubspaceBasis::RootLocalView │ │ │ │ │ -typename RootBasis::LocalView RootLocalView │ │ │ │ │ -Definition: subspacebasis.hh:43 │ │ │ │ │ -Dune::Functions::SubspaceBasis::localView │ │ │ │ │ -LocalView localView() const │ │ │ │ │ -Return local view for basis. │ │ │ │ │ -Definition: subspacebasis.hh:108 │ │ │ │ │ -Dune::Functions::SubspaceBasis::rootBasis_ │ │ │ │ │ -const RootBasis * rootBasis_ │ │ │ │ │ -Definition: subspacebasis.hh:124 │ │ │ │ │ -Dune::Functions::SubspaceBasis::SizePrefix │ │ │ │ │ -typename RootBasis::SizePrefix SizePrefix │ │ │ │ │ -Definition: subspacebasis.hh:58 │ │ │ │ │ -Dune::Functions::SubspaceBasis::PrefixPath │ │ │ │ │ -TP PrefixPath │ │ │ │ │ -Definition: subspacebasis.hh:45 │ │ │ │ │ -Dune::Functions::SubspaceBasis::LocalView │ │ │ │ │ -SubspaceLocalView< RootLocalView, PrefixPath > LocalView │ │ │ │ │ -Type of the local view on the restriction of the basis to a single element. │ │ │ │ │ -Definition: subspacebasis.hh:56 │ │ │ │ │ -Dune::Functions::SubspaceBasis::size │ │ │ │ │ -size_type size(const SizePrefix &prefix) const │ │ │ │ │ -Return number possible values for next position in multi index. │ │ │ │ │ -Definition: subspacebasis.hh:100 │ │ │ │ │ -Dune::Functions::SubspaceBasis::GridView │ │ │ │ │ -typename RootBasis::GridView GridView │ │ │ │ │ -The grid view that the FE space is defined on. │ │ │ │ │ -Definition: subspacebasis.hh:48 │ │ │ │ │ -Dune::Functions::SubspaceBasis::prefixPath │ │ │ │ │ -const PrefixPath & prefixPath() const │ │ │ │ │ -Definition: subspacebasis.hh:118 │ │ │ │ │ -Dune::Functions::SubspaceBasis::SubspaceBasis │ │ │ │ │ -SubspaceBasis(const SubspaceBasis< RootRootBasis, InnerTP > &rootBasis, const │ │ │ │ │ -OuterTP &prefixPath) │ │ │ │ │ -Constructor from another SubspaceBasis. │ │ │ │ │ -Definition: subspacebasis.hh:73 │ │ │ │ │ -Dune::Functions::SubspaceBasis::gridView │ │ │ │ │ -const GridView & gridView() const │ │ │ │ │ -Obtain the grid view that the basis is defined on. │ │ │ │ │ -Definition: subspacebasis.hh:80 │ │ │ │ │ -Dune::Functions::SubspaceBasis::RootBasis │ │ │ │ │ -RB RootBasis │ │ │ │ │ -Definition: subspacebasis.hh:41 │ │ │ │ │ -Dune::Functions::SubspaceBasis::prefixPath_ │ │ │ │ │ -PrefixPath prefixPath_ │ │ │ │ │ -Definition: subspacebasis.hh:125 │ │ │ │ │ -Dune::Functions::SubspaceBasis::size │ │ │ │ │ -size_type size() const │ │ │ │ │ -Return number of possible values for next position in empty multi index. │ │ │ │ │ -Definition: subspacebasis.hh:94 │ │ │ │ │ -Dune::Functions::SubspaceBasis::rootBasis │ │ │ │ │ -const RootBasis & rootBasis() const │ │ │ │ │ -Definition: subspacebasis.hh:113 │ │ │ │ │ -Dune::Functions::SubspaceBasis::MultiIndex │ │ │ │ │ -typename RootBasis::MultiIndex MultiIndex │ │ │ │ │ -Type used for global numbering of the basis vectors. │ │ │ │ │ -Definition: subspacebasis.hh:51 │ │ │ │ │ -Dune::Functions::SubspaceBasis::dimension │ │ │ │ │ -size_type dimension() const │ │ │ │ │ -Definition: subspacebasis.hh:88 │ │ │ │ │ -Dune::Functions::SubspaceBasis::size_type │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Definition: subspacebasis.hh:53 │ │ │ │ │ -Dune::Functions::SubspaceBasis::SubspaceBasis │ │ │ │ │ -SubspaceBasis(const RootBasis &rootBasis, const PrefixPath &prefixPath) │ │ │ │ │ -Constructor for a given grid view object. │ │ │ │ │ -Definition: subspacebasis.hh:62 │ │ │ │ │ -Dune::Functions::SubspaceLocalView │ │ │ │ │ -The restriction of a finite element basis to a single element. │ │ │ │ │ -Definition: subspacelocalview.hh:30 │ │ │ │ │ +Dune::Functions::fieldTypes │ │ │ │ │ +constexpr auto fieldTypes() │ │ │ │ │ +Generate list of field types in container. │ │ │ │ │ +Definition: istlvectorbackend.hh:63 │ │ │ │ │ +Dune::Functions::hasUniqueFieldType │ │ │ │ │ +constexpr bool hasUniqueFieldType() │ │ │ │ │ +Check if container has a unique field type. │ │ │ │ │ +Definition: istlvectorbackend.hh:74 │ │ │ │ │ concepts.hh │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00161.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: basistags.hh File Reference │ │ │ │ +dune-functions: polynomial.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,85 +58,42 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
basistags.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
polynomial.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ -#include <dune/common/concept.hh>
│ │ │ │ +
#include <cmath>
│ │ │ │ +#include <initializer_list>
│ │ │ │ +#include <vector>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::Functions::Concept::IndexMergingStrategy
 
struct  Dune::Functions::BasisFactory::IndexMergingStrategy
 Base class for index merging strategies to simplify detection. More...
 
struct  Dune::Functions::BasisFactory::FlatLexicographic
 Lexicographic merging of direct children without blocking. More...
 
struct  Dune::Functions::BasisFactory::FlatInterleaved
 Interleaved merging of direct children without blocking. More...
 
struct  Dune::Functions::BasisFactory::BlockedLexicographic
 Lexicographic merging of direct children with blocking (i.e. creating one block per direct child). More...
 
struct  Dune::Functions::BasisFactory::BlockedInterleaved
 Interleaved merging of direct children with blocking (i.e. creating blocks at the leaves containing one leaf per child each). More...
class  Dune::Functions::Polynomial< K >
 A scalar polynomial implementation. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
namespace  Dune::Functions::Concept
 
namespace  Dune::Functions::BasisFactory
 
namespace  Dune::Functions::BasisBuilder
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<typename T >
static constexpr bool Dune::Functions::Concept::isIndexMergingStrategy ()
 
template<typename T >
static constexpr bool Dune::Functions::Concept::isIndexMergingStrategy (T &&t)
 
void Dune::Functions::BasisFactory::registerIndexMergingStrategy (IndexMergingStrategy)
 
constexpr FlatLexicographic Dune::Functions::BasisFactory::flatLexicographic ()
 Creates a lexicographic merging of direct children without blocking. More...
 
constexpr FlatInterleaved Dune::Functions::BasisFactory::flatInterleaved ()
 Creates an interleaved merging of direct children without blocking. More...
 
constexpr BlockedLexicographic Dune::Functions::BasisFactory::blockedLexicographic ()
 Creates a lexicographic merging of direct children with blocking (i.e. creating one block per direct child). More...
 
constexpr BlockedInterleaved Dune::Functions::BasisFactory::blockedInterleaved ()
 Creates an interleaved merging of direct children with blocking (i.e. creating blocks at the leaves containing one leaf per child each). More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,83 +4,26 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * functionspacebases │ │ │ │ │ -Classes | Namespaces | Functions │ │ │ │ │ -basistags.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * analyticfunctions │ │ │ │ │ +Classes | Namespaces │ │ │ │ │ +polynomial.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -struct  Dune::Functions::Concept::IndexMergingStrategy │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::BasisFactory::IndexMergingStrategy │ │ │ │ │ -  Base class for index merging strategies to simplify detection. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::BasisFactory::FlatLexicographic │ │ │ │ │ -  Lexicographic merging of direct children without blocking. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::BasisFactory::FlatInterleaved │ │ │ │ │ -  Interleaved merging of direct children without blocking. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::BasisFactory::BlockedLexicographic │ │ │ │ │ -  Lexicographic merging of direct children with blocking (i.e. creating │ │ │ │ │ - one block per direct child). More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Functions::BasisFactory::BlockedInterleaved │ │ │ │ │ -  Interleaved merging of direct children with blocking (i.e. creating │ │ │ │ │ - blocks at the leaves containing one leaf per child each). More... │ │ │ │ │ +class  Dune::Functions::Polynomial<_K_> │ │ │ │ │ +  A scalar polynomial implementation. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ -namespace  Dune::Functions::Concept │ │ │ │ │ -  │ │ │ │ │ -namespace  Dune::Functions::BasisFactory │ │ │ │ │ -  │ │ │ │ │ -namespace  Dune::Functions::BasisBuilder │ │ │ │ │ -  │ │ │ │ │ - Functions │ │ │ │ │ -template │ │ │ │ │ - static constexpr bool Dune::Functions::Concept:: │ │ │ │ │ - isIndexMergingStrategy () │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - static constexpr bool Dune::Functions::Concept:: │ │ │ │ │ - isIndexMergingStrategy (T &&t) │ │ │ │ │ -  │ │ │ │ │ - void Dune::Functions::BasisFactory:: │ │ │ │ │ - registerIndexMergingStrategy │ │ │ │ │ - (IndexMergingStrategy) │ │ │ │ │ -  │ │ │ │ │ - constexpr FlatLexicographic Dune::Functions::BasisFactory:: │ │ │ │ │ - flatLexicographic () │ │ │ │ │ -  Creates a lexicographic merging of direct │ │ │ │ │ - children without blocking. More... │ │ │ │ │ -  │ │ │ │ │ - constexpr FlatInterleaved Dune::Functions::BasisFactory::flatInterleaved │ │ │ │ │ - () │ │ │ │ │ -  Creates an interleaved merging of direct │ │ │ │ │ - children without blocking. More... │ │ │ │ │ -  │ │ │ │ │ -constexpr BlockedLexicographic Dune::Functions::BasisFactory:: │ │ │ │ │ - blockedLexicographic () │ │ │ │ │ - Creates a lexicographic merging of direct │ │ │ │ │ -  children with blocking (i.e. creating one block │ │ │ │ │ - per direct child). More... │ │ │ │ │ -  │ │ │ │ │ - constexpr BlockedInterleaved Dune::Functions::BasisFactory:: │ │ │ │ │ - blockedInterleaved () │ │ │ │ │ - Creates an interleaved merging of direct │ │ │ │ │ -  children with blocking (i.e. creating blocks at │ │ │ │ │ - the leaves containing one leaf per child each). │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00161_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: basistags.hh Source File │ │ │ │ +dune-functions: polynomial.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,126 +58,106 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
basistags.hh
│ │ │ │ +
polynomial.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BASISTAGS_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BASISTAGS_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_ANALYTICFUNCTIONS_POLYNOMIAL_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_ANALYTICFUNCTIONS_POLYNOMIAL_HH
│ │ │ │
5
│ │ │ │ -
6#include <type_traits>
│ │ │ │ -
7#include <dune/common/concept.hh>
│ │ │ │ -
8
│ │ │ │ -
9namespace Dune {
│ │ │ │ -
10namespace Functions {
│ │ │ │ -
11
│ │ │ │ -
12 namespace Concept {
│ │ │ │ +
6#include <cmath>
│ │ │ │ +
7#include <initializer_list>
│ │ │ │ +
8#include <vector>
│ │ │ │ +
9
│ │ │ │ +
10namespace Dune {
│ │ │ │ +
11namespace Functions {
│ │ │ │ +
12
│ │ │ │
13
│ │ │ │ - │ │ │ │ -
15 {
│ │ │ │ -
16 template<typename T>
│ │ │ │ -
17 auto require(T&& t) -> decltype(
│ │ │ │ - │ │ │ │ -
19 );
│ │ │ │ -
20 };
│ │ │ │ -
21
│ │ │ │ -
22 template<typename T>
│ │ │ │ -
23 static constexpr bool isIndexMergingStrategy()
│ │ │ │ -
24 {
│ │ │ │ -
25 return models<Concept::IndexMergingStrategy,T>();
│ │ │ │ -
26 }
│ │ │ │ -
27
│ │ │ │ -
28 template<typename T>
│ │ │ │ -
29 static constexpr bool isIndexMergingStrategy(T&& t)
│ │ │ │ -
30 {
│ │ │ │ -
31 return models<Concept::IndexMergingStrategy,std::decay_t<T>>();
│ │ │ │ -
32 }
│ │ │ │ -
33
│ │ │ │ -
34 } // namespace Concept
│ │ │ │ -
35
│ │ │ │ -
36
│ │ │ │ -
37namespace BasisFactory {
│ │ │ │ -
38
│ │ │ │ - │ │ │ │ -
45
│ │ │ │ - │ │ │ │ -
47
│ │ │ │ - │ │ │ │ - │ │ │ │ -
80 {};
│ │ │ │ -
81
│ │ │ │ - │ │ │ │ -
113 : public IndexMergingStrategy
│ │ │ │ -
114 {};
│ │ │ │ +
24template<class K>
│ │ │ │ + │ │ │ │ +
26{
│ │ │ │ +
27public:
│ │ │ │ +
28
│ │ │ │ +
30 Polynomial() = default;
│ │ │ │ +
31
│ │ │ │ +
33 Polynomial(const Polynomial& other) = default;
│ │ │ │ +
34
│ │ │ │ +
36 Polynomial(Polynomial&& other) = default;
│ │ │ │ +
37
│ │ │ │ +
39 Polynomial& operator=(const Polynomial& other) = default;
│ │ │ │ +
40
│ │ │ │ +
42 Polynomial& operator=(Polynomial&& other) = default;
│ │ │ │ +
43
│ │ │ │ +
50 Polynomial(std::initializer_list<K> coefficients) :
│ │ │ │ +
51 coefficients_(coefficients)
│ │ │ │ +
52 {}
│ │ │ │ +
53
│ │ │ │ +
61 Polynomial(std::vector<K>&& coefficients) :
│ │ │ │ +
62 coefficients_(std::move(coefficients))
│ │ │ │ +
63 {}
│ │ │ │ +
64
│ │ │ │ +
72 Polynomial(const std::vector<K>& coefficients) :
│ │ │ │ +
73 coefficients_(coefficients)
│ │ │ │ +
74 {}
│ │ │ │ +
75
│ │ │ │ +
77 K operator() (const K& x) const
│ │ │ │ +
78 {
│ │ │ │ +
79 auto y = K(0);
│ │ │ │ +
80 for (size_t i=0; i<coefficients_.size(); ++i)
│ │ │ │ +
81 y += coefficients_[i] * std::pow(x, i);
│ │ │ │ +
82 return y;
│ │ │ │ +
83 }
│ │ │ │ +
84
│ │ │ │ + │ │ │ │ +
95 {
│ │ │ │ +
96 std::vector<K> dpCoefficients(p.coefficients().size()-1);
│ │ │ │ +
97 for (size_t i=1; i<p.coefficients_.size(); ++i)
│ │ │ │ +
98 dpCoefficients[i-1] = p.coefficients()[i]*i;
│ │ │ │ +
99 return Polynomial(std::move(dpCoefficients));
│ │ │ │ +
100 }
│ │ │ │ +
101
│ │ │ │ +
103 const std::vector<K>& coefficients() const
│ │ │ │ +
104 {
│ │ │ │ +
105 return coefficients_;
│ │ │ │ +
106 }
│ │ │ │ +
107
│ │ │ │ +
108private:
│ │ │ │ +
109 std::vector<K> coefficients_;
│ │ │ │ +
110};
│ │ │ │ +
111
│ │ │ │ +
112
│ │ │ │ +
113
│ │ │ │ +
114}} // namespace Dune::Functions
│ │ │ │
115
│ │ │ │ - │ │ │ │ -
147 : public IndexMergingStrategy
│ │ │ │ -
148 {};
│ │ │ │ -
149
│ │ │ │ - │ │ │ │ -
181
│ │ │ │ -
182
│ │ │ │ - │ │ │ │ -
189 {
│ │ │ │ -
190 return {};
│ │ │ │ -
191 }
│ │ │ │ -
192
│ │ │ │ - │ │ │ │ -
199 {
│ │ │ │ -
200 return {};
│ │ │ │ -
201 }
│ │ │ │ -
202
│ │ │ │ - │ │ │ │ -
209 {
│ │ │ │ -
210 return {};
│ │ │ │ -
211 }
│ │ │ │ -
212
│ │ │ │ - │ │ │ │ -
219 {
│ │ │ │ -
220 return {};
│ │ │ │ -
221 }
│ │ │ │ -
222
│ │ │ │ -
223} // end namespace BasisFactory
│ │ │ │ -
224
│ │ │ │ -
225// Backward compatibility
│ │ │ │ -
226namespace BasisBuilder {
│ │ │ │ -
227
│ │ │ │ -
228 using namespace BasisFactory;
│ │ │ │ -
229
│ │ │ │ -
230}
│ │ │ │ -
231
│ │ │ │ -
232} // end namespace Functions
│ │ │ │ -
233} // end namespace Dune
│ │ │ │ -
234
│ │ │ │ -
235
│ │ │ │ -
236#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BASISTAGS_HH
│ │ │ │ -
constexpr FlatLexicographic flatLexicographic()
Creates a lexicographic merging of direct children without blocking.
Definition: basistags.hh:188
│ │ │ │ -
constexpr BlockedInterleaved blockedInterleaved()
Creates an interleaved merging of direct children with blocking (i.e. creating blocks at the leaves c...
Definition: basistags.hh:218
│ │ │ │ -
constexpr FlatInterleaved flatInterleaved()
Creates an interleaved merging of direct children without blocking.
Definition: basistags.hh:198
│ │ │ │ -
constexpr BlockedLexicographic blockedLexicographic()
Creates a lexicographic merging of direct children with blocking (i.e. creating one block per direct ...
Definition: basistags.hh:208
│ │ │ │ +
116
│ │ │ │ +
117
│ │ │ │ +
118#endif // DUNE_FUNCTIONS_ANALYTICFUNCTIONS_POLYNOMIAL_HH
│ │ │ │ +
friend Polynomial derivative(const Polynomial &p)
Obtain derivative of Polynomial function.
Definition: polynomial.hh:94
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
static constexpr bool isIndexMergingStrategy()
Definition: basistags.hh:23
│ │ │ │ -
void registerIndexMergingStrategy(IndexMergingStrategy)
│ │ │ │ - │ │ │ │ -
auto require(T &&t) -> decltype(registerIndexMergingStrategy(t))
│ │ │ │ -
Base class for index merging strategies to simplify detection.
Definition: basistags.hh:44
│ │ │ │ -
Lexicographic merging of direct children without blocking.
Definition: basistags.hh:80
│ │ │ │ -
Interleaved merging of direct children without blocking.
Definition: basistags.hh:114
│ │ │ │ -
Lexicographic merging of direct children with blocking (i.e. creating one block per direct child).
Definition: basistags.hh:148
│ │ │ │ -
Interleaved merging of direct children with blocking (i.e. creating blocks at the leaves containing o...
Definition: basistags.hh:180
│ │ │ │ +
A scalar polynomial implementation.
Definition: polynomial.hh:26
│ │ │ │ +
Polynomial()=default
Default constructor.
│ │ │ │ +
const std::vector< K > & coefficients() const
Obtain reference to coefficient vector.
Definition: polynomial.hh:103
│ │ │ │ +
Polynomial & operator=(const Polynomial &other)=default
Copy-assignment operator.
│ │ │ │ +
Polynomial & operator=(Polynomial &&other)=default
Move-assignment operator.
│ │ │ │ +
Polynomial(std::initializer_list< K > coefficients)
Create from list of coefficients.
Definition: polynomial.hh:50
│ │ │ │ +
K operator()(const K &x) const
Evaluate polynomial.
Definition: polynomial.hh:77
│ │ │ │ +
Polynomial(const Polynomial &other)=default
Copy constructor.
│ │ │ │ +
Polynomial(Polynomial &&other)=default
Move constructor.
│ │ │ │ +
Polynomial(const std::vector< K > &coefficients)
Create from list of coefficients.
Definition: polynomial.hh:72
│ │ │ │ +
Polynomial(std::vector< K > &&coefficients)
Create from list of coefficients.
Definition: polynomial.hh:61
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,150 +4,129 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * functionspacebases │ │ │ │ │ -basistags.hh │ │ │ │ │ + * analyticfunctions │ │ │ │ │ +polynomial.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BASISTAGS_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BASISTAGS_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_ANALYTICFUNCTIONS_POLYNOMIAL_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_ANALYTICFUNCTIONS_POLYNOMIAL_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ - 8 │ │ │ │ │ - 9namespace Dune { │ │ │ │ │ - 10namespace Functions { │ │ │ │ │ - 11 │ │ │ │ │ - 12 namespace Concept { │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8#include │ │ │ │ │ + 9 │ │ │ │ │ +10namespace Dune { │ │ │ │ │ +11namespace Functions { │ │ │ │ │ + 12 │ │ │ │ │ 13 │ │ │ │ │ -14 struct IndexMergingStrategy │ │ │ │ │ - 15 { │ │ │ │ │ - 16 template │ │ │ │ │ -17 auto require(T&& t) -> decltype( │ │ │ │ │ - 18 registerIndexMergingStrategy(t) │ │ │ │ │ - 19 ); │ │ │ │ │ - 20 }; │ │ │ │ │ - 21 │ │ │ │ │ - 22 template │ │ │ │ │ -23 static constexpr bool isIndexMergingStrategy() │ │ │ │ │ - 24 { │ │ │ │ │ - 25 return models(); │ │ │ │ │ - 26 } │ │ │ │ │ - 27 │ │ │ │ │ - 28 template │ │ │ │ │ -29 static constexpr bool isIndexMergingStrategy(T&& t) │ │ │ │ │ - 30 { │ │ │ │ │ - 31 return models>(); │ │ │ │ │ - 32 } │ │ │ │ │ - 33 │ │ │ │ │ - 34 } // namespace Concept │ │ │ │ │ - 35 │ │ │ │ │ - 36 │ │ │ │ │ -37namespace BasisFactory { │ │ │ │ │ - 38 │ │ │ │ │ -44 struct IndexMergingStrategy {}; │ │ │ │ │ - 45 │ │ │ │ │ -46 void registerIndexMergingStrategy(IndexMergingStrategy); │ │ │ │ │ - 47 │ │ │ │ │ -78 struct FlatLexicographic │ │ │ │ │ - 79 : public IndexMergingStrategy │ │ │ │ │ - 80 {}; │ │ │ │ │ - 81 │ │ │ │ │ -112 struct FlatInterleaved │ │ │ │ │ - 113 : public IndexMergingStrategy │ │ │ │ │ - 114 {}; │ │ │ │ │ + 24template │ │ │ │ │ +25class Polynomial │ │ │ │ │ + 26{ │ │ │ │ │ + 27public: │ │ │ │ │ + 28 │ │ │ │ │ +30 Polynomial() = default; │ │ │ │ │ + 31 │ │ │ │ │ +33 Polynomial(const Polynomial& other) = default; │ │ │ │ │ + 34 │ │ │ │ │ +36 Polynomial(Polynomial&& other) = default; │ │ │ │ │ + 37 │ │ │ │ │ +39 Polynomial& operator=(const Polynomial& other) = default; │ │ │ │ │ + 40 │ │ │ │ │ +42 Polynomial& operator=(Polynomial&& other) = default; │ │ │ │ │ + 43 │ │ │ │ │ +50 Polynomial(std::initializer_list coefficients) : │ │ │ │ │ + 51 coefficients_(coefficients) │ │ │ │ │ + 52 {} │ │ │ │ │ + 53 │ │ │ │ │ +61 Polynomial(std::vector&& coefficients) : │ │ │ │ │ + 62 coefficients_(std::move(coefficients)) │ │ │ │ │ + 63 {} │ │ │ │ │ + 64 │ │ │ │ │ +72 Polynomial(const std::vector& coefficients) : │ │ │ │ │ + 73 coefficients_(coefficients) │ │ │ │ │ + 74 {} │ │ │ │ │ + 75 │ │ │ │ │ +77 K operator()(const K& x) const │ │ │ │ │ + 78 { │ │ │ │ │ + 79 auto y = K(0); │ │ │ │ │ + 80 for (size_t i=0; i dpCoefficients(p.coefficients().size()-1); │ │ │ │ │ + 97 for (size_t i=1; i& coefficients() const │ │ │ │ │ + 104 { │ │ │ │ │ + 105 return coefficients_; │ │ │ │ │ + 106 } │ │ │ │ │ + 107 │ │ │ │ │ + 108private: │ │ │ │ │ + 109 std::vector coefficients_; │ │ │ │ │ + 110}; │ │ │ │ │ + 111 │ │ │ │ │ + 112 │ │ │ │ │ + 113 │ │ │ │ │ + 114}} // namespace Dune::Functions │ │ │ │ │ 115 │ │ │ │ │ -146 struct BlockedLexicographic │ │ │ │ │ - 147 : public IndexMergingStrategy │ │ │ │ │ - 148 {}; │ │ │ │ │ - 149 │ │ │ │ │ -180 struct BlockedInterleaved : public IndexMergingStrategy {}; │ │ │ │ │ - 181 │ │ │ │ │ - 182 │ │ │ │ │ -188 constexpr FlatLexicographic flatLexicographic() │ │ │ │ │ - 189 { │ │ │ │ │ - 190 return {}; │ │ │ │ │ - 191 } │ │ │ │ │ - 192 │ │ │ │ │ -198 constexpr FlatInterleaved flatInterleaved() │ │ │ │ │ - 199 { │ │ │ │ │ - 200 return {}; │ │ │ │ │ - 201 } │ │ │ │ │ - 202 │ │ │ │ │ -208 constexpr BlockedLexicographic blockedLexicographic() │ │ │ │ │ - 209 { │ │ │ │ │ - 210 return {}; │ │ │ │ │ - 211 } │ │ │ │ │ - 212 │ │ │ │ │ -218 constexpr BlockedInterleaved blockedInterleaved() │ │ │ │ │ - 219 { │ │ │ │ │ - 220 return {}; │ │ │ │ │ - 221 } │ │ │ │ │ - 222 │ │ │ │ │ - 223} // end namespace BasisFactory │ │ │ │ │ - 224 │ │ │ │ │ - 225// Backward compatibility │ │ │ │ │ -226namespace BasisBuilder { │ │ │ │ │ - 227 │ │ │ │ │ - 228 using namespace BasisFactory; │ │ │ │ │ - 229 │ │ │ │ │ - 230} │ │ │ │ │ - 231 │ │ │ │ │ - 232} // end namespace Functions │ │ │ │ │ - 233} // end namespace Dune │ │ │ │ │ - 234 │ │ │ │ │ - 235 │ │ │ │ │ - 236#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BASISTAGS_HH │ │ │ │ │ -Dune::Functions::BasisFactory::flatLexicographic │ │ │ │ │ -constexpr FlatLexicographic flatLexicographic() │ │ │ │ │ -Creates a lexicographic merging of direct children without blocking. │ │ │ │ │ -Definition: basistags.hh:188 │ │ │ │ │ -Dune::Functions::BasisFactory::blockedInterleaved │ │ │ │ │ -constexpr BlockedInterleaved blockedInterleaved() │ │ │ │ │ -Creates an interleaved merging of direct children with blocking (i.e. creating │ │ │ │ │ -blocks at the leaves c... │ │ │ │ │ -Definition: basistags.hh:218 │ │ │ │ │ -Dune::Functions::BasisFactory::flatInterleaved │ │ │ │ │ -constexpr FlatInterleaved flatInterleaved() │ │ │ │ │ -Creates an interleaved merging of direct children without blocking. │ │ │ │ │ -Definition: basistags.hh:198 │ │ │ │ │ -Dune::Functions::BasisFactory::blockedLexicographic │ │ │ │ │ -constexpr BlockedLexicographic blockedLexicographic() │ │ │ │ │ -Creates a lexicographic merging of direct children with blocking (i.e. creating │ │ │ │ │ -one block per direct ... │ │ │ │ │ -Definition: basistags.hh:208 │ │ │ │ │ + 116 │ │ │ │ │ + 117 │ │ │ │ │ + 118#endif // DUNE_FUNCTIONS_ANALYTICFUNCTIONS_POLYNOMIAL_HH │ │ │ │ │ +Dune::Functions::Polynomial::derivative │ │ │ │ │ +friend Polynomial derivative(const Polynomial &p) │ │ │ │ │ +Obtain derivative of Polynomial function. │ │ │ │ │ +Definition: polynomial.hh:94 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::Concept::isIndexMergingStrategy │ │ │ │ │ -static constexpr bool isIndexMergingStrategy() │ │ │ │ │ -Definition: basistags.hh:23 │ │ │ │ │ -Dune::Functions::BasisFactory::registerIndexMergingStrategy │ │ │ │ │ -void registerIndexMergingStrategy(IndexMergingStrategy) │ │ │ │ │ -Dune::Functions::Concept::IndexMergingStrategy │ │ │ │ │ -Definition: basistags.hh:15 │ │ │ │ │ -Dune::Functions::Concept::IndexMergingStrategy::require │ │ │ │ │ -auto require(T &&t) -> decltype(registerIndexMergingStrategy(t)) │ │ │ │ │ -Dune::Functions::BasisFactory::IndexMergingStrategy │ │ │ │ │ -Base class for index merging strategies to simplify detection. │ │ │ │ │ -Definition: basistags.hh:44 │ │ │ │ │ -Dune::Functions::BasisFactory::FlatLexicographic │ │ │ │ │ -Lexicographic merging of direct children without blocking. │ │ │ │ │ -Definition: basistags.hh:80 │ │ │ │ │ -Dune::Functions::BasisFactory::FlatInterleaved │ │ │ │ │ -Interleaved merging of direct children without blocking. │ │ │ │ │ -Definition: basistags.hh:114 │ │ │ │ │ -Dune::Functions::BasisFactory::BlockedLexicographic │ │ │ │ │ -Lexicographic merging of direct children with blocking (i.e. creating one block │ │ │ │ │ -per direct child). │ │ │ │ │ -Definition: basistags.hh:148 │ │ │ │ │ -Dune::Functions::BasisFactory::BlockedInterleaved │ │ │ │ │ -Interleaved merging of direct children with blocking (i.e. creating blocks at │ │ │ │ │ -the leaves containing o... │ │ │ │ │ -Definition: basistags.hh:180 │ │ │ │ │ +Dune::Functions::Polynomial │ │ │ │ │ +A scalar polynomial implementation. │ │ │ │ │ +Definition: polynomial.hh:26 │ │ │ │ │ +Dune::Functions::Polynomial::Polynomial │ │ │ │ │ +Polynomial()=default │ │ │ │ │ +Default constructor. │ │ │ │ │ +Dune::Functions::Polynomial::coefficients │ │ │ │ │ +const std::vector< K > & coefficients() const │ │ │ │ │ +Obtain reference to coefficient vector. │ │ │ │ │ +Definition: polynomial.hh:103 │ │ │ │ │ +Dune::Functions::Polynomial::operator= │ │ │ │ │ +Polynomial & operator=(const Polynomial &other)=default │ │ │ │ │ +Copy-assignment operator. │ │ │ │ │ +Dune::Functions::Polynomial::operator= │ │ │ │ │ +Polynomial & operator=(Polynomial &&other)=default │ │ │ │ │ +Move-assignment operator. │ │ │ │ │ +Dune::Functions::Polynomial::Polynomial │ │ │ │ │ +Polynomial(std::initializer_list< K > coefficients) │ │ │ │ │ +Create from list of coefficients. │ │ │ │ │ +Definition: polynomial.hh:50 │ │ │ │ │ +Dune::Functions::Polynomial::operator() │ │ │ │ │ +K operator()(const K &x) const │ │ │ │ │ +Evaluate polynomial. │ │ │ │ │ +Definition: polynomial.hh:77 │ │ │ │ │ +Dune::Functions::Polynomial::Polynomial │ │ │ │ │ +Polynomial(const Polynomial &other)=default │ │ │ │ │ +Copy constructor. │ │ │ │ │ +Dune::Functions::Polynomial::Polynomial │ │ │ │ │ +Polynomial(Polynomial &&other)=default │ │ │ │ │ +Move constructor. │ │ │ │ │ +Dune::Functions::Polynomial::Polynomial │ │ │ │ │ +Polynomial(const std::vector< K > &coefficients) │ │ │ │ │ +Create from list of coefficients. │ │ │ │ │ +Definition: polynomial.hh:72 │ │ │ │ │ +Dune::Functions::Polynomial::Polynomial │ │ │ │ │ +Polynomial(std::vector< K > &&coefficients) │ │ │ │ │ +Create from list of coefficients. │ │ │ │ │ +Definition: polynomial.hh:61 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00164.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: subentitydofs.hh File Reference │ │ │ │ +dune-functions: trigonometricfunction.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,58 +58,48 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
subentitydofs.hh File Reference
│ │ │ │ +
trigonometricfunction.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <vector>
│ │ │ │ -#include <dune/geometry/referenceelements.hh>
│ │ │ │ -#include <dune/typetree/traversal.hh>
│ │ │ │ +
#include <cmath>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::SubEntityDOFs< GridView >
 Range of DOFs associated to sub-entity. More...
class  Dune::Functions::TrigonometricFunction< K, sinFactor, cosFactor >
 A linear combination of trigonomic functions. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<class T >
auto Dune::Functions::subEntityDOFs (const T &)
 Create SubEntityDOFs object. More...
 
template<class LocalView >
auto Dune::Functions::subEntityDOFs (const LocalView &localView, std::size_t subEntityIndex, std::size_t subEntityCodim)
 Create bound SubEntityDOFs object. More...
 
template<class LocalView , class Intersection >
auto Dune::Functions::subEntityDOFs (const LocalView &localView, const Intersection &intersection)
 Create bound SubEntityDOFs object. More...
 
template<class K , int sinFactor, int cosFactor>
TrigonometricFunction< K, -cosFactor, sinFactor > Dune::Functions::derivative (const TrigonometricFunction< K, sinFactor, cosFactor > &f)
 Obtain derivative of TrigonometricFunction function. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,41 +4,32 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * functionspacebases │ │ │ │ │ + * analyticfunctions │ │ │ │ │ Classes | Namespaces | Functions │ │ │ │ │ -subentitydofs.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +trigonometricfunction.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::SubEntityDOFs<_GridView_> │ │ │ │ │ -  Range of DOFs associated to sub-entity. More... │ │ │ │ │ +class  Dune::Functions::TrigonometricFunction<_K,_sinFactor,_cosFactor_> │ │ │ │ │ +  A linear combination of trigonomic functions. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::subEntityDOFs (const T &) │ │ │ │ │ -  Create SubEntityDOFs object. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::subEntityDOFs (const LocalView &localView, std::size_t │ │ │ │ │ - subEntityIndex, std::size_t subEntityCodim) │ │ │ │ │ -  Create bound SubEntityDOFs object. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::subEntityDOFs (const LocalView &localView, const │ │ │ │ │ - Intersection &intersection) │ │ │ │ │ -  Create bound SubEntityDOFs object. More... │ │ │ │ │ +template │ │ │ │ │ +TrigonometricFunction< K, -cosFactor, Dune::Functions::derivative (const │ │ │ │ │ + sinFactor > TrigonometricFunction< K, sinFactor, │ │ │ │ │ + cosFactor > &f) │ │ │ │ │ +  Obtain derivative of │ │ │ │ │ + TrigonometricFunction function. More... │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00164_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: subentitydofs.hh Source File │ │ │ │ +dune-functions: trigonometricfunction.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,152 +58,61 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
subentitydofs.hh
│ │ │ │ +
trigonometricfunction.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBENTITYDOFS_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBENTITYDOFS_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_ANALYTICFUNCTIONS_TRIGONOMETRICFUNCTION_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_ANALYTICFUNCTIONS_TRIGONOMETRICFUNCTION_HH
│ │ │ │
5
│ │ │ │ -
6#include <vector>
│ │ │ │ +
6#include <cmath>
│ │ │ │
7
│ │ │ │ -
8#include <dune/geometry/referenceelements.hh>
│ │ │ │ -
9#include <dune/typetree/traversal.hh>
│ │ │ │ +
8namespace Dune {
│ │ │ │ +
9namespace Functions {
│ │ │ │
10
│ │ │ │
11
│ │ │ │
12
│ │ │ │ -
13namespace Dune {
│ │ │ │ -
14namespace Functions {
│ │ │ │ -
15
│ │ │ │ -
16
│ │ │ │ -
17
│ │ │ │ -
40template<class GridView>
│ │ │ │ - │ │ │ │ -
42{
│ │ │ │ -
43 static const int dim = GridView::dimension;
│ │ │ │ +
25template<class K, int sinFactor, int cosFactor>
│ │ │ │ + │ │ │ │ +
27{
│ │ │ │ +
28public:
│ │ │ │ +
30 K operator () (const K& x) const
│ │ │ │ +
31 {
│ │ │ │ +
32 return sinFactor * std::sin(x) + cosFactor * std::cos(x);
│ │ │ │ +
33 }
│ │ │ │ +
34};
│ │ │ │ +
35
│ │ │ │ +
36
│ │ │ │ +
38template<class K, int sinFactor, int cosFactor>
│ │ │ │ + │ │ │ │ +
40{
│ │ │ │ +
41 return TrigonometricFunction<K, -cosFactor, sinFactor>();
│ │ │ │ +
42}
│ │ │ │ +
43
│ │ │ │
44
│ │ │ │ -
45public:
│ │ │ │ -
46
│ │ │ │ -
63 template<class LocalView>
│ │ │ │ -
64 SubEntityDOFs& bind(const LocalView& localView, std::size_t subEntityIndex, std::size_t subEntityCodim)
│ │ │ │ -
65 {
│ │ │ │ -
66 // fill vector with local indices of all DOFs contained in subentity
│ │ │ │ -
67 containedDOFs_.clear();
│ │ │ │ -
68 dofIsContained_.assign(localView.size(), false);
│ │ │ │ -
69
│ │ │ │ -
70 auto re = Dune::referenceElement<double,dim>(localView.element().type());
│ │ │ │ -
71
│ │ │ │ -
72 Dune::TypeTree::forEachLeafNode(localView.tree(), [&](auto&& node, auto&& /*treePath*/) {
│ │ │ │ -
73 const auto& localCoefficients = node.finiteElement().localCoefficients();
│ │ │ │ -
74 std::size_t localSize = localCoefficients.size();
│ │ │ │ -
75 for(std::size_t i=0; i<localSize; ++i)
│ │ │ │ -
76 {
│ │ │ │ -
77 auto localKey = localCoefficients.localKey(i);
│ │ │ │ -
78 if (re.subEntities(subEntityIndex, subEntityCodim, localKey.codim()).contains(localKey.subEntity()))
│ │ │ │ -
79 {
│ │ │ │ -
80 containedDOFs_.push_back(node.localIndex(i));
│ │ │ │ -
81 dofIsContained_[node.localIndex(i)] = true;
│ │ │ │ -
82 }
│ │ │ │ -
83 }
│ │ │ │ -
84 });
│ │ │ │ -
85 return *this;
│ │ │ │ -
86 }
│ │ │ │ -
87
│ │ │ │ -
103 template<class LocalView, class Intersection>
│ │ │ │ -
104 SubEntityDOFs& bind(const LocalView& localView, const Intersection& intersection)
│ │ │ │ -
105 {
│ │ │ │ -
106 return bind(localView, intersection.indexInInside(), 1);
│ │ │ │ -
107 }
│ │ │ │ -
108
│ │ │ │ -
110 auto begin() const
│ │ │ │ -
111 {
│ │ │ │ -
112 return containedDOFs_.cbegin();
│ │ │ │ -
113 }
│ │ │ │ -
114
│ │ │ │ -
116 auto end() const
│ │ │ │ -
117 {
│ │ │ │ -
118 return containedDOFs_.cend();
│ │ │ │ -
119 }
│ │ │ │ -
120
│ │ │ │ -
122 auto size() const
│ │ │ │ -
123 {
│ │ │ │ -
124 return containedDOFs_.size();
│ │ │ │ -
125 }
│ │ │ │ -
126
│ │ │ │ -
128 decltype(auto) operator[](std::size_t i) const
│ │ │ │ -
129 {
│ │ │ │ -
130 return containedDOFs_[i];
│ │ │ │ -
131 }
│ │ │ │ -
132
│ │ │ │ -
134 bool contains(std::size_t localIndex) const
│ │ │ │ -
135 {
│ │ │ │ -
136 return dofIsContained_[localIndex];
│ │ │ │ -
137 }
│ │ │ │ -
138
│ │ │ │ -
139private:
│ │ │ │ -
140
│ │ │ │ -
141 std::vector<std::size_t> containedDOFs_;
│ │ │ │ -
142 std::vector<bool> dofIsContained_;
│ │ │ │ -
143};
│ │ │ │ -
144
│ │ │ │ -
145
│ │ │ │ -
146
│ │ │ │ -
159template<class T>
│ │ │ │ -
160auto subEntityDOFs(const T&)
│ │ │ │ -
161{
│ │ │ │ - │ │ │ │ -
163}
│ │ │ │ -
164
│ │ │ │ -
165
│ │ │ │ -
166
│ │ │ │ -
186template<class LocalView>
│ │ │ │ -
187auto subEntityDOFs(const LocalView& localView, std::size_t subEntityIndex, std::size_t subEntityCodim)
│ │ │ │ -
188{
│ │ │ │ -
189 using GridView = typename LocalView::GridView;
│ │ │ │ - │ │ │ │ -
191 subEntityDOFs.bind(localView, subEntityIndex, subEntityCodim);
│ │ │ │ -
192 return subEntityDOFs;
│ │ │ │ -
193}
│ │ │ │ -
194
│ │ │ │ -
195
│ │ │ │ -
196
│ │ │ │ -
215template<class LocalView, class Intersection>
│ │ │ │ -
216auto subEntityDOFs(const LocalView& localView, const Intersection& intersection)
│ │ │ │ -
217{
│ │ │ │ -
218 using GridView = typename LocalView::GridView;
│ │ │ │ - │ │ │ │ -
220 subEntityDOFs.bind(localView, intersection);
│ │ │ │ -
221 return subEntityDOFs;
│ │ │ │ -
222}
│ │ │ │ -
223
│ │ │ │ -
224
│ │ │ │ -
225
│ │ │ │ -
226} // namespace Functions
│ │ │ │ -
227} // namespace Dune
│ │ │ │ -
228
│ │ │ │ -
229#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBENTITYDOFS_HH
│ │ │ │ -
auto subEntityDOFs(const LocalView &localView, const Intersection &intersection)
Create bound SubEntityDOFs object.
Definition: subentitydofs.hh:216
│ │ │ │ +
45
│ │ │ │ +
46}} // namespace Dune::Functions
│ │ │ │ +
47
│ │ │ │ +
48
│ │ │ │ +
49
│ │ │ │ +
50#endif // DUNE_FUNCTIONS_ANALYTICFUNCTIONS_TRIGONOMETRICFUNCTION_HH
│ │ │ │ +
TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const TrigonometricFunction< K, sinFactor, cosFactor > &f)
Obtain derivative of TrigonometricFunction function.
Definition: trigonometricfunction.hh:39
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
Range of DOFs associated to sub-entity.
Definition: subentitydofs.hh:42
│ │ │ │ -
auto begin() const
Create begin iterator for access to range of contained local indices.
Definition: subentitydofs.hh:110
│ │ │ │ -
auto size() const
Return number of contained DOFs.
Definition: subentitydofs.hh:122
│ │ │ │ -
SubEntityDOFs & bind(const LocalView &localView, const Intersection &intersection)
Bind SubEntityDOFs object to LocalView and sub-entity.
Definition: subentitydofs.hh:104
│ │ │ │ -
bool contains(std::size_t localIndex) const
Check if given local index is contained in this range of DOFs.
Definition: subentitydofs.hh:134
│ │ │ │ -
auto end() const
Create end iterator for access to range of contained local indices.
Definition: subentitydofs.hh:116
│ │ │ │ -
SubEntityDOFs & bind(const LocalView &localView, std::size_t subEntityIndex, std::size_t subEntityCodim)
Bind SubEntityDOFs object to LocalView and sub-entity.
Definition: subentitydofs.hh:64
│ │ │ │ +
A linear combination of trigonomic functions.
Definition: trigonometricfunction.hh:27
│ │ │ │ +
K operator()(const K &x) const
Evaluate function.
Definition: trigonometricfunction.hh:30
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,177 +4,64 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * functionspacebases │ │ │ │ │ -subentitydofs.hh │ │ │ │ │ + * analyticfunctions │ │ │ │ │ +trigonometricfunction.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBENTITYDOFS_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBENTITYDOFS_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_ANALYTICFUNCTIONS_TRIGONOMETRICFUNCTION_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_ANALYTICFUNCTIONS_TRIGONOMETRICFUNCTION_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ + 6#include │ │ │ │ │ 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9#include │ │ │ │ │ + 8namespace Dune { │ │ │ │ │ + 9namespace Functions { │ │ │ │ │ 10 │ │ │ │ │ 11 │ │ │ │ │ 12 │ │ │ │ │ - 13namespace Dune { │ │ │ │ │ - 14namespace Functions { │ │ │ │ │ - 15 │ │ │ │ │ - 16 │ │ │ │ │ - 17 │ │ │ │ │ - 40template │ │ │ │ │ -41class SubEntityDOFs │ │ │ │ │ - 42{ │ │ │ │ │ - 43 static const int dim = GridView::dimension; │ │ │ │ │ + 25template │ │ │ │ │ +26class TrigonometricFunction │ │ │ │ │ + 27{ │ │ │ │ │ + 28public: │ │ │ │ │ +30 K operator_()(const K& x) const │ │ │ │ │ + 31 { │ │ │ │ │ + 32 return sinFactor * std::sin(x) + cosFactor * std::cos(x); │ │ │ │ │ + 33 } │ │ │ │ │ + 34}; │ │ │ │ │ + 35 │ │ │ │ │ + 36 │ │ │ │ │ + 38template │ │ │ │ │ +39TrigonometricFunction derivative(const │ │ │ │ │ +TrigonometricFunction& f) │ │ │ │ │ + 40{ │ │ │ │ │ + 41 return TrigonometricFunction(); │ │ │ │ │ + 42} │ │ │ │ │ + 43 │ │ │ │ │ 44 │ │ │ │ │ - 45public: │ │ │ │ │ - 46 │ │ │ │ │ - 63 template │ │ │ │ │ -64 SubEntityDOFs& bind(const LocalView& localView, std::size_t subEntityIndex, │ │ │ │ │ -std::size_t subEntityCodim) │ │ │ │ │ - 65 { │ │ │ │ │ - 66 // fill vector with local indices of all DOFs contained in subentity │ │ │ │ │ - 67 containedDOFs_.clear(); │ │ │ │ │ - 68 dofIsContained_.assign(localView.size(), false); │ │ │ │ │ - 69 │ │ │ │ │ - 70 auto re = Dune::referenceElement(localView.element().type()); │ │ │ │ │ - 71 │ │ │ │ │ - 72 Dune::TypeTree::forEachLeafNode(localView.tree(), [&](auto&& node, auto&& / │ │ │ │ │ -*treePath*/) { │ │ │ │ │ - 73 const auto& localCoefficients = node.finiteElement().localCoefficients(); │ │ │ │ │ - 74 std::size_t localSize = localCoefficients.size(); │ │ │ │ │ - 75 for(std::size_t i=0; i │ │ │ │ │ -104 SubEntityDOFs& bind(const LocalView& localView, const Intersection& │ │ │ │ │ -intersection) │ │ │ │ │ - 105 { │ │ │ │ │ - 106 return bind(localView, intersection.indexInInside(), 1); │ │ │ │ │ - 107 } │ │ │ │ │ - 108 │ │ │ │ │ -110 auto begin() const │ │ │ │ │ - 111 { │ │ │ │ │ - 112 return containedDOFs_.cbegin(); │ │ │ │ │ - 113 } │ │ │ │ │ - 114 │ │ │ │ │ -116 auto end() const │ │ │ │ │ - 117 { │ │ │ │ │ - 118 return containedDOFs_.cend(); │ │ │ │ │ - 119 } │ │ │ │ │ - 120 │ │ │ │ │ -122 auto size() const │ │ │ │ │ - 123 { │ │ │ │ │ - 124 return containedDOFs_.size(); │ │ │ │ │ - 125 } │ │ │ │ │ - 126 │ │ │ │ │ -128 decltype(auto) operator[](std::size_t i) const │ │ │ │ │ - 129 { │ │ │ │ │ - 130 return containedDOFs_[i]; │ │ │ │ │ - 131 } │ │ │ │ │ - 132 │ │ │ │ │ -134 bool contains(std::size_t localIndex) const │ │ │ │ │ - 135 { │ │ │ │ │ - 136 return dofIsContained_[localIndex]; │ │ │ │ │ - 137 } │ │ │ │ │ - 138 │ │ │ │ │ - 139private: │ │ │ │ │ - 140 │ │ │ │ │ - 141 std::vector containedDOFs_; │ │ │ │ │ - 142 std::vector dofIsContained_; │ │ │ │ │ - 143}; │ │ │ │ │ - 144 │ │ │ │ │ - 145 │ │ │ │ │ - 146 │ │ │ │ │ - 159template │ │ │ │ │ -160auto subEntityDOFs(const T&) │ │ │ │ │ - 161{ │ │ │ │ │ - 162 return SubEntityDOFs{}; │ │ │ │ │ - 163} │ │ │ │ │ - 164 │ │ │ │ │ - 165 │ │ │ │ │ - 166 │ │ │ │ │ - 186template │ │ │ │ │ -187auto subEntityDOFs(const LocalView& localView, std::size_t subEntityIndex, │ │ │ │ │ -std::size_t subEntityCodim) │ │ │ │ │ - 188{ │ │ │ │ │ - 189 using GridView = typename LocalView::GridView; │ │ │ │ │ - 190 SubEntityDOFs subEntityDOFs; │ │ │ │ │ - 191 subEntityDOFs.bind(localView, subEntityIndex, subEntityCodim); │ │ │ │ │ - 192 return subEntityDOFs; │ │ │ │ │ - 193} │ │ │ │ │ - 194 │ │ │ │ │ - 195 │ │ │ │ │ - 196 │ │ │ │ │ - 215template │ │ │ │ │ -216auto subEntityDOFs(const LocalView& localView, const Intersection& │ │ │ │ │ -intersection) │ │ │ │ │ - 217{ │ │ │ │ │ - 218 using GridView = typename LocalView::GridView; │ │ │ │ │ - 219 SubEntityDOFs subEntityDOFs; │ │ │ │ │ - 220 subEntityDOFs.bind(localView, intersection); │ │ │ │ │ - 221 return subEntityDOFs; │ │ │ │ │ - 222} │ │ │ │ │ - 223 │ │ │ │ │ - 224 │ │ │ │ │ - 225 │ │ │ │ │ - 226} // namespace Functions │ │ │ │ │ - 227} // namespace Dune │ │ │ │ │ - 228 │ │ │ │ │ - 229#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBENTITYDOFS_HH │ │ │ │ │ -Dune::Functions::subEntityDOFs │ │ │ │ │ -auto subEntityDOFs(const LocalView &localView, const Intersection │ │ │ │ │ -&intersection) │ │ │ │ │ -Create bound SubEntityDOFs object. │ │ │ │ │ -Definition: subentitydofs.hh:216 │ │ │ │ │ + 45 │ │ │ │ │ + 46}} // namespace Dune::Functions │ │ │ │ │ + 47 │ │ │ │ │ + 48 │ │ │ │ │ + 49 │ │ │ │ │ + 50#endif // DUNE_FUNCTIONS_ANALYTICFUNCTIONS_TRIGONOMETRICFUNCTION_HH │ │ │ │ │ +Dune::Functions::derivative │ │ │ │ │ +TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const │ │ │ │ │ +TrigonometricFunction< K, sinFactor, cosFactor > &f) │ │ │ │ │ +Obtain derivative of TrigonometricFunction function. │ │ │ │ │ +Definition: trigonometricfunction.hh:39 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::SubEntityDOFs │ │ │ │ │ -Range of DOFs associated to sub-entity. │ │ │ │ │ -Definition: subentitydofs.hh:42 │ │ │ │ │ -Dune::Functions::SubEntityDOFs::begin │ │ │ │ │ -auto begin() const │ │ │ │ │ -Create begin iterator for access to range of contained local indices. │ │ │ │ │ -Definition: subentitydofs.hh:110 │ │ │ │ │ -Dune::Functions::SubEntityDOFs::size │ │ │ │ │ -auto size() const │ │ │ │ │ -Return number of contained DOFs. │ │ │ │ │ -Definition: subentitydofs.hh:122 │ │ │ │ │ -Dune::Functions::SubEntityDOFs::bind │ │ │ │ │ -SubEntityDOFs & bind(const LocalView &localView, const Intersection │ │ │ │ │ -&intersection) │ │ │ │ │ -Bind SubEntityDOFs object to LocalView and sub-entity. │ │ │ │ │ -Definition: subentitydofs.hh:104 │ │ │ │ │ -Dune::Functions::SubEntityDOFs::contains │ │ │ │ │ -bool contains(std::size_t localIndex) const │ │ │ │ │ -Check if given local index is contained in this range of DOFs. │ │ │ │ │ -Definition: subentitydofs.hh:134 │ │ │ │ │ -Dune::Functions::SubEntityDOFs::end │ │ │ │ │ -auto end() const │ │ │ │ │ -Create end iterator for access to range of contained local indices. │ │ │ │ │ -Definition: subentitydofs.hh:116 │ │ │ │ │ -Dune::Functions::SubEntityDOFs::bind │ │ │ │ │ -SubEntityDOFs & bind(const LocalView &localView, std::size_t subEntityIndex, │ │ │ │ │ -std::size_t subEntityCodim) │ │ │ │ │ -Bind SubEntityDOFs object to LocalView and sub-entity. │ │ │ │ │ -Definition: subentitydofs.hh:64 │ │ │ │ │ +Dune::Functions::TrigonometricFunction │ │ │ │ │ +A linear combination of trigonomic functions. │ │ │ │ │ +Definition: trigonometricfunction.hh:27 │ │ │ │ │ +Dune::Functions::TrigonometricFunction::operator() │ │ │ │ │ +K operator()(const K &x) const │ │ │ │ │ +Evaluate function. │ │ │ │ │ +Definition: trigonometricfunction.hh:30 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00167.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: bsplinebasis.hh File Reference │ │ │ │ +dune-functions: composedgridfunction.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,86 +58,55 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Typedefs | │ │ │ │ Functions
│ │ │ │ -
bsplinebasis.hh File Reference
│ │ │ │ +
composedgridfunction.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

The B-spline global function space basis. │ │ │ │ -More...

│ │ │ │ -
#include <array>
│ │ │ │ -#include <numeric>
│ │ │ │ -#include <dune/common/dynmatrix.hh>
│ │ │ │ -#include <dune/localfunctions/common/localbasis.hh>
│ │ │ │ -#include <dune/common/diagonalmatrix.hh>
│ │ │ │ -#include <dune/localfunctions/common/localkey.hh>
│ │ │ │ -#include <dune/localfunctions/common/localfiniteelementtraits.hh>
│ │ │ │ -#include <dune/geometry/type.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │ +
#include <type_traits>
│ │ │ │ +#include <tuple>
│ │ │ │ +#include <dune/common/referencehelper.hh>
│ │ │ │ +#include <dune/common/typeutilities.hh>
│ │ │ │ +#include <dune/functions/common/defaultderivativetraits.hh>
│ │ │ │ +#include <dune/functions/common/differentiablefunction.hh>
│ │ │ │ +#include <dune/functions/gridfunctions/gridfunction.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::BSplineLocalBasis< GV, R >
 LocalBasis class in the sense of dune-localfunctions, presenting the restriction of a B-spline patch to a knot span. More...
 
class  Dune::Functions::BSplineLocalCoefficients< dim >
 Attaches a shape function to an entity. More...
 
class  Dune::Functions::BSplineLocalInterpolation< dim, LB >
 Local interpolation in the sense of dune-localfunctions, for the B-spline basis on tensor-product grids. More...
 
class  Dune::Functions::BSplineLocalFiniteElement< GV, R >
 LocalFiniteElement in the sense of dune-localfunctions, for the B-spline basis on tensor-product grids. More...
 
class  Dune::Functions::BSplinePreBasis< GV >
 Pre-basis for B-spline basis. More...
 
class  Dune::Functions::BSplineNode< GV >
class  Dune::Functions::ComposedGridFunction< OF, IF >
 Composition of grid functions with another function. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
namespace  Dune::Functions::BasisFactory
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Typedefs

template<typename GV >
using Dune::Functions::BSplineBasis = DefaultGlobalBasis< BSplinePreBasis< GV > >
 A global B-spline basis. More...
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

auto Dune::Functions::BasisFactory::bSpline (const std::vector< double > &knotVector, unsigned int order, bool makeOpen=true)
 Create a pre-basis factory that can create a B-spline pre-basis. More...
 
template<class OF , class... IF>
auto Dune::Functions::makeComposedGridFunction (OF &&outerFunction, IF &&... innerFunction)
 Create a ComposedGridFunction that composes grid-functions with another function. More...
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

The B-spline global function space basis.

│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,66 +4,37 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * functionspacebases │ │ │ │ │ -Classes | Namespaces | Typedefs | Functions │ │ │ │ │ -bsplinebasis.hh File Reference │ │ │ │ │ -The B-spline global function space basis. More... │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * gridfunctions │ │ │ │ │ +Classes | Namespaces | Functions │ │ │ │ │ +composedgridfunction.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::BSplineLocalBasis<_GV,_R_> │ │ │ │ │ -  LocalBasis class in the sense of dune-localfunctions, presenting the │ │ │ │ │ - restriction of a B-spline patch to a knot span. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::Functions::BSplineLocalCoefficients<_dim_> │ │ │ │ │ -  Attaches a shape function to an entity. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::Functions::BSplineLocalInterpolation<_dim,_LB_> │ │ │ │ │ -  Local interpolation in the sense of dune-localfunctions, for the B- │ │ │ │ │ - spline basis on tensor-product grids. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::Functions::BSplineLocalFiniteElement<_GV,_R_> │ │ │ │ │ -  LocalFiniteElement in the sense of dune-localfunctions, for the B- │ │ │ │ │ - spline basis on tensor-product grids. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::Functions::BSplinePreBasis<_GV_> │ │ │ │ │ -  Pre-basis for B-spline basis. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::Functions::BSplineNode<_GV_> │ │ │ │ │ +class  Dune::Functions::ComposedGridFunction<_OF,_IF_> │ │ │ │ │ +  Composition of grid functions with another function. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ -namespace  Dune::Functions::BasisFactory │ │ │ │ │ -  │ │ │ │ │ - Typedefs │ │ │ │ │ -template │ │ │ │ │ -using Dune::Functions::BSplineBasis = DefaultGlobalBasis< BSplinePreBasis< GV │ │ │ │ │ - > > │ │ │ │ │ -  A global B-spline basis. More... │ │ │ │ │ -  │ │ │ │ │ Functions │ │ │ │ │ -auto Dune::Functions::BasisFactory::bSpline (const std::vector< double > │ │ │ │ │ - &knotVector, unsigned int order, bool makeOpen=true) │ │ │ │ │ -  Create a pre-basis factory that can create a B-spline pre-basis. More... │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::makeComposedGridFunction (OF &&outerFunction, IF &&... │ │ │ │ │ + innerFunction) │ │ │ │ │ +  Create a ComposedGridFunction that composes grid-functions with another │ │ │ │ │ + function. More... │ │ │ │ │   │ │ │ │ │ -***** Detailed Description ***** │ │ │ │ │ -The B-spline global function space basis. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00167_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: bsplinebasis.hh Source File │ │ │ │ +dune-functions: composedgridfunction.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,1213 +58,199 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
bsplinebasis.hh
│ │ │ │ +
composedgridfunction.hh
│ │ │ │
│ │ │ │
│ │ │ │ -Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │ +Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │ -
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BSPLINEBASIS_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BSPLINEBASIS_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH
│ │ │ │
5
│ │ │ │ -
10#include <array>
│ │ │ │ -
11#include <numeric>
│ │ │ │ -
12
│ │ │ │ -
14#include <dune/common/dynmatrix.hh>
│ │ │ │ +
6#include <type_traits>
│ │ │ │ +
7#include <tuple>
│ │ │ │ +
8
│ │ │ │ +
9#include <dune/common/referencehelper.hh>
│ │ │ │ +
10#include <dune/common/typeutilities.hh>
│ │ │ │ +
11
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
15
│ │ │ │ -
16#include <dune/localfunctions/common/localbasis.hh>
│ │ │ │ -
17#include <dune/common/diagonalmatrix.hh>
│ │ │ │ -
18#include <dune/localfunctions/common/localkey.hh>
│ │ │ │ -
19#include <dune/localfunctions/common/localfiniteelementtraits.hh>
│ │ │ │ -
20#include <dune/geometry/type.hh>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
23
│ │ │ │ -
24namespace Dune
│ │ │ │ -
25{
│ │ │ │ -
26namespace Functions {
│ │ │ │ -
27
│ │ │ │ -
28// A maze of dependencies between the different parts of this. We need a few forward declarations
│ │ │ │ -
29template<typename GV, typename R>
│ │ │ │ - │ │ │ │ -
31
│ │ │ │ -
32template<typename GV>
│ │ │ │ -
33class BSplinePreBasis;
│ │ │ │ -
34
│ │ │ │ -
35
│ │ │ │ -
44template<class GV, class R>
│ │ │ │ - │ │ │ │ -
46{
│ │ │ │ -
47 friend class BSplineLocalFiniteElement<GV,R>;
│ │ │ │ +
16
│ │ │ │ +
17namespace Dune {
│ │ │ │ +
18namespace Functions {
│ │ │ │ +
19
│ │ │ │ +
20
│ │ │ │ +
21
│ │ │ │ +
40template<class OF, class... IF>
│ │ │ │ + │ │ │ │ +
42{
│ │ │ │ +
43 using InnerFunctions = std::tuple<IF...>;
│ │ │ │ +
44 using InnerLocalFunctions = std::tuple<decltype(localFunction(resolveRef(std::declval<const IF&>())))...>;
│ │ │ │ +
45
│ │ │ │ +
46 template<std::size_t i>
│ │ │ │ +
47 using InnerFunction = std::decay_t<ResolveRef_t<std::tuple_element_t<i, InnerFunctions>>>;
│ │ │ │
48
│ │ │ │ -
49 typedef typename GV::ctype D;
│ │ │ │ -
50 enum {dim = GV::dimension};
│ │ │ │ +
49 using OuterFunction = OF;
│ │ │ │ +
50
│ │ │ │
51public:
│ │ │ │
52
│ │ │ │ -
54 typedef LocalBasisTraits<D,dim,FieldVector<D,dim>,R,1,FieldVector<R,1>,
│ │ │ │ -
55 FieldMatrix<R,1,dim> > Traits;
│ │ │ │ -
56
│ │ │ │ - │ │ │ │ - │ │ │ │ -
63 : preBasis_(preBasis),
│ │ │ │ -
64 lFE_(lFE)
│ │ │ │ -
65 {}
│ │ │ │ -
66
│ │ │ │ -
70 void evaluateFunction (const FieldVector<D,dim>& in,
│ │ │ │ -
71 std::vector<FieldVector<R,1> >& out) const
│ │ │ │ -
72 {
│ │ │ │ -
73 FieldVector<D,dim> globalIn = offset_;
│ │ │ │ -
74 scaling_.umv(in,globalIn);
│ │ │ │ -
75
│ │ │ │ -
76 preBasis_.evaluateFunction(globalIn, out, lFE_.currentKnotSpan_);
│ │ │ │ -
77 }
│ │ │ │ +
53 using EntitySet = typename InnerFunction<0>::EntitySet;
│ │ │ │ +
54 using Element = typename EntitySet::Element;
│ │ │ │ +
55
│ │ │ │ +
56 using Domain = typename EntitySet::GlobalCoordinate;
│ │ │ │ +
57 using LocalDomain = typename EntitySet::LocalCoordinate;
│ │ │ │ +
58
│ │ │ │ +
59 using Range = decltype(std::declval<OF>()(std::declval<IF>()(std::declval<Domain>())...));
│ │ │ │ +
60
│ │ │ │ +
61private:
│ │ │ │ +
62
│ │ │ │ +
63 using Traits = Imp::GridFunctionTraits<Range(Domain), EntitySet, DefaultDerivativeTraits, 16>;
│ │ │ │ +
64
│ │ │ │ +
65 class LocalFunction
│ │ │ │ +
66 {
│ │ │ │ +
67 public:
│ │ │ │ +
74 LocalFunction(const ComposedGridFunction& globalFunction) :
│ │ │ │ +
75 globalFunction_(globalFunction),
│ │ │ │ +
76 innerLocalFunctions_(globalFunction.innerLocalFunctions())
│ │ │ │ +
77 {}
│ │ │ │
78
│ │ │ │ -
82 void evaluateJacobian (const FieldVector<D,dim>& in,
│ │ │ │ -
83 std::vector<FieldMatrix<D,1,dim> >& out) const
│ │ │ │ -
84 {
│ │ │ │ -
85 FieldVector<D,dim> globalIn = offset_;
│ │ │ │ -
86 scaling_.umv(in,globalIn);
│ │ │ │ -
87
│ │ │ │ -
88 preBasis_.evaluateJacobian(globalIn, out, lFE_.currentKnotSpan_);
│ │ │ │ -
89
│ │ │ │ -
90 for (size_t i=0; i<out.size(); i++)
│ │ │ │ -
91 for (int j=0; j<dim; j++)
│ │ │ │ -
92 out[i][0][j] *= scaling_[j][j];
│ │ │ │ -
93 }
│ │ │ │ +
88 void bind(const Element& element)
│ │ │ │ +
89 {
│ │ │ │ +
90 std::apply([&](auto&... innerFunction) {
│ │ │ │ +
91 (innerFunction.bind(element),...);
│ │ │ │ +
92 }, innerLocalFunctions_);
│ │ │ │ +
93 }
│ │ │ │
94
│ │ │ │ -
96 template<size_t k>
│ │ │ │ -
97 inline void evaluate (const typename std::array<int,k>& directions,
│ │ │ │ -
98 const typename Traits::DomainType& in,
│ │ │ │ -
99 std::vector<typename Traits::RangeType>& out) const
│ │ │ │ -
100 {
│ │ │ │ -
101 switch(k)
│ │ │ │ -
102 {
│ │ │ │ -
103 case 0:
│ │ │ │ -
104 evaluateFunction(in, out);
│ │ │ │ -
105 break;
│ │ │ │ -
106 case 1:
│ │ │ │ -
107 {
│ │ │ │ -
108 FieldVector<D,dim> globalIn = offset_;
│ │ │ │ -
109 scaling_.umv(in,globalIn);
│ │ │ │ -
110
│ │ │ │ -
111 preBasis_.evaluate(directions, globalIn, out, lFE_.currentKnotSpan_);
│ │ │ │ -
112
│ │ │ │ -
113 for (size_t i=0; i<out.size(); i++)
│ │ │ │ -
114 out[i][0] *= scaling_[directions[0]][directions[0]];
│ │ │ │ -
115 break;
│ │ │ │ -
116 }
│ │ │ │ -
117 case 2:
│ │ │ │ -
118 {
│ │ │ │ -
119 FieldVector<D,dim> globalIn = offset_;
│ │ │ │ -
120 scaling_.umv(in,globalIn);
│ │ │ │ -
121
│ │ │ │ -
122 preBasis_.evaluate(directions, globalIn, out, lFE_.currentKnotSpan_);
│ │ │ │ -
123
│ │ │ │ -
124 for (size_t i=0; i<out.size(); i++)
│ │ │ │ -
125 out[i][0] *= scaling_[directions[0]][directions[0]]*scaling_[directions[1]][directions[1]];
│ │ │ │ -
126 break;
│ │ │ │ -
127 }
│ │ │ │ -
128 default:
│ │ │ │ -
129 DUNE_THROW(NotImplemented, "B-Spline derivatives of order " << k << " not implemented yet!");
│ │ │ │ -
130 }
│ │ │ │ -
131 }
│ │ │ │ -
132
│ │ │ │ -
140 unsigned int order () const
│ │ │ │ -
141 {
│ │ │ │ -
142 return *std::max_element(preBasis_.order_.begin(), preBasis_.order_.end());
│ │ │ │ -
143 }
│ │ │ │ -
144
│ │ │ │ -
147 std::size_t size() const
│ │ │ │ -
148 {
│ │ │ │ -
149 return lFE_.size();
│ │ │ │ -
150 }
│ │ │ │ -
151
│ │ │ │ -
152private:
│ │ │ │ -
153 const BSplinePreBasis<GV>& preBasis_;
│ │ │ │ +
96 void unbind()
│ │ │ │ +
97 {
│ │ │ │ +
98 std::apply([&](auto&... innerFunction) {
│ │ │ │ +
99 (innerFunction.unbind(),...);
│ │ │ │ +
100 }, innerLocalFunctions_);
│ │ │ │ +
101 }
│ │ │ │ +
102
│ │ │ │ +
105 bool bound() const
│ │ │ │ +
106 {
│ │ │ │ +
107 return std::apply([](const auto&... innerFunction) {
│ │ │ │ +
108 return (innerFunction.bound() && ...);
│ │ │ │ +
109 }, innerLocalFunctions_);
│ │ │ │ +
110 }
│ │ │ │ +
111
│ │ │ │ +
121 Range operator()(const LocalDomain& x) const
│ │ │ │ +
122 {
│ │ │ │ +
123 return std::apply([&](const auto&... innerFunction) {
│ │ │ │ +
124 return globalFunction_.outerFunction_(innerFunction(x)...);
│ │ │ │ +
125 }, innerLocalFunctions_);
│ │ │ │ +
126 }
│ │ │ │ +
127
│ │ │ │ +
137 const Element& localContext() const
│ │ │ │ +
138 {
│ │ │ │ +
139 return std::get<0>(innerLocalFunctions_).localContext();
│ │ │ │ +
140 }
│ │ │ │ +
141
│ │ │ │ +
143 friend typename Traits::LocalFunctionTraits::DerivativeInterface derivative(const LocalFunction& t)
│ │ │ │ +
144 {
│ │ │ │ +
145 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │ +
146 }
│ │ │ │ +
147
│ │ │ │ +
148 private:
│ │ │ │ +
149 const ComposedGridFunction& globalFunction_;
│ │ │ │ +
150 InnerLocalFunctions innerLocalFunctions_;
│ │ │ │ +
151 };
│ │ │ │ +
152
│ │ │ │ +
153public:
│ │ │ │
154
│ │ │ │ - │ │ │ │ -
156
│ │ │ │ -
157 // Coordinates in a single knot span differ from coordinates on the B-spline patch
│ │ │ │ -
158 // by an affine transformation. This transformation is stored in offset_ and scaling_.
│ │ │ │ -
159 FieldVector<D,dim> offset_;
│ │ │ │ -
160 DiagonalMatrix<D,dim> scaling_;
│ │ │ │ -
161};
│ │ │ │ -
162
│ │ │ │ -
176template<int dim>
│ │ │ │ - │ │ │ │ -
178{
│ │ │ │ -
179 // Return i as a d-digit number in the (k+1)-nary system
│ │ │ │ -
180 std::array<unsigned int,dim> multiindex (unsigned int i) const
│ │ │ │ -
181 {
│ │ │ │ -
182 std::array<unsigned int,dim> alpha;
│ │ │ │ -
183 for (int j=0; j<dim; j++)
│ │ │ │ -
184 {
│ │ │ │ -
185 alpha[j] = i % sizes_[j];
│ │ │ │ -
186 i = i/sizes_[j];
│ │ │ │ -
187 }
│ │ │ │ -
188 return alpha;
│ │ │ │ -
189 }
│ │ │ │ -
190
│ │ │ │ -
192 void setup1d(std::vector<unsigned int>& subEntity)
│ │ │ │ -
193 {
│ │ │ │ -
194 if (sizes_[0]==1)
│ │ │ │ -
195 {
│ │ │ │ -
196 subEntity[0] = 0;
│ │ │ │ -
197 return;
│ │ │ │ -
198 }
│ │ │ │ -
199
│ │ │ │ -
200 /* edge and vertex numbering
│ │ │ │ -
201 0----0----1
│ │ │ │ -
202 */
│ │ │ │ -
203 unsigned lastIndex=0;
│ │ │ │ -
204 subEntity[lastIndex++] = 0; // corner 0
│ │ │ │ -
205 for (unsigned i = 0; i < sizes_[0] - 2; ++i)
│ │ │ │ -
206 subEntity[lastIndex++] = 0; // inner dofs of element (0)
│ │ │ │ -
207
│ │ │ │ -
208 subEntity[lastIndex++] = 1; // corner 1
│ │ │ │ +
164 template<class OFT, class... IFT,
│ │ │ │ +
165 disableCopyMove<ComposedGridFunction, OFT> = 0,
│ │ │ │ +
166 std::enable_if_t<(sizeof...(IFT) > 0), int> = 0>
│ │ │ │ +
167 ComposedGridFunction(OFT&& outerFunction, IFT&&... innerFunctions) :
│ │ │ │ +
168 outerFunction_(std::forward<OFT>(outerFunction)),
│ │ │ │ +
169 innerFunctions_(std::forward<IFT>(innerFunctions)...)
│ │ │ │ +
170 {}
│ │ │ │ +
171
│ │ │ │ +
173 Range operator()(const Domain& x) const
│ │ │ │ +
174 {
│ │ │ │ +
175 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │ +
176 }
│ │ │ │ +
177
│ │ │ │ + │ │ │ │ +
180 {
│ │ │ │ +
181 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │ +
182 }
│ │ │ │ +
183
│ │ │ │ +
190 friend LocalFunction localFunction(const ComposedGridFunction& cgf)
│ │ │ │ +
191 {
│ │ │ │ +
192 return LocalFunction(cgf);
│ │ │ │ +
193 }
│ │ │ │ +
194
│ │ │ │ +
205 const EntitySet& entitySet() const
│ │ │ │ +
206 {
│ │ │ │ +
207 return resolveRef(std::get<0>(innerFunctions_)).entitySet();
│ │ │ │ +
208 }
│ │ │ │
209
│ │ │ │ -
210 assert(size()==lastIndex);
│ │ │ │ -
211 }
│ │ │ │ -
212
│ │ │ │ -
213 void setup2d(std::vector<unsigned int>& subEntity)
│ │ │ │ -
214 {
│ │ │ │ -
215 unsigned lastIndex=0;
│ │ │ │ -
216
│ │ │ │ -
217 // LocalKey: entity number , entity codim, dof indices within each entity
│ │ │ │ -
218 /* edge and vertex numbering
│ │ │ │ -
219 2----3----3
│ │ │ │ -
220 | |
│ │ │ │ -
221 | |
│ │ │ │ -
222 0 1
│ │ │ │ -
223 | |
│ │ │ │ -
224 | |
│ │ │ │ -
225 0----2----1
│ │ │ │ -
226 */
│ │ │ │ -
227
│ │ │ │ -
228 // lower edge (2)
│ │ │ │ -
229 subEntity[lastIndex++] = 0; // corner 0
│ │ │ │ -
230 for (unsigned i = 0; i < sizes_[0]-2; ++i)
│ │ │ │ -
231 subEntity[lastIndex++] = 2; // inner dofs of lower edge (2)
│ │ │ │ -
232
│ │ │ │ -
233 subEntity[lastIndex++] = 1; // corner 1
│ │ │ │ -
234
│ │ │ │ -
235 // iterate from bottom to top over inner edge dofs
│ │ │ │ -
236 for (unsigned e = 0; e < sizes_[1]-2; ++e)
│ │ │ │ -
237 {
│ │ │ │ -
238 subEntity[lastIndex++] = 0; // left edge (0)
│ │ │ │ -
239 for (unsigned i = 0; i < sizes_[0]-2; ++i)
│ │ │ │ -
240 subEntity[lastIndex++] = 0; // face dofs
│ │ │ │ -
241 subEntity[lastIndex++] = 1; // right edge (1)
│ │ │ │ -
242 }
│ │ │ │ -
243
│ │ │ │ -
244 // upper edge (3)
│ │ │ │ -
245 subEntity[lastIndex++] = 2; // corner 2
│ │ │ │ -
246 for (unsigned i = 0; i < sizes_[0]-2; ++i)
│ │ │ │ -
247 subEntity[lastIndex++] = 3; // inner dofs of upper edge (3)
│ │ │ │ -
248
│ │ │ │ -
249 subEntity[lastIndex++] = 3; // corner 3
│ │ │ │ -
250
│ │ │ │ -
251 assert(size()==lastIndex);
│ │ │ │ -
252 }
│ │ │ │ +
210protected:
│ │ │ │ +
211
│ │ │ │ +
212 InnerLocalFunctions innerLocalFunctions() const
│ │ │ │ +
213 {
│ │ │ │ +
214 return std::apply([&](const auto&... innerFunction) {
│ │ │ │ +
215 return std::make_tuple(localFunction(resolveRef(innerFunction))...);
│ │ │ │ +
216 }, innerFunctions_);
│ │ │ │ +
217 }
│ │ │ │ +
218
│ │ │ │ +
219 OuterFunction outerFunction_;
│ │ │ │ +
220 InnerFunctions innerFunctions_;
│ │ │ │ +
221};
│ │ │ │ +
222
│ │ │ │ +
223
│ │ │ │ +
224
│ │ │ │ +
247template<class OF, class... IF>
│ │ │ │ +
248auto makeComposedGridFunction(OF&& outerFunction, IF&&... innerFunction)
│ │ │ │ +
249{
│ │ │ │ +
250 using ComposedGridFunctionType = ComposedGridFunction<std::decay_t<OF>, std::decay_t<IF>...>;
│ │ │ │ +
251 return ComposedGridFunctionType(std::forward<OF>(outerFunction), std::forward<IF>(innerFunction)...);
│ │ │ │ +
252}
│ │ │ │
253
│ │ │ │
254
│ │ │ │ -
255public:
│ │ │ │ -
256 void init(const std::array<unsigned,dim>& sizes)
│ │ │ │ -
257 {
│ │ │ │ -
258 sizes_ = sizes;
│ │ │ │ +
255
│ │ │ │ +
256}} // namespace Dune::Functions
│ │ │ │ +
257
│ │ │ │ +
258
│ │ │ │
259
│ │ │ │ -
260 li_.resize(size());
│ │ │ │ -
261
│ │ │ │ -
262 // Set up array of codimension-per-dof-number
│ │ │ │ -
263 std::vector<unsigned int> codim(li_.size());
│ │ │ │ -
264
│ │ │ │ -
265 for (std::size_t i=0; i<codim.size(); i++)
│ │ │ │ -
266 {
│ │ │ │ -
267 codim[i] = 0;
│ │ │ │ -
268 // Codimension gets increased by 1 for each coordinate direction
│ │ │ │ -
269 // where dof is on boundary
│ │ │ │ -
270 std::array<unsigned int,dim> mIdx = multiindex(i);
│ │ │ │ -
271 for (int j=0; j<dim; j++)
│ │ │ │ -
272 if (mIdx[j]==0 or mIdx[j]==sizes[j]-1)
│ │ │ │ -
273 codim[i]++;
│ │ │ │ -
274 }
│ │ │ │ -
275
│ │ │ │ -
276 // Set up index vector (the index of the dof in the set of dofs of a given subentity)
│ │ │ │ -
277 // Algorithm: the 'index' has the same ordering as the dof number 'i'.
│ │ │ │ -
278 // To make it consecutive we interpret 'i' in the (k+1)-adic system, omit all digits
│ │ │ │ -
279 // that correspond to axes where the dof is on the element boundary, and transform the
│ │ │ │ -
280 // rest to the (k-1)-adic system.
│ │ │ │ -
281 std::vector<unsigned int> index(size());
│ │ │ │ -
282
│ │ │ │ -
283 for (std::size_t i=0; i<index.size(); i++)
│ │ │ │ -
284 {
│ │ │ │ -
285 index[i] = 0;
│ │ │ │ -
286
│ │ │ │ -
287 std::array<unsigned int,dim> mIdx = multiindex(i);
│ │ │ │ -
288
│ │ │ │ -
289 for (int j=dim-1; j>=0; j--)
│ │ │ │ -
290 if (mIdx[j]>0 and mIdx[j]<sizes[j]-1)
│ │ │ │ -
291 index[i] = (sizes[j]-1)*index[i] + (mIdx[j]-1);
│ │ │ │ -
292 }
│ │ │ │ -
293
│ │ │ │ -
294 // Set up entity and dof numbers for each (supported) dimension separately
│ │ │ │ -
295 std::vector<unsigned int> subEntity(li_.size());
│ │ │ │ -
296
│ │ │ │ -
297 if (subEntity.size() > 0)
│ │ │ │ -
298 {
│ │ │ │ -
299 if (dim==1) {
│ │ │ │ -
300
│ │ │ │ -
301 setup1d(subEntity);
│ │ │ │ -
302
│ │ │ │ -
303 } else if (dim==2 and sizes_[0]>1 and sizes_[1]>1) {
│ │ │ │ -
304
│ │ │ │ -
305 setup2d(subEntity);
│ │ │ │ -
306
│ │ │ │ -
307 }
│ │ │ │ -
308 }
│ │ │ │ -
309
│ │ │ │ -
310 for (size_t i=0; i<li_.size(); i++)
│ │ │ │ -
311 li_[i] = LocalKey(subEntity[i], codim[i], index[i]);
│ │ │ │ -
312 }
│ │ │ │ -
313
│ │ │ │ -
315 std::size_t size () const
│ │ │ │ -
316 {
│ │ │ │ -
317 return std::accumulate(sizes_.begin(), sizes_.end(), 1, std::multiplies<unsigned int>());
│ │ │ │ -
318 }
│ │ │ │ -
319
│ │ │ │ -
321 const LocalKey& localKey (std::size_t i) const
│ │ │ │ -
322 {
│ │ │ │ -
323 return li_[i];
│ │ │ │ -
324 }
│ │ │ │ -
325
│ │ │ │ -
326private:
│ │ │ │ -
327
│ │ │ │ -
328 // Number of shape functions on this element per coordinate direction
│ │ │ │ -
329 std::array<unsigned, dim> sizes_;
│ │ │ │ -
330
│ │ │ │ -
331 std::vector<LocalKey> li_;
│ │ │ │ -
332};
│ │ │ │ -
333
│ │ │ │ -
338template<int dim, class LB>
│ │ │ │ - │ │ │ │ -
340{
│ │ │ │ -
341public:
│ │ │ │ -
343 template<typename F, typename C>
│ │ │ │ -
344 void interpolate (const F& f, std::vector<C>& out) const
│ │ │ │ -
345 {
│ │ │ │ -
346 DUNE_THROW(NotImplemented, "BSplineLocalInterpolation::interpolate");
│ │ │ │ -
347 }
│ │ │ │ -
348
│ │ │ │ -
349};
│ │ │ │ -
350
│ │ │ │ -
360template<class GV, class R>
│ │ │ │ - │ │ │ │ -
362{
│ │ │ │ -
363 typedef typename GV::ctype D;
│ │ │ │ -
364 enum {dim = GV::dimension};
│ │ │ │ -
365 friend class BSplineLocalBasis<GV,R>;
│ │ │ │ -
366public:
│ │ │ │ -
367
│ │ │ │ -
370 typedef LocalFiniteElementTraits<BSplineLocalBasis<GV,R>,
│ │ │ │ - │ │ │ │ - │ │ │ │ -
373
│ │ │ │ - │ │ │ │ -
377 : preBasis_(preBasis),
│ │ │ │ -
378 localBasis_(preBasis,*this)
│ │ │ │ -
379 {}
│ │ │ │ -
380
│ │ │ │ - │ │ │ │ -
384 : preBasis_(other.preBasis_),
│ │ │ │ - │ │ │ │ -
386 {}
│ │ │ │ -
387
│ │ │ │ -
394 void bind(const std::array<unsigned,dim>& elementIdx)
│ │ │ │ -
395 {
│ │ │ │ -
396 /* \todo In the long run we need to precompute a table for this */
│ │ │ │ -
397 for (size_t i=0; i<elementIdx.size(); i++)
│ │ │ │ -
398 {
│ │ │ │ -
399 currentKnotSpan_[i] = 0;
│ │ │ │ -
400
│ │ │ │ -
401 // Skip over degenerate knot spans
│ │ │ │ -
402 while (preBasis_.knotVectors_[i][currentKnotSpan_[i]+1] < preBasis_.knotVectors_[i][currentKnotSpan_[i]]+1e-8)
│ │ │ │ -
403 currentKnotSpan_[i]++;
│ │ │ │ -
404
│ │ │ │ -
405 for (size_t j=0; j<elementIdx[i]; j++)
│ │ │ │ -
406 {
│ │ │ │ -
407 currentKnotSpan_[i]++;
│ │ │ │ -
408
│ │ │ │ -
409 // Skip over degenerate knot spans
│ │ │ │ -
410 while (preBasis_.knotVectors_[i][currentKnotSpan_[i]+1] < preBasis_.knotVectors_[i][currentKnotSpan_[i]]+1e-8)
│ │ │ │ -
411 currentKnotSpan_[i]++;
│ │ │ │ -
412 }
│ │ │ │ -
413
│ │ │ │ -
414 // Compute the geometric transformation from knotspan-local to global coordinates
│ │ │ │ -
415 localBasis_.offset_[i] = preBasis_.knotVectors_[i][currentKnotSpan_[i]];
│ │ │ │ -
416 localBasis_.scaling_[i][i] = preBasis_.knotVectors_[i][currentKnotSpan_[i]+1] - preBasis_.knotVectors_[i][currentKnotSpan_[i]];
│ │ │ │ -
417 }
│ │ │ │ -
418
│ │ │ │ -
419 // Set up the LocalCoefficients object
│ │ │ │ -
420 std::array<unsigned int, dim> sizes;
│ │ │ │ -
421 for (size_t i=0; i<dim; i++)
│ │ │ │ -
422 sizes[i] = size(i);
│ │ │ │ -
423 localCoefficients_.init(sizes);
│ │ │ │ -
424 }
│ │ │ │ -
425
│ │ │ │ - │ │ │ │ -
428 {
│ │ │ │ -
429 return localBasis_;
│ │ │ │ -
430 }
│ │ │ │ -
431
│ │ │ │ - │ │ │ │ -
434 {
│ │ │ │ -
435 return localCoefficients_;
│ │ │ │ -
436 }
│ │ │ │ -
437
│ │ │ │ - │ │ │ │ -
440 {
│ │ │ │ -
441 return localInterpolation_;
│ │ │ │ -
442 }
│ │ │ │ -
443
│ │ │ │ -
445 unsigned size () const
│ │ │ │ -
446 {
│ │ │ │ -
447 std::size_t r = 1;
│ │ │ │ -
448 for (int i=0; i<dim; i++)
│ │ │ │ -
449 r *= size(i);
│ │ │ │ -
450 return r;
│ │ │ │ -
451 }
│ │ │ │ -
452
│ │ │ │ -
455 GeometryType type () const
│ │ │ │ -
456 {
│ │ │ │ -
457 return GeometryTypes::cube(dim);
│ │ │ │ -
458 }
│ │ │ │ -
459
│ │ │ │ -
460//private:
│ │ │ │ -
461
│ │ │ │ -
463 unsigned int size(int i) const
│ │ │ │ -
464 {
│ │ │ │ -
465 const auto& order = preBasis_.order_;
│ │ │ │ -
466 unsigned int r = order[i]+1; // The 'normal' value
│ │ │ │ -
467 if (currentKnotSpan_[i]<order[i]) // Less near the left end of the knot vector
│ │ │ │ -
468 r -= (order[i] - currentKnotSpan_[i]);
│ │ │ │ -
469 if ( order[i] > (preBasis_.knotVectors_[i].size() - currentKnotSpan_[i] - 2) )
│ │ │ │ -
470 r -= order[i] - (preBasis_.knotVectors_[i].size() - currentKnotSpan_[i] - 2);
│ │ │ │ -
471 return r;
│ │ │ │ -
472 }
│ │ │ │ -
473
│ │ │ │ - │ │ │ │ -
475
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
479
│ │ │ │ -
480 // The knot span we are bound to
│ │ │ │ -
481 std::array<unsigned,dim> currentKnotSpan_;
│ │ │ │ -
482};
│ │ │ │ -
483
│ │ │ │ -
484
│ │ │ │ -
485template<typename GV>
│ │ │ │ -
486class BSplineNode;
│ │ │ │ -
487
│ │ │ │ -
497template<typename GV>
│ │ │ │ - │ │ │ │ -
499{
│ │ │ │ -
500 static const int dim = GV::dimension;
│ │ │ │ -
501
│ │ │ │ -
503 class MultiDigitCounter
│ │ │ │ -
504 {
│ │ │ │ -
505 public:
│ │ │ │ -
506
│ │ │ │ -
510 MultiDigitCounter(const std::array<unsigned int,dim>& limits)
│ │ │ │ -
511 : limits_(limits)
│ │ │ │ -
512 {
│ │ │ │ -
513 std::fill(counter_.begin(), counter_.end(), 0);
│ │ │ │ -
514 }
│ │ │ │ -
515
│ │ │ │ -
517 MultiDigitCounter& operator++()
│ │ │ │ -
518 {
│ │ │ │ -
519 for (int i=0; i<dim; i++)
│ │ │ │ -
520 {
│ │ │ │ -
521 ++counter_[i];
│ │ │ │ -
522
│ │ │ │ -
523 // no overflow?
│ │ │ │ -
524 if (counter_[i] < limits_[i])
│ │ │ │ -
525 break;
│ │ │ │ -
526
│ │ │ │ -
527 counter_[i] = 0;
│ │ │ │ -
528 }
│ │ │ │ -
529 return *this;
│ │ │ │ -
530 }
│ │ │ │ -
531
│ │ │ │ -
533 const unsigned int& operator[](int i) const
│ │ │ │ -
534 {
│ │ │ │ -
535 return counter_[i];
│ │ │ │ -
536 }
│ │ │ │ -
537
│ │ │ │ -
539 unsigned int cycle() const
│ │ │ │ -
540 {
│ │ │ │ -
541 unsigned int r = 1;
│ │ │ │ -
542 for (int i=0; i<dim; i++)
│ │ │ │ -
543 r *= limits_[i];
│ │ │ │ -
544 return r;
│ │ │ │ -
545 }
│ │ │ │ -
546
│ │ │ │ -
547 private:
│ │ │ │ -
548
│ │ │ │ -
550 const std::array<unsigned int,dim> limits_;
│ │ │ │ -
551
│ │ │ │ -
553 std::array<unsigned int,dim> counter_;
│ │ │ │ -
554
│ │ │ │ -
555 };
│ │ │ │ -
556
│ │ │ │ -
557public:
│ │ │ │ -
558
│ │ │ │ -
560 using GridView = GV;
│ │ │ │ -
561 using size_type = std::size_t;
│ │ │ │ -
562
│ │ │ │ - │ │ │ │ -
564
│ │ │ │ -
565 static constexpr size_type maxMultiIndexSize = 1;
│ │ │ │ -
566 static constexpr size_type minMultiIndexSize = 1;
│ │ │ │ -
567 static constexpr size_type multiIndexBufferSize = 1;
│ │ │ │ -
568
│ │ │ │ -
569 // Type used for function values
│ │ │ │ -
570 using R = double;
│ │ │ │ -
571
│ │ │ │ - │ │ │ │ -
591 const std::vector<double>& knotVector,
│ │ │ │ -
592 unsigned int order,
│ │ │ │ -
593 bool makeOpen = true)
│ │ │ │ - │ │ │ │ -
595 {
│ │ │ │ -
596 // \todo Detection of duplicate knots
│ │ │ │ -
597 std::fill(elements_.begin(), elements_.end(), knotVector.size()-1);
│ │ │ │ -
598
│ │ │ │ -
599 // Mediocre sanity check: we don't know the number of grid elements in each direction.
│ │ │ │ -
600 // but at least we know the total number of elements.
│ │ │ │ -
601 assert( std::accumulate(elements_.begin(), elements_.end(), 1, std::multiplies<unsigned>()) == gridView_.size(0) );
│ │ │ │ -
602
│ │ │ │ -
603 for (int i=0; i<dim; i++)
│ │ │ │ -
604 {
│ │ │ │ -
605 // Prepend the correct number of additional knots to open the knot vector
│ │ │ │ -
607 if (makeOpen)
│ │ │ │ -
608 for (unsigned int j=0; j<order; j++)
│ │ │ │ -
609 knotVectors_[i].push_back(knotVector[0]);
│ │ │ │ -
610
│ │ │ │ -
611 knotVectors_[i].insert(knotVectors_[i].end(), knotVector.begin(), knotVector.end());
│ │ │ │ -
612
│ │ │ │ -
613 if (makeOpen)
│ │ │ │ -
614 for (unsigned int j=0; j<order; j++)
│ │ │ │ -
615 knotVectors_[i].push_back(knotVector.back());
│ │ │ │ -
616 }
│ │ │ │ -
617
│ │ │ │ -
618 std::fill(order_.begin(), order_.end(), order);
│ │ │ │ -
619 }
│ │ │ │ -
620
│ │ │ │ - │ │ │ │ -
643 const FieldVector<double,dim>& lowerLeft,
│ │ │ │ -
644 const FieldVector<double,dim>& upperRight,
│ │ │ │ -
645 const std::array<unsigned int,dim>& elements,
│ │ │ │ -
646 unsigned int order,
│ │ │ │ -
647 bool makeOpen = true)
│ │ │ │ -
648 : elements_(elements),
│ │ │ │ - │ │ │ │ -
650 {
│ │ │ │ -
651 // Mediocre sanity check: we don't know the number of grid elements in each direction.
│ │ │ │ -
652 // but at least we know the total number of elements.
│ │ │ │ -
653 assert( std::accumulate(elements_.begin(), elements_.end(), 1, std::multiplies<unsigned>()) == gridView_.size(0) );
│ │ │ │ -
654
│ │ │ │ -
655 for (int i=0; i<dim; i++)
│ │ │ │ -
656 {
│ │ │ │ -
657 // Prepend the correct number of additional knots to open the knot vector
│ │ │ │ -
659 if (makeOpen)
│ │ │ │ -
660 for (unsigned int j=0; j<order; j++)
│ │ │ │ -
661 knotVectors_[i].push_back(lowerLeft[i]);
│ │ │ │ -
662
│ │ │ │ -
663 // Construct the actual knot vector
│ │ │ │ -
664 for (size_t j=0; j<elements[i]+1; j++)
│ │ │ │ -
665 knotVectors_[i].push_back(lowerLeft[i] + j*(upperRight[i]-lowerLeft[i]) / elements[i]);
│ │ │ │ -
666
│ │ │ │ -
667 if (makeOpen)
│ │ │ │ -
668 for (unsigned int j=0; j<order; j++)
│ │ │ │ -
669 knotVectors_[i].push_back(upperRight[i]);
│ │ │ │ -
670 }
│ │ │ │ -
671
│ │ │ │ -
672 std::fill(order_.begin(), order_.end(), order);
│ │ │ │ -
673 }
│ │ │ │ -
674
│ │ │ │ - │ │ │ │ -
677 {}
│ │ │ │ -
678
│ │ │ │ -
680 const GridView& gridView() const
│ │ │ │ -
681 {
│ │ │ │ -
682 return gridView_;
│ │ │ │ -
683 }
│ │ │ │ -
684
│ │ │ │ -
686 void update(const GridView& gv)
│ │ │ │ -
687 {
│ │ │ │ -
688 gridView_ = gv;
│ │ │ │ -
689 }
│ │ │ │ -
690
│ │ │ │ - │ │ │ │ -
695 {
│ │ │ │ -
696 return Node{this};
│ │ │ │ -
697 }
│ │ │ │ -
698
│ │ │ │ -
699 // Ideally this method should be implemented as
│ │ │ │ -
700 //
│ │ │ │ -
701 // template<class SizePrefix>
│ │ │ │ -
702 // size_type size(const SizePrefix& prefix) const
│ │ │ │ -
703 //
│ │ │ │ -
704 // But leads to ambiguity with the other size method:
│ │ │ │ -
705 //
│ │ │ │ -
706 // unsigned int size (size_t d) const
│ │ │ │ -
707 //
│ │ │ │ -
708 // Once the latter is removed, this implementation should be changed.
│ │ │ │ -
709
│ │ │ │ -
711 template<class ST, int i>
│ │ │ │ -
712 size_type size(const Dune::ReservedVector<ST, i>& prefix) const
│ │ │ │ -
713 {
│ │ │ │ -
714 assert(prefix.size() == 0 || prefix.size() == 1);
│ │ │ │ -
715 return (prefix.size() == 0) ? size() : 0;
│ │ │ │ -
716 }
│ │ │ │ -
717
│ │ │ │ - │ │ │ │ -
720 {
│ │ │ │ -
721 return size();
│ │ │ │ -
722 }
│ │ │ │ -
723
│ │ │ │ - │ │ │ │ -
726 {
│ │ │ │ -
727 size_type result = 1;
│ │ │ │ -
728 for (int i=0; i<dim; i++)
│ │ │ │ -
729 result *= order_[i]+1;
│ │ │ │ -
730 return result;
│ │ │ │ -
731 }
│ │ │ │ -
732
│ │ │ │ -
734 template<typename It>
│ │ │ │ -
735 It indices(const Node& node, It it) const
│ │ │ │ -
736 {
│ │ │ │ -
737 // Local degrees of freedom are arranged in a lattice.
│ │ │ │ -
738 // We need the lattice dimensions to be able to compute lattice coordinates from a local index
│ │ │ │ -
739 std::array<unsigned int, dim> localSizes;
│ │ │ │ -
740 for (int i=0; i<dim; i++)
│ │ │ │ -
741 localSizes[i] = node.finiteElement().size(i);
│ │ │ │ -
742 for (size_type i = 0, end = node.size() ; i < end ; ++i, ++it)
│ │ │ │ -
743 {
│ │ │ │ -
744 std::array<unsigned int,dim> localIJK = getIJK(i, localSizes);
│ │ │ │ -
745
│ │ │ │ -
746 const auto currentKnotSpan = node.finiteElement().currentKnotSpan_;
│ │ │ │ -
747 const auto order = order_;
│ │ │ │ -
748
│ │ │ │ -
749 std::array<unsigned int,dim> globalIJK;
│ │ │ │ -
750 for (int i=0; i<dim; i++)
│ │ │ │ -
751 globalIJK[i] = std::max((int)currentKnotSpan[i] - (int)order[i], 0) + localIJK[i]; // needs to be a signed type!
│ │ │ │ -
752
│ │ │ │ -
753 // Make one global flat index from the globalIJK tuple
│ │ │ │ -
754 size_type globalIdx = globalIJK[dim-1];
│ │ │ │ -
755
│ │ │ │ -
756 for (int i=dim-2; i>=0; i--)
│ │ │ │ -
757 globalIdx = globalIdx * size(i) + globalIJK[i];
│ │ │ │ -
758
│ │ │ │ -
759 *it = {{globalIdx}};
│ │ │ │ -
760 }
│ │ │ │ -
761 return it;
│ │ │ │ -
762 }
│ │ │ │ -
763
│ │ │ │ -
765 unsigned int size () const
│ │ │ │ -
766 {
│ │ │ │ -
767 unsigned int result = 1;
│ │ │ │ -
768 for (size_t i=0; i<dim; i++)
│ │ │ │ -
769 result *= size(i);
│ │ │ │ -
770 return result;
│ │ │ │ -
771 }
│ │ │ │ -
772
│ │ │ │ -
774 unsigned int size (size_t d) const
│ │ │ │ -
775 {
│ │ │ │ -
776 return knotVectors_[d].size() - order_[d] - 1;
│ │ │ │ -
777 }
│ │ │ │ -
778
│ │ │ │ -
781 void evaluateFunction (const FieldVector<typename GV::ctype,dim>& in,
│ │ │ │ -
782 std::vector<FieldVector<R,1> >& out,
│ │ │ │ -
783 const std::array<unsigned,dim>& currentKnotSpan) const
│ │ │ │ -
784 {
│ │ │ │ -
785 // Evaluate
│ │ │ │ -
786 std::array<std::vector<R>, dim> oneDValues;
│ │ │ │ -
787
│ │ │ │ -
788 for (size_t i=0; i<dim; i++)
│ │ │ │ -
789 evaluateFunction(in[i], oneDValues[i], knotVectors_[i], order_[i], currentKnotSpan[i]);
│ │ │ │ -
790
│ │ │ │ -
791 std::array<unsigned int, dim> limits;
│ │ │ │ -
792 for (int i=0; i<dim; i++)
│ │ │ │ -
793 limits[i] = oneDValues[i].size();
│ │ │ │ -
794
│ │ │ │ -
795 MultiDigitCounter ijkCounter(limits);
│ │ │ │ -
796
│ │ │ │ -
797 out.resize(ijkCounter.cycle());
│ │ │ │ -
798
│ │ │ │ -
799 for (size_t i=0; i<out.size(); i++, ++ijkCounter)
│ │ │ │ -
800 {
│ │ │ │ -
801 out[i] = R(1.0);
│ │ │ │ -
802 for (size_t j=0; j<dim; j++)
│ │ │ │ -
803 out[i] *= oneDValues[j][ijkCounter[j]];
│ │ │ │ -
804 }
│ │ │ │ -
805 }
│ │ │ │ -
806
│ │ │ │ -
812 void evaluateJacobian (const FieldVector<typename GV::ctype,dim>& in,
│ │ │ │ -
813 std::vector<FieldMatrix<R,1,dim> >& out,
│ │ │ │ -
814 const std::array<unsigned,dim>& currentKnotSpan) const
│ │ │ │ -
815 {
│ │ │ │ -
816 // How many shape functions to we have in each coordinate direction?
│ │ │ │ -
817 std::array<unsigned int, dim> limits;
│ │ │ │ -
818 for (int i=0; i<dim; i++)
│ │ │ │ -
819 {
│ │ │ │ -
820 limits[i] = order_[i]+1; // The 'standard' value away from the boundaries of the knot vector
│ │ │ │ -
821 if (currentKnotSpan[i]<order_[i])
│ │ │ │ -
822 limits[i] -= (order_[i] - currentKnotSpan[i]);
│ │ │ │ -
823 if ( order_[i] > (knotVectors_[i].size() - currentKnotSpan[i] - 2) )
│ │ │ │ -
824 limits[i] -= order_[i] - (knotVectors_[i].size() - currentKnotSpan[i] - 2);
│ │ │ │ -
825 }
│ │ │ │ -
826
│ │ │ │ -
827 // The lowest knot spans that we need values from
│ │ │ │ -
828 std::array<unsigned int, dim> offset;
│ │ │ │ -
829 for (int i=0; i<dim; i++)
│ │ │ │ -
830 offset[i] = std::max((int)(currentKnotSpan[i] - order_[i]),0);
│ │ │ │ -
831
│ │ │ │ -
832 // Evaluate 1d function values (needed for the product rule)
│ │ │ │ -
833 std::array<std::vector<R>, dim> oneDValues;
│ │ │ │ -
834
│ │ │ │ -
835 // Evaluate 1d function values of one order lower (needed for the derivative formula)
│ │ │ │ -
836 std::array<std::vector<R>, dim> lowOrderOneDValues;
│ │ │ │ -
837
│ │ │ │ -
838 std::array<DynamicMatrix<R>, dim> values;
│ │ │ │ -
839
│ │ │ │ -
840 for (size_t i=0; i<dim; i++)
│ │ │ │ -
841 {
│ │ │ │ -
842 evaluateFunctionFull(in[i], values[i], knotVectors_[i], order_[i], currentKnotSpan[i]);
│ │ │ │ -
843 oneDValues[i].resize(knotVectors_[i].size()-order_[i]-1);
│ │ │ │ -
844 for (size_t j=0; j<oneDValues[i].size(); j++)
│ │ │ │ -
845 oneDValues[i][j] = values[i][order_[i]][j];
│ │ │ │ -
846
│ │ │ │ -
847 if (order_[i]!=0)
│ │ │ │ -
848 {
│ │ │ │ -
849 lowOrderOneDValues[i].resize(knotVectors_[i].size()-(order_[i]-1)-1);
│ │ │ │ -
850 for (size_t j=0; j<lowOrderOneDValues[i].size(); j++)
│ │ │ │ -
851 lowOrderOneDValues[i][j] = values[i][order_[i]-1][j];
│ │ │ │ -
852 }
│ │ │ │ -
853 }
│ │ │ │ -
854
│ │ │ │ -
855
│ │ │ │ -
856 // Evaluate 1d function derivatives
│ │ │ │ -
857 std::array<std::vector<R>, dim> oneDDerivatives;
│ │ │ │ -
858 for (size_t i=0; i<dim; i++)
│ │ │ │ -
859 {
│ │ │ │ -
860 oneDDerivatives[i].resize(limits[i]);
│ │ │ │ -
861
│ │ │ │ -
862 if (order_[i]==0) // order-zero functions are piecewise constant, hence all derivatives are zero
│ │ │ │ -
863 std::fill(oneDDerivatives[i].begin(), oneDDerivatives[i].end(), R(0.0));
│ │ │ │ -
864 else
│ │ │ │ -
865 {
│ │ │ │ -
866 for (size_t j=offset[i]; j<offset[i]+limits[i]; j++)
│ │ │ │ -
867 {
│ │ │ │ -
868 R derivativeAddend1 = lowOrderOneDValues[i][j] / (knotVectors_[i][j+order_[i]]-knotVectors_[i][j]);
│ │ │ │ -
869 R derivativeAddend2 = lowOrderOneDValues[i][j+1] / (knotVectors_[i][j+order_[i]+1]-knotVectors_[i][j+1]);
│ │ │ │ -
870 // The two previous terms may evaluate as 0/0. This is to be interpreted as 0.
│ │ │ │ -
871 if (std::isnan(derivativeAddend1))
│ │ │ │ -
872 derivativeAddend1 = 0;
│ │ │ │ -
873 if (std::isnan(derivativeAddend2))
│ │ │ │ -
874 derivativeAddend2 = 0;
│ │ │ │ -
875 oneDDerivatives[i][j-offset[i]] = order_[i] * ( derivativeAddend1 - derivativeAddend2 );
│ │ │ │ -
876 }
│ │ │ │ -
877 }
│ │ │ │ -
878 }
│ │ │ │ -
879
│ │ │ │ -
880 // Working towards computing only the parts that we really need:
│ │ │ │ -
881 // Let's copy them out into a separate array
│ │ │ │ -
882 std::array<std::vector<R>, dim> oneDValuesShort;
│ │ │ │ -
883
│ │ │ │ -
884 for (int i=0; i<dim; i++)
│ │ │ │ -
885 {
│ │ │ │ -
886 oneDValuesShort[i].resize(limits[i]);
│ │ │ │ -
887
│ │ │ │ -
888 for (size_t j=0; j<limits[i]; j++)
│ │ │ │ -
889 oneDValuesShort[i][j] = oneDValues[i][offset[i] + j];
│ │ │ │ -
890 }
│ │ │ │ -
891
│ │ │ │ -
892
│ │ │ │ -
893
│ │ │ │ -
894 // Set up a multi-index to go from consecutive indices to integer coordinates
│ │ │ │ -
895 MultiDigitCounter ijkCounter(limits);
│ │ │ │ -
896
│ │ │ │ -
897 out.resize(ijkCounter.cycle());
│ │ │ │ -
898
│ │ │ │ -
899 // Complete Jacobian is given by the product rule
│ │ │ │ -
900 for (size_t i=0; i<out.size(); i++, ++ijkCounter)
│ │ │ │ -
901 for (int j=0; j<dim; j++)
│ │ │ │ -
902 {
│ │ │ │ -
903 out[i][0][j] = 1.0;
│ │ │ │ -
904 for (int k=0; k<dim; k++)
│ │ │ │ -
905 out[i][0][j] *= (j==k) ? oneDDerivatives[k][ijkCounter[k]]
│ │ │ │ -
906 : oneDValuesShort[k][ijkCounter[k]];
│ │ │ │ -
907 }
│ │ │ │ -
908
│ │ │ │ -
909 }
│ │ │ │ -
910
│ │ │ │ -
912 template <size_type k>
│ │ │ │ -
913 void evaluate(const typename std::array<int,k>& directions,
│ │ │ │ -
914 const FieldVector<typename GV::ctype,dim>& in,
│ │ │ │ -
915 std::vector<FieldVector<R,1> >& out,
│ │ │ │ -
916 const std::array<unsigned,dim>& currentKnotSpan) const
│ │ │ │ -
917 {
│ │ │ │ -
918 if (k != 1 && k != 2)
│ │ │ │ -
919 DUNE_THROW(RangeError, "Differentiation order greater than 2 is not supported!");
│ │ │ │ -
920
│ │ │ │ -
921 // Evaluate 1d function values (needed for the product rule)
│ │ │ │ -
922 std::array<std::vector<R>, dim> oneDValues;
│ │ │ │ -
923 std::array<std::vector<R>, dim> oneDDerivatives;
│ │ │ │ -
924 std::array<std::vector<R>, dim> oneDSecondDerivatives;
│ │ │ │ -
925
│ │ │ │ -
926 // Evaluate 1d function derivatives
│ │ │ │ -
927 if (k==1)
│ │ │ │ -
928 for (size_t i=0; i<dim; i++)
│ │ │ │ -
929 evaluateAll(in[i], oneDValues[i], true, oneDDerivatives[i], false, oneDSecondDerivatives[i], knotVectors_[i], order_[i], currentKnotSpan[i]);
│ │ │ │ -
930 else
│ │ │ │ -
931 for (size_t i=0; i<dim; i++)
│ │ │ │ -
932 evaluateAll(in[i], oneDValues[i], true, oneDDerivatives[i], true, oneDSecondDerivatives[i], knotVectors_[i], order_[i], currentKnotSpan[i]);
│ │ │ │ -
933
│ │ │ │ -
934 // The lowest knot spans that we need values from
│ │ │ │ -
935 std::array<unsigned int, dim> offset;
│ │ │ │ -
936 for (int i=0; i<dim; i++)
│ │ │ │ -
937 offset[i] = std::max((int)(currentKnotSpan[i] - order_[i]),0);
│ │ │ │ -
938
│ │ │ │ -
939 // Set up a multi-index to go from consecutive indices to integer coordinates
│ │ │ │ -
940 std::array<unsigned int, dim> limits;
│ │ │ │ -
941 for (int i=0; i<dim; i++)
│ │ │ │ -
942 {
│ │ │ │ -
943 // In a proper implementation, the following line would do
│ │ │ │ -
944 //limits[i] = oneDValues[i].size();
│ │ │ │ -
945 limits[i] = order_[i]+1; // The 'standard' value away from the boundaries of the knot vector
│ │ │ │ -
946 if (currentKnotSpan[i]<order_[i])
│ │ │ │ -
947 limits[i] -= (order_[i] - currentKnotSpan[i]);
│ │ │ │ -
948 if ( order_[i] > (knotVectors_[i].size() - currentKnotSpan[i] - 2) )
│ │ │ │ -
949 limits[i] -= order_[i] - (knotVectors_[i].size() - currentKnotSpan[i] - 2);
│ │ │ │ -
950 }
│ │ │ │ -
951
│ │ │ │ -
952 // Working towards computing only the parts that we really need:
│ │ │ │ -
953 // Let's copy them out into a separate array
│ │ │ │ -
954 std::array<std::vector<R>, dim> oneDValuesShort;
│ │ │ │ -
955
│ │ │ │ -
956 for (int i=0; i<dim; i++)
│ │ │ │ -
957 {
│ │ │ │ -
958 oneDValuesShort[i].resize(limits[i]);
│ │ │ │ -
959
│ │ │ │ -
960 for (size_t j=0; j<limits[i]; j++)
│ │ │ │ -
961 oneDValuesShort[i][j] = oneDValues[i][offset[i] + j];
│ │ │ │ -
962 }
│ │ │ │ -
963
│ │ │ │ -
964
│ │ │ │ -
965 MultiDigitCounter ijkCounter(limits);
│ │ │ │ -
966
│ │ │ │ -
967 out.resize(ijkCounter.cycle());
│ │ │ │ -
968
│ │ │ │ -
969 if (k == 1)
│ │ │ │ -
970 {
│ │ │ │ -
971 // Complete Jacobian is given by the product rule
│ │ │ │ -
972 for (size_t i=0; i<out.size(); i++, ++ijkCounter)
│ │ │ │ -
973 {
│ │ │ │ -
974 out[i][0] = 1.0;
│ │ │ │ -
975 for (int l=0; l<dim; l++)
│ │ │ │ -
976 out[i][0] *= (directions[0]==l) ? oneDDerivatives[l][ijkCounter[l]]
│ │ │ │ -
977 : oneDValuesShort[l][ijkCounter[l]];
│ │ │ │ -
978 }
│ │ │ │ -
979 }
│ │ │ │ -
980
│ │ │ │ -
981 if (k == 2)
│ │ │ │ -
982 {
│ │ │ │ -
983 // Complete derivation by deriving the tensor product
│ │ │ │ -
984 for (size_t i=0; i<out.size(); i++, ++ijkCounter)
│ │ │ │ -
985 {
│ │ │ │ -
986 out[i][0] = 1.0;
│ │ │ │ -
987 for (int j=0; j<dim; j++)
│ │ │ │ -
988 {
│ │ │ │ -
989 if (directions[0] != directions[1]) //derivation in two different variables
│ │ │ │ -
990 if (directions[0] == j || directions[1] == j) //the spline has to be derived (once) in this direction
│ │ │ │ -
991 out[i][0] *= oneDDerivatives[j][ijkCounter[j]];
│ │ │ │ -
992 else //no derivation in this direction
│ │ │ │ -
993 out[i][0] *= oneDValuesShort[j][ijkCounter[j]];
│ │ │ │ -
994 else //spline is derived two times in the same direction
│ │ │ │ -
995 if (directions[0] == j) //the spline is derived two times in this direction
│ │ │ │ -
996 out[i][0] *= oneDSecondDerivatives[j][ijkCounter[j]];
│ │ │ │ -
997 else //no derivation in this direction
│ │ │ │ -
998 out[i][0] *= oneDValuesShort[j][ijkCounter[j]];
│ │ │ │ -
999 }
│ │ │ │ -
1000 }
│ │ │ │ -
1001 }
│ │ │ │ -
1002 }
│ │ │ │ -
1003
│ │ │ │ -
1004
│ │ │ │ -
1009 static std::array<unsigned int,dim> getIJK(typename GridView::IndexSet::IndexType idx, std::array<unsigned int,dim> elements)
│ │ │ │ -
1010 {
│ │ │ │ -
1011 std::array<unsigned,dim> result;
│ │ │ │ -
1012 for (int i=0; i<dim; i++)
│ │ │ │ -
1013 {
│ │ │ │ -
1014 result[i] = idx%elements[i];
│ │ │ │ -
1015 idx /= elements[i];
│ │ │ │ -
1016 }
│ │ │ │ -
1017 return result;
│ │ │ │ -
1018 }
│ │ │ │ -
1019
│ │ │ │ -
1028 static void evaluateFunction (const typename GV::ctype& in, std::vector<R>& out,
│ │ │ │ -
1029 const std::vector<R>& knotVector,
│ │ │ │ -
1030 unsigned int order,
│ │ │ │ -
1031 unsigned int currentKnotSpan)
│ │ │ │ -
1032 {
│ │ │ │ -
1033 std::size_t outSize = order+1; // The 'standard' value away from the boundaries of the knot vector
│ │ │ │ -
1034 if (currentKnotSpan<order) // Less near the left end of the knot vector
│ │ │ │ -
1035 outSize -= (order - currentKnotSpan);
│ │ │ │ -
1036 if ( order > (knotVector.size() - currentKnotSpan - 2) )
│ │ │ │ -
1037 outSize -= order - (knotVector.size() - currentKnotSpan - 2);
│ │ │ │ -
1038 out.resize(outSize);
│ │ │ │ -
1039
│ │ │ │ -
1040 // It's not really a matrix that is needed here, a plain 2d array would do
│ │ │ │ -
1041 DynamicMatrix<R> N(order+1, knotVector.size()-1);
│ │ │ │ -
1042
│ │ │ │ -
1043 // The text books on splines use the following geometric condition here to fill the array N
│ │ │ │ -
1044 // (see for example Cottrell, Hughes, Bazilevs, Formula (2.1). However, this condition
│ │ │ │ -
1045 // only works if splines are never evaluated exactly on the knots.
│ │ │ │ -
1046 //
│ │ │ │ -
1047 // for (size_t i=0; i<knotVector.size()-1; i++)
│ │ │ │ -
1048 // N[0][i] = (knotVector[i] <= in) and (in < knotVector[i+1]);
│ │ │ │ -
1049 for (size_t i=0; i<knotVector.size()-1; i++)
│ │ │ │ -
1050 N[0][i] = (i == currentKnotSpan);
│ │ │ │ -
1051
│ │ │ │ -
1052 for (size_t r=1; r<=order; r++)
│ │ │ │ -
1053 for (size_t i=0; i<knotVector.size()-r-1; i++)
│ │ │ │ -
1054 {
│ │ │ │ -
1055 R factor1 = ((knotVector[i+r] - knotVector[i]) > 1e-10)
│ │ │ │ -
1056 ? (in - knotVector[i]) / (knotVector[i+r] - knotVector[i])
│ │ │ │ -
1057 : 0;
│ │ │ │ -
1058 R factor2 = ((knotVector[i+r+1] - knotVector[i+1]) > 1e-10)
│ │ │ │ -
1059 ? (knotVector[i+r+1] - in) / (knotVector[i+r+1] - knotVector[i+1])
│ │ │ │ -
1060 : 0;
│ │ │ │ -
1061 N[r][i] = factor1 * N[r-1][i] + factor2 * N[r-1][i+1];
│ │ │ │ -
1062 }
│ │ │ │ -
1063
│ │ │ │ -
1068 for (size_t i=0; i<out.size(); i++) {
│ │ │ │ -
1069 out[i] = N[order][std::max((int)(currentKnotSpan - order),0) + i];
│ │ │ │ -
1070 }
│ │ │ │ -
1071 }
│ │ │ │ -
1072
│ │ │ │ -
1085 static void evaluateFunctionFull(const typename GV::ctype& in,
│ │ │ │ -
1086 DynamicMatrix<R>& out,
│ │ │ │ -
1087 const std::vector<R>& knotVector,
│ │ │ │ -
1088 unsigned int order,
│ │ │ │ -
1089 unsigned int currentKnotSpan)
│ │ │ │ -
1090 {
│ │ │ │ -
1091 // It's not really a matrix that is needed here, a plain 2d array would do
│ │ │ │ -
1092 DynamicMatrix<R>& N = out;
│ │ │ │ -
1093
│ │ │ │ -
1094 N.resize(order+1, knotVector.size()-1);
│ │ │ │ -
1095
│ │ │ │ -
1096 // The text books on splines use the following geometric condition here to fill the array N
│ │ │ │ -
1097 // (see for example Cottrell, Hughes, Bazilevs, Formula (2.1). However, this condition
│ │ │ │ -
1098 // only works if splines are never evaluated exactly on the knots.
│ │ │ │ -
1099 //
│ │ │ │ -
1100 // for (size_t i=0; i<knotVector.size()-1; i++)
│ │ │ │ -
1101 // N[0][i] = (knotVector[i] <= in) and (in < knotVector[i+1]);
│ │ │ │ -
1102 for (size_t i=0; i<knotVector.size()-1; i++)
│ │ │ │ -
1103 N[0][i] = (i == currentKnotSpan);
│ │ │ │ -
1104
│ │ │ │ -
1105 for (size_t r=1; r<=order; r++)
│ │ │ │ -
1106 for (size_t i=0; i<knotVector.size()-r-1; i++)
│ │ │ │ -
1107 {
│ │ │ │ -
1108 R factor1 = ((knotVector[i+r] - knotVector[i]) > 1e-10)
│ │ │ │ -
1109 ? (in - knotVector[i]) / (knotVector[i+r] - knotVector[i])
│ │ │ │ -
1110 : 0;
│ │ │ │ -
1111 R factor2 = ((knotVector[i+r+1] - knotVector[i+1]) > 1e-10)
│ │ │ │ -
1112 ? (knotVector[i+r+1] - in) / (knotVector[i+r+1] - knotVector[i+1])
│ │ │ │ -
1113 : 0;
│ │ │ │ -
1114 N[r][i] = factor1 * N[r-1][i] + factor2 * N[r-1][i+1];
│ │ │ │ -
1115 }
│ │ │ │ -
1116 }
│ │ │ │ -
1117
│ │ │ │ -
1118
│ │ │ │ -
1128 static void evaluateAll(const typename GV::ctype& in,
│ │ │ │ -
1129 std::vector<R>& out,
│ │ │ │ -
1130 bool evaluateJacobian, std::vector<R>& outJac,
│ │ │ │ -
1131 bool evaluateHessian, std::vector<R>& outHess,
│ │ │ │ -
1132 const std::vector<R>& knotVector,
│ │ │ │ -
1133 unsigned int order,
│ │ │ │ -
1134 unsigned int currentKnotSpan)
│ │ │ │ -
1135 {
│ │ │ │ -
1136 // How many shape functions to we have in each coordinate direction?
│ │ │ │ -
1137 unsigned int limit;
│ │ │ │ -
1138 limit = order+1; // The 'standard' value away from the boundaries of the knot vector
│ │ │ │ -
1139 if (currentKnotSpan<order)
│ │ │ │ -
1140 limit -= (order - currentKnotSpan);
│ │ │ │ -
1141 if ( order > (knotVector.size() - currentKnotSpan - 2) )
│ │ │ │ -
1142 limit -= order - (knotVector.size() - currentKnotSpan - 2);
│ │ │ │ -
1143
│ │ │ │ -
1144 // The lowest knot spans that we need values from
│ │ │ │ -
1145 unsigned int offset;
│ │ │ │ -
1146 offset = std::max((int)(currentKnotSpan - order),0);
│ │ │ │ -
1147
│ │ │ │ -
1148 // Evaluate 1d function values (needed for the product rule)
│ │ │ │ -
1149 DynamicMatrix<R> values;
│ │ │ │ -
1150
│ │ │ │ -
1151 evaluateFunctionFull(in, values, knotVector, order, currentKnotSpan);
│ │ │ │ -
1152
│ │ │ │ -
1153 out.resize(knotVector.size()-order-1);
│ │ │ │ -
1154 for (size_t j=0; j<out.size(); j++)
│ │ │ │ -
1155 out[j] = values[order][j];
│ │ │ │ -
1156
│ │ │ │ -
1157 // Evaluate 1d function values of one order lower (needed for the derivative formula)
│ │ │ │ -
1158 std::vector<R> lowOrderOneDValues;
│ │ │ │ -
1159
│ │ │ │ -
1160 if (order!=0)
│ │ │ │ -
1161 {
│ │ │ │ -
1162 lowOrderOneDValues.resize(knotVector.size()-(order-1)-1);
│ │ │ │ -
1163 for (size_t j=0; j<lowOrderOneDValues.size(); j++)
│ │ │ │ -
1164 lowOrderOneDValues[j] = values[order-1][j];
│ │ │ │ -
1165 }
│ │ │ │ -
1166
│ │ │ │ -
1167 // Evaluate 1d function values of two order lower (needed for the (second) derivative formula)
│ │ │ │ -
1168 std::vector<R> lowOrderTwoDValues;
│ │ │ │ -
1169
│ │ │ │ -
1170 if (order>1 && evaluateHessian)
│ │ │ │ -
1171 {
│ │ │ │ -
1172 lowOrderTwoDValues.resize(knotVector.size()-(order-2)-1);
│ │ │ │ -
1173 for (size_t j=0; j<lowOrderTwoDValues.size(); j++)
│ │ │ │ -
1174 lowOrderTwoDValues[j] = values[order-2][j];
│ │ │ │ -
1175 }
│ │ │ │ -
1176
│ │ │ │ -
1177 // Evaluate 1d function derivatives
│ │ │ │ -
1178 if (evaluateJacobian)
│ │ │ │ -
1179 {
│ │ │ │ -
1180 outJac.resize(limit);
│ │ │ │ -
1181
│ │ │ │ -
1182 if (order==0) // order-zero functions are piecewise constant, hence all derivatives are zero
│ │ │ │ -
1183 std::fill(outJac.begin(), outJac.end(), R(0.0));
│ │ │ │ -
1184 else
│ │ │ │ -
1185 {
│ │ │ │ -
1186 for (size_t j=offset; j<offset+limit; j++)
│ │ │ │ -
1187 {
│ │ │ │ -
1188 R derivativeAddend1 = lowOrderOneDValues[j] / (knotVector[j+order]-knotVector[j]);
│ │ │ │ -
1189 R derivativeAddend2 = lowOrderOneDValues[j+1] / (knotVector[j+order+1]-knotVector[j+1]);
│ │ │ │ -
1190 // The two previous terms may evaluate as 0/0. This is to be interpreted as 0.
│ │ │ │ -
1191 if (std::isnan(derivativeAddend1))
│ │ │ │ -
1192 derivativeAddend1 = 0;
│ │ │ │ -
1193 if (std::isnan(derivativeAddend2))
│ │ │ │ -
1194 derivativeAddend2 = 0;
│ │ │ │ -
1195 outJac[j-offset] = order * ( derivativeAddend1 - derivativeAddend2 );
│ │ │ │ -
1196 }
│ │ │ │ -
1197 }
│ │ │ │ -
1198 }
│ │ │ │ -
1199
│ │ │ │ -
1200 // Evaluate 1d function second derivatives
│ │ │ │ -
1201 if (evaluateHessian)
│ │ │ │ -
1202 {
│ │ │ │ -
1203 outHess.resize(limit);
│ │ │ │ -
1204
│ │ │ │ -
1205 if (order<2) // order-zero functions are piecewise constant, hence all derivatives are zero
│ │ │ │ -
1206 std::fill(outHess.begin(), outHess.end(), R(0.0));
│ │ │ │ -
1207 else
│ │ │ │ -
1208 {
│ │ │ │ -
1209 for (size_t j=offset; j<offset+limit; j++)
│ │ │ │ -
1210 {
│ │ │ │ -
1211 assert(j+2 < lowOrderTwoDValues.size());
│ │ │ │ -
1212 R derivativeAddend1 = lowOrderTwoDValues[j] / (knotVector[j+order]-knotVector[j]) / (knotVector[j+order-1]-knotVector[j]);
│ │ │ │ -
1213 R derivativeAddend2 = lowOrderTwoDValues[j+1] / (knotVector[j+order]-knotVector[j]) / (knotVector[j+order]-knotVector[j+1]);
│ │ │ │ -
1214 R derivativeAddend3 = lowOrderTwoDValues[j+1] / (knotVector[j+order+1]-knotVector[j+1]) / (knotVector[j+order]-knotVector[j+1]);
│ │ │ │ -
1215 R derivativeAddend4 = lowOrderTwoDValues[j+2] / (knotVector[j+order+1]-knotVector[j+1]) / (knotVector[j+1+order]-knotVector[j+2]);
│ │ │ │ -
1216 // The two previous terms may evaluate as 0/0. This is to be interpreted as 0.
│ │ │ │ -
1217
│ │ │ │ -
1218 if (std::isnan(derivativeAddend1))
│ │ │ │ -
1219 derivativeAddend1 = 0;
│ │ │ │ -
1220 if (std::isnan(derivativeAddend2))
│ │ │ │ -
1221 derivativeAddend2 = 0;
│ │ │ │ -
1222 if (std::isnan(derivativeAddend3))
│ │ │ │ -
1223 derivativeAddend3 = 0;
│ │ │ │ -
1224 if (std::isnan(derivativeAddend4))
│ │ │ │ -
1225 derivativeAddend4 = 0;
│ │ │ │ -
1226 outHess[j-offset] = order * (order-1) * ( derivativeAddend1 - derivativeAddend2 -derivativeAddend3 + derivativeAddend4 );
│ │ │ │ -
1227 }
│ │ │ │ -
1228 }
│ │ │ │ -
1229 }
│ │ │ │ -
1230 }
│ │ │ │ -
1231
│ │ │ │ -
1232
│ │ │ │ -
1234 std::array<unsigned int, dim> order_;
│ │ │ │ -
1235
│ │ │ │ -
1237 std::array<std::vector<double>, dim> knotVectors_;
│ │ │ │ -
1238
│ │ │ │ -
1240 std::array<unsigned,dim> elements_;
│ │ │ │ -
1241
│ │ │ │ - │ │ │ │ -
1243};
│ │ │ │ -
1244
│ │ │ │ -
1245
│ │ │ │ -
1246
│ │ │ │ -
1247template<typename GV>
│ │ │ │ - │ │ │ │ -
1249 public LeafBasisNode
│ │ │ │ -
1250{
│ │ │ │ -
1251 static const int dim = GV::dimension;
│ │ │ │ -
1252
│ │ │ │ -
1253public:
│ │ │ │ -
1254
│ │ │ │ -
1255 using size_type = std::size_t;
│ │ │ │ -
1256 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ - │ │ │ │ -
1258
│ │ │ │ - │ │ │ │ -
1260 preBasis_(preBasis),
│ │ │ │ -
1261 finiteElement_(*preBasis)
│ │ │ │ -
1262 {}
│ │ │ │ -
1263
│ │ │ │ -
1265 const Element& element() const
│ │ │ │ -
1266 {
│ │ │ │ -
1267 return element_;
│ │ │ │ -
1268 }
│ │ │ │ -
1269
│ │ │ │ - │ │ │ │ -
1275 {
│ │ │ │ -
1276 return finiteElement_;
│ │ │ │ -
1277 }
│ │ │ │ -
1278
│ │ │ │ -
1280 void bind(const Element& e)
│ │ │ │ -
1281 {
│ │ │ │ -
1282 element_ = e;
│ │ │ │ -
1283 auto elementIndex = preBasis_->gridView().indexSet().index(e);
│ │ │ │ -
1284 finiteElement_.bind(preBasis_->getIJK(elementIndex,preBasis_->elements_));
│ │ │ │ -
1285 this->setSize(finiteElement_.size());
│ │ │ │ -
1286 }
│ │ │ │ -
1287
│ │ │ │ -
1288protected:
│ │ │ │ -
1289
│ │ │ │ - │ │ │ │ -
1291
│ │ │ │ - │ │ │ │ - │ │ │ │ -
1294};
│ │ │ │ -
1295
│ │ │ │ -
1296
│ │ │ │ -
1297
│ │ │ │ -
1298namespace BasisFactory {
│ │ │ │ -
1299
│ │ │ │ -
1306inline auto bSpline(const std::vector<double>& knotVector,
│ │ │ │ -
1307 unsigned int order,
│ │ │ │ -
1308 bool makeOpen = true)
│ │ │ │ -
1309{
│ │ │ │ -
1310 return [&knotVector, order, makeOpen](const auto& gridView) {
│ │ │ │ -
1311 return BSplinePreBasis<std::decay_t<decltype(gridView)>>(gridView, knotVector, order, makeOpen);
│ │ │ │ -
1312 };
│ │ │ │ -
1313}
│ │ │ │ -
1314
│ │ │ │ -
1315} // end namespace BasisFactory
│ │ │ │ -
1316
│ │ │ │ -
1317// *****************************************************************************
│ │ │ │ -
1318// This is the actual global basis implementation based on the reusable parts.
│ │ │ │ -
1319// *****************************************************************************
│ │ │ │ -
1320
│ │ │ │ -
1327template<typename GV>
│ │ │ │ - │ │ │ │ -
1329
│ │ │ │ -
1330
│ │ │ │ -
1331} // namespace Functions
│ │ │ │ -
1332
│ │ │ │ -
1333} // namespace Dune
│ │ │ │ -
1334
│ │ │ │ -
1335#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BSPLINEBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ -
auto bSpline(const std::vector< double > &knotVector, unsigned int order, bool makeOpen=true)
Create a pre-basis factory that can create a B-spline pre-basis.
Definition: bsplinebasis.hh:1306
│ │ │ │ +
260#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
auto makeComposedGridFunction(OF &&outerFunction, IF &&... innerFunction)
Create a ComposedGridFunction that composes grid-functions with another function.
Definition: composedgridfunction.hh:248
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
LocalFiniteElement in the sense of dune-localfunctions, for the B-spline basis on tensor-product grid...
Definition: bsplinebasis.hh:362
│ │ │ │ -
BSplineLocalFiniteElement(const BSplineLocalFiniteElement &other)
Copy constructor.
Definition: bsplinebasis.hh:383
│ │ │ │ -
const BSplinePreBasis< GV > & preBasis_
Definition: bsplinebasis.hh:474
│ │ │ │ -
const BSplineLocalInterpolation< dim, BSplineLocalBasis< GV, R > > & localInterpolation() const
Hand out a LocalInterpolation object.
Definition: bsplinebasis.hh:439
│ │ │ │ -
LocalFiniteElementTraits< BSplineLocalBasis< GV, R >, BSplineLocalCoefficients< dim >, BSplineLocalInterpolation< dim, BSplineLocalBasis< GV, R > > > Traits
Export various types related to this LocalFiniteElement.
Definition: bsplinebasis.hh:372
│ │ │ │ -
std::array< unsigned, dim > currentKnotSpan_
Definition: bsplinebasis.hh:481
│ │ │ │ -
BSplineLocalFiniteElement(const BSplinePreBasis< GV > &preBasis)
Constructor with a given B-spline basis.
Definition: bsplinebasis.hh:376
│ │ │ │ -
const BSplineLocalCoefficients< dim > & localCoefficients() const
Hand out a LocalCoefficients object.
Definition: bsplinebasis.hh:433
│ │ │ │ -
void bind(const std::array< unsigned, dim > &elementIdx)
Bind LocalFiniteElement to a specific knot span of the spline patch.
Definition: bsplinebasis.hh:394
│ │ │ │ -
BSplineLocalInterpolation< dim, BSplineLocalBasis< GV, R > > localInterpolation_
Definition: bsplinebasis.hh:478
│ │ │ │ -
GeometryType type() const
Return the reference element that the local finite element is defined on (here, a hypercube)
Definition: bsplinebasis.hh:455
│ │ │ │ -
unsigned size() const
Number of shape functions in this finite element.
Definition: bsplinebasis.hh:445
│ │ │ │ -
BSplineLocalCoefficients< dim > localCoefficients_
Definition: bsplinebasis.hh:477
│ │ │ │ -
unsigned int size(int i) const
Number of degrees of freedom for one coordinate direction.
Definition: bsplinebasis.hh:463
│ │ │ │ -
BSplineLocalBasis< GV, R > localBasis_
Definition: bsplinebasis.hh:476
│ │ │ │ -
const BSplineLocalBasis< GV, R > & localBasis() const
Hand out a LocalBasis object.
Definition: bsplinebasis.hh:427
│ │ │ │ -
Pre-basis for B-spline basis.
Definition: bsplinebasis.hh:499
│ │ │ │ -
static constexpr size_type multiIndexBufferSize
Definition: bsplinebasis.hh:567
│ │ │ │ -
std::array< unsigned, dim > elements_
Number of grid elements in the different coordinate directions.
Definition: bsplinebasis.hh:1240
│ │ │ │ -
GridView gridView_
Definition: bsplinebasis.hh:1242
│ │ │ │ -
double R
Definition: bsplinebasis.hh:570
│ │ │ │ -
static void evaluateFunctionFull(const typename GV::ctype &in, DynamicMatrix< R > &out, const std::vector< R > &knotVector, unsigned int order, unsigned int currentKnotSpan)
Evaluate all one-dimensional B-spline functions for a given coordinate direction.
Definition: bsplinebasis.hh:1085
│ │ │ │ -
void evaluateFunction(const FieldVector< typename GV::ctype, dim > &in, std::vector< FieldVector< R, 1 > > &out, const std::array< unsigned, dim > &currentKnotSpan) const
Evaluate all B-spline basis functions at a given point.
Definition: bsplinebasis.hh:781
│ │ │ │ -
std::array< unsigned int, dim > order_
Order of the B-spline for each space dimension.
Definition: bsplinebasis.hh:1234
│ │ │ │ -
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition: bsplinebasis.hh:719
│ │ │ │ -
static void evaluateAll(const typename GV::ctype &in, std::vector< R > &out, bool evaluateJacobian, std::vector< R > &outJac, bool evaluateHessian, std::vector< R > &outHess, const std::vector< R > &knotVector, unsigned int order, unsigned int currentKnotSpan)
Evaluate the second derivatives of all one-dimensional B-spline functions for a given coordinate dire...
Definition: bsplinebasis.hh:1128
│ │ │ │ -
static void evaluateFunction(const typename GV::ctype &in, std::vector< R > &out, const std::vector< R > &knotVector, unsigned int order, unsigned int currentKnotSpan)
Evaluate all one-dimensional B-spline functions for a given coordinate direction.
Definition: bsplinebasis.hh:1028
│ │ │ │ -
unsigned int size(size_t d) const
Number of shape functions in one direction.
Definition: bsplinebasis.hh:774
│ │ │ │ -
GV GridView
The grid view that the FE space is defined on.
Definition: bsplinebasis.hh:560
│ │ │ │ -
It indices(const Node &node, It it) const
Maps from subtree index set [0..size-1] to a globally unique multi index in global basis.
Definition: bsplinebasis.hh:735
│ │ │ │ -
void evaluate(const typename std::array< int, k > &directions, const FieldVector< typename GV::ctype, dim > &in, std::vector< FieldVector< R, 1 > > &out, const std::array< unsigned, dim > &currentKnotSpan) const
Evaluate Derivatives of all B-spline basis functions.
Definition: bsplinebasis.hh:913
│ │ │ │ -
std::size_t size_type
Definition: bsplinebasis.hh:561
│ │ │ │ -
static constexpr size_type maxMultiIndexSize
Definition: bsplinebasis.hh:565
│ │ │ │ -
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition: bsplinebasis.hh:686
│ │ │ │ -
void initializeIndices()
Initialize the global indices.
Definition: bsplinebasis.hh:676
│ │ │ │ -
size_type size(const Dune::ReservedVector< ST, i > &prefix) const
Return number of possible values for next position in multi index.
Definition: bsplinebasis.hh:712
│ │ │ │ -
unsigned int size() const
Total number of B-spline basis functions.
Definition: bsplinebasis.hh:765
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: bsplinebasis.hh:680
│ │ │ │ -
static std::array< unsigned int, dim > getIJK(typename GridView::IndexSet::IndexType idx, std::array< unsigned int, dim > elements)
Compute integer element coordinates from the element index.
Definition: bsplinebasis.hh:1009
│ │ │ │ -
Node makeNode() const
Create tree node.
Definition: bsplinebasis.hh:694
│ │ │ │ -
BSplinePreBasis(const GridView &gridView, const std::vector< double > &knotVector, unsigned int order, bool makeOpen=true)
Construct a B-spline basis for a given grid view and set of knot vectors.
Definition: bsplinebasis.hh:590
│ │ │ │ -
void evaluateJacobian(const FieldVector< typename GV::ctype, dim > &in, std::vector< FieldMatrix< R, 1, dim > > &out, const std::array< unsigned, dim > &currentKnotSpan) const
Evaluate Jacobian of all B-spline basis functions.
Definition: bsplinebasis.hh:812
│ │ │ │ -
static constexpr size_type minMultiIndexSize
Definition: bsplinebasis.hh:566
│ │ │ │ -
std::array< std::vector< double >, dim > knotVectors_
The knot vectors, one for each space dimension.
Definition: bsplinebasis.hh:1237
│ │ │ │ -
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition: bsplinebasis.hh:725
│ │ │ │ -
BSplinePreBasis(const GridView &gridView, const FieldVector< double, dim > &lowerLeft, const FieldVector< double, dim > &upperRight, const std::array< unsigned int, dim > &elements, unsigned int order, bool makeOpen=true)
Construct a B-spline basis for a given grid view with uniform knot vectors.
Definition: bsplinebasis.hh:642
│ │ │ │ -
LocalBasis class in the sense of dune-localfunctions, presenting the restriction of a B-spline patch ...
Definition: bsplinebasis.hh:46
│ │ │ │ -
LocalBasisTraits< D, dim, FieldVector< D, dim >, R, 1, FieldVector< R, 1 >, FieldMatrix< R, 1, dim > > Traits
export type traits for function signature
Definition: bsplinebasis.hh:55
│ │ │ │ -
unsigned int order() const
Polynomial order of the shape functions.
Definition: bsplinebasis.hh:140
│ │ │ │ -
std::size_t size() const
Return the number of basis functions on the current knot span.
Definition: bsplinebasis.hh:147
│ │ │ │ -
void evaluate(const typename std::array< int, k > &directions, const typename Traits::DomainType &in, std::vector< typename Traits::RangeType > &out) const
Evaluate all shape functions and derivatives of any order.
Definition: bsplinebasis.hh:97
│ │ │ │ -
void evaluateFunction(const FieldVector< D, dim > &in, std::vector< FieldVector< R, 1 > > &out) const
Evaluate all shape functions.
Definition: bsplinebasis.hh:70
│ │ │ │ -
void evaluateJacobian(const FieldVector< D, dim > &in, std::vector< FieldMatrix< D, 1, dim > > &out) const
Evaluate Jacobian of all shape functions.
Definition: bsplinebasis.hh:82
│ │ │ │ -
BSplineLocalBasis(const BSplinePreBasis< GV > &preBasis, const BSplineLocalFiniteElement< GV, R > &lFE)
Constructor with a given B-spline patch.
Definition: bsplinebasis.hh:61
│ │ │ │ -
Attaches a shape function to an entity.
Definition: bsplinebasis.hh:178
│ │ │ │ -
const LocalKey & localKey(std::size_t i) const
get i'th index
Definition: bsplinebasis.hh:321
│ │ │ │ -
void init(const std::array< unsigned, dim > &sizes)
Definition: bsplinebasis.hh:256
│ │ │ │ -
std::size_t size() const
number of coefficients
Definition: bsplinebasis.hh:315
│ │ │ │ -
Local interpolation in the sense of dune-localfunctions, for the B-spline basis on tensor-product gri...
Definition: bsplinebasis.hh:340
│ │ │ │ -
void interpolate(const F &f, std::vector< C > &out) const
Local interpolation of a function.
Definition: bsplinebasis.hh:344
│ │ │ │ -
Definition: bsplinebasis.hh:1250
│ │ │ │ -
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition: bsplinebasis.hh:1274
│ │ │ │ -
typename GV::template Codim< 0 >::Entity Element
Definition: bsplinebasis.hh:1256
│ │ │ │ -
const BSplinePreBasis< GV > * preBasis_
Definition: bsplinebasis.hh:1290
│ │ │ │ -
Element element_
Definition: bsplinebasis.hh:1293
│ │ │ │ -
void bind(const Element &e)
Bind to element.
Definition: bsplinebasis.hh:1280
│ │ │ │ -
BSplineNode(const BSplinePreBasis< GV > *preBasis)
Definition: bsplinebasis.hh:1259
│ │ │ │ -
const Element & element() const
Return current element, throw if unbound.
Definition: bsplinebasis.hh:1265
│ │ │ │ -
FiniteElement finiteElement_
Definition: bsplinebasis.hh:1292
│ │ │ │ -
std::size_t size_type
Definition: bsplinebasis.hh:1255
│ │ │ │ -
Global basis for given pre-basis.
Definition: defaultglobalbasis.hh:46
│ │ │ │ -
size_type size() const
Definition: nodes.hh:142
│ │ │ │ -
void setSize(const size_type size)
Definition: nodes.hh:164
│ │ │ │ -
Definition: nodes.hh:186
│ │ │ │ +
decltype(auto) resolveRef(T &&t)
This is an alias for Dune::resolveRef.
Definition: referencehelper.hh:37
│ │ │ │ +
Default implementation for derivative traits.
Definition: defaultderivativetraits.hh:37
│ │ │ │ +
Composition of grid functions with another function.
Definition: composedgridfunction.hh:42
│ │ │ │ +
OuterFunction outerFunction_
Definition: composedgridfunction.hh:219
│ │ │ │ +
InnerFunctions innerFunctions_
Definition: composedgridfunction.hh:220
│ │ │ │ +
ComposedGridFunction(OFT &&outerFunction, IFT &&... innerFunctions)
Create ComposedGridFunction.
Definition: composedgridfunction.hh:167
│ │ │ │ +
const EntitySet & entitySet() const
Return the EntitySet associated to this composed grid-function.
Definition: composedgridfunction.hh:205
│ │ │ │ +
typename InnerFunction< 0 >::EntitySet EntitySet
Definition: composedgridfunction.hh:53
│ │ │ │ +
typename EntitySet::LocalCoordinate LocalDomain
Definition: composedgridfunction.hh:57
│ │ │ │ +
typename EntitySet::Element Element
Definition: composedgridfunction.hh:54
│ │ │ │ +
InnerLocalFunctions innerLocalFunctions() const
Definition: composedgridfunction.hh:212
│ │ │ │ +
friend LocalFunction localFunction(const ComposedGridFunction &cgf)
Create a local-function of this composed grid-function.
Definition: composedgridfunction.hh:190
│ │ │ │ +
decltype(std::declval< OF >()(std::declval< IF >()(std::declval< Domain >())...)) Range
Definition: composedgridfunction.hh:59
│ │ │ │ +
typename EntitySet::GlobalCoordinate Domain
Definition: composedgridfunction.hh:56
│ │ │ │ +
Range operator()(const Domain &x) const
Evaluation of the composed grid function in coordinates x
Definition: composedgridfunction.hh:173
│ │ │ │ +
friend Traits::DerivativeInterface derivative(const ComposedGridFunction &t)
Not implemented.
Definition: composedgridfunction.hh:179
│ │ │ │ +
Definition: gridfunction.hh:32
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,1510 +4,244 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * functionspacebases │ │ │ │ │ -bsplinebasis.hh │ │ │ │ │ + * gridfunctions │ │ │ │ │ +composedgridfunction.hh │ │ │ │ │ Go_to_the_documentation_of_this_file. │ │ │ │ │ -1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ + 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ - 3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BSPLINEBASIS_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BSPLINEBASIS_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH │ │ │ │ │ 5 │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12 │ │ │ │ │ - 14#include │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8 │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11 │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14#include │ │ │ │ │ 15 │ │ │ │ │ - 16#include │ │ │ │ │ - 17#include │ │ │ │ │ - 18#include │ │ │ │ │ - 19#include │ │ │ │ │ - 20#include │ │ │ │ │ - 21#include │ │ │ │ │ - 22#include │ │ │ │ │ - 23 │ │ │ │ │ - 24namespace Dune │ │ │ │ │ - 25{ │ │ │ │ │ - 26namespace Functions { │ │ │ │ │ - 27 │ │ │ │ │ - 28// A maze of dependencies between the different parts of this. We need a few │ │ │ │ │ -forward declarations │ │ │ │ │ - 29template │ │ │ │ │ - 30class BSplineLocalFiniteElement; │ │ │ │ │ - 31 │ │ │ │ │ - 32template │ │ │ │ │ - 33class BSplinePreBasis; │ │ │ │ │ - 34 │ │ │ │ │ - 35 │ │ │ │ │ - 44template │ │ │ │ │ -45class BSplineLocalBasis │ │ │ │ │ - 46{ │ │ │ │ │ - 47 friend class BSplineLocalFiniteElement; │ │ │ │ │ + 16 │ │ │ │ │ + 17namespace Dune { │ │ │ │ │ + 18namespace Functions { │ │ │ │ │ + 19 │ │ │ │ │ + 20 │ │ │ │ │ + 21 │ │ │ │ │ + 40template │ │ │ │ │ +41class ComposedGridFunction │ │ │ │ │ + 42{ │ │ │ │ │ + 43 using InnerFunctions = std::tuple; │ │ │ │ │ + 44 using InnerLocalFunctions = std::tuple())))...>; │ │ │ │ │ + 45 │ │ │ │ │ + 46 template │ │ │ │ │ + 47 using InnerFunction = std::decay_t>>; │ │ │ │ │ 48 │ │ │ │ │ - 49 typedef typename GV::ctype D; │ │ │ │ │ - 50 enum {dim = GV::dimension}; │ │ │ │ │ + 49 using OuterFunction = OF; │ │ │ │ │ + 50 │ │ │ │ │ 51public: │ │ │ │ │ 52 │ │ │ │ │ - 54 typedef LocalBasisTraits,R,1,FieldVector, │ │ │ │ │ -55 FieldMatrix > Traits; │ │ │ │ │ - 56 │ │ │ │ │ -61 BSplineLocalBasis(const BSplinePreBasis& preBasis, │ │ │ │ │ - 62 const BSplineLocalFiniteElement& lFE) │ │ │ │ │ - 63 : preBasis_(preBasis), │ │ │ │ │ - 64 lFE_(lFE) │ │ │ │ │ - 65 {} │ │ │ │ │ - 66 │ │ │ │ │ -70 void evaluateFunction (const FieldVector& in, │ │ │ │ │ - 71 std::vector >& out) const │ │ │ │ │ - 72 { │ │ │ │ │ - 73 FieldVector globalIn = offset_; │ │ │ │ │ - 74 scaling_.umv(in,globalIn); │ │ │ │ │ - 75 │ │ │ │ │ - 76 preBasis_.evaluateFunction(globalIn, out, lFE_.currentKnotSpan_); │ │ │ │ │ - 77 } │ │ │ │ │ +53 using EntitySet = typename InnerFunction<0>::EntitySet; │ │ │ │ │ +54 using Element = typename EntitySet::Element; │ │ │ │ │ + 55 │ │ │ │ │ +56 using Domain = typename EntitySet::GlobalCoordinate; │ │ │ │ │ +57 using LocalDomain = typename EntitySet::LocalCoordinate; │ │ │ │ │ + 58 │ │ │ │ │ +59 using Range = decltype(std::declval()(std::declval()(std:: │ │ │ │ │ +declval())...)); │ │ │ │ │ + 60 │ │ │ │ │ + 61private: │ │ │ │ │ + 62 │ │ │ │ │ + 63 using Traits = Imp::GridFunctionTraits; │ │ │ │ │ + 64 │ │ │ │ │ + 65 class LocalFunction │ │ │ │ │ + 66 { │ │ │ │ │ + 67 public: │ │ │ │ │ + 74 LocalFunction(const ComposedGridFunction& globalFunction) : │ │ │ │ │ + 75 globalFunction_(globalFunction), │ │ │ │ │ + 76 innerLocalFunctions_(globalFunction.innerLocalFunctions()) │ │ │ │ │ + 77 {} │ │ │ │ │ 78 │ │ │ │ │ -82 void evaluateJacobian (const FieldVector& in, │ │ │ │ │ - 83 std::vector >& out) const │ │ │ │ │ - 84 { │ │ │ │ │ - 85 FieldVector globalIn = offset_; │ │ │ │ │ - 86 scaling_.umv(in,globalIn); │ │ │ │ │ - 87 │ │ │ │ │ - 88 preBasis_.evaluateJacobian(globalIn, out, lFE_.currentKnotSpan_); │ │ │ │ │ - 89 │ │ │ │ │ - 90 for (size_t i=0; i │ │ │ │ │ -97 inline void evaluate (const typename std::array& directions, │ │ │ │ │ - 98 const typename Traits::DomainType& in, │ │ │ │ │ - 99 std::vector& out) const │ │ │ │ │ - 100 { │ │ │ │ │ - 101 switch(k) │ │ │ │ │ - 102 { │ │ │ │ │ - 103 case 0: │ │ │ │ │ - 104 evaluateFunction(in, out); │ │ │ │ │ - 105 break; │ │ │ │ │ - 106 case 1: │ │ │ │ │ - 107 { │ │ │ │ │ - 108 FieldVector globalIn = offset_; │ │ │ │ │ - 109 scaling_.umv(in,globalIn); │ │ │ │ │ - 110 │ │ │ │ │ - 111 preBasis_.evaluate(directions, globalIn, out, lFE_.currentKnotSpan_); │ │ │ │ │ - 112 │ │ │ │ │ - 113 for (size_t i=0; i globalIn = offset_; │ │ │ │ │ - 120 scaling_.umv(in,globalIn); │ │ │ │ │ - 121 │ │ │ │ │ - 122 preBasis_.evaluate(directions, globalIn, out, lFE_.currentKnotSpan_); │ │ │ │ │ - 123 │ │ │ │ │ - 124 for (size_t i=0; i& preBasis_; │ │ │ │ │ + 96 void unbind() │ │ │ │ │ + 97 { │ │ │ │ │ + 98 std::apply([&](auto&... innerFunction) { │ │ │ │ │ + 99 (innerFunction.unbind(),...); │ │ │ │ │ + 100 }, innerLocalFunctions_); │ │ │ │ │ + 101 } │ │ │ │ │ + 102 │ │ │ │ │ + 105 bool bound() const │ │ │ │ │ + 106 { │ │ │ │ │ + 107 return std::apply([](const auto&... innerFunction) { │ │ │ │ │ + 108 return (innerFunction.bound() && ...); │ │ │ │ │ + 109 }, innerLocalFunctions_); │ │ │ │ │ + 110 } │ │ │ │ │ + 111 │ │ │ │ │ + 121 Range operator()(const LocalDomain& x) const │ │ │ │ │ + 122 { │ │ │ │ │ + 123 return std::apply([&](const auto&... innerFunction) { │ │ │ │ │ + 124 return globalFunction_.outerFunction_(innerFunction(x)...); │ │ │ │ │ + 125 }, innerLocalFunctions_); │ │ │ │ │ + 126 } │ │ │ │ │ + 127 │ │ │ │ │ + 137 const Element& localContext() const │ │ │ │ │ + 138 { │ │ │ │ │ + 139 return std::get<0>(innerLocalFunctions_).localContext(); │ │ │ │ │ + 140 } │ │ │ │ │ + 141 │ │ │ │ │ + 143 friend typename Traits::LocalFunctionTraits::DerivativeInterface │ │ │ │ │ +derivative(const LocalFunction& t) │ │ │ │ │ + 144 { │ │ │ │ │ + 145 DUNE_THROW(NotImplemented,"not implemented"); │ │ │ │ │ + 146 } │ │ │ │ │ + 147 │ │ │ │ │ + 148 private: │ │ │ │ │ + 149 const ComposedGridFunction& globalFunction_; │ │ │ │ │ + 150 InnerLocalFunctions innerLocalFunctions_; │ │ │ │ │ + 151 }; │ │ │ │ │ + 152 │ │ │ │ │ + 153public: │ │ │ │ │ 154 │ │ │ │ │ - 155 const BSplineLocalFiniteElement& lFE_; │ │ │ │ │ - 156 │ │ │ │ │ - 157 // Coordinates in a single knot span differ from coordinates on the B- │ │ │ │ │ -spline patch │ │ │ │ │ - 158 // by an affine transformation. This transformation is stored in offset_ │ │ │ │ │ -and scaling_. │ │ │ │ │ - 159 FieldVector offset_; │ │ │ │ │ - 160 DiagonalMatrix scaling_; │ │ │ │ │ - 161}; │ │ │ │ │ - 162 │ │ │ │ │ - 176template │ │ │ │ │ -177class BSplineLocalCoefficients │ │ │ │ │ - 178{ │ │ │ │ │ - 179 // Return i as a d-digit number in the (k+1)-nary system │ │ │ │ │ - 180 std::array multiindex (unsigned int i) const │ │ │ │ │ - 181 { │ │ │ │ │ - 182 std::array alpha; │ │ │ │ │ - 183 for (int j=0; j& subEntity) │ │ │ │ │ - 193 { │ │ │ │ │ - 194 if (sizes_[0]==1) │ │ │ │ │ - 195 { │ │ │ │ │ - 196 subEntity[0] = 0; │ │ │ │ │ - 197 return; │ │ │ │ │ - 198 } │ │ │ │ │ - 199 │ │ │ │ │ - 200 /* edge and vertex numbering │ │ │ │ │ - 201 0----0----1 │ │ │ │ │ - 202 */ │ │ │ │ │ - 203 unsigned lastIndex=0; │ │ │ │ │ - 204 subEntity[lastIndex++] = 0; // corner 0 │ │ │ │ │ - 205 for (unsigned i = 0; i < sizes_[0] - 2; ++i) │ │ │ │ │ - 206 subEntity[lastIndex++] = 0; // inner dofs of element (0) │ │ │ │ │ - 207 │ │ │ │ │ - 208 subEntity[lastIndex++] = 1; // corner 1 │ │ │ │ │ + 164 template = 0, │ │ │ │ │ + 166 std::enable_if_t<(sizeof...(IFT) > 0), int> = 0> │ │ │ │ │ +167 ComposedGridFunction(OFT&& outerFunction, IFT&&... innerFunctions) : │ │ │ │ │ + 168 outerFunction_(std::forward(outerFunction)), │ │ │ │ │ + 169 innerFunctions_(std::forward(innerFunctions)...) │ │ │ │ │ + 170 {} │ │ │ │ │ + 171 │ │ │ │ │ +173 Range operator()(const Domain& x) const │ │ │ │ │ + 174 { │ │ │ │ │ + 175 DUNE_THROW(NotImplemented,"not implemented"); │ │ │ │ │ + 176 } │ │ │ │ │ + 177 │ │ │ │ │ +179 friend typename Traits::DerivativeInterface derivative(const │ │ │ │ │ +ComposedGridFunction& t) │ │ │ │ │ + 180 { │ │ │ │ │ + 181 DUNE_THROW(NotImplemented,"not implemented"); │ │ │ │ │ + 182 } │ │ │ │ │ + 183 │ │ │ │ │ +190 friend LocalFunction localFunction(const ComposedGridFunction& cgf) │ │ │ │ │ + 191 { │ │ │ │ │ + 192 return LocalFunction(cgf); │ │ │ │ │ + 193 } │ │ │ │ │ + 194 │ │ │ │ │ +205 const EntitySet& entitySet() const │ │ │ │ │ + 206 { │ │ │ │ │ + 207 return resolveRef(std::get<0>(innerFunctions_)).entitySet(); │ │ │ │ │ + 208 } │ │ │ │ │ 209 │ │ │ │ │ - 210 assert(size()==lastIndex); │ │ │ │ │ - 211 } │ │ │ │ │ - 212 │ │ │ │ │ - 213 void setup2d(std::vector& subEntity) │ │ │ │ │ - 214 { │ │ │ │ │ - 215 unsigned lastIndex=0; │ │ │ │ │ - 216 │ │ │ │ │ - 217 // LocalKey: entity number , entity codim, dof indices within each entity │ │ │ │ │ - 218 /* edge and vertex numbering │ │ │ │ │ - 219 2----3----3 │ │ │ │ │ - 220 | | │ │ │ │ │ - 221 | | │ │ │ │ │ - 222 0 1 │ │ │ │ │ - 223 | | │ │ │ │ │ - 224 | | │ │ │ │ │ - 225 0----2----1 │ │ │ │ │ - 226 */ │ │ │ │ │ - 227 │ │ │ │ │ - 228 // lower edge (2) │ │ │ │ │ - 229 subEntity[lastIndex++] = 0; // corner 0 │ │ │ │ │ - 230 for (unsigned i = 0; i < sizes_[0]-2; ++i) │ │ │ │ │ - 231 subEntity[lastIndex++] = 2; // inner dofs of lower edge (2) │ │ │ │ │ - 232 │ │ │ │ │ - 233 subEntity[lastIndex++] = 1; // corner 1 │ │ │ │ │ - 234 │ │ │ │ │ - 235 // iterate from bottom to top over inner edge dofs │ │ │ │ │ - 236 for (unsigned e = 0; e < sizes_[1]-2; ++e) │ │ │ │ │ - 237 { │ │ │ │ │ - 238 subEntity[lastIndex++] = 0; // left edge (0) │ │ │ │ │ - 239 for (unsigned i = 0; i < sizes_[0]-2; ++i) │ │ │ │ │ - 240 subEntity[lastIndex++] = 0; // face dofs │ │ │ │ │ - 241 subEntity[lastIndex++] = 1; // right edge (1) │ │ │ │ │ - 242 } │ │ │ │ │ - 243 │ │ │ │ │ - 244 // upper edge (3) │ │ │ │ │ - 245 subEntity[lastIndex++] = 2; // corner 2 │ │ │ │ │ - 246 for (unsigned i = 0; i < sizes_[0]-2; ++i) │ │ │ │ │ - 247 subEntity[lastIndex++] = 3; // inner dofs of upper edge (3) │ │ │ │ │ - 248 │ │ │ │ │ - 249 subEntity[lastIndex++] = 3; // corner 3 │ │ │ │ │ - 250 │ │ │ │ │ - 251 assert(size()==lastIndex); │ │ │ │ │ - 252 } │ │ │ │ │ + 210protected: │ │ │ │ │ + 211 │ │ │ │ │ +212 InnerLocalFunctions innerLocalFunctions() const │ │ │ │ │ + 213 { │ │ │ │ │ + 214 return std::apply([&](const auto&... innerFunction) { │ │ │ │ │ + 215 return std::make_tuple(localFunction(resolveRef(innerFunction))...); │ │ │ │ │ + 216 }, innerFunctions_); │ │ │ │ │ + 217 } │ │ │ │ │ + 218 │ │ │ │ │ +219 OuterFunction outerFunction_; │ │ │ │ │ +220 InnerFunctions innerFunctions_; │ │ │ │ │ + 221}; │ │ │ │ │ + 222 │ │ │ │ │ + 223 │ │ │ │ │ + 224 │ │ │ │ │ + 247template │ │ │ │ │ +248auto makeComposedGridFunction(OF&& outerFunction, IF&&... innerFunction) │ │ │ │ │ + 249{ │ │ │ │ │ + 250 using ComposedGridFunctionType = ComposedGridFunction, │ │ │ │ │ +std::decay_t...>; │ │ │ │ │ + 251 return ComposedGridFunctionType(std::forward(outerFunction), std:: │ │ │ │ │ +forward(innerFunction)...); │ │ │ │ │ + 252} │ │ │ │ │ 253 │ │ │ │ │ 254 │ │ │ │ │ - 255public: │ │ │ │ │ -256 void init(const std::array& sizes) │ │ │ │ │ - 257 { │ │ │ │ │ - 258 sizes_ = sizes; │ │ │ │ │ + 255 │ │ │ │ │ + 256}} // namespace Dune::Functions │ │ │ │ │ + 257 │ │ │ │ │ + 258 │ │ │ │ │ 259 │ │ │ │ │ - 260 li_.resize(size()); │ │ │ │ │ - 261 │ │ │ │ │ - 262 // Set up array of codimension-per-dof-number │ │ │ │ │ - 263 std::vector codim(li_.size()); │ │ │ │ │ - 264 │ │ │ │ │ - 265 for (std::size_t i=0; i mIdx = multiindex(i); │ │ │ │ │ - 271 for (int j=0; j index(size()); │ │ │ │ │ - 282 │ │ │ │ │ - 283 for (std::size_t i=0; i mIdx = multiindex(i); │ │ │ │ │ - 288 │ │ │ │ │ - 289 for (int j=dim-1; j>=0; j--) │ │ │ │ │ - 290 if (mIdx[j]>0 and mIdx[j] subEntity(li_.size()); │ │ │ │ │ - 296 │ │ │ │ │ - 297 if (subEntity.size() > 0) │ │ │ │ │ - 298 { │ │ │ │ │ - 299 if (dim==1) { │ │ │ │ │ - 300 │ │ │ │ │ - 301 setup1d(subEntity); │ │ │ │ │ - 302 │ │ │ │ │ - 303 } else if (dim==2 and sizes_[0]>1 and sizes_[1]>1) { │ │ │ │ │ - 304 │ │ │ │ │ - 305 setup2d(subEntity); │ │ │ │ │ - 306 │ │ │ │ │ - 307 } │ │ │ │ │ - 308 } │ │ │ │ │ - 309 │ │ │ │ │ - 310 for (size_t i=0; i()); │ │ │ │ │ - 318 } │ │ │ │ │ - 319 │ │ │ │ │ -321 const LocalKey& localKey (std::size_t i) const │ │ │ │ │ - 322 { │ │ │ │ │ - 323 return li_[i]; │ │ │ │ │ - 324 } │ │ │ │ │ - 325 │ │ │ │ │ - 326private: │ │ │ │ │ - 327 │ │ │ │ │ - 328 // Number of shape functions on this element per coordinate direction │ │ │ │ │ - 329 std::array sizes_; │ │ │ │ │ - 330 │ │ │ │ │ - 331 std::vector li_; │ │ │ │ │ - 332}; │ │ │ │ │ - 333 │ │ │ │ │ - 338template │ │ │ │ │ -339class BSplineLocalInterpolation │ │ │ │ │ - 340{ │ │ │ │ │ - 341public: │ │ │ │ │ - 343 template │ │ │ │ │ -344 void interpolate (const F& f, std::vector& out) const │ │ │ │ │ - 345 { │ │ │ │ │ - 346 DUNE_THROW(NotImplemented, "BSplineLocalInterpolation::interpolate"); │ │ │ │ │ - 347 } │ │ │ │ │ - 348 │ │ │ │ │ - 349}; │ │ │ │ │ - 350 │ │ │ │ │ - 360template │ │ │ │ │ -361class BSplineLocalFiniteElement │ │ │ │ │ - 362{ │ │ │ │ │ -363 typedef typename GV::ctype D; │ │ │ │ │ - 364 enum {dim = GV::dimension}; │ │ │ │ │ - 365 friend class BSplineLocalBasis; │ │ │ │ │ - 366public: │ │ │ │ │ - 367 │ │ │ │ │ - 370 typedef LocalFiniteElementTraits, │ │ │ │ │ - 371 BSplineLocalCoefficients, │ │ │ │ │ -372 BSplineLocalInterpolation > > Traits; │ │ │ │ │ - 373 │ │ │ │ │ -376 BSplineLocalFiniteElement(const BSplinePreBasis& preBasis) │ │ │ │ │ - 377 : preBasis_(preBasis), │ │ │ │ │ - 378 localBasis_(preBasis,*this) │ │ │ │ │ - 379 {} │ │ │ │ │ - 380 │ │ │ │ │ -383 BSplineLocalFiniteElement(const BSplineLocalFiniteElement& other) │ │ │ │ │ - 384 : preBasis_(other.preBasis_), │ │ │ │ │ - 385 localBasis_(preBasis_,*this) │ │ │ │ │ - 386 {} │ │ │ │ │ - 387 │ │ │ │ │ -394 void bind(const std::array& elementIdx) │ │ │ │ │ - 395 { │ │ │ │ │ - 396 /* \todo In the long run we need to precompute a table for this */ │ │ │ │ │ - 397 for (size_t i=0; i sizes; │ │ │ │ │ - 421 for (size_t i=0; i& localBasis() const │ │ │ │ │ - 428 { │ │ │ │ │ - 429 return localBasis_; │ │ │ │ │ - 430 } │ │ │ │ │ - 431 │ │ │ │ │ -433 const BSplineLocalCoefficients& localCoefficients() const │ │ │ │ │ - 434 { │ │ │ │ │ - 435 return localCoefficients_; │ │ │ │ │ - 436 } │ │ │ │ │ - 437 │ │ │ │ │ -439 const BSplineLocalInterpolation >& │ │ │ │ │ -localInterpolation() const │ │ │ │ │ - 440 { │ │ │ │ │ - 441 return localInterpolation_; │ │ │ │ │ - 442 } │ │ │ │ │ - 443 │ │ │ │ │ -445 unsigned size () const │ │ │ │ │ - 446 { │ │ │ │ │ - 447 std::size_t r = 1; │ │ │ │ │ - 448 for (int i=0; i (preBasis_.knotVectors_[i].size() - currentKnotSpan_[i] - │ │ │ │ │ -2) ) │ │ │ │ │ - 470 r -= order[i] - (preBasis_.knotVectors_[i].size() - currentKnotSpan_[i] - │ │ │ │ │ -2); │ │ │ │ │ - 471 return r; │ │ │ │ │ - 472 } │ │ │ │ │ - 473 │ │ │ │ │ -474 const BSplinePreBasis& preBasis_; │ │ │ │ │ - 475 │ │ │ │ │ -476 BSplineLocalBasis localBasis_; │ │ │ │ │ -477 BSplineLocalCoefficients localCoefficients_; │ │ │ │ │ -478 BSplineLocalInterpolation > │ │ │ │ │ -localInterpolation_; │ │ │ │ │ - 479 │ │ │ │ │ - 480 // The knot span we are bound to │ │ │ │ │ -481 std::array currentKnotSpan_; │ │ │ │ │ - 482}; │ │ │ │ │ - 483 │ │ │ │ │ - 484 │ │ │ │ │ - 485template │ │ │ │ │ - 486class BSplineNode; │ │ │ │ │ - 487 │ │ │ │ │ - 497template │ │ │ │ │ -498class BSplinePreBasis │ │ │ │ │ - 499{ │ │ │ │ │ - 500 static const int dim = GV::dimension; │ │ │ │ │ - 501 │ │ │ │ │ - 503 class MultiDigitCounter │ │ │ │ │ - 504 { │ │ │ │ │ - 505 public: │ │ │ │ │ - 506 │ │ │ │ │ - 510 MultiDigitCounter(const std::array& limits) │ │ │ │ │ - 511 : limits_(limits) │ │ │ │ │ - 512 { │ │ │ │ │ - 513 std::fill(counter_.begin(), counter_.end(), 0); │ │ │ │ │ - 514 } │ │ │ │ │ - 515 │ │ │ │ │ - 517 MultiDigitCounter& operator++() │ │ │ │ │ - 518 { │ │ │ │ │ - 519 for (int i=0; i limits_; │ │ │ │ │ - 551 │ │ │ │ │ - 553 std::array counter_; │ │ │ │ │ - 554 │ │ │ │ │ - 555 }; │ │ │ │ │ - 556 │ │ │ │ │ - 557public: │ │ │ │ │ - 558 │ │ │ │ │ -560 using GridView = GV; │ │ │ │ │ -561 using size_type = std::size_t; │ │ │ │ │ - 562 │ │ │ │ │ -563 using Node = BSplineNode; │ │ │ │ │ - 564 │ │ │ │ │ -565 static constexpr size_type maxMultiIndexSize = 1; │ │ │ │ │ -566 static constexpr size_type minMultiIndexSize = 1; │ │ │ │ │ -567 static constexpr size_type multiIndexBufferSize = 1; │ │ │ │ │ - 568 │ │ │ │ │ - 569 // Type used for function values │ │ │ │ │ -570 using R = double; │ │ │ │ │ - 571 │ │ │ │ │ -590 BSplinePreBasis(const GridView& gridView, │ │ │ │ │ - 591 const std::vector& knotVector, │ │ │ │ │ - 592 unsigned int order, │ │ │ │ │ - 593 bool makeOpen = true) │ │ │ │ │ - 594 : gridView_(gridView) │ │ │ │ │ - 595 { │ │ │ │ │ - 596 // \todo Detection of duplicate knots │ │ │ │ │ - 597 std::fill(elements_.begin(), elements_.end(), knotVector.size()-1); │ │ │ │ │ - 598 │ │ │ │ │ - 599 // Mediocre sanity check: we don't know the number of grid elements in │ │ │ │ │ -each direction. │ │ │ │ │ - 600 // but at least we know the total number of elements. │ │ │ │ │ - 601 assert( std::accumulate(elements_.begin(), elements_.end(), 1, std:: │ │ │ │ │ -multiplies()) == gridView_.size(0) ); │ │ │ │ │ - 602 │ │ │ │ │ - 603 for (int i=0; i& lowerLeft, │ │ │ │ │ - 644 const FieldVector& upperRight, │ │ │ │ │ - 645 const std::array& elements, │ │ │ │ │ - 646 unsigned int order, │ │ │ │ │ - 647 bool makeOpen = true) │ │ │ │ │ - 648 : elements_(elements), │ │ │ │ │ - 649 gridView_(gridView) │ │ │ │ │ - 650 { │ │ │ │ │ - 651 // Mediocre sanity check: we don't know the number of grid elements in │ │ │ │ │ -each direction. │ │ │ │ │ - 652 // but at least we know the total number of elements. │ │ │ │ │ - 653 assert( std::accumulate(elements_.begin(), elements_.end(), 1, std:: │ │ │ │ │ -multiplies()) == gridView_.size(0) ); │ │ │ │ │ - 654 │ │ │ │ │ - 655 for (int i=0; i │ │ │ │ │ - 702 // size_type size(const SizePrefix& prefix) const │ │ │ │ │ - 703 // │ │ │ │ │ - 704 // But leads to ambiguity with the other size method: │ │ │ │ │ - 705 // │ │ │ │ │ - 706 // unsigned int size (size_t d) const │ │ │ │ │ - 707 // │ │ │ │ │ - 708 // Once the latter is removed, this implementation should be changed. │ │ │ │ │ - 709 │ │ │ │ │ - 711 template │ │ │ │ │ -712 size_type size(const Dune::ReservedVector& prefix) const │ │ │ │ │ - 713 { │ │ │ │ │ - 714 assert(prefix.size() == 0 || prefix.size() == 1); │ │ │ │ │ - 715 return (prefix.size() == 0) ? size() : 0; │ │ │ │ │ - 716 } │ │ │ │ │ - 717 │ │ │ │ │ -719 size_type dimension() const │ │ │ │ │ - 720 { │ │ │ │ │ - 721 return size(); │ │ │ │ │ - 722 } │ │ │ │ │ - 723 │ │ │ │ │ -725 size_type maxNodeSize() const │ │ │ │ │ - 726 { │ │ │ │ │ - 727 size_type result = 1; │ │ │ │ │ - 728 for (int i=0; i │ │ │ │ │ -735 It indices(const Node& node, It it) const │ │ │ │ │ - 736 { │ │ │ │ │ - 737 // Local degrees of freedom are arranged in a lattice. │ │ │ │ │ - 738 // We need the lattice dimensions to be able to compute lattice │ │ │ │ │ -coordinates from a local index │ │ │ │ │ - 739 std::array localSizes; │ │ │ │ │ - 740 for (int i=0; i localIJK = getIJK(i, localSizes); │ │ │ │ │ - 745 │ │ │ │ │ - 746 const auto currentKnotSpan = node.finiteElement().currentKnotSpan_; │ │ │ │ │ - 747 const auto order = order_; │ │ │ │ │ - 748 │ │ │ │ │ - 749 std::array globalIJK; │ │ │ │ │ - 750 for (int i=0; i=0; i--) │ │ │ │ │ - 757 globalIdx = globalIdx * size(i) + globalIJK[i]; │ │ │ │ │ - 758 │ │ │ │ │ - 759 *it = {{globalIdx}}; │ │ │ │ │ - 760 } │ │ │ │ │ - 761 return it; │ │ │ │ │ - 762 } │ │ │ │ │ - 763 │ │ │ │ │ -765 unsigned int size () const │ │ │ │ │ - 766 { │ │ │ │ │ - 767 unsigned int result = 1; │ │ │ │ │ - 768 for (size_t i=0; i& in, │ │ │ │ │ - 782 std::vector >& out, │ │ │ │ │ - 783 const std::array& currentKnotSpan) const │ │ │ │ │ - 784 { │ │ │ │ │ - 785 // Evaluate │ │ │ │ │ - 786 std::array, dim> oneDValues; │ │ │ │ │ - 787 │ │ │ │ │ - 788 for (size_t i=0; i limits; │ │ │ │ │ - 792 for (int i=0; i& in, │ │ │ │ │ - 813 std::vector >& out, │ │ │ │ │ - 814 const std::array& currentKnotSpan) const │ │ │ │ │ - 815 { │ │ │ │ │ - 816 // How many shape functions to we have in each coordinate direction? │ │ │ │ │ - 817 std::array limits; │ │ │ │ │ - 818 for (int i=0; i (knotVectors_[i].size() - currentKnotSpan[i] - 2) ) │ │ │ │ │ - 824 limits[i] -= order_[i] - (knotVectors_[i].size() - currentKnotSpan[i] - │ │ │ │ │ -2); │ │ │ │ │ - 825 } │ │ │ │ │ - 826 │ │ │ │ │ - 827 // The lowest knot spans that we need values from │ │ │ │ │ - 828 std::array offset; │ │ │ │ │ - 829 for (int i=0; i, dim> oneDValues; │ │ │ │ │ - 834 │ │ │ │ │ - 835 // Evaluate 1d function values of one order lower (needed for the │ │ │ │ │ -derivative formula) │ │ │ │ │ - 836 std::array, dim> lowOrderOneDValues; │ │ │ │ │ - 837 │ │ │ │ │ - 838 std::array, dim> values; │ │ │ │ │ - 839 │ │ │ │ │ - 840 for (size_t i=0; i, dim> oneDDerivatives; │ │ │ │ │ - 858 for (size_t i=0; i, dim> oneDValuesShort; │ │ │ │ │ - 883 │ │ │ │ │ - 884 for (int i=0; i │ │ │ │ │ -913 void evaluate(const typename std::array& directions, │ │ │ │ │ - 914 const FieldVector& in, │ │ │ │ │ - 915 std::vector >& out, │ │ │ │ │ - 916 const std::array& currentKnotSpan) const │ │ │ │ │ - 917 { │ │ │ │ │ - 918 if (k != 1 && k != 2) │ │ │ │ │ - 919 DUNE_THROW(RangeError, "Differentiation order greater than 2 is not │ │ │ │ │ -supported!"); │ │ │ │ │ - 920 │ │ │ │ │ - 921 // Evaluate 1d function values (needed for the product rule) │ │ │ │ │ - 922 std::array, dim> oneDValues; │ │ │ │ │ - 923 std::array, dim> oneDDerivatives; │ │ │ │ │ - 924 std::array, dim> oneDSecondDerivatives; │ │ │ │ │ - 925 │ │ │ │ │ - 926 // Evaluate 1d function derivatives │ │ │ │ │ - 927 if (k==1) │ │ │ │ │ - 928 for (size_t i=0; i offset; │ │ │ │ │ - 936 for (int i=0; i limits; │ │ │ │ │ - 941 for (int i=0; i (knotVectors_[i].size() - currentKnotSpan[i] - 2) ) │ │ │ │ │ - 949 limits[i] -= order_[i] - (knotVectors_[i].size() - currentKnotSpan[i] - │ │ │ │ │ -2); │ │ │ │ │ - 950 } │ │ │ │ │ - 951 │ │ │ │ │ - 952 // Working towards computing only the parts that we really need: │ │ │ │ │ - 953 // Let's copy them out into a separate array │ │ │ │ │ - 954 std::array, dim> oneDValuesShort; │ │ │ │ │ - 955 │ │ │ │ │ - 956 for (int i=0; i getIJK(typename GridView::IndexSet:: │ │ │ │ │ -IndexType idx, std::array elements) │ │ │ │ │ - 1010 { │ │ │ │ │ - 1011 std::array result; │ │ │ │ │ - 1012 for (int i=0; i& out, │ │ │ │ │ - 1029 const std::vector& knotVector, │ │ │ │ │ - 1030 unsigned int order, │ │ │ │ │ - 1031 unsigned int currentKnotSpan) │ │ │ │ │ - 1032 { │ │ │ │ │ - 1033 std::size_t outSize = order+1; // The 'standard' value away from the │ │ │ │ │ -boundaries of the knot vector │ │ │ │ │ - 1034 if (currentKnotSpan (knotVector.size() - currentKnotSpan - 2) ) │ │ │ │ │ - 1037 outSize -= order - (knotVector.size() - currentKnotSpan - 2); │ │ │ │ │ - 1038 out.resize(outSize); │ │ │ │ │ - 1039 │ │ │ │ │ - 1040 // It's not really a matrix that is needed here, a plain 2d array would │ │ │ │ │ -do │ │ │ │ │ - 1041 DynamicMatrix N(order+1, knotVector.size()-1); │ │ │ │ │ - 1042 │ │ │ │ │ - 1043 // The text books on splines use the following geometric condition here │ │ │ │ │ -to fill the array N │ │ │ │ │ - 1044 // (see for example Cottrell, Hughes, Bazilevs, Formula (2.1). However, │ │ │ │ │ -this condition │ │ │ │ │ - 1045 // only works if splines are never evaluated exactly on the knots. │ │ │ │ │ - 1046 // │ │ │ │ │ - 1047 // for (size_t i=0; i 1e-10) │ │ │ │ │ - 1056 ? (in - knotVector[i]) / (knotVector[i+r] - knotVector[i]) │ │ │ │ │ - 1057 : 0; │ │ │ │ │ - 1058 R factor2 = ((knotVector[i+r+1] - knotVector[i+1]) > 1e-10) │ │ │ │ │ - 1059 ? (knotVector[i+r+1] - in) / (knotVector[i+r+1] - knotVector[i+1]) │ │ │ │ │ - 1060 : 0; │ │ │ │ │ - 1061 N[r][i] = factor1 * N[r-1][i] + factor2 * N[r-1][i+1]; │ │ │ │ │ - 1062 } │ │ │ │ │ - 1063 │ │ │ │ │ - 1068 for (size_t i=0; i& out, │ │ │ │ │ - 1087 const std::vector& knotVector, │ │ │ │ │ - 1088 unsigned int order, │ │ │ │ │ - 1089 unsigned int currentKnotSpan) │ │ │ │ │ - 1090 { │ │ │ │ │ - 1091 // It's not really a matrix that is needed here, a plain 2d array would │ │ │ │ │ -do │ │ │ │ │ - 1092 DynamicMatrix& N = out; │ │ │ │ │ - 1093 │ │ │ │ │ - 1094 N.resize(order+1, knotVector.size()-1); │ │ │ │ │ - 1095 │ │ │ │ │ - 1096 // The text books on splines use the following geometric condition here │ │ │ │ │ -to fill the array N │ │ │ │ │ - 1097 // (see for example Cottrell, Hughes, Bazilevs, Formula (2.1). However, │ │ │ │ │ -this condition │ │ │ │ │ - 1098 // only works if splines are never evaluated exactly on the knots. │ │ │ │ │ - 1099 // │ │ │ │ │ - 1100 // for (size_t i=0; i 1e-10) │ │ │ │ │ - 1109 ? (in - knotVector[i]) / (knotVector[i+r] - knotVector[i]) │ │ │ │ │ - 1110 : 0; │ │ │ │ │ - 1111 R factor2 = ((knotVector[i+r+1] - knotVector[i+1]) > 1e-10) │ │ │ │ │ - 1112 ? (knotVector[i+r+1] - in) / (knotVector[i+r+1] - knotVector[i+1]) │ │ │ │ │ - 1113 : 0; │ │ │ │ │ - 1114 N[r][i] = factor1 * N[r-1][i] + factor2 * N[r-1][i+1]; │ │ │ │ │ - 1115 } │ │ │ │ │ - 1116 } │ │ │ │ │ - 1117 │ │ │ │ │ - 1118 │ │ │ │ │ -1128 static void evaluateAll(const typename GV::ctype& in, │ │ │ │ │ - 1129 std::vector& out, │ │ │ │ │ - 1130 bool evaluateJacobian, std::vector& outJac, │ │ │ │ │ - 1131 bool evaluateHessian, std::vector& outHess, │ │ │ │ │ - 1132 const std::vector& knotVector, │ │ │ │ │ - 1133 unsigned int order, │ │ │ │ │ - 1134 unsigned int currentKnotSpan) │ │ │ │ │ - 1135 { │ │ │ │ │ - 1136 // How many shape functions to we have in each coordinate direction? │ │ │ │ │ - 1137 unsigned int limit; │ │ │ │ │ - 1138 limit = order+1; // The 'standard' value away from the boundaries of the │ │ │ │ │ -knot vector │ │ │ │ │ - 1139 if (currentKnotSpan (knotVector.size() - currentKnotSpan - 2) ) │ │ │ │ │ - 1142 limit -= order - (knotVector.size() - currentKnotSpan - 2); │ │ │ │ │ - 1143 │ │ │ │ │ - 1144 // The lowest knot spans that we need values from │ │ │ │ │ - 1145 unsigned int offset; │ │ │ │ │ - 1146 offset = std::max((int)(currentKnotSpan - order),0); │ │ │ │ │ - 1147 │ │ │ │ │ - 1148 // Evaluate 1d function values (needed for the product rule) │ │ │ │ │ - 1149 DynamicMatrix values; │ │ │ │ │ - 1150 │ │ │ │ │ - 1151 evaluateFunctionFull(in, values, knotVector, order, currentKnotSpan); │ │ │ │ │ - 1152 │ │ │ │ │ - 1153 out.resize(knotVector.size()-order-1); │ │ │ │ │ - 1154 for (size_t j=0; j lowOrderOneDValues; │ │ │ │ │ - 1159 │ │ │ │ │ - 1160 if (order!=0) │ │ │ │ │ - 1161 { │ │ │ │ │ - 1162 lowOrderOneDValues.resize(knotVector.size()-(order-1)-1); │ │ │ │ │ - 1163 for (size_t j=0; j lowOrderTwoDValues; │ │ │ │ │ - 1169 │ │ │ │ │ - 1170 if (order>1 && evaluateHessian) │ │ │ │ │ - 1171 { │ │ │ │ │ - 1172 lowOrderTwoDValues.resize(knotVector.size()-(order-2)-1); │ │ │ │ │ - 1173 for (size_t j=0; j order_; │ │ │ │ │ - 1235 │ │ │ │ │ -1237 std::array, dim> knotVectors_; │ │ │ │ │ - 1238 │ │ │ │ │ -1240 std::array elements_; │ │ │ │ │ - 1241 │ │ │ │ │ -1242 GridView gridView_; │ │ │ │ │ - 1243}; │ │ │ │ │ - 1244 │ │ │ │ │ - 1245 │ │ │ │ │ - 1246 │ │ │ │ │ - 1247template │ │ │ │ │ -1248class BSplineNode : │ │ │ │ │ - 1249 public LeafBasisNode │ │ │ │ │ - 1250{ │ │ │ │ │ - 1251 static const int dim = GV::dimension; │ │ │ │ │ - 1252 │ │ │ │ │ - 1253public: │ │ │ │ │ - 1254 │ │ │ │ │ -1255 using size_type = std::size_t; │ │ │ │ │ -1256 using Element = typename GV::template Codim<0>::Entity; │ │ │ │ │ -1257 using FiniteElement = BSplineLocalFiniteElement; │ │ │ │ │ - 1258 │ │ │ │ │ -1259 BSplineNode(const BSplinePreBasis* preBasis) : │ │ │ │ │ - 1260 preBasis_(preBasis), │ │ │ │ │ - 1261 finiteElement_(*preBasis) │ │ │ │ │ - 1262 {} │ │ │ │ │ - 1263 │ │ │ │ │ -1265 const Element& element() const │ │ │ │ │ - 1266 { │ │ │ │ │ - 1267 return element_; │ │ │ │ │ - 1268 } │ │ │ │ │ - 1269 │ │ │ │ │ -1274 const FiniteElement& finiteElement() const │ │ │ │ │ - 1275 { │ │ │ │ │ - 1276 return finiteElement_; │ │ │ │ │ - 1277 } │ │ │ │ │ - 1278 │ │ │ │ │ -1280 void bind(const Element& e) │ │ │ │ │ - 1281 { │ │ │ │ │ - 1282 element_ = e; │ │ │ │ │ - 1283 auto elementIndex = preBasis_->gridView().indexSet().index(e); │ │ │ │ │ - 1284 finiteElement_.bind(preBasis_->getIJK(elementIndex,preBasis_- │ │ │ │ │ ->elements_)); │ │ │ │ │ - 1285 this->setSize(finiteElement_.size()); │ │ │ │ │ - 1286 } │ │ │ │ │ - 1287 │ │ │ │ │ - 1288protected: │ │ │ │ │ - 1289 │ │ │ │ │ -1290 const BSplinePreBasis* preBasis_; │ │ │ │ │ - 1291 │ │ │ │ │ -1292 FiniteElement finiteElement_; │ │ │ │ │ -1293 Element element_; │ │ │ │ │ - 1294}; │ │ │ │ │ - 1295 │ │ │ │ │ - 1296 │ │ │ │ │ - 1297 │ │ │ │ │ - 1298namespace BasisFactory { │ │ │ │ │ - 1299 │ │ │ │ │ -1306inline auto bSpline(const std::vector& knotVector, │ │ │ │ │ - 1307 unsigned int order, │ │ │ │ │ - 1308 bool makeOpen = true) │ │ │ │ │ - 1309{ │ │ │ │ │ - 1310 return [&knotVector, order, makeOpen](const auto& gridView) { │ │ │ │ │ - 1311 return BSplinePreBasis>(gridView, │ │ │ │ │ -knotVector, order, makeOpen); │ │ │ │ │ - 1312 }; │ │ │ │ │ - 1313} │ │ │ │ │ - 1314 │ │ │ │ │ - 1315} // end namespace BasisFactory │ │ │ │ │ - 1316 │ │ │ │ │ - 1317/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 1318// This is the actual global basis implementation based on the reusable │ │ │ │ │ -parts. │ │ │ │ │ - 1319/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 1320 │ │ │ │ │ - 1327template │ │ │ │ │ -1328using BSplineBasis = DefaultGlobalBasis >; │ │ │ │ │ - 1329 │ │ │ │ │ - 1330 │ │ │ │ │ - 1331} // namespace Functions │ │ │ │ │ - 1332 │ │ │ │ │ - 1333} // namespace Dune │ │ │ │ │ - 1334 │ │ │ │ │ - 1335#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BSPLINEBASIS_HH │ │ │ │ │ -nodes.hh │ │ │ │ │ -defaultglobalbasis.hh │ │ │ │ │ -Dune::Functions::BasisFactory::bSpline │ │ │ │ │ -auto bSpline(const std::vector< double > &knotVector, unsigned int order, bool │ │ │ │ │ -makeOpen=true) │ │ │ │ │ -Create a pre-basis factory that can create a B-spline pre-basis. │ │ │ │ │ -Definition: bsplinebasis.hh:1306 │ │ │ │ │ + 260#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH │ │ │ │ │ +defaultderivativetraits.hh │ │ │ │ │ +differentiablefunction.hh │ │ │ │ │ +gridfunction.hh │ │ │ │ │ +Dune::Functions::ComposedGridFunction::makeComposedGridFunction │ │ │ │ │ +auto makeComposedGridFunction(OF &&outerFunction, IF &&... innerFunction) │ │ │ │ │ +Create a ComposedGridFunction that composes grid-functions with another │ │ │ │ │ +function. │ │ │ │ │ +Definition: composedgridfunction.hh:248 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::BSplineLocalFiniteElement │ │ │ │ │ -LocalFiniteElement in the sense of dune-localfunctions, for the B-spline basis │ │ │ │ │ -on tensor-product grid... │ │ │ │ │ -Definition: bsplinebasis.hh:362 │ │ │ │ │ -Dune::Functions::BSplineLocalFiniteElement::BSplineLocalFiniteElement │ │ │ │ │ -BSplineLocalFiniteElement(const BSplineLocalFiniteElement &other) │ │ │ │ │ -Copy constructor. │ │ │ │ │ -Definition: bsplinebasis.hh:383 │ │ │ │ │ -Dune::Functions::BSplineLocalFiniteElement::preBasis_ │ │ │ │ │ -const BSplinePreBasis< GV > & preBasis_ │ │ │ │ │ -Definition: bsplinebasis.hh:474 │ │ │ │ │ -Dune::Functions::BSplineLocalFiniteElement::localInterpolation │ │ │ │ │ -const BSplineLocalInterpolation< dim, BSplineLocalBasis< GV, R > > & │ │ │ │ │ -localInterpolation() const │ │ │ │ │ -Hand out a LocalInterpolation object. │ │ │ │ │ -Definition: bsplinebasis.hh:439 │ │ │ │ │ -Dune::Functions::BSplineLocalFiniteElement::Traits │ │ │ │ │ -LocalFiniteElementTraits< BSplineLocalBasis< GV, R >, BSplineLocalCoefficients< │ │ │ │ │ -dim >, BSplineLocalInterpolation< dim, BSplineLocalBasis< GV, R > > > Traits │ │ │ │ │ -Export various types related to this LocalFiniteElement. │ │ │ │ │ -Definition: bsplinebasis.hh:372 │ │ │ │ │ -Dune::Functions::BSplineLocalFiniteElement::currentKnotSpan_ │ │ │ │ │ -std::array< unsigned, dim > currentKnotSpan_ │ │ │ │ │ -Definition: bsplinebasis.hh:481 │ │ │ │ │ -Dune::Functions::BSplineLocalFiniteElement::BSplineLocalFiniteElement │ │ │ │ │ -BSplineLocalFiniteElement(const BSplinePreBasis< GV > &preBasis) │ │ │ │ │ -Constructor with a given B-spline basis. │ │ │ │ │ -Definition: bsplinebasis.hh:376 │ │ │ │ │ -Dune::Functions::BSplineLocalFiniteElement::localCoefficients │ │ │ │ │ -const BSplineLocalCoefficients< dim > & localCoefficients() const │ │ │ │ │ -Hand out a LocalCoefficients object. │ │ │ │ │ -Definition: bsplinebasis.hh:433 │ │ │ │ │ -Dune::Functions::BSplineLocalFiniteElement::bind │ │ │ │ │ -void bind(const std::array< unsigned, dim > &elementIdx) │ │ │ │ │ -Bind LocalFiniteElement to a specific knot span of the spline patch. │ │ │ │ │ -Definition: bsplinebasis.hh:394 │ │ │ │ │ -Dune::Functions::BSplineLocalFiniteElement::localInterpolation_ │ │ │ │ │ -BSplineLocalInterpolation< dim, BSplineLocalBasis< GV, R > > │ │ │ │ │ -localInterpolation_ │ │ │ │ │ -Definition: bsplinebasis.hh:478 │ │ │ │ │ -Dune::Functions::BSplineLocalFiniteElement::type │ │ │ │ │ -GeometryType type() const │ │ │ │ │ -Return the reference element that the local finite element is defined on (here, │ │ │ │ │ -a hypercube) │ │ │ │ │ -Definition: bsplinebasis.hh:455 │ │ │ │ │ -Dune::Functions::BSplineLocalFiniteElement::size │ │ │ │ │ -unsigned size() const │ │ │ │ │ -Number of shape functions in this finite element. │ │ │ │ │ -Definition: bsplinebasis.hh:445 │ │ │ │ │ -Dune::Functions::BSplineLocalFiniteElement::localCoefficients_ │ │ │ │ │ -BSplineLocalCoefficients< dim > localCoefficients_ │ │ │ │ │ -Definition: bsplinebasis.hh:477 │ │ │ │ │ -Dune::Functions::BSplineLocalFiniteElement::size │ │ │ │ │ -unsigned int size(int i) const │ │ │ │ │ -Number of degrees of freedom for one coordinate direction. │ │ │ │ │ -Definition: bsplinebasis.hh:463 │ │ │ │ │ -Dune::Functions::BSplineLocalFiniteElement::localBasis_ │ │ │ │ │ -BSplineLocalBasis< GV, R > localBasis_ │ │ │ │ │ -Definition: bsplinebasis.hh:476 │ │ │ │ │ -Dune::Functions::BSplineLocalFiniteElement::localBasis │ │ │ │ │ -const BSplineLocalBasis< GV, R > & localBasis() const │ │ │ │ │ -Hand out a LocalBasis object. │ │ │ │ │ -Definition: bsplinebasis.hh:427 │ │ │ │ │ -Dune::Functions::BSplinePreBasis │ │ │ │ │ -Pre-basis for B-spline basis. │ │ │ │ │ -Definition: bsplinebasis.hh:499 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::multiIndexBufferSize │ │ │ │ │ -static constexpr size_type multiIndexBufferSize │ │ │ │ │ -Definition: bsplinebasis.hh:567 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::elements_ │ │ │ │ │ -std::array< unsigned, dim > elements_ │ │ │ │ │ -Number of grid elements in the different coordinate directions. │ │ │ │ │ -Definition: bsplinebasis.hh:1240 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::gridView_ │ │ │ │ │ -GridView gridView_ │ │ │ │ │ -Definition: bsplinebasis.hh:1242 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::R │ │ │ │ │ -double R │ │ │ │ │ -Definition: bsplinebasis.hh:570 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::evaluateFunctionFull │ │ │ │ │ -static void evaluateFunctionFull(const typename GV::ctype &in, DynamicMatrix< R │ │ │ │ │ -> &out, const std::vector< R > &knotVector, unsigned int order, unsigned int │ │ │ │ │ -currentKnotSpan) │ │ │ │ │ -Evaluate all one-dimensional B-spline functions for a given coordinate │ │ │ │ │ -direction. │ │ │ │ │ -Definition: bsplinebasis.hh:1085 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::evaluateFunction │ │ │ │ │ -void evaluateFunction(const FieldVector< typename GV::ctype, dim > &in, std:: │ │ │ │ │ -vector< FieldVector< R, 1 > > &out, const std::array< unsigned, dim > │ │ │ │ │ -¤tKnotSpan) const │ │ │ │ │ -Evaluate all B-spline basis functions at a given point. │ │ │ │ │ -Definition: bsplinebasis.hh:781 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::order_ │ │ │ │ │ -std::array< unsigned int, dim > order_ │ │ │ │ │ -Order of the B-spline for each space dimension. │ │ │ │ │ -Definition: bsplinebasis.hh:1234 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::dimension │ │ │ │ │ -size_type dimension() const │ │ │ │ │ -Get the total dimension of the space spanned by this basis. │ │ │ │ │ -Definition: bsplinebasis.hh:719 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::evaluateAll │ │ │ │ │ -static void evaluateAll(const typename GV::ctype &in, std::vector< R > &out, │ │ │ │ │ -bool evaluateJacobian, std::vector< R > &outJac, bool evaluateHessian, std:: │ │ │ │ │ -vector< R > &outHess, const std::vector< R > &knotVector, unsigned int order, │ │ │ │ │ -unsigned int currentKnotSpan) │ │ │ │ │ -Evaluate the second derivatives of all one-dimensional B-spline functions for a │ │ │ │ │ -given coordinate dire... │ │ │ │ │ -Definition: bsplinebasis.hh:1128 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::evaluateFunction │ │ │ │ │ -static void evaluateFunction(const typename GV::ctype &in, std::vector< R > │ │ │ │ │ -&out, const std::vector< R > &knotVector, unsigned int order, unsigned int │ │ │ │ │ -currentKnotSpan) │ │ │ │ │ -Evaluate all one-dimensional B-spline functions for a given coordinate │ │ │ │ │ -direction. │ │ │ │ │ -Definition: bsplinebasis.hh:1028 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::size │ │ │ │ │ -unsigned int size(size_t d) const │ │ │ │ │ -Number of shape functions in one direction. │ │ │ │ │ -Definition: bsplinebasis.hh:774 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::GridView │ │ │ │ │ -GV GridView │ │ │ │ │ -The grid view that the FE space is defined on. │ │ │ │ │ -Definition: bsplinebasis.hh:560 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::indices │ │ │ │ │ -It indices(const Node &node, It it) const │ │ │ │ │ -Maps from subtree index set [0..size-1] to a globally unique multi index in │ │ │ │ │ -global basis. │ │ │ │ │ -Definition: bsplinebasis.hh:735 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::evaluate │ │ │ │ │ -void evaluate(const typename std::array< int, k > &directions, const │ │ │ │ │ -FieldVector< typename GV::ctype, dim > &in, std::vector< FieldVector< R, 1 > > │ │ │ │ │ -&out, const std::array< unsigned, dim > ¤tKnotSpan) const │ │ │ │ │ -Evaluate Derivatives of all B-spline basis functions. │ │ │ │ │ -Definition: bsplinebasis.hh:913 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::size_type │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Definition: bsplinebasis.hh:561 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::maxMultiIndexSize │ │ │ │ │ -static constexpr size_type maxMultiIndexSize │ │ │ │ │ -Definition: bsplinebasis.hh:565 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::update │ │ │ │ │ -void update(const GridView &gv) │ │ │ │ │ -Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ -Definition: bsplinebasis.hh:686 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::initializeIndices │ │ │ │ │ -void initializeIndices() │ │ │ │ │ -Initialize the global indices. │ │ │ │ │ -Definition: bsplinebasis.hh:676 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::size │ │ │ │ │ -size_type size(const Dune::ReservedVector< ST, i > &prefix) const │ │ │ │ │ -Return number of possible values for next position in multi index. │ │ │ │ │ -Definition: bsplinebasis.hh:712 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::size │ │ │ │ │ -unsigned int size() const │ │ │ │ │ -Total number of B-spline basis functions. │ │ │ │ │ -Definition: bsplinebasis.hh:765 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::gridView │ │ │ │ │ -const GridView & gridView() const │ │ │ │ │ -Obtain the grid view that the basis is defined on. │ │ │ │ │ -Definition: bsplinebasis.hh:680 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::getIJK │ │ │ │ │ -static std::array< unsigned int, dim > getIJK(typename GridView::IndexSet:: │ │ │ │ │ -IndexType idx, std::array< unsigned int, dim > elements) │ │ │ │ │ -Compute integer element coordinates from the element index. │ │ │ │ │ -Definition: bsplinebasis.hh:1009 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::makeNode │ │ │ │ │ -Node makeNode() const │ │ │ │ │ -Create tree node. │ │ │ │ │ -Definition: bsplinebasis.hh:694 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::BSplinePreBasis │ │ │ │ │ -BSplinePreBasis(const GridView &gridView, const std::vector< double > │ │ │ │ │ -&knotVector, unsigned int order, bool makeOpen=true) │ │ │ │ │ -Construct a B-spline basis for a given grid view and set of knot vectors. │ │ │ │ │ -Definition: bsplinebasis.hh:590 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::evaluateJacobian │ │ │ │ │ -void evaluateJacobian(const FieldVector< typename GV::ctype, dim > &in, std:: │ │ │ │ │ -vector< FieldMatrix< R, 1, dim > > &out, const std::array< unsigned, dim > │ │ │ │ │ -¤tKnotSpan) const │ │ │ │ │ -Evaluate Jacobian of all B-spline basis functions. │ │ │ │ │ -Definition: bsplinebasis.hh:812 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::minMultiIndexSize │ │ │ │ │ -static constexpr size_type minMultiIndexSize │ │ │ │ │ -Definition: bsplinebasis.hh:566 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::knotVectors_ │ │ │ │ │ -std::array< std::vector< double >, dim > knotVectors_ │ │ │ │ │ -The knot vectors, one for each space dimension. │ │ │ │ │ -Definition: bsplinebasis.hh:1237 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::maxNodeSize │ │ │ │ │ -size_type maxNodeSize() const │ │ │ │ │ -Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ -Definition: bsplinebasis.hh:725 │ │ │ │ │ -Dune::Functions::BSplinePreBasis::BSplinePreBasis │ │ │ │ │ -BSplinePreBasis(const GridView &gridView, const FieldVector< double, dim > │ │ │ │ │ -&lowerLeft, const FieldVector< double, dim > &upperRight, const std::array< │ │ │ │ │ -unsigned int, dim > &elements, unsigned int order, bool makeOpen=true) │ │ │ │ │ -Construct a B-spline basis for a given grid view with uniform knot vectors. │ │ │ │ │ -Definition: bsplinebasis.hh:642 │ │ │ │ │ -Dune::Functions::BSplineLocalBasis │ │ │ │ │ -LocalBasis class in the sense of dune-localfunctions, presenting the │ │ │ │ │ -restriction of a B-spline patch ... │ │ │ │ │ -Definition: bsplinebasis.hh:46 │ │ │ │ │ -Dune::Functions::BSplineLocalBasis::Traits │ │ │ │ │ -LocalBasisTraits< D, dim, FieldVector< D, dim >, R, 1, FieldVector< R, 1 >, │ │ │ │ │ -FieldMatrix< R, 1, dim > > Traits │ │ │ │ │ -export type traits for function signature │ │ │ │ │ -Definition: bsplinebasis.hh:55 │ │ │ │ │ -Dune::Functions::BSplineLocalBasis::order │ │ │ │ │ -unsigned int order() const │ │ │ │ │ -Polynomial order of the shape functions. │ │ │ │ │ -Definition: bsplinebasis.hh:140 │ │ │ │ │ -Dune::Functions::BSplineLocalBasis::size │ │ │ │ │ -std::size_t size() const │ │ │ │ │ -Return the number of basis functions on the current knot span. │ │ │ │ │ -Definition: bsplinebasis.hh:147 │ │ │ │ │ -Dune::Functions::BSplineLocalBasis::evaluate │ │ │ │ │ -void evaluate(const typename std::array< int, k > &directions, const typename │ │ │ │ │ -Traits::DomainType &in, std::vector< typename Traits::RangeType > &out) const │ │ │ │ │ -Evaluate all shape functions and derivatives of any order. │ │ │ │ │ -Definition: bsplinebasis.hh:97 │ │ │ │ │ -Dune::Functions::BSplineLocalBasis::evaluateFunction │ │ │ │ │ -void evaluateFunction(const FieldVector< D, dim > &in, std::vector< │ │ │ │ │ -FieldVector< R, 1 > > &out) const │ │ │ │ │ -Evaluate all shape functions. │ │ │ │ │ -Definition: bsplinebasis.hh:70 │ │ │ │ │ -Dune::Functions::BSplineLocalBasis::evaluateJacobian │ │ │ │ │ -void evaluateJacobian(const FieldVector< D, dim > &in, std::vector< │ │ │ │ │ -FieldMatrix< D, 1, dim > > &out) const │ │ │ │ │ -Evaluate Jacobian of all shape functions. │ │ │ │ │ -Definition: bsplinebasis.hh:82 │ │ │ │ │ -Dune::Functions::BSplineLocalBasis::BSplineLocalBasis │ │ │ │ │ -BSplineLocalBasis(const BSplinePreBasis< GV > &preBasis, const │ │ │ │ │ -BSplineLocalFiniteElement< GV, R > &lFE) │ │ │ │ │ -Constructor with a given B-spline patch. │ │ │ │ │ -Definition: bsplinebasis.hh:61 │ │ │ │ │ -Dune::Functions::BSplineLocalCoefficients │ │ │ │ │ -Attaches a shape function to an entity. │ │ │ │ │ -Definition: bsplinebasis.hh:178 │ │ │ │ │ -Dune::Functions::BSplineLocalCoefficients::localKey │ │ │ │ │ -const LocalKey & localKey(std::size_t i) const │ │ │ │ │ -get i'th index │ │ │ │ │ -Definition: bsplinebasis.hh:321 │ │ │ │ │ -Dune::Functions::BSplineLocalCoefficients::init │ │ │ │ │ -void init(const std::array< unsigned, dim > &sizes) │ │ │ │ │ -Definition: bsplinebasis.hh:256 │ │ │ │ │ -Dune::Functions::BSplineLocalCoefficients::size │ │ │ │ │ -std::size_t size() const │ │ │ │ │ -number of coefficients │ │ │ │ │ -Definition: bsplinebasis.hh:315 │ │ │ │ │ -Dune::Functions::BSplineLocalInterpolation │ │ │ │ │ -Local interpolation in the sense of dune-localfunctions, for the B-spline basis │ │ │ │ │ -on tensor-product gri... │ │ │ │ │ -Definition: bsplinebasis.hh:340 │ │ │ │ │ -Dune::Functions::BSplineLocalInterpolation::interpolate │ │ │ │ │ -void interpolate(const F &f, std::vector< C > &out) const │ │ │ │ │ -Local interpolation of a function. │ │ │ │ │ -Definition: bsplinebasis.hh:344 │ │ │ │ │ -Dune::Functions::BSplineNode │ │ │ │ │ -Definition: bsplinebasis.hh:1250 │ │ │ │ │ -Dune::Functions::BSplineNode::finiteElement │ │ │ │ │ -const FiniteElement & finiteElement() const │ │ │ │ │ -Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ -Definition: bsplinebasis.hh:1274 │ │ │ │ │ -Dune::Functions::BSplineNode::Element │ │ │ │ │ -typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ -Definition: bsplinebasis.hh:1256 │ │ │ │ │ -Dune::Functions::BSplineNode::preBasis_ │ │ │ │ │ -const BSplinePreBasis< GV > * preBasis_ │ │ │ │ │ -Definition: bsplinebasis.hh:1290 │ │ │ │ │ -Dune::Functions::BSplineNode::element_ │ │ │ │ │ -Element element_ │ │ │ │ │ -Definition: bsplinebasis.hh:1293 │ │ │ │ │ -Dune::Functions::BSplineNode::bind │ │ │ │ │ -void bind(const Element &e) │ │ │ │ │ -Bind to element. │ │ │ │ │ -Definition: bsplinebasis.hh:1280 │ │ │ │ │ -Dune::Functions::BSplineNode::BSplineNode │ │ │ │ │ -BSplineNode(const BSplinePreBasis< GV > *preBasis) │ │ │ │ │ -Definition: bsplinebasis.hh:1259 │ │ │ │ │ -Dune::Functions::BSplineNode::element │ │ │ │ │ -const Element & element() const │ │ │ │ │ -Return current element, throw if unbound. │ │ │ │ │ -Definition: bsplinebasis.hh:1265 │ │ │ │ │ -Dune::Functions::BSplineNode::finiteElement_ │ │ │ │ │ -FiniteElement finiteElement_ │ │ │ │ │ -Definition: bsplinebasis.hh:1292 │ │ │ │ │ -Dune::Functions::BSplineNode::size_type │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Definition: bsplinebasis.hh:1255 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis │ │ │ │ │ -Global basis for given pre-basis. │ │ │ │ │ -Definition: defaultglobalbasis.hh:46 │ │ │ │ │ -Dune::Functions::BasisNodeMixin::size │ │ │ │ │ -size_type size() const │ │ │ │ │ -Definition: nodes.hh:142 │ │ │ │ │ -Dune::Functions::BasisNodeMixin::setSize │ │ │ │ │ -void setSize(const size_type size) │ │ │ │ │ -Definition: nodes.hh:164 │ │ │ │ │ -Dune::Functions::LeafBasisNode │ │ │ │ │ -Definition: nodes.hh:186 │ │ │ │ │ +Dune::Functions::resolveRef │ │ │ │ │ +decltype(auto) resolveRef(T &&t) │ │ │ │ │ +This is an alias for Dune::resolveRef. │ │ │ │ │ +Definition: referencehelper.hh:37 │ │ │ │ │ +Dune::Functions::DefaultDerivativeTraits │ │ │ │ │ +Default implementation for derivative traits. │ │ │ │ │ +Definition: defaultderivativetraits.hh:37 │ │ │ │ │ +Dune::Functions::ComposedGridFunction │ │ │ │ │ +Composition of grid functions with another function. │ │ │ │ │ +Definition: composedgridfunction.hh:42 │ │ │ │ │ +Dune::Functions::ComposedGridFunction::outerFunction_ │ │ │ │ │ +OuterFunction outerFunction_ │ │ │ │ │ +Definition: composedgridfunction.hh:219 │ │ │ │ │ +Dune::Functions::ComposedGridFunction::innerFunctions_ │ │ │ │ │ +InnerFunctions innerFunctions_ │ │ │ │ │ +Definition: composedgridfunction.hh:220 │ │ │ │ │ +Dune::Functions::ComposedGridFunction::ComposedGridFunction │ │ │ │ │ +ComposedGridFunction(OFT &&outerFunction, IFT &&... innerFunctions) │ │ │ │ │ +Create ComposedGridFunction. │ │ │ │ │ +Definition: composedgridfunction.hh:167 │ │ │ │ │ +Dune::Functions::ComposedGridFunction::entitySet │ │ │ │ │ +const EntitySet & entitySet() const │ │ │ │ │ +Return the EntitySet associated to this composed grid-function. │ │ │ │ │ +Definition: composedgridfunction.hh:205 │ │ │ │ │ +Dune::Functions::ComposedGridFunction::EntitySet │ │ │ │ │ +typename InnerFunction< 0 >::EntitySet EntitySet │ │ │ │ │ +Definition: composedgridfunction.hh:53 │ │ │ │ │ +Dune::Functions::ComposedGridFunction::LocalDomain │ │ │ │ │ +typename EntitySet::LocalCoordinate LocalDomain │ │ │ │ │ +Definition: composedgridfunction.hh:57 │ │ │ │ │ +Dune::Functions::ComposedGridFunction::Element │ │ │ │ │ +typename EntitySet::Element Element │ │ │ │ │ +Definition: composedgridfunction.hh:54 │ │ │ │ │ +Dune::Functions::ComposedGridFunction::innerLocalFunctions │ │ │ │ │ +InnerLocalFunctions innerLocalFunctions() const │ │ │ │ │ +Definition: composedgridfunction.hh:212 │ │ │ │ │ +Dune::Functions::ComposedGridFunction::localFunction │ │ │ │ │ +friend LocalFunction localFunction(const ComposedGridFunction &cgf) │ │ │ │ │ +Create a local-function of this composed grid-function. │ │ │ │ │ +Definition: composedgridfunction.hh:190 │ │ │ │ │ +Dune::Functions::ComposedGridFunction::Range │ │ │ │ │ +decltype(std::declval< OF >()(std::declval< IF >()(std::declval< Domain > │ │ │ │ │ +())...)) Range │ │ │ │ │ +Definition: composedgridfunction.hh:59 │ │ │ │ │ +Dune::Functions::ComposedGridFunction::Domain │ │ │ │ │ +typename EntitySet::GlobalCoordinate Domain │ │ │ │ │ +Definition: composedgridfunction.hh:56 │ │ │ │ │ +Dune::Functions::ComposedGridFunction::operator() │ │ │ │ │ +Range operator()(const Domain &x) const │ │ │ │ │ +Evaluation of the composed grid function in coordinates x │ │ │ │ │ +Definition: composedgridfunction.hh:173 │ │ │ │ │ +Dune::Functions::ComposedGridFunction::derivative │ │ │ │ │ +friend Traits::DerivativeInterface derivative(const ComposedGridFunction &t) │ │ │ │ │ +Not implemented. │ │ │ │ │ +Definition: composedgridfunction.hh:179 │ │ │ │ │ +Dune::Functions::GridFunction │ │ │ │ │ +Definition: gridfunction.hh:32 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00170.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: defaultnodetorangemap.hh File Reference │ │ │ │ +dune-functions: gridfunction.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,55 +58,50 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
defaultnodetorangemap.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
gridfunction.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <dune/common/concept.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │ -#include <dune/typetree/traversal.hh>
│ │ │ │ -#include <dune/typetree/visitor.hh>
│ │ │ │ +
#include <type_traits>
│ │ │ │ +#include <dune/common/typeutilities.hh>
│ │ │ │ +#include <dune/functions/common/typeerasure.hh>
│ │ │ │ +#include <dune/functions/common/defaultderivativetraits.hh>
│ │ │ │ +#include <dune/functions/common/differentiablefunction.hh>
│ │ │ │ +#include <dune/functions/common/localfunction.hh>
│ │ │ │ +#include <dune/functions/common/functionconcepts.hh>
│ │ │ │ +#include <dune/functions/gridfunctions/localderivativetraits.hh>
│ │ │ │ +#include <dune/functions/gridfunctions/gridfunction_imp.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::Functions::DefaultNodeToRangeMap< Tree >
 A simple node to range map using lexicographic ordering. More...
class  Dune::Functions::GridFunction< Signature, EntitySet, DerivativeTraits, bufferSize >
 
struct  Dune::Functions::DefaultNodeToRangeMap< Tree >::Visitor
class  Dune::Functions::GridFunction< Range(Domain), ES, DerivativeTraits, bufferSize >
 Wrapper class for functions defined on a Grid. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<class Tree >
DefaultNodeToRangeMap< Tree > Dune::Functions::makeDefaultNodeToRangeMap (const Tree &tree)
 
template<class Basis , class TreePath >
auto Dune::Functions::makeDefaultNodeToRangeMap (const Basis &basis, TreePath &&treePath) -> decltype(makeDefaultNodeToRangeMap(TypeTree::child(basis.localView().tree(), treePath)))
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,40 +4,36 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * functionspacebases │ │ │ │ │ -Classes | Namespaces | Functions │ │ │ │ │ -defaultnodetorangemap.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * gridfunctions │ │ │ │ │ +Classes | Namespaces │ │ │ │ │ +gridfunction.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -struct  Dune::Functions::DefaultNodeToRangeMap<_Tree_> │ │ │ │ │ -  A simple node to range map using lexicographic ordering. More... │ │ │ │ │ +class  Dune::Functions::GridFunction<_Signature,_EntitySet,_DerivativeTraits, │ │ │ │ │ + bufferSize_> │ │ │ │ │   │ │ │ │ │ -struct  Dune::Functions::DefaultNodeToRangeMap<_Tree_>::Visitor │ │ │ │ │ +class  Dune::Functions::GridFunction<_Range(Domain),_ES,_DerivativeTraits, │ │ │ │ │ + bufferSize_> │ │ │ │ │ +  Wrapper class for functions defined on a Grid. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ - Functions │ │ │ │ │ -template │ │ │ │ │ -DefaultNodeToRangeMap< Tree > Dune::Functions::makeDefaultNodeToRangeMap │ │ │ │ │ - (const Tree &tree) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - auto Dune::Functions::makeDefaultNodeToRangeMap │ │ │ │ │ - (const Basis &basis, TreePath &&treePath) - │ │ │ │ │ - > decltype(makeDefaultNodeToRangeMap(TypeTree:: │ │ │ │ │ - child(basis.localView().tree(), treePath))) │ │ │ │ │ -  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00170_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: defaultnodetorangemap.hh Source File │ │ │ │ +dune-functions: gridfunction.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,131 +58,165 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
defaultnodetorangemap.hh
│ │ │ │ +
gridfunction.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTNODETORANGEMAP_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTNODETORANGEMAP_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_HH
│ │ │ │
5
│ │ │ │ -
6
│ │ │ │ -
7#include <dune/common/concept.hh>
│ │ │ │ -
8
│ │ │ │ - │ │ │ │ -
10
│ │ │ │ -
11#include <dune/typetree/traversal.hh>
│ │ │ │ -
12#include <dune/typetree/visitor.hh>
│ │ │ │ -
13
│ │ │ │ -
14
│ │ │ │ -
15namespace Dune {
│ │ │ │ -
16namespace Functions {
│ │ │ │ +
6#include <type_traits>
│ │ │ │ +
7
│ │ │ │ +
8#include <dune/common/typeutilities.hh>
│ │ │ │ +
9
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
17
│ │ │ │
18
│ │ │ │
19
│ │ │ │ -
37template<class Tree>
│ │ │ │ - │ │ │ │ -
39{
│ │ │ │ -
40
│ │ │ │ -
41 // A simple visitor for computing lexicographic
│ │ │ │ -
42 // subtree indices. To identify a leaf node
│ │ │ │ -
43 // we use its treeIndex() which is unique
│ │ │ │ -
44 // wrt the whole tree and store the computed
│ │ │ │ -
45 // index in a vector indexed by the tree indices.
│ │ │ │ -
46 struct Visitor
│ │ │ │ -
47 : public TypeTree::TreeVisitor
│ │ │ │ -
48 , public TypeTree::DynamicTraversal
│ │ │ │ -
49 {
│ │ │ │ -
50 Visitor(std::vector<std::size_t>& indices) :
│ │ │ │ -
51 indices_(indices),
│ │ │ │ -
52 counter_(0)
│ │ │ │ -
53 {}
│ │ │ │ -
54
│ │ │ │ -
55 template<typename Node, typename TreePath>
│ │ │ │ -
56 void leaf(Node& node, TreePath treePath)
│ │ │ │ -
57 {
│ │ │ │ -
58 if (indices_.size() < node.treeIndex()+1)
│ │ │ │ -
59 indices_.resize(node.treeIndex()+1);
│ │ │ │ -
60 indices_[node.treeIndex()] = counter_;
│ │ │ │ -
61 ++counter_;
│ │ │ │ -
62 }
│ │ │ │ -
63
│ │ │ │ -
64 std::vector<std::size_t>& indices_;
│ │ │ │ -
65 std::size_t counter_;
│ │ │ │ -
66 };
│ │ │ │ -
67
│ │ │ │ -
78 DefaultNodeToRangeMap(const Tree& tree)
│ │ │ │ -
79 {
│ │ │ │ -
80 TypeTree::applyToTree(tree, Visitor(indices_));
│ │ │ │ -
81 }
│ │ │ │ +
20namespace Dune {
│ │ │ │ +
21namespace Functions {
│ │ │ │ +
22
│ │ │ │ +
23
│ │ │ │ +
24
│ │ │ │ +
25/*
│ │ │ │ +
26 * Default implementation is empty
│ │ │ │ +
27 * The actual implementation is only given if Signature is an type
│ │ │ │ +
28 * describing a function signature as Range(Domain).
│ │ │ │ +
29 */
│ │ │ │ +
30template<class Signature, class EntitySet, template<class> class DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56>
│ │ │ │ + │ │ │ │ +
32{};
│ │ │ │ +
33
│ │ │ │ +
34
│ │ │ │ +
35
│ │ │ │ +
36namespace Imp
│ │ │ │ +
37{
│ │ │ │ +
38
│ │ │ │ +
40 template<class S, class ES, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ +
41 struct GridFunctionTraits :
│ │ │ │ +
42 DifferentiableFunctionTraits<S, DerivativeTraits, bufferSize>
│ │ │ │ +
43 {
│ │ │ │ +
44 protected:
│ │ │ │ +
45 using Base=DifferentiableFunctionTraits<S, DerivativeTraits, bufferSize>;
│ │ │ │ +
46
│ │ │ │ +
47 public:
│ │ │ │ +
49 using EntitySet = ES;
│ │ │ │ +
50
│ │ │ │ +
52 using Element = typename EntitySet::Element;
│ │ │ │ +
53
│ │ │ │ +
55 using DerivativeSignature = typename Base::DerivativeSignature;
│ │ │ │ +
56
│ │ │ │ + │ │ │ │ +
59
│ │ │ │ +
61 using LocalSignature = typename Base::Range(typename EntitySet::LocalCoordinate);
│ │ │ │ +
62
│ │ │ │ +
64 template<class R>
│ │ │ │ + │ │ │ │ +
66
│ │ │ │ +
68 using LocalFunctionTraits = typename Dune::Functions::Imp::LocalFunctionTraits<LocalSignature, Element, LocalDerivativeTraits, bufferSize>;
│ │ │ │ +
69
│ │ │ │ + │ │ │ │ +
72
│ │ │ │ +
74 using Concept = GridFunctionWrapperInterface<S, DerivativeInterface, LocalFunctionInterface, ES>;
│ │ │ │ +
75
│ │ │ │ +
77 template<class B>
│ │ │ │ +
78 using Model = GridFunctionWrapperImplementation<S, DerivativeInterface, LocalFunctionInterface, ES, B>;
│ │ │ │ +
79 };
│ │ │ │ +
80}
│ │ │ │ +
81
│ │ │ │
82
│ │ │ │ -
83 template<class Node, class TreePath, class Range,
│ │ │ │ -
84 std::enable_if_t<models<Concept::HasIndexAccess, Range, decltype(std::declval<Node>().treeIndex())>() and not Tree::isLeaf, int> = 0>
│ │ │ │ -
85 decltype(auto) operator()(const Node& node, const TreePath& treePath, Range&& y) const
│ │ │ │ -
86 {
│ │ │ │ -
87 return y[indices_[node.treeIndex()]];
│ │ │ │ -
88 }
│ │ │ │ -
89
│ │ │ │ -
90 template<class Node, class TreePath, class Range,
│ │ │ │ -
91 std::enable_if_t< not models<Concept::HasIndexAccess, Range, decltype(std::declval<Node>().treeIndex())>() or Tree::isLeaf, int> = 0>
│ │ │ │ -
92 decltype(auto) operator()(const Node& node, const TreePath& treePath, Range&& y) const
│ │ │ │ -
93 {
│ │ │ │ -
94 return std::forward<Range>(y);
│ │ │ │ -
95 }
│ │ │ │ -
96
│ │ │ │ -
97 std::vector<std::size_t> indices_;
│ │ │ │ -
98};
│ │ │ │ -
99
│ │ │ │ -
100
│ │ │ │ -
101
│ │ │ │ -
102template<class Tree>
│ │ │ │ - │ │ │ │ -
104{
│ │ │ │ -
105 return DefaultNodeToRangeMap<Tree>(tree);
│ │ │ │ -
106}
│ │ │ │ -
107
│ │ │ │ +
83
│ │ │ │ +
95template<class Range, class Domain, class ES, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ +
96class GridFunction<Range(Domain), ES, DerivativeTraits, bufferSize> :
│ │ │ │ +
97 public TypeErasureBase<
│ │ │ │ +
98 typename Imp::GridFunctionTraits<Range(Domain), ES, DerivativeTraits, bufferSize>::Concept,
│ │ │ │ +
99 Imp::GridFunctionTraits<Range(Domain), ES, DerivativeTraits, bufferSize>::template Model>
│ │ │ │ +
100{
│ │ │ │ +
101 using Traits = Imp::GridFunctionTraits<Range(Domain), ES, DerivativeTraits, bufferSize>;
│ │ │ │ +
102
│ │ │ │ + │ │ │ │ +
104
│ │ │ │ +
105 using DerivativeInterface = typename Traits::DerivativeInterface;
│ │ │ │ +
106
│ │ │ │ +
107 using LocalFunctionInterface = typename Traits::LocalFunctionInterface;
│ │ │ │
108
│ │ │ │ -
109
│ │ │ │ -
110template<class Basis, class TreePath>
│ │ │ │ -
111auto makeDefaultNodeToRangeMap(const Basis& basis, TreePath&& treePath)
│ │ │ │ -
112 -> decltype(makeDefaultNodeToRangeMap(TypeTree::child(basis.localView().tree(),treePath)))
│ │ │ │ -
113{
│ │ │ │ -
114 auto&& localView = basis.localView();
│ │ │ │ -
115 localView.bind(*basis.gridView().template begin<0>());
│ │ │ │ -
116 auto&& tree = TypeTree::child(localView.tree(),treePath);
│ │ │ │ -
117 return makeDefaultNodeToRangeMap(tree);
│ │ │ │ -
118}
│ │ │ │ -
119
│ │ │ │ -
120
│ │ │ │ -
121
│ │ │ │ -
122} // namespace Dune::Functions
│ │ │ │ -
123} // namespace Dune
│ │ │ │ -
124
│ │ │ │ -
125
│ │ │ │ -
126#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTNODETORANGEMAP_HH
│ │ │ │ +
109 using EntitySet = typename Traits::EntitySet;
│ │ │ │ +
110
│ │ │ │ +
111public:
│ │ │ │ +
112
│ │ │ │ +
124 template<class F, disableCopyMove<GridFunction, F> = 0 >
│ │ │ │ + │ │ │ │ +
126 Base(std::forward<F>(f))
│ │ │ │ +
127 {
│ │ │ │ +
128 static_assert(Dune::Functions::Concept::isGridFunction<F, Range(Domain), EntitySet>(), "Trying to construct a GridFunction from type that does not model the GridFunction concept");
│ │ │ │ +
129 }
│ │ │ │ +
130
│ │ │ │ +
131 GridFunction() = default;
│ │ │ │ +
132
│ │ │ │ +
138 Range operator() (const Domain& x) const
│ │ │ │ +
139 {
│ │ │ │ +
140 return this->asInterface().operator()(x);
│ │ │ │ +
141 }
│ │ │ │ +
142
│ │ │ │ +
151 friend DerivativeInterface derivative(const GridFunction& t)
│ │ │ │ +
152 {
│ │ │ │ +
153 return t.asInterface().derivative();
│ │ │ │ +
154 }
│ │ │ │ +
155
│ │ │ │ +
165 friend LocalFunctionInterface localFunction(const GridFunction& t)
│ │ │ │ +
166 {
│ │ │ │ +
167 return t.asInterface().wrappedLocalFunction();
│ │ │ │ +
168 }
│ │ │ │ +
169
│ │ │ │ +
176 const EntitySet& entitySet() const
│ │ │ │ +
177 {
│ │ │ │ +
178 return this->asInterface().wrappedEntitySet();
│ │ │ │ +
179 }
│ │ │ │ +
180};
│ │ │ │ +
181
│ │ │ │ +
182
│ │ │ │ +
183
│ │ │ │ +
184}} // namespace Dune::Functions
│ │ │ │ +
185
│ │ │ │ +
186
│ │ │ │ +
187
│ │ │ │ +
188#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
DefaultNodeToRangeMap< Tree > makeDefaultNodeToRangeMap(const Tree &tree)
Definition: defaultnodetorangemap.hh:103
│ │ │ │ -
A simple node to range map using lexicographic ordering.
Definition: defaultnodetorangemap.hh:39
│ │ │ │ -
std::vector< std::size_t > indices_
Definition: defaultnodetorangemap.hh:97
│ │ │ │ -
DefaultNodeToRangeMap(const Tree &tree)
Construct DefaultNodeToRangeMap.
Definition: defaultnodetorangemap.hh:78
│ │ │ │ -
Definition: defaultnodetorangemap.hh:49
│ │ │ │ -
Visitor(std::vector< std::size_t > &indices)
Definition: defaultnodetorangemap.hh:50
│ │ │ │ -
void leaf(Node &node, TreePath treePath)
Definition: defaultnodetorangemap.hh:56
│ │ │ │ -
std::size_t counter_
Definition: defaultnodetorangemap.hh:65
│ │ │ │ -
std::vector< std::size_t > & indices_
Definition: defaultnodetorangemap.hh:64
│ │ │ │ - │ │ │ │ +
Definition: localfunction.hh:30
│ │ │ │ +
Base class for type-erased interface wrapper.
Definition: typeerasure.hh:165
│ │ │ │ +
Definition: gridfunction.hh:32
│ │ │ │ +
friend DerivativeInterface derivative(const GridFunction &t)
Get derivative of wrapped function.
Definition: gridfunction.hh:151
│ │ │ │ + │ │ │ │ +
const EntitySet & entitySet() const
Get associated EntitySet.
Definition: gridfunction.hh:176
│ │ │ │ +
GridFunction(F &&f)
Construct from function.
Definition: gridfunction.hh:125
│ │ │ │ +
friend LocalFunctionInterface localFunction(const GridFunction &t)
Get local function of wrapped function.
Definition: gridfunction.hh:165
│ │ │ │ +
Derivative traits for local functions.
Definition: localderivativetraits.hh:28
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,147 +4,199 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * functionspacebases │ │ │ │ │ -defaultnodetorangemap.hh │ │ │ │ │ + * gridfunctions │ │ │ │ │ +gridfunction.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTNODETORANGEMAP_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTNODETORANGEMAP_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_HH │ │ │ │ │ 5 │ │ │ │ │ - 6 │ │ │ │ │ - 7#include │ │ │ │ │ - 8 │ │ │ │ │ - 9#include │ │ │ │ │ - 10 │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13 │ │ │ │ │ - 14 │ │ │ │ │ - 15namespace Dune { │ │ │ │ │ - 16namespace Functions { │ │ │ │ │ + 6#include │ │ │ │ │ + 7 │ │ │ │ │ + 8#include │ │ │ │ │ + 9 │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14#include │ │ │ │ │ + 15#include │ │ │ │ │ + 16#include │ │ │ │ │ 17 │ │ │ │ │ 18 │ │ │ │ │ 19 │ │ │ │ │ - 37template │ │ │ │ │ -38struct DefaultNodeToRangeMap │ │ │ │ │ - 39{ │ │ │ │ │ - 40 │ │ │ │ │ - 41 // A simple visitor for computing lexicographic │ │ │ │ │ - 42 // subtree indices. To identify a leaf node │ │ │ │ │ - 43 // we use its treeIndex() which is unique │ │ │ │ │ - 44 // wrt the whole tree and store the computed │ │ │ │ │ - 45 // index in a vector indexed by the tree indices. │ │ │ │ │ -46 struct Visitor │ │ │ │ │ - 47 : public TypeTree::TreeVisitor │ │ │ │ │ - 48 , public TypeTree::DynamicTraversal │ │ │ │ │ - 49 { │ │ │ │ │ -50 Visitor(std::vector& indices) : │ │ │ │ │ - 51 indices_(indices), │ │ │ │ │ - 52 counter_(0) │ │ │ │ │ - 53 {} │ │ │ │ │ - 54 │ │ │ │ │ - 55 template │ │ │ │ │ -56 void leaf(Node& node, TreePath treePath) │ │ │ │ │ - 57 { │ │ │ │ │ - 58 if (indices_.size() < node.treeIndex()+1) │ │ │ │ │ - 59 indices_.resize(node.treeIndex()+1); │ │ │ │ │ - 60 indices_[node.treeIndex()] = counter_; │ │ │ │ │ - 61 ++counter_; │ │ │ │ │ - 62 } │ │ │ │ │ - 63 │ │ │ │ │ -64 std::vector& indices_; │ │ │ │ │ -65 std::size_t counter_; │ │ │ │ │ - 66 }; │ │ │ │ │ - 67 │ │ │ │ │ -78 DefaultNodeToRangeMap(const Tree& tree) │ │ │ │ │ - 79 { │ │ │ │ │ - 80 TypeTree::applyToTree(tree, Visitor(indices_)); │ │ │ │ │ - 81 } │ │ │ │ │ + 20namespace Dune { │ │ │ │ │ + 21namespace Functions { │ │ │ │ │ + 22 │ │ │ │ │ + 23 │ │ │ │ │ + 24 │ │ │ │ │ + 25/* │ │ │ │ │ + 26 * Default implementation is empty │ │ │ │ │ + 27 * The actual implementation is only given if Signature is an type │ │ │ │ │ + 28 * describing a function signature as Range(Domain). │ │ │ │ │ + 29 */ │ │ │ │ │ + 30template class │ │ │ │ │ +DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56> │ │ │ │ │ +31class GridFunction │ │ │ │ │ + 32{}; │ │ │ │ │ + 33 │ │ │ │ │ + 34 │ │ │ │ │ + 35 │ │ │ │ │ + 36namespace Imp │ │ │ │ │ + 37{ │ │ │ │ │ + 38 │ │ │ │ │ + 40 template class DerivativeTraits, size_t │ │ │ │ │ +bufferSize> │ │ │ │ │ + 41 struct GridFunctionTraits : │ │ │ │ │ + 42 DifferentiableFunctionTraits │ │ │ │ │ + 43 { │ │ │ │ │ + 44 protected: │ │ │ │ │ + 45 using Base=DifferentiableFunctionTraits; │ │ │ │ │ + 46 │ │ │ │ │ + 47 public: │ │ │ │ │ + 49 using EntitySet = ES; │ │ │ │ │ + 50 │ │ │ │ │ + 52 using Element = typename EntitySet::Element; │ │ │ │ │ + 53 │ │ │ │ │ + 55 using DerivativeSignature = typename Base::DerivativeSignature; │ │ │ │ │ + 56 │ │ │ │ │ + 58 using DerivativeInterface = GridFunction; │ │ │ │ │ + 59 │ │ │ │ │ + 61 using LocalSignature = typename Base::Range(typename EntitySet:: │ │ │ │ │ +LocalCoordinate); │ │ │ │ │ + 62 │ │ │ │ │ + 64 template │ │ │ │ │ + 65 using LocalDerivativeTraits = typename Dune::Functions:: │ │ │ │ │ +LocalDerivativeTraits::template Traits; │ │ │ │ │ + 66 │ │ │ │ │ + 68 using LocalFunctionTraits = typename Dune::Functions::Imp:: │ │ │ │ │ +LocalFunctionTraits; │ │ │ │ │ + 69 │ │ │ │ │ + 71 using LocalFunctionInterface = LocalFunction; │ │ │ │ │ + 72 │ │ │ │ │ + 74 using Concept = GridFunctionWrapperInterface; │ │ │ │ │ + 75 │ │ │ │ │ + 77 template │ │ │ │ │ + 78 using Model = GridFunctionWrapperImplementation; │ │ │ │ │ + 79 }; │ │ │ │ │ + 80} │ │ │ │ │ + 81 │ │ │ │ │ 82 │ │ │ │ │ - 83 template().treeIndex())>() and not Tree::isLeaf, int> = 0> │ │ │ │ │ -85 decltype(auto) operator()(const Node& node, const TreePath& treePath, │ │ │ │ │ -Range&& y) const │ │ │ │ │ - 86 { │ │ │ │ │ - 87 return y[indices_[node.treeIndex()]]; │ │ │ │ │ - 88 } │ │ │ │ │ - 89 │ │ │ │ │ - 90 template().treeIndex())>() or Tree::isLeaf, int> = 0> │ │ │ │ │ -92 decltype(auto) operator()(const Node& node, const TreePath& treePath, │ │ │ │ │ -Range&& y) const │ │ │ │ │ - 93 { │ │ │ │ │ - 94 return std::forward(y); │ │ │ │ │ - 95 } │ │ │ │ │ - 96 │ │ │ │ │ -97 std::vector indices_; │ │ │ │ │ - 98}; │ │ │ │ │ - 99 │ │ │ │ │ - 100 │ │ │ │ │ - 101 │ │ │ │ │ - 102template │ │ │ │ │ -103DefaultNodeToRangeMap makeDefaultNodeToRangeMap(const Tree& tree) │ │ │ │ │ - 104{ │ │ │ │ │ - 105 return DefaultNodeToRangeMap(tree); │ │ │ │ │ - 106} │ │ │ │ │ - 107 │ │ │ │ │ + 83 │ │ │ │ │ + 95template class │ │ │ │ │ +DerivativeTraits, size_t bufferSize> │ │ │ │ │ +96class GridFunction : │ │ │ │ │ + 97 public TypeErasureBase< │ │ │ │ │ + 98 typename Imp::GridFunctionTraits::Concept, │ │ │ │ │ + 99 Imp::GridFunctionTraits:: │ │ │ │ │ +template Model> │ │ │ │ │ + 100{ │ │ │ │ │ + 101 using Traits = Imp::GridFunctionTraits; │ │ │ │ │ + 102 │ │ │ │ │ + 103 using Base = TypeErasureBase; │ │ │ │ │ + 104 │ │ │ │ │ + 105 using DerivativeInterface = typename Traits::DerivativeInterface; │ │ │ │ │ + 106 │ │ │ │ │ + 107 using LocalFunctionInterface = typename Traits::LocalFunctionInterface; │ │ │ │ │ 108 │ │ │ │ │ - 109 │ │ │ │ │ - 110template │ │ │ │ │ -111auto makeDefaultNodeToRangeMap(const Basis& basis, TreePath&& treePath) │ │ │ │ │ - 112 -> decltype(makeDefaultNodeToRangeMap(TypeTree::child(basis.localView │ │ │ │ │ -().tree(),treePath))) │ │ │ │ │ - 113{ │ │ │ │ │ - 114 auto&& localView = basis.localView(); │ │ │ │ │ - 115 localView.bind(*basis.gridView().template begin<0>()); │ │ │ │ │ - 116 auto&& tree = TypeTree::child(localView.tree(),treePath); │ │ │ │ │ - 117 return makeDefaultNodeToRangeMap(tree); │ │ │ │ │ - 118} │ │ │ │ │ - 119 │ │ │ │ │ - 120 │ │ │ │ │ - 121 │ │ │ │ │ - 122} // namespace Dune::Functions │ │ │ │ │ - 123} // namespace Dune │ │ │ │ │ - 124 │ │ │ │ │ - 125 │ │ │ │ │ - 126#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTNODETORANGEMAP_HH │ │ │ │ │ + 109 using EntitySet = typename Traits::EntitySet; │ │ │ │ │ + 110 │ │ │ │ │ + 111public: │ │ │ │ │ + 112 │ │ │ │ │ + 124 template = 0 > │ │ │ │ │ +125 GridFunction(F&& f) : │ │ │ │ │ + 126 Base(std::forward(f)) │ │ │ │ │ + 127 { │ │ │ │ │ + 128 static_assert(Dune::Functions::Concept::isGridFunction(), "Trying to construct a GridFunction from type that does not model │ │ │ │ │ +the GridFunction concept"); │ │ │ │ │ + 129 } │ │ │ │ │ + 130 │ │ │ │ │ +131 GridFunction() = default; │ │ │ │ │ + 132 │ │ │ │ │ +138 Range operator() (const Domain& x) const │ │ │ │ │ + 139 { │ │ │ │ │ + 140 return this->asInterface().operator()(x); │ │ │ │ │ + 141 } │ │ │ │ │ + 142 │ │ │ │ │ +151 friend DerivativeInterface derivative(const GridFunction& t) │ │ │ │ │ + 152 { │ │ │ │ │ + 153 return t.asInterface().derivative(); │ │ │ │ │ + 154 } │ │ │ │ │ + 155 │ │ │ │ │ +165 friend LocalFunctionInterface localFunction(const GridFunction& t) │ │ │ │ │ + 166 { │ │ │ │ │ + 167 return t.asInterface().wrappedLocalFunction(); │ │ │ │ │ + 168 } │ │ │ │ │ + 169 │ │ │ │ │ +176 const EntitySet& entitySet() const │ │ │ │ │ + 177 { │ │ │ │ │ + 178 return this->asInterface().wrappedEntitySet(); │ │ │ │ │ + 179 } │ │ │ │ │ + 180}; │ │ │ │ │ + 181 │ │ │ │ │ + 182 │ │ │ │ │ + 183 │ │ │ │ │ + 184}} // namespace Dune::Functions │ │ │ │ │ + 185 │ │ │ │ │ + 186 │ │ │ │ │ + 187 │ │ │ │ │ + 188#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_HH │ │ │ │ │ +localfunction.hh │ │ │ │ │ +functionconcepts.hh │ │ │ │ │ +typeerasure.hh │ │ │ │ │ +defaultderivativetraits.hh │ │ │ │ │ +differentiablefunction.hh │ │ │ │ │ +gridfunction_imp.hh │ │ │ │ │ +localderivativetraits.hh │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::makeDefaultNodeToRangeMap │ │ │ │ │ -DefaultNodeToRangeMap< Tree > makeDefaultNodeToRangeMap(const Tree &tree) │ │ │ │ │ -Definition: defaultnodetorangemap.hh:103 │ │ │ │ │ -Dune::Functions::DefaultNodeToRangeMap │ │ │ │ │ -A simple node to range map using lexicographic ordering. │ │ │ │ │ -Definition: defaultnodetorangemap.hh:39 │ │ │ │ │ -Dune::Functions::DefaultNodeToRangeMap::indices_ │ │ │ │ │ -std::vector< std::size_t > indices_ │ │ │ │ │ -Definition: defaultnodetorangemap.hh:97 │ │ │ │ │ -Dune::Functions::DefaultNodeToRangeMap::DefaultNodeToRangeMap │ │ │ │ │ -DefaultNodeToRangeMap(const Tree &tree) │ │ │ │ │ -Construct DefaultNodeToRangeMap. │ │ │ │ │ -Definition: defaultnodetorangemap.hh:78 │ │ │ │ │ -Dune::Functions::DefaultNodeToRangeMap::Visitor │ │ │ │ │ -Definition: defaultnodetorangemap.hh:49 │ │ │ │ │ -Dune::Functions::DefaultNodeToRangeMap::Visitor::Visitor │ │ │ │ │ -Visitor(std::vector< std::size_t > &indices) │ │ │ │ │ -Definition: defaultnodetorangemap.hh:50 │ │ │ │ │ -Dune::Functions::DefaultNodeToRangeMap::Visitor::leaf │ │ │ │ │ -void leaf(Node &node, TreePath treePath) │ │ │ │ │ -Definition: defaultnodetorangemap.hh:56 │ │ │ │ │ -Dune::Functions::DefaultNodeToRangeMap::Visitor::counter_ │ │ │ │ │ -std::size_t counter_ │ │ │ │ │ -Definition: defaultnodetorangemap.hh:65 │ │ │ │ │ -Dune::Functions::DefaultNodeToRangeMap::Visitor::indices_ │ │ │ │ │ -std::vector< std::size_t > & indices_ │ │ │ │ │ -Definition: defaultnodetorangemap.hh:64 │ │ │ │ │ -concepts.hh │ │ │ │ │ +Dune::Functions::LocalFunction │ │ │ │ │ +Definition: localfunction.hh:30 │ │ │ │ │ +Dune::Functions::TypeErasureBase │ │ │ │ │ +Base class for type-erased interface wrapper. │ │ │ │ │ +Definition: typeerasure.hh:165 │ │ │ │ │ +Dune::Functions::GridFunction │ │ │ │ │ +Definition: gridfunction.hh:32 │ │ │ │ │ +Dune::Functions::GridFunction<_Range(Domain),_ES,_DerivativeTraits,_bufferSize │ │ │ │ │ +>::derivative │ │ │ │ │ +friend DerivativeInterface derivative(const GridFunction &t) │ │ │ │ │ +Get derivative of wrapped function. │ │ │ │ │ +Definition: gridfunction.hh:151 │ │ │ │ │ +Dune::Functions::GridFunction<_Range(Domain),_ES,_DerivativeTraits,_bufferSize │ │ │ │ │ +>::GridFunction │ │ │ │ │ +GridFunction()=default │ │ │ │ │ +Dune::Functions::GridFunction<_Range(Domain),_ES,_DerivativeTraits,_bufferSize │ │ │ │ │ +>::entitySet │ │ │ │ │ +const EntitySet & entitySet() const │ │ │ │ │ +Get associated EntitySet. │ │ │ │ │ +Definition: gridfunction.hh:176 │ │ │ │ │ +Dune::Functions::GridFunction<_Range(Domain),_ES,_DerivativeTraits,_bufferSize │ │ │ │ │ +>::GridFunction │ │ │ │ │ +GridFunction(F &&f) │ │ │ │ │ +Construct from function. │ │ │ │ │ +Definition: gridfunction.hh:125 │ │ │ │ │ +Dune::Functions::GridFunction<_Range(Domain),_ES,_DerivativeTraits,_bufferSize │ │ │ │ │ +>::localFunction │ │ │ │ │ +friend LocalFunctionInterface localFunction(const GridFunction &t) │ │ │ │ │ +Get local function of wrapped function. │ │ │ │ │ +Definition: gridfunction.hh:165 │ │ │ │ │ +Dune::Functions::LocalDerivativeTraits │ │ │ │ │ +Derivative traits for local functions. │ │ │ │ │ +Definition: localderivativetraits.hh:28 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00173.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: globalvaluedlocalfiniteelement.hh File Reference │ │ │ │ +dune-functions: gridfunction_imp.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,33 +58,26 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Namespaces
│ │ │ │ -
globalvaluedlocalfiniteelement.hh File Reference
│ │ │ │ +
gridfunction_imp.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <array>
│ │ │ │ -#include <numeric>
│ │ │ │ -#include <dune/common/fmatrix.hh>
│ │ │ │ -#include <dune/common/fvector.hh>
│ │ │ │ -#include <dune/common/math.hh>
│ │ │ │ -#include <dune/common/rangeutilities.hh>
│ │ │ │ -#include <dune/geometry/referenceelements.hh>
│ │ │ │ -#include <dune/localfunctions/common/localbasis.hh>
│ │ │ │ -#include <dune/localfunctions/common/localfiniteelementtraits.hh>
│ │ │ │ -#include <dune/localfunctions/common/localinterpolation.hh>
│ │ │ │ +
#include <dune/functions/common/type_traits.hh>
│ │ │ │ +#include <dune/functions/common/interfaces.hh>
│ │ │ │ +#include <dune/functions/common/differentiablefunction_imp.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,27 +4,20 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * functionspacebases │ │ │ │ │ + * gridfunctions │ │ │ │ │ Namespaces │ │ │ │ │ -globalvaluedlocalfiniteelement.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +gridfunction_imp.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00173_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: globalvaluedlocalfiniteelement.hh Source File │ │ │ │ +dune-functions: gridfunction_imp.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,328 +58,92 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
globalvaluedlocalfiniteelement.hh
│ │ │ │ +
gridfunction_imp.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_GLOBALVALUEDLOCALFINITEELEMENT_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_GLOBALVALUEDLOCALFINITEELEMENT_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_IMP_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_IMP_HH
│ │ │ │
5
│ │ │ │ -
6#include <array>
│ │ │ │ -
7#include <numeric>
│ │ │ │ -
8
│ │ │ │ -
9#include <dune/common/fmatrix.hh>
│ │ │ │ -
10#include <dune/common/fvector.hh>
│ │ │ │ -
11#include <dune/common/math.hh>
│ │ │ │ -
12#include <dune/common/rangeutilities.hh>
│ │ │ │ -
13
│ │ │ │ -
14#include <dune/geometry/referenceelements.hh>
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
9
│ │ │ │ +
10
│ │ │ │ +
11
│ │ │ │ +
12namespace Dune {
│ │ │ │ +
13namespace Functions {
│ │ │ │ +
14namespace Imp {
│ │ │ │
15
│ │ │ │ -
16#include <dune/localfunctions/common/localbasis.hh>
│ │ │ │ -
17#include <dune/localfunctions/common/localfiniteelementtraits.hh>
│ │ │ │ -
18#include <dune/localfunctions/common/localinterpolation.hh>
│ │ │ │ -
19
│ │ │ │ -
20namespace Dune::Functions::Impl
│ │ │ │ -
21{
│ │ │ │ -
22
│ │ │ │ -
36 struct ContravariantPiolaTransformator
│ │ │ │ -
37 {
│ │ │ │ -
42 template<typename Values, typename LocalCoordinate, typename Geometry>
│ │ │ │ -
43 static auto apply(Values& values,
│ │ │ │ -
44 const LocalCoordinate& xi,
│ │ │ │ -
45 const Geometry& geometry)
│ │ │ │ -
46 {
│ │ │ │ -
47 auto jacobianTransposed = geometry.jacobianTransposed(xi);
│ │ │ │ -
48 auto integrationElement = geometry.integrationElement(xi);
│ │ │ │ -
49
│ │ │ │ -
50 for (auto& value : values)
│ │ │ │ -
51 {
│ │ │ │ -
52 auto tmp = value;
│ │ │ │ -
53 jacobianTransposed.mtv(tmp, value);
│ │ │ │ -
54 value /= integrationElement;
│ │ │ │ -
55 }
│ │ │ │ -
56 }
│ │ │ │ +
19struct HasFreeLocalFunction
│ │ │ │ +
20{
│ │ │ │ +
21 template<class F>
│ │ │ │ +
22 auto require(F&& f) -> decltype(
│ │ │ │ +
23 localFunction(f)
│ │ │ │ +
24 );
│ │ │ │ +
25};
│ │ │ │ +
26
│ │ │ │ +
27
│ │ │ │ +
28
│ │ │ │ +
29// Interface of type erasure wrapper
│ │ │ │ +
30//
│ │ │ │ +
31// Notice that the basic interface of polymorphic classes (destructor, clone, ...)
│ │ │ │ +
32// will be added by the type erasure foundation classes.
│ │ │ │ +
33template<class Signature, class DerivativeInterface, class LocalFunctionInterface, class EntitySet>
│ │ │ │ +
34class GridFunctionWrapperInterface :
│ │ │ │ +
35 public DifferentiableFunctionWrapperInterface<Signature, DerivativeInterface>
│ │ │ │ +
36{
│ │ │ │ +
37public:
│ │ │ │ +
38 virtual LocalFunctionInterface wrappedLocalFunction() const = 0;
│ │ │ │ +
39
│ │ │ │ +
40 virtual const EntitySet& wrappedEntitySet() const = 0;
│ │ │ │ +
41};
│ │ │ │ +
42
│ │ │ │ +
43
│ │ │ │ +
44// Implementation of type erasure wrapper
│ │ │ │ +
45template<class Signature, class DerivativeInterface, class LocalFunctionInterface, class EntitySet, class B>
│ │ │ │ +
46class GridFunctionWrapperImplementation :
│ │ │ │ +
47 public DifferentiableFunctionWrapperImplementation<Signature, DerivativeInterface, B>
│ │ │ │ +
48{
│ │ │ │ +
49 using Base = DifferentiableFunctionWrapperImplementation<Signature, DerivativeInterface, B>;
│ │ │ │ +
50public:
│ │ │ │ +
51 using Base::Base;
│ │ │ │ +
52
│ │ │ │ +
53 virtual LocalFunctionInterface wrappedLocalFunction() const
│ │ │ │ +
54 {
│ │ │ │ +
55 return localFunction(this->get());
│ │ │ │ +
56 }
│ │ │ │
57
│ │ │ │ -
67 template<typename Gradients, typename LocalCoordinate, typename Geometry>
│ │ │ │ -
68 static auto applyJacobian(Gradients& gradients,
│ │ │ │ -
69 const LocalCoordinate& xi,
│ │ │ │ -
70 const Geometry& geometry)
│ │ │ │ -
71 {
│ │ │ │ -
72 auto jacobianTransposed = geometry.jacobianTransposed(xi);
│ │ │ │ -
73 auto integrationElement = geometry.integrationElement(xi);
│ │ │ │ -
74 for (auto& gradient : gradients)
│ │ │ │ -
75 {
│ │ │ │ -
76 auto tmp = gradient;
│ │ │ │ -
77 gradient = 0;
│ │ │ │ -
78 for (size_t k=0; k<gradient.M(); k++)
│ │ │ │ -
79 for (size_t l=0; l<tmp.N(); l++)
│ │ │ │ -
80 // Use sparseRange because jacobianTransposed may be a sparse DiagonalMatrix
│ │ │ │ -
81 for(auto&& [jacobianTransposed_l_j, j] : sparseRange(jacobianTransposed[l]))
│ │ │ │ -
82 gradient[j][k] += jacobianTransposed_l_j * tmp[l][k];
│ │ │ │ -
83 gradient /= integrationElement;
│ │ │ │ -
84 }
│ │ │ │ -
85 }
│ │ │ │ -
86
│ │ │ │ -
94 template<class Function, class LocalCoordinate, class Element>
│ │ │ │ -
95 class LocalValuedFunction
│ │ │ │ -
96 {
│ │ │ │ -
97 const Function& f_;
│ │ │ │ -
98 const Element& element_;
│ │ │ │ -
99
│ │ │ │ -
100 public:
│ │ │ │ -
101
│ │ │ │ -
102 LocalValuedFunction(const Function& f, const Element& element)
│ │ │ │ -
103 : f_(f), element_(element)
│ │ │ │ -
104 {}
│ │ │ │ -
105
│ │ │ │ -
106 auto operator()(const LocalCoordinate& xi) const
│ │ │ │ -
107 {
│ │ │ │ -
108 auto&& f = Dune::Impl::makeFunctionWithCallOperator<LocalCoordinate>(f_);
│ │ │ │ -
109 auto globalValue = f(xi);
│ │ │ │ -
110
│ │ │ │ -
111 // Apply the inverse Piola transform
│ │ │ │ -
112 auto jacobianInverseTransposed = element_.geometry().jacobianInverseTransposed(xi);
│ │ │ │ -
113 auto integrationElement = element_.geometry().integrationElement(xi);
│ │ │ │ -
114
│ │ │ │ -
115 auto localValue = globalValue;
│ │ │ │ -
116 jacobianInverseTransposed.mtv(globalValue, localValue);
│ │ │ │ -
117 localValue *= integrationElement;
│ │ │ │ -
118
│ │ │ │ -
119 return localValue;
│ │ │ │ -
120 }
│ │ │ │ -
121 };
│ │ │ │ -
122 };
│ │ │ │ -
123
│ │ │ │ -
137 struct CovariantPiolaTransformator
│ │ │ │ -
138 {
│ │ │ │ -
143 template<typename Values, typename LocalCoordinate, typename Geometry>
│ │ │ │ -
144 static auto apply(Values& values,
│ │ │ │ -
145 const LocalCoordinate& xi,
│ │ │ │ -
146 const Geometry& geometry)
│ │ │ │ -
147 {
│ │ │ │ -
148 auto jacobianInverseTransposed = geometry.jacobianInverseTransposed(xi);
│ │ │ │ -
149
│ │ │ │ -
150 for (auto& value : values)
│ │ │ │ -
151 {
│ │ │ │ -
152 auto tmp = value;
│ │ │ │ -
153 jacobianInverseTransposed.mv(tmp, value);
│ │ │ │ -
154 }
│ │ │ │ -
155 }
│ │ │ │ -
156
│ │ │ │ -
166 template<typename Gradients, typename LocalCoordinate, typename Geometry>
│ │ │ │ -
167 static auto applyJacobian(Gradients& gradients,
│ │ │ │ -
168 const LocalCoordinate& xi,
│ │ │ │ -
169 const Geometry& geometry)
│ │ │ │ -
170 {
│ │ │ │ -
171 auto jacobianInverseTransposed = geometry.jacobianInverseTransposed(xi);
│ │ │ │ -
172
│ │ │ │ -
173 for (auto& gradient : gradients)
│ │ │ │ -
174 {
│ │ │ │ -
175 auto tmp = gradient;
│ │ │ │ -
176 gradient = 0;
│ │ │ │ -
177 for (size_t j=0; j<gradient.N(); j++)
│ │ │ │ -
178 for (size_t k=0; k<gradient.M(); k++)
│ │ │ │ -
179 // Use sparseRange because jacobianTransposed may be a sparse DiagonalMatrix
│ │ │ │ -
180 for(auto&& [jacobianInverseTransposed_j_l, l] : sparseRange(jacobianInverseTransposed[j]))
│ │ │ │ -
181 gradient[j][k] += jacobianInverseTransposed_j_l * tmp[l][k];
│ │ │ │ -
182 }
│ │ │ │ -
183 }
│ │ │ │ -
184
│ │ │ │ -
192 template<class Function, class LocalCoordinate, class Element>
│ │ │ │ -
193 class LocalValuedFunction
│ │ │ │ -
194 {
│ │ │ │ -
195 const Function& f_;
│ │ │ │ -
196 const Element& element_;
│ │ │ │ -
197
│ │ │ │ -
198 public:
│ │ │ │ -
199
│ │ │ │ -
200 LocalValuedFunction(const Function& f, const Element& element)
│ │ │ │ -
201 : f_(f), element_(element)
│ │ │ │ -
202 {}
│ │ │ │ -
203
│ │ │ │ -
204 auto operator()(const LocalCoordinate& xi) const
│ │ │ │ -
205 {
│ │ │ │ -
206 auto&& f = Dune::Impl::makeFunctionWithCallOperator<LocalCoordinate>(f_);
│ │ │ │ -
207 auto globalValue = f(xi);
│ │ │ │ -
208
│ │ │ │ -
209 // Apply the inverse Piola transform
│ │ │ │ -
210 auto jacobianTransposed = element_.geometry().jacobianTransposed(xi);
│ │ │ │ -
211
│ │ │ │ -
212 auto localValue = globalValue;
│ │ │ │ -
213 jacobianTransposed.mv(globalValue, localValue);
│ │ │ │ -
214
│ │ │ │ -
215 return localValue;
│ │ │ │ -
216 }
│ │ │ │ -
217 };
│ │ │ │ -
218 };
│ │ │ │ -
219
│ │ │ │ -
226 template<class Transformator, class LocalValuedLocalBasis, class Element>
│ │ │ │ -
227 class GlobalValuedLocalBasis
│ │ │ │ -
228 {
│ │ │ │ -
229 public:
│ │ │ │ -
230 using Traits = typename LocalValuedLocalBasis::Traits;
│ │ │ │ -
231
│ │ │ │ -
234 void bind(const LocalValuedLocalBasis& localValuedLocalBasis, const Element& element)
│ │ │ │ -
235 {
│ │ │ │ -
236 localValuedLocalBasis_ = &localValuedLocalBasis;
│ │ │ │ -
237 element_ = &element;
│ │ │ │ -
238 }
│ │ │ │ -
239
│ │ │ │ -
242 auto size() const
│ │ │ │ -
243 {
│ │ │ │ -
244 return localValuedLocalBasis_->size();
│ │ │ │ -
245 }
│ │ │ │ -
246
│ │ │ │ -
248 void evaluateFunction(const typename Traits::DomainType& x,
│ │ │ │ -
249 std::vector<typename Traits::RangeType>& out) const
│ │ │ │ -
250 {
│ │ │ │ -
251 localValuedLocalBasis_->evaluateFunction(x,out);
│ │ │ │ -
252
│ │ │ │ -
253 Transformator::apply(out, x, element_->geometry());
│ │ │ │ -
254 }
│ │ │ │ -
255
│ │ │ │ -
261 void evaluateJacobian(const typename Traits::DomainType& x,
│ │ │ │ -
262 std::vector<typename Traits::JacobianType>& out) const
│ │ │ │ -
263 {
│ │ │ │ -
264 localValuedLocalBasis_->evaluateJacobian(x,out);
│ │ │ │ -
265
│ │ │ │ -
266 Transformator::applyJacobian(out, x, element_->geometry());
│ │ │ │ -
267 }
│ │ │ │ -
268
│ │ │ │ -
275 void partial(const std::array<unsigned int,2>& order,
│ │ │ │ -
276 const typename Traits::DomainType& x,
│ │ │ │ -
277 std::vector<typename Traits::RangeType>& out) const
│ │ │ │ -
278 {
│ │ │ │ -
279 auto totalOrder = std::accumulate(order.begin(), order.end(), 0);
│ │ │ │ -
280 if (totalOrder == 0) {
│ │ │ │ -
281 evaluateFunction(x, out);
│ │ │ │ -
282 } else if (totalOrder == 1) {
│ │ │ │ -
283 auto const direction = std::distance(order.begin(), std::find(order.begin(), order.end(), 1));
│ │ │ │ -
284 out.resize(size());
│ │ │ │ -
285
│ │ │ │ -
286 // TODO: The following is wasteful: We compute the full Jacobian and then return
│ │ │ │ -
287 // only a part of it. While we need the full Jacobian of the underlying local-valued LFE,
│ │ │ │ -
288 // it should be possible to compute only a partial Piola transform for the requested
│ │ │ │ -
289 // partial derivatives.
│ │ │ │ -
290 std::vector<typename Traits::JacobianType> fullJacobian;
│ │ │ │ -
291 localValuedLocalBasis_->evaluateJacobian(x,fullJacobian);
│ │ │ │ -
292
│ │ │ │ -
293 Transformator::applyJacobian(fullJacobian, x, element_->geometry());
│ │ │ │ -
294
│ │ │ │ -
295 for (std::size_t i=0; i<out.size(); i++)
│ │ │ │ -
296 for (std::size_t j=0; j<out[i].size(); j++)
│ │ │ │ -
297 out[i][j] = fullJacobian[i][j][direction];
│ │ │ │ -
298
│ │ │ │ -
299 } else
│ │ │ │ -
300 DUNE_THROW(NotImplemented, "Partial derivatives of order 2 or higher");
│ │ │ │ -
301 }
│ │ │ │ -
302
│ │ │ │ -
304 auto order() const
│ │ │ │ -
305 {
│ │ │ │ -
306 return localValuedLocalBasis_->order();
│ │ │ │ -
307 }
│ │ │ │ -
308
│ │ │ │ -
309 const LocalValuedLocalBasis* localValuedLocalBasis_;
│ │ │ │ -
310 const Element* element_;
│ │ │ │ -
311 };
│ │ │ │ -
312
│ │ │ │ -
321 template<class Transformator, class LocalValuedLocalInterpolation, class Element>
│ │ │ │ -
322 class GlobalValuedLocalInterpolation
│ │ │ │ -
323 {
│ │ │ │ -
324 public:
│ │ │ │ -
327 void bind(const LocalValuedLocalInterpolation& localValuedLocalInterpolation, const Element& element)
│ │ │ │ -
328 {
│ │ │ │ -
329 localValuedLocalInterpolation_ = &localValuedLocalInterpolation;
│ │ │ │ -
330 element_ = &element;
│ │ │ │ -
331 }
│ │ │ │ -
332
│ │ │ │ -
333 template<typename F, typename C>
│ │ │ │ -
334 void interpolate (const F& f, std::vector<C>& out) const
│ │ │ │ -
335 {
│ │ │ │ -
336 using LocalCoordinate = typename Element::Geometry::LocalCoordinate;
│ │ │ │ -
337 typename Transformator::template LocalValuedFunction<F,LocalCoordinate,Element> localValuedFunction(f, *element_);
│ │ │ │ -
338 localValuedLocalInterpolation_->interpolate(localValuedFunction, out);
│ │ │ │ -
339 }
│ │ │ │ -
340
│ │ │ │ -
341 private:
│ │ │ │ -
342 const LocalValuedLocalInterpolation* localValuedLocalInterpolation_;
│ │ │ │ -
343 const Element* element_;
│ │ │ │ -
344 };
│ │ │ │ -
345
│ │ │ │ -
346
│ │ │ │ -
353 template<class Transformator, class LocalValuedLFE, class Element>
│ │ │ │ -
354 class GlobalValuedLocalFiniteElement
│ │ │ │ -
355 {
│ │ │ │ -
356 using LocalBasis = GlobalValuedLocalBasis<Transformator,
│ │ │ │ -
357 typename LocalValuedLFE::Traits::LocalBasisType,
│ │ │ │ -
358 Element>;
│ │ │ │ -
359 using LocalInterpolation = GlobalValuedLocalInterpolation<Transformator,
│ │ │ │ -
360 typename LocalValuedLFE::Traits::LocalInterpolationType,
│ │ │ │ -
361 Element>;
│ │ │ │ -
362
│ │ │ │ -
363 public:
│ │ │ │ -
366 using Traits = LocalFiniteElementTraits<LocalBasis,
│ │ │ │ -
367 typename LocalValuedLFE::Traits::LocalCoefficientsType,
│ │ │ │ -
368 LocalInterpolation>;
│ │ │ │ -
369
│ │ │ │ -
370 GlobalValuedLocalFiniteElement() {}
│ │ │ │ -
371
│ │ │ │ -
372 void bind(const LocalValuedLFE& localValuedLFE, const Element& element)
│ │ │ │ -
373 {
│ │ │ │ -
374 globalValuedLocalBasis_.bind(localValuedLFE.localBasis(), element);
│ │ │ │ -
375 globalValuedLocalInterpolation_.bind(localValuedLFE.localInterpolation(), element);
│ │ │ │ -
376 localValuedLFE_ = &localValuedLFE;
│ │ │ │ -
377 }
│ │ │ │ -
378
│ │ │ │ -
381 const typename Traits::LocalBasisType& localBasis() const
│ │ │ │ -
382 {
│ │ │ │ -
383 return globalValuedLocalBasis_;
│ │ │ │ -
384 }
│ │ │ │ -
385
│ │ │ │ -
388 const typename Traits::LocalCoefficientsType& localCoefficients() const
│ │ │ │ -
389 {
│ │ │ │ -
390 return localValuedLFE_->localCoefficients();
│ │ │ │ -
391 }
│ │ │ │ -
392
│ │ │ │ -
395 const typename Traits::LocalInterpolationType& localInterpolation() const
│ │ │ │ -
396 {
│ │ │ │ -
397 return globalValuedLocalInterpolation_;
│ │ │ │ -
398 }
│ │ │ │ -
399
│ │ │ │ -
401 std::size_t size() const
│ │ │ │ -
402 {
│ │ │ │ -
403 return localValuedLFE_->size();
│ │ │ │ -
404 }
│ │ │ │ -
405
│ │ │ │ -
408 GeometryType type() const
│ │ │ │ -
409 {
│ │ │ │ -
410 return localValuedLFE_->type();
│ │ │ │ -
411 }
│ │ │ │ -
412
│ │ │ │ -
413 private:
│ │ │ │ -
414
│ │ │ │ -
415 typename Traits::LocalBasisType globalValuedLocalBasis_;
│ │ │ │ -
416 typename Traits::LocalInterpolationType globalValuedLocalInterpolation_;
│ │ │ │ -
417 const LocalValuedLFE* localValuedLFE_;
│ │ │ │ -
418 };
│ │ │ │ -
419
│ │ │ │ -
420} // namespace Dune::Functions::Impl
│ │ │ │ -
421
│ │ │ │ -
422#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_GLOBALVALUEDLOCALFINITEELEMENT_HH
│ │ │ │ -
void interpolate(const B &basis, C &&coeff, const F &f, const BV &bv, const NTRE &nodeToRangeEntry)
Interpolate given function in discrete function space.
Definition: interpolate.hh:202
│ │ │ │ +
58 virtual const EntitySet& wrappedEntitySet() const
│ │ │ │ +
59 {
│ │ │ │ +
60 return this->get().entitySet();
│ │ │ │ +
61 }
│ │ │ │ +
62};
│ │ │ │ +
63
│ │ │ │ +
64
│ │ │ │ +
65
│ │ │ │ +
66}}} // namespace Dune::Functions::Imp
│ │ │ │ +
67
│ │ │ │ +
68
│ │ │ │ +
69
│ │ │ │ +
70#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_IMP_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
Definition: polynomial.hh:10
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,340 +4,91 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * functionspacebases │ │ │ │ │ -globalvaluedlocalfiniteelement.hh │ │ │ │ │ + * gridfunctions │ │ │ │ │ +gridfunction_imp.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_GLOBALVALUEDLOCALFINITEELEMENT_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_GLOBALVALUEDLOCALFINITEELEMENT_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_IMP_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_IMP_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ - 8 │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13 │ │ │ │ │ - 14#include │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8#include │ │ │ │ │ + 9 │ │ │ │ │ + 10 │ │ │ │ │ + 11 │ │ │ │ │ + 12namespace Dune { │ │ │ │ │ + 13namespace Functions { │ │ │ │ │ + 14namespace Imp { │ │ │ │ │ 15 │ │ │ │ │ - 16#include │ │ │ │ │ - 17#include │ │ │ │ │ - 18#include │ │ │ │ │ - 19 │ │ │ │ │ - 20namespace Dune::Functions::Impl │ │ │ │ │ - 21{ │ │ │ │ │ - 22 │ │ │ │ │ - 36 struct ContravariantPiolaTransformator │ │ │ │ │ - 37 { │ │ │ │ │ - 42 template │ │ │ │ │ - 43 static auto apply(Values& values, │ │ │ │ │ - 44 const LocalCoordinate& xi, │ │ │ │ │ - 45 const Geometry& geometry) │ │ │ │ │ - 46 { │ │ │ │ │ - 47 auto jacobianTransposed = geometry.jacobianTransposed(xi); │ │ │ │ │ - 48 auto integrationElement = geometry.integrationElement(xi); │ │ │ │ │ - 49 │ │ │ │ │ - 50 for (auto& value : values) │ │ │ │ │ - 51 { │ │ │ │ │ - 52 auto tmp = value; │ │ │ │ │ - 53 jacobianTransposed.mtv(tmp, value); │ │ │ │ │ - 54 value /= integrationElement; │ │ │ │ │ - 55 } │ │ │ │ │ + 19struct HasFreeLocalFunction │ │ │ │ │ + 20{ │ │ │ │ │ + 21 template │ │ │ │ │ + 22 auto require(F&& f) -> decltype( │ │ │ │ │ + 23 localFunction(f) │ │ │ │ │ + 24 ); │ │ │ │ │ + 25}; │ │ │ │ │ + 26 │ │ │ │ │ + 27 │ │ │ │ │ + 28 │ │ │ │ │ + 29// Interface of type erasure wrapper │ │ │ │ │ + 30// │ │ │ │ │ + 31// Notice that the basic interface of polymorphic classes (destructor, │ │ │ │ │ +clone, ...) │ │ │ │ │ + 32// will be added by the type erasure foundation classes. │ │ │ │ │ + 33template │ │ │ │ │ + 34class GridFunctionWrapperInterface : │ │ │ │ │ + 35 public DifferentiableFunctionWrapperInterface │ │ │ │ │ + 36{ │ │ │ │ │ + 37public: │ │ │ │ │ + 38 virtual LocalFunctionInterface wrappedLocalFunction() const = 0; │ │ │ │ │ + 39 │ │ │ │ │ + 40 virtual const EntitySet& wrappedEntitySet() const = 0; │ │ │ │ │ + 41}; │ │ │ │ │ + 42 │ │ │ │ │ + 43 │ │ │ │ │ + 44// Implementation of type erasure wrapper │ │ │ │ │ + 45template │ │ │ │ │ + 46class GridFunctionWrapperImplementation : │ │ │ │ │ + 47 public DifferentiableFunctionWrapperImplementation │ │ │ │ │ + 48{ │ │ │ │ │ + 49 using Base = DifferentiableFunctionWrapperImplementation; │ │ │ │ │ + 50public: │ │ │ │ │ + 51 using Base::Base; │ │ │ │ │ + 52 │ │ │ │ │ + 53 virtual LocalFunctionInterface wrappedLocalFunction() const │ │ │ │ │ + 54 { │ │ │ │ │ + 55 return localFunction(this->get()); │ │ │ │ │ 56 } │ │ │ │ │ 57 │ │ │ │ │ - 67 template │ │ │ │ │ - 68 static auto applyJacobian(Gradients& gradients, │ │ │ │ │ - 69 const LocalCoordinate& xi, │ │ │ │ │ - 70 const Geometry& geometry) │ │ │ │ │ - 71 { │ │ │ │ │ - 72 auto jacobianTransposed = geometry.jacobianTransposed(xi); │ │ │ │ │ - 73 auto integrationElement = geometry.integrationElement(xi); │ │ │ │ │ - 74 for (auto& gradient : gradients) │ │ │ │ │ - 75 { │ │ │ │ │ - 76 auto tmp = gradient; │ │ │ │ │ - 77 gradient = 0; │ │ │ │ │ - 78 for (size_t k=0; k │ │ │ │ │ - 95 class LocalValuedFunction │ │ │ │ │ - 96 { │ │ │ │ │ - 97 const Function& f_; │ │ │ │ │ - 98 const Element& element_; │ │ │ │ │ - 99 │ │ │ │ │ - 100 public: │ │ │ │ │ - 101 │ │ │ │ │ - 102 LocalValuedFunction(const Function& f, const Element& element) │ │ │ │ │ - 103 : f_(f), element_(element) │ │ │ │ │ - 104 {} │ │ │ │ │ - 105 │ │ │ │ │ - 106 auto operator()(const LocalCoordinate& xi) const │ │ │ │ │ - 107 { │ │ │ │ │ - 108 auto&& f = Dune::Impl::makeFunctionWithCallOperator(f_); │ │ │ │ │ - 109 auto globalValue = f(xi); │ │ │ │ │ - 110 │ │ │ │ │ - 111 // Apply the inverse Piola transform │ │ │ │ │ - 112 auto jacobianInverseTransposed = element_.geometry │ │ │ │ │ -().jacobianInverseTransposed(xi); │ │ │ │ │ - 113 auto integrationElement = element_.geometry().integrationElement(xi); │ │ │ │ │ - 114 │ │ │ │ │ - 115 auto localValue = globalValue; │ │ │ │ │ - 116 jacobianInverseTransposed.mtv(globalValue, localValue); │ │ │ │ │ - 117 localValue *= integrationElement; │ │ │ │ │ - 118 │ │ │ │ │ - 119 return localValue; │ │ │ │ │ - 120 } │ │ │ │ │ - 121 }; │ │ │ │ │ - 122 }; │ │ │ │ │ - 123 │ │ │ │ │ - 137 struct CovariantPiolaTransformator │ │ │ │ │ - 138 { │ │ │ │ │ - 143 template │ │ │ │ │ - 144 static auto apply(Values& values, │ │ │ │ │ - 145 const LocalCoordinate& xi, │ │ │ │ │ - 146 const Geometry& geometry) │ │ │ │ │ - 147 { │ │ │ │ │ - 148 auto jacobianInverseTransposed = geometry.jacobianInverseTransposed(xi); │ │ │ │ │ - 149 │ │ │ │ │ - 150 for (auto& value : values) │ │ │ │ │ - 151 { │ │ │ │ │ - 152 auto tmp = value; │ │ │ │ │ - 153 jacobianInverseTransposed.mv(tmp, value); │ │ │ │ │ - 154 } │ │ │ │ │ - 155 } │ │ │ │ │ - 156 │ │ │ │ │ - 166 template │ │ │ │ │ - 167 static auto applyJacobian(Gradients& gradients, │ │ │ │ │ - 168 const LocalCoordinate& xi, │ │ │ │ │ - 169 const Geometry& geometry) │ │ │ │ │ - 170 { │ │ │ │ │ - 171 auto jacobianInverseTransposed = geometry.jacobianInverseTransposed(xi); │ │ │ │ │ - 172 │ │ │ │ │ - 173 for (auto& gradient : gradients) │ │ │ │ │ - 174 { │ │ │ │ │ - 175 auto tmp = gradient; │ │ │ │ │ - 176 gradient = 0; │ │ │ │ │ - 177 for (size_t j=0; j │ │ │ │ │ - 193 class LocalValuedFunction │ │ │ │ │ - 194 { │ │ │ │ │ - 195 const Function& f_; │ │ │ │ │ - 196 const Element& element_; │ │ │ │ │ - 197 │ │ │ │ │ - 198 public: │ │ │ │ │ - 199 │ │ │ │ │ - 200 LocalValuedFunction(const Function& f, const Element& element) │ │ │ │ │ - 201 : f_(f), element_(element) │ │ │ │ │ - 202 {} │ │ │ │ │ - 203 │ │ │ │ │ - 204 auto operator()(const LocalCoordinate& xi) const │ │ │ │ │ - 205 { │ │ │ │ │ - 206 auto&& f = Dune::Impl::makeFunctionWithCallOperator(f_); │ │ │ │ │ - 207 auto globalValue = f(xi); │ │ │ │ │ - 208 │ │ │ │ │ - 209 // Apply the inverse Piola transform │ │ │ │ │ - 210 auto jacobianTransposed = element_.geometry().jacobianTransposed(xi); │ │ │ │ │ - 211 │ │ │ │ │ - 212 auto localValue = globalValue; │ │ │ │ │ - 213 jacobianTransposed.mv(globalValue, localValue); │ │ │ │ │ - 214 │ │ │ │ │ - 215 return localValue; │ │ │ │ │ - 216 } │ │ │ │ │ - 217 }; │ │ │ │ │ - 218 }; │ │ │ │ │ - 219 │ │ │ │ │ - 226 template │ │ │ │ │ - 227 class GlobalValuedLocalBasis │ │ │ │ │ - 228 { │ │ │ │ │ - 229 public: │ │ │ │ │ - 230 using Traits = typename LocalValuedLocalBasis::Traits; │ │ │ │ │ - 231 │ │ │ │ │ - 234 void bind(const LocalValuedLocalBasis& localValuedLocalBasis, const │ │ │ │ │ -Element& element) │ │ │ │ │ - 235 { │ │ │ │ │ - 236 localValuedLocalBasis_ = &localValuedLocalBasis; │ │ │ │ │ - 237 element_ = &element; │ │ │ │ │ - 238 } │ │ │ │ │ - 239 │ │ │ │ │ - 242 auto size() const │ │ │ │ │ - 243 { │ │ │ │ │ - 244 return localValuedLocalBasis_->size(); │ │ │ │ │ - 245 } │ │ │ │ │ - 246 │ │ │ │ │ - 248 void evaluateFunction(const typename Traits::DomainType& x, │ │ │ │ │ - 249 std::vector& out) const │ │ │ │ │ - 250 { │ │ │ │ │ - 251 localValuedLocalBasis_->evaluateFunction(x,out); │ │ │ │ │ - 252 │ │ │ │ │ - 253 Transformator::apply(out, x, element_->geometry()); │ │ │ │ │ - 254 } │ │ │ │ │ - 255 │ │ │ │ │ - 261 void evaluateJacobian(const typename Traits::DomainType& x, │ │ │ │ │ - 262 std::vector& out) const │ │ │ │ │ - 263 { │ │ │ │ │ - 264 localValuedLocalBasis_->evaluateJacobian(x,out); │ │ │ │ │ - 265 │ │ │ │ │ - 266 Transformator::applyJacobian(out, x, element_->geometry()); │ │ │ │ │ - 267 } │ │ │ │ │ - 268 │ │ │ │ │ - 275 void partial(const std::array& order, │ │ │ │ │ - 276 const typename Traits::DomainType& x, │ │ │ │ │ - 277 std::vector& out) const │ │ │ │ │ - 278 { │ │ │ │ │ - 279 auto totalOrder = std::accumulate(order.begin(), order.end(), 0); │ │ │ │ │ - 280 if (totalOrder == 0) { │ │ │ │ │ - 281 evaluateFunction(x, out); │ │ │ │ │ - 282 } else if (totalOrder == 1) { │ │ │ │ │ - 283 auto const direction = std::distance(order.begin(), std::find(order.begin │ │ │ │ │ -(), order.end(), 1)); │ │ │ │ │ - 284 out.resize(size()); │ │ │ │ │ - 285 │ │ │ │ │ - 286 // TODO: The following is wasteful: We compute the full Jacobian and then │ │ │ │ │ -return │ │ │ │ │ - 287 // only a part of it. While we need the full Jacobian of the underlying │ │ │ │ │ -local-valued LFE, │ │ │ │ │ - 288 // it should be possible to compute only a partial Piola transform for the │ │ │ │ │ -requested │ │ │ │ │ - 289 // partial derivatives. │ │ │ │ │ - 290 std::vector fullJacobian; │ │ │ │ │ - 291 localValuedLocalBasis_->evaluateJacobian(x,fullJacobian); │ │ │ │ │ - 292 │ │ │ │ │ - 293 Transformator::applyJacobian(fullJacobian, x, element_->geometry()); │ │ │ │ │ - 294 │ │ │ │ │ - 295 for (std::size_t i=0; iorder(); │ │ │ │ │ - 307 } │ │ │ │ │ - 308 │ │ │ │ │ - 309 const LocalValuedLocalBasis* localValuedLocalBasis_; │ │ │ │ │ - 310 const Element* element_; │ │ │ │ │ - 311 }; │ │ │ │ │ - 312 │ │ │ │ │ - 321 template │ │ │ │ │ - 322 class GlobalValuedLocalInterpolation │ │ │ │ │ - 323 { │ │ │ │ │ - 324 public: │ │ │ │ │ - 327 void bind(const LocalValuedLocalInterpolation& │ │ │ │ │ -localValuedLocalInterpolation, const Element& element) │ │ │ │ │ - 328 { │ │ │ │ │ - 329 localValuedLocalInterpolation_ = &localValuedLocalInterpolation; │ │ │ │ │ - 330 element_ = &element; │ │ │ │ │ - 331 } │ │ │ │ │ - 332 │ │ │ │ │ - 333 template │ │ │ │ │ - 334 void interpolate (const F& f, std::vector& out) const │ │ │ │ │ - 335 { │ │ │ │ │ - 336 using LocalCoordinate = typename Element::Geometry::LocalCoordinate; │ │ │ │ │ - 337 typename Transformator::template │ │ │ │ │ -LocalValuedFunction localValuedFunction(f, │ │ │ │ │ -*element_); │ │ │ │ │ - 338 localValuedLocalInterpolation_->interpolate(localValuedFunction, out); │ │ │ │ │ - 339 } │ │ │ │ │ - 340 │ │ │ │ │ - 341 private: │ │ │ │ │ - 342 const LocalValuedLocalInterpolation* localValuedLocalInterpolation_; │ │ │ │ │ - 343 const Element* element_; │ │ │ │ │ - 344 }; │ │ │ │ │ - 345 │ │ │ │ │ - 346 │ │ │ │ │ - 353 template │ │ │ │ │ - 354 class GlobalValuedLocalFiniteElement │ │ │ │ │ - 355 { │ │ │ │ │ - 356 using LocalBasis = GlobalValuedLocalBasis; │ │ │ │ │ - 359 using LocalInterpolation = GlobalValuedLocalInterpolation; │ │ │ │ │ - 362 │ │ │ │ │ - 363 public: │ │ │ │ │ - 366 using Traits = LocalFiniteElementTraits; │ │ │ │ │ - 369 │ │ │ │ │ - 370 GlobalValuedLocalFiniteElement() {} │ │ │ │ │ - 371 │ │ │ │ │ - 372 void bind(const LocalValuedLFE& localValuedLFE, const Element& element) │ │ │ │ │ - 373 { │ │ │ │ │ - 374 globalValuedLocalBasis_.bind(localValuedLFE.localBasis(), element); │ │ │ │ │ - 375 globalValuedLocalInterpolation_.bind(localValuedLFE.localInterpolation(), │ │ │ │ │ -element); │ │ │ │ │ - 376 localValuedLFE_ = &localValuedLFE; │ │ │ │ │ - 377 } │ │ │ │ │ - 378 │ │ │ │ │ - 381 const typename Traits::LocalBasisType& localBasis() const │ │ │ │ │ - 382 { │ │ │ │ │ - 383 return globalValuedLocalBasis_; │ │ │ │ │ - 384 } │ │ │ │ │ - 385 │ │ │ │ │ - 388 const typename Traits::LocalCoefficientsType& localCoefficients() const │ │ │ │ │ - 389 { │ │ │ │ │ - 390 return localValuedLFE_->localCoefficients(); │ │ │ │ │ - 391 } │ │ │ │ │ - 392 │ │ │ │ │ - 395 const typename Traits::LocalInterpolationType& localInterpolation() const │ │ │ │ │ - 396 { │ │ │ │ │ - 397 return globalValuedLocalInterpolation_; │ │ │ │ │ - 398 } │ │ │ │ │ - 399 │ │ │ │ │ - 401 std::size_t size() const │ │ │ │ │ - 402 { │ │ │ │ │ - 403 return localValuedLFE_->size(); │ │ │ │ │ - 404 } │ │ │ │ │ - 405 │ │ │ │ │ - 408 GeometryType type() const │ │ │ │ │ - 409 { │ │ │ │ │ - 410 return localValuedLFE_->type(); │ │ │ │ │ - 411 } │ │ │ │ │ - 412 │ │ │ │ │ - 413 private: │ │ │ │ │ - 414 │ │ │ │ │ - 415 typename Traits::LocalBasisType globalValuedLocalBasis_; │ │ │ │ │ - 416 typename Traits::LocalInterpolationType globalValuedLocalInterpolation_; │ │ │ │ │ - 417 const LocalValuedLFE* localValuedLFE_; │ │ │ │ │ - 418 }; │ │ │ │ │ - 419 │ │ │ │ │ - 420} // namespace Dune::Functions::Impl │ │ │ │ │ - 421 │ │ │ │ │ - 422#endif / │ │ │ │ │ -/ DUNE_FUNCTIONS_FUNCTIONSPACEBASES_GLOBALVALUEDLOCALFINITEELEMENT_HH │ │ │ │ │ -Dune::Functions::interpolate │ │ │ │ │ -void interpolate(const B &basis, C &&coeff, const F &f, const BV &bv, const │ │ │ │ │ -NTRE &nodeToRangeEntry) │ │ │ │ │ -Interpolate given function in discrete function space. │ │ │ │ │ -Definition: interpolate.hh:202 │ │ │ │ │ + 58 virtual const EntitySet& wrappedEntitySet() const │ │ │ │ │ + 59 { │ │ │ │ │ + 60 return this->get().entitySet(); │ │ │ │ │ + 61 } │ │ │ │ │ + 62}; │ │ │ │ │ + 63 │ │ │ │ │ + 64 │ │ │ │ │ + 65 │ │ │ │ │ + 66}}} // namespace Dune::Functions::Imp │ │ │ │ │ + 67 │ │ │ │ │ + 68 │ │ │ │ │ + 69 │ │ │ │ │ + 70#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_IMP_HH │ │ │ │ │ +differentiablefunction_imp.hh │ │ │ │ │ +type_traits.hh │ │ │ │ │ +interfaces.hh │ │ │ │ │ +Dune │ │ │ │ │ +Definition: polynomial.hh:10 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00176.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: hierarchicvectorwrapper.hh File Reference │ │ │ │ +dune-functions: gridviewentityset.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,59 +58,40 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
hierarchicvectorwrapper.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
gridviewentityset.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <dune/common/concept.hh>
│ │ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ │ -#include <dune/common/indices.hh>
│ │ │ │ -#include <dune/functions/common/indexaccess.hh>
│ │ │ │ -#include <dune/functions/common/utility.hh>
│ │ │ │ -#include <dune/functions/common/type_traits.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │ +
#include <memory>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ Classes

class  Dune::Functions::HierarchicVectorWrapper< V, CO >
 A wrapper providing multiindex access to vector entries. More...
class  Dune::Functions::GridViewEntitySet< GV, cd >
 An entity set for all entities of given codim in a grid view. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<class V >
HierarchicVectorWrapper< V > Dune::Functions::hierarchicVector (V &v)
 
template<class MultiIndex , class V , typename std::enable_if< models< Concept::HasIndexAccess, V, MultiIndex >(), int >::type = 0>
V & Dune::Functions::makeHierarchicVectorForMultiIndex (V &v)
 
template<class MultiIndex , class V , typename std::enable_if< not models< Concept::HasIndexAccess, V, MultiIndex >(), int >::type = 0>
HierarchicVectorWrapper< V > Dune::Functions::makeHierarchicVectorForMultiIndex (V &v)
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,44 +4,24 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * functionspacebases │ │ │ │ │ -Classes | Namespaces | Functions │ │ │ │ │ -hierarchicvectorwrapper.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * gridfunctions │ │ │ │ │ +Classes | Namespaces │ │ │ │ │ +gridviewentityset.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::HierarchicVectorWrapper<_V,_CO_> │ │ │ │ │ -  A wrapper providing multiindex access to vector entries. More... │ │ │ │ │ +class  Dune::Functions::GridViewEntitySet<_GV,_cd_> │ │ │ │ │ +  An entity set for all entities of given codim in a grid view. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ - Functions │ │ │ │ │ -template │ │ │ │ │ -HierarchicVectorWrapper< V > Dune::Functions::hierarchicVector (V &v) │ │ │ │ │ -  │ │ │ │ │ -template(), int >::type = 0> │ │ │ │ │ - V & Dune::Functions:: │ │ │ │ │ - makeHierarchicVectorForMultiIndex (V &v) │ │ │ │ │ -  │ │ │ │ │ -template(), int >::type = 0> │ │ │ │ │ -HierarchicVectorWrapper< V > Dune::Functions:: │ │ │ │ │ - makeHierarchicVectorForMultiIndex (V &v) │ │ │ │ │ -  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00176_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: hierarchicvectorwrapper.hh Source File │ │ │ │ +dune-functions: gridviewentityset.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,280 +58,109 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
hierarchicvectorwrapper.hh
│ │ │ │ +
gridviewentityset.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICVECTORWRAPPER_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICVECTORWRAPPER_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWENTITYSET_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWENTITYSET_HH
│ │ │ │
5
│ │ │ │ -
6#include <dune/common/concept.hh>
│ │ │ │ -
7#include <dune/common/hybridutilities.hh>
│ │ │ │ -
8#include <dune/common/indices.hh>
│ │ │ │ -
9
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
14
│ │ │ │ -
15
│ │ │ │ -
16namespace Dune {
│ │ │ │ -
17namespace Functions {
│ │ │ │ -
18
│ │ │ │ -
19
│ │ │ │ -
20
│ │ │ │ -
21namespace Imp {
│ │ │ │ -
22
│ │ │ │ -
23 // Construct default coefficient type from vector and multiindex type
│ │ │ │ -
24 // This requires that MultiIndex has a static size. Otherwise the
│ │ │ │ -
25 // vector type itself is returned.
│ │ │ │ -
26 template<class V, class MultiIndex>
│ │ │ │ -
27 struct CoefficientType
│ │ │ │ -
28 {
│ │ │ │ -
29 template<class E, std::size_t size>
│ │ │ │ -
30 struct DefaultCoefficientTypeHelper
│ │ │ │ -
31 {
│ │ │ │ -
32 using E0 = decltype(std::declval<E>()[Dune::Indices::_0]);
│ │ │ │ -
33 using type = typename DefaultCoefficientTypeHelper<E0, size-1>::type;
│ │ │ │ -
34 };
│ │ │ │ -
35
│ │ │ │ -
36 template<class E>
│ │ │ │ -
37 struct DefaultCoefficientTypeHelper<E, 0>
│ │ │ │ -
38 {
│ │ │ │ -
39 using type = E;
│ │ │ │ -
40 };
│ │ │ │ -
41
│ │ │ │ -
42 template<class MI,
│ │ │ │ -
43 typename std::enable_if<HasStaticSize<MI>::value, int>::type = 0>
│ │ │ │ -
44 static constexpr std::size_t getStaticSizeOrZero()
│ │ │ │ -
45 {
│ │ │ │ -
46 return StaticSize<MI>::value;
│ │ │ │ -
47 }
│ │ │ │ -
48
│ │ │ │ -
49 template<class MI,
│ │ │ │ -
50 typename std::enable_if<not HasStaticSize<MI>::value, int>::type = 0>
│ │ │ │ -
51 static constexpr std::size_t getStaticSizeOrZero()
│ │ │ │ -
52 {
│ │ │ │ -
53 return 0;
│ │ │ │ -
54 }
│ │ │ │ -
55
│ │ │ │ -
56 using type = typename DefaultCoefficientTypeHelper<V, getStaticSizeOrZero<MultiIndex>()>::type;
│ │ │ │ -
57 };
│ │ │ │ -
58
│ │ │ │ -
59
│ │ │ │ -
60
│ │ │ │ -
61 // This tag class is used as Coefficient template parameter
│ │ │ │ -
62 // for HierarchicVectorWrapper if the coefficient type should
│ │ │ │ -
63 // be deduced.
│ │ │ │ -
64 struct DeducedCoefficientTag {};
│ │ │ │ -
65
│ │ │ │ -
66} // namespace Imp
│ │ │ │ -
67
│ │ │ │ +
6#include <memory>
│ │ │ │ +
7
│ │ │ │ +
8
│ │ │ │ +
9namespace Dune {
│ │ │ │ +
10
│ │ │ │ +
11namespace Functions {
│ │ │ │ +
12
│ │ │ │ +
13
│ │ │ │ +
21template<class GV, int cd>
│ │ │ │ + │ │ │ │ +
23{
│ │ │ │ +
24public:
│ │ │ │ +
25
│ │ │ │ +
26 typedef GV GridView;
│ │ │ │ +
27 enum {
│ │ │ │ +
28 codim = cd
│ │ │ │ +
29 };
│ │ │ │ +
30
│ │ │ │ +
32 typedef typename GridView::template Codim<codim>::Entity Element;
│ │ │ │ +
33
│ │ │ │ +
35 typedef typename Element::Geometry::LocalCoordinate LocalCoordinate;
│ │ │ │ +
36 typedef typename Element::Geometry::GlobalCoordinate GlobalCoordinate;
│ │ │ │ +
37
│ │ │ │ + │ │ │ │ +
39
│ │ │ │ +
41 typedef typename GridView::template Codim<codim>::Iterator const_iterator;
│ │ │ │ +
42
│ │ │ │ + │ │ │ │ +
45
│ │ │ │ + │ │ │ │ +
48 gv_(gv)
│ │ │ │ +
49 {}
│ │ │ │ +
50
│ │ │ │ +
52 bool contains(const Element& e) const
│ │ │ │ +
53 {
│ │ │ │ +
54 return gv_.contains(e);
│ │ │ │ +
55 }
│ │ │ │ +
56
│ │ │ │ +
58 size_t size() const
│ │ │ │ +
59 {
│ │ │ │ +
60 return gv_.size(codim);
│ │ │ │ +
61 }
│ │ │ │ +
62
│ │ │ │ + │ │ │ │ +
65 {
│ │ │ │ +
66 return gv_.template begin<codim>();
│ │ │ │ +
67 }
│ │ │ │
68
│ │ │ │ -
69
│ │ │ │ -
90template<class V, class CO=Imp::DeducedCoefficientTag>
│ │ │ │ - │ │ │ │ -
92{
│ │ │ │ -
93 template<class MultiIndex>
│ │ │ │ -
94 using Coefficient = typename std::conditional< std::is_same<Imp::DeducedCoefficientTag,CO>::value and HasStaticSize<MultiIndex>::value,
│ │ │ │ -
95 typename Imp::CoefficientType<V, MultiIndex>::type,
│ │ │ │ -
96 CO
│ │ │ │ -
97 >::type;
│ │ │ │ -
98
│ │ │ │ -
99
│ │ │ │ -
100 using size_type = std::size_t;
│ │ │ │ -
101
│ │ │ │ -
102 template<class C, class SizeProvider,
│ │ │ │ -
103 typename std::enable_if< not models<Concept::HasResize, C>(), int>::type = 0,
│ │ │ │ -
104 typename std::enable_if< not models<Concept::HasSizeMethod, C>(), int>::type = 0>
│ │ │ │ -
105 static void resizeHelper(C& c, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ -
106 {
│ │ │ │ -
107 auto size = sizeProvider.size(prefix);
│ │ │ │ -
108 if (size != 0)
│ │ │ │ -
109 DUNE_THROW(RangeError, "Can't resize scalar vector entry v[" << prefix << "] to size(" << prefix << ")=" << size);
│ │ │ │ -
110 }
│ │ │ │ -
111
│ │ │ │ -
112 struct StaticResizeHelper
│ │ │ │ -
113 {
│ │ │ │ -
114 template<class I, class C, class SizeProvider>
│ │ │ │ -
115 static void apply(I&& i, C& c, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ -
116 {
│ │ │ │ -
117 prefix.back() = i;
│ │ │ │ -
118 resizeHelper(c[i], sizeProvider, prefix);
│ │ │ │ -
119 }
│ │ │ │ -
120 };
│ │ │ │ -
121
│ │ │ │ -
122 template<class C, class SizeProvider,
│ │ │ │ -
123 typename std::enable_if< not models<Concept::HasResize, C>(), int>::type = 0,
│ │ │ │ -
124 typename std::enable_if< models<Concept::HasSizeMethod, C>(), int>::type = 0>
│ │ │ │ -
125 static void resizeHelper(C& c, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ -
126 {
│ │ │ │ -
127 auto size = sizeProvider.size(prefix);
│ │ │ │ -
128 if (size == 0)
│ │ │ │ -
129 return;
│ │ │ │ -
130
│ │ │ │ -
131 if (c.size() != size)
│ │ │ │ -
132 DUNE_THROW(RangeError, "Can't resize statically sized vector entry v[" << prefix << "] of size " << c.size() << " to size(" << prefix << ")=" << size);
│ │ │ │ -
133
│ │ │ │ -
134 using namespace Dune::Hybrid;
│ │ │ │ -
135 prefix.push_back(0);
│ │ │ │ -
136 forEach(integralRange(Hybrid::size(c)), [&](auto&& i) {
│ │ │ │ -
137 StaticResizeHelper::apply(i, c, sizeProvider, prefix);
│ │ │ │ -
138 });
│ │ │ │ -
139 }
│ │ │ │ -
140
│ │ │ │ -
141 template<class C, class SizeProvider,
│ │ │ │ -
142 typename std::enable_if< models<Concept::HasResize, C>(), int>::type = 0>
│ │ │ │ -
143 static void resizeHelper(C& c, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ -
144 {
│ │ │ │ -
145 auto size = sizeProvider.size(prefix);
│ │ │ │ -
146 if (size==0)
│ │ │ │ -
147 {
│ │ │ │ -
148 if (c.size()==0)
│ │ │ │ -
149 DUNE_THROW(RangeError, "Can't resize dynamically sized vector entry v[" << prefix << "]. Its size is 0 but the target size is unknown due to size(" << prefix << ")=0.");
│ │ │ │ -
150 else
│ │ │ │ -
151 return;
│ │ │ │ -
152 }
│ │ │ │ -
153
│ │ │ │ -
154 c.resize(size);
│ │ │ │ -
155 prefix.push_back(0);
│ │ │ │ -
156 for(std::size_t i=0; i<size; ++i)
│ │ │ │ -
157 {
│ │ │ │ -
158 prefix.back() = i;
│ │ │ │ -
159 resizeHelper(c[i], sizeProvider, prefix);
│ │ │ │ -
160 }
│ │ │ │ -
161 }
│ │ │ │ -
162
│ │ │ │ -
163
│ │ │ │ -
164
│ │ │ │ -
165public:
│ │ │ │ -
166
│ │ │ │ -
167 using Vector = V;
│ │ │ │ -
168
│ │ │ │ -
169 template<class MultiIndex>
│ │ │ │ -
170 using Entry = Coefficient<MultiIndex>;
│ │ │ │ -
171
│ │ │ │ - │ │ │ │ -
173 vector_(&vector)
│ │ │ │ -
174 {}
│ │ │ │ -
175
│ │ │ │ -
176 template<class SizeProvider>
│ │ │ │ -
177 void resize(const SizeProvider& sizeProvider)
│ │ │ │ -
178 {
│ │ │ │ -
179 typename SizeProvider::SizePrefix prefix;
│ │ │ │ -
180 prefix.resize(0);
│ │ │ │ -
181 resizeHelper(*vector_, sizeProvider, prefix);
│ │ │ │ -
182 }
│ │ │ │ -
183
│ │ │ │ -
184 template<class MultiIndex>
│ │ │ │ -
185 const Entry<MultiIndex>& operator[](const MultiIndex& index) const
│ │ │ │ -
186 {
│ │ │ │ -
187 static_assert(not std::is_same<Imp::DeducedCoefficientTag,Entry<MultiIndex>>::value, "Coefficient type for HierarchicVectorWrapper and given multi-index type cannot be determined automatically!");
│ │ │ │ -
188 return hybridMultiIndexAccess<const Entry<MultiIndex>&>(*vector_, index);
│ │ │ │ -
189 }
│ │ │ │ -
190
│ │ │ │ -
191 template<class MultiIndex>
│ │ │ │ -
192 Entry<MultiIndex>& operator[](const MultiIndex& index)
│ │ │ │ -
193 {
│ │ │ │ -
194 static_assert(not std::is_same<Imp::DeducedCoefficientTag,Entry<MultiIndex>>::value, "Coefficient type for HierarchicVectorWrapper and given multi-index type cannot be determined automatically!");
│ │ │ │ -
195 return hybridMultiIndexAccess<Entry<MultiIndex>&>(*vector_, index);
│ │ │ │ -
196 }
│ │ │ │ -
197
│ │ │ │ -
198 template<class MultiIndex>
│ │ │ │ -
199 const Entry<MultiIndex>& operator()(const MultiIndex& index) const
│ │ │ │ -
200 {
│ │ │ │ -
201 static_assert(not std::is_same<Imp::DeducedCoefficientTag,Entry<MultiIndex>>::value, "Coefficient type for HierarchicVectorWrapper and given multi-index type cannot be determined automatically!");
│ │ │ │ -
202 return (*this)[index];
│ │ │ │ -
203 }
│ │ │ │ -
204
│ │ │ │ -
205 template<class MultiIndex>
│ │ │ │ -
206 Entry<MultiIndex>& operator()(const MultiIndex& index)
│ │ │ │ -
207 {
│ │ │ │ -
208 static_assert(not std::is_same<Imp::DeducedCoefficientTag,Entry<MultiIndex>>::value, "Coefficient type for HierarchicVectorWrapper and given multi-index type cannot be determined automatically!");
│ │ │ │ -
209 return (*this)[index];
│ │ │ │ -
210 }
│ │ │ │ -
211
│ │ │ │ -
212 const Vector& vector() const
│ │ │ │ -
213 {
│ │ │ │ -
214 return *vector_;
│ │ │ │ -
215 }
│ │ │ │ -
216
│ │ │ │ - │ │ │ │ -
218 {
│ │ │ │ -
219 return *vector_;
│ │ │ │ -
220 }
│ │ │ │ -
221
│ │ │ │ -
222private:
│ │ │ │ -
223
│ │ │ │ -
224 Vector* vector_;
│ │ │ │ -
225};
│ │ │ │ -
226
│ │ │ │ -
227
│ │ │ │ -
228
│ │ │ │ -
229
│ │ │ │ -
230template<class V>
│ │ │ │ - │ │ │ │ -
232{
│ │ │ │ - │ │ │ │ -
234}
│ │ │ │ -
235
│ │ │ │ -
236
│ │ │ │ -
237
│ │ │ │ -
238template<class MultiIndex, class V,
│ │ │ │ -
239 typename std::enable_if< models<Concept::HasIndexAccess, V, MultiIndex>(), int>::type = 0>
│ │ │ │ - │ │ │ │ -
241{
│ │ │ │ -
242 return v;
│ │ │ │ -
243}
│ │ │ │ -
244
│ │ │ │ -
245
│ │ │ │ -
246
│ │ │ │ -
247template<class MultiIndex, class V,
│ │ │ │ -
248 typename std::enable_if< not models<Concept::HasIndexAccess, V, MultiIndex>(), int>::type = 0>
│ │ │ │ - │ │ │ │ -
250{
│ │ │ │ - │ │ │ │ -
252}
│ │ │ │ -
253
│ │ │ │ -
254
│ │ │ │ -
255
│ │ │ │ -
256} // namespace Dune::Functions
│ │ │ │ -
257} // namespace Dune
│ │ │ │ -
258
│ │ │ │ -
259
│ │ │ │ -
260#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICVECTORWRAPPER_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ +
71 {
│ │ │ │ +
72 return gv_.template end<codim>();
│ │ │ │ +
73 }
│ │ │ │ +
74
│ │ │ │ +
76 const GridView& gridView() const
│ │ │ │ +
77 {
│ │ │ │ +
78 return gv_;
│ │ │ │ +
79 }
│ │ │ │ +
80
│ │ │ │ +
81private:
│ │ │ │ +
82 GridView gv_;
│ │ │ │ +
83};
│ │ │ │ +
84
│ │ │ │ +
85
│ │ │ │ +
86} // end of namespace Dune::Functions
│ │ │ │ +
87} // end of namespace Dune
│ │ │ │ +
88
│ │ │ │ +
89#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWENTITYSET_HH
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
V & makeHierarchicVectorForMultiIndex(V &v)
Definition: hierarchicvectorwrapper.hh:240
│ │ │ │ -
HierarchicVectorWrapper< V > hierarchicVector(V &v)
Definition: hierarchicvectorwrapper.hh:231
│ │ │ │ -
Check if type is a statically sized container.
Definition: type_traits.hh:83
│ │ │ │ -
A wrapper providing multiindex access to vector entries.
Definition: hierarchicvectorwrapper.hh:92
│ │ │ │ -
Entry< MultiIndex > & operator()(const MultiIndex &index)
Definition: hierarchicvectorwrapper.hh:206
│ │ │ │ -
Entry< MultiIndex > & operator[](const MultiIndex &index)
Definition: hierarchicvectorwrapper.hh:192
│ │ │ │ -
const Entry< MultiIndex > & operator[](const MultiIndex &index) const
Definition: hierarchicvectorwrapper.hh:185
│ │ │ │ -
Vector & vector()
Definition: hierarchicvectorwrapper.hh:217
│ │ │ │ -
V Vector
Definition: hierarchicvectorwrapper.hh:167
│ │ │ │ -
Coefficient< MultiIndex > Entry
Definition: hierarchicvectorwrapper.hh:170
│ │ │ │ -
const Vector & vector() const
Definition: hierarchicvectorwrapper.hh:212
│ │ │ │ -
HierarchicVectorWrapper(Vector &vector)
Definition: hierarchicvectorwrapper.hh:172
│ │ │ │ -
const Entry< MultiIndex > & operator()(const MultiIndex &index) const
Definition: hierarchicvectorwrapper.hh:199
│ │ │ │ -
void resize(const SizeProvider &sizeProvider)
Definition: hierarchicvectorwrapper.hh:177
│ │ │ │ - │ │ │ │ +
An entity set for all entities of given codim in a grid view.
Definition: gridviewentityset.hh:23
│ │ │ │ +
GridViewEntitySet(const GridView &gv)
Construct GridViewEntitySet for a GridView.
Definition: gridviewentityset.hh:47
│ │ │ │ +
GV GridView
Definition: gridviewentityset.hh:26
│ │ │ │ +
GridView::template Codim< codim >::Entity Element
Type of Elements contained in this EntitySet.
Definition: gridviewentityset.hh:32
│ │ │ │ +
const_iterator end() const
Create an end iterator.
Definition: gridviewentityset.hh:70
│ │ │ │ +
const GridView & gridView() const
Return the associated GridView.
Definition: gridviewentityset.hh:76
│ │ │ │ +
Element value_type
Definition: gridviewentityset.hh:38
│ │ │ │ +
const_iterator begin() const
Create a begin iterator.
Definition: gridviewentityset.hh:64
│ │ │ │ +
GridView::template Codim< codim >::Iterator const_iterator
A forward iterator.
Definition: gridviewentityset.hh:41
│ │ │ │ +
Element::Geometry::LocalCoordinate LocalCoordinate
Type of local coordinates with respect to the Element.
Definition: gridviewentityset.hh:35
│ │ │ │ +
size_t size() const
Return number of Elements visited by an iterator.
Definition: gridviewentityset.hh:58
│ │ │ │ +
Element::Geometry::GlobalCoordinate GlobalCoordinate
Definition: gridviewentityset.hh:36
│ │ │ │ +
@ codim
Definition: gridviewentityset.hh:28
│ │ │ │ +
bool contains(const Element &e) const
Return true if e is contained in the EntitySet.
Definition: gridviewentityset.hh:52
│ │ │ │ +
const_iterator iterator
Same as const_iterator.
Definition: gridviewentityset.hh:44
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,329 +4,142 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * functionspacebases │ │ │ │ │ -hierarchicvectorwrapper.hh │ │ │ │ │ + * gridfunctions │ │ │ │ │ +gridviewentityset.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICVECTORWRAPPER_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICVECTORWRAPPER_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWENTITYSET_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWENTITYSET_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ - 8#include │ │ │ │ │ - 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14 │ │ │ │ │ - 15 │ │ │ │ │ - 16namespace Dune { │ │ │ │ │ - 17namespace Functions { │ │ │ │ │ - 18 │ │ │ │ │ - 19 │ │ │ │ │ - 20 │ │ │ │ │ - 21namespace Imp { │ │ │ │ │ - 22 │ │ │ │ │ - 23 // Construct default coefficient type from vector and multiindex type │ │ │ │ │ - 24 // This requires that MultiIndex has a static size. Otherwise the │ │ │ │ │ - 25 // vector type itself is returned. │ │ │ │ │ - 26 template │ │ │ │ │ - 27 struct CoefficientType │ │ │ │ │ - 28 { │ │ │ │ │ - 29 template │ │ │ │ │ - 30 struct DefaultCoefficientTypeHelper │ │ │ │ │ - 31 { │ │ │ │ │ - 32 using E0 = decltype(std::declval()[Dune::Indices::_0]); │ │ │ │ │ - 33 using type = typename DefaultCoefficientTypeHelper::type; │ │ │ │ │ - 34 }; │ │ │ │ │ - 35 │ │ │ │ │ - 36 template │ │ │ │ │ - 37 struct DefaultCoefficientTypeHelper │ │ │ │ │ - 38 { │ │ │ │ │ - 39 using type = E; │ │ │ │ │ - 40 }; │ │ │ │ │ - 41 │ │ │ │ │ - 42 template::value, int>::type = 0> │ │ │ │ │ - 44 static constexpr std::size_t getStaticSizeOrZero() │ │ │ │ │ - 45 { │ │ │ │ │ - 46 return StaticSize::value; │ │ │ │ │ - 47 } │ │ │ │ │ - 48 │ │ │ │ │ - 49 template::value, int>::type = 0> │ │ │ │ │ - 51 static constexpr std::size_t getStaticSizeOrZero() │ │ │ │ │ - 52 { │ │ │ │ │ - 53 return 0; │ │ │ │ │ - 54 } │ │ │ │ │ - 55 │ │ │ │ │ - 56 using type = typename DefaultCoefficientTypeHelper()>::type; │ │ │ │ │ - 57 }; │ │ │ │ │ - 58 │ │ │ │ │ - 59 │ │ │ │ │ - 60 │ │ │ │ │ - 61 // This tag class is used as Coefficient template parameter │ │ │ │ │ - 62 // for HierarchicVectorWrapper if the coefficient type should │ │ │ │ │ - 63 // be deduced. │ │ │ │ │ - 64 struct DeducedCoefficientTag {}; │ │ │ │ │ - 65 │ │ │ │ │ - 66} // namespace Imp │ │ │ │ │ - 67 │ │ │ │ │ + 6#include │ │ │ │ │ + 7 │ │ │ │ │ + 8 │ │ │ │ │ + 9namespace Dune { │ │ │ │ │ + 10 │ │ │ │ │ + 11namespace Functions { │ │ │ │ │ + 12 │ │ │ │ │ + 13 │ │ │ │ │ + 21template │ │ │ │ │ +22class GridViewEntitySet │ │ │ │ │ + 23{ │ │ │ │ │ + 24public: │ │ │ │ │ + 25 │ │ │ │ │ +26 typedef GV GridView; │ │ │ │ │ + 27 enum { │ │ │ │ │ + 28 codim = cd │ │ │ │ │ +29 }; │ │ │ │ │ + 30 │ │ │ │ │ +32 typedef typename GridView::template Codim::Entity Element; │ │ │ │ │ + 33 │ │ │ │ │ +35 typedef typename Element::Geometry::LocalCoordinate LocalCoordinate; │ │ │ │ │ +36 typedef typename Element::Geometry::GlobalCoordinate GlobalCoordinate; │ │ │ │ │ + 37 │ │ │ │ │ +38 typedef Element value_type; │ │ │ │ │ + 39 │ │ │ │ │ +41 typedef typename GridView::template Codim::Iterator const_iterator; │ │ │ │ │ + 42 │ │ │ │ │ +44 typedef const_iterator iterator; │ │ │ │ │ + 45 │ │ │ │ │ +47 GridViewEntitySet(const GridView& gv) : │ │ │ │ │ + 48 gv_(gv) │ │ │ │ │ + 49 {} │ │ │ │ │ + 50 │ │ │ │ │ +52 bool contains(const Element& e) const │ │ │ │ │ + 53 { │ │ │ │ │ + 54 return gv_.contains(e); │ │ │ │ │ + 55 } │ │ │ │ │ + 56 │ │ │ │ │ +58 size_t size() const │ │ │ │ │ + 59 { │ │ │ │ │ + 60 return gv_.size(codim); │ │ │ │ │ + 61 } │ │ │ │ │ + 62 │ │ │ │ │ +64 const_iterator begin() const │ │ │ │ │ + 65 { │ │ │ │ │ + 66 return gv_.template begin(); │ │ │ │ │ + 67 } │ │ │ │ │ 68 │ │ │ │ │ - 69 │ │ │ │ │ - 90template │ │ │ │ │ -91class HierarchicVectorWrapper │ │ │ │ │ - 92{ │ │ │ │ │ - 93 template │ │ │ │ │ - 94 using Coefficient = typename std::conditional< std::is_same::value and HasStaticSize::value, │ │ │ │ │ - 95 typename Imp::CoefficientType::type, │ │ │ │ │ - 96 CO │ │ │ │ │ - 97 >::type; │ │ │ │ │ - 98 │ │ │ │ │ - 99 │ │ │ │ │ - 100 using size_type = std::size_t; │ │ │ │ │ - 101 │ │ │ │ │ - 102 template(), int>::type = │ │ │ │ │ -0, │ │ │ │ │ - 104 typename std::enable_if< not models(), int>:: │ │ │ │ │ -type = 0> │ │ │ │ │ - 105 static void resizeHelper(C& c, const SizeProvider& sizeProvider, typename │ │ │ │ │ -SizeProvider::SizePrefix prefix) │ │ │ │ │ - 106 { │ │ │ │ │ - 107 auto size = sizeProvider.size(prefix); │ │ │ │ │ - 108 if (size != 0) │ │ │ │ │ - 109 DUNE_THROW(RangeError, "Can't resize scalar vector entry v[" << prefix << │ │ │ │ │ -"] to size(" << prefix << ")=" << size); │ │ │ │ │ - 110 } │ │ │ │ │ - 111 │ │ │ │ │ - 112 struct StaticResizeHelper │ │ │ │ │ - 113 { │ │ │ │ │ - 114 template │ │ │ │ │ - 115 static void apply(I&& i, C& c, const SizeProvider& sizeProvider, typename │ │ │ │ │ -SizeProvider::SizePrefix prefix) │ │ │ │ │ - 116 { │ │ │ │ │ - 117 prefix.back() = i; │ │ │ │ │ - 118 resizeHelper(c[i], sizeProvider, prefix); │ │ │ │ │ - 119 } │ │ │ │ │ - 120 }; │ │ │ │ │ - 121 │ │ │ │ │ - 122 template(), int>::type = │ │ │ │ │ -0, │ │ │ │ │ - 124 typename std::enable_if< models(), int>::type = │ │ │ │ │ -0> │ │ │ │ │ - 125 static void resizeHelper(C& c, const SizeProvider& sizeProvider, typename │ │ │ │ │ -SizeProvider::SizePrefix prefix) │ │ │ │ │ - 126 { │ │ │ │ │ - 127 auto size = sizeProvider.size(prefix); │ │ │ │ │ - 128 if (size == 0) │ │ │ │ │ - 129 return; │ │ │ │ │ - 130 │ │ │ │ │ - 131 if (c.size() != size) │ │ │ │ │ - 132 DUNE_THROW(RangeError, "Can't resize statically sized vector entry v[" << │ │ │ │ │ -prefix << "] of size " << c.size() << " to size(" << prefix << ")=" << size); │ │ │ │ │ - 133 │ │ │ │ │ - 134 using namespace Dune::Hybrid; │ │ │ │ │ - 135 prefix.push_back(0); │ │ │ │ │ - 136 forEach(integralRange(Hybrid::size(c)), [&](auto&& i) { │ │ │ │ │ - 137 StaticResizeHelper::apply(i, c, sizeProvider, prefix); │ │ │ │ │ - 138 }); │ │ │ │ │ - 139 } │ │ │ │ │ - 140 │ │ │ │ │ - 141 template(), int>::type = 0> │ │ │ │ │ - 143 static void resizeHelper(C& c, const SizeProvider& sizeProvider, typename │ │ │ │ │ -SizeProvider::SizePrefix prefix) │ │ │ │ │ - 144 { │ │ │ │ │ - 145 auto size = sizeProvider.size(prefix); │ │ │ │ │ - 146 if (size==0) │ │ │ │ │ - 147 { │ │ │ │ │ - 148 if (c.size()==0) │ │ │ │ │ - 149 DUNE_THROW(RangeError, "Can't resize dynamically sized vector entry v[" << │ │ │ │ │ -prefix << "]. Its size is 0 but the target size is unknown due to size(" << │ │ │ │ │ -prefix << ")=0."); │ │ │ │ │ - 150 else │ │ │ │ │ - 151 return; │ │ │ │ │ - 152 } │ │ │ │ │ - 153 │ │ │ │ │ - 154 c.resize(size); │ │ │ │ │ - 155 prefix.push_back(0); │ │ │ │ │ - 156 for(std::size_t i=0; i │ │ │ │ │ -170 using Entry = Coefficient; │ │ │ │ │ - 171 │ │ │ │ │ -172 HierarchicVectorWrapper(Vector& vector) : │ │ │ │ │ - 173 vector_(&vector) │ │ │ │ │ - 174 {} │ │ │ │ │ - 175 │ │ │ │ │ - 176 template │ │ │ │ │ -177 void resize(const SizeProvider& sizeProvider) │ │ │ │ │ - 178 { │ │ │ │ │ - 179 typename SizeProvider::SizePrefix prefix; │ │ │ │ │ - 180 prefix.resize(0); │ │ │ │ │ - 181 resizeHelper(*vector_, sizeProvider, prefix); │ │ │ │ │ - 182 } │ │ │ │ │ - 183 │ │ │ │ │ - 184 template │ │ │ │ │ -185 const Entry& operator[](const MultiIndex& index) const │ │ │ │ │ - 186 { │ │ │ │ │ - 187 static_assert(not std::is_same>::value, "Coefficient type for │ │ │ │ │ -HierarchicVectorWrapper and given multi-index type cannot be determined │ │ │ │ │ -automatically!"); │ │ │ │ │ - 188 return hybridMultiIndexAccess&>(*vector_, index); │ │ │ │ │ - 189 } │ │ │ │ │ - 190 │ │ │ │ │ - 191 template │ │ │ │ │ -192 Entry& operator[](const MultiIndex& index) │ │ │ │ │ - 193 { │ │ │ │ │ - 194 static_assert(not std::is_same>::value, "Coefficient type for │ │ │ │ │ -HierarchicVectorWrapper and given multi-index type cannot be determined │ │ │ │ │ -automatically!"); │ │ │ │ │ - 195 return hybridMultiIndexAccess&>(*vector_, index); │ │ │ │ │ - 196 } │ │ │ │ │ - 197 │ │ │ │ │ - 198 template │ │ │ │ │ -199 const Entry& operator()(const MultiIndex& index) const │ │ │ │ │ - 200 { │ │ │ │ │ - 201 static_assert(not std::is_same>::value, "Coefficient type for │ │ │ │ │ -HierarchicVectorWrapper and given multi-index type cannot be determined │ │ │ │ │ -automatically!"); │ │ │ │ │ - 202 return (*this)[index]; │ │ │ │ │ - 203 } │ │ │ │ │ - 204 │ │ │ │ │ - 205 template │ │ │ │ │ -206 Entry& operator()(const MultiIndex& index) │ │ │ │ │ - 207 { │ │ │ │ │ - 208 static_assert(not std::is_same>::value, "Coefficient type for │ │ │ │ │ -HierarchicVectorWrapper and given multi-index type cannot be determined │ │ │ │ │ -automatically!"); │ │ │ │ │ - 209 return (*this)[index]; │ │ │ │ │ - 210 } │ │ │ │ │ - 211 │ │ │ │ │ -212 const Vector& vector() const │ │ │ │ │ - 213 { │ │ │ │ │ - 214 return *vector_; │ │ │ │ │ - 215 } │ │ │ │ │ - 216 │ │ │ │ │ -217 Vector& vector() │ │ │ │ │ - 218 { │ │ │ │ │ - 219 return *vector_; │ │ │ │ │ - 220 } │ │ │ │ │ - 221 │ │ │ │ │ - 222private: │ │ │ │ │ - 223 │ │ │ │ │ - 224 Vector* vector_; │ │ │ │ │ - 225}; │ │ │ │ │ - 226 │ │ │ │ │ - 227 │ │ │ │ │ - 228 │ │ │ │ │ - 229 │ │ │ │ │ - 230template │ │ │ │ │ -231HierarchicVectorWrapper<_V_> hierarchicVector(V& v) │ │ │ │ │ - 232{ │ │ │ │ │ - 233 return HierarchicVectorWrapper(v); │ │ │ │ │ - 234} │ │ │ │ │ - 235 │ │ │ │ │ - 236 │ │ │ │ │ - 237 │ │ │ │ │ - 238template(), │ │ │ │ │ -int>::type = 0> │ │ │ │ │ -240V& makeHierarchicVectorForMultiIndex(V& v) │ │ │ │ │ - 241{ │ │ │ │ │ - 242 return v; │ │ │ │ │ - 243} │ │ │ │ │ - 244 │ │ │ │ │ - 245 │ │ │ │ │ - 246 │ │ │ │ │ - 247template(), int>::type = 0> │ │ │ │ │ -249HierarchicVectorWrapper<_V_> makeHierarchicVectorForMultiIndex(V& v) │ │ │ │ │ - 250{ │ │ │ │ │ - 251 return HierarchicVectorWrapper(v); │ │ │ │ │ - 252} │ │ │ │ │ - 253 │ │ │ │ │ - 254 │ │ │ │ │ - 255 │ │ │ │ │ - 256} // namespace Dune::Functions │ │ │ │ │ - 257} // namespace Dune │ │ │ │ │ - 258 │ │ │ │ │ - 259 │ │ │ │ │ - 260#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICVECTORWRAPPER_HH │ │ │ │ │ -type_traits.hh │ │ │ │ │ -indexaccess.hh │ │ │ │ │ -utility.hh │ │ │ │ │ +70 const_iterator end() const │ │ │ │ │ + 71 { │ │ │ │ │ + 72 return gv_.template end(); │ │ │ │ │ + 73 } │ │ │ │ │ + 74 │ │ │ │ │ +76 const GridView& gridView() const │ │ │ │ │ + 77 { │ │ │ │ │ + 78 return gv_; │ │ │ │ │ + 79 } │ │ │ │ │ + 80 │ │ │ │ │ + 81private: │ │ │ │ │ + 82 GridView gv_; │ │ │ │ │ + 83}; │ │ │ │ │ + 84 │ │ │ │ │ + 85 │ │ │ │ │ + 86} // end of namespace Dune::Functions │ │ │ │ │ + 87} // end of namespace Dune │ │ │ │ │ + 88 │ │ │ │ │ + 89#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWENTITYSET_HH │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::makeHierarchicVectorForMultiIndex │ │ │ │ │ -V & makeHierarchicVectorForMultiIndex(V &v) │ │ │ │ │ -Definition: hierarchicvectorwrapper.hh:240 │ │ │ │ │ -Dune::Functions::hierarchicVector │ │ │ │ │ -HierarchicVectorWrapper< V > hierarchicVector(V &v) │ │ │ │ │ -Definition: hierarchicvectorwrapper.hh:231 │ │ │ │ │ -Dune::Functions::HasStaticSize │ │ │ │ │ -Check if type is a statically sized container. │ │ │ │ │ -Definition: type_traits.hh:83 │ │ │ │ │ -Dune::Functions::HierarchicVectorWrapper │ │ │ │ │ -A wrapper providing multiindex access to vector entries. │ │ │ │ │ -Definition: hierarchicvectorwrapper.hh:92 │ │ │ │ │ -Dune::Functions::HierarchicVectorWrapper::operator() │ │ │ │ │ -Entry< MultiIndex > & operator()(const MultiIndex &index) │ │ │ │ │ -Definition: hierarchicvectorwrapper.hh:206 │ │ │ │ │ -Dune::Functions::HierarchicVectorWrapper::operator[] │ │ │ │ │ -Entry< MultiIndex > & operator[](const MultiIndex &index) │ │ │ │ │ -Definition: hierarchicvectorwrapper.hh:192 │ │ │ │ │ -Dune::Functions::HierarchicVectorWrapper::operator[] │ │ │ │ │ -const Entry< MultiIndex > & operator[](const MultiIndex &index) const │ │ │ │ │ -Definition: hierarchicvectorwrapper.hh:185 │ │ │ │ │ -Dune::Functions::HierarchicVectorWrapper::vector │ │ │ │ │ -Vector & vector() │ │ │ │ │ -Definition: hierarchicvectorwrapper.hh:217 │ │ │ │ │ -Dune::Functions::HierarchicVectorWrapper::Vector │ │ │ │ │ -V Vector │ │ │ │ │ -Definition: hierarchicvectorwrapper.hh:167 │ │ │ │ │ -Dune::Functions::HierarchicVectorWrapper::Entry │ │ │ │ │ -Coefficient< MultiIndex > Entry │ │ │ │ │ -Definition: hierarchicvectorwrapper.hh:170 │ │ │ │ │ -Dune::Functions::HierarchicVectorWrapper::vector │ │ │ │ │ -const Vector & vector() const │ │ │ │ │ -Definition: hierarchicvectorwrapper.hh:212 │ │ │ │ │ -Dune::Functions::HierarchicVectorWrapper::HierarchicVectorWrapper │ │ │ │ │ -HierarchicVectorWrapper(Vector &vector) │ │ │ │ │ -Definition: hierarchicvectorwrapper.hh:172 │ │ │ │ │ -Dune::Functions::HierarchicVectorWrapper::operator() │ │ │ │ │ -const Entry< MultiIndex > & operator()(const MultiIndex &index) const │ │ │ │ │ -Definition: hierarchicvectorwrapper.hh:199 │ │ │ │ │ -Dune::Functions::HierarchicVectorWrapper::resize │ │ │ │ │ -void resize(const SizeProvider &sizeProvider) │ │ │ │ │ -Definition: hierarchicvectorwrapper.hh:177 │ │ │ │ │ -concepts.hh │ │ │ │ │ +Dune::Functions::GridViewEntitySet │ │ │ │ │ +An entity set for all entities of given codim in a grid view. │ │ │ │ │ +Definition: gridviewentityset.hh:23 │ │ │ │ │ +Dune::Functions::GridViewEntitySet::GridViewEntitySet │ │ │ │ │ +GridViewEntitySet(const GridView &gv) │ │ │ │ │ +Construct GridViewEntitySet for a GridView. │ │ │ │ │ +Definition: gridviewentityset.hh:47 │ │ │ │ │ +Dune::Functions::GridViewEntitySet::GridView │ │ │ │ │ +GV GridView │ │ │ │ │ +Definition: gridviewentityset.hh:26 │ │ │ │ │ +Dune::Functions::GridViewEntitySet::Element │ │ │ │ │ +GridView::template Codim< codim >::Entity Element │ │ │ │ │ +Type of Elements contained in this EntitySet. │ │ │ │ │ +Definition: gridviewentityset.hh:32 │ │ │ │ │ +Dune::Functions::GridViewEntitySet::end │ │ │ │ │ +const_iterator end() const │ │ │ │ │ +Create an end iterator. │ │ │ │ │ +Definition: gridviewentityset.hh:70 │ │ │ │ │ +Dune::Functions::GridViewEntitySet::gridView │ │ │ │ │ +const GridView & gridView() const │ │ │ │ │ +Return the associated GridView. │ │ │ │ │ +Definition: gridviewentityset.hh:76 │ │ │ │ │ +Dune::Functions::GridViewEntitySet::value_type │ │ │ │ │ +Element value_type │ │ │ │ │ +Definition: gridviewentityset.hh:38 │ │ │ │ │ +Dune::Functions::GridViewEntitySet::begin │ │ │ │ │ +const_iterator begin() const │ │ │ │ │ +Create a begin iterator. │ │ │ │ │ +Definition: gridviewentityset.hh:64 │ │ │ │ │ +Dune::Functions::GridViewEntitySet::const_iterator │ │ │ │ │ +GridView::template Codim< codim >::Iterator const_iterator │ │ │ │ │ +A forward iterator. │ │ │ │ │ +Definition: gridviewentityset.hh:41 │ │ │ │ │ +Dune::Functions::GridViewEntitySet::LocalCoordinate │ │ │ │ │ +Element::Geometry::LocalCoordinate LocalCoordinate │ │ │ │ │ +Type of local coordinates with respect to the Element. │ │ │ │ │ +Definition: gridviewentityset.hh:35 │ │ │ │ │ +Dune::Functions::GridViewEntitySet::size │ │ │ │ │ +size_t size() const │ │ │ │ │ +Return number of Elements visited by an iterator. │ │ │ │ │ +Definition: gridviewentityset.hh:58 │ │ │ │ │ +Dune::Functions::GridViewEntitySet::GlobalCoordinate │ │ │ │ │ +Element::Geometry::GlobalCoordinate GlobalCoordinate │ │ │ │ │ +Definition: gridviewentityset.hh:36 │ │ │ │ │ +Dune::Functions::GridViewEntitySet::codim │ │ │ │ │ +@ codim │ │ │ │ │ +Definition: gridviewentityset.hh:28 │ │ │ │ │ +Dune::Functions::GridViewEntitySet::contains │ │ │ │ │ +bool contains(const Element &e) const │ │ │ │ │ +Return true if e is contained in the EntitySet. │ │ │ │ │ +Definition: gridviewentityset.hh:52 │ │ │ │ │ +Dune::Functions::GridViewEntitySet::iterator │ │ │ │ │ +const_iterator iterator │ │ │ │ │ +Same as const_iterator. │ │ │ │ │ +Definition: gridviewentityset.hh:44 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00179.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: transformedindexbasis.hh File Reference │ │ │ │ +dune-functions: localderivativetraits.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,78 +58,44 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
transformedindexbasis.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
localderivativetraits.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <tuple>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <dune/common/std/apply.hh>
│ │ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ │ -#include <dune/common/reservedvector.hh>
│ │ │ │ -#include <dune/common/typeutilities.hh>
│ │ │ │ -#include <dune/typetree/compositenode.hh>
│ │ │ │ -#include <dune/typetree/utility.hh>
│ │ │ │ -#include <dune/functions/common/staticforloop.hh>
│ │ │ │ -#include <dune/functions/common/type_traits.hh>
│ │ │ │ -#include <dune/functions/common/utility.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/basistags.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │ + │ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::Experimental::TransformedIndexPreBasis< RPB, T >
 A pre-basis transforming multi-indices. More...
struct  Dune::Functions::LocalDerivativeTraits< EntitySet, DerivativeTraits >
 Derivative traits for local functions. More...
 
class  Dune::Functions::BasisFactory::Experimental::GenericIndexingTransformation< IndexTransformation, SizeImplementation, minIS, maxIS >
 A generic implementation of a transformation. More...
struct  Dune::Functions::LocalDerivativeTraits< EntitySet, DerivativeTraits >::Traits< Signature >
 
struct  Dune::Functions::LocalDerivativeTraits< EntitySet, DerivativeTraits >::Traits< R(LocalDomain)>
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
namespace  Dune::Functions::Experimental
 
namespace  Dune::Functions::BasisFactory
 
namespace  Dune::Functions::BasisFactory::Experimental
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<class RPB , class T >
 Dune::Functions::Experimental::TransformedIndexPreBasis (RPB &&, T &&) -> TransformedIndexPreBasis< std::decay_t< RPB >, std::decay_t< T > >
 
template<class RawPreBasisFactory , class Transformation >
auto Dune::Functions::BasisFactory::Experimental::transformIndices (RawPreBasisFactory &&preBasisFactory, Transformation &&transformation)
 Create a TransformedIndexPreBasisFactory. More...
 
template<class IndexTransformation , class SizeImplementation , std::size_t minIndexSize, std::size_t maxIndexSize>
auto Dune::Functions::BasisFactory::Experimental::indexTransformation (IndexTransformation &&indexTransformation, SizeImplementation &&sizeImplementation, Dune::index_constant< minIndexSize >, Dune::index_constant< maxIndexSize >)
 A generic implementation of a transformation. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,67 +4,30 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * functionspacebases │ │ │ │ │ -Classes | Namespaces | Functions │ │ │ │ │ -transformedindexbasis.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * gridfunctions │ │ │ │ │ +Classes | Namespaces │ │ │ │ │ +localderivativetraits.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::Experimental::TransformedIndexPreBasis<_RPB,_T_> │ │ │ │ │ -  A pre-basis transforming multi-indices. More... │ │ │ │ │ +struct  Dune::Functions::LocalDerivativeTraits<_EntitySet,_DerivativeTraits_> │ │ │ │ │ +  Derivative traits for local functions. More... │ │ │ │ │   │ │ │ │ │ -class  Dune::Functions::BasisFactory::Experimental:: │ │ │ │ │ - GenericIndexingTransformation<_IndexTransformation,_SizeImplementation, │ │ │ │ │ - minIS,_maxIS_> │ │ │ │ │ -  A generic implementation of a transformation. More... │ │ │ │ │ +struct  Dune::Functions::LocalDerivativeTraits<_EntitySet,_DerivativeTraits │ │ │ │ │ + >::Traits<_Signature_> │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::LocalDerivativeTraits<_EntitySet,_DerivativeTraits │ │ │ │ │ + >::Traits<_R(LocalDomain)> │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ -namespace  Dune::Functions::Experimental │ │ │ │ │ -  │ │ │ │ │ -namespace  Dune::Functions::BasisFactory │ │ │ │ │ -  │ │ │ │ │ -namespace  Dune::Functions::BasisFactory::Experimental │ │ │ │ │ -  │ │ │ │ │ - Functions │ │ │ │ │ -template │ │ │ │ │ -  Dune::Functions::Experimental::TransformedIndexPreBasis (RPB &&, T &&) - │ │ │ │ │ - > TransformedIndexPreBasis< std::decay_t< RPB >, std::decay_t< T > > │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::BasisFactory::Experimental::transformIndices │ │ │ │ │ - (RawPreBasisFactory &&preBasisFactory, Transformation &&transformation) │ │ │ │ │ -  Create a TransformedIndexPreBasisFactory. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::BasisFactory::Experimental::indexTransformation │ │ │ │ │ - (IndexTransformation &&indexTransformation, SizeImplementation │ │ │ │ │ - &&sizeImplementation, Dune::index_constant< minIndexSize >, Dune:: │ │ │ │ │ - index_constant< maxIndexSize >) │ │ │ │ │ -  A generic implementation of a transformation. More... │ │ │ │ │ -  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00179_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: transformedindexbasis.hh Source File │ │ │ │ +dune-functions: localderivativetraits.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,279 +58,66 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
transformedindexbasis.hh
│ │ │ │ +
localderivativetraits.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_LOCALDERIVATIVE_TRAITS_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_LOCALDERIVATIVE_TRAITS_HH
│ │ │ │
5
│ │ │ │ -
6#include <tuple>
│ │ │ │ -
7#include <utility>
│ │ │ │ +
6
│ │ │ │ + │ │ │ │
8
│ │ │ │ -
9#include <dune/common/std/apply.hh>
│ │ │ │ -
10#include <dune/common/hybridutilities.hh>
│ │ │ │ -
11#include <dune/common/reservedvector.hh>
│ │ │ │ -
12#include <dune/common/typeutilities.hh>
│ │ │ │ -
13#include <dune/common/hybridutilities.hh>
│ │ │ │ -
14
│ │ │ │ -
15#include <dune/typetree/compositenode.hh>
│ │ │ │ -
16#include <dune/typetree/utility.hh>
│ │ │ │ -
17
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
25
│ │ │ │ -
26
│ │ │ │ -
27namespace Dune {
│ │ │ │ -
28namespace Functions {
│ │ │ │ -
29namespace Experimental {
│ │ │ │ -
30
│ │ │ │ -
31// *****************************************************************************
│ │ │ │ -
32// *****************************************************************************
│ │ │ │ -
33
│ │ │ │ -
50template<class RPB, class T>
│ │ │ │ - │ │ │ │ -
52{
│ │ │ │ -
53 using Transformation = T;
│ │ │ │ -
54
│ │ │ │ - │ │ │ │ -
56
│ │ │ │ -
57public:
│ │ │ │ -
58
│ │ │ │ -
59 using RawPreBasis = RPB;
│ │ │ │ -
60
│ │ │ │ -
62 using GridView = typename RawPreBasis::GridView;
│ │ │ │ -
63
│ │ │ │ -
65 using size_type = std::size_t;
│ │ │ │ -
66
│ │ │ │ -
68 using Node = typename RawPreBasis::Node;
│ │ │ │ -
69
│ │ │ │ -
70 static constexpr size_type maxMultiIndexSize = Transformation::maxIndexSize;
│ │ │ │ -
71 static constexpr size_type minMultiIndexSize = Transformation::minIndexSize;
│ │ │ │ -
72 static constexpr size_type multiIndexBufferSize = std::max(RawPreBasis::multiIndexBufferSize, maxMultiIndexSize);
│ │ │ │ -
73
│ │ │ │ -
79 template<class RPB_R, class T_R>
│ │ │ │ -
80 TransformedIndexPreBasis(RPB_R&& rawPreBasis, T_R&& transformation) :
│ │ │ │ -
81 rawPreBasis_(std::forward<RPB_R>(rawPreBasis)),
│ │ │ │ -
82 transformation_(std::forward<T_R>(transformation))
│ │ │ │ -
83 {}
│ │ │ │ -
84
│ │ │ │ - │ │ │ │ -
87 {
│ │ │ │ -
88 rawPreBasis_.initializeIndices();
│ │ │ │ -
89 }
│ │ │ │ -
90
│ │ │ │ -
92 const GridView& gridView() const
│ │ │ │ -
93 {
│ │ │ │ -
94 return rawPreBasis_.gridView();
│ │ │ │ -
95 }
│ │ │ │ -
96
│ │ │ │ -
98 void update(const GridView& gv)
│ │ │ │ -
99 {
│ │ │ │ -
100 rawPreBasis_.update(gv);
│ │ │ │ -
101 }
│ │ │ │ -
102
│ │ │ │ - │ │ │ │ -
114 {
│ │ │ │ -
115 return rawPreBasis_.makeNode();
│ │ │ │ -
116 }
│ │ │ │ -
117
│ │ │ │ - │ │ │ │ -
120 {
│ │ │ │ -
121 return size(Dune::ReservedVector<size_type, multiIndexBufferSize>{});
│ │ │ │ -
122 }
│ │ │ │ -
123
│ │ │ │ -
125 template<class SizePrefix>
│ │ │ │ -
126 size_type size(const SizePrefix& prefix) const
│ │ │ │ -
127 {
│ │ │ │ -
128 return transformation_.size(prefix, rawPreBasis_);
│ │ │ │ -
129 }
│ │ │ │ -
130
│ │ │ │ - │ │ │ │ -
133 {
│ │ │ │ -
134 return transformation_.dimension(rawPreBasis_);
│ │ │ │ -
135 }
│ │ │ │ -
136
│ │ │ │ - │ │ │ │ -
139 {
│ │ │ │ -
140 return rawPreBasis_.maxNodeSize();
│ │ │ │ -
141 }
│ │ │ │ -
142
│ │ │ │ - │ │ │ │ -
144 {
│ │ │ │ -
145 return rawPreBasis_;
│ │ │ │ -
146 }
│ │ │ │ -
147
│ │ │ │ - │ │ │ │ -
149 {
│ │ │ │ -
150 return rawPreBasis_;
│ │ │ │ -
151 }
│ │ │ │ -
152
│ │ │ │ -
153 template<class MultiIndex>
│ │ │ │ -
154 void transformIndex(MultiIndex& multiIndex) const
│ │ │ │ -
155 {
│ │ │ │ -
156 transformation_.transformIndex(multiIndex, rawPreBasis_);
│ │ │ │ -
157 }
│ │ │ │ -
158
│ │ │ │ -
159 template<typename It>
│ │ │ │ -
160 It indices(const Node& node, It it) const
│ │ │ │ -
161 {
│ │ │ │ -
162 rawPreBasis().indices(node, it);
│ │ │ │ -
163 for(std::size_t i=0; i<node.size(); ++i)
│ │ │ │ -
164 {
│ │ │ │ -
165 transformIndex(*it);
│ │ │ │ -
166 ++it;
│ │ │ │ -
167 }
│ │ │ │ -
168 return it;
│ │ │ │ -
169 }
│ │ │ │ -
170
│ │ │ │ -
171protected:
│ │ │ │ - │ │ │ │ -
173 Transformation transformation_;
│ │ │ │ -
174};
│ │ │ │ -
175
│ │ │ │ -
176template<class RPB, class T>
│ │ │ │ - │ │ │ │ -
178
│ │ │ │ -
179
│ │ │ │ -
180} // end namespace Experimental
│ │ │ │ -
181
│ │ │ │ -
182
│ │ │ │ -
183namespace BasisFactory {
│ │ │ │ -
184namespace Experimental {
│ │ │ │ -
185
│ │ │ │ -
197template<class RawPreBasisFactory, class Transformation>
│ │ │ │ - │ │ │ │ -
199 RawPreBasisFactory&& preBasisFactory,
│ │ │ │ -
200 Transformation&& transformation)
│ │ │ │ -
201{
│ │ │ │ -
202 return [
│ │ │ │ -
203 preBasisFactory=std::forward<RawPreBasisFactory>(preBasisFactory),
│ │ │ │ -
204 transformation =std::forward<Transformation>(transformation)
│ │ │ │ -
205 ](const auto& gridView) {
│ │ │ │ -
206 return Dune::Functions::Experimental::TransformedIndexPreBasis(preBasisFactory(gridView), std::move(transformation));
│ │ │ │ -
207 };
│ │ │ │ -
208}
│ │ │ │ -
209
│ │ │ │ -
210
│ │ │ │ -
211
│ │ │ │ -
230template<class IndexTransformation, class SizeImplementation, std::size_t minIS, std::size_t maxIS>
│ │ │ │ - │ │ │ │ -
232{
│ │ │ │ -
233public:
│ │ │ │ -
234
│ │ │ │ -
235 static constexpr std::size_t minIndexSize = minIS;
│ │ │ │ -
236 static constexpr std::size_t maxIndexSize = maxIS;
│ │ │ │ -
237
│ │ │ │ -
238 template<class IT_R, class SI_R>
│ │ │ │ -
239 GenericIndexingTransformation(IT_R&& indexTransformation, SI_R&& sizeImplementation) :
│ │ │ │ -
240 indexTransformation_(std::forward<IT_R>(indexTransformation)),
│ │ │ │ -
241 sizeImplementation_(std::forward<SI_R>(sizeImplementation))
│ │ │ │ -
242 {}
│ │ │ │ -
243
│ │ │ │ -
244 template<class MultiIndex, class PreBasis>
│ │ │ │ -
245 void transformIndex(MultiIndex& multiIndex, const PreBasis& preBasis) const
│ │ │ │ -
246 {
│ │ │ │ -
247 indexTransformation_(multiIndex, preBasis);
│ │ │ │ -
248 }
│ │ │ │ -
249
│ │ │ │ -
250 template<class Prefix, class PreBasis>
│ │ │ │ -
251 auto size(const Prefix& prefix, const PreBasis& preBasis) const
│ │ │ │ -
252 {
│ │ │ │ -
253 return sizeImplementation_(prefix, preBasis);
│ │ │ │ -
254 }
│ │ │ │ -
255
│ │ │ │ -
256 template<class PreBasis>
│ │ │ │ -
257 auto dimension(const PreBasis& preBasis) const
│ │ │ │ -
258 {
│ │ │ │ -
259 return preBasis.dimension();
│ │ │ │ -
260 }
│ │ │ │ -
261
│ │ │ │ -
262private:
│ │ │ │ -
263 IndexTransformation indexTransformation_;
│ │ │ │ -
264 SizeImplementation sizeImplementation_;
│ │ │ │ -
265};
│ │ │ │ -
266
│ │ │ │ -
267
│ │ │ │ -
268
│ │ │ │ -
287template<class IndexTransformation, class SizeImplementation, std::size_t minIndexSize, std::size_t maxIndexSize>
│ │ │ │ -
288auto indexTransformation(IndexTransformation&& indexTransformation, SizeImplementation&& sizeImplementation, Dune::index_constant<minIndexSize>, Dune::index_constant<maxIndexSize>)
│ │ │ │ -
289{
│ │ │ │ - │ │ │ │ -
291 std::decay_t<IndexTransformation>,
│ │ │ │ -
292 std::decay_t<SizeImplementation>,
│ │ │ │ -
293 minIndexSize, maxIndexSize>(
│ │ │ │ -
294 std::forward<IndexTransformation>(indexTransformation),
│ │ │ │ -
295 std::forward<SizeImplementation>(sizeImplementation));
│ │ │ │ -
296}
│ │ │ │ -
297
│ │ │ │ -
298
│ │ │ │ -
299} // end namespace Experimental
│ │ │ │ -
300} // end namespace BasisFactory
│ │ │ │ -
301} // end namespace Functions
│ │ │ │ -
302} // end namespace Dune
│ │ │ │ -
303
│ │ │ │ -
304
│ │ │ │ -
305#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +
9
│ │ │ │ +
10namespace Dune {
│ │ │ │ +
11namespace Functions {
│ │ │ │ +
12
│ │ │ │ +
13
│ │ │ │ +
26template<class EntitySet, template<class> class DerivativeTraits=DefaultDerivativeTraits>
│ │ │ │ + │ │ │ │ +
28{
│ │ │ │ +
29 using LocalDomain = typename EntitySet::LocalCoordinate;
│ │ │ │ +
30 using Domain = typename EntitySet::GlobalCoordinate;
│ │ │ │ +
31
│ │ │ │ +
32 template<class Signature>
│ │ │ │ +
33 struct Traits
│ │ │ │ +
34 {
│ │ │ │ + │ │ │ │ +
36 };
│ │ │ │ +
37
│ │ │ │ +
38 template<class R>
│ │ │ │ + │ │ │ │ +
40 {
│ │ │ │ +
41 using Range = typename DerivativeTraits<R(Domain)>::Range;
│ │ │ │ +
42 };
│ │ │ │ +
43};
│ │ │ │ +
44
│ │ │ │ +
45
│ │ │ │ +
46}} // namespace Dune::Functions
│ │ │ │ +
47
│ │ │ │ +
48#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_LOCALDERIVATIVE_TRAITS_HH
│ │ │ │ + │ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
auto transformIndices(RawPreBasisFactory &&preBasisFactory, Transformation &&transformation)
Create a TransformedIndexPreBasisFactory.
Definition: transformedindexbasis.hh:198
│ │ │ │ -
auto indexTransformation(IndexTransformation &&indexTransformation, SizeImplementation &&sizeImplementation, Dune::index_constant< minIndexSize >, Dune::index_constant< maxIndexSize >)
A generic implementation of a transformation.
Definition: transformedindexbasis.hh:288
│ │ │ │ -
TransformedIndexPreBasis(RPB &&, T &&) -> TransformedIndexPreBasis< std::decay_t< RPB >, std::decay_t< T > >
│ │ │ │ -
A pre-basis transforming multi-indices.
Definition: transformedindexbasis.hh:52
│ │ │ │ -
It indices(const Node &node, It it) const
Definition: transformedindexbasis.hh:160
│ │ │ │ -
Transformation transformation_
Definition: transformedindexbasis.hh:173
│ │ │ │ -
void initializeIndices()
Initialize the global indices.
Definition: transformedindexbasis.hh:86
│ │ │ │ -
typename RawPreBasis::GridView GridView
The grid view that the FE basis is defined on.
Definition: transformedindexbasis.hh:62
│ │ │ │ -
void transformIndex(MultiIndex &multiIndex) const
Definition: transformedindexbasis.hh:154
│ │ │ │ -
RawPreBasis rawPreBasis_
Definition: transformedindexbasis.hh:172
│ │ │ │ -
typename RawPreBasis::Node Node
Template mapping root tree path to type of created tree node.
Definition: transformedindexbasis.hh:68
│ │ │ │ -
TransformedIndexPreBasis(RPB_R &&rawPreBasis, T_R &&transformation)
Constructor for given child pre-basis objects.
Definition: transformedindexbasis.hh:80
│ │ │ │ -
RawPreBasis & rawPreBasis()
Definition: transformedindexbasis.hh:148
│ │ │ │ -
static constexpr size_type maxMultiIndexSize
Definition: transformedindexbasis.hh:70
│ │ │ │ -
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition: transformedindexbasis.hh:98
│ │ │ │ -
Node makeNode() const
Create tree node with given root tree path.
Definition: transformedindexbasis.hh:113
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: transformedindexbasis.hh:92
│ │ │ │ -
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition: transformedindexbasis.hh:126
│ │ │ │ -
RPB RawPreBasis
Definition: transformedindexbasis.hh:59
│ │ │ │ -
size_type size() const
Same as size(prefix) with empty prefix.
Definition: transformedindexbasis.hh:119
│ │ │ │ -
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition: transformedindexbasis.hh:138
│ │ │ │ -
std::size_t size_type
Type used for indices and size information.
Definition: transformedindexbasis.hh:65
│ │ │ │ -
static constexpr size_type multiIndexBufferSize
Definition: transformedindexbasis.hh:72
│ │ │ │ -
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition: transformedindexbasis.hh:132
│ │ │ │ -
const RawPreBasis & rawPreBasis() const
Definition: transformedindexbasis.hh:143
│ │ │ │ -
static constexpr size_type minMultiIndexSize
Definition: transformedindexbasis.hh:71
│ │ │ │ -
A generic implementation of a transformation.
Definition: transformedindexbasis.hh:232
│ │ │ │ -
auto dimension(const PreBasis &preBasis) const
Definition: transformedindexbasis.hh:257
│ │ │ │ -
GenericIndexingTransformation(IT_R &&indexTransformation, SI_R &&sizeImplementation)
Definition: transformedindexbasis.hh:239
│ │ │ │ -
void transformIndex(MultiIndex &multiIndex, const PreBasis &preBasis) const
Definition: transformedindexbasis.hh:245
│ │ │ │ -
static constexpr std::size_t maxIndexSize
Definition: transformedindexbasis.hh:236
│ │ │ │ -
static constexpr std::size_t minIndexSize
Definition: transformedindexbasis.hh:235
│ │ │ │ -
auto size(const Prefix &prefix, const PreBasis &preBasis) const
Definition: transformedindexbasis.hh:251
│ │ │ │ - │ │ │ │ +
Dummy range class to be used if no proper type is available.
Definition: defaultderivativetraits.hh:23
│ │ │ │ +
Derivative traits for local functions.
Definition: localderivativetraits.hh:28
│ │ │ │ +
typename EntitySet::GlobalCoordinate Domain
Definition: localderivativetraits.hh:30
│ │ │ │ +
typename EntitySet::LocalCoordinate LocalDomain
Definition: localderivativetraits.hh:29
│ │ │ │ +
Definition: localderivativetraits.hh:34
│ │ │ │ +
InvalidRange Range
Definition: localderivativetraits.hh:35
│ │ │ │ +
typename DerivativeTraits< R(Domain)>::Range Range
Definition: localderivativetraits.hh:41
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,373 +4,73 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * functionspacebases │ │ │ │ │ -transformedindexbasis.hh │ │ │ │ │ + * gridfunctions │ │ │ │ │ +localderivativetraits.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_LOCALDERIVATIVE_TRAITS_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_LOCALDERIVATIVE_TRAITS_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ + 6 │ │ │ │ │ + 7#include │ │ │ │ │ 8 │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14 │ │ │ │ │ - 15#include │ │ │ │ │ - 16#include │ │ │ │ │ - 17 │ │ │ │ │ - 18#include │ │ │ │ │ - 19#include │ │ │ │ │ - 20#include │ │ │ │ │ - 21#include │ │ │ │ │ - 22#include │ │ │ │ │ - 23#include │ │ │ │ │ - 24#include │ │ │ │ │ - 25 │ │ │ │ │ - 26 │ │ │ │ │ - 27namespace Dune { │ │ │ │ │ - 28namespace Functions { │ │ │ │ │ -29namespace Experimental { │ │ │ │ │ - 30 │ │ │ │ │ - 31/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 32/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 33 │ │ │ │ │ - 50template │ │ │ │ │ -51class TransformedIndexPreBasis │ │ │ │ │ - 52{ │ │ │ │ │ - 53 using Transformation = T; │ │ │ │ │ - 54 │ │ │ │ │ - 55 using This = TransformedIndexPreBasis; │ │ │ │ │ - 56 │ │ │ │ │ - 57public: │ │ │ │ │ - 58 │ │ │ │ │ -59 using RawPreBasis = RPB; │ │ │ │ │ - 60 │ │ │ │ │ -62 using GridView = typename RawPreBasis::GridView; │ │ │ │ │ - 63 │ │ │ │ │ -65 using size_type = std::size_t; │ │ │ │ │ - 66 │ │ │ │ │ -68 using Node = typename RawPreBasis::Node; │ │ │ │ │ - 69 │ │ │ │ │ -70 static constexpr size_type maxMultiIndexSize = Transformation::maxIndexSize; │ │ │ │ │ -71 static constexpr size_type minMultiIndexSize = Transformation::minIndexSize; │ │ │ │ │ -72 static constexpr size_type multiIndexBufferSize = std::max(RawPreBasis:: │ │ │ │ │ -multiIndexBufferSize, maxMultiIndexSize); │ │ │ │ │ - 73 │ │ │ │ │ - 79 template │ │ │ │ │ -80 TransformedIndexPreBasis(RPB_R&& rawPreBasis, T_R&& transformation) : │ │ │ │ │ - 81 rawPreBasis_(std::forward(rawPreBasis)), │ │ │ │ │ - 82 transformation_(std::forward(transformation)) │ │ │ │ │ - 83 {} │ │ │ │ │ - 84 │ │ │ │ │ -86 void initializeIndices() │ │ │ │ │ - 87 { │ │ │ │ │ - 88 rawPreBasis_.initializeIndices(); │ │ │ │ │ - 89 } │ │ │ │ │ - 90 │ │ │ │ │ -92 const GridView& gridView() const │ │ │ │ │ - 93 { │ │ │ │ │ - 94 return rawPreBasis_.gridView(); │ │ │ │ │ - 95 } │ │ │ │ │ - 96 │ │ │ │ │ -98 void update(const GridView& gv) │ │ │ │ │ - 99 { │ │ │ │ │ - 100 rawPreBasis_.update(gv); │ │ │ │ │ - 101 } │ │ │ │ │ - 102 │ │ │ │ │ -113 Node makeNode() const │ │ │ │ │ - 114 { │ │ │ │ │ - 115 return rawPreBasis_.makeNode(); │ │ │ │ │ - 116 } │ │ │ │ │ - 117 │ │ │ │ │ -119 size_type size() const │ │ │ │ │ - 120 { │ │ │ │ │ - 121 return size(Dune::ReservedVector{}); │ │ │ │ │ - 122 } │ │ │ │ │ - 123 │ │ │ │ │ - 125 template │ │ │ │ │ -126 size_type size(const SizePrefix& prefix) const │ │ │ │ │ - 127 { │ │ │ │ │ - 128 return transformation_.size(prefix, rawPreBasis_); │ │ │ │ │ - 129 } │ │ │ │ │ - 130 │ │ │ │ │ -132 size_type dimension() const │ │ │ │ │ - 133 { │ │ │ │ │ - 134 return transformation_.dimension(rawPreBasis_); │ │ │ │ │ - 135 } │ │ │ │ │ - 136 │ │ │ │ │ -138 size_type maxNodeSize() const │ │ │ │ │ - 139 { │ │ │ │ │ - 140 return rawPreBasis_.maxNodeSize(); │ │ │ │ │ - 141 } │ │ │ │ │ - 142 │ │ │ │ │ -143 const RawPreBasis& rawPreBasis() const │ │ │ │ │ - 144 { │ │ │ │ │ - 145 return rawPreBasis_; │ │ │ │ │ - 146 } │ │ │ │ │ - 147 │ │ │ │ │ -148 RawPreBasis& rawPreBasis() │ │ │ │ │ - 149 { │ │ │ │ │ - 150 return rawPreBasis_; │ │ │ │ │ - 151 } │ │ │ │ │ - 152 │ │ │ │ │ - 153 template │ │ │ │ │ -154 void transformIndex(MultiIndex& multiIndex) const │ │ │ │ │ - 155 { │ │ │ │ │ - 156 transformation_.transformIndex(multiIndex, rawPreBasis_); │ │ │ │ │ - 157 } │ │ │ │ │ - 158 │ │ │ │ │ - 159 template │ │ │ │ │ -160 It indices(const Node& node, It it) const │ │ │ │ │ - 161 { │ │ │ │ │ - 162 rawPreBasis().indices(node, it); │ │ │ │ │ - 163 for(std::size_t i=0; i │ │ │ │ │ -177TransformedIndexPreBasis(RPB&&, T&&) -> TransformedIndexPreBasis, std::decay_t>; │ │ │ │ │ - 178 │ │ │ │ │ - 179 │ │ │ │ │ - 180} // end namespace Experimental │ │ │ │ │ - 181 │ │ │ │ │ - 182 │ │ │ │ │ - 183namespace BasisFactory { │ │ │ │ │ - 184namespace Experimental { │ │ │ │ │ - 185 │ │ │ │ │ - 197template │ │ │ │ │ -198auto transformIndices( │ │ │ │ │ - 199 RawPreBasisFactory&& preBasisFactory, │ │ │ │ │ - 200 Transformation&& transformation) │ │ │ │ │ - 201{ │ │ │ │ │ - 202 return [ │ │ │ │ │ - 203 preBasisFactory=std::forward(preBasisFactory), │ │ │ │ │ - 204 transformation =std::forward(transformation) │ │ │ │ │ - 205 ](const auto& gridView) { │ │ │ │ │ - 206 return Dune::Functions::Experimental::TransformedIndexPreBasis │ │ │ │ │ -(preBasisFactory(gridView), std::move(transformation)); │ │ │ │ │ - 207 }; │ │ │ │ │ - 208} │ │ │ │ │ - 209 │ │ │ │ │ - 210 │ │ │ │ │ - 211 │ │ │ │ │ - 230template │ │ │ │ │ -231class GenericIndexingTransformation │ │ │ │ │ - 232{ │ │ │ │ │ - 233public: │ │ │ │ │ - 234 │ │ │ │ │ -235 static constexpr std::size_t minIndexSize = minIS; │ │ │ │ │ -236 static constexpr std::size_t maxIndexSize = maxIS; │ │ │ │ │ - 237 │ │ │ │ │ - 238 template │ │ │ │ │ -239 GenericIndexingTransformation(IT_R&& indexTransformation, SI_R&& │ │ │ │ │ -sizeImplementation) : │ │ │ │ │ - 240 indexTransformation_(std::forward(indexTransformation)), │ │ │ │ │ - 241 sizeImplementation_(std::forward(sizeImplementation)) │ │ │ │ │ - 242 {} │ │ │ │ │ - 243 │ │ │ │ │ - 244 template │ │ │ │ │ -245 void transformIndex(MultiIndex& multiIndex, const PreBasis& preBasis) const │ │ │ │ │ - 246 { │ │ │ │ │ - 247 indexTransformation_(multiIndex, preBasis); │ │ │ │ │ - 248 } │ │ │ │ │ - 249 │ │ │ │ │ - 250 template │ │ │ │ │ -251 auto size(const Prefix& prefix, const PreBasis& preBasis) const │ │ │ │ │ - 252 { │ │ │ │ │ - 253 return sizeImplementation_(prefix, preBasis); │ │ │ │ │ - 254 } │ │ │ │ │ - 255 │ │ │ │ │ - 256 template │ │ │ │ │ -257 auto dimension(const PreBasis& preBasis) const │ │ │ │ │ - 258 { │ │ │ │ │ - 259 return preBasis.dimension(); │ │ │ │ │ - 260 } │ │ │ │ │ - 261 │ │ │ │ │ - 262private: │ │ │ │ │ - 263 IndexTransformation indexTransformation_; │ │ │ │ │ - 264 SizeImplementation sizeImplementation_; │ │ │ │ │ - 265}; │ │ │ │ │ - 266 │ │ │ │ │ - 267 │ │ │ │ │ - 268 │ │ │ │ │ - 287template │ │ │ │ │ -288auto indexTransformation(IndexTransformation&& indexTransformation, │ │ │ │ │ -SizeImplementation&& sizeImplementation, Dune::index_constant, │ │ │ │ │ -Dune::index_constant) │ │ │ │ │ - 289{ │ │ │ │ │ - 290 return GenericIndexingTransformation< │ │ │ │ │ - 291 std::decay_t, │ │ │ │ │ - 292 std::decay_t, │ │ │ │ │ - 293 minIndexSize, maxIndexSize>( │ │ │ │ │ - 294 std::forward(indexTransformation), │ │ │ │ │ - 295 std::forward(sizeImplementation)); │ │ │ │ │ - 296} │ │ │ │ │ - 297 │ │ │ │ │ - 298 │ │ │ │ │ - 299} // end namespace Experimental │ │ │ │ │ - 300} // end namespace BasisFactory │ │ │ │ │ - 301} // end namespace Functions │ │ │ │ │ - 302} // end namespace Dune │ │ │ │ │ - 303 │ │ │ │ │ - 304 │ │ │ │ │ - 305#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH │ │ │ │ │ -type_traits.hh │ │ │ │ │ -staticforloop.hh │ │ │ │ │ -utility.hh │ │ │ │ │ -nodes.hh │ │ │ │ │ -defaultglobalbasis.hh │ │ │ │ │ -basistags.hh │ │ │ │ │ + 9 │ │ │ │ │ + 10namespace Dune { │ │ │ │ │ + 11namespace Functions { │ │ │ │ │ + 12 │ │ │ │ │ + 13 │ │ │ │ │ + 26template class │ │ │ │ │ +DerivativeTraits=DefaultDerivativeTraits> │ │ │ │ │ +27struct LocalDerivativeTraits │ │ │ │ │ + 28{ │ │ │ │ │ +29 using LocalDomain = typename EntitySet::LocalCoordinate; │ │ │ │ │ +30 using Domain = typename EntitySet::GlobalCoordinate; │ │ │ │ │ + 31 │ │ │ │ │ + 32 template │ │ │ │ │ +33 struct Traits │ │ │ │ │ + 34 { │ │ │ │ │ +35 typedef InvalidRange Range; │ │ │ │ │ + 36 }; │ │ │ │ │ + 37 │ │ │ │ │ + 38 template │ │ │ │ │ +39 struct Traits │ │ │ │ │ + 40 { │ │ │ │ │ +41 using Range = typename DerivativeTraits::Range; │ │ │ │ │ + 42 }; │ │ │ │ │ + 43}; │ │ │ │ │ + 44 │ │ │ │ │ + 45 │ │ │ │ │ + 46}} // namespace Dune::Functions │ │ │ │ │ + 47 │ │ │ │ │ + 48#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_LOCALDERIVATIVE_TRAITS_HH │ │ │ │ │ +defaultderivativetraits.hh │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::BasisFactory::Experimental::transformIndices │ │ │ │ │ -auto transformIndices(RawPreBasisFactory &&preBasisFactory, Transformation │ │ │ │ │ -&&transformation) │ │ │ │ │ -Create a TransformedIndexPreBasisFactory. │ │ │ │ │ -Definition: transformedindexbasis.hh:198 │ │ │ │ │ -Dune::Functions::BasisFactory::Experimental::indexTransformation │ │ │ │ │ -auto indexTransformation(IndexTransformation &&indexTransformation, │ │ │ │ │ -SizeImplementation &&sizeImplementation, Dune::index_constant< minIndexSize >, │ │ │ │ │ -Dune::index_constant< maxIndexSize >) │ │ │ │ │ -A generic implementation of a transformation. │ │ │ │ │ -Definition: transformedindexbasis.hh:288 │ │ │ │ │ -Dune::Functions::Experimental::TransformedIndexPreBasis │ │ │ │ │ -TransformedIndexPreBasis(RPB &&, T &&) -> TransformedIndexPreBasis< std:: │ │ │ │ │ -decay_t< RPB >, std::decay_t< T > > │ │ │ │ │ -Dune::Functions::Experimental::TransformedIndexPreBasis │ │ │ │ │ -A pre-basis transforming multi-indices. │ │ │ │ │ -Definition: transformedindexbasis.hh:52 │ │ │ │ │ -Dune::Functions::Experimental::TransformedIndexPreBasis::indices │ │ │ │ │ -It indices(const Node &node, It it) const │ │ │ │ │ -Definition: transformedindexbasis.hh:160 │ │ │ │ │ -Dune::Functions::Experimental::TransformedIndexPreBasis::transformation_ │ │ │ │ │ -Transformation transformation_ │ │ │ │ │ -Definition: transformedindexbasis.hh:173 │ │ │ │ │ -Dune::Functions::Experimental::TransformedIndexPreBasis::initializeIndices │ │ │ │ │ -void initializeIndices() │ │ │ │ │ -Initialize the global indices. │ │ │ │ │ -Definition: transformedindexbasis.hh:86 │ │ │ │ │ -Dune::Functions::Experimental::TransformedIndexPreBasis::GridView │ │ │ │ │ -typename RawPreBasis::GridView GridView │ │ │ │ │ -The grid view that the FE basis is defined on. │ │ │ │ │ -Definition: transformedindexbasis.hh:62 │ │ │ │ │ -Dune::Functions::Experimental::TransformedIndexPreBasis::transformIndex │ │ │ │ │ -void transformIndex(MultiIndex &multiIndex) const │ │ │ │ │ -Definition: transformedindexbasis.hh:154 │ │ │ │ │ -Dune::Functions::Experimental::TransformedIndexPreBasis::rawPreBasis_ │ │ │ │ │ -RawPreBasis rawPreBasis_ │ │ │ │ │ -Definition: transformedindexbasis.hh:172 │ │ │ │ │ -Dune::Functions::Experimental::TransformedIndexPreBasis::Node │ │ │ │ │ -typename RawPreBasis::Node Node │ │ │ │ │ -Template mapping root tree path to type of created tree node. │ │ │ │ │ -Definition: transformedindexbasis.hh:68 │ │ │ │ │ -Dune::Functions::Experimental::TransformedIndexPreBasis:: │ │ │ │ │ -TransformedIndexPreBasis │ │ │ │ │ -TransformedIndexPreBasis(RPB_R &&rawPreBasis, T_R &&transformation) │ │ │ │ │ -Constructor for given child pre-basis objects. │ │ │ │ │ -Definition: transformedindexbasis.hh:80 │ │ │ │ │ -Dune::Functions::Experimental::TransformedIndexPreBasis::rawPreBasis │ │ │ │ │ -RawPreBasis & rawPreBasis() │ │ │ │ │ -Definition: transformedindexbasis.hh:148 │ │ │ │ │ -Dune::Functions::Experimental::TransformedIndexPreBasis::maxMultiIndexSize │ │ │ │ │ -static constexpr size_type maxMultiIndexSize │ │ │ │ │ -Definition: transformedindexbasis.hh:70 │ │ │ │ │ -Dune::Functions::Experimental::TransformedIndexPreBasis::update │ │ │ │ │ -void update(const GridView &gv) │ │ │ │ │ -Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ -Definition: transformedindexbasis.hh:98 │ │ │ │ │ -Dune::Functions::Experimental::TransformedIndexPreBasis::makeNode │ │ │ │ │ -Node makeNode() const │ │ │ │ │ -Create tree node with given root tree path. │ │ │ │ │ -Definition: transformedindexbasis.hh:113 │ │ │ │ │ -Dune::Functions::Experimental::TransformedIndexPreBasis::gridView │ │ │ │ │ -const GridView & gridView() const │ │ │ │ │ -Obtain the grid view that the basis is defined on. │ │ │ │ │ -Definition: transformedindexbasis.hh:92 │ │ │ │ │ -Dune::Functions::Experimental::TransformedIndexPreBasis::size │ │ │ │ │ -size_type size(const SizePrefix &prefix) const │ │ │ │ │ -Return number of possible values for next position in multi index. │ │ │ │ │ -Definition: transformedindexbasis.hh:126 │ │ │ │ │ -Dune::Functions::Experimental::TransformedIndexPreBasis::RawPreBasis │ │ │ │ │ -RPB RawPreBasis │ │ │ │ │ -Definition: transformedindexbasis.hh:59 │ │ │ │ │ -Dune::Functions::Experimental::TransformedIndexPreBasis::size │ │ │ │ │ -size_type size() const │ │ │ │ │ -Same as size(prefix) with empty prefix. │ │ │ │ │ -Definition: transformedindexbasis.hh:119 │ │ │ │ │ -Dune::Functions::Experimental::TransformedIndexPreBasis::maxNodeSize │ │ │ │ │ -size_type maxNodeSize() const │ │ │ │ │ -Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ -Definition: transformedindexbasis.hh:138 │ │ │ │ │ -Dune::Functions::Experimental::TransformedIndexPreBasis::size_type │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Type used for indices and size information. │ │ │ │ │ -Definition: transformedindexbasis.hh:65 │ │ │ │ │ -Dune::Functions::Experimental::TransformedIndexPreBasis::multiIndexBufferSize │ │ │ │ │ -static constexpr size_type multiIndexBufferSize │ │ │ │ │ -Definition: transformedindexbasis.hh:72 │ │ │ │ │ -Dune::Functions::Experimental::TransformedIndexPreBasis::dimension │ │ │ │ │ -size_type dimension() const │ │ │ │ │ -Get the total dimension of the space spanned by this basis. │ │ │ │ │ -Definition: transformedindexbasis.hh:132 │ │ │ │ │ -Dune::Functions::Experimental::TransformedIndexPreBasis::rawPreBasis │ │ │ │ │ -const RawPreBasis & rawPreBasis() const │ │ │ │ │ -Definition: transformedindexbasis.hh:143 │ │ │ │ │ -Dune::Functions::Experimental::TransformedIndexPreBasis::minMultiIndexSize │ │ │ │ │ -static constexpr size_type minMultiIndexSize │ │ │ │ │ -Definition: transformedindexbasis.hh:71 │ │ │ │ │ -Dune::Functions::BasisFactory::Experimental::GenericIndexingTransformation │ │ │ │ │ -A generic implementation of a transformation. │ │ │ │ │ -Definition: transformedindexbasis.hh:232 │ │ │ │ │ -Dune::Functions::BasisFactory::Experimental::GenericIndexingTransformation:: │ │ │ │ │ -dimension │ │ │ │ │ -auto dimension(const PreBasis &preBasis) const │ │ │ │ │ -Definition: transformedindexbasis.hh:257 │ │ │ │ │ -Dune::Functions::BasisFactory::Experimental::GenericIndexingTransformation:: │ │ │ │ │ -GenericIndexingTransformation │ │ │ │ │ -GenericIndexingTransformation(IT_R &&indexTransformation, SI_R │ │ │ │ │ -&&sizeImplementation) │ │ │ │ │ -Definition: transformedindexbasis.hh:239 │ │ │ │ │ -Dune::Functions::BasisFactory::Experimental::GenericIndexingTransformation:: │ │ │ │ │ -transformIndex │ │ │ │ │ -void transformIndex(MultiIndex &multiIndex, const PreBasis &preBasis) const │ │ │ │ │ -Definition: transformedindexbasis.hh:245 │ │ │ │ │ -Dune::Functions::BasisFactory::Experimental::GenericIndexingTransformation:: │ │ │ │ │ -maxIndexSize │ │ │ │ │ -static constexpr std::size_t maxIndexSize │ │ │ │ │ -Definition: transformedindexbasis.hh:236 │ │ │ │ │ -Dune::Functions::BasisFactory::Experimental::GenericIndexingTransformation:: │ │ │ │ │ -minIndexSize │ │ │ │ │ -static constexpr std::size_t minIndexSize │ │ │ │ │ -Definition: transformedindexbasis.hh:235 │ │ │ │ │ -Dune::Functions::BasisFactory::Experimental::GenericIndexingTransformation:: │ │ │ │ │ -size │ │ │ │ │ -auto size(const Prefix &prefix, const PreBasis &preBasis) const │ │ │ │ │ -Definition: transformedindexbasis.hh:251 │ │ │ │ │ -concepts.hh │ │ │ │ │ +Dune::Functions::InvalidRange │ │ │ │ │ +Dummy range class to be used if no proper type is available. │ │ │ │ │ +Definition: defaultderivativetraits.hh:23 │ │ │ │ │ +Dune::Functions::LocalDerivativeTraits │ │ │ │ │ +Derivative traits for local functions. │ │ │ │ │ +Definition: localderivativetraits.hh:28 │ │ │ │ │ +Dune::Functions::LocalDerivativeTraits::Domain │ │ │ │ │ +typename EntitySet::GlobalCoordinate Domain │ │ │ │ │ +Definition: localderivativetraits.hh:30 │ │ │ │ │ +Dune::Functions::LocalDerivativeTraits::LocalDomain │ │ │ │ │ +typename EntitySet::LocalCoordinate LocalDomain │ │ │ │ │ +Definition: localderivativetraits.hh:29 │ │ │ │ │ +Dune::Functions::LocalDerivativeTraits::Traits │ │ │ │ │ +Definition: localderivativetraits.hh:34 │ │ │ │ │ +Dune::Functions::LocalDerivativeTraits::Traits::Range │ │ │ │ │ +InvalidRange Range │ │ │ │ │ +Definition: localderivativetraits.hh:35 │ │ │ │ │ +Dune::Functions::LocalDerivativeTraits::Traits<_R(LocalDomain)>::Range │ │ │ │ │ +typename DerivativeTraits< R(Domain)>::Range Range │ │ │ │ │ +Definition: localderivativetraits.hh:41 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00182.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: rannacherturekbasis.hh File Reference │ │ │ │ +dune-functions: gridviewfunction.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,66 +58,58 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Typedefs | │ │ │ │ Functions
│ │ │ │ -
rannacherturekbasis.hh File Reference
│ │ │ │ +
gridviewfunction.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/grid/common/capabilities.hh>
│ │ │ │ -#include <dune/localfunctions/common/localfiniteelementvariant.hh>
│ │ │ │ -#include <dune/localfunctions/rannacherturek.hh>
│ │ │ │ -#include <dune/localfunctions/crouzeixraviart.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │ +
#include <memory>
│ │ │ │ +#include <dune/common/concept.hh>
│ │ │ │ +#include <dune/functions/gridfunctions/gridfunction.hh>
│ │ │ │ +#include <dune/functions/gridfunctions/gridviewentityset.hh>
│ │ │ │ +#include <dune/functions/gridfunctions/analyticgridviewfunction.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::RannacherTurekPreBasis< GV >
 Pre-basis for a Rannacher-Turek basis. More...
class  Dune::Functions::GridViewFunction< Signature, GridView, DerivativeTraits, bufferSize >
 
class  Dune::Functions::RannacherTurekNode< GV >
class  Dune::Functions::GridViewFunction< Range(Domain), GV, DerivativeTraits, bufferSize >
 Wrapper class for functions defined on a GridView. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
namespace  Dune::Functions::BasisFactory
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Typedefs

template<typename GV >
using Dune::Functions::RannacherTurekBasis = DefaultGlobalBasis< RannacherTurekPreBasis< GV > >
 Rannacher-Turek basis. More...
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<class Dummy = void>
auto Dune::Functions::BasisFactory::rannacherTurek ()
 Create a pre-basis factory that can create a Rannacher-Turek pre-basis. More...
 
template<class F , class GridView , typename std::enable_if< models< Imp::HasFreeLocalFunction, F >(), int >::type = 0>
std::decay< F >::type Dune::Functions::makeGridViewFunction (F &&f, const GridView &gridView)
 Construct a function modeling GridViewFunction from function and grid view. More...
 
template<class F , class GridView , typename std::enable_if< not(models< Imp::HasFreeLocalFunction, F >()), int >::type = 0>
auto Dune::Functions::makeGridViewFunction (F &&f, const GridView &gridView) -> decltype(makeAnalyticGridViewFunction(std::forward< F >(f), gridView))
 Construct a function modeling GridViewFunction from function and grid view. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,46 +4,49 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * functionspacebases │ │ │ │ │ -Classes | Namespaces | Typedefs | Functions │ │ │ │ │ -rannacherturekbasis.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * gridfunctions │ │ │ │ │ +Classes | Namespaces | Functions │ │ │ │ │ +gridviewfunction.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::RannacherTurekPreBasis<_GV_> │ │ │ │ │ -  Pre-basis for a Rannacher-Turek basis. More... │ │ │ │ │ +class  Dune::Functions::GridViewFunction<_Signature,_GridView, │ │ │ │ │ + DerivativeTraits,_bufferSize_> │ │ │ │ │   │ │ │ │ │ -class  Dune::Functions::RannacherTurekNode<_GV_> │ │ │ │ │ +class  Dune::Functions::GridViewFunction<_Range(Domain),_GV,_DerivativeTraits, │ │ │ │ │ + bufferSize_> │ │ │ │ │ +  Wrapper class for functions defined on a GridView. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ -namespace  Dune::Functions::BasisFactory │ │ │ │ │ -  │ │ │ │ │ - Typedefs │ │ │ │ │ -template │ │ │ │ │ -using Dune::Functions::RannacherTurekBasis = DefaultGlobalBasis< │ │ │ │ │ - RannacherTurekPreBasis< GV > > │ │ │ │ │ -  Rannacher-Turek basis. More... │ │ │ │ │ -  │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::BasisFactory::rannacherTurek () │ │ │ │ │ -  Create a pre-basis factory that can create a Rannacher-Turek pre-basis. │ │ │ │ │ - More... │ │ │ │ │ +template(), int >::type = 0> │ │ │ │ │ +std::decay< F >::type Dune::Functions::makeGridViewFunction (F &&f, const │ │ │ │ │ + GridView &gridView) │ │ │ │ │ +  Construct a function modeling GridViewFunction from │ │ │ │ │ + function and grid view. More... │ │ │ │ │ +  │ │ │ │ │ +template()), int >::type = 0> │ │ │ │ │ + auto Dune::Functions::makeGridViewFunction (F &&f, const │ │ │ │ │ + GridView &gridView) -> decltype │ │ │ │ │ + (makeAnalyticGridViewFunction(std::forward< F >(f), │ │ │ │ │ + gridView)) │ │ │ │ │ +  Construct a function modeling GridViewFunction from │ │ │ │ │ + function and grid view. More... │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00182_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: rannacherturekbasis.hh Source File │ │ │ │ +dune-functions: gridviewfunction.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,255 +58,95 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
rannacherturekbasis.hh
│ │ │ │ +
gridviewfunction.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWFUNCTION_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWFUNCTION_HH
│ │ │ │
5
│ │ │ │ -
6#include <dune/common/exceptions.hh>
│ │ │ │ +
6#include <memory>
│ │ │ │
7
│ │ │ │ -
8#include <dune/grid/common/capabilities.hh>
│ │ │ │ +
8#include <dune/common/concept.hh>
│ │ │ │
9
│ │ │ │ -
10#include <dune/localfunctions/common/localfiniteelementvariant.hh>
│ │ │ │ -
11#include <dune/localfunctions/rannacherturek.hh>
│ │ │ │ -
12#include <dune/localfunctions/crouzeixraviart.hh>
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
13
│ │ │ │ - │ │ │ │ - │ │ │ │ -
16
│ │ │ │ +
14
│ │ │ │ +
15namespace Dune {
│ │ │ │ +
16namespace Functions {
│ │ │ │
17
│ │ │ │ -
18namespace Dune {
│ │ │ │ -
19namespace Functions {
│ │ │ │ -
20
│ │ │ │ -
21// *****************************************************************************
│ │ │ │ -
22// This is the reusable part of the basis. It contains
│ │ │ │ -
23//
│ │ │ │ -
24// RannacherTurekPreBasis
│ │ │ │ -
25// RannacherTurekNode
│ │ │ │ -
26//
│ │ │ │ -
27// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ -
28// state. These components do _not_ depend on the global basis and local view
│ │ │ │ -
29// and can be used without a global basis.
│ │ │ │ -
30// *****************************************************************************
│ │ │ │ -
31
│ │ │ │ -
32template<typename GV>
│ │ │ │ -
33class RannacherTurekNode;
│ │ │ │ -
34
│ │ │ │ -
35template<typename GV>
│ │ │ │ -
36class RannacherTurekPreBasis;
│ │ │ │ -
37
│ │ │ │ -
50template<typename GV>
│ │ │ │ - │ │ │ │ -
52{
│ │ │ │ -
53 static const int dim = GV::dimension;
│ │ │ │ -
54
│ │ │ │ -
55public:
│ │ │ │ -
56
│ │ │ │ -
58 using GridView = GV;
│ │ │ │ -
59
│ │ │ │ -
61 using size_type = std::size_t;
│ │ │ │ -
62
│ │ │ │ - │ │ │ │ -
65
│ │ │ │ -
66 static constexpr size_type maxMultiIndexSize = 1;
│ │ │ │ -
67 static constexpr size_type minMultiIndexSize = 1;
│ │ │ │ -
68 static constexpr size_type multiIndexBufferSize = 1;
│ │ │ │ -
69
│ │ │ │ - │ │ │ │ -
72 gridView_(gv)
│ │ │ │ -
73 {
│ │ │ │ -
74 for(auto type : gv.indexSet().types(0))
│ │ │ │ -
75 if (!type.isSimplex() && !type.isCube())
│ │ │ │ -
76 DUNE_THROW(Dune::NotImplemented, "Rannacher-Turek or Crouzeix-Raviart elements are only implemented for grids with simplex or cube elements.");
│ │ │ │ -
77 }
│ │ │ │ -
78
│ │ │ │ - │ │ │ │ -
81 {}
│ │ │ │ -
82
│ │ │ │ -
84 const GridView& gridView() const
│ │ │ │ -
85 {
│ │ │ │ -
86 return gridView_;
│ │ │ │ -
87 }
│ │ │ │ -
88
│ │ │ │ -
90 void update (const GridView& gv)
│ │ │ │ -
91 {
│ │ │ │ -
92 gridView_ = gv;
│ │ │ │ -
93 }
│ │ │ │ -
94
│ │ │ │ -
98 Node makeNode() const
│ │ │ │ -
99 {
│ │ │ │ -
100 return Node{};
│ │ │ │ -
101 }
│ │ │ │ -
102
│ │ │ │ - │ │ │ │ -
105 {
│ │ │ │ -
106 return (size_type)(gridView_.size(1));
│ │ │ │ -
107 }
│ │ │ │ -
108
│ │ │ │ -
110 template<class SizePrefix>
│ │ │ │ -
111 size_type size(const SizePrefix prefix) const
│ │ │ │ -
112 {
│ │ │ │ -
113 assert(prefix.size() == 0 || prefix.size() == 1);
│ │ │ │ -
114 return (prefix.size() == 0) ? size() : 0;
│ │ │ │ -
115 }
│ │ │ │ -
116
│ │ │ │ - │ │ │ │ -
119 {
│ │ │ │ -
120 return size();
│ │ │ │ -
121 }
│ │ │ │ -
122
│ │ │ │ - │ │ │ │ -
125 {
│ │ │ │ -
126 return 2*GV::dimension;
│ │ │ │ -
127 }
│ │ │ │ -
128
│ │ │ │ -
129 template<typename It>
│ │ │ │ -
130 It indices(const Node& node, It it) const
│ │ │ │ -
131 {
│ │ │ │ -
132 for (size_type i = 0, end = node.size() ; i < end ; ++i, ++it)
│ │ │ │ -
133 {
│ │ │ │ -
134 Dune::LocalKey localKey = node.finiteElement().localCoefficients().localKey(i);
│ │ │ │ -
135 const auto& gridIndexSet = gridView().indexSet();
│ │ │ │ -
136 const auto& element = node.element();
│ │ │ │ -
137
│ │ │ │ -
138 *it = {{ (size_type)(gridIndexSet.subIndex(element,localKey.subEntity(),1)) }};
│ │ │ │ -
139 }
│ │ │ │ -
140 return it;
│ │ │ │ -
141 }
│ │ │ │ -
142
│ │ │ │ -
143protected:
│ │ │ │ - │ │ │ │ -
145};
│ │ │ │ -
146
│ │ │ │ -
147
│ │ │ │ -
148
│ │ │ │ -
149template<typename GV>
│ │ │ │ - │ │ │ │ -
151 public LeafBasisNode
│ │ │ │ -
152{
│ │ │ │ -
153 static const int dim = GV::dimension;
│ │ │ │ -
154 static const int maxSize = 2*dim;
│ │ │ │ -
155
│ │ │ │ -
156 constexpr static bool hasFixedElementType = Capabilities::hasSingleGeometryType<typename GV::Grid>::v;
│ │ │ │ -
157
│ │ │ │ -
158 using CubeFiniteElement = RannacherTurekLocalFiniteElement<typename GV::ctype,double,dim>;
│ │ │ │ -
159 using SimplexFiniteElement = CrouzeixRaviartLocalFiniteElement<typename GV::ctype,double,dim>;
│ │ │ │ -
160
│ │ │ │ -
161 constexpr static unsigned int topologyId = Capabilities::hasSingleGeometryType<typename GV::Grid>::topologyId; // meaningless if hasFixedElementType is false
│ │ │ │ -
162 constexpr static GeometryType type = GeometryType(topologyId, GV::dimension);
│ │ │ │ -
163
│ │ │ │ -
164public:
│ │ │ │ -
165
│ │ │ │ -
166 using size_type = std::size_t;
│ │ │ │ -
167 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ -
168 using FiniteElement = std::conditional_t<hasFixedElementType,
│ │ │ │ -
169 std::conditional_t<type.isCube(),CubeFiniteElement,SimplexFiniteElement>,
│ │ │ │ -
170 LocalFiniteElementVariant<CubeFiniteElement, SimplexFiniteElement> >;
│ │ │ │ -
171
│ │ │ │ - │ │ │ │ - │ │ │ │ -
174 element_(nullptr)
│ │ │ │ -
175 {}
│ │ │ │ -
176
│ │ │ │ -
178 const Element& element() const
│ │ │ │ -
179 {
│ │ │ │ -
180 return *element_;
│ │ │ │ -
181 }
│ │ │ │ -
182
│ │ │ │ - │ │ │ │ -
188 {
│ │ │ │ -
189 return finiteElement_;
│ │ │ │ -
190 }
│ │ │ │ -
191
│ │ │ │ -
193 void bind(const Element& e)
│ │ │ │ -
194 {
│ │ │ │ -
195 element_ = &e;
│ │ │ │ -
196 if constexpr (!hasFixedElementType)
│ │ │ │ -
197 finiteElement_ = e.type().isCube() ? static_cast<FiniteElement>(CubeFiniteElement())
│ │ │ │ -
198 : static_cast<FiniteElement>(SimplexFiniteElement()) ;
│ │ │ │ -
199 this->setSize(finiteElement_.size());
│ │ │ │ -
200 }
│ │ │ │ -
201
│ │ │ │ -
202protected:
│ │ │ │ -
203
│ │ │ │ - │ │ │ │ - │ │ │ │ -
206};
│ │ │ │ -
207
│ │ │ │ -
208
│ │ │ │ -
209
│ │ │ │ -
210namespace BasisFactory {
│ │ │ │ -
211
│ │ │ │ -
217template<class Dummy=void>
│ │ │ │ - │ │ │ │ -
219{
│ │ │ │ -
220 return [](const auto& gridView) {
│ │ │ │ -
221 return RannacherTurekPreBasis<std::decay_t<decltype(gridView)>>(gridView);
│ │ │ │ -
222 };
│ │ │ │ -
223}
│ │ │ │ -
224
│ │ │ │ -
225} // end namespace BasisFactory
│ │ │ │ -
226
│ │ │ │ -
227
│ │ │ │ -
228
│ │ │ │ -
229
│ │ │ │ -
241template<typename GV>
│ │ │ │ - │ │ │ │ -
243
│ │ │ │ -
244} // end namespace Functions
│ │ │ │ -
245} // end namespace Dune
│ │ │ │ -
246
│ │ │ │ -
247#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ -
auto rannacherTurek()
Create a pre-basis factory that can create a Rannacher-Turek pre-basis.
Definition: rannacherturekbasis.hh:218
│ │ │ │ +
18
│ │ │ │ +
19
│ │ │ │ +
20template<class Signature, class GridView, template<class> class DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56>
│ │ │ │ + │ │ │ │ +
22{};
│ │ │ │ +
23
│ │ │ │ +
24
│ │ │ │ +
25
│ │ │ │ +
40template<class Range, class Domain, class GV, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ +
41class GridViewFunction<Range(Domain), GV, DerivativeTraits, bufferSize> :
│ │ │ │ +
42 public GridFunction<Range(Domain), GridViewEntitySet<GV, 0>, DerivativeTraits, bufferSize>
│ │ │ │ +
43{
│ │ │ │ +
44 using Base = GridFunction<Range(Domain), GridViewEntitySet<GV, 0>, DerivativeTraits, bufferSize>;
│ │ │ │ +
45public:
│ │ │ │ +
46 using GridView = GV;
│ │ │ │ +
47
│ │ │ │ +
48 using Base::Base;
│ │ │ │ +
49};
│ │ │ │ +
50
│ │ │ │ +
51
│ │ │ │ +
52
│ │ │ │ +
64template<class F, class GridView,
│ │ │ │ +
65 typename std::enable_if<
│ │ │ │ +
66 models< Imp::HasFreeLocalFunction, F>() , int>::type = 0>
│ │ │ │ +
67typename std::decay<F>::type
│ │ │ │ +
68 makeGridViewFunction(F&& f, const GridView& gridView)
│ │ │ │ +
69{
│ │ │ │ +
70 return std::forward<F>(f);
│ │ │ │ +
71}
│ │ │ │ +
72
│ │ │ │ +
73
│ │ │ │ +
74
│ │ │ │ +
90template<class F, class GridView,
│ │ │ │ +
91 typename std::enable_if<
│ │ │ │ +
92 not(models< Imp::HasFreeLocalFunction, F>()) , int>::type = 0>
│ │ │ │ +
93auto makeGridViewFunction(F&& f, const GridView& gridView)
│ │ │ │ +
94 -> decltype(makeAnalyticGridViewFunction(std::forward<F>(f), gridView))
│ │ │ │ +
95{
│ │ │ │ +
96 return makeAnalyticGridViewFunction(std::forward<F>(f), gridView);
│ │ │ │ +
97}
│ │ │ │ +
98
│ │ │ │ +
99
│ │ │ │ +
100
│ │ │ │ +
101} // end of namespace Dune::Functions
│ │ │ │ +
102} // end of namespace Dune
│ │ │ │ +
103
│ │ │ │ +
104#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWFUNCTION_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
AnalyticGridViewFunction< typename std::invoke_result< F, typename GridView::template Codim< 0 >::Geometry::GlobalCoordinate >::type(typename GridView::template Codim< 0 >::Geometry::GlobalCoordinate), GridView, typename std::decay< F >::type > makeAnalyticGridViewFunction(F &&f, const GridView &gridView)
Create an AnalyticGridViewFunction from a function and a grid view.
Definition: analyticgridviewfunction.hh:230
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
Global basis for given pre-basis.
Definition: defaultglobalbasis.hh:46
│ │ │ │ -
size_type size() const
Definition: nodes.hh:142
│ │ │ │ -
std::size_t size_type
Definition: nodes.hh:128
│ │ │ │ -
void setSize(const size_type size)
Definition: nodes.hh:164
│ │ │ │ -
Definition: nodes.hh:186
│ │ │ │ -
Definition: rannacherturekbasis.hh:152
│ │ │ │ -
std::conditional_t< hasFixedElementType, std::conditional_t< type.isCube(), CubeFiniteElement, SimplexFiniteElement >, LocalFiniteElementVariant< CubeFiniteElement, SimplexFiniteElement > > FiniteElement
Definition: rannacherturekbasis.hh:170
│ │ │ │ -
void bind(const Element &e)
Bind to element.
Definition: rannacherturekbasis.hh:193
│ │ │ │ -
FiniteElement finiteElement_
Definition: rannacherturekbasis.hh:204
│ │ │ │ -
typename GV::template Codim< 0 >::Entity Element
Definition: rannacherturekbasis.hh:167
│ │ │ │ -
RannacherTurekNode()
Definition: rannacherturekbasis.hh:172
│ │ │ │ -
const Element * element_
Definition: rannacherturekbasis.hh:205
│ │ │ │ -
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition: rannacherturekbasis.hh:187
│ │ │ │ -
const Element & element() const
Return current element, throw if unbound.
Definition: rannacherturekbasis.hh:178
│ │ │ │ -
Pre-basis for a Rannacher-Turek basis.
Definition: rannacherturekbasis.hh:52
│ │ │ │ -
static constexpr size_type multiIndexBufferSize
Definition: rannacherturekbasis.hh:68
│ │ │ │ -
void initializeIndices()
Initialize the global indices.
Definition: rannacherturekbasis.hh:80
│ │ │ │ -
static constexpr size_type maxMultiIndexSize
Definition: rannacherturekbasis.hh:66
│ │ │ │ -
static constexpr size_type minMultiIndexSize
Definition: rannacherturekbasis.hh:67
│ │ │ │ -
size_type size(const SizePrefix prefix) const
Return number of possible values for next position in multi index.
Definition: rannacherturekbasis.hh:111
│ │ │ │ -
std::size_t size_type
Type used for indices and size information.
Definition: rannacherturekbasis.hh:61
│ │ │ │ -
Node makeNode() const
Create tree node.
Definition: rannacherturekbasis.hh:98
│ │ │ │ -
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition: rannacherturekbasis.hh:90
│ │ │ │ -
It indices(const Node &node, It it) const
Definition: rannacherturekbasis.hh:130
│ │ │ │ -
GV GridView
The grid view that the FE basis is defined on.
Definition: rannacherturekbasis.hh:58
│ │ │ │ -
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition: rannacherturekbasis.hh:118
│ │ │ │ -
RannacherTurekPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition: rannacherturekbasis.hh:71
│ │ │ │ -
size_type size() const
Same as size(prefix) with empty prefix.
Definition: rannacherturekbasis.hh:104
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: rannacherturekbasis.hh:84
│ │ │ │ -
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition: rannacherturekbasis.hh:124
│ │ │ │ -
GridView gridView_
Definition: rannacherturekbasis.hh:144
│ │ │ │ +
std::decay< F >::type makeGridViewFunction(F &&f, const GridView &gridView)
Construct a function modeling GridViewFunction from function and grid view.
Definition: gridviewfunction.hh:68
│ │ │ │ +
Definition: gridfunction.hh:32
│ │ │ │ +
An entity set for all entities of given codim in a grid view.
Definition: gridviewentityset.hh:23
│ │ │ │ +
Definition: gridviewfunction.hh:22
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,341 +4,109 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * functionspacebases │ │ │ │ │ -rannacherturekbasis.hh │ │ │ │ │ + * gridfunctions │ │ │ │ │ +gridviewfunction.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWFUNCTION_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWFUNCTION_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ + 6#include │ │ │ │ │ 7 │ │ │ │ │ - 8#include │ │ │ │ │ + 8#include │ │ │ │ │ 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ 13 │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ - 16 │ │ │ │ │ + 14 │ │ │ │ │ + 15namespace Dune { │ │ │ │ │ + 16namespace Functions { │ │ │ │ │ 17 │ │ │ │ │ - 18namespace Dune { │ │ │ │ │ - 19namespace Functions { │ │ │ │ │ - 20 │ │ │ │ │ - 21/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 22// This is the reusable part of the basis. It contains │ │ │ │ │ - 23// │ │ │ │ │ - 24// RannacherTurekPreBasis │ │ │ │ │ - 25// RannacherTurekNode │ │ │ │ │ - 26// │ │ │ │ │ - 27// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ -shared │ │ │ │ │ - 28// state. These components do _not_ depend on the global basis and local │ │ │ │ │ -view │ │ │ │ │ - 29// and can be used without a global basis. │ │ │ │ │ - 30/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ - 31 │ │ │ │ │ - 32template │ │ │ │ │ - 33class RannacherTurekNode; │ │ │ │ │ - 34 │ │ │ │ │ - 35template │ │ │ │ │ - 36class RannacherTurekPreBasis; │ │ │ │ │ - 37 │ │ │ │ │ - 50template │ │ │ │ │ -51class RannacherTurekPreBasis │ │ │ │ │ - 52{ │ │ │ │ │ - 53 static const int dim = GV::dimension; │ │ │ │ │ - 54 │ │ │ │ │ - 55public: │ │ │ │ │ - 56 │ │ │ │ │ -58 using GridView = GV; │ │ │ │ │ - 59 │ │ │ │ │ -61 using size_type = std::size_t; │ │ │ │ │ - 62 │ │ │ │ │ -64 using Node = RannacherTurekNode; │ │ │ │ │ - 65 │ │ │ │ │ -66 static constexpr size_type maxMultiIndexSize = 1; │ │ │ │ │ -67 static constexpr size_type minMultiIndexSize = 1; │ │ │ │ │ -68 static constexpr size_type multiIndexBufferSize = 1; │ │ │ │ │ - 69 │ │ │ │ │ -71 RannacherTurekPreBasis(const GridView& gv) : │ │ │ │ │ - 72 gridView_(gv) │ │ │ │ │ - 73 { │ │ │ │ │ - 74 for(auto type : gv.indexSet().types(0)) │ │ │ │ │ - 75 if (!type.isSimplex() && !type.isCube()) │ │ │ │ │ - 76 DUNE_THROW(Dune::NotImplemented, "Rannacher-Turek or Crouzeix-Raviart │ │ │ │ │ -elements are only implemented for grids with simplex or cube elements."); │ │ │ │ │ - 77 } │ │ │ │ │ - 78 │ │ │ │ │ -80 void initializeIndices() │ │ │ │ │ - 81 {} │ │ │ │ │ - 82 │ │ │ │ │ -84 const GridView& gridView() const │ │ │ │ │ - 85 { │ │ │ │ │ - 86 return gridView_; │ │ │ │ │ - 87 } │ │ │ │ │ - 88 │ │ │ │ │ -90 void update (const GridView& gv) │ │ │ │ │ - 91 { │ │ │ │ │ - 92 gridView_ = gv; │ │ │ │ │ - 93 } │ │ │ │ │ - 94 │ │ │ │ │ -98 Node makeNode() const │ │ │ │ │ - 99 { │ │ │ │ │ - 100 return Node{}; │ │ │ │ │ - 101 } │ │ │ │ │ - 102 │ │ │ │ │ -104 size_type size() const │ │ │ │ │ - 105 { │ │ │ │ │ - 106 return (size_type)(gridView_.size(1)); │ │ │ │ │ - 107 } │ │ │ │ │ - 108 │ │ │ │ │ - 110 template │ │ │ │ │ -111 size_type size(const SizePrefix prefix) const │ │ │ │ │ - 112 { │ │ │ │ │ - 113 assert(prefix.size() == 0 || prefix.size() == 1); │ │ │ │ │ - 114 return (prefix.size() == 0) ? size() : 0; │ │ │ │ │ - 115 } │ │ │ │ │ - 116 │ │ │ │ │ -118 size_type dimension() const │ │ │ │ │ - 119 { │ │ │ │ │ - 120 return size(); │ │ │ │ │ - 121 } │ │ │ │ │ - 122 │ │ │ │ │ -124 size_type maxNodeSize() const │ │ │ │ │ - 125 { │ │ │ │ │ - 126 return 2*GV::dimension; │ │ │ │ │ - 127 } │ │ │ │ │ - 128 │ │ │ │ │ - 129 template │ │ │ │ │ -130 It indices(const Node& node, It it) const │ │ │ │ │ - 131 { │ │ │ │ │ - 132 for (size_type i = 0, end = node.size() ; i < end ; ++i, ++it) │ │ │ │ │ - 133 { │ │ │ │ │ - 134 Dune::LocalKey localKey = node.finiteElement().localCoefficients │ │ │ │ │ -().localKey(i); │ │ │ │ │ - 135 const auto& gridIndexSet = gridView().indexSet(); │ │ │ │ │ - 136 const auto& element = node.element(); │ │ │ │ │ - 137 │ │ │ │ │ - 138 *it = {{ (size_type)(gridIndexSet.subIndex(element,localKey.subEntity │ │ │ │ │ -(),1)) }}; │ │ │ │ │ - 139 } │ │ │ │ │ - 140 return it; │ │ │ │ │ - 141 } │ │ │ │ │ - 142 │ │ │ │ │ - 143protected: │ │ │ │ │ -144 GridView gridView_; │ │ │ │ │ - 145}; │ │ │ │ │ - 146 │ │ │ │ │ - 147 │ │ │ │ │ - 148 │ │ │ │ │ - 149template │ │ │ │ │ -150class RannacherTurekNode : │ │ │ │ │ - 151 public LeafBasisNode │ │ │ │ │ - 152{ │ │ │ │ │ - 153 static const int dim = GV::dimension; │ │ │ │ │ - 154 static const int maxSize = 2*dim; │ │ │ │ │ - 155 │ │ │ │ │ - 156 constexpr static bool hasFixedElementType = Capabilities:: │ │ │ │ │ -hasSingleGeometryType::v; │ │ │ │ │ - 157 │ │ │ │ │ - 158 using CubeFiniteElement = RannacherTurekLocalFiniteElement; │ │ │ │ │ - 159 using SimplexFiniteElement = CrouzeixRaviartLocalFiniteElement; │ │ │ │ │ - 160 │ │ │ │ │ - 161 constexpr static unsigned int topologyId = Capabilities:: │ │ │ │ │ -hasSingleGeometryType::topologyId; // meaningless if │ │ │ │ │ -hasFixedElementType is false │ │ │ │ │ - 162 constexpr static GeometryType type = GeometryType(topologyId, GV:: │ │ │ │ │ -dimension); │ │ │ │ │ - 163 │ │ │ │ │ - 164public: │ │ │ │ │ - 165 │ │ │ │ │ -166 using size_type = std::size_t; │ │ │ │ │ -167 using Element = typename GV::template Codim<0>::Entity; │ │ │ │ │ -168 using FiniteElement = std::conditional_t, │ │ │ │ │ - 170 LocalFiniteElementVariant >; │ │ │ │ │ - 171 │ │ │ │ │ -172 RannacherTurekNode() : │ │ │ │ │ - 173 finiteElement_(), │ │ │ │ │ - 174 element_(nullptr) │ │ │ │ │ - 175 {} │ │ │ │ │ - 176 │ │ │ │ │ -178 const Element& element() const │ │ │ │ │ - 179 { │ │ │ │ │ - 180 return *element_; │ │ │ │ │ - 181 } │ │ │ │ │ - 182 │ │ │ │ │ -187 const FiniteElement& finiteElement() const │ │ │ │ │ - 188 { │ │ │ │ │ - 189 return finiteElement_; │ │ │ │ │ - 190 } │ │ │ │ │ - 191 │ │ │ │ │ -193 void bind(const Element& e) │ │ │ │ │ - 194 { │ │ │ │ │ - 195 element_ = &e; │ │ │ │ │ - 196 if constexpr (!hasFixedElementType) │ │ │ │ │ - 197 finiteElement_ = e.type().isCube() ? static_cast │ │ │ │ │ -(CubeFiniteElement()) │ │ │ │ │ - 198 : static_cast(SimplexFiniteElement()) ; │ │ │ │ │ - 199 this->setSize(finiteElement_.size()); │ │ │ │ │ - 200 } │ │ │ │ │ - 201 │ │ │ │ │ - 202protected: │ │ │ │ │ - 203 │ │ │ │ │ -204 FiniteElement finiteElement_; │ │ │ │ │ -205 const Element* element_; │ │ │ │ │ - 206}; │ │ │ │ │ - 207 │ │ │ │ │ - 208 │ │ │ │ │ - 209 │ │ │ │ │ - 210namespace BasisFactory { │ │ │ │ │ - 211 │ │ │ │ │ - 217template │ │ │ │ │ -218auto rannacherTurek() │ │ │ │ │ - 219{ │ │ │ │ │ - 220 return [](const auto& gridView) { │ │ │ │ │ - 221 return RannacherTurekPreBasis>(gridView); │ │ │ │ │ - 222 }; │ │ │ │ │ - 223} │ │ │ │ │ - 224 │ │ │ │ │ - 225} // end namespace BasisFactory │ │ │ │ │ - 226 │ │ │ │ │ - 227 │ │ │ │ │ - 228 │ │ │ │ │ - 229 │ │ │ │ │ - 241template │ │ │ │ │ -242using RannacherTurekBasis = DefaultGlobalBasis >; │ │ │ │ │ - 243 │ │ │ │ │ - 244} // end namespace Functions │ │ │ │ │ - 245} // end namespace Dune │ │ │ │ │ - 246 │ │ │ │ │ - 247#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH │ │ │ │ │ -nodes.hh │ │ │ │ │ -defaultglobalbasis.hh │ │ │ │ │ -Dune::Functions::BasisFactory::rannacherTurek │ │ │ │ │ -auto rannacherTurek() │ │ │ │ │ -Create a pre-basis factory that can create a Rannacher-Turek pre-basis. │ │ │ │ │ -Definition: rannacherturekbasis.hh:218 │ │ │ │ │ + 18 │ │ │ │ │ + 19 │ │ │ │ │ + 20template class │ │ │ │ │ +DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56> │ │ │ │ │ +21class GridViewFunction │ │ │ │ │ + 22{}; │ │ │ │ │ + 23 │ │ │ │ │ + 24 │ │ │ │ │ + 25 │ │ │ │ │ + 40template class │ │ │ │ │ +DerivativeTraits, size_t bufferSize> │ │ │ │ │ +41class GridViewFunction : │ │ │ │ │ + 42 public GridFunction, │ │ │ │ │ +DerivativeTraits, bufferSize> │ │ │ │ │ + 43{ │ │ │ │ │ + 44 using Base = GridFunction, │ │ │ │ │ +DerivativeTraits, bufferSize>; │ │ │ │ │ + 45public: │ │ │ │ │ +46 using GridView = GV; │ │ │ │ │ + 47 │ │ │ │ │ + 48 using Base::Base; │ │ │ │ │ + 49}; │ │ │ │ │ + 50 │ │ │ │ │ + 51 │ │ │ │ │ + 52 │ │ │ │ │ + 64template() , int>::type = 0> │ │ │ │ │ + 67typename std::decay::type │ │ │ │ │ +68 makeGridViewFunction(F&& f, const GridView& gridView) │ │ │ │ │ + 69{ │ │ │ │ │ + 70 return std::forward(f); │ │ │ │ │ + 71} │ │ │ │ │ + 72 │ │ │ │ │ + 73 │ │ │ │ │ + 74 │ │ │ │ │ + 90template()) , int>::type = 0> │ │ │ │ │ +93auto makeGridViewFunction(F&& f, const GridView& gridView) │ │ │ │ │ + 94 -> decltype(makeAnalyticGridViewFunction(std::forward(f), gridView)) │ │ │ │ │ + 95{ │ │ │ │ │ + 96 return makeAnalyticGridViewFunction(std::forward(f), gridView); │ │ │ │ │ + 97} │ │ │ │ │ + 98 │ │ │ │ │ + 99 │ │ │ │ │ + 100 │ │ │ │ │ + 101} // end of namespace Dune::Functions │ │ │ │ │ + 102} // end of namespace Dune │ │ │ │ │ + 103 │ │ │ │ │ + 104#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWFUNCTION_HH │ │ │ │ │ +gridfunction.hh │ │ │ │ │ +gridviewentityset.hh │ │ │ │ │ +analyticgridviewfunction.hh │ │ │ │ │ +Dune::Functions::makeAnalyticGridViewFunction │ │ │ │ │ +AnalyticGridViewFunction< typename std::invoke_result< F, typename GridView:: │ │ │ │ │ +template Codim< 0 >::Geometry::GlobalCoordinate >::type(typename GridView:: │ │ │ │ │ +template Codim< 0 >::Geometry::GlobalCoordinate), GridView, typename std:: │ │ │ │ │ +decay< F >::type > makeAnalyticGridViewFunction(F &&f, const GridView │ │ │ │ │ +&gridView) │ │ │ │ │ +Create an AnalyticGridViewFunction from a function and a grid view. │ │ │ │ │ +Definition: analyticgridviewfunction.hh:230 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::DefaultGlobalBasis │ │ │ │ │ -Global basis for given pre-basis. │ │ │ │ │ -Definition: defaultglobalbasis.hh:46 │ │ │ │ │ -Dune::Functions::BasisNodeMixin::size │ │ │ │ │ -size_type size() const │ │ │ │ │ -Definition: nodes.hh:142 │ │ │ │ │ -Dune::Functions::BasisNodeMixin::size_type │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Definition: nodes.hh:128 │ │ │ │ │ -Dune::Functions::BasisNodeMixin::setSize │ │ │ │ │ -void setSize(const size_type size) │ │ │ │ │ -Definition: nodes.hh:164 │ │ │ │ │ -Dune::Functions::LeafBasisNode │ │ │ │ │ -Definition: nodes.hh:186 │ │ │ │ │ -Dune::Functions::RannacherTurekNode │ │ │ │ │ -Definition: rannacherturekbasis.hh:152 │ │ │ │ │ -Dune::Functions::RannacherTurekNode::FiniteElement │ │ │ │ │ -std::conditional_t< hasFixedElementType, std::conditional_t< type.isCube(), │ │ │ │ │ -CubeFiniteElement, SimplexFiniteElement >, LocalFiniteElementVariant< │ │ │ │ │ -CubeFiniteElement, SimplexFiniteElement > > FiniteElement │ │ │ │ │ -Definition: rannacherturekbasis.hh:170 │ │ │ │ │ -Dune::Functions::RannacherTurekNode::bind │ │ │ │ │ -void bind(const Element &e) │ │ │ │ │ -Bind to element. │ │ │ │ │ -Definition: rannacherturekbasis.hh:193 │ │ │ │ │ -Dune::Functions::RannacherTurekNode::finiteElement_ │ │ │ │ │ -FiniteElement finiteElement_ │ │ │ │ │ -Definition: rannacherturekbasis.hh:204 │ │ │ │ │ -Dune::Functions::RannacherTurekNode::Element │ │ │ │ │ -typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ -Definition: rannacherturekbasis.hh:167 │ │ │ │ │ -Dune::Functions::RannacherTurekNode::RannacherTurekNode │ │ │ │ │ -RannacherTurekNode() │ │ │ │ │ -Definition: rannacherturekbasis.hh:172 │ │ │ │ │ -Dune::Functions::RannacherTurekNode::element_ │ │ │ │ │ -const Element * element_ │ │ │ │ │ -Definition: rannacherturekbasis.hh:205 │ │ │ │ │ -Dune::Functions::RannacherTurekNode::finiteElement │ │ │ │ │ -const FiniteElement & finiteElement() const │ │ │ │ │ -Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ -Definition: rannacherturekbasis.hh:187 │ │ │ │ │ -Dune::Functions::RannacherTurekNode::element │ │ │ │ │ -const Element & element() const │ │ │ │ │ -Return current element, throw if unbound. │ │ │ │ │ -Definition: rannacherturekbasis.hh:178 │ │ │ │ │ -Dune::Functions::RannacherTurekPreBasis │ │ │ │ │ -Pre-basis for a Rannacher-Turek basis. │ │ │ │ │ -Definition: rannacherturekbasis.hh:52 │ │ │ │ │ -Dune::Functions::RannacherTurekPreBasis::multiIndexBufferSize │ │ │ │ │ -static constexpr size_type multiIndexBufferSize │ │ │ │ │ -Definition: rannacherturekbasis.hh:68 │ │ │ │ │ -Dune::Functions::RannacherTurekPreBasis::initializeIndices │ │ │ │ │ -void initializeIndices() │ │ │ │ │ -Initialize the global indices. │ │ │ │ │ -Definition: rannacherturekbasis.hh:80 │ │ │ │ │ -Dune::Functions::RannacherTurekPreBasis::maxMultiIndexSize │ │ │ │ │ -static constexpr size_type maxMultiIndexSize │ │ │ │ │ -Definition: rannacherturekbasis.hh:66 │ │ │ │ │ -Dune::Functions::RannacherTurekPreBasis::minMultiIndexSize │ │ │ │ │ -static constexpr size_type minMultiIndexSize │ │ │ │ │ -Definition: rannacherturekbasis.hh:67 │ │ │ │ │ -Dune::Functions::RannacherTurekPreBasis::size │ │ │ │ │ -size_type size(const SizePrefix prefix) const │ │ │ │ │ -Return number of possible values for next position in multi index. │ │ │ │ │ -Definition: rannacherturekbasis.hh:111 │ │ │ │ │ -Dune::Functions::RannacherTurekPreBasis::size_type │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Type used for indices and size information. │ │ │ │ │ -Definition: rannacherturekbasis.hh:61 │ │ │ │ │ -Dune::Functions::RannacherTurekPreBasis::makeNode │ │ │ │ │ -Node makeNode() const │ │ │ │ │ -Create tree node. │ │ │ │ │ -Definition: rannacherturekbasis.hh:98 │ │ │ │ │ -Dune::Functions::RannacherTurekPreBasis::update │ │ │ │ │ -void update(const GridView &gv) │ │ │ │ │ -Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ -Definition: rannacherturekbasis.hh:90 │ │ │ │ │ -Dune::Functions::RannacherTurekPreBasis::indices │ │ │ │ │ -It indices(const Node &node, It it) const │ │ │ │ │ -Definition: rannacherturekbasis.hh:130 │ │ │ │ │ -Dune::Functions::RannacherTurekPreBasis::GridView │ │ │ │ │ +Dune::Functions::makeGridViewFunction │ │ │ │ │ +std::decay< F >::type makeGridViewFunction(F &&f, const GridView &gridView) │ │ │ │ │ +Construct a function modeling GridViewFunction from function and grid view. │ │ │ │ │ +Definition: gridviewfunction.hh:68 │ │ │ │ │ +Dune::Functions::GridFunction │ │ │ │ │ +Definition: gridfunction.hh:32 │ │ │ │ │ +Dune::Functions::GridViewEntitySet │ │ │ │ │ +An entity set for all entities of given codim in a grid view. │ │ │ │ │ +Definition: gridviewentityset.hh:23 │ │ │ │ │ +Dune::Functions::GridViewFunction │ │ │ │ │ +Definition: gridviewfunction.hh:22 │ │ │ │ │ +Dune::Functions::GridViewFunction<_Range(Domain),_GV,_DerivativeTraits, │ │ │ │ │ +bufferSize_>::GridView │ │ │ │ │ GV GridView │ │ │ │ │ -The grid view that the FE basis is defined on. │ │ │ │ │ -Definition: rannacherturekbasis.hh:58 │ │ │ │ │ -Dune::Functions::RannacherTurekPreBasis::dimension │ │ │ │ │ -size_type dimension() const │ │ │ │ │ -Get the total dimension of the space spanned by this basis. │ │ │ │ │ -Definition: rannacherturekbasis.hh:118 │ │ │ │ │ -Dune::Functions::RannacherTurekPreBasis::RannacherTurekPreBasis │ │ │ │ │ -RannacherTurekPreBasis(const GridView &gv) │ │ │ │ │ -Constructor for a given grid view object. │ │ │ │ │ -Definition: rannacherturekbasis.hh:71 │ │ │ │ │ -Dune::Functions::RannacherTurekPreBasis::size │ │ │ │ │ -size_type size() const │ │ │ │ │ -Same as size(prefix) with empty prefix. │ │ │ │ │ -Definition: rannacherturekbasis.hh:104 │ │ │ │ │ -Dune::Functions::RannacherTurekPreBasis::gridView │ │ │ │ │ -const GridView & gridView() const │ │ │ │ │ -Obtain the grid view that the basis is defined on. │ │ │ │ │ -Definition: rannacherturekbasis.hh:84 │ │ │ │ │ -Dune::Functions::RannacherTurekPreBasis::maxNodeSize │ │ │ │ │ -size_type maxNodeSize() const │ │ │ │ │ -Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ -Definition: rannacherturekbasis.hh:124 │ │ │ │ │ -Dune::Functions::RannacherTurekPreBasis::gridView_ │ │ │ │ │ -GridView gridView_ │ │ │ │ │ -Definition: rannacherturekbasis.hh:144 │ │ │ │ │ +Definition: gridviewfunction.hh:46 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00185.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: hierarchicnodetorangemap.hh File Reference │ │ │ │ +dune-functions: analyticgridviewfunction.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,44 +58,56 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
hierarchicnodetorangemap.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
analyticgridviewfunction.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <utility>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <dune/common/concept.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │ -#include <dune/functions/common/indexaccess.hh>
│ │ │ │ +
#include <type_traits>
│ │ │ │ +#include <optional>
│ │ │ │ +#include <dune/common/typeutilities.hh>
│ │ │ │ +#include <dune/functions/common/signature.hh>
│ │ │ │ +#include <dune/functions/common/defaultderivativetraits.hh>
│ │ │ │ +#include <dune/functions/common/differentiablefunction_imp.hh>
│ │ │ │ +#include <dune/functions/common/differentiablefunction.hh>
│ │ │ │ +#include <dune/functions/gridfunctions/gridviewentityset.hh>
│ │ │ │ +#include <dune/functions/gridfunctions/localderivativetraits.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::Functions::HierarchicNodeToRangeMap
 A simple node to range map using the nested tree indices. More...
class  Dune::Functions::AnalyticGridViewFunction< Range(Domain), GV, F, DerivativeTraits >
 Class wrapping any differentiable function as grid function. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<class F , class GridView >
AnalyticGridViewFunction< typename std::invoke_result< F, typename GridView::template Codim< 0 >::Geometry::GlobalCoordinate >::type(typename GridView::template Codim< 0 >::Geometry::GlobalCoordinate), GridView, typename std::decay< F >::type > Dune::Functions::makeAnalyticGridViewFunction (F &&f, const GridView &gridView)
 Create an AnalyticGridViewFunction from a function and a grid view. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,28 +4,46 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * functionspacebases │ │ │ │ │ -Classes | Namespaces │ │ │ │ │ -hierarchicnodetorangemap.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ + * gridfunctions │ │ │ │ │ +Classes | Namespaces | Functions │ │ │ │ │ +analyticgridviewfunction.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -struct  Dune::Functions::HierarchicNodeToRangeMap │ │ │ │ │ -  A simple node to range map using the nested tree indices. More... │ │ │ │ │ +class  Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ + DerivativeTraits_> │ │ │ │ │ +  Class wrapping any differentiable function as grid function. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ + AnalyticGridViewFunction< typename │ │ │ │ │ + std::invoke_result< F, typename │ │ │ │ │ + GridView::template Codim< 0 >:: │ │ │ │ │ + Geometry::GlobalCoordinate >::type │ │ │ │ │ +(typename GridView::template Codim< 0 │ │ │ │ │ + >::Geometry::GlobalCoordinate), Dune::Functions:: │ │ │ │ │ + GridView, typename std::decay< F >:: makeAnalyticGridViewFunction (F &&f, │ │ │ │ │ + type > const GridView &gridView) │ │ │ │ │ +  Create an AnalyticGridViewFunction from │ │ │ │ │ + a function and a grid view. More... │ │ │ │ │ +  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00185_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: hierarchicnodetorangemap.hh Source File │ │ │ │ +dune-functions: analyticgridviewfunction.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,71 +58,239 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
hierarchicnodetorangemap.hh
│ │ │ │ +
analyticgridviewfunction.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICNODETORANGEMAP_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICNODETORANGEMAP_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH
│ │ │ │
5
│ │ │ │ -
6
│ │ │ │ -
7#include <utility>
│ │ │ │ -
8#include <type_traits>
│ │ │ │ -
9
│ │ │ │ -
10#include <dune/common/concept.hh>
│ │ │ │ -
11
│ │ │ │ - │ │ │ │ - │ │ │ │ -
14
│ │ │ │ -
15namespace Dune {
│ │ │ │ -
16namespace Functions {
│ │ │ │ +
6#include <type_traits>
│ │ │ │ +
7#include <optional>
│ │ │ │ +
8
│ │ │ │ +
9#include <dune/common/typeutilities.hh>
│ │ │ │ +
10
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
17
│ │ │ │
18
│ │ │ │ -
19
│ │ │ │ - │ │ │ │ -
30{
│ │ │ │ -
31 template<class Node, class TreePath, class Range,
│ │ │ │ -
32 std::enable_if_t< models<Concept::HasIndexAccess, Range, Dune::index_constant<0>>(), int> = 0>
│ │ │ │ -
33 decltype(auto) operator()(const Node&, const TreePath& treePath, Range&& y) const
│ │ │ │ -
34 {
│ │ │ │ -
35 return resolveStaticMultiIndex(y, treePath);
│ │ │ │ -
36 }
│ │ │ │ -
37
│ │ │ │ -
38 template<class Node, class TreePath, class Range,
│ │ │ │ -
39 std::enable_if_t<not models<Concept::HasIndexAccess, Range, Dune::index_constant<0>>(), int> = 0>
│ │ │ │ -
40 decltype(auto) operator()(const Node&, const TreePath&, Range&& y) const
│ │ │ │ -
41 {
│ │ │ │ -
42 return std::forward<Range>(y);
│ │ │ │ -
43 }
│ │ │ │ -
44};
│ │ │ │ -
45
│ │ │ │ -
46
│ │ │ │ -
47
│ │ │ │ -
48} // namespace Dune::Functions
│ │ │ │ -
49} // namespace Dune
│ │ │ │ -
50
│ │ │ │ -
51
│ │ │ │ -
52#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICNODETORANGEMAP_HH
│ │ │ │ - │ │ │ │ -
constexpr decltype(auto) resolveStaticMultiIndex(C &&c, const MultiIndex &multiIndex)
Provide multi-index access by chaining operator[].
Definition: indexaccess.hh:398
│ │ │ │ +
19namespace Dune {
│ │ │ │ +
20namespace Functions {
│ │ │ │ +
21
│ │ │ │ +
22namespace Imp {
│ │ │ │ +
23
│ │ │ │ +
24template<class Signature, class GV, class FLocal, template<class> class DerivativeTraits=DefaultDerivativeTraits>
│ │ │ │ +
25class LocalAnalyticGridViewFunction;
│ │ │ │ +
26
│ │ │ │ +
27template<class Range, class LocalDomain, class GV, class F, template<class> class DerivativeTraits>
│ │ │ │ +
28class LocalAnalyticGridViewFunction<Range(LocalDomain), GV, F, DerivativeTraits>
│ │ │ │ +
29{
│ │ │ │ +
30public:
│ │ │ │ +
31 using Signature = Range(LocalDomain);
│ │ │ │ +
32 using RawSignature = typename SignatureTraits<Signature>::RawSignature;
│ │ │ │ +
33 using DerivativeSignature = typename DerivativeTraits<RawSignature>::Range(LocalDomain);
│ │ │ │ +
34
│ │ │ │ +
35 using GridView = GV;
│ │ │ │ +
36 using EntitySet = GridViewEntitySet<GridView, 0>;
│ │ │ │ +
37 using Element = typename EntitySet::Element;
│ │ │ │ +
38// using Geometry = typename Element::Geometry;
│ │ │ │ +
39 using Geometry = typename std::decay<typename Element::Geometry>::type;
│ │ │ │ +
40
│ │ │ │ +
41 // Use the indirection via derivativeIfImplemented to also support
│ │ │ │ +
42 // function types F that do not implement derivative. In this case
│ │ │ │ +
43 // the interface type DifferentiableFunction is using a dummy for
│ │ │ │ +
44 // the derivative type
│ │ │ │ +
45 using DerivativeDummy = DifferentiableFunction<DerivativeSignature>;
│ │ │ │ +
46 using GlobalRawDerivative = decltype(Imp::derivativeIfImplemented<DerivativeDummy, F>(std::declval<F>()));
│ │ │ │ +
47 using LocalDerivative = LocalAnalyticGridViewFunction<DerivativeSignature, GridView, GlobalRawDerivative, DerivativeTraits>;
│ │ │ │ +
48
│ │ │ │ +
50 template<class FT, disableCopyMove<LocalAnalyticGridViewFunction, FT> = 0>
│ │ │ │ +
51 LocalAnalyticGridViewFunction(FT&& f) :
│ │ │ │ +
52 f_(std::forward<FT>(f))
│ │ │ │ +
53 {}
│ │ │ │ +
54
│ │ │ │ +
56 template<class FT>
│ │ │ │ +
57 LocalAnalyticGridViewFunction(FT&& f, const Element& element, const std::optional<Geometry>& geometry) :
│ │ │ │ +
58 f_(std::forward<FT>(f)),
│ │ │ │ +
59 element_(element),
│ │ │ │ +
60 geometry_(geometry)
│ │ │ │ +
61 {}
│ │ │ │ +
62
│ │ │ │ +
63
│ │ │ │ +
72 void bind(const Element& element)
│ │ │ │ +
73 {
│ │ │ │ +
74 element_ = element;
│ │ │ │ +
75 geometry_.emplace(element_.geometry());
│ │ │ │ +
76 }
│ │ │ │ +
77
│ │ │ │ +
79 void unbind()
│ │ │ │ +
80 {
│ │ │ │ +
81 geometry_.reset();
│ │ │ │ +
82 }
│ │ │ │ +
83
│ │ │ │ +
86 bool bound() const
│ │ │ │ +
87 {
│ │ │ │ +
88 return static_cast<bool>(geometry_);
│ │ │ │ +
89 }
│ │ │ │ +
90
│ │ │ │ +
100 Range operator()(const LocalDomain& x) const
│ │ │ │ +
101 {
│ │ │ │ +
102 assert(!!geometry_);
│ │ │ │ +
103 return f_(geometry_->global(x));
│ │ │ │ +
104 }
│ │ │ │ +
105
│ │ │ │ +
107 const Element& localContext() const
│ │ │ │ +
108 {
│ │ │ │ +
109 assert(!!geometry_);
│ │ │ │ +
110 return element_;
│ │ │ │ +
111 }
│ │ │ │ +
112
│ │ │ │ +
121 friend LocalDerivative derivative(const LocalAnalyticGridViewFunction& t)
│ │ │ │ +
122 {
│ │ │ │ +
123 return LocalDerivative(Imp::derivativeIfImplemented<DerivativeDummy, F>(t.f_), t.element_, t.geometry_);
│ │ │ │ +
124 }
│ │ │ │ +
125
│ │ │ │ +
126private:
│ │ │ │ +
127 F f_;
│ │ │ │ +
128 Element element_;
│ │ │ │ +
129 std::optional<Geometry> geometry_ = std::nullopt;
│ │ │ │ +
130};
│ │ │ │ +
131
│ │ │ │ +
132} // end namespace Imp
│ │ │ │ +
133
│ │ │ │ +
134
│ │ │ │ +
135
│ │ │ │ +
136
│ │ │ │ +
137template<class Signature, class GV, class F, template<class> class DerivativeTraits=DefaultDerivativeTraits>
│ │ │ │ + │ │ │ │ +
139
│ │ │ │ +
140
│ │ │ │ +
146template<class Range, class Domain, class GV, class F, template<class> class DerivativeTraits>
│ │ │ │ +
147class AnalyticGridViewFunction<Range(Domain), GV, F, DerivativeTraits>
│ │ │ │ +
148{
│ │ │ │ +
149public:
│ │ │ │ +
150 using Signature = Range(Domain);
│ │ │ │ + │ │ │ │ +
152 using DerivativeSignature = typename DerivativeTraits<RawSignature>::Range(Domain);
│ │ │ │ +
153
│ │ │ │ +
154 using GridView = GV;
│ │ │ │ + │ │ │ │ +
156 using Element = typename EntitySet::Element;
│ │ │ │ +
157 using Geometry = typename Element::Geometry;
│ │ │ │ +
158
│ │ │ │ +
159 // Use the indirection via derivativeIfImplemented to also support
│ │ │ │ +
160 // function types F that do not implement derivative. In this case
│ │ │ │ +
161 // the interface type DifferentiableFunction is used a dummy for
│ │ │ │ +
162 // the derivative type
│ │ │ │ + │ │ │ │ +
164 using GlobalRawDerivative = decltype(Imp::derivativeIfImplemented<DerivativeDummy, F>(std::declval<F>()));
│ │ │ │ + │ │ │ │ +
166
│ │ │ │ + │ │ │ │ +
168 using LocalFunction = typename Imp::LocalAnalyticGridViewFunction<Range(LocalDomain), GridView, F, LocalDerivativeTraits<EntitySet, DerivativeTraits>::template Traits>;
│ │ │ │ +
169
│ │ │ │ +
171 template<class FT>
│ │ │ │ +
172 AnalyticGridViewFunction(FT&& f, const GridView& gridView) :
│ │ │ │ +
173 f_(std::forward<FT>(f)),
│ │ │ │ +
174 entitySet_(gridView)
│ │ │ │ +
175 {}
│ │ │ │ +
176
│ │ │ │ +
178 Range operator()(const Domain& x) const
│ │ │ │ +
179 {
│ │ │ │ +
180 return f_(x);
│ │ │ │ +
181 }
│ │ │ │ +
182
│ │ │ │ + │ │ │ │ +
185 {
│ │ │ │ +
186 return Derivative(Imp::derivativeIfImplemented<DerivativeDummy, F>(t.f_), t.entitySet_.gridView());
│ │ │ │ +
187 }
│ │ │ │ +
188
│ │ │ │ + │ │ │ │ +
191 {
│ │ │ │ +
192 return LocalFunction(t.f_);
│ │ │ │ +
193 }
│ │ │ │ +
194
│ │ │ │ +
196 const EntitySet& entitySet() const
│ │ │ │ +
197 {
│ │ │ │ +
198 return entitySet_;
│ │ │ │ +
199 }
│ │ │ │ +
200
│ │ │ │ +
201private:
│ │ │ │ +
202 F f_;
│ │ │ │ +
203 EntitySet entitySet_;
│ │ │ │ +
204};
│ │ │ │ +
205
│ │ │ │ +
206
│ │ │ │ +
207
│ │ │ │ +
224template<class F, class GridView>
│ │ │ │ +
225AnalyticGridViewFunction<
│ │ │ │ +
226 typename std::invoke_result<F, typename GridView::template Codim<0>::Geometry::GlobalCoordinate>::type // Range
│ │ │ │ +
227 (typename GridView::template Codim<0>::Geometry::GlobalCoordinate), // Domain
│ │ │ │ +
228 GridView,
│ │ │ │ +
229 typename std::decay<F>::type > // Raw type of F (without & or &&)
│ │ │ │ +
230 makeAnalyticGridViewFunction(F&& f, const GridView& gridView)
│ │ │ │ +
231{
│ │ │ │ +
232 using Domain = typename GridView::template Codim<0>::Geometry::GlobalCoordinate;
│ │ │ │ +
233 using Range = typename std::invoke_result<F, Domain>::type;
│ │ │ │ +
234 using FRaw = typename std::decay<F>::type;
│ │ │ │ +
235
│ │ │ │ +
236 return AnalyticGridViewFunction<Range(Domain), GridView, FRaw>(std::forward<F>(f), gridView);
│ │ │ │ +
237}
│ │ │ │ +
238
│ │ │ │ +
239
│ │ │ │ +
240
│ │ │ │ +
241}} // namespace Dune::Functions
│ │ │ │ +
242
│ │ │ │ +
243
│ │ │ │ +
244
│ │ │ │ +
245#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const TrigonometricFunction< K, sinFactor, cosFactor > &f)
Obtain derivative of TrigonometricFunction function.
Definition: trigonometricfunction.hh:39
│ │ │ │ +
AnalyticGridViewFunction< typename std::invoke_result< F, typename GridView::template Codim< 0 >::Geometry::GlobalCoordinate >::type(typename GridView::template Codim< 0 >::Geometry::GlobalCoordinate), GridView, typename std::decay< F >::type > makeAnalyticGridViewFunction(F &&f, const GridView &gridView)
Create an AnalyticGridViewFunction from a function and a grid view.
Definition: analyticgridviewfunction.hh:230
│ │ │ │
Definition: polynomial.hh:10
│ │ │ │ -
A simple node to range map using the nested tree indices.
Definition: hierarchicnodetorangemap.hh:30
│ │ │ │ -
decltype(auto) operator()(const Node &, const TreePath &treePath, Range &&y) const
Definition: hierarchicnodetorangemap.hh:33
│ │ │ │ -
decltype(auto) operator()(const Node &, const TreePath &, Range &&y) const
Definition: hierarchicnodetorangemap.hh:40
│ │ │ │ - │ │ │ │ +
Definition: differentiablefunction.hh:29
│ │ │ │ +
Helper class to deduce the signature of a callable.
Definition: signature.hh:56
│ │ │ │ +
Definition: analyticgridviewfunction.hh:138
│ │ │ │ +
Range operator()(const Domain &x) const
Evaluate the wrapped function f directly in global coordinates x.
Definition: analyticgridviewfunction.hh:178
│ │ │ │ +
typename EntitySet::LocalCoordinate LocalDomain
Definition: analyticgridviewfunction.hh:167
│ │ │ │ +
friend Derivative derivative(const AnalyticGridViewFunction &t)
Create a derivative grid-function by wrapping the derivative of f.
Definition: analyticgridviewfunction.hh:184
│ │ │ │ +
typename Element::Geometry Geometry
Definition: analyticgridviewfunction.hh:157
│ │ │ │ +
typename EntitySet::Element Element
Definition: analyticgridviewfunction.hh:156
│ │ │ │ + │ │ │ │ +
decltype(Imp::derivativeIfImplemented< DerivativeDummy, F >(std::declval< F >())) GlobalRawDerivative
Definition: analyticgridviewfunction.hh:164
│ │ │ │ +
Range(Domain) Signature
Definition: analyticgridviewfunction.hh:150
│ │ │ │ +
AnalyticGridViewFunction(FT &&f, const GridView &gridView)
Create the grid-function by wrapping a function f and create a GridViewEntitySet.
Definition: analyticgridviewfunction.hh:172
│ │ │ │ +
friend LocalFunction localFunction(const AnalyticGridViewFunction &t)
Construct the associated local-function.
Definition: analyticgridviewfunction.hh:190
│ │ │ │ +
typename Imp::LocalAnalyticGridViewFunction< Range(LocalDomain), GridView, F, LocalDerivativeTraits< EntitySet, DerivativeTraits >::template Traits > LocalFunction
Definition: analyticgridviewfunction.hh:168
│ │ │ │ +
typename SignatureTraits< Signature >::RawSignature RawSignature
Definition: analyticgridviewfunction.hh:151
│ │ │ │ +
const EntitySet & entitySet() const
Return the set of entities this local-function can be bound to.
Definition: analyticgridviewfunction.hh:196
│ │ │ │ +
typename DerivativeTraits< RawSignature >::Range(Domain) DerivativeSignature
Definition: analyticgridviewfunction.hh:152
│ │ │ │ + │ │ │ │ +
GridView::template Codim< codim >::Entity Element
Type of Elements contained in this EntitySet.
Definition: gridviewentityset.hh:32
│ │ │ │ +
Element::Geometry::LocalCoordinate LocalCoordinate
Type of local coordinates with respect to the Element.
Definition: gridviewentityset.hh:35
│ │ │ │ +
Derivative traits for local functions.
Definition: localderivativetraits.hh:28
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,78 +4,326 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * functionspacebases │ │ │ │ │ -hierarchicnodetorangemap.hh │ │ │ │ │ + * gridfunctions │ │ │ │ │ +analyticgridviewfunction.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICNODETORANGEMAP_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICNODETORANGEMAP_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH │ │ │ │ │ 5 │ │ │ │ │ - 6 │ │ │ │ │ - 7#include │ │ │ │ │ - 8#include │ │ │ │ │ - 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11 │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14 │ │ │ │ │ - 15namespace Dune { │ │ │ │ │ - 16namespace Functions { │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8 │ │ │ │ │ + 9#include │ │ │ │ │ + 10 │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14#include │ │ │ │ │ + 15#include │ │ │ │ │ + 16#include │ │ │ │ │ 17 │ │ │ │ │ 18 │ │ │ │ │ - 19 │ │ │ │ │ -29struct HierarchicNodeToRangeMap │ │ │ │ │ - 30{ │ │ │ │ │ - 31 template>(), int> = 0> │ │ │ │ │ -33 decltype(auto) operator()(const Node&, const TreePath& treePath, Range&& y) │ │ │ │ │ -const │ │ │ │ │ - 34 { │ │ │ │ │ - 35 return resolveStaticMultiIndex(y, treePath); │ │ │ │ │ - 36 } │ │ │ │ │ - 37 │ │ │ │ │ - 38 template>(), int> = 0> │ │ │ │ │ -40 decltype(auto) operator()(const Node&, const TreePath&, Range&& y) const │ │ │ │ │ - 41 { │ │ │ │ │ - 42 return std::forward(y); │ │ │ │ │ - 43 } │ │ │ │ │ - 44}; │ │ │ │ │ - 45 │ │ │ │ │ - 46 │ │ │ │ │ - 47 │ │ │ │ │ - 48} // namespace Dune::Functions │ │ │ │ │ - 49} // namespace Dune │ │ │ │ │ - 50 │ │ │ │ │ - 51 │ │ │ │ │ - 52#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICNODETORANGEMAP_HH │ │ │ │ │ -indexaccess.hh │ │ │ │ │ -Dune::Functions::resolveStaticMultiIndex │ │ │ │ │ -constexpr decltype(auto) resolveStaticMultiIndex(C &&c, const MultiIndex │ │ │ │ │ -&multiIndex) │ │ │ │ │ -Provide multi-index access by chaining operator[]. │ │ │ │ │ -Definition: indexaccess.hh:398 │ │ │ │ │ + 19namespace Dune { │ │ │ │ │ + 20namespace Functions { │ │ │ │ │ + 21 │ │ │ │ │ + 22namespace Imp { │ │ │ │ │ + 23 │ │ │ │ │ + 24template class │ │ │ │ │ +DerivativeTraits=DefaultDerivativeTraits> │ │ │ │ │ + 25class LocalAnalyticGridViewFunction; │ │ │ │ │ + 26 │ │ │ │ │ + 27template │ │ │ │ │ +class DerivativeTraits> │ │ │ │ │ + 28class LocalAnalyticGridViewFunction │ │ │ │ │ + 29{ │ │ │ │ │ + 30public: │ │ │ │ │ + 31 using Signature = Range(LocalDomain); │ │ │ │ │ + 32 using RawSignature = typename SignatureTraits::RawSignature; │ │ │ │ │ + 33 using DerivativeSignature = typename DerivativeTraits::Range │ │ │ │ │ +(LocalDomain); │ │ │ │ │ + 34 │ │ │ │ │ + 35 using GridView = GV; │ │ │ │ │ + 36 using EntitySet = GridViewEntitySet; │ │ │ │ │ + 37 using Element = typename EntitySet::Element; │ │ │ │ │ + 38// using Geometry = typename Element::Geometry; │ │ │ │ │ + 39 using Geometry = typename std::decay::type; │ │ │ │ │ + 40 │ │ │ │ │ + 41 // Use the indirection via derivativeIfImplemented to also support │ │ │ │ │ + 42 // function types F that do not implement derivative. In this case │ │ │ │ │ + 43 // the interface type DifferentiableFunction is using a dummy for │ │ │ │ │ + 44 // the derivative type │ │ │ │ │ + 45 using DerivativeDummy = DifferentiableFunction; │ │ │ │ │ + 46 using GlobalRawDerivative = decltype(Imp:: │ │ │ │ │ +derivativeIfImplemented(std::declval())); │ │ │ │ │ + 47 using LocalDerivative = LocalAnalyticGridViewFunction; │ │ │ │ │ + 48 │ │ │ │ │ + 50 template = 0> │ │ │ │ │ + 51 LocalAnalyticGridViewFunction(FT&& f) : │ │ │ │ │ + 52 f_(std::forward(f)) │ │ │ │ │ + 53 {} │ │ │ │ │ + 54 │ │ │ │ │ + 56 template │ │ │ │ │ + 57 LocalAnalyticGridViewFunction(FT&& f, const Element& element, const std:: │ │ │ │ │ +optional& geometry) : │ │ │ │ │ + 58 f_(std::forward(f)), │ │ │ │ │ + 59 element_(element), │ │ │ │ │ + 60 geometry_(geometry) │ │ │ │ │ + 61 {} │ │ │ │ │ + 62 │ │ │ │ │ + 63 │ │ │ │ │ + 72 void bind(const Element& element) │ │ │ │ │ + 73 { │ │ │ │ │ + 74 element_ = element; │ │ │ │ │ + 75 geometry_.emplace(element_.geometry()); │ │ │ │ │ + 76 } │ │ │ │ │ + 77 │ │ │ │ │ + 79 void unbind() │ │ │ │ │ + 80 { │ │ │ │ │ + 81 geometry_.reset(); │ │ │ │ │ + 82 } │ │ │ │ │ + 83 │ │ │ │ │ + 86 bool bound() const │ │ │ │ │ + 87 { │ │ │ │ │ + 88 return static_cast(geometry_); │ │ │ │ │ + 89 } │ │ │ │ │ + 90 │ │ │ │ │ + 100 Range operator()(const LocalDomain& x) const │ │ │ │ │ + 101 { │ │ │ │ │ + 102 assert(!!geometry_); │ │ │ │ │ + 103 return f_(geometry_->global(x)); │ │ │ │ │ + 104 } │ │ │ │ │ + 105 │ │ │ │ │ + 107 const Element& localContext() const │ │ │ │ │ + 108 { │ │ │ │ │ + 109 assert(!!geometry_); │ │ │ │ │ + 110 return element_; │ │ │ │ │ + 111 } │ │ │ │ │ + 112 │ │ │ │ │ + 121 friend LocalDerivative derivative(const LocalAnalyticGridViewFunction& t) │ │ │ │ │ + 122 { │ │ │ │ │ + 123 return LocalDerivative(Imp::derivativeIfImplemented │ │ │ │ │ +(t.f_), t.element_, t.geometry_); │ │ │ │ │ + 124 } │ │ │ │ │ + 125 │ │ │ │ │ + 126private: │ │ │ │ │ + 127 F f_; │ │ │ │ │ + 128 Element element_; │ │ │ │ │ + 129 std::optional geometry_ = std::nullopt; │ │ │ │ │ + 130}; │ │ │ │ │ + 131 │ │ │ │ │ + 132} // end namespace Imp │ │ │ │ │ + 133 │ │ │ │ │ + 134 │ │ │ │ │ + 135 │ │ │ │ │ + 136 │ │ │ │ │ + 137template class │ │ │ │ │ +DerivativeTraits=DefaultDerivativeTraits> │ │ │ │ │ +138class AnalyticGridViewFunction; │ │ │ │ │ + 139 │ │ │ │ │ + 140 │ │ │ │ │ + 146template │ │ │ │ │ +class DerivativeTraits> │ │ │ │ │ +147class AnalyticGridViewFunction │ │ │ │ │ + 148{ │ │ │ │ │ + 149public: │ │ │ │ │ +150 using Signature = Range(Domain); │ │ │ │ │ +151 using RawSignature = typename SignatureTraits::RawSignature; │ │ │ │ │ +152 using DerivativeSignature = typename DerivativeTraits::Range │ │ │ │ │ +(Domain); │ │ │ │ │ + 153 │ │ │ │ │ +154 using GridView = GV; │ │ │ │ │ +155 using EntitySet = GridViewEntitySet; │ │ │ │ │ +156 using Element = typename EntitySet::Element; │ │ │ │ │ +157 using Geometry = typename Element::Geometry; │ │ │ │ │ + 158 │ │ │ │ │ + 159 // Use the indirection via derivativeIfImplemented to also support │ │ │ │ │ + 160 // function types F that do not implement derivative. In this case │ │ │ │ │ + 161 // the interface type DifferentiableFunction is used a dummy for │ │ │ │ │ + 162 // the derivative type │ │ │ │ │ +163 using DerivativeDummy = DifferentiableFunction; │ │ │ │ │ +164 using GlobalRawDerivative = decltype(Imp:: │ │ │ │ │ +derivativeIfImplemented(std::declval())); │ │ │ │ │ +165 using Derivative = AnalyticGridViewFunction; │ │ │ │ │ + 166 │ │ │ │ │ +167 using LocalDomain = typename EntitySet::LocalCoordinate; │ │ │ │ │ +168 using LocalFunction = typename Imp::LocalAnalyticGridViewFunction::template Traits>; │ │ │ │ │ + 169 │ │ │ │ │ + 171 template │ │ │ │ │ +172 AnalyticGridViewFunction(FT&& f, const GridView& gridView) : │ │ │ │ │ + 173 f_(std::forward(f)), │ │ │ │ │ + 174 entitySet_(gridView) │ │ │ │ │ + 175 {} │ │ │ │ │ + 176 │ │ │ │ │ +178 Range operator()(const Domain& x) const │ │ │ │ │ + 179 { │ │ │ │ │ + 180 return f_(x); │ │ │ │ │ + 181 } │ │ │ │ │ + 182 │ │ │ │ │ +184 friend Derivative derivative(const AnalyticGridViewFunction& t) │ │ │ │ │ + 185 { │ │ │ │ │ + 186 return Derivative(Imp::derivativeIfImplemented(t.f_), │ │ │ │ │ +t.entitySet_.gridView()); │ │ │ │ │ + 187 } │ │ │ │ │ + 188 │ │ │ │ │ +190 friend LocalFunction localFunction(const AnalyticGridViewFunction& t) │ │ │ │ │ + 191 { │ │ │ │ │ + 192 return LocalFunction(t.f_); │ │ │ │ │ + 193 } │ │ │ │ │ + 194 │ │ │ │ │ +196 const EntitySet& entitySet() const │ │ │ │ │ + 197 { │ │ │ │ │ + 198 return entitySet_; │ │ │ │ │ + 199 } │ │ │ │ │ + 200 │ │ │ │ │ + 201private: │ │ │ │ │ + 202 F f_; │ │ │ │ │ + 203 EntitySet entitySet_; │ │ │ │ │ + 204}; │ │ │ │ │ + 205 │ │ │ │ │ + 206 │ │ │ │ │ + 207 │ │ │ │ │ + 224template │ │ │ │ │ + 225AnalyticGridViewFunction< │ │ │ │ │ + 226 typename std::invoke_result:: │ │ │ │ │ +Geometry::GlobalCoordinate>::type // Range │ │ │ │ │ + 227 (typename GridView::template Codim<0>::Geometry::GlobalCoordinate), / │ │ │ │ │ +/ Domain │ │ │ │ │ + 228 GridView, │ │ │ │ │ + 229 typename std::decay::type > // Raw type of F (without & or &&) │ │ │ │ │ +230 makeAnalyticGridViewFunction(F&& f, const GridView& gridView) │ │ │ │ │ + 231{ │ │ │ │ │ + 232 using Domain = typename GridView::template Codim<0>::Geometry:: │ │ │ │ │ +GlobalCoordinate; │ │ │ │ │ + 233 using Range = typename std::invoke_result::type; │ │ │ │ │ + 234 using FRaw = typename std::decay::type; │ │ │ │ │ + 235 │ │ │ │ │ + 236 return AnalyticGridViewFunction(std:: │ │ │ │ │ +forward(f), gridView); │ │ │ │ │ + 237} │ │ │ │ │ + 238 │ │ │ │ │ + 239 │ │ │ │ │ + 240 │ │ │ │ │ + 241}} // namespace Dune::Functions │ │ │ │ │ + 242 │ │ │ │ │ + 243 │ │ │ │ │ + 244 │ │ │ │ │ + 245#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH │ │ │ │ │ +signature.hh │ │ │ │ │ +differentiablefunction_imp.hh │ │ │ │ │ +defaultderivativetraits.hh │ │ │ │ │ +differentiablefunction.hh │ │ │ │ │ +gridviewentityset.hh │ │ │ │ │ +localderivativetraits.hh │ │ │ │ │ +Dune::Functions::derivative │ │ │ │ │ +TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const │ │ │ │ │ +TrigonometricFunction< K, sinFactor, cosFactor > &f) │ │ │ │ │ +Obtain derivative of TrigonometricFunction function. │ │ │ │ │ +Definition: trigonometricfunction.hh:39 │ │ │ │ │ +Dune::Functions::AnalyticGridViewFunction::makeAnalyticGridViewFunction │ │ │ │ │ +AnalyticGridViewFunction< typename std::invoke_result< F, typename GridView:: │ │ │ │ │ +template Codim< 0 >::Geometry::GlobalCoordinate >::type(typename GridView:: │ │ │ │ │ +template Codim< 0 >::Geometry::GlobalCoordinate), GridView, typename std:: │ │ │ │ │ +decay< F >::type > makeAnalyticGridViewFunction(F &&f, const GridView │ │ │ │ │ +&gridView) │ │ │ │ │ +Create an AnalyticGridViewFunction from a function and a grid view. │ │ │ │ │ +Definition: analyticgridviewfunction.hh:230 │ │ │ │ │ Dune │ │ │ │ │ Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::HierarchicNodeToRangeMap │ │ │ │ │ -A simple node to range map using the nested tree indices. │ │ │ │ │ -Definition: hierarchicnodetorangemap.hh:30 │ │ │ │ │ -Dune::Functions::HierarchicNodeToRangeMap::operator() │ │ │ │ │ -decltype(auto) operator()(const Node &, const TreePath &treePath, Range &&y) │ │ │ │ │ -const │ │ │ │ │ -Definition: hierarchicnodetorangemap.hh:33 │ │ │ │ │ -Dune::Functions::HierarchicNodeToRangeMap::operator() │ │ │ │ │ -decltype(auto) operator()(const Node &, const TreePath &, Range &&y) const │ │ │ │ │ -Definition: hierarchicnodetorangemap.hh:40 │ │ │ │ │ -concepts.hh │ │ │ │ │ +Dune::Functions::DifferentiableFunction │ │ │ │ │ +Definition: differentiablefunction.hh:29 │ │ │ │ │ +Dune::Functions::SignatureTraits │ │ │ │ │ +Helper class to deduce the signature of a callable. │ │ │ │ │ +Definition: signature.hh:56 │ │ │ │ │ +Dune::Functions::AnalyticGridViewFunction │ │ │ │ │ +Definition: analyticgridviewfunction.hh:138 │ │ │ │ │ +Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ +DerivativeTraits_>::operator() │ │ │ │ │ +Range operator()(const Domain &x) const │ │ │ │ │ +Evaluate the wrapped function f directly in global coordinates x. │ │ │ │ │ +Definition: analyticgridviewfunction.hh:178 │ │ │ │ │ +Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ +DerivativeTraits_>::LocalDomain │ │ │ │ │ +typename EntitySet::LocalCoordinate LocalDomain │ │ │ │ │ +Definition: analyticgridviewfunction.hh:167 │ │ │ │ │ +Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ +DerivativeTraits_>::derivative │ │ │ │ │ +friend Derivative derivative(const AnalyticGridViewFunction &t) │ │ │ │ │ +Create a derivative grid-function by wrapping the derivative of f. │ │ │ │ │ +Definition: analyticgridviewfunction.hh:184 │ │ │ │ │ +Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ +DerivativeTraits_>::Geometry │ │ │ │ │ +typename Element::Geometry Geometry │ │ │ │ │ +Definition: analyticgridviewfunction.hh:157 │ │ │ │ │ +Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ +DerivativeTraits_>::Element │ │ │ │ │ +typename EntitySet::Element Element │ │ │ │ │ +Definition: analyticgridviewfunction.hh:156 │ │ │ │ │ +Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ +DerivativeTraits_>::GridView │ │ │ │ │ +GV GridView │ │ │ │ │ +Definition: analyticgridviewfunction.hh:154 │ │ │ │ │ +Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ +DerivativeTraits_>::GlobalRawDerivative │ │ │ │ │ +decltype(Imp::derivativeIfImplemented< DerivativeDummy, F >(std::declval< F > │ │ │ │ │ +())) GlobalRawDerivative │ │ │ │ │ +Definition: analyticgridviewfunction.hh:164 │ │ │ │ │ +Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ +DerivativeTraits_>::Signature │ │ │ │ │ +Range(Domain) Signature │ │ │ │ │ +Definition: analyticgridviewfunction.hh:150 │ │ │ │ │ +Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ +DerivativeTraits_>::AnalyticGridViewFunction │ │ │ │ │ +AnalyticGridViewFunction(FT &&f, const GridView &gridView) │ │ │ │ │ +Create the grid-function by wrapping a function f and create a │ │ │ │ │ +GridViewEntitySet. │ │ │ │ │ +Definition: analyticgridviewfunction.hh:172 │ │ │ │ │ +Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ +DerivativeTraits_>::localFunction │ │ │ │ │ +friend LocalFunction localFunction(const AnalyticGridViewFunction &t) │ │ │ │ │ +Construct the associated local-function. │ │ │ │ │ +Definition: analyticgridviewfunction.hh:190 │ │ │ │ │ +Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ +DerivativeTraits_>::LocalFunction │ │ │ │ │ +typename Imp::LocalAnalyticGridViewFunction< Range(LocalDomain), GridView, F, │ │ │ │ │ +LocalDerivativeTraits< EntitySet, DerivativeTraits >::template Traits > │ │ │ │ │ +LocalFunction │ │ │ │ │ +Definition: analyticgridviewfunction.hh:168 │ │ │ │ │ +Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ +DerivativeTraits_>::RawSignature │ │ │ │ │ +typename SignatureTraits< Signature >::RawSignature RawSignature │ │ │ │ │ +Definition: analyticgridviewfunction.hh:151 │ │ │ │ │ +Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ +DerivativeTraits_>::entitySet │ │ │ │ │ +const EntitySet & entitySet() const │ │ │ │ │ +Return the set of entities this local-function can be bound to. │ │ │ │ │ +Definition: analyticgridviewfunction.hh:196 │ │ │ │ │ +Dune::Functions::AnalyticGridViewFunction<_Range(Domain),_GV,_F, │ │ │ │ │ +DerivativeTraits_>::DerivativeSignature │ │ │ │ │ +typename DerivativeTraits< RawSignature >::Range(Domain) DerivativeSignature │ │ │ │ │ +Definition: analyticgridviewfunction.hh:152 │ │ │ │ │ +Dune::Functions::GridViewEntitySet<_GridView,_0_> │ │ │ │ │ +Dune::Functions::GridViewEntitySet<_GridView,_0_>::Element │ │ │ │ │ +GridView::template Codim< codim >::Entity Element │ │ │ │ │ +Type of Elements contained in this EntitySet. │ │ │ │ │ +Definition: gridviewentityset.hh:32 │ │ │ │ │ +Dune::Functions::GridViewEntitySet<_GridView,_0_>::LocalCoordinate │ │ │ │ │ +Element::Geometry::LocalCoordinate LocalCoordinate │ │ │ │ │ +Type of local coordinates with respect to the Element. │ │ │ │ │ +Definition: gridviewentityset.hh:35 │ │ │ │ │ +Dune::Functions::LocalDerivativeTraits │ │ │ │ │ +Derivative traits for local functions. │ │ │ │ │ +Definition: localderivativetraits.hh:28 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00188.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: interpolate.hh File Reference │ │ │ │ +dune-functions: facenormalgridfunction.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,62 +58,47 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
interpolate.hh File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces
│ │ │ │ +
facenormalgridfunction.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <memory>
│ │ │ │ -#include <vector>
│ │ │ │ +
#include <type_traits>
│ │ │ │ +#include <optional>
│ │ │ │ #include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/common/bitsetvector.hh>
│ │ │ │ -#include <dune/typetree/childextraction.hh>
│ │ │ │ -#include <dune/functions/gridfunctions/gridviewfunction.hh>
│ │ │ │ -#include <dune/functions/common/functionconcepts.hh>
│ │ │ │ -#include <dune/functions/backends/concepts.hh>
│ │ │ │ -#include <dune/functions/backends/istlvectorbackend.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/sizeinfo.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/flatvectorview.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/hierarchicnodetorangemap.hh>
│ │ │ │ -#include <dune/typetree/traversal.hh>
│ │ │ │ -#include <dune/typetree/visitor.hh>
│ │ │ │ +#include <dune/common/typeutilities.hh>
│ │ │ │ +#include <dune/common/rangeutilities.hh>
│ │ │ │ +#include <dune/geometry/referenceelements.hh>
│ │ │ │ +#include <dune/functions/gridfunctions/gridfunction.hh>
│ │ │ │ +#include <dune/functions/gridfunctions/gridviewentityset.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ +Classes

class  Dune::Functions::FaceNormalGridFunction< GV >
 Grid function implementing the piecewise element face normal. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<class B , class C , class F , class BV , class NTRE >
void Dune::Functions::interpolate (const B &basis, C &&coeff, const F &f, const BV &bv, const NTRE &nodeToRangeEntry)
 Interpolate given function in discrete function space. More...
 
template<class B , class C , class F , class BV >
void Dune::Functions::interpolate (const B &basis, C &&coeff, const F &f, const BV &bitVector)
 Interpolate given function in discrete function space. More...
 
template<class B , class C , class F >
void Dune::Functions::interpolate (const B &basis, C &&coeff, const F &f)
 Interpolate given function in discrete function space. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,48 +4,31 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * functionspacebases │ │ │ │ │ -Namespaces | Functions │ │ │ │ │ -interpolate.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * gridfunctions │ │ │ │ │ +Classes | Namespaces │ │ │ │ │ +facenormalgridfunction.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ + Classes │ │ │ │ │ +class  Dune::Functions::FaceNormalGridFunction<_GV_> │ │ │ │ │ +  Grid function implementing the piecewise element face normal. More... │ │ │ │ │ +  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ - Functions │ │ │ │ │ -template │ │ │ │ │ -void Dune::Functions::interpolate (const B &basis, C &&coeff, const F &f, │ │ │ │ │ - const BV &bv, const NTRE &nodeToRangeEntry) │ │ │ │ │ -  Interpolate given function in discrete function space. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void Dune::Functions::interpolate (const B &basis, C &&coeff, const F &f, │ │ │ │ │ - const BV &bitVector) │ │ │ │ │ -  Interpolate given function in discrete function space. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void Dune::Functions::interpolate (const B &basis, C &&coeff, const F &f) │ │ │ │ │ -  Interpolate given function in discrete function space. More... │ │ │ │ │ -  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00188_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: interpolate.hh Source File │ │ │ │ +dune-functions: facenormalgridfunction.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,290 +58,195 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
interpolate.hh
│ │ │ │ +
facenormalgridfunction.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_INTERPOLATE_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_INTERPOLATE_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_FACENORMALGRIDFUNCTION_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_FACENORMALGRIDFUNCTION_HH
│ │ │ │
5
│ │ │ │ -
6#include <memory>
│ │ │ │ -
7#include <vector>
│ │ │ │ +
6#include <type_traits>
│ │ │ │ +
7#include <optional>
│ │ │ │
8
│ │ │ │
9#include <dune/common/exceptions.hh>
│ │ │ │ -
10#include <dune/common/bitsetvector.hh>
│ │ │ │ -
11
│ │ │ │ -
12#include <dune/typetree/childextraction.hh>
│ │ │ │ +
10#include <dune/common/typeutilities.hh>
│ │ │ │ +
11#include <dune/common/rangeutilities.hh>
│ │ │ │ +
12#include <dune/geometry/referenceelements.hh>
│ │ │ │
13
│ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │
16
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
22
│ │ │ │ -
23#include <dune/typetree/traversal.hh>
│ │ │ │ -
24#include <dune/typetree/visitor.hh>
│ │ │ │ -
25
│ │ │ │ -
26namespace Dune {
│ │ │ │ -
27namespace Functions {
│ │ │ │ -
28
│ │ │ │ -
29namespace Imp {
│ │ │ │ -
30
│ │ │ │ -
31struct AllTrueBitSetVector
│ │ │ │ -
32{
│ │ │ │ -
33 struct AllTrueBitSet
│ │ │ │ -
34 {
│ │ │ │ -
35 bool test(int) const { return true; }
│ │ │ │ -
36 } allTrue_;
│ │ │ │ -
37
│ │ │ │ -
38 operator bool() const
│ │ │ │ -
39 {
│ │ │ │ -
40 return true;
│ │ │ │ -
41 }
│ │ │ │ -
42
│ │ │ │ -
43 template<class I>
│ │ │ │ -
44 const AllTrueBitSetVector& operator[](const I&) const
│ │ │ │ -
45 {
│ │ │ │ -
46 return *this;
│ │ │ │ -
47 }
│ │ │ │ +
17
│ │ │ │ +
18namespace Dune::Functions {
│ │ │ │ +
19
│ │ │ │ +
20namespace Impl {
│ │ │ │ +
21
│ │ │ │ +
22// Compute closest face to point
│ │ │ │ +
23template<class ReferenceElement, class Coordinate>
│ │ │ │ +
24auto closestFaceIndex(const ReferenceElement& re, const Coordinate& x)
│ │ │ │ +
25{
│ │ │ │ +
26 auto closestFaceIndex = decltype(re.subEntity(0,1,0,1)){};
│ │ │ │ +
27 double closestFaceDistance = std::numeric_limits<double>::max();
│ │ │ │ +
28 for(auto&& faceIndex : Dune::range(re.size(1)))
│ │ │ │ +
29 {
│ │ │ │ +
30 // For a face unit outer normal consider the orthogonal projection
│ │ │ │ +
31 // Px = x + <c-x,n>*n into the face. Then the distance to the face
│ │ │ │ +
32 // is given by |x-Px| = |<c-x,n>||n| = <c-x,n>.
│ │ │ │ +
33 auto normal = re.integrationOuterNormal(faceIndex);
│ │ │ │ +
34 normal /= normal.two_norm();
│ │ │ │ +
35 auto c = re.position(faceIndex,1);
│ │ │ │ +
36 c -= x;
│ │ │ │ +
37 auto faceDistance = (c*normal);
│ │ │ │ +
38 if (faceDistance<closestFaceDistance)
│ │ │ │ +
39 {
│ │ │ │ +
40 closestFaceDistance = faceDistance;
│ │ │ │ +
41 closestFaceIndex = faceIndex;
│ │ │ │ +
42 }
│ │ │ │ +
43 }
│ │ │ │ +
44 return closestFaceIndex;
│ │ │ │ +
45}
│ │ │ │ +
46
│ │ │ │ +
47} // end namespace Impl
│ │ │ │
48
│ │ │ │ -
49 template<class SP>
│ │ │ │ -
50 void resize(const SP&) const
│ │ │ │ -
51 {}
│ │ │ │ -
52
│ │ │ │ -
53};
│ │ │ │ -
54
│ │ │ │ -
55
│ │ │ │ -
56
│ │ │ │ -
57template <class B, class T, class NTRE, class HV, class LF, class HBV>
│ │ │ │ -
58class LocalInterpolateVisitor
│ │ │ │ -
59 : public TypeTree::TreeVisitor
│ │ │ │ -
60 , public TypeTree::DynamicTraversal
│ │ │ │ -
61{
│ │ │ │ -
62
│ │ │ │ -
63public:
│ │ │ │ -
64
│ │ │ │ -
65 using Basis = B;
│ │ │ │ -
66 using LocalView = typename B::LocalView;
│ │ │ │ -
67 using MultiIndex = typename LocalView::MultiIndex;
│ │ │ │ -
68
│ │ │ │ -
69 using LocalFunction = LF;
│ │ │ │ -
70
│ │ │ │ -
71 using Tree = T;
│ │ │ │ -
72
│ │ │ │ -
73 using VectorBackend = HV;
│ │ │ │ -
74 using BitVectorBackend = HBV;
│ │ │ │ +
49
│ │ │ │ +
50
│ │ │ │ +
51
│ │ │ │ +
64template<class GV>
│ │ │ │ + │ │ │ │ +
66{
│ │ │ │ +
67public:
│ │ │ │ +
68 using GridView = GV;
│ │ │ │ + │ │ │ │ +
70 using Element = typename EntitySet::Element;
│ │ │ │ +
71
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
75
│ │ │ │ -
76 using NodeToRangeEntry = NTRE;
│ │ │ │ +
76private:
│ │ │ │
77
│ │ │ │ -
78 using GridView = typename Basis::GridView;
│ │ │ │ -
79 using Element = typename GridView::template Codim<0>::Entity;
│ │ │ │ -
80
│ │ │ │ -
81 using LocalDomain = typename Element::Geometry::LocalCoordinate;
│ │ │ │ -
82
│ │ │ │ -
83 using GlobalDomain = typename Element::Geometry::GlobalCoordinate;
│ │ │ │ -
84
│ │ │ │ -
85 LocalInterpolateVisitor(const B& /*basis*/, HV& coeff, const HBV& bitVector, const LF& localF, const LocalView& localView, const NodeToRangeEntry& nodeToRangeEntry) :
│ │ │ │ -
86 vector_(coeff),
│ │ │ │ -
87 localF_(localF),
│ │ │ │ -
88 bitVector_(bitVector),
│ │ │ │ -
89 localView_(localView),
│ │ │ │ -
90 nodeToRangeEntry_(nodeToRangeEntry)
│ │ │ │ -
91 {
│ │ │ │ -
92 static_assert(Dune::Functions::Concept::isCallable<LocalFunction, LocalDomain>(), "Function passed to LocalInterpolateVisitor does not model the Callable<LocalCoordinate> concept");
│ │ │ │ -
93 }
│ │ │ │ -
94
│ │ │ │ -
95 template<typename Node, typename TreePath>
│ │ │ │ -
96 void pre(Node&, TreePath)
│ │ │ │ -
97 {}
│ │ │ │ -
98
│ │ │ │ -
99 template<typename Node, typename TreePath>
│ │ │ │ -
100 void post(Node&, TreePath)
│ │ │ │ -
101 {}
│ │ │ │ +
78 using Traits = Imp::GridFunctionTraits<Range(Domain), EntitySet, DefaultDerivativeTraits, 16>;
│ │ │ │ +
79
│ │ │ │ +
80 class LocalFunction
│ │ │ │ +
81 {
│ │ │ │ +
82 using Geometry = typename Element::Geometry;
│ │ │ │ +
83 static const int dimension = GV::dimension;
│ │ │ │ +
84 public:
│ │ │ │ +
85
│ │ │ │ +
97 void bind(const Element& element)
│ │ │ │ +
98 {
│ │ │ │ +
99 element_ = element;
│ │ │ │ +
100 geometry_.emplace(element_.geometry());
│ │ │ │ +
101 }
│ │ │ │
102
│ │ │ │ -
103 template<typename Node, typename TreePath>
│ │ │ │ -
104 void leaf(Node& node, TreePath treePath)
│ │ │ │ -
105 {
│ │ │ │ -
106 using FiniteElement = typename Node::FiniteElement;
│ │ │ │ -
107 using FiniteElementRange = typename FiniteElement::Traits::LocalBasisType::Traits::RangeType;
│ │ │ │ -
108 using FiniteElementRangeField = typename FiniteElement::Traits::LocalBasisType::Traits::RangeFieldType;
│ │ │ │ -
109
│ │ │ │ -
110 auto interpolationCoefficients = std::vector<FiniteElementRangeField>();
│ │ │ │ -
111 auto&& fe = node.finiteElement();
│ │ │ │ -
112
│ │ │ │ -
113 // backward compatibility: for scalar basis functions and possibly vector valued coefficients
│ │ │ │ -
114 // (like used in dune-fufem for power bases) loop over the components
│ │ │ │ -
115 // of the coefficients
│ │ │ │ -
116 if constexpr ( FiniteElement::Traits::LocalBasisType::Traits::dimRange == 1 )
│ │ │ │ -
117 {
│ │ │ │ -
118 // Note that we capture j by reference. Hence we can switch
│ │ │ │ -
119 // the selected component later on by modifying j. Maybe we
│ │ │ │ -
120 // should avoid this naughty statefull lambda hack in favor
│ │ │ │ -
121 // of a separate helper class.
│ │ │ │ -
122 std::size_t j=0;
│ │ │ │ -
123 auto localFj = [&](const LocalDomain& x){
│ │ │ │ -
124 const auto& y = localF_(x);
│ │ │ │ -
125 return FiniteElementRange(flatVectorView(nodeToRangeEntry_(node, treePath, y))[j]);
│ │ │ │ -
126 };
│ │ │ │ -
127
│ │ │ │ -
128 // We loop over j defined above and thus over the components of the
│ │ │ │ -
129 // range type of localF_.
│ │ │ │ +
103 void unbind()
│ │ │ │ +
104 {
│ │ │ │ +
105 geometry_.reset();
│ │ │ │ +
106 }
│ │ │ │ +
107
│ │ │ │ +
110 bool bound() const
│ │ │ │ +
111 {
│ │ │ │ +
112 return static_cast<bool>(geometry_);
│ │ │ │ +
113 }
│ │ │ │ +
114
│ │ │ │ +
124 Range operator()(const LocalDomain& x) const
│ │ │ │ +
125 {
│ │ │ │ +
126 auto&& re = Dune::referenceElement(*geometry_);
│ │ │ │ +
127 // Compute reference normal of closest face to given point
│ │ │ │ +
128 auto face = Impl::closestFaceIndex(re, x);
│ │ │ │ +
129 auto localNormal = re.integrationOuterNormal(face);
│ │ │ │
130
│ │ │ │ -
131 auto blockSize = flatVectorView(vector_[localView_.index(0)]).size();
│ │ │ │ -
132
│ │ │ │ -
133 for(j=0; j<blockSize; ++j)
│ │ │ │ -
134 {
│ │ │ │ -
135 fe.localInterpolation().interpolate(localFj, interpolationCoefficients);
│ │ │ │ -
136 for (size_t i=0; i<fe.localBasis().size(); ++i)
│ │ │ │ -
137 {
│ │ │ │ -
138 auto multiIndex = localView_.index(node.localIndex(i));
│ │ │ │ -
139 auto bitVectorBlock = flatVectorView(bitVector_[multiIndex]);
│ │ │ │ -
140 if (bitVectorBlock[j])
│ │ │ │ -
141 {
│ │ │ │ -
142 auto vectorBlock = flatVectorView(vector_[multiIndex]);
│ │ │ │ -
143 vectorBlock[j] = interpolationCoefficients[i];
│ │ │ │ -
144 }
│ │ │ │ -
145 }
│ │ │ │ -
146 }
│ │ │ │ -
147 }
│ │ │ │ -
148 else // ( FiniteElement::Traits::LocalBasisType::Traits::dimRange != 1 )
│ │ │ │ -
149 {
│ │ │ │ -
150 // for all other finite elements: use the FiniteElementRange directly for the interpolation
│ │ │ │ -
151 auto localF = [&](const LocalDomain& x){
│ │ │ │ -
152 const auto& y = localF_(x);
│ │ │ │ -
153 return FiniteElementRange(nodeToRangeEntry_(node, treePath, y));
│ │ │ │ -
154 };
│ │ │ │ +
131 // Transform reference normal into global unit outer normal using
│ │ │ │ +
132 // covariant Piola transformation
│ │ │ │ +
133 auto normal = Range{};
│ │ │ │ +
134 geometry_->jacobianInverseTransposed(x).mv(localNormal, normal);
│ │ │ │ +
135 normal /= normal.two_norm();
│ │ │ │ +
136 return normal;
│ │ │ │ +
137 }
│ │ │ │ +
138
│ │ │ │ +
140 const Element& localContext() const
│ │ │ │ +
141 {
│ │ │ │ +
142 return element_;
│ │ │ │ +
143 }
│ │ │ │ +
144
│ │ │ │ +
146 friend typename Traits::LocalFunctionTraits::DerivativeInterface derivative(const LocalFunction& t)
│ │ │ │ +
147 {
│ │ │ │ +
148 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │ +
149 }
│ │ │ │ +
150
│ │ │ │ +
151 private:
│ │ │ │ +
152 std::optional<Geometry> geometry_;
│ │ │ │ +
153 Element element_;
│ │ │ │ +
154 };
│ │ │ │
155
│ │ │ │ -
156 fe.localInterpolation().interpolate(localF, interpolationCoefficients);
│ │ │ │ -
157 for (size_t i=0; i<fe.localBasis().size(); ++i)
│ │ │ │ -
158 {
│ │ │ │ -
159 auto multiIndex = localView_.index(node.localIndex(i));
│ │ │ │ -
160 if ( bitVector_[multiIndex] )
│ │ │ │ -
161 {
│ │ │ │ -
162 vector_[multiIndex] = interpolationCoefficients[i];
│ │ │ │ -
163 }
│ │ │ │ -
164 }
│ │ │ │ -
165 }
│ │ │ │ +
156public:
│ │ │ │ + │ │ │ │ +
159 entitySet_(gridView)
│ │ │ │ +
160 {}
│ │ │ │ +
161
│ │ │ │ +
163 Range operator()(const Domain& x) const
│ │ │ │ +
164 {
│ │ │ │ +
165 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │
166 }
│ │ │ │
167
│ │ │ │ -
168
│ │ │ │ -
169protected:
│ │ │ │ -
170
│ │ │ │ -
171 VectorBackend& vector_;
│ │ │ │ -
172 const LocalFunction& localF_;
│ │ │ │ -
173 const BitVectorBackend& bitVector_;
│ │ │ │ -
174 const LocalView& localView_;
│ │ │ │ -
175 const NodeToRangeEntry& nodeToRangeEntry_;
│ │ │ │ -
176};
│ │ │ │ -
177
│ │ │ │ -
178
│ │ │ │ -
179} // namespace Imp
│ │ │ │ -
180
│ │ │ │ -
181
│ │ │ │ -
182
│ │ │ │ -
183
│ │ │ │ -
201template <class B, class C, class F, class BV, class NTRE>
│ │ │ │ -
202void interpolate(const B& basis, C&& coeff, const F& f, const BV& bv, const NTRE& nodeToRangeEntry)
│ │ │ │ -
203{
│ │ │ │ -
204 using GridView = typename B::GridView;
│ │ │ │ -
205 using Element = typename GridView::template Codim<0>::Entity;
│ │ │ │ -
206
│ │ │ │ -
207 using Tree = typename B::LocalView::Tree;
│ │ │ │ -
208
│ │ │ │ -
209 using GlobalDomain = typename Element::Geometry::GlobalCoordinate;
│ │ │ │ -
210
│ │ │ │ -
211 static_assert(Dune::Functions::Concept::isCallable<F, GlobalDomain>(), "Function passed to interpolate does not model the Callable<GlobalCoordinate> concept");
│ │ │ │ -
212
│ │ │ │ -
213 auto&& gridView = basis.gridView();
│ │ │ │ -
214
│ │ │ │ -
215 // Small helper functions to wrap vectors using istlVectorBackend
│ │ │ │ -
216 // if they do not already satisfy the VectorBackend interface.
│ │ │ │ -
217 auto toVectorBackend = [&](auto& v) -> decltype(auto) {
│ │ │ │ -
218 if constexpr (models<Concept::VectorBackend<B>, decltype(v)>()) {
│ │ │ │ -
219 return v;
│ │ │ │ -
220 } else {
│ │ │ │ -
221 return istlVectorBackend(v);
│ │ │ │ -
222 }
│ │ │ │ -
223 };
│ │ │ │ -
224
│ │ │ │ -
225 auto toConstVectorBackend = [&](auto& v) -> decltype(auto) {
│ │ │ │ -
226 if constexpr (models<Concept::ConstVectorBackend<B>, decltype(v)>()) {
│ │ │ │ -
227 return v;
│ │ │ │ -
228 } else {
│ │ │ │ -
229 return istlVectorBackend(v);
│ │ │ │ -
230 }
│ │ │ │ -
231 };
│ │ │ │ -
232
│ │ │ │ -
233 auto&& bitVector = toConstVectorBackend(bv);
│ │ │ │ -
234 auto&& vector = toVectorBackend(coeff);
│ │ │ │ -
235 vector.resize(sizeInfo(basis));
│ │ │ │ -
236
│ │ │ │ -
237
│ │ │ │ -
238
│ │ │ │ -
239 // Make a grid function supporting local evaluation out of f
│ │ │ │ -
240 auto gf = makeGridViewFunction(f, gridView);
│ │ │ │ -
241
│ │ │ │ -
242 // Obtain a local view of f
│ │ │ │ -
243 auto localF = localFunction(gf);
│ │ │ │ -
244
│ │ │ │ -
245 auto localView = basis.localView();
│ │ │ │ -
246
│ │ │ │ -
247 for (const auto& e : elements(gridView))
│ │ │ │ -
248 {
│ │ │ │ -
249 localView.bind(e);
│ │ │ │ -
250 localF.bind(e);
│ │ │ │ -
251
│ │ │ │ -
252 Imp::LocalInterpolateVisitor<B, Tree, NTRE, decltype(vector), decltype(localF), decltype(bitVector)> localInterpolateVisitor(basis, vector, bitVector, localF, localView, nodeToRangeEntry);
│ │ │ │ -
253 TypeTree::applyToTree(localView.tree(),localInterpolateVisitor);
│ │ │ │ -
254 }
│ │ │ │ -
255}
│ │ │ │ -
256
│ │ │ │ -
273template <class B, class C, class F, class BV>
│ │ │ │ -
274void interpolate(const B& basis, C&& coeff, const F& f, const BV& bitVector)
│ │ │ │ -
275{
│ │ │ │ -
276 interpolate(basis, coeff, f, bitVector, HierarchicNodeToRangeMap());
│ │ │ │ -
277}
│ │ │ │ -
278
│ │ │ │ -
293template <class B, class C, class F>
│ │ │ │ -
294void interpolate(const B& basis, C&& coeff, const F& f)
│ │ │ │ -
295{
│ │ │ │ -
296 interpolate (basis, coeff, f, Imp::AllTrueBitSetVector(), HierarchicNodeToRangeMap());
│ │ │ │ -
297}
│ │ │ │ -
298
│ │ │ │ -
299} // namespace Functions
│ │ │ │ -
300} // namespace Dune
│ │ │ │ -
301
│ │ │ │ -
302#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_INTERPOLATE_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
auto istlVectorBackend(Vector &v)
Return a vector backend wrapping non-const ISTL like containers.
Definition: istlvectorbackend.hh:346
│ │ │ │ -
Definition: polynomial.hh:10
│ │ │ │ -
void interpolate(const B &basis, C &&coeff, const F &f, const BV &bv, const NTRE &nodeToRangeEntry)
Interpolate given function in discrete function space.
Definition: interpolate.hh:202
│ │ │ │ -
std::decay< F >::type makeGridViewFunction(F &&f, const GridView &gridView)
Construct a function modeling GridViewFunction from function and grid view.
Definition: gridviewfunction.hh:68
│ │ │ │ -
SizeInfo< Basis > sizeInfo(const Basis &basis)
Definition: sizeinfo.hh:69
│ │ │ │ -
auto flatVectorView(T &t)
Create flat vector view of passed mutable container.
Definition: flatvectorview.hh:179
│ │ │ │ -
A simple node to range map using the nested tree indices.
Definition: hierarchicnodetorangemap.hh:30
│ │ │ │ - │ │ │ │ + │ │ │ │ +
170 {
│ │ │ │ +
171 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │ +
172 }
│ │ │ │ +
173
│ │ │ │ +
175 friend LocalFunction localFunction(const FaceNormalGridFunction& t)
│ │ │ │ +
176 {
│ │ │ │ +
177 return LocalFunction{};
│ │ │ │ +
178 }
│ │ │ │ +
179
│ │ │ │ +
181 const EntitySet& entitySet() const
│ │ │ │ +
182 {
│ │ │ │ +
183 return entitySet_;
│ │ │ │ +
184 }
│ │ │ │ +
185
│ │ │ │ +
186private:
│ │ │ │ +
187 EntitySet entitySet_;
│ │ │ │ +
188};
│ │ │ │ +
189
│ │ │ │ +
190
│ │ │ │ +
191
│ │ │ │ +
192} // namespace Dune::Functions
│ │ │ │ +
193
│ │ │ │ +
194#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_FACENORMALGRIDFUNCTION_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ +
Definition: polynomial.hh:11
│ │ │ │ +
Default implementation for derivative traits.
Definition: defaultderivativetraits.hh:37
│ │ │ │ +
Grid function implementing the piecewise element face normal.
Definition: facenormalgridfunction.hh:66
│ │ │ │ +
GridViewEntitySet< GridView, 0 > EntitySet
Definition: facenormalgridfunction.hh:69
│ │ │ │ +
typename EntitySet::LocalCoordinate LocalDomain
Definition: facenormalgridfunction.hh:72
│ │ │ │ +
typename EntitySet::GlobalCoordinate Domain
Definition: facenormalgridfunction.hh:73
│ │ │ │ +
typename EntitySet::GlobalCoordinate Range
Definition: facenormalgridfunction.hh:74
│ │ │ │ +
const EntitySet & entitySet() const
Return the stored GridViewEntitySet.
Definition: facenormalgridfunction.hh:181
│ │ │ │ +
friend Traits::DerivativeInterface derivative(const FaceNormalGridFunction &t)
Not implemented.
Definition: facenormalgridfunction.hh:169
│ │ │ │ +
GV GridView
Definition: facenormalgridfunction.hh:68
│ │ │ │ +
friend LocalFunction localFunction(const FaceNormalGridFunction &t)
Return a local-function associated to FaceNormalGridFunction.
Definition: facenormalgridfunction.hh:175
│ │ │ │ +
FaceNormalGridFunction(const GridView &gridView)
Construct the FaceNormalGridFunction.
Definition: facenormalgridfunction.hh:158
│ │ │ │ +
typename EntitySet::Element Element
Definition: facenormalgridfunction.hh:70
│ │ │ │ +
Range operator()(const Domain &x) const
Not implemented.
Definition: facenormalgridfunction.hh:163
│ │ │ │ +
Definition: gridfunction.hh:32
│ │ │ │ + │ │ │ │ +
GridView::template Codim< codim >::Entity Element
Type of Elements contained in this EntitySet.
Definition: gridviewentityset.hh:32
│ │ │ │ +
Element::Geometry::LocalCoordinate LocalCoordinate
Type of local coordinates with respect to the Element.
Definition: gridviewentityset.hh:35
│ │ │ │ +
Element::Geometry::GlobalCoordinate GlobalCoordinate
Definition: gridviewentityset.hh:36
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,316 +4,231 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * functionspacebases │ │ │ │ │ -interpolate.hh │ │ │ │ │ + * gridfunctions │ │ │ │ │ +facenormalgridfunction.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_INTERPOLATE_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_INTERPOLATE_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_FACENORMALGRIDFUNCTION_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_FACENORMALGRIDFUNCTION_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ 8 │ │ │ │ │ 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11 │ │ │ │ │ - 12#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ 13 │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ + 14#include │ │ │ │ │ + 15#include │ │ │ │ │ 16 │ │ │ │ │ - 17#include │ │ │ │ │ - 18#include │ │ │ │ │ - 19#include │ │ │ │ │ - 20#include │ │ │ │ │ - 21#include │ │ │ │ │ - 22 │ │ │ │ │ - 23#include │ │ │ │ │ - 24#include │ │ │ │ │ - 25 │ │ │ │ │ - 26namespace Dune { │ │ │ │ │ - 27namespace Functions { │ │ │ │ │ - 28 │ │ │ │ │ - 29namespace Imp { │ │ │ │ │ - 30 │ │ │ │ │ - 31struct AllTrueBitSetVector │ │ │ │ │ - 32{ │ │ │ │ │ - 33 struct AllTrueBitSet │ │ │ │ │ - 34 { │ │ │ │ │ - 35 bool test(int) const { return true; } │ │ │ │ │ - 36 } allTrue_; │ │ │ │ │ - 37 │ │ │ │ │ - 38 operator bool() const │ │ │ │ │ + 17 │ │ │ │ │ + 18namespace Dune::Functions { │ │ │ │ │ + 19 │ │ │ │ │ + 20namespace Impl { │ │ │ │ │ + 21 │ │ │ │ │ + 22// Compute closest face to point │ │ │ │ │ + 23template │ │ │ │ │ + 24auto closestFaceIndex(const ReferenceElement& re, const Coordinate& x) │ │ │ │ │ + 25{ │ │ │ │ │ + 26 auto closestFaceIndex = decltype(re.subEntity(0,1,0,1)){}; │ │ │ │ │ + 27 double closestFaceDistance = std::numeric_limits::max(); │ │ │ │ │ + 28 for(auto&& faceIndex : Dune::range(re.size(1))) │ │ │ │ │ + 29 { │ │ │ │ │ + 30 // For a face unit outer normal consider the orthogonal projection │ │ │ │ │ + 31 // Px = x + *n into the face. Then the distance to the face │ │ │ │ │ + 32 // is given by |x-Px| = |||n| = . │ │ │ │ │ + 33 auto normal = re.integrationOuterNormal(faceIndex); │ │ │ │ │ + 34 normal /= normal.two_norm(); │ │ │ │ │ + 35 auto c = re.position(faceIndex,1); │ │ │ │ │ + 36 c -= x; │ │ │ │ │ + 37 auto faceDistance = (c*normal); │ │ │ │ │ + 38 if (faceDistance │ │ │ │ │ - 44 const AllTrueBitSetVector& operator[](const I&) const │ │ │ │ │ - 45 { │ │ │ │ │ - 46 return *this; │ │ │ │ │ - 47 } │ │ │ │ │ + 40 closestFaceDistance = faceDistance; │ │ │ │ │ + 41 closestFaceIndex = faceIndex; │ │ │ │ │ + 42 } │ │ │ │ │ + 43 } │ │ │ │ │ + 44 return closestFaceIndex; │ │ │ │ │ + 45} │ │ │ │ │ + 46 │ │ │ │ │ + 47} // end namespace Impl │ │ │ │ │ 48 │ │ │ │ │ - 49 template │ │ │ │ │ - 50 void resize(const SP&) const │ │ │ │ │ - 51 {} │ │ │ │ │ - 52 │ │ │ │ │ - 53}; │ │ │ │ │ - 54 │ │ │ │ │ - 55 │ │ │ │ │ - 56 │ │ │ │ │ - 57template │ │ │ │ │ - 58class LocalInterpolateVisitor │ │ │ │ │ - 59 : public TypeTree::TreeVisitor │ │ │ │ │ - 60 , public TypeTree::DynamicTraversal │ │ │ │ │ - 61{ │ │ │ │ │ - 62 │ │ │ │ │ - 63public: │ │ │ │ │ - 64 │ │ │ │ │ - 65 using Basis = B; │ │ │ │ │ - 66 using LocalView = typename B::LocalView; │ │ │ │ │ - 67 using MultiIndex = typename LocalView::MultiIndex; │ │ │ │ │ - 68 │ │ │ │ │ - 69 using LocalFunction = LF; │ │ │ │ │ - 70 │ │ │ │ │ - 71 using Tree = T; │ │ │ │ │ - 72 │ │ │ │ │ - 73 using VectorBackend = HV; │ │ │ │ │ - 74 using BitVectorBackend = HBV; │ │ │ │ │ + 49 │ │ │ │ │ + 50 │ │ │ │ │ + 51 │ │ │ │ │ + 64template │ │ │ │ │ +65class FaceNormalGridFunction │ │ │ │ │ + 66{ │ │ │ │ │ + 67public: │ │ │ │ │ +68 using GridView = GV; │ │ │ │ │ +69 using EntitySet = GridViewEntitySet; │ │ │ │ │ +70 using Element = typename EntitySet::Element; │ │ │ │ │ + 71 │ │ │ │ │ +72 using LocalDomain = typename EntitySet::LocalCoordinate; │ │ │ │ │ +73 using Domain = typename EntitySet::GlobalCoordinate; │ │ │ │ │ +74 using Range = typename EntitySet::GlobalCoordinate; │ │ │ │ │ 75 │ │ │ │ │ - 76 using NodeToRangeEntry = NTRE; │ │ │ │ │ + 76private: │ │ │ │ │ 77 │ │ │ │ │ - 78 using GridView = typename Basis::GridView; │ │ │ │ │ - 79 using Element = typename GridView::template Codim<0>::Entity; │ │ │ │ │ - 80 │ │ │ │ │ - 81 using LocalDomain = typename Element::Geometry::LocalCoordinate; │ │ │ │ │ - 82 │ │ │ │ │ - 83 using GlobalDomain = typename Element::Geometry::GlobalCoordinate; │ │ │ │ │ - 84 │ │ │ │ │ - 85 LocalInterpolateVisitor(const B& /*basis*/, HV& coeff, const HBV& │ │ │ │ │ -bitVector, const LF& localF, const LocalView& localView, const │ │ │ │ │ -NodeToRangeEntry& nodeToRangeEntry) : │ │ │ │ │ - 86 vector_(coeff), │ │ │ │ │ - 87 localF_(localF), │ │ │ │ │ - 88 bitVector_(bitVector), │ │ │ │ │ - 89 localView_(localView), │ │ │ │ │ - 90 nodeToRangeEntry_(nodeToRangeEntry) │ │ │ │ │ - 91 { │ │ │ │ │ - 92 static_assert(Dune::Functions::Concept::isCallable(), "Function passed to LocalInterpolateVisitor does not model the │ │ │ │ │ -Callable concept"); │ │ │ │ │ - 93 } │ │ │ │ │ - 94 │ │ │ │ │ - 95 template │ │ │ │ │ - 96 void pre(Node&, TreePath) │ │ │ │ │ - 97 {} │ │ │ │ │ - 98 │ │ │ │ │ - 99 template │ │ │ │ │ - 100 void post(Node&, TreePath) │ │ │ │ │ - 101 {} │ │ │ │ │ + 78 using Traits = Imp::GridFunctionTraits; │ │ │ │ │ + 79 │ │ │ │ │ + 80 class LocalFunction │ │ │ │ │ + 81 { │ │ │ │ │ + 82 using Geometry = typename Element::Geometry; │ │ │ │ │ + 83 static const int dimension = GV::dimension; │ │ │ │ │ + 84 public: │ │ │ │ │ + 85 │ │ │ │ │ + 97 void bind(const Element& element) │ │ │ │ │ + 98 { │ │ │ │ │ + 99 element_ = element; │ │ │ │ │ + 100 geometry_.emplace(element_.geometry()); │ │ │ │ │ + 101 } │ │ │ │ │ 102 │ │ │ │ │ - 103 template │ │ │ │ │ - 104 void leaf(Node& node, TreePath treePath) │ │ │ │ │ - 105 { │ │ │ │ │ - 106 using FiniteElement = typename Node::FiniteElement; │ │ │ │ │ - 107 using FiniteElementRange = typename FiniteElement::Traits:: │ │ │ │ │ -LocalBasisType::Traits::RangeType; │ │ │ │ │ - 108 using FiniteElementRangeField = typename FiniteElement::Traits:: │ │ │ │ │ -LocalBasisType::Traits::RangeFieldType; │ │ │ │ │ - 109 │ │ │ │ │ - 110 auto interpolationCoefficients = std::vector(); │ │ │ │ │ - 111 auto&& fe = node.finiteElement(); │ │ │ │ │ - 112 │ │ │ │ │ - 113 // backward compatibility: for scalar basis functions and possibly vector │ │ │ │ │ -valued coefficients │ │ │ │ │ - 114 // (like used in dune-fufem for power bases) loop over the components │ │ │ │ │ - 115 // of the coefficients │ │ │ │ │ - 116 if constexpr ( FiniteElement::Traits::LocalBasisType::Traits::dimRange == │ │ │ │ │ -1 ) │ │ │ │ │ - 117 { │ │ │ │ │ - 118 // Note that we capture j by reference. Hence we can switch │ │ │ │ │ - 119 // the selected component later on by modifying j. Maybe we │ │ │ │ │ - 120 // should avoid this naughty statefull lambda hack in favor │ │ │ │ │ - 121 // of a separate helper class. │ │ │ │ │ - 122 std::size_t j=0; │ │ │ │ │ - 123 auto localFj = [&](const LocalDomain& x){ │ │ │ │ │ - 124 const auto& y = localF_(x); │ │ │ │ │ - 125 return FiniteElementRange(flatVectorView(nodeToRangeEntry_(node, treePath, │ │ │ │ │ -y))[j]); │ │ │ │ │ - 126 }; │ │ │ │ │ - 127 │ │ │ │ │ - 128 // We loop over j defined above and thus over the components of the │ │ │ │ │ - 129 // range type of localF_. │ │ │ │ │ + 103 void unbind() │ │ │ │ │ + 104 { │ │ │ │ │ + 105 geometry_.reset(); │ │ │ │ │ + 106 } │ │ │ │ │ + 107 │ │ │ │ │ + 110 bool bound() const │ │ │ │ │ + 111 { │ │ │ │ │ + 112 return static_cast(geometry_); │ │ │ │ │ + 113 } │ │ │ │ │ + 114 │ │ │ │ │ + 124 Range operator()(const LocalDomain& x) const │ │ │ │ │ + 125 { │ │ │ │ │ + 126 auto&& re = Dune::referenceElement(*geometry_); │ │ │ │ │ + 127 // Compute reference normal of closest face to given point │ │ │ │ │ + 128 auto face = Impl::closestFaceIndex(re, x); │ │ │ │ │ + 129 auto localNormal = re.integrationOuterNormal(face); │ │ │ │ │ 130 │ │ │ │ │ - 131 auto blockSize = flatVectorView(vector_[localView_.index(0)]).size(); │ │ │ │ │ - 132 │ │ │ │ │ - 133 for(j=0; jjacobianInverseTransposed(x).mv(localNormal, normal); │ │ │ │ │ + 135 normal /= normal.two_norm(); │ │ │ │ │ + 136 return normal; │ │ │ │ │ + 137 } │ │ │ │ │ + 138 │ │ │ │ │ + 140 const Element& localContext() const │ │ │ │ │ 141 { │ │ │ │ │ - 142 auto vectorBlock = flatVectorView(vector_[multiIndex]); │ │ │ │ │ - 143 vectorBlock[j] = interpolationCoefficients[i]; │ │ │ │ │ - 144 } │ │ │ │ │ - 145 } │ │ │ │ │ - 146 } │ │ │ │ │ - 147 } │ │ │ │ │ - 148 else // ( FiniteElement::Traits::LocalBasisType::Traits::dimRange != 1 ) │ │ │ │ │ - 149 { │ │ │ │ │ - 150 // for all other finite elements: use the FiniteElementRange directly for │ │ │ │ │ -the interpolation │ │ │ │ │ - 151 auto localF = [&](const LocalDomain& x){ │ │ │ │ │ - 152 const auto& y = localF_(x); │ │ │ │ │ - 153 return FiniteElementRange(nodeToRangeEntry_(node, treePath, y)); │ │ │ │ │ + 142 return element_; │ │ │ │ │ + 143 } │ │ │ │ │ + 144 │ │ │ │ │ + 146 friend typename Traits::LocalFunctionTraits::DerivativeInterface │ │ │ │ │ +derivative(const LocalFunction& t) │ │ │ │ │ + 147 { │ │ │ │ │ + 148 DUNE_THROW(NotImplemented,"not implemented"); │ │ │ │ │ + 149 } │ │ │ │ │ + 150 │ │ │ │ │ + 151 private: │ │ │ │ │ + 152 std::optional geometry_; │ │ │ │ │ + 153 Element element_; │ │ │ │ │ 154 }; │ │ │ │ │ 155 │ │ │ │ │ - 156 fe.localInterpolation().interpolate(localF, interpolationCoefficients); │ │ │ │ │ - 157 for (size_t i=0; i │ │ │ │ │ -202void interpolate(const B& basis, C&& coeff, const F& f, const BV& bv, const │ │ │ │ │ -NTRE& nodeToRangeEntry) │ │ │ │ │ - 203{ │ │ │ │ │ - 204 using GridView = typename B::GridView; │ │ │ │ │ - 205 using Element = typename GridView::template Codim<0>::Entity; │ │ │ │ │ - 206 │ │ │ │ │ - 207 using Tree = typename B::LocalView::Tree; │ │ │ │ │ - 208 │ │ │ │ │ - 209 using GlobalDomain = typename Element::Geometry::GlobalCoordinate; │ │ │ │ │ - 210 │ │ │ │ │ - 211 static_assert(Dune::Functions::Concept::isCallable(), │ │ │ │ │ -"Function passed to interpolate does not model the Callable │ │ │ │ │ -concept"); │ │ │ │ │ - 212 │ │ │ │ │ - 213 auto&& gridView = basis.gridView(); │ │ │ │ │ - 214 │ │ │ │ │ - 215 // Small helper functions to wrap vectors using istlVectorBackend │ │ │ │ │ - 216 // if they do not already satisfy the VectorBackend interface. │ │ │ │ │ - 217 auto toVectorBackend = [&](auto& v) -> decltype(auto) { │ │ │ │ │ - 218 if constexpr (models, decltype(v)>()) { │ │ │ │ │ - 219 return v; │ │ │ │ │ - 220 } else { │ │ │ │ │ - 221 return istlVectorBackend(v); │ │ │ │ │ - 222 } │ │ │ │ │ - 223 }; │ │ │ │ │ - 224 │ │ │ │ │ - 225 auto toConstVectorBackend = [&](auto& v) -> decltype(auto) { │ │ │ │ │ - 226 if constexpr (models, decltype(v)>()) { │ │ │ │ │ - 227 return v; │ │ │ │ │ - 228 } else { │ │ │ │ │ - 229 return istlVectorBackend(v); │ │ │ │ │ - 230 } │ │ │ │ │ - 231 }; │ │ │ │ │ - 232 │ │ │ │ │ - 233 auto&& bitVector = toConstVectorBackend(bv); │ │ │ │ │ - 234 auto&& vector = toVectorBackend(coeff); │ │ │ │ │ - 235 vector.resize(sizeInfo(basis)); │ │ │ │ │ - 236 │ │ │ │ │ - 237 │ │ │ │ │ - 238 │ │ │ │ │ - 239 // Make a grid function supporting local evaluation out of f │ │ │ │ │ - 240 auto gf = makeGridViewFunction(f, gridView); │ │ │ │ │ - 241 │ │ │ │ │ - 242 // Obtain a local view of f │ │ │ │ │ - 243 auto localF = localFunction(gf); │ │ │ │ │ - 244 │ │ │ │ │ - 245 auto localView = basis.localView(); │ │ │ │ │ - 246 │ │ │ │ │ - 247 for (const auto& e : elements(gridView)) │ │ │ │ │ - 248 { │ │ │ │ │ - 249 localView.bind(e); │ │ │ │ │ - 250 localF.bind(e); │ │ │ │ │ - 251 │ │ │ │ │ - 252 Imp::LocalInterpolateVisitor localInterpolateVisitor(basis, vector, │ │ │ │ │ -bitVector, localF, localView, nodeToRangeEntry); │ │ │ │ │ - 253 TypeTree::applyToTree(localView.tree(),localInterpolateVisitor); │ │ │ │ │ - 254 } │ │ │ │ │ - 255} │ │ │ │ │ - 256 │ │ │ │ │ - 273template │ │ │ │ │ -274void interpolate(const B& basis, C&& coeff, const F& f, const BV& bitVector) │ │ │ │ │ - 275{ │ │ │ │ │ - 276 interpolate(basis, coeff, f, bitVector, HierarchicNodeToRangeMap()); │ │ │ │ │ - 277} │ │ │ │ │ - 278 │ │ │ │ │ - 293template │ │ │ │ │ -294void interpolate(const B& basis, C&& coeff, const F& f) │ │ │ │ │ - 295{ │ │ │ │ │ - 296 interpolate (basis, coeff, f, Imp::AllTrueBitSetVector(), │ │ │ │ │ -HierarchicNodeToRangeMap()); │ │ │ │ │ - 297} │ │ │ │ │ - 298 │ │ │ │ │ - 299} // namespace Functions │ │ │ │ │ - 300} // namespace Dune │ │ │ │ │ - 301 │ │ │ │ │ - 302#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_INTERPOLATE_HH │ │ │ │ │ -functionconcepts.hh │ │ │ │ │ -istlvectorbackend.hh │ │ │ │ │ -gridviewfunction.hh │ │ │ │ │ -sizeinfo.hh │ │ │ │ │ -flatvectorview.hh │ │ │ │ │ -hierarchicnodetorangemap.hh │ │ │ │ │ -Dune::Functions::istlVectorBackend │ │ │ │ │ -auto istlVectorBackend(Vector &v) │ │ │ │ │ -Return a vector backend wrapping non-const ISTL like containers. │ │ │ │ │ -Definition: istlvectorbackend.hh:346 │ │ │ │ │ -Dune │ │ │ │ │ -Definition: polynomial.hh:10 │ │ │ │ │ -Dune::Functions::interpolate │ │ │ │ │ -void interpolate(const B &basis, C &&coeff, const F &f, const BV &bv, const │ │ │ │ │ -NTRE &nodeToRangeEntry) │ │ │ │ │ -Interpolate given function in discrete function space. │ │ │ │ │ -Definition: interpolate.hh:202 │ │ │ │ │ -Dune::Functions::makeGridViewFunction │ │ │ │ │ -std::decay< F >::type makeGridViewFunction(F &&f, const GridView &gridView) │ │ │ │ │ -Construct a function modeling GridViewFunction from function and grid view. │ │ │ │ │ -Definition: gridviewfunction.hh:68 │ │ │ │ │ -Dune::Functions::sizeInfo │ │ │ │ │ -SizeInfo< Basis > sizeInfo(const Basis &basis) │ │ │ │ │ -Definition: sizeinfo.hh:69 │ │ │ │ │ -Dune::Functions::flatVectorView │ │ │ │ │ -auto flatVectorView(T &t) │ │ │ │ │ -Create flat vector view of passed mutable container. │ │ │ │ │ -Definition: flatvectorview.hh:179 │ │ │ │ │ -Dune::Functions::HierarchicNodeToRangeMap │ │ │ │ │ -A simple node to range map using the nested tree indices. │ │ │ │ │ -Definition: hierarchicnodetorangemap.hh:30 │ │ │ │ │ -concepts.hh │ │ │ │ │ +169 friend typename Traits::DerivativeInterface derivative(const │ │ │ │ │ +FaceNormalGridFunction& t) │ │ │ │ │ + 170 { │ │ │ │ │ + 171 DUNE_THROW(NotImplemented,"not implemented"); │ │ │ │ │ + 172 } │ │ │ │ │ + 173 │ │ │ │ │ +175 friend LocalFunction localFunction(const FaceNormalGridFunction& t) │ │ │ │ │ + 176 { │ │ │ │ │ + 177 return LocalFunction{}; │ │ │ │ │ + 178 } │ │ │ │ │ + 179 │ │ │ │ │ +181 const EntitySet& entitySet() const │ │ │ │ │ + 182 { │ │ │ │ │ + 183 return entitySet_; │ │ │ │ │ + 184 } │ │ │ │ │ + 185 │ │ │ │ │ + 186private: │ │ │ │ │ + 187 EntitySet entitySet_; │ │ │ │ │ + 188}; │ │ │ │ │ + 189 │ │ │ │ │ + 190 │ │ │ │ │ + 191 │ │ │ │ │ + 192} // namespace Dune::Functions │ │ │ │ │ + 193 │ │ │ │ │ + 194#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_FACENORMALGRIDFUNCTION_HH │ │ │ │ │ +gridfunction.hh │ │ │ │ │ +gridviewentityset.hh │ │ │ │ │ +Dune::Functions │ │ │ │ │ +Definition: polynomial.hh:11 │ │ │ │ │ +Dune::Functions::DefaultDerivativeTraits │ │ │ │ │ +Default implementation for derivative traits. │ │ │ │ │ +Definition: defaultderivativetraits.hh:37 │ │ │ │ │ +Dune::Functions::FaceNormalGridFunction │ │ │ │ │ +Grid function implementing the piecewise element face normal. │ │ │ │ │ +Definition: facenormalgridfunction.hh:66 │ │ │ │ │ +Dune::Functions::FaceNormalGridFunction::EntitySet │ │ │ │ │ +GridViewEntitySet< GridView, 0 > EntitySet │ │ │ │ │ +Definition: facenormalgridfunction.hh:69 │ │ │ │ │ +Dune::Functions::FaceNormalGridFunction::LocalDomain │ │ │ │ │ +typename EntitySet::LocalCoordinate LocalDomain │ │ │ │ │ +Definition: facenormalgridfunction.hh:72 │ │ │ │ │ +Dune::Functions::FaceNormalGridFunction::Domain │ │ │ │ │ +typename EntitySet::GlobalCoordinate Domain │ │ │ │ │ +Definition: facenormalgridfunction.hh:73 │ │ │ │ │ +Dune::Functions::FaceNormalGridFunction::Range │ │ │ │ │ +typename EntitySet::GlobalCoordinate Range │ │ │ │ │ +Definition: facenormalgridfunction.hh:74 │ │ │ │ │ +Dune::Functions::FaceNormalGridFunction::entitySet │ │ │ │ │ +const EntitySet & entitySet() const │ │ │ │ │ +Return the stored GridViewEntitySet. │ │ │ │ │ +Definition: facenormalgridfunction.hh:181 │ │ │ │ │ +Dune::Functions::FaceNormalGridFunction::derivative │ │ │ │ │ +friend Traits::DerivativeInterface derivative(const FaceNormalGridFunction &t) │ │ │ │ │ +Not implemented. │ │ │ │ │ +Definition: facenormalgridfunction.hh:169 │ │ │ │ │ +Dune::Functions::FaceNormalGridFunction::GridView │ │ │ │ │ +GV GridView │ │ │ │ │ +Definition: facenormalgridfunction.hh:68 │ │ │ │ │ +Dune::Functions::FaceNormalGridFunction::localFunction │ │ │ │ │ +friend LocalFunction localFunction(const FaceNormalGridFunction &t) │ │ │ │ │ +Return a local-function associated to FaceNormalGridFunction. │ │ │ │ │ +Definition: facenormalgridfunction.hh:175 │ │ │ │ │ +Dune::Functions::FaceNormalGridFunction::FaceNormalGridFunction │ │ │ │ │ +FaceNormalGridFunction(const GridView &gridView) │ │ │ │ │ +Construct the FaceNormalGridFunction. │ │ │ │ │ +Definition: facenormalgridfunction.hh:158 │ │ │ │ │ +Dune::Functions::FaceNormalGridFunction::Element │ │ │ │ │ +typename EntitySet::Element Element │ │ │ │ │ +Definition: facenormalgridfunction.hh:70 │ │ │ │ │ +Dune::Functions::FaceNormalGridFunction::operator() │ │ │ │ │ +Range operator()(const Domain &x) const │ │ │ │ │ +Not implemented. │ │ │ │ │ +Definition: facenormalgridfunction.hh:163 │ │ │ │ │ +Dune::Functions::GridFunction │ │ │ │ │ +Definition: gridfunction.hh:32 │ │ │ │ │ +Dune::Functions::GridViewEntitySet<_GridView,_0_> │ │ │ │ │ +Dune::Functions::GridViewEntitySet<_GridView,_0_>::Element │ │ │ │ │ +GridView::template Codim< codim >::Entity Element │ │ │ │ │ +Type of Elements contained in this EntitySet. │ │ │ │ │ +Definition: gridviewentityset.hh:32 │ │ │ │ │ +Dune::Functions::GridViewEntitySet<_GridView,_0_>::LocalCoordinate │ │ │ │ │ +Element::Geometry::LocalCoordinate LocalCoordinate │ │ │ │ │ +Type of local coordinates with respect to the Element. │ │ │ │ │ +Definition: gridviewentityset.hh:35 │ │ │ │ │ +Dune::Functions::GridViewEntitySet<_GridView,_0_>::GlobalCoordinate │ │ │ │ │ +Element::Geometry::GlobalCoordinate GlobalCoordinate │ │ │ │ │ +Definition: gridviewentityset.hh:36 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00191.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: periodicbasis.hh File Reference │ │ │ │ +dune-functions: discreteglobalbasisfunction.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,58 +58,73 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
periodicbasis.hh File Reference
│ │ │ │ +
discreteglobalbasisfunction.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <utility>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <limits>
│ │ │ │ -#include <set>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/transformedindexbasis.hh>
│ │ │ │ +
#include <memory>
│ │ │ │ +#include <optional>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/typetree/treecontainer.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/hierarchicnodetorangemap.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/flatvectorview.hh>
│ │ │ │ +#include <dune/functions/gridfunctions/gridviewentityset.hh>
│ │ │ │ +#include <dune/functions/gridfunctions/gridfunction.hh>
│ │ │ │ +#include <dune/functions/backends/concepts.hh>
│ │ │ │ +#include <dune/functions/backends/istlvectorbackend.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::BasisFactory::Experimental::PeriodicIndexSet
 Container storing identified indices for a periodic basis. More...
class  Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase< B, V, NTRE >
 
struct  Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase< B, V, NTRE >::Data
 
class  Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase< B, V, NTRE >::LocalFunctionBase
 
class  Dune::Functions::DiscreteGlobalBasisFunction< B, V, NTRE, R >
 A grid function induced by a global basis and a coefficient vector. More...
 
class  Dune::Functions::DiscreteGlobalBasisFunction< B, V, NTRE, R >::LocalFunction
 
class  Dune::Functions::DiscreteGlobalBasisFunctionDerivative< DGBF >
 Derivative of a DiscreteGlobalBasisFunction More...
 
class  Dune::Functions::DiscreteGlobalBasisFunctionDerivative< DGBF >::LocalFunction
 local function evaluating the derivative in reference coordinates More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
namespace  Dune::Functions::BasisFactory
 
namespace  Dune::Functions::BasisFactory::Experimental
namespace  Dune::Functions::ImplDoc
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<class RawPreBasisIndicator , class PIS >
auto Dune::Functions::BasisFactory::Experimental::periodic (RawPreBasisIndicator &&rawPreBasisIndicator, PIS &&periodicIndexSet)
 Create a pre-basis factory that can create a periodic pre-basis. More...
 
template<typename R , typename B , typename V >
auto Dune::Functions::makeDiscreteGlobalBasisFunction (B &&basis, V &&vector)
 Generate a DiscreteGlobalBasisFunction. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,40 +4,61 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * functionspacebases │ │ │ │ │ + * gridfunctions │ │ │ │ │ Classes | Namespaces | Functions │ │ │ │ │ -periodicbasis.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +discreteglobalbasisfunction.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::Functions::BasisFactory::Experimental::PeriodicIndexSet │ │ │ │ │ -  Container storing identified indices for a periodic basis. More... │ │ │ │ │ + class  Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase<_B,_V,_NTRE │ │ │ │ │ + > │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase<_B,_V,_NTRE │ │ │ │ │ + >::Data │ │ │ │ │ +  │ │ │ │ │ + class  Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase<_B,_V,_NTRE │ │ │ │ │ + >::LocalFunctionBase │ │ │ │ │ +  │ │ │ │ │ + class  Dune::Functions::DiscreteGlobalBasisFunction<_B,_V,_NTRE,_R_> │ │ │ │ │ +  A grid function induced by a global basis and a coefficient vector. │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ + class  Dune::Functions::DiscreteGlobalBasisFunction<_B,_V,_NTRE,_R_>:: │ │ │ │ │ + LocalFunction │ │ │ │ │ +  │ │ │ │ │ + class  Dune::Functions::DiscreteGlobalBasisFunctionDerivative<_DGBF_> │ │ │ │ │ +  Derivative of a DiscreteGlobalBasisFunction More... │ │ │ │ │ +  │ │ │ │ │ + class  Dune::Functions::DiscreteGlobalBasisFunctionDerivative<_DGBF_>:: │ │ │ │ │ + LocalFunction │ │ │ │ │ +  local function evaluating the derivative in reference coordinates │ │ │ │ │ + More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Functions │ │ │ │ │   │ │ │ │ │ -namespace  Dune::Functions::BasisFactory │ │ │ │ │ -  │ │ │ │ │ -namespace  Dune::Functions::BasisFactory::Experimental │ │ │ │ │ +namespace  Dune::Functions::ImplDoc │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ -auto Dune::Functions::BasisFactory::Experimental::periodic │ │ │ │ │ - (RawPreBasisIndicator &&rawPreBasisIndicator, PIS &&periodicIndexSet) │ │ │ │ │ -  Create a pre-basis factory that can create a periodic pre-basis. More... │ │ │ │ │ +template │ │ │ │ │ +auto Dune::Functions::makeDiscreteGlobalBasisFunction (B &&basis, V &&vector) │ │ │ │ │ +  Generate a DiscreteGlobalBasisFunction. More... │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00191_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: periodicbasis.hh Source File │ │ │ │ +dune-functions: discreteglobalbasisfunction.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,208 +58,597 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
periodicbasis.hh
│ │ │ │ +
discreteglobalbasisfunction.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_PERIODICBASIS_HH
│ │ │ │ -
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_PERIODICBASIS_HH
│ │ │ │ +
3#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH
│ │ │ │ +
4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH
│ │ │ │
5
│ │ │ │ -
6#include <utility>
│ │ │ │ -
7#include <type_traits>
│ │ │ │ -
8#include <limits>
│ │ │ │ -
9#include <set>
│ │ │ │ -
10#include <vector>
│ │ │ │ -
11
│ │ │ │ - │ │ │ │ - │ │ │ │ -
14
│ │ │ │ -
15
│ │ │ │ -
16namespace Dune::Functions {
│ │ │ │ -
17
│ │ │ │ -
18namespace BasisFactory {
│ │ │ │ +
6#include <memory>
│ │ │ │ +
7#include <optional>
│ │ │ │ +
8
│ │ │ │ +
9#include <dune/common/typetraits.hh>
│ │ │ │ +
10
│ │ │ │ +
11#include <dune/typetree/treecontainer.hh>
│ │ │ │ +
12
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
19
│ │ │ │ -
20// The PeriodicBasis class is in the Experimental namespace because we are
│ │ │ │ -
21// not completely sure yet whether we like it. We reserve the right to
│ │ │ │ -
22// modify it without advance warning. Use at your own risk!
│ │ │ │ +
20namespace Dune {
│ │ │ │ +
21namespace Functions {
│ │ │ │ +
22
│ │ │ │
23
│ │ │ │ -
24namespace Experimental {
│ │ │ │ +
24namespace ImplDoc {
│ │ │ │
25
│ │ │ │ -
26
│ │ │ │ - │ │ │ │ -
36{
│ │ │ │ -
37 using IndexPairSet = std::set<std::pair<std::size_t,std::size_t>>;
│ │ │ │ -
38public:
│ │ │ │ -
39
│ │ │ │ -
47 void unifyIndexPair(std::size_t a, std::size_t b)
│ │ │ │ -
48 {
│ │ │ │ -
49 if (a>b)
│ │ │ │ -
50 std::swap(a,b);
│ │ │ │ -
51 if (a==b)
│ │ │ │ -
52 return;
│ │ │ │ -
53 indexPairSet_.insert(std::make_pair(a,b));
│ │ │ │ -
54 }
│ │ │ │ -
55
│ │ │ │ -
56 const auto& indexPairSet() const
│ │ │ │ -
57 {
│ │ │ │ -
58 return indexPairSet_;
│ │ │ │ -
59 }
│ │ │ │ -
60
│ │ │ │ -
61private:
│ │ │ │ -
62 IndexPairSet indexPairSet_;
│ │ │ │ -
63};
│ │ │ │ -
64
│ │ │ │ +
26template<typename B, typename V, typename NTRE>
│ │ │ │ + │ │ │ │ +
28{
│ │ │ │ +
29public:
│ │ │ │ +
30 using Basis = B;
│ │ │ │ +
31 using Vector = V;
│ │ │ │ +
32
│ │ │ │ +
33 // In order to make the cache work for proxy-references
│ │ │ │ +
34 // we have to use AutonomousValue<T> instead of std::decay_t<T>
│ │ │ │ +
35 using Coefficient = Dune::AutonomousValue<decltype(std::declval<Vector>()[std::declval<typename Basis::MultiIndex>()])>;
│ │ │ │ +
36
│ │ │ │ +
37 using GridView = typename Basis::GridView;
│ │ │ │ + │ │ │ │ +
39 using Tree = typename Basis::LocalView::Tree;
│ │ │ │ +
40 using NodeToRangeEntry = NTRE;
│ │ │ │ +
41
│ │ │ │ + │ │ │ │ +
43
│ │ │ │ + │ │ │ │ +
45 using Element = typename EntitySet::Element;
│ │ │ │ +
46
│ │ │ │ +
47protected:
│ │ │ │ +
48
│ │ │ │ +
49 // This collects all data that is shared by all related
│ │ │ │ +
50 // global and local functions. This way we don't need to
│ │ │ │ +
51 // keep track of it individually.
│ │ │ │ +
52 struct Data
│ │ │ │ +
53 {
│ │ │ │ + │ │ │ │ +
55 std::shared_ptr<const Basis> basis;
│ │ │ │ +
56 std::shared_ptr<const Vector> coefficients;
│ │ │ │ +
57 std::shared_ptr<const NodeToRangeEntry> nodeToRangeEntry;
│ │ │ │ +
58 };
│ │ │ │ +
59
│ │ │ │ +
60public:
│ │ │ │ + │ │ │ │ +
62 {
│ │ │ │ +
63 using LocalView = typename Basis::LocalView;
│ │ │ │ +
64 using size_type = typename Tree::size_type;
│ │ │ │
65
│ │ │ │ -
66
│ │ │ │ -
67namespace Impl {
│ │ │ │ -
68
│ │ │ │ -
69// An index transformation for a TransformedIndexPreBasis
│ │ │ │ -
70// implementing periodic functions by merging indices.
│ │ │ │ -
71// Currently only flat indices are supported.
│ │ │ │ -
72class PeriodicIndexingTransformation
│ │ │ │ -
73{
│ │ │ │ -
74public:
│ │ │ │ -
75
│ │ │ │ -
76 static constexpr std::size_t minIndexSize = 1;
│ │ │ │ -
77 static constexpr std::size_t maxIndexSize = 1;
│ │ │ │ -
78
│ │ │ │ -
79 template<class RawPreBasis, class IndexPairSet>
│ │ │ │ -
80 PeriodicIndexingTransformation(const RawPreBasis& rawPreBasis, const IndexPairSet& indexPairSet)
│ │ │ │ -
81 {
│ │ │ │ -
82 static_assert(RawPreBasis::maxMultiIndexSize==1, "PeriodicIndexingTransformation is only implemented for flat multi-indices");
│ │ │ │ -
83 std::size_t invalid = {std::numeric_limits<std::size_t>::max()};
│ │ │ │ -
84 mappedIdx_.resize(rawPreBasis.size(), invalid);
│ │ │ │ -
85 numIndices_ = 0;
│ │ │ │ -
86 std::size_t i = 0;
│ │ │ │ -
87 for(const auto& [a, b] : indexPairSet)
│ │ │ │ -
88 {
│ │ │ │ -
89 for(; i<=a; ++i)
│ │ │ │ -
90 if (mappedIdx_[i] == invalid)
│ │ │ │ -
91 mappedIdx_[i] = numIndices_++;
│ │ │ │ -
92 mappedIdx_[b] = mappedIdx_[a];
│ │ │ │ -
93 }
│ │ │ │ -
94 for(; i<rawPreBasis.size(); ++i)
│ │ │ │ -
95 if (mappedIdx_[i] == invalid)
│ │ │ │ -
96 mappedIdx_[i] = numIndices_++;
│ │ │ │ -
97 }
│ │ │ │ -
98
│ │ │ │ -
99 template<class MultiIndex, class PreBasis>
│ │ │ │ -
100 void transformIndex(MultiIndex& multiIndex, const PreBasis& preBasis) const
│ │ │ │ -
101 {
│ │ │ │ -
102 multiIndex = {{ mappedIdx_[multiIndex[0]] }};
│ │ │ │ -
103 }
│ │ │ │ -
104
│ │ │ │ -
105 template<class Prefix, class PreBasis>
│ │ │ │ -
106 std::size_t size(const Prefix& prefix, const PreBasis& preBasis) const
│ │ │ │ -
107 {
│ │ │ │ -
108 if (prefix.size() == 1)
│ │ │ │ -
109 return 0;
│ │ │ │ -
110 return numIndices_;
│ │ │ │ -
111 }
│ │ │ │ -
112
│ │ │ │ -
113 template<class PreBasis>
│ │ │ │ -
114 auto dimension(const PreBasis& preBasis) const
│ │ │ │ -
115 {
│ │ │ │ -
116 return numIndices_;
│ │ │ │ -
117 }
│ │ │ │ -
118
│ │ │ │ -
119private:
│ │ │ │ -
120 std::vector<std::size_t> mappedIdx_;
│ │ │ │ -
121 std::size_t numIndices_;
│ │ │ │ -
122};
│ │ │ │ -
123
│ │ │ │ -
124
│ │ │ │ -
125
│ │ │ │ -
126template<class RawPreBasisIndicator>
│ │ │ │ -
127class PeriodicPreBasisFactory
│ │ │ │ -
128{
│ │ │ │ -
129public:
│ │ │ │ -
130 PeriodicPreBasisFactory()
│ │ │ │ -
131 {}
│ │ │ │ -
132
│ │ │ │ -
133 template<class RPBI, class PIS>
│ │ │ │ -
134 PeriodicPreBasisFactory(RPBI&& rawPreBasisIndicator, PIS&& periodicIndexSet) :
│ │ │ │ -
135 rawPreBasisIndicator_(std::forward<RPBI>(rawPreBasisIndicator)),
│ │ │ │ -
136 periodicIndexSet_(std::forward<PIS>(periodicIndexSet))
│ │ │ │ -
137 {}
│ │ │ │ -
138
│ │ │ │ -
139 template<class GridView,
│ │ │ │ -
140 std::enable_if_t<models<Concept::GlobalBasis<GridView>,RawPreBasisIndicator>(), int> = 0>
│ │ │ │ -
141 auto operator()(const GridView& gridView) const
│ │ │ │ -
142 {
│ │ │ │ -
143 const auto& rawPreBasis = rawPreBasisIndicator_.preBasis();
│ │ │ │ -
144 auto transformation = PeriodicIndexingTransformation(rawPreBasis, periodicIndexSet_.indexPairSet());
│ │ │ │ -
145 return Dune::Functions::Experimental::TransformedIndexPreBasis(std::move(rawPreBasis), std::move(transformation));
│ │ │ │ -
146 }
│ │ │ │ +
66 public:
│ │ │ │ + │ │ │ │ +
68 using Element = typename EntitySet::Element;
│ │ │ │ +
69
│ │ │ │ +
70 protected:
│ │ │ │ +
71 LocalFunctionBase(const std::shared_ptr<const Data>& data)
│ │ │ │ +
72 : data_(data)
│ │ │ │ +
73 , localView_(data_->basis->localView())
│ │ │ │ +
74 {
│ │ │ │ +
75 localDoFs_.reserve(localView_.maxSize());
│ │ │ │ +
76 }
│ │ │ │ +
77
│ │ │ │ + │ │ │ │ +
85 : data_(other.data_)
│ │ │ │ +
86 , localView_(other.localView_)
│ │ │ │ +
87 {
│ │ │ │ +
88 localDoFs_.reserve(localView_.maxSize());
│ │ │ │ +
89 if (bound())
│ │ │ │ +
90 localDoFs_ = other.localDoFs_;
│ │ │ │ +
91 }
│ │ │ │ +
92
│ │ │ │ + │ │ │ │ +
101 {
│ │ │ │ +
102 data_ = other.data_;
│ │ │ │ +
103 localView_ = other.localView_;
│ │ │ │ +
104 if (bound())
│ │ │ │ +
105 localDoFs_ = other.localDoFs_;
│ │ │ │ +
106 return *this;
│ │ │ │ +
107 }
│ │ │ │ +
108
│ │ │ │ +
109 public:
│ │ │ │ +
116 void bind(const Element& element)
│ │ │ │ +
117 {
│ │ │ │ +
118 localView_.bind(element);
│ │ │ │ +
119 // Use cache of full local view size. For a subspace basis,
│ │ │ │ +
120 // this may be larger than the number of local DOFs in the
│ │ │ │ +
121 // tree. In this case only cache entries associated to local
│ │ │ │ +
122 // DOFs in the subspace are filled. Cache entries associated
│ │ │ │ +
123 // to local DOFs which are not contained in the subspace will
│ │ │ │ +
124 // not be touched.
│ │ │ │ +
125 //
│ │ │ │ +
126 // Alternatively one could use a cache that exactly fits
│ │ │ │ +
127 // the size of the tree. However, this would require to
│ │ │ │ +
128 // subtract an offset from localIndex(i) on each cache
│ │ │ │ +
129 // access in operator().
│ │ │ │ +
130 localDoFs_.resize(localView_.size());
│ │ │ │ +
131 const auto& dofs = *data_->coefficients;
│ │ │ │ +
132 for (size_type i = 0; i < localView_.tree().size(); ++i)
│ │ │ │ +
133 {
│ │ │ │ +
134 // For a subspace basis the index-within-tree i
│ │ │ │ +
135 // is not the same as the localIndex within the
│ │ │ │ +
136 // full local view.
│ │ │ │ +
137 size_t localIndex = localView_.tree().localIndex(i);
│ │ │ │ +
138 localDoFs_[localIndex] = dofs[localView_.index(localIndex)];
│ │ │ │ +
139 }
│ │ │ │ +
140 }
│ │ │ │ +
141
│ │ │ │ +
143 void unbind()
│ │ │ │ +
144 {
│ │ │ │ +
145 localView_.unbind();
│ │ │ │ +
146 }
│ │ │ │
147
│ │ │ │ -
148 template<class GridView,
│ │ │ │ -
149 std::enable_if_t<models<Concept::PreBasis<GridView>,RawPreBasisIndicator>(), int> = 0>
│ │ │ │ -
150 auto operator()(const GridView& gridView) const
│ │ │ │ -
151 {
│ │ │ │ -
152 const auto& rawPreBasis = rawPreBasisIndicator_;
│ │ │ │ -
153 auto transformation = PeriodicIndexingTransformation(rawPreBasis, periodicIndexSet_.indexPairSet());
│ │ │ │ -
154 return Dune::Functions::Experimental::TransformedIndexPreBasis(std::move(rawPreBasis), std::move(transformation));
│ │ │ │ -
155 }
│ │ │ │ -
156
│ │ │ │ -
157 template<class GridView,
│ │ │ │ -
158 std::enable_if_t<not models<Concept::GlobalBasis<GridView>,RawPreBasisIndicator>(), int> = 0,
│ │ │ │ -
159 std::enable_if_t<not models<Concept::PreBasis<GridView>,RawPreBasisIndicator>(), int> = 0>
│ │ │ │ -
160 auto operator()(const GridView& gridView) const
│ │ │ │ -
161 {
│ │ │ │ -
162 auto rawPreBasis = rawPreBasisIndicator_(gridView);
│ │ │ │ -
163 rawPreBasis.initializeIndices();
│ │ │ │ -
164 auto transformation = PeriodicIndexingTransformation(rawPreBasis, periodicIndexSet_.indexPairSet());
│ │ │ │ -
165 return Dune::Functions::Experimental::TransformedIndexPreBasis(std::move(rawPreBasis), std::move(transformation));
│ │ │ │ -
166 }
│ │ │ │ -
167
│ │ │ │ -
168private:
│ │ │ │ -
169 RawPreBasisIndicator rawPreBasisIndicator_;
│ │ │ │ -
170 PeriodicIndexSet periodicIndexSet_;
│ │ │ │ -
171};
│ │ │ │ -
172
│ │ │ │ -
173} // end namespace BasisFactory::Impl
│ │ │ │ -
174
│ │ │ │ -
175
│ │ │ │ -
176
│ │ │ │ -
190template<class RawPreBasisIndicator, class PIS>
│ │ │ │ - │ │ │ │ -
192 RawPreBasisIndicator&& rawPreBasisIndicator,
│ │ │ │ -
193 PIS&& periodicIndexSet
│ │ │ │ -
194 )
│ │ │ │ -
195{
│ │ │ │ -
196 return Impl::PeriodicPreBasisFactory<std::decay_t<RawPreBasisIndicator>>(
│ │ │ │ -
197 std::forward<RawPreBasisIndicator>(rawPreBasisIndicator),
│ │ │ │ -
198 std::forward<PIS>(periodicIndexSet));
│ │ │ │ -
199}
│ │ │ │ -
200
│ │ │ │ -
201} // end namespace Experimental
│ │ │ │ -
202
│ │ │ │ -
203} // end namespace BasisFactory
│ │ │ │ -
204
│ │ │ │ -
205} // end namespace Dune::Functions
│ │ │ │ -
206
│ │ │ │ -
207#endif // DUNE_FUFEM_PERIODICBASIS_HH
│ │ │ │ - │ │ │ │ -
auto periodic(RawPreBasisIndicator &&rawPreBasisIndicator, PIS &&periodicIndexSet)
Create a pre-basis factory that can create a periodic pre-basis.
Definition: periodicbasis.hh:191
│ │ │ │ -
Definition: polynomial.hh:11
│ │ │ │ -
TransformedIndexPreBasis(RPB &&, T &&) -> TransformedIndexPreBasis< std::decay_t< RPB >, std::decay_t< T > >
│ │ │ │ -
Container storing identified indices for a periodic basis.
Definition: periodicbasis.hh:36
│ │ │ │ -
void unifyIndexPair(std::size_t a, std::size_t b)
Insert a pair of indices.
Definition: periodicbasis.hh:47
│ │ │ │ -
const auto & indexPairSet() const
Definition: periodicbasis.hh:56
│ │ │ │ - │ │ │ │ +
149 bool bound() const
│ │ │ │ +
150 {
│ │ │ │ +
151 return localView_.bound();
│ │ │ │ +
152 }
│ │ │ │ +
153
│ │ │ │ +
155 const Element& localContext() const
│ │ │ │ +
156 {
│ │ │ │ +
157 return localView_.element();
│ │ │ │ +
158 }
│ │ │ │ +
159
│ │ │ │ +
160 protected:
│ │ │ │ +
161
│ │ │ │ +
162 template<class To, class From>
│ │ │ │ +
163 void assignWith(To& to, const From& from) const
│ │ │ │ +
164 {
│ │ │ │ +
165 auto from_flat = flatVectorView(from);
│ │ │ │ +
166 auto to_flat = flatVectorView(to);
│ │ │ │ +
167 assert(from_flat.size() == to_flat.size());
│ │ │ │ +
168 for (size_type i = 0; i < to_flat.size(); ++i)
│ │ │ │ +
169 to_flat[i] = from_flat[i];
│ │ │ │ +
170 }
│ │ │ │ +
171
│ │ │ │ +
172 template<class Node, class TreePath, class Range>
│ │ │ │ +
173 decltype(auto) nodeToRangeEntry(const Node& node, const TreePath& treePath, Range& y) const
│ │ │ │ +
174 {
│ │ │ │ +
175 return (*data_->nodeToRangeEntry)(node, treePath, y);
│ │ │ │ +
176 }
│ │ │ │ +
177
│ │ │ │ +
178 std::shared_ptr<const Data> data_;
│ │ │ │ +
179 LocalView localView_;
│ │ │ │ +
180 std::vector<Coefficient> localDoFs_;
│ │ │ │ +
181 };
│ │ │ │ +
182
│ │ │ │ +
183protected:
│ │ │ │ +
184 DiscreteGlobalBasisFunctionBase(const std::shared_ptr<const Data>& data)
│ │ │ │ +
185 : data_(data)
│ │ │ │ +
186 {
│ │ │ │ +
187 /* Nothing. */
│ │ │ │ +
188 }
│ │ │ │ +
189
│ │ │ │ +
190public:
│ │ │ │ +
191
│ │ │ │ +
193 const Basis& basis() const
│ │ │ │ +
194 {
│ │ │ │ +
195 return *data_->basis;
│ │ │ │ +
196 }
│ │ │ │ +
197
│ │ │ │ +
199 const Vector& dofs() const
│ │ │ │ +
200 {
│ │ │ │ +
201 return *data_->coefficients;
│ │ │ │ +
202 }
│ │ │ │ +
203
│ │ │ │ + │ │ │ │ +
206 {
│ │ │ │ +
207 return *data_->nodeToRangeEntry;
│ │ │ │ +
208 }
│ │ │ │ +
209
│ │ │ │ +
211 const EntitySet& entitySet() const
│ │ │ │ +
212 {
│ │ │ │ +
213 return data_->entitySet;
│ │ │ │ +
214 }
│ │ │ │ +
215
│ │ │ │ +
216protected:
│ │ │ │ +
217 std::shared_ptr<const Data> data_;
│ │ │ │ +
218};
│ │ │ │ +
219
│ │ │ │ +
220} // namespace ImplDoc
│ │ │ │ +
221
│ │ │ │ +
222
│ │ │ │ +
223
│ │ │ │ +
224template<typename DGBF>
│ │ │ │ + │ │ │ │ +
226
│ │ │ │ +
264template<typename B, typename V,
│ │ │ │ +
265 typename NTRE = HierarchicNodeToRangeMap,
│ │ │ │ +
266 typename R = typename V::value_type>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
269{
│ │ │ │ + │ │ │ │ +
271 using Data = typename Base::Data;
│ │ │ │ +
272
│ │ │ │ +
273public:
│ │ │ │ +
274 using Basis = typename Base::Basis;
│ │ │ │ +
275 using Vector = typename Base::Vector;
│ │ │ │ +
276
│ │ │ │ +
277 using Domain = typename Base::Domain;
│ │ │ │ +
278 using Range = R;
│ │ │ │ +
279
│ │ │ │ +
280 using Traits = Imp::GridFunctionTraits<Range(Domain), typename Base::EntitySet, DefaultDerivativeTraits, 16>;
│ │ │ │ +
281
│ │ │ │ +
282private:
│ │ │ │ +
283
│ │ │ │ +
284 template<class Node>
│ │ │ │ +
285 using LocalBasisRange = typename Node::FiniteElement::Traits::LocalBasisType::Traits::RangeType;
│ │ │ │ +
286 template<class Node>
│ │ │ │ +
287 using NodeData = typename std::vector<LocalBasisRange<Node>>;
│ │ │ │ +
288 using PerNodeEvaluationBuffer = typename TypeTree::TreeContainer<NodeData, typename Base::Tree>;
│ │ │ │ +
289
│ │ │ │ +
290public:
│ │ │ │ + │ │ │ │ + │ │ │ │ +
293 {
│ │ │ │ +
294 using LocalBase = typename Base::LocalFunctionBase;
│ │ │ │ +
295 using size_type = typename Base::Tree::size_type;
│ │ │ │ +
296 using LocalBase::nodeToRangeEntry;
│ │ │ │ +
297
│ │ │ │ +
298 public:
│ │ │ │ +
299
│ │ │ │ + │ │ │ │ +
301 using Domain = typename LocalBase::Domain;
│ │ │ │ + │ │ │ │ +
303 using Element = typename LocalBase::Element;
│ │ │ │ +
304
│ │ │ │ + │ │ │ │ +
307 : LocalBase(globalFunction.data_)
│ │ │ │ +
308 , evaluationBuffer_(this->localView_.tree())
│ │ │ │ +
309 {
│ │ │ │ +
310 /* Nothing. */
│ │ │ │ +
311 }
│ │ │ │ +
312
│ │ │ │ +
322 Range operator()(const Domain& x) const
│ │ │ │ +
323 {
│ │ │ │ +
324 Range y;
│ │ │ │ +
325 istlVectorBackend(y) = 0;
│ │ │ │ +
326
│ │ │ │ +
327 TypeTree::forEachLeafNode(this->localView_.tree(), [&](auto&& node, auto&& treePath) {
│ │ │ │ +
328 const auto& fe = node.finiteElement();
│ │ │ │ +
329 const auto& localBasis = fe.localBasis();
│ │ │ │ +
330 auto& shapeFunctionValues = evaluationBuffer_[treePath];
│ │ │ │ +
331
│ │ │ │ +
332 localBasis.evaluateFunction(x, shapeFunctionValues);
│ │ │ │ +
333
│ │ │ │ +
334 // Compute linear combinations of basis function jacobian.
│ │ │ │ +
335 // Non-scalar coefficients of dimension coeffDim are handled by
│ │ │ │ +
336 // processing the coeffDim linear combinations independently
│ │ │ │ +
337 // and storing them as entries of an array.
│ │ │ │ +
338 using Value = LocalBasisRange< std::decay_t<decltype(node)> >;
│ │ │ │ +
339 static constexpr auto coeffDim = decltype(flatVectorView(this->localDoFs_[node.localIndex(0)]).size())::value;
│ │ │ │ +
340 auto values = std::array<Value, coeffDim>{};
│ │ │ │ +
341 istlVectorBackend(values) = 0;
│ │ │ │ +
342 for (size_type i = 0; i < localBasis.size(); ++i)
│ │ │ │ +
343 {
│ │ │ │ +
344 auto c = flatVectorView(this->localDoFs_[node.localIndex(i)]);
│ │ │ │ +
345 for (std::size_t j = 0; j < coeffDim; ++j)
│ │ │ │ +
346 values[j].axpy(c[j], shapeFunctionValues[i]);
│ │ │ │ +
347 }
│ │ │ │ +
348
│ │ │ │ +
349 // Assign computed values to node entry of range.
│ │ │ │ +
350 // Types are matched using the lexicographic ordering provided by flatVectorView.
│ │ │ │ +
351 LocalBase::assignWith(nodeToRangeEntry(node, treePath, y), values);
│ │ │ │ +
352 });
│ │ │ │ +
353
│ │ │ │ +
354 return y;
│ │ │ │ +
355 }
│ │ │ │ +
356
│ │ │ │ + │ │ │ │ +
359 {
│ │ │ │ + │ │ │ │ +
361 if (lf.bound())
│ │ │ │ +
362 dlf.bind(lf.localContext());
│ │ │ │ +
363 return dlf;
│ │ │ │ +
364 }
│ │ │ │ +
365
│ │ │ │ +
366 private:
│ │ │ │ +
367 mutable PerNodeEvaluationBuffer evaluationBuffer_;
│ │ │ │ +
368 };
│ │ │ │ +
369
│ │ │ │ +
371 template<class B_T, class V_T, class NTRE_T>
│ │ │ │ +
372 DiscreteGlobalBasisFunction(B_T && basis, V_T && coefficients, NTRE_T&& nodeToRangeEntry)
│ │ │ │ +
373 : Base(std::make_shared<Data>(Data{{basis.gridView()}, wrap_or_move(std::forward<B_T>(basis)), wrap_or_move(std::forward<V_T>(coefficients)), wrap_or_move(std::forward<NTRE_T>(nodeToRangeEntry))}))
│ │ │ │ +
374 {}
│ │ │ │ +
375
│ │ │ │ +
377 DiscreteGlobalBasisFunction(std::shared_ptr<const Basis> basis, std::shared_ptr<const V> coefficients, std::shared_ptr<const typename Base::NodeToRangeEntry> nodeToRangeEntry)
│ │ │ │ +
378 : Base(std::make_shared<Data>(Data{{basis->gridView()}, basis, coefficients, nodeToRangeEntry}))
│ │ │ │ +
379 {}
│ │ │ │ +
380
│ │ │ │ +
382 Range operator() (const Domain& x) const
│ │ │ │ +
383 {
│ │ │ │ +
384 // TODO: Implement this using hierarchic search
│ │ │ │ +
385 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │ +
386 }
│ │ │ │ +
387
│ │ │ │ + │ │ │ │ +
390 {
│ │ │ │ + │ │ │ │ +
392 }
│ │ │ │ +
393
│ │ │ │ + │ │ │ │ +
403 {
│ │ │ │ +
404 return LocalFunction(t);
│ │ │ │ +
405 }
│ │ │ │ +
406};
│ │ │ │ +
407
│ │ │ │ +
408
│ │ │ │ +
431template<typename R, typename B, typename V>
│ │ │ │ +
432auto makeDiscreteGlobalBasisFunction(B&& basis, V&& vector)
│ │ │ │ +
433{
│ │ │ │ +
434 using Basis = std::decay_t<B>;
│ │ │ │ +
435 using NTREM = HierarchicNodeToRangeMap;
│ │ │ │ +
436
│ │ │ │ +
437 // Small helper functions to wrap vectors using istlVectorBackend
│ │ │ │ +
438 // if they do not already satisfy the VectorBackend interface.
│ │ │ │ +
439 auto toConstVectorBackend = [&](auto&& v) -> decltype(auto) {
│ │ │ │ +
440 if constexpr (models<Concept::ConstVectorBackend<Basis>, decltype(v)>()) {
│ │ │ │ +
441 return std::forward<decltype(v)>(v);
│ │ │ │ +
442 } else {
│ │ │ │ +
443 return istlVectorBackend(v);
│ │ │ │ +
444 }
│ │ │ │ +
445 };
│ │ │ │ +
446
│ │ │ │ +
447 using Vector = std::decay_t<decltype(toConstVectorBackend(std::forward<V>(vector)))>;
│ │ │ │ + │ │ │ │ +
449 std::forward<B>(basis),
│ │ │ │ +
450 toConstVectorBackend(std::forward<V>(vector)),
│ │ │ │ + │ │ │ │ +
452}
│ │ │ │ +
453
│ │ │ │ +
454
│ │ │ │ +
469template<typename DGBF>
│ │ │ │ + │ │ │ │ +
471 : public ImplDoc::DiscreteGlobalBasisFunctionBase<typename DGBF::Basis, typename DGBF::Vector, typename DGBF::NodeToRangeEntry>
│ │ │ │ +
472{
│ │ │ │ + │ │ │ │ +
474 using Data = typename Base::Data;
│ │ │ │ +
475
│ │ │ │ +
476public:
│ │ │ │ + │ │ │ │ +
478
│ │ │ │ +
479 using Basis = typename Base::Basis;
│ │ │ │ +
480 using Vector = typename Base::Vector;
│ │ │ │ +
481
│ │ │ │ +
482 using Domain = typename Base::Domain;
│ │ │ │ + │ │ │ │ +
484
│ │ │ │ +
485 using Traits = Imp::GridFunctionTraits<Range(Domain), typename Base::EntitySet, DefaultDerivativeTraits, 16>;
│ │ │ │ +
486
│ │ │ │ +
487private:
│ │ │ │ +
488
│ │ │ │ +
489 template<class Node>
│ │ │ │ +
490 using LocalBasisRange = typename Node::FiniteElement::Traits::LocalBasisType::Traits::JacobianType;
│ │ │ │ +
491 template<class Node>
│ │ │ │ +
492 using NodeData = typename std::vector< LocalBasisRange<Node> >;
│ │ │ │ +
493 using PerNodeEvaluationBuffer = typename TypeTree::TreeContainer<NodeData, typename Base::Tree>;
│ │ │ │ +
494
│ │ │ │ +
495public:
│ │ │ │ +
496
│ │ │ │ + │ │ │ │ + │ │ │ │ +
506 {
│ │ │ │ +
507 using LocalBase = typename Base::LocalFunctionBase;
│ │ │ │ +
508 using size_type = typename Base::Tree::size_type;
│ │ │ │ +
509 using LocalBase::nodeToRangeEntry;
│ │ │ │ +
510
│ │ │ │ +
511 public:
│ │ │ │ + │ │ │ │ +
513 using Domain = typename LocalBase::Domain;
│ │ │ │ + │ │ │ │ +
515 using Element = typename LocalBase::Element;
│ │ │ │ +
516
│ │ │ │ +
518 LocalFunction(const GlobalFunction& globalFunction)
│ │ │ │ +
519 : LocalBase(globalFunction.data_)
│ │ │ │ +
520 , evaluationBuffer_(this->localView_.tree())
│ │ │ │ +
521 {
│ │ │ │ +
522 /* Nothing. */
│ │ │ │ +
523 }
│ │ │ │ +
524
│ │ │ │ +
531 void bind(const Element& element)
│ │ │ │ +
532 {
│ │ │ │ +
533 LocalBase::bind(element);
│ │ │ │ +
534 geometry_.emplace(element.geometry());
│ │ │ │ +
535 }
│ │ │ │ +
536
│ │ │ │ +
538 void unbind()
│ │ │ │ +
539 {
│ │ │ │ +
540 geometry_.reset();
│ │ │ │ +
541 LocalBase::unbind();
│ │ │ │ +
542 }
│ │ │ │ +
543
│ │ │ │ +
557 Range operator()(const Domain& x) const
│ │ │ │ +
558 {
│ │ │ │ +
559 Range y;
│ │ │ │ +
560 istlVectorBackend(y) = 0;
│ │ │ │ +
561
│ │ │ │ +
562 const auto& jacobianInverse = geometry_->jacobianInverse(x);
│ │ │ │ +
563
│ │ │ │ +
564 TypeTree::forEachLeafNode(this->localView_.tree(), [&](auto&& node, auto&& treePath) {
│ │ │ │ +
565 const auto& fe = node.finiteElement();
│ │ │ │ +
566 const auto& localBasis = fe.localBasis();
│ │ │ │ +
567 auto& shapeFunctionJacobians = evaluationBuffer_[treePath];
│ │ │ │ +
568
│ │ │ │ +
569 localBasis.evaluateJacobian(x, shapeFunctionJacobians);
│ │ │ │ +
570
│ │ │ │ +
571 // Compute linear combinations of basis function jacobian.
│ │ │ │ +
572 // Non-scalar coefficients of dimension coeffDim are handled by
│ │ │ │ +
573 // processing the coeffDim linear combinations independently
│ │ │ │ +
574 // and storing them as entries of an array.
│ │ │ │ +
575 using RefJacobian = LocalBasisRange< std::decay_t<decltype(node)> >;
│ │ │ │ +
576 static constexpr auto coeffDim = decltype(flatVectorView(this->localDoFs_[node.localIndex(0)]).size())::value;
│ │ │ │ +
577 auto refJacobians = std::array<RefJacobian, coeffDim>{};
│ │ │ │ +
578 istlVectorBackend(refJacobians) = 0;
│ │ │ │ +
579 for (size_type i = 0; i < localBasis.size(); ++i)
│ │ │ │ +
580 {
│ │ │ │ +
581 auto c = flatVectorView(this->localDoFs_[node.localIndex(i)]);
│ │ │ │ +
582 for (std::size_t j = 0; j < coeffDim; ++j)
│ │ │ │ +
583 refJacobians[j].axpy(c[j], shapeFunctionJacobians[i]);
│ │ │ │ +
584 }
│ │ │ │ +
585
│ │ │ │ +
586 // Transform Jacobians form local to global coordinates.
│ │ │ │ +
587 using Jacobian = decltype(refJacobians[0] * jacobianInverse);
│ │ │ │ +
588 auto jacobians = std::array<Jacobian, coeffDim>{};
│ │ │ │ +
589 std::transform(
│ │ │ │ +
590 refJacobians.begin(), refJacobians.end(), jacobians.begin(),
│ │ │ │ +
591 [&](const auto& refJacobian) { return refJacobian * jacobianInverse; });
│ │ │ │ +
592
│ │ │ │ +
593 // Assign computed Jacobians to node entry of range.
│ │ │ │ +
594 // Types are matched using the lexicographic ordering provided by flatVectorView.
│ │ │ │ +
595 LocalBase::assignWith(nodeToRangeEntry(node, treePath, y), jacobians);
│ │ │ │ +
596 });
│ │ │ │ +
597
│ │ │ │ +
598 return y;
│ │ │ │ +
599 }
│ │ │ │ +
600
│ │ │ │ + │ │ │ │ +
603 {
│ │ │ │ +
604 DUNE_THROW(NotImplemented, "derivative of derivative is not implemented");
│ │ │ │ +
605 }
│ │ │ │ +
606
│ │ │ │ +
607 private:
│ │ │ │ +
608 mutable PerNodeEvaluationBuffer evaluationBuffer_;
│ │ │ │ +
609 std::optional<typename Element::Geometry> geometry_;
│ │ │ │ +
610 };
│ │ │ │ +
611
│ │ │ │ +
618 DiscreteGlobalBasisFunctionDerivative(const std::shared_ptr<const Data>& data)
│ │ │ │ +
619 : Base(data)
│ │ │ │ +
620 {
│ │ │ │ +
621 /* Nothing. */
│ │ │ │ +
622 }
│ │ │ │ +
623
│ │ │ │ +
625 Range operator()(const Domain& x) const
│ │ │ │ +
626 {
│ │ │ │ +
627 // TODO: Implement this using hierarchic search
│ │ │ │ +
628 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │ +
629 }
│ │ │ │ +
630
│ │ │ │ + │ │ │ │ +
632 {
│ │ │ │ +
633 DUNE_THROW(NotImplemented, "derivative of derivative is not implemented");
│ │ │ │ +
634 }
│ │ │ │ +
635
│ │ │ │ + │ │ │ │ +
638 {
│ │ │ │ +
639 return LocalFunction(f);
│ │ │ │ +
640 }
│ │ │ │ +
641};
│ │ │ │ +
642
│ │ │ │ +
643
│ │ │ │ +
644} // namespace Functions
│ │ │ │ +
645} // namespace Dune
│ │ │ │ +
646
│ │ │ │ +
647#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
auto makeDiscreteGlobalBasisFunction(B &&basis, V &&vector)
Generate a DiscreteGlobalBasisFunction.
Definition: discreteglobalbasisfunction.hh:432
│ │ │ │ +
auto istlVectorBackend(Vector &v)
Return a vector backend wrapping non-const ISTL like containers.
Definition: istlvectorbackend.hh:346
│ │ │ │ +
Definition: polynomial.hh:10
│ │ │ │ +
auto flatVectorView(T &t)
Create flat vector view of passed mutable container.
Definition: flatvectorview.hh:179
│ │ │ │ +
Default implementation for derivative traits.
Definition: defaultderivativetraits.hh:37
│ │ │ │ +
Helper class to deduce the signature of a callable.
Definition: signature.hh:56
│ │ │ │ +
A simple node to range map using the nested tree indices.
Definition: hierarchicnodetorangemap.hh:30
│ │ │ │ +
Definition: discreteglobalbasisfunction.hh:28
│ │ │ │ +
std::shared_ptr< const Data > data_
Definition: discreteglobalbasisfunction.hh:217
│ │ │ │ +
const Vector & dofs() const
Return the coefficients of this discrete function by reference.
Definition: discreteglobalbasisfunction.hh:199
│ │ │ │ +
B Basis
Definition: discreteglobalbasisfunction.hh:30
│ │ │ │ +
typename Basis::LocalView::Tree Tree
Definition: discreteglobalbasisfunction.hh:39
│ │ │ │ +
V Vector
Definition: discreteglobalbasisfunction.hh:31
│ │ │ │ +
typename EntitySet::Element Element
Definition: discreteglobalbasisfunction.hh:45
│ │ │ │ +
typename EntitySet::LocalCoordinate LocalDomain
Definition: discreteglobalbasisfunction.hh:44
│ │ │ │ +
const NodeToRangeEntry & nodeToRangeEntry() const
Return the stored node-to-range map.
Definition: discreteglobalbasisfunction.hh:205
│ │ │ │ +
NTRE NodeToRangeEntry
Definition: discreteglobalbasisfunction.hh:40
│ │ │ │ +
DiscreteGlobalBasisFunctionBase(const std::shared_ptr< const Data > &data)
Definition: discreteglobalbasisfunction.hh:184
│ │ │ │ +
typename Basis::GridView GridView
Definition: discreteglobalbasisfunction.hh:37
│ │ │ │ +
const Basis & basis() const
Return a const reference to the stored basis.
Definition: discreteglobalbasisfunction.hh:193
│ │ │ │ +
GridViewEntitySet< GridView, 0 > EntitySet
Definition: discreteglobalbasisfunction.hh:38
│ │ │ │ +
const EntitySet & entitySet() const
Get associated set of entities the local-function can be bound to.
Definition: discreteglobalbasisfunction.hh:211
│ │ │ │ +
typename EntitySet::GlobalCoordinate Domain
Definition: discreteglobalbasisfunction.hh:42
│ │ │ │ +
Dune::AutonomousValue< decltype(std::declval< Vector >()[std::declval< typename Basis::MultiIndex >()])> Coefficient
Definition: discreteglobalbasisfunction.hh:35
│ │ │ │ +
Definition: discreteglobalbasisfunction.hh:53
│ │ │ │ +
EntitySet entitySet
Definition: discreteglobalbasisfunction.hh:54
│ │ │ │ +
std::shared_ptr< const NodeToRangeEntry > nodeToRangeEntry
Definition: discreteglobalbasisfunction.hh:57
│ │ │ │ +
std::shared_ptr< const Basis > basis
Definition: discreteglobalbasisfunction.hh:55
│ │ │ │ +
std::shared_ptr< const Vector > coefficients
Definition: discreteglobalbasisfunction.hh:56
│ │ │ │ + │ │ │ │ +
LocalFunctionBase & operator=(const LocalFunctionBase &other)
Copy-assignment of the local-function.
Definition: discreteglobalbasisfunction.hh:100
│ │ │ │ +
bool bound() const
Check if LocalFunction is already bound to an element.
Definition: discreteglobalbasisfunction.hh:149
│ │ │ │ +
void bind(const Element &element)
Bind LocalFunction to grid element.
Definition: discreteglobalbasisfunction.hh:116
│ │ │ │ +
typename EntitySet::Element Element
Definition: discreteglobalbasisfunction.hh:68
│ │ │ │ +
const Element & localContext() const
Return the element the local-function is bound to.
Definition: discreteglobalbasisfunction.hh:155
│ │ │ │ +
LocalFunctionBase(const LocalFunctionBase &other)
Copy-construct the local-function.
Definition: discreteglobalbasisfunction.hh:84
│ │ │ │ +
std::vector< Coefficient > localDoFs_
Definition: discreteglobalbasisfunction.hh:180
│ │ │ │ +
void assignWith(To &to, const From &from) const
Definition: discreteglobalbasisfunction.hh:163
│ │ │ │ +
std::shared_ptr< const Data > data_
Definition: discreteglobalbasisfunction.hh:178
│ │ │ │ +
decltype(auto) nodeToRangeEntry(const Node &node, const TreePath &treePath, Range &y) const
Definition: discreteglobalbasisfunction.hh:173
│ │ │ │ +
LocalView localView_
Definition: discreteglobalbasisfunction.hh:179
│ │ │ │ +
void unbind()
Unbind the local-function.
Definition: discreteglobalbasisfunction.hh:143
│ │ │ │ +
LocalDomain Domain
Definition: discreteglobalbasisfunction.hh:67
│ │ │ │ +
LocalFunctionBase(const std::shared_ptr< const Data > &data)
Definition: discreteglobalbasisfunction.hh:71
│ │ │ │ +
Derivative of a DiscreteGlobalBasisFunction
Definition: discreteglobalbasisfunction.hh:472
│ │ │ │ +
typename Base::Basis Basis
Definition: discreteglobalbasisfunction.hh:479
│ │ │ │ +
friend Traits::DerivativeInterface derivative(const DiscreteGlobalBasisFunctionDerivative &f)
Definition: discreteglobalbasisfunction.hh:631
│ │ │ │ +
Range operator()(const Domain &x) const
Not implemented.
Definition: discreteglobalbasisfunction.hh:625
│ │ │ │ +
typename SignatureTraits< typename DiscreteGlobalBasisFunction::Traits::DerivativeInterface >::Range Range
Definition: discreteglobalbasisfunction.hh:483
│ │ │ │ +
friend LocalFunction localFunction(const DiscreteGlobalBasisFunctionDerivative &f)
Construct local function from a DiscreteGlobalBasisFunctionDerivative
Definition: discreteglobalbasisfunction.hh:637
│ │ │ │ +
DiscreteGlobalBasisFunctionDerivative(const std::shared_ptr< const Data > &data)
create object from DiscreateGlobalBasisFunction data
Definition: discreteglobalbasisfunction.hh:618
│ │ │ │ +
DGBF DiscreteGlobalBasisFunction
Definition: discreteglobalbasisfunction.hh:477
│ │ │ │ +
typename Base::Vector Vector
Definition: discreteglobalbasisfunction.hh:480
│ │ │ │ +
Imp::GridFunctionTraits< Range(Domain), typename Base::EntitySet, DefaultDerivativeTraits, 16 > Traits
Definition: discreteglobalbasisfunction.hh:485
│ │ │ │ +
typename Base::Domain Domain
Definition: discreteglobalbasisfunction.hh:482
│ │ │ │ +
A grid function induced by a global basis and a coefficient vector.
Definition: discreteglobalbasisfunction.hh:269
│ │ │ │ +
friend DiscreteGlobalBasisFunctionDerivative< DiscreteGlobalBasisFunction > derivative(const DiscreteGlobalBasisFunction &f)
Derivative of the DiscreteGlobalBasisFunction
Definition: discreteglobalbasisfunction.hh:389
│ │ │ │ +
DiscreteGlobalBasisFunction(B_T &&basis, V_T &&coefficients, NTRE_T &&nodeToRangeEntry)
Create a grid-function, by wrapping the arguments in std::shared_ptr.
Definition: discreteglobalbasisfunction.hh:372
│ │ │ │ +
DiscreteGlobalBasisFunction(std::shared_ptr< const Basis > basis, std::shared_ptr< const V > coefficients, std::shared_ptr< const typename Base::NodeToRangeEntry > nodeToRangeEntry)
Create a grid-function, by moving the arguments in std::shared_ptr.
Definition: discreteglobalbasisfunction.hh:377
│ │ │ │ +
friend LocalFunction localFunction(const DiscreteGlobalBasisFunction &t)
Construct local function from a DiscreteGlobalBasisFunction.
Definition: discreteglobalbasisfunction.hh:402
│ │ │ │ +
typename Base::Basis Basis
Definition: discreteglobalbasisfunction.hh:274
│ │ │ │ +
Imp::GridFunctionTraits< Range(Domain), typename Base::EntitySet, DefaultDerivativeTraits, 16 > Traits
Definition: discreteglobalbasisfunction.hh:280
│ │ │ │ +
R Range
Definition: discreteglobalbasisfunction.hh:278
│ │ │ │ +
typename Base::Vector Vector
Definition: discreteglobalbasisfunction.hh:275
│ │ │ │ +
typename Base::Domain Domain
Definition: discreteglobalbasisfunction.hh:277
│ │ │ │ +
Definition: discreteglobalbasisfunction.hh:293
│ │ │ │ +
GlobalFunction::Range Range
Definition: discreteglobalbasisfunction.hh:302
│ │ │ │ +
LocalFunction(const DiscreteGlobalBasisFunction &globalFunction)
Create a local-function from the associated grid-function.
Definition: discreteglobalbasisfunction.hh:306
│ │ │ │ +
friend DiscreteGlobalBasisFunctionDerivative< DiscreteGlobalBasisFunction >::LocalFunction derivative(const LocalFunction &lf)
Local function of the derivative.
Definition: discreteglobalbasisfunction.hh:358
│ │ │ │ +
Range operator()(const Domain &x) const
Evaluate this local-function in coordinates x in the bound element.
Definition: discreteglobalbasisfunction.hh:322
│ │ │ │ +
local function evaluating the derivative in reference coordinates
Definition: discreteglobalbasisfunction.hh:506
│ │ │ │ +
Range operator()(const Domain &x) const
Evaluate this local-function in coordinates x in the bound element.
Definition: discreteglobalbasisfunction.hh:557
│ │ │ │ +
friend Traits::LocalFunctionTraits::DerivativeInterface derivative(const LocalFunction &)
Not implemented.
Definition: discreteglobalbasisfunction.hh:602
│ │ │ │ +
GlobalFunction::Range Range
Definition: discreteglobalbasisfunction.hh:514
│ │ │ │ +
void unbind()
Unbind the local-function.
Definition: discreteglobalbasisfunction.hh:538
│ │ │ │ +
LocalFunction(const GlobalFunction &globalFunction)
Create a local function from the associated grid function.
Definition: discreteglobalbasisfunction.hh:518
│ │ │ │ +
void bind(const Element &element)
Bind LocalFunction to grid element.
Definition: discreteglobalbasisfunction.hh:531
│ │ │ │ +
Definition: gridfunction.hh:32
│ │ │ │ + │ │ │ │ +
GridView::template Codim< codim >::Entity Element
Type of Elements contained in this EntitySet.
Definition: gridviewentityset.hh:32
│ │ │ │ +
Element::Geometry::LocalCoordinate LocalCoordinate
Type of local coordinates with respect to the Element.
Definition: gridviewentityset.hh:35
│ │ │ │ +
Element::Geometry::GlobalCoordinate GlobalCoordinate
Definition: gridviewentityset.hh:36
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,228 +4,843 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-functions 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * functions │ │ │ │ │ - * functionspacebases │ │ │ │ │ -periodicbasis.hh │ │ │ │ │ + * gridfunctions │ │ │ │ │ +discreteglobalbasisfunction.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#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_PERIODICBASIS_HH │ │ │ │ │ - 4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_PERIODICBASIS_HH │ │ │ │ │ + 3#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH │ │ │ │ │ + 4#define DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#include │ │ │ │ │ - 7#include │ │ │ │ │ - 8#include │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11 │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14 │ │ │ │ │ - 15 │ │ │ │ │ - 16namespace Dune::Functions { │ │ │ │ │ - 17 │ │ │ │ │ - 18namespace BasisFactory { │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8 │ │ │ │ │ + 9#include │ │ │ │ │ + 10 │ │ │ │ │ + 11#include │ │ │ │ │ + 12 │ │ │ │ │ + 13#include │ │ │ │ │ + 14#include │ │ │ │ │ + 15#include │ │ │ │ │ + 16#include │ │ │ │ │ + 17#include │ │ │ │ │ + 18#include │ │ │ │ │ 19 │ │ │ │ │ - 20// The PeriodicBasis class is in the Experimental namespace because we are │ │ │ │ │ - 21// not completely sure yet whether we like it. We reserve the right to │ │ │ │ │ - 22// modify it without advance warning. Use at your own risk! │ │ │ │ │ + 20namespace Dune { │ │ │ │ │ + 21namespace Functions { │ │ │ │ │ + 22 │ │ │ │ │ 23 │ │ │ │ │ -24namespace Experimental { │ │ │ │ │ +24namespace ImplDoc { │ │ │ │ │ 25 │ │ │ │ │ - 26 │ │ │ │ │ -35class PeriodicIndexSet │ │ │ │ │ - 36{ │ │ │ │ │ - 37 using IndexPairSet = std::set>; │ │ │ │ │ - 38public: │ │ │ │ │ - 39 │ │ │ │ │ -47 void unifyIndexPair(std::size_t a, std::size_t b) │ │ │ │ │ - 48 { │ │ │ │ │ - 49 if (a>b) │ │ │ │ │ - 50 std::swap(a,b); │ │ │ │ │ - 51 if (a==b) │ │ │ │ │ - 52 return; │ │ │ │ │ - 53 indexPairSet_.insert(std::make_pair(a,b)); │ │ │ │ │ - 54 } │ │ │ │ │ - 55 │ │ │ │ │ -56 const auto& indexPairSet() const │ │ │ │ │ - 57 { │ │ │ │ │ - 58 return indexPairSet_; │ │ │ │ │ - 59 } │ │ │ │ │ - 60 │ │ │ │ │ - 61private: │ │ │ │ │ - 62 IndexPairSet indexPairSet_; │ │ │ │ │ - 63}; │ │ │ │ │ - 64 │ │ │ │ │ + 26template │ │ │ │ │ +27class DiscreteGlobalBasisFunctionBase │ │ │ │ │ + 28{ │ │ │ │ │ + 29public: │ │ │ │ │ +30 using Basis = B; │ │ │ │ │ +31 using Vector = V; │ │ │ │ │ + 32 │ │ │ │ │ + 33 // In order to make the cache work for proxy-references │ │ │ │ │ + 34 // we have to use AutonomousValue instead of std::decay_t │ │ │ │ │ +35 using Coefficient = Dune::AutonomousValue() │ │ │ │ │ +[std::declval()])>; │ │ │ │ │ + 36 │ │ │ │ │ +37 using GridView = typename Basis::GridView; │ │ │ │ │ +38 using EntitySet = GridViewEntitySet; │ │ │ │ │ +39 using Tree = typename Basis::LocalView::Tree; │ │ │ │ │ +40 using NodeToRangeEntry = NTRE; │ │ │ │ │ + 41 │ │ │ │ │ +42 using Domain = typename EntitySet::GlobalCoordinate; │ │ │ │ │ + 43 │ │ │ │ │ +44 using LocalDomain = typename EntitySet::LocalCoordinate; │ │ │ │ │ +45 using Element = typename EntitySet::Element; │ │ │ │ │ + 46 │ │ │ │ │ + 47protected: │ │ │ │ │ + 48 │ │ │ │ │ + 49 // This collects all data that is shared by all related │ │ │ │ │ + 50 // global and local functions. This way we don't need to │ │ │ │ │ + 51 // keep track of it individually. │ │ │ │ │ +52 struct Data │ │ │ │ │ + 53 { │ │ │ │ │ +54 EntitySet entitySet; │ │ │ │ │ +55 std::shared_ptr basis; │ │ │ │ │ +56 std::shared_ptr coefficients; │ │ │ │ │ +57 std::shared_ptr nodeToRangeEntry; │ │ │ │ │ + 58 }; │ │ │ │ │ + 59 │ │ │ │ │ + 60public: │ │ │ │ │ +61 class LocalFunctionBase │ │ │ │ │ + 62 { │ │ │ │ │ + 63 using LocalView = typename Basis::LocalView; │ │ │ │ │ + 64 using size_type = typename Tree::size_type; │ │ │ │ │ 65 │ │ │ │ │ - 66 │ │ │ │ │ - 67namespace Impl { │ │ │ │ │ - 68 │ │ │ │ │ - 69// An index transformation for a TransformedIndexPreBasis │ │ │ │ │ - 70// implementing periodic functions by merging indices. │ │ │ │ │ - 71// Currently only flat indices are supported. │ │ │ │ │ - 72class PeriodicIndexingTransformation │ │ │ │ │ - 73{ │ │ │ │ │ - 74public: │ │ │ │ │ - 75 │ │ │ │ │ - 76 static constexpr std::size_t minIndexSize = 1; │ │ │ │ │ - 77 static constexpr std::size_t maxIndexSize = 1; │ │ │ │ │ - 78 │ │ │ │ │ - 79 template │ │ │ │ │ - 80 PeriodicIndexingTransformation(const RawPreBasis& rawPreBasis, const │ │ │ │ │ -IndexPairSet& indexPairSet) │ │ │ │ │ - 81 { │ │ │ │ │ - 82 static_assert(RawPreBasis::maxMultiIndexSize==1, │ │ │ │ │ -"PeriodicIndexingTransformation is only implemented for flat multi-indices"); │ │ │ │ │ - 83 std::size_t invalid = {std::numeric_limits::max()}; │ │ │ │ │ - 84 mappedIdx_.resize(rawPreBasis.size(), invalid); │ │ │ │ │ - 85 numIndices_ = 0; │ │ │ │ │ - 86 std::size_t i = 0; │ │ │ │ │ - 87 for(const auto& [a, b] : indexPairSet) │ │ │ │ │ - 88 { │ │ │ │ │ - 89 for(; i<=a; ++i) │ │ │ │ │ - 90 if (mappedIdx_[i] == invalid) │ │ │ │ │ - 91 mappedIdx_[i] = numIndices_++; │ │ │ │ │ - 92 mappedIdx_[b] = mappedIdx_[a]; │ │ │ │ │ - 93 } │ │ │ │ │ - 94 for(; i │ │ │ │ │ - 100 void transformIndex(MultiIndex& multiIndex, const PreBasis& preBasis) │ │ │ │ │ -const │ │ │ │ │ + 66 public: │ │ │ │ │ +67 using Domain = LocalDomain; │ │ │ │ │ +68 using Element = typename EntitySet::Element; │ │ │ │ │ + 69 │ │ │ │ │ + 70 protected: │ │ │ │ │ +71 LocalFunctionBase(const std::shared_ptr& data) │ │ │ │ │ + 72 : data_(data) │ │ │ │ │ + 73 , localView_(data_->basis->localView()) │ │ │ │ │ + 74 { │ │ │ │ │ + 75 localDoFs_.reserve(localView_.maxSize()); │ │ │ │ │ + 76 } │ │ │ │ │ + 77 │ │ │ │ │ +84 LocalFunctionBase(const LocalFunctionBase& other) │ │ │ │ │ + 85 : data_(other.data_) │ │ │ │ │ + 86 , localView_(other.localView_) │ │ │ │ │ + 87 { │ │ │ │ │ + 88 localDoFs_.reserve(localView_.maxSize()); │ │ │ │ │ + 89 if (bound()) │ │ │ │ │ + 90 localDoFs_ = other.localDoFs_; │ │ │ │ │ + 91 } │ │ │ │ │ + 92 │ │ │ │ │ +100 LocalFunctionBase& operator=(const LocalFunctionBase& other) │ │ │ │ │ 101 { │ │ │ │ │ - 102 multiIndex = {{ mappedIdx_[multiIndex[0]] }}; │ │ │ │ │ - 103 } │ │ │ │ │ - 104 │ │ │ │ │ - 105 template │ │ │ │ │ - 106 std::size_t size(const Prefix& prefix, const PreBasis& preBasis) const │ │ │ │ │ - 107 { │ │ │ │ │ - 108 if (prefix.size() == 1) │ │ │ │ │ - 109 return 0; │ │ │ │ │ - 110 return numIndices_; │ │ │ │ │ - 111 } │ │ │ │ │ - 112 │ │ │ │ │ - 113 template │ │ │ │ │ - 114 auto dimension(const PreBasis& preBasis) const │ │ │ │ │ - 115 { │ │ │ │ │ - 116 return numIndices_; │ │ │ │ │ - 117 } │ │ │ │ │ - 118 │ │ │ │ │ - 119private: │ │ │ │ │ - 120 std::vector mappedIdx_; │ │ │ │ │ - 121 std::size_t numIndices_; │ │ │ │ │ - 122}; │ │ │ │ │ - 123 │ │ │ │ │ - 124 │ │ │ │ │ - 125 │ │ │ │ │ - 126template │ │ │ │ │ - 127class PeriodicPreBasisFactory │ │ │ │ │ - 128{ │ │ │ │ │ - 129public: │ │ │ │ │ - 130 PeriodicPreBasisFactory() │ │ │ │ │ - 131 {} │ │ │ │ │ - 132 │ │ │ │ │ - 133 template │ │ │ │ │ - 134 PeriodicPreBasisFactory(RPBI&& rawPreBasisIndicator, PIS&& │ │ │ │ │ -periodicIndexSet) : │ │ │ │ │ - 135 rawPreBasisIndicator_(std::forward(rawPreBasisIndicator)), │ │ │ │ │ - 136 periodicIndexSet_(std::forward(periodicIndexSet)) │ │ │ │ │ - 137 {} │ │ │ │ │ - 138 │ │ │ │ │ - 139 template,RawPreBasisIndicator>(), int> = 0> │ │ │ │ │ - 141 auto operator()(const GridView& gridView) const │ │ │ │ │ - 142 { │ │ │ │ │ - 143 const auto& rawPreBasis = rawPreBasisIndicator_.preBasis(); │ │ │ │ │ - 144 auto transformation = PeriodicIndexingTransformation(rawPreBasis, │ │ │ │ │ -periodicIndexSet_.indexPairSet()); │ │ │ │ │ - 145 return Dune::Functions::Experimental::TransformedIndexPreBasis(std::move │ │ │ │ │ -(rawPreBasis), std::move(transformation)); │ │ │ │ │ + 102 data_ = other.data_; │ │ │ │ │ + 103 localView_ = other.localView_; │ │ │ │ │ + 104 if (bound()) │ │ │ │ │ + 105 localDoFs_ = other.localDoFs_; │ │ │ │ │ + 106 return *this; │ │ │ │ │ + 107 } │ │ │ │ │ + 108 │ │ │ │ │ + 109 public: │ │ │ │ │ +116 void bind(const Element& element) │ │ │ │ │ + 117 { │ │ │ │ │ + 118 localView_.bind(element); │ │ │ │ │ + 119 // Use cache of full local view size. For a subspace basis, │ │ │ │ │ + 120 // this may be larger than the number of local DOFs in the │ │ │ │ │ + 121 // tree. In this case only cache entries associated to local │ │ │ │ │ + 122 // DOFs in the subspace are filled. Cache entries associated │ │ │ │ │ + 123 // to local DOFs which are not contained in the subspace will │ │ │ │ │ + 124 // not be touched. │ │ │ │ │ + 125 // │ │ │ │ │ + 126 // Alternatively one could use a cache that exactly fits │ │ │ │ │ + 127 // the size of the tree. However, this would require to │ │ │ │ │ + 128 // subtract an offset from localIndex(i) on each cache │ │ │ │ │ + 129 // access in operator(). │ │ │ │ │ + 130 localDoFs_.resize(localView_.size()); │ │ │ │ │ + 131 const auto& dofs = *data_->coefficients; │ │ │ │ │ + 132 for (size_type i = 0; i < localView_.tree().size(); ++i) │ │ │ │ │ + 133 { │ │ │ │ │ + 134 // For a subspace basis the index-within-tree i │ │ │ │ │ + 135 // is not the same as the localIndex within the │ │ │ │ │ + 136 // full local view. │ │ │ │ │ + 137 size_t localIndex = localView_.tree().localIndex(i); │ │ │ │ │ + 138 localDoFs_[localIndex] = dofs[localView_.index(localIndex)]; │ │ │ │ │ + 139 } │ │ │ │ │ + 140 } │ │ │ │ │ + 141 │ │ │ │ │ +143 void unbind() │ │ │ │ │ + 144 { │ │ │ │ │ + 145 localView_.unbind(); │ │ │ │ │ 146 } │ │ │ │ │ 147 │ │ │ │ │ - 148 template,RawPreBasisIndicator> │ │ │ │ │ -(), int> = 0> │ │ │ │ │ - 150 auto operator()(const GridView& gridView) const │ │ │ │ │ - 151 { │ │ │ │ │ - 152 const auto& rawPreBasis = rawPreBasisIndicator_; │ │ │ │ │ - 153 auto transformation = PeriodicIndexingTransformation(rawPreBasis, │ │ │ │ │ -periodicIndexSet_.indexPairSet()); │ │ │ │ │ - 154 return Dune::Functions::Experimental::TransformedIndexPreBasis(std::move │ │ │ │ │ -(rawPreBasis), std::move(transformation)); │ │ │ │ │ - 155 } │ │ │ │ │ - 156 │ │ │ │ │ - 157 template,RawPreBasisIndicator>(), int> = 0, │ │ │ │ │ - 159 std::enable_if_t,RawPreBasisIndicator>(), int> = 0> │ │ │ │ │ - 160 auto operator()(const GridView& gridView) const │ │ │ │ │ - 161 { │ │ │ │ │ - 162 auto rawPreBasis = rawPreBasisIndicator_(gridView); │ │ │ │ │ - 163 rawPreBasis.initializeIndices(); │ │ │ │ │ - 164 auto transformation = PeriodicIndexingTransformation(rawPreBasis, │ │ │ │ │ -periodicIndexSet_.indexPairSet()); │ │ │ │ │ - 165 return Dune::Functions::Experimental::TransformedIndexPreBasis(std::move │ │ │ │ │ -(rawPreBasis), std::move(transformation)); │ │ │ │ │ - 166 } │ │ │ │ │ - 167 │ │ │ │ │ - 168private: │ │ │ │ │ - 169 RawPreBasisIndicator rawPreBasisIndicator_; │ │ │ │ │ - 170 PeriodicIndexSet periodicIndexSet_; │ │ │ │ │ - 171}; │ │ │ │ │ - 172 │ │ │ │ │ - 173} // end namespace BasisFactory::Impl │ │ │ │ │ - 174 │ │ │ │ │ - 175 │ │ │ │ │ - 176 │ │ │ │ │ - 190template │ │ │ │ │ -191auto periodic( │ │ │ │ │ - 192 RawPreBasisIndicator&& rawPreBasisIndicator, │ │ │ │ │ - 193 PIS&& periodicIndexSet │ │ │ │ │ - 194 ) │ │ │ │ │ - 195{ │ │ │ │ │ - 196 return Impl::PeriodicPreBasisFactory>( │ │ │ │ │ - 197 std::forward(rawPreBasisIndicator), │ │ │ │ │ - 198 std::forward(periodicIndexSet)); │ │ │ │ │ - 199} │ │ │ │ │ - 200 │ │ │ │ │ - 201} // end namespace Experimental │ │ │ │ │ - 202 │ │ │ │ │ - 203} // end namespace BasisFactory │ │ │ │ │ - 204 │ │ │ │ │ - 205} // end namespace Dune::Functions │ │ │ │ │ - 206 │ │ │ │ │ - 207#endif // DUNE_FUFEM_PERIODICBASIS_HH │ │ │ │ │ -transformedindexbasis.hh │ │ │ │ │ -Dune::Functions::BasisFactory::Experimental::periodic │ │ │ │ │ -auto periodic(RawPreBasisIndicator &&rawPreBasisIndicator, PIS │ │ │ │ │ -&&periodicIndexSet) │ │ │ │ │ -Create a pre-basis factory that can create a periodic pre-basis. │ │ │ │ │ -Definition: periodicbasis.hh:191 │ │ │ │ │ -Dune::Functions │ │ │ │ │ -Definition: polynomial.hh:11 │ │ │ │ │ -Dune::Functions::Experimental::TransformedIndexPreBasis │ │ │ │ │ -TransformedIndexPreBasis(RPB &&, T &&) -> TransformedIndexPreBasis< std:: │ │ │ │ │ -decay_t< RPB >, std::decay_t< T > > │ │ │ │ │ -Dune::Functions::BasisFactory::Experimental::PeriodicIndexSet │ │ │ │ │ -Container storing identified indices for a periodic basis. │ │ │ │ │ -Definition: periodicbasis.hh:36 │ │ │ │ │ -Dune::Functions::BasisFactory::Experimental::PeriodicIndexSet::unifyIndexPair │ │ │ │ │ -void unifyIndexPair(std::size_t a, std::size_t b) │ │ │ │ │ -Insert a pair of indices. │ │ │ │ │ -Definition: periodicbasis.hh:47 │ │ │ │ │ -Dune::Functions::BasisFactory::Experimental::PeriodicIndexSet::indexPairSet │ │ │ │ │ -const auto & indexPairSet() const │ │ │ │ │ -Definition: periodicbasis.hh:56 │ │ │ │ │ +149 bool bound() const │ │ │ │ │ + 150 { │ │ │ │ │ + 151 return localView_.bound(); │ │ │ │ │ + 152 } │ │ │ │ │ + 153 │ │ │ │ │ +155 const Element& localContext() const │ │ │ │ │ + 156 { │ │ │ │ │ + 157 return localView_.element(); │ │ │ │ │ + 158 } │ │ │ │ │ + 159 │ │ │ │ │ + 160 protected: │ │ │ │ │ + 161 │ │ │ │ │ + 162 template │ │ │ │ │ +163 void assignWith(To& to, const From& from) const │ │ │ │ │ + 164 { │ │ │ │ │ + 165 auto from_flat = flatVectorView(from); │ │ │ │ │ + 166 auto to_flat = flatVectorView(to); │ │ │ │ │ + 167 assert(from_flat.size() == to_flat.size()); │ │ │ │ │ + 168 for (size_type i = 0; i < to_flat.size(); ++i) │ │ │ │ │ + 169 to_flat[i] = from_flat[i]; │ │ │ │ │ + 170 } │ │ │ │ │ + 171 │ │ │ │ │ + 172 template │ │ │ │ │ +173 decltype(auto) nodeToRangeEntry(const Node& node, const TreePath& treePath, │ │ │ │ │ +Range& y) const │ │ │ │ │ + 174 { │ │ │ │ │ + 175 return (*data_->nodeToRangeEntry)(node, treePath, y); │ │ │ │ │ + 176 } │ │ │ │ │ + 177 │ │ │ │ │ +178 std::shared_ptr data_; │ │ │ │ │ +179 LocalView localView_; │ │ │ │ │ +180 std::vector localDoFs_; │ │ │ │ │ + 181 }; │ │ │ │ │ + 182 │ │ │ │ │ + 183protected: │ │ │ │ │ +184 DiscreteGlobalBasisFunctionBase(const std::shared_ptr& data) │ │ │ │ │ + 185 : data_(data) │ │ │ │ │ + 186 { │ │ │ │ │ + 187 /* Nothing. */ │ │ │ │ │ + 188 } │ │ │ │ │ + 189 │ │ │ │ │ + 190public: │ │ │ │ │ + 191 │ │ │ │ │ +193 const Basis& basis() const │ │ │ │ │ + 194 { │ │ │ │ │ + 195 return *data_->basis; │ │ │ │ │ + 196 } │ │ │ │ │ + 197 │ │ │ │ │ +199 const Vector& dofs() const │ │ │ │ │ + 200 { │ │ │ │ │ + 201 return *data_->coefficients; │ │ │ │ │ + 202 } │ │ │ │ │ + 203 │ │ │ │ │ +205 const NodeToRangeEntry& nodeToRangeEntry() const │ │ │ │ │ + 206 { │ │ │ │ │ + 207 return *data_->nodeToRangeEntry; │ │ │ │ │ + 208 } │ │ │ │ │ + 209 │ │ │ │ │ +211 const EntitySet& entitySet() const │ │ │ │ │ + 212 { │ │ │ │ │ + 213 return data_->entitySet; │ │ │ │ │ + 214 } │ │ │ │ │ + 215 │ │ │ │ │ + 216protected: │ │ │ │ │ +217 std::shared_ptr data_; │ │ │ │ │ + 218}; │ │ │ │ │ + 219 │ │ │ │ │ + 220} // namespace ImplDoc │ │ │ │ │ + 221 │ │ │ │ │ + 222 │ │ │ │ │ + 223 │ │ │ │ │ + 224template │ │ │ │ │ + 225class DiscreteGlobalBasisFunctionDerivative; │ │ │ │ │ + 226 │ │ │ │ │ + 264template │ │ │ │ │ +267class DiscreteGlobalBasisFunction │ │ │ │ │ + 268 : public ImplDoc::DiscreteGlobalBasisFunctionBase │ │ │ │ │ + 269{ │ │ │ │ │ + 270 using Base = ImplDoc::DiscreteGlobalBasisFunctionBase; │ │ │ │ │ + 271 using Data = typename Base::Data; │ │ │ │ │ + 272 │ │ │ │ │ + 273public: │ │ │ │ │ +274 using Basis = typename Base::Basis; │ │ │ │ │ +275 using Vector = typename Base::Vector; │ │ │ │ │ + 276 │ │ │ │ │ +277 using Domain = typename Base::Domain; │ │ │ │ │ +278 using Range = R; │ │ │ │ │ + 279 │ │ │ │ │ +280 using Traits = Imp::GridFunctionTraits; │ │ │ │ │ + 281 │ │ │ │ │ + 282private: │ │ │ │ │ + 283 │ │ │ │ │ + 284 template │ │ │ │ │ + 285 using LocalBasisRange = typename Node::FiniteElement::Traits:: │ │ │ │ │ +LocalBasisType::Traits::RangeType; │ │ │ │ │ + 286 template │ │ │ │ │ + 287 using NodeData = typename std::vector>; │ │ │ │ │ + 288 using PerNodeEvaluationBuffer = typename TypeTree::TreeContainer; │ │ │ │ │ + 289 │ │ │ │ │ + 290public: │ │ │ │ │ +291 class LocalFunction │ │ │ │ │ + 292 : public Base::LocalFunctionBase │ │ │ │ │ + 293 { │ │ │ │ │ + 294 using LocalBase = typename Base::LocalFunctionBase; │ │ │ │ │ + 295 using size_type = typename Base::Tree::size_type; │ │ │ │ │ + 296 using LocalBase::nodeToRangeEntry; │ │ │ │ │ + 297 │ │ │ │ │ + 298 public: │ │ │ │ │ + 299 │ │ │ │ │ +300 using GlobalFunction = DiscreteGlobalBasisFunction; │ │ │ │ │ +301 using Domain = typename LocalBase::Domain; │ │ │ │ │ +302 using Range = GlobalFunction::Range; │ │ │ │ │ +303 using Element = typename LocalBase::Element; │ │ │ │ │ + 304 │ │ │ │ │ +306 LocalFunction(const DiscreteGlobalBasisFunction& globalFunction) │ │ │ │ │ + 307 : LocalBase(globalFunction.data_) │ │ │ │ │ + 308 , evaluationBuffer_(this->localView_.tree()) │ │ │ │ │ + 309 { │ │ │ │ │ + 310 /* Nothing. */ │ │ │ │ │ + 311 } │ │ │ │ │ + 312 │ │ │ │ │ +322 Range operator()(const Domain& x) const │ │ │ │ │ + 323 { │ │ │ │ │ + 324 Range y; │ │ │ │ │ + 325 istlVectorBackend(y) = 0; │ │ │ │ │ + 326 │ │ │ │ │ + 327 TypeTree::forEachLeafNode(this->localView_.tree(), [&](auto&& node, auto&& │ │ │ │ │ +treePath) { │ │ │ │ │ + 328 const auto& fe = node.finiteElement(); │ │ │ │ │ + 329 const auto& localBasis = fe.localBasis(); │ │ │ │ │ + 330 auto& shapeFunctionValues = evaluationBuffer_[treePath]; │ │ │ │ │ + 331 │ │ │ │ │ + 332 localBasis.evaluateFunction(x, shapeFunctionValues); │ │ │ │ │ + 333 │ │ │ │ │ + 334 // Compute linear combinations of basis function jacobian. │ │ │ │ │ + 335 // Non-scalar coefficients of dimension coeffDim are handled by │ │ │ │ │ + 336 // processing the coeffDim linear combinations independently │ │ │ │ │ + 337 // and storing them as entries of an array. │ │ │ │ │ + 338 using Value = LocalBasisRange< std::decay_t >; │ │ │ │ │ + 339 static constexpr auto coeffDim = decltype(flatVectorView(this->localDoFs_ │ │ │ │ │ +[node.localIndex(0)]).size())::value; │ │ │ │ │ + 340 auto values = std::array{}; │ │ │ │ │ + 341 istlVectorBackend(values) = 0; │ │ │ │ │ + 342 for (size_type i = 0; i < localBasis.size(); ++i) │ │ │ │ │ + 343 { │ │ │ │ │ + 344 auto c = flatVectorView(this->localDoFs_[node.localIndex(i)]); │ │ │ │ │ + 345 for (std::size_t j = 0; j < coeffDim; ++j) │ │ │ │ │ + 346 values[j].axpy(c[j], shapeFunctionValues[i]); │ │ │ │ │ + 347 } │ │ │ │ │ + 348 │ │ │ │ │ + 349 // Assign computed values to node entry of range. │ │ │ │ │ + 350 // Types are matched using the lexicographic ordering provided by │ │ │ │ │ +flatVectorView. │ │ │ │ │ + 351 LocalBase::assignWith(nodeToRangeEntry(node, treePath, y), values); │ │ │ │ │ + 352 }); │ │ │ │ │ + 353 │ │ │ │ │ + 354 return y; │ │ │ │ │ + 355 } │ │ │ │ │ + 356 │ │ │ │ │ +358 friend typename │ │ │ │ │ +DiscreteGlobalBasisFunctionDerivative:: │ │ │ │ │ +LocalFunction derivative(const LocalFunction& lf) │ │ │ │ │ + 359 { │ │ │ │ │ + 360 auto dlf = localFunction │ │ │ │ │ +(DiscreteGlobalBasisFunctionDerivative(lf.data_)); │ │ │ │ │ + 361 if (lf.bound()) │ │ │ │ │ + 362 dlf.bind(lf.localContext()); │ │ │ │ │ + 363 return dlf; │ │ │ │ │ + 364 } │ │ │ │ │ + 365 │ │ │ │ │ + 366 private: │ │ │ │ │ + 367 mutable PerNodeEvaluationBuffer evaluationBuffer_; │ │ │ │ │ + 368 }; │ │ │ │ │ + 369 │ │ │ │ │ + 371 template │ │ │ │ │ +372 DiscreteGlobalBasisFunction(B_T && basis, V_T && coefficients, NTRE_T&& │ │ │ │ │ +nodeToRangeEntry) │ │ │ │ │ + 373 : Base(std::make_shared(Data{{basis.gridView()}, wrap_or_move(std:: │ │ │ │ │ +forward(basis)), wrap_or_move(std::forward(coefficients)), │ │ │ │ │ +wrap_or_move(std::forward(nodeToRangeEntry))})) │ │ │ │ │ + 374 {} │ │ │ │ │ + 375 │ │ │ │ │ +377 DiscreteGlobalBasisFunction(std::shared_ptr basis, std:: │ │ │ │ │ +shared_ptr coefficients, std::shared_ptr nodeToRangeEntry) │ │ │ │ │ + 378 : Base(std::make_shared(Data{{basis->gridView()}, basis, │ │ │ │ │ +coefficients, nodeToRangeEntry})) │ │ │ │ │ + 379 {} │ │ │ │ │ + 380 │ │ │ │ │ +382 Range operator() (const Domain& x) const │ │ │ │ │ + 383 { │ │ │ │ │ + 384 // TODO: Implement this using hierarchic search │ │ │ │ │ + 385 DUNE_THROW(NotImplemented,"not implemented"); │ │ │ │ │ + 386 } │ │ │ │ │ + 387 │ │ │ │ │ +389 friend DiscreteGlobalBasisFunctionDerivative │ │ │ │ │ +derivative(const DiscreteGlobalBasisFunction& f) │ │ │ │ │ + 390 { │ │ │ │ │ + 391 return DiscreteGlobalBasisFunctionDerivative │ │ │ │ │ +(f.data_); │ │ │ │ │ + 392 } │ │ │ │ │ + 393 │ │ │ │ │ +402 friend LocalFunction localFunction(const DiscreteGlobalBasisFunction& t) │ │ │ │ │ + 403 { │ │ │ │ │ + 404 return LocalFunction(t); │ │ │ │ │ + 405 } │ │ │ │ │ + 406}; │ │ │ │ │ + 407 │ │ │ │ │ + 408 │ │ │ │ │ + 431template │ │ │ │ │ +432auto makeDiscreteGlobalBasisFunction(B&& basis, V&& vector) │ │ │ │ │ + 433{ │ │ │ │ │ + 434 using Basis = std::decay_t; │ │ │ │ │ + 435 using NTREM = HierarchicNodeToRangeMap; │ │ │ │ │ + 436 │ │ │ │ │ + 437 // Small helper functions to wrap vectors using istlVectorBackend │ │ │ │ │ + 438 // if they do not already satisfy the VectorBackend interface. │ │ │ │ │ + 439 auto toConstVectorBackend = [&](auto&& v) -> decltype(auto) { │ │ │ │ │ + 440 if constexpr (models, decltype(v)>()) { │ │ │ │ │ + 441 return std::forward(v); │ │ │ │ │ + 442 } else { │ │ │ │ │ + 443 return istlVectorBackend(v); │ │ │ │ │ + 444 } │ │ │ │ │ + 445 }; │ │ │ │ │ + 446 │ │ │ │ │ + 447 using Vector = std::decay_t │ │ │ │ │ +(vector)))>; │ │ │ │ │ + 448 return DiscreteGlobalBasisFunction( │ │ │ │ │ + 449 std::forward(basis), │ │ │ │ │ + 450 toConstVectorBackend(std::forward(vector)), │ │ │ │ │ + 451 HierarchicNodeToRangeMap()); │ │ │ │ │ + 452} │ │ │ │ │ + 453 │ │ │ │ │ + 454 │ │ │ │ │ + 469template │ │ │ │ │ +470class DiscreteGlobalBasisFunctionDerivative │ │ │ │ │ + 471 : public ImplDoc::DiscreteGlobalBasisFunctionBase │ │ │ │ │ + 472{ │ │ │ │ │ + 473 using Base = ImplDoc::DiscreteGlobalBasisFunctionBase; │ │ │ │ │ + 474 using Data = typename Base::Data; │ │ │ │ │ + 475 │ │ │ │ │ + 476public: │ │ │ │ │ +477 using DiscreteGlobalBasisFunction = DGBF; │ │ │ │ │ + 478 │ │ │ │ │ +479 using Basis = typename Base::Basis; │ │ │ │ │ +480 using Vector = typename Base::Vector; │ │ │ │ │ + 481 │ │ │ │ │ +482 using Domain = typename Base::Domain; │ │ │ │ │ +483 using Range = typename SignatureTraits::Range; │ │ │ │ │ + 484 │ │ │ │ │ +485 using Traits = Imp::GridFunctionTraits; │ │ │ │ │ + 486 │ │ │ │ │ + 487private: │ │ │ │ │ + 488 │ │ │ │ │ + 489 template │ │ │ │ │ + 490 using LocalBasisRange = typename Node::FiniteElement::Traits:: │ │ │ │ │ +LocalBasisType::Traits::JacobianType; │ │ │ │ │ + 491 template │ │ │ │ │ + 492 using NodeData = typename std::vector< LocalBasisRange >; │ │ │ │ │ + 493 using PerNodeEvaluationBuffer = typename TypeTree::TreeContainer; │ │ │ │ │ + 494 │ │ │ │ │ + 495public: │ │ │ │ │ + 496 │ │ │ │ │ +504 class LocalFunction │ │ │ │ │ + 505 : public Base::LocalFunctionBase │ │ │ │ │ + 506 { │ │ │ │ │ + 507 using LocalBase = typename Base::LocalFunctionBase; │ │ │ │ │ + 508 using size_type = typename Base::Tree::size_type; │ │ │ │ │ + 509 using LocalBase::nodeToRangeEntry; │ │ │ │ │ + 510 │ │ │ │ │ + 511 public: │ │ │ │ │ +512 using GlobalFunction = DiscreteGlobalBasisFunctionDerivative; │ │ │ │ │ +513 using Domain = typename LocalBase::Domain; │ │ │ │ │ +514 using Range = GlobalFunction::Range; │ │ │ │ │ +515 using Element = typename LocalBase::Element; │ │ │ │ │ + 516 │ │ │ │ │ +518 LocalFunction(const GlobalFunction& globalFunction) │ │ │ │ │ + 519 : LocalBase(globalFunction.data_) │ │ │ │ │ + 520 , evaluationBuffer_(this->localView_.tree()) │ │ │ │ │ + 521 { │ │ │ │ │ + 522 /* Nothing. */ │ │ │ │ │ + 523 } │ │ │ │ │ + 524 │ │ │ │ │ +531 void bind(const Element& element) │ │ │ │ │ + 532 { │ │ │ │ │ + 533 LocalBase::bind(element); │ │ │ │ │ + 534 geometry_.emplace(element.geometry()); │ │ │ │ │ + 535 } │ │ │ │ │ + 536 │ │ │ │ │ +538 void unbind() │ │ │ │ │ + 539 { │ │ │ │ │ + 540 geometry_.reset(); │ │ │ │ │ + 541 LocalBase::unbind(); │ │ │ │ │ + 542 } │ │ │ │ │ + 543 │ │ │ │ │ +557 Range operator()(const Domain& x) const │ │ │ │ │ + 558 { │ │ │ │ │ + 559 Range y; │ │ │ │ │ + 560 istlVectorBackend(y) = 0; │ │ │ │ │ + 561 │ │ │ │ │ + 562 const auto& jacobianInverse = geometry_->jacobianInverse(x); │ │ │ │ │ + 563 │ │ │ │ │ + 564 TypeTree::forEachLeafNode(this->localView_.tree(), [&](auto&& node, auto&& │ │ │ │ │ +treePath) { │ │ │ │ │ + 565 const auto& fe = node.finiteElement(); │ │ │ │ │ + 566 const auto& localBasis = fe.localBasis(); │ │ │ │ │ + 567 auto& shapeFunctionJacobians = evaluationBuffer_[treePath]; │ │ │ │ │ + 568 │ │ │ │ │ + 569 localBasis.evaluateJacobian(x, shapeFunctionJacobians); │ │ │ │ │ + 570 │ │ │ │ │ + 571 // Compute linear combinations of basis function jacobian. │ │ │ │ │ + 572 // Non-scalar coefficients of dimension coeffDim are handled by │ │ │ │ │ + 573 // processing the coeffDim linear combinations independently │ │ │ │ │ + 574 // and storing them as entries of an array. │ │ │ │ │ + 575 using RefJacobian = LocalBasisRange< std::decay_t >; │ │ │ │ │ + 576 static constexpr auto coeffDim = decltype(flatVectorView(this->localDoFs_ │ │ │ │ │ +[node.localIndex(0)]).size())::value; │ │ │ │ │ + 577 auto refJacobians = std::array{}; │ │ │ │ │ + 578 istlVectorBackend(refJacobians) = 0; │ │ │ │ │ + 579 for (size_type i = 0; i < localBasis.size(); ++i) │ │ │ │ │ + 580 { │ │ │ │ │ + 581 auto c = flatVectorView(this->localDoFs_[node.localIndex(i)]); │ │ │ │ │ + 582 for (std::size_t j = 0; j < coeffDim; ++j) │ │ │ │ │ + 583 refJacobians[j].axpy(c[j], shapeFunctionJacobians[i]); │ │ │ │ │ + 584 } │ │ │ │ │ + 585 │ │ │ │ │ + 586 // Transform Jacobians form local to global coordinates. │ │ │ │ │ + 587 using Jacobian = decltype(refJacobians[0] * jacobianInverse); │ │ │ │ │ + 588 auto jacobians = std::array{}; │ │ │ │ │ + 589 std::transform( │ │ │ │ │ + 590 refJacobians.begin(), refJacobians.end(), jacobians.begin(), │ │ │ │ │ + 591 [&](const auto& refJacobian) { return refJacobian * jacobianInverse; }); │ │ │ │ │ + 592 │ │ │ │ │ + 593 // Assign computed Jacobians to node entry of range. │ │ │ │ │ + 594 // Types are matched using the lexicographic ordering provided by │ │ │ │ │ +flatVectorView. │ │ │ │ │ + 595 LocalBase::assignWith(nodeToRangeEntry(node, treePath, y), jacobians); │ │ │ │ │ + 596 }); │ │ │ │ │ + 597 │ │ │ │ │ + 598 return y; │ │ │ │ │ + 599 } │ │ │ │ │ + 600 │ │ │ │ │ +602 friend typename Traits::LocalFunctionTraits::DerivativeInterface derivative │ │ │ │ │ +(const LocalFunction&) │ │ │ │ │ + 603 { │ │ │ │ │ + 604 DUNE_THROW(NotImplemented, "derivative of derivative is not implemented"); │ │ │ │ │ + 605 } │ │ │ │ │ + 606 │ │ │ │ │ + 607 private: │ │ │ │ │ + 608 mutable PerNodeEvaluationBuffer evaluationBuffer_; │ │ │ │ │ + 609 std::optional geometry_; │ │ │ │ │ + 610 }; │ │ │ │ │ + 611 │ │ │ │ │ +618 DiscreteGlobalBasisFunctionDerivative(const std::shared_ptr& │ │ │ │ │ +data) │ │ │ │ │ + 619 : Base(data) │ │ │ │ │ + 620 { │ │ │ │ │ + 621 /* Nothing. */ │ │ │ │ │ + 622 } │ │ │ │ │ + 623 │ │ │ │ │ +625 Range operator()(const Domain& x) const │ │ │ │ │ + 626 { │ │ │ │ │ + 627 // TODO: Implement this using hierarchic search │ │ │ │ │ + 628 DUNE_THROW(NotImplemented,"not implemented"); │ │ │ │ │ + 629 } │ │ │ │ │ + 630 │ │ │ │ │ +631 friend typename Traits::DerivativeInterface derivative(const │ │ │ │ │ +DiscreteGlobalBasisFunctionDerivative& f) │ │ │ │ │ + 632 { │ │ │ │ │ + 633 DUNE_THROW(NotImplemented, "derivative of derivative is not implemented"); │ │ │ │ │ + 634 } │ │ │ │ │ + 635 │ │ │ │ │ +637 friend LocalFunction localFunction(const │ │ │ │ │ +DiscreteGlobalBasisFunctionDerivative& f) │ │ │ │ │ + 638 { │ │ │ │ │ + 639 return LocalFunction(f); │ │ │ │ │ + 640 } │ │ │ │ │ + 641}; │ │ │ │ │ + 642 │ │ │ │ │ + 643 │ │ │ │ │ + 644} // namespace Functions │ │ │ │ │ + 645} // namespace Dune │ │ │ │ │ + 646 │ │ │ │ │ + 647#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH │ │ │ │ │ +flatvectorview.hh │ │ │ │ │ +hierarchicnodetorangemap.hh │ │ │ │ │ +istlvectorbackend.hh │ │ │ │ │ +gridfunction.hh │ │ │ │ │ +gridviewentityset.hh │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunction::makeDiscreteGlobalBasisFunction │ │ │ │ │ +auto makeDiscreteGlobalBasisFunction(B &&basis, V &&vector) │ │ │ │ │ +Generate a DiscreteGlobalBasisFunction. │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:432 │ │ │ │ │ +Dune::Functions::istlVectorBackend │ │ │ │ │ +auto istlVectorBackend(Vector &v) │ │ │ │ │ +Return a vector backend wrapping non-const ISTL like containers. │ │ │ │ │ +Definition: istlvectorbackend.hh:346 │ │ │ │ │ +Dune │ │ │ │ │ +Definition: polynomial.hh:10 │ │ │ │ │ +Dune::Functions::flatVectorView │ │ │ │ │ +auto flatVectorView(T &t) │ │ │ │ │ +Create flat vector view of passed mutable container. │ │ │ │ │ +Definition: flatvectorview.hh:179 │ │ │ │ │ +Dune::Functions::DefaultDerivativeTraits │ │ │ │ │ +Default implementation for derivative traits. │ │ │ │ │ +Definition: defaultderivativetraits.hh:37 │ │ │ │ │ +Dune::Functions::SignatureTraits │ │ │ │ │ +Helper class to deduce the signature of a callable. │ │ │ │ │ +Definition: signature.hh:56 │ │ │ │ │ +Dune::Functions::HierarchicNodeToRangeMap │ │ │ │ │ +A simple node to range map using the nested tree indices. │ │ │ │ │ +Definition: hierarchicnodetorangemap.hh:30 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:28 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::data_ │ │ │ │ │ +std::shared_ptr< const Data > data_ │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:217 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::dofs │ │ │ │ │ +const Vector & dofs() const │ │ │ │ │ +Return the coefficients of this discrete function by reference. │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:199 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::Basis │ │ │ │ │ +B Basis │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:30 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::Tree │ │ │ │ │ +typename Basis::LocalView::Tree Tree │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:39 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::Vector │ │ │ │ │ +V Vector │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:31 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::Element │ │ │ │ │ +typename EntitySet::Element Element │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:45 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalDomain │ │ │ │ │ +typename EntitySet::LocalCoordinate LocalDomain │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:44 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::nodeToRangeEntry │ │ │ │ │ +const NodeToRangeEntry & nodeToRangeEntry() const │ │ │ │ │ +Return the stored node-to-range map. │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:205 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::NodeToRangeEntry │ │ │ │ │ +NTRE NodeToRangeEntry │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:40 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase:: │ │ │ │ │ +DiscreteGlobalBasisFunctionBase │ │ │ │ │ +DiscreteGlobalBasisFunctionBase(const std::shared_ptr< const Data > &data) │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:184 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::GridView │ │ │ │ │ +typename Basis::GridView GridView │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:37 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::basis │ │ │ │ │ +const Basis & basis() const │ │ │ │ │ +Return a const reference to the stored basis. │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:193 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::EntitySet │ │ │ │ │ +GridViewEntitySet< GridView, 0 > EntitySet │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:38 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::entitySet │ │ │ │ │ +const EntitySet & entitySet() const │ │ │ │ │ +Get associated set of entities the local-function can be bound to. │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:211 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::Domain │ │ │ │ │ +typename EntitySet::GlobalCoordinate Domain │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:42 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::Coefficient │ │ │ │ │ +Dune::AutonomousValue< decltype(std::declval< Vector >()[std::declval< typename │ │ │ │ │ +Basis::MultiIndex >()])> Coefficient │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:35 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::Data │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:53 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::Data::entitySet │ │ │ │ │ +EntitySet entitySet │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:54 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::Data:: │ │ │ │ │ +nodeToRangeEntry │ │ │ │ │ +std::shared_ptr< const NodeToRangeEntry > nodeToRangeEntry │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:57 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::Data::basis │ │ │ │ │ +std::shared_ptr< const Basis > basis │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:55 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::Data::coefficients │ │ │ │ │ +std::shared_ptr< const Vector > coefficients │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:56 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:62 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ +operator= │ │ │ │ │ +LocalFunctionBase & operator=(const LocalFunctionBase &other) │ │ │ │ │ +Copy-assignment of the local-function. │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:100 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ +bound │ │ │ │ │ +bool bound() const │ │ │ │ │ +Check if LocalFunction is already bound to an element. │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:149 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ +bind │ │ │ │ │ +void bind(const Element &element) │ │ │ │ │ +Bind LocalFunction to grid element. │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:116 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ +Element │ │ │ │ │ +typename EntitySet::Element Element │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:68 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ +localContext │ │ │ │ │ +const Element & localContext() const │ │ │ │ │ +Return the element the local-function is bound to. │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:155 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ +LocalFunctionBase │ │ │ │ │ +LocalFunctionBase(const LocalFunctionBase &other) │ │ │ │ │ +Copy-construct the local-function. │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:84 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ +localDoFs_ │ │ │ │ │ +std::vector< Coefficient > localDoFs_ │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:180 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ +assignWith │ │ │ │ │ +void assignWith(To &to, const From &from) const │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:163 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ +data_ │ │ │ │ │ +std::shared_ptr< const Data > data_ │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:178 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ +nodeToRangeEntry │ │ │ │ │ +decltype(auto) nodeToRangeEntry(const Node &node, const TreePath &treePath, │ │ │ │ │ +Range &y) const │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:173 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ +localView_ │ │ │ │ │ +LocalView localView_ │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:179 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ +unbind │ │ │ │ │ +void unbind() │ │ │ │ │ +Unbind the local-function. │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:143 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ +Domain │ │ │ │ │ +LocalDomain Domain │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:67 │ │ │ │ │ +Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase:: │ │ │ │ │ +LocalFunctionBase │ │ │ │ │ +LocalFunctionBase(const std::shared_ptr< const Data > &data) │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:71 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunctionDerivative │ │ │ │ │ +Derivative of a DiscreteGlobalBasisFunction │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:472 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunctionDerivative::Basis │ │ │ │ │ +typename Base::Basis Basis │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:479 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunctionDerivative::derivative │ │ │ │ │ +friend Traits::DerivativeInterface derivative(const │ │ │ │ │ +DiscreteGlobalBasisFunctionDerivative &f) │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:631 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunctionDerivative::operator() │ │ │ │ │ +Range operator()(const Domain &x) const │ │ │ │ │ +Not implemented. │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:625 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunctionDerivative::Range │ │ │ │ │ +typename SignatureTraits< typename DiscreteGlobalBasisFunction::Traits:: │ │ │ │ │ +DerivativeInterface >::Range Range │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:483 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunctionDerivative::localFunction │ │ │ │ │ +friend LocalFunction localFunction(const DiscreteGlobalBasisFunctionDerivative │ │ │ │ │ +&f) │ │ │ │ │ +Construct local function from a DiscreteGlobalBasisFunctionDerivative │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:637 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunctionDerivative:: │ │ │ │ │ +DiscreteGlobalBasisFunctionDerivative │ │ │ │ │ +DiscreteGlobalBasisFunctionDerivative(const std::shared_ptr< const Data > │ │ │ │ │ +&data) │ │ │ │ │ +create object from DiscreateGlobalBasisFunction data │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:618 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunctionDerivative:: │ │ │ │ │ +DiscreteGlobalBasisFunction │ │ │ │ │ +DGBF DiscreteGlobalBasisFunction │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:477 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunctionDerivative::Vector │ │ │ │ │ +typename Base::Vector Vector │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:480 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunctionDerivative::Traits │ │ │ │ │ +Imp::GridFunctionTraits< Range(Domain), typename Base::EntitySet, │ │ │ │ │ +DefaultDerivativeTraits, 16 > Traits │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:485 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunctionDerivative::Domain │ │ │ │ │ +typename Base::Domain Domain │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:482 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunction │ │ │ │ │ +A grid function induced by a global basis and a coefficient vector. │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:269 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunction::derivative │ │ │ │ │ +friend DiscreteGlobalBasisFunctionDerivative< DiscreteGlobalBasisFunction > │ │ │ │ │ +derivative(const DiscreteGlobalBasisFunction &f) │ │ │ │ │ +Derivative of the DiscreteGlobalBasisFunction │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:389 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunction::DiscreteGlobalBasisFunction │ │ │ │ │ +DiscreteGlobalBasisFunction(B_T &&basis, V_T &&coefficients, NTRE_T │ │ │ │ │ +&&nodeToRangeEntry) │ │ │ │ │ +Create a grid-function, by wrapping the arguments in std::shared_ptr. │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:372 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunction::DiscreteGlobalBasisFunction │ │ │ │ │ +DiscreteGlobalBasisFunction(std::shared_ptr< const Basis > basis, std:: │ │ │ │ │ +shared_ptr< const V > coefficients, std::shared_ptr< const typename Base:: │ │ │ │ │ +NodeToRangeEntry > nodeToRangeEntry) │ │ │ │ │ +Create a grid-function, by moving the arguments in std::shared_ptr. │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:377 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunction::localFunction │ │ │ │ │ +friend LocalFunction localFunction(const DiscreteGlobalBasisFunction &t) │ │ │ │ │ +Construct local function from a DiscreteGlobalBasisFunction. │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:402 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunction::Basis │ │ │ │ │ +typename Base::Basis Basis │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:274 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunction::Traits │ │ │ │ │ +Imp::GridFunctionTraits< Range(Domain), typename Base::EntitySet, │ │ │ │ │ +DefaultDerivativeTraits, 16 > Traits │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:280 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunction::Range │ │ │ │ │ +R Range │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:278 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunction::Vector │ │ │ │ │ +typename Base::Vector Vector │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:275 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunction::Domain │ │ │ │ │ +typename Base::Domain Domain │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:277 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunction::LocalFunction │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:293 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunction::LocalFunction::Range │ │ │ │ │ +GlobalFunction::Range Range │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:302 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunction::LocalFunction::LocalFunction │ │ │ │ │ +LocalFunction(const DiscreteGlobalBasisFunction &globalFunction) │ │ │ │ │ +Create a local-function from the associated grid-function. │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:306 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunction::LocalFunction::derivative │ │ │ │ │ +friend DiscreteGlobalBasisFunctionDerivative< DiscreteGlobalBasisFunction >:: │ │ │ │ │ +LocalFunction derivative(const LocalFunction &lf) │ │ │ │ │ +Local function of the derivative. │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:358 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunction::LocalFunction::operator() │ │ │ │ │ +Range operator()(const Domain &x) const │ │ │ │ │ +Evaluate this local-function in coordinates x in the bound element. │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:322 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunctionDerivative::LocalFunction │ │ │ │ │ +local function evaluating the derivative in reference coordinates │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:506 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunctionDerivative::LocalFunction::operator │ │ │ │ │ +() │ │ │ │ │ +Range operator()(const Domain &x) const │ │ │ │ │ +Evaluate this local-function in coordinates x in the bound element. │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:557 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunctionDerivative::LocalFunction:: │ │ │ │ │ +derivative │ │ │ │ │ +friend Traits::LocalFunctionTraits::DerivativeInterface derivative(const │ │ │ │ │ +LocalFunction &) │ │ │ │ │ +Not implemented. │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:602 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunctionDerivative::LocalFunction::Range │ │ │ │ │ +GlobalFunction::Range Range │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:514 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunctionDerivative::LocalFunction::unbind │ │ │ │ │ +void unbind() │ │ │ │ │ +Unbind the local-function. │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:538 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunctionDerivative::LocalFunction:: │ │ │ │ │ +LocalFunction │ │ │ │ │ +LocalFunction(const GlobalFunction &globalFunction) │ │ │ │ │ +Create a local function from the associated grid function. │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:518 │ │ │ │ │ +Dune::Functions::DiscreteGlobalBasisFunctionDerivative::LocalFunction::bind │ │ │ │ │ +void bind(const Element &element) │ │ │ │ │ +Bind LocalFunction to grid element. │ │ │ │ │ +Definition: discreteglobalbasisfunction.hh:531 │ │ │ │ │ +Dune::Functions::GridFunction │ │ │ │ │ +Definition: gridfunction.hh:32 │ │ │ │ │ +Dune::Functions::GridViewEntitySet<_GridView,_0_> │ │ │ │ │ +Dune::Functions::GridViewEntitySet<_GridView,_0_>::Element │ │ │ │ │ +GridView::template Codim< codim >::Entity Element │ │ │ │ │ +Type of Elements contained in this EntitySet. │ │ │ │ │ +Definition: gridviewentityset.hh:32 │ │ │ │ │ +Dune::Functions::GridViewEntitySet<_GridView,_0_>::LocalCoordinate │ │ │ │ │ +Element::Geometry::LocalCoordinate LocalCoordinate │ │ │ │ │ +Type of local coordinates with respect to the Element. │ │ │ │ │ +Definition: gridviewentityset.hh:35 │ │ │ │ │ +Dune::Functions::GridViewEntitySet<_GridView,_0_>::GlobalCoordinate │ │ │ │ │ +Element::Geometry::GlobalCoordinate GlobalCoordinate │ │ │ │ │ +Definition: gridviewentityset.hh:36 │ │ │ │ │ concepts.hh │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01047.html │ │ │ │ @@ -73,15 +73,15 @@ │ │ │ │
Dune::Functions::Polynomial< K > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A scalar polynomial implementation. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/analyticfunctions/polynomial.hh>

│ │ │ │ +

#include <dune/functions/analyticfunctions/polynomial.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -428,15 +428,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Move-assignment operator.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01051.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::TrigonometricFunction< K, sinFactor, cosFactor > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A linear combination of trigonomic functions. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/analyticfunctions/trigonometricfunction.hh>

│ │ │ │ +

#include <dune/functions/analyticfunctions/trigonometricfunction.hh>

│ │ │ │

│ │ │ │ Public Member Functions

 Polynomial ()=default
 Default constructor. More...
 
 Polynomial (const Polynomial &other)=default
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Public Member Functions

operator() (const K &x) const
 Evaluate function. More...
 
│ │ │ │ @@ -124,15 +124,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Evaluate function.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01067.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::CallableFunctionWrapper< F > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Wrap a Dune::VirtualFunction into a callable object. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/callable.hh>

│ │ │ │ +

#include <dune/functions/common/callable.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -194,15 +194,15 @@ │ │ │ │ │ │ │ │

Forward operator() to F::evaluate()

│ │ │ │

This uses the default constructor of F::RangeType

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01071.html │ │ │ │ @@ -69,19 +69,19 @@ │ │ │ │
Dune::Functions::InvalidRange Class Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Dummy range class to be used if no proper type is available. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/defaultderivativetraits.hh>

│ │ │ │ +

#include <dune/functions/common/defaultderivativetraits.hh>

│ │ │ │

Detailed Description

│ │ │ │

Dummy range class to be used if no proper type is available.

│ │ │ │

The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01075.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::DefaultDerivativeTraits< Signature > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Default implementation for derivative traits. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/defaultderivativetraits.hh>

│ │ │ │ +

#include <dune/functions/common/defaultderivativetraits.hh>

│ │ │ │

│ │ │ │ Public Member Functions

 CallableFunctionWrapper (const F &f)
 Instantiate from reference to f. More...
 
 CallableFunctionWrapper (const std::shared_ptr< const F > &f)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

typedef InvalidRange Range
 Range of derivative for function with given signature. More...
 
│ │ │ │ @@ -104,15 +104,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Range of derivative for function with given signature.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01079.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::DefaultDerivativeTraits< double(double) > Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Default implementation for derivative traits. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/defaultderivativetraits.hh>

│ │ │ │ +

#include <dune/functions/common/defaultderivativetraits.hh>

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

│ │ │ │ Public Types

typedef double Range
 Range of derivative for function with given signature. More...
 
│ │ │ │ @@ -101,15 +101,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Range of derivative for function with given signature.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01083.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::DefaultDerivativeTraits< K(FieldVector< K, n >)> Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Default implementation for derivative traits. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/defaultderivativetraits.hh>

│ │ │ │ +

#include <dune/functions/common/defaultderivativetraits.hh>

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

│ │ │ │ Public Types

typedef FieldVector< K, n > Range
 Range of derivative for function with given signature. More...
 
│ │ │ │ @@ -110,15 +110,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Range of derivative for function with given signature.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01087.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::DefaultDerivativeTraits< FieldVector< K, m >(FieldVector< K, n >)> Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Default implementation for derivative traits. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/defaultderivativetraits.hh>

│ │ │ │ +

#include <dune/functions/common/defaultderivativetraits.hh>

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

│ │ │ │ Public Types

typedef FieldMatrix< K, m, n > Range
 Range of derivative for function with given signature. More...
 
│ │ │ │ @@ -110,15 +110,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Range of derivative for function with given signature.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01091.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::DefaultDerivativeTraits< FieldMatrix< K, 1, m >(FieldVector< K, n >)> Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Default implementation for derivative traits. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/defaultderivativetraits.hh>

│ │ │ │ +

#include <dune/functions/common/defaultderivativetraits.hh>

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

│ │ │ │ Public Types

typedef FieldMatrix< K, m, n > Range
 Range of derivative for function with given signature. More...
 
│ │ │ │ @@ -110,15 +110,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Range of derivative for function with given signature.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01095.html │ │ │ │ @@ -66,17 +66,17 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::Functions::DifferentiableFunction< Signature, DerivativeTraits, bufferSize > Class Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/common/differentiablefunction.hh>

│ │ │ │ +

#include <dune/functions/common/differentiablefunction.hh>

│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01103.html │ │ │ │ @@ -73,15 +73,15 @@ │ │ │ │
Dune::Functions::DifferentiableFunction< Range(Domain), DerivativeTraits, bufferSize > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Class storing differentiable functions using type erasure. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/differentiablefunction.hh>

│ │ │ │ +

#include <dune/functions/common/differentiablefunction.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::DifferentiableFunction< Range(Domain), DerivativeTraits, bufferSize >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -224,15 +224,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Evaluation of wrapped function.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01127.html │ │ │ │ @@ -75,15 +75,15 @@ │ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01131.html │ │ │ │ @@ -74,15 +74,15 @@ │ │ │ │
Dune::Functions::DifferentiableFunctionFromCallables< Range(Domain), DerivativeTraits, F > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Wrap a list of callable objects as derivative sequence modelling Concept::DifferentiableFunction<Range(Domain), DerivativeTraits> │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/differentiablefunctionfromcallables.hh>

│ │ │ │ +

#include <dune/functions/common/differentiablefunctionfromcallables.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -255,15 +255,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Evaluate function.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01135.html │ │ │ │ @@ -74,15 +74,15 @@ │ │ │ │
Dune::Functions::DifferentiableFunctionFromCallables< Range(Domain), DerivativeTraits, F, DF, Derivatives... > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Wrap a list of callable objects as derivative sequence modelling Concept::DifferentiableFunction<Range(Domain), DerivativeTraits> │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/differentiablefunctionfromcallables.hh>

│ │ │ │ +

#include <dune/functions/common/differentiablefunctionfromcallables.hh>

│ │ │ │

│ │ │ │ Public Types

using Signature = Range(Domain)
 Signature of function. More...
 
using RawSignature = typename SignatureTraits< Signature >::RawSignature
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -263,15 +263,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Evaluate function.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01139.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::Concept::Callable< Args > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Concept objects that can be called with given argument list. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/functionconcepts.hh>

│ │ │ │ +

#include <dune/functions/common/functionconcepts.hh>

│ │ │ │

│ │ │ │ Public Types

using Signature = Range(Domain)
 
using RawSignature = typename SignatureTraits< Signature >::RawSignature
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Public Member Functions

template<class F >
auto require (F &&f) -> decltype(f(std::declval< Args >()...))
 
│ │ │ │ @@ -113,15 +113,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01143.html │ │ │ │ @@ -66,15 +66,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::Functions::Concept::Function< Signature > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01147.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::Concept::Function< Range(Domain)> Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Concept for a function mapping Domain to Range. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/functionconcepts.hh>

│ │ │ │ +

#include <dune/functions/common/functionconcepts.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::Concept::Function< Range(Domain)>:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -123,15 +123,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01151.html │ │ │ │ @@ -66,15 +66,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::Functions::Concept::DifferentiableFunction< Signature, DerivativeTraits > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01155.html │ │ │ │ @@ -73,15 +73,15 @@ │ │ │ │
Dune::Functions::Concept::DifferentiableFunction< Range(Domain), DerivativeTraits > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Concept for a differentiable function mapping Domain to Range. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/functionconcepts.hh>

│ │ │ │ +

#include <dune/functions/common/functionconcepts.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::Concept::DifferentiableFunction< Range(Domain), DerivativeTraits >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -148,15 +148,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01159.html │ │ │ │ @@ -66,15 +66,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::Functions::Concept::LocalFunction< Signature, LocalContext > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01163.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::Concept::LocalFunction< Range(Domain), LocalContext > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Concept for a local function mapping Domain to Range. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/functionconcepts.hh>

│ │ │ │ +

#include <dune/functions/common/functionconcepts.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::Concept::LocalFunction< Range(Domain), LocalContext >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -124,15 +124,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01167.html │ │ │ │ @@ -66,15 +66,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::Functions::Concept::DifferentiableLocalFunction< Signature, LocalContext, DerivativeTraits > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01171.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::Concept::DifferentiableLocalFunction< Range(Domain), LocalContext, DerivativeTraits > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Concept for a differentiable local function mapping Domain to Range. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/functionconcepts.hh>

│ │ │ │ +

#include <dune/functions/common/functionconcepts.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::Concept::DifferentiableLocalFunction< Range(Domain), LocalContext, DerivativeTraits >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -126,15 +126,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01175.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::Concept::EntitySet Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Concept for an entity set for a Concept::GridFunction<Range(Domain), EntitySet, DerivativeTraits> │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/functionconcepts.hh>

│ │ │ │ +

#include <dune/functions/common/functionconcepts.hh>

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

│ │ │ │ Public Member Functions

template<class E >
auto require (E &&f) -> decltype(requireType< typename E::Element >(), requireType< typename E::LocalCoordinate >(), requireType< typename E::GlobalCoordinate >())
 
│ │ │ │ @@ -105,15 +105,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01179.html │ │ │ │ @@ -66,15 +66,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::Functions::Concept::GridFunction< Signature, EntitySet > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01183.html │ │ │ │ @@ -73,15 +73,15 @@ │ │ │ │
Dune::Functions::Concept::GridFunction< Range(Domain), EntitySet > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Concept for a grid function mapping Domain to Range. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/functionconcepts.hh>

│ │ │ │ +

#include <dune/functions/common/functionconcepts.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::Concept::GridFunction< Range(Domain), EntitySet >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -165,15 +165,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01187.html │ │ │ │ @@ -66,15 +66,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::Functions::Concept::DifferentiableGridFunction< Signature, EntitySet, DerivativeTraits > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01191.html │ │ │ │ @@ -73,15 +73,15 @@ │ │ │ │
Dune::Functions::Concept::DifferentiableGridFunction< Range(Domain), EntitySet, DerivativeTraits > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Concept for a differentiable grid function mapping Domain to Range. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/functionconcepts.hh>

│ │ │ │ +

#include <dune/functions/common/functionconcepts.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::Concept::DifferentiableGridFunction< Range(Domain), EntitySet, DerivativeTraits >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -188,15 +188,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01195.html │ │ │ │ @@ -66,15 +66,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::Functions::Concept::GridViewFunction< Signature, GridView > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01199.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::Concept::GridViewFunction< Range(Domain), GridView > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Concept for a grid view function mapping Domain to Range. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/functionconcepts.hh>

│ │ │ │ +

#include <dune/functions/common/functionconcepts.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::Concept::GridViewFunction< Range(Domain), GridView >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -125,15 +125,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01203.html │ │ │ │ @@ -66,15 +66,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::Functions::Concept::DifferentiableGridViewFunction< Signature, GridView, DerivativeTraits > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01207.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::Concept::DifferentiableGridViewFunction< Range(Domain), GridView, DerivativeTraits > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Concept for a differentiable grid view function mapping Domain to Range. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/functionconcepts.hh>

│ │ │ │ +

#include <dune/functions/common/functionconcepts.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::Concept::DifferentiableGridViewFunction< Range(Domain), GridView, DerivativeTraits >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -126,15 +126,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01211.html │ │ │ │ @@ -66,15 +66,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::Functions::FunctionFromCallable< Signature, F, FunctionInterface > Class Template Reference
│ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01215.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::FunctionFromCallable< Range(Domain), F, FunctionInterface > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Wrap a callable object as Dune::Function or Dune::VirtualFunction. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/functionfromcallable.hh>

│ │ │ │ +

#include <dune/functions/common/functionfromcallable.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::FunctionFromCallable< Range(Domain), F, FunctionInterface >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -226,15 +226,15 @@ │ │ │ │ │ │ │ │

Evaluate function.

│ │ │ │

This call is passed to the function

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01239.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::PolymorphicType< Interface > Class Template Referenceabstract
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Base class with polymorphic type boiler plate code. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/interfaces.hh>

│ │ │ │ +

#include <dune/functions/common/interfaces.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::PolymorphicType< Interface >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -234,15 +234,15 @@ │ │ │ │ │ │ │ │

Move object into buffer.

│ │ │ │

move(buffer) needs to be redefined by an implementation class, with the return type covariantly adapted. This will return a copy of this created in the given buffer using placement-new with move construction. You must not delete the returned pointer since it points to the given buffer (however with the proper type instead of void).

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01243.html │ │ │ │ @@ -66,17 +66,17 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::Functions::LocalFunction< Signature, LocalContext, DerivativeTraits, bufferSize > Class Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/common/localfunction.hh>

│ │ │ │ +

#include <dune/functions/common/localfunction.hh>

│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01251.html │ │ │ │ @@ -73,15 +73,15 @@ │ │ │ │
Dune::Functions::LocalFunction< Range(Domain), LocalContext, DerivativeTraits, bufferSize > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Class storing local functions using type erasure. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/localfunction.hh>

│ │ │ │ +

#include <dune/functions/common/localfunction.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::LocalFunction< Range(Domain), LocalContext, DerivativeTraits, bufferSize >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -352,15 +352,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Unbind from local context.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01263.html │ │ │ │ @@ -74,15 +74,15 @@ │ │ │ │
Dune::Functions::StaticMultiIndex< size_type, n > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A statically sized MultiIndex type. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/multiindex.hh>

│ │ │ │ +

#include <dune/functions/common/multiindex.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::StaticMultiIndex< size_type, n >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -188,15 +188,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

STL member.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01267.html │ │ │ │ @@ -75,15 +75,15 @@ │ │ │ │
Dune::Functions::StaticMultiIndex< size_type, 1 > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A statically sized MultiIndex type. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/multiindex.hh>

│ │ │ │ +

#include <dune/functions/common/multiindex.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::StaticMultiIndex< size_type, 1 >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -251,15 +251,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

STL member.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01271.html │ │ │ │ @@ -66,26 +66,26 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
std::tuple_size< Dune::Functions::StaticMultiIndex< size_type, n > > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/common/multiindex.hh>

│ │ │ │ +

#include <dune/functions/common/multiindex.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for std::tuple_size< Dune::Functions::StaticMultiIndex< size_type, n > >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01275.html │ │ │ │ @@ -75,15 +75,15 @@ │ │ │ │
Dune::Functions::OverflowArray< BA, maxSize > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A dynamically sized array-like class with overflow. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/overflowarray.hh>

│ │ │ │ +

#include <dune/functions/common/overflowarray.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::OverflowArray< BA, maxSize >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1059,15 +1059,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Write container to an output stream.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01279.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::PolymorphicSmallObject< Base, bufferSize > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A wrapper providing small object optimization with polymorphic types. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/polymorphicsmallobject.hh>

│ │ │ │ +

#include <dune/functions/common/polymorphicsmallobject.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::PolymorphicSmallObject< Base, bufferSize >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -479,15 +479,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Move assignment from other PolymorphicSmallObject.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01283.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::ReservedDeque< T, n > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A double-ended queue (deque) class with statically reserved memory. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/reserveddeque.hh>

│ │ │ │ +

#include <dune/functions/common/reserveddeque.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1025,15 +1025,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Send ReservedDeque to an output stream.

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

Helper class to check that F is callable. │ │ │ │ More...

│ │ │ │

Detailed Description

│ │ │ │
template<typename F>
│ │ │ │ struct Dune::Functions::IsCallable< F >

Helper class to check that F is callable.

│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01291.html │ │ │ │ @@ -69,20 +69,20 @@ │ │ │ │
Dune::Functions::SignatureTraits< Signature, isCallable > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Helper class to deduce the signature of a callable. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/signature.hh>

│ │ │ │ +

#include <dune/functions/common/signature.hh>

│ │ │ │

Detailed Description

│ │ │ │
template<class Signature, bool isCallable = IsCallable<Signature>::value>
│ │ │ │ struct Dune::Functions::SignatureTraits< Signature, isCallable >

Helper class to deduce the signature of a callable.

│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01295.html │ │ │ │ @@ -66,15 +66,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::Functions::SignatureTag< Signature, DerivativeTraits > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01299.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::SignatureTag< Range(Domain), DerivativeTraitsT > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Tag-class to encapsulate signature information. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/signature.hh>

│ │ │ │ +

#include <dune/functions/common/signature.hh>

│ │ │ │

│ │ │ │ Public Types

typedef T value_type
 The type of object, T, stored in the vector. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -129,15 +129,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using Signature = Range(Domain)
 
template<class T >
using DerivativeTraits = DerivativeTraitsT< T >
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01311.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::UniformNodeVisitor< SimpleNodeVisitorImp, leafOnly > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Mixin for visitors that should apply the same action on all nodes. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/treedata.hh>

│ │ │ │ +

#include <dune/functions/common/treedata.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::UniformNodeVisitor< SimpleNodeVisitorImp, leafOnly >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -236,15 +236,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01315.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │
Dune::Functions::TreeData< T, ND, LO > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Container allowing to attach data to each node of a tree. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/treedata.hh>

│ │ │ │ +

#include <dune/functions/common/treedata.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -564,15 +564,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Classes

struct  CopyVisitor
 
struct  DestroyVisitor
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01319.html │ │ │ │ @@ -70,15 +70,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Functions::TreeData< T, ND, LO >::InitVisitor Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/common/treedata.hh>

│ │ │ │ +

#include <dune/functions/common/treedata.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::TreeData< T, ND, LO >::InitVisitor:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -299,15 +299,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01323.html │ │ │ │ @@ -70,15 +70,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Functions::TreeData< T, ND, LO >::DestroyVisitor Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/common/treedata.hh>

│ │ │ │ +

#include <dune/functions/common/treedata.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::TreeData< T, ND, LO >::DestroyVisitor:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -299,15 +299,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01327.html │ │ │ │ @@ -70,15 +70,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Functions::TreeData< T, ND, LO >::CopyVisitor Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/common/treedata.hh>

│ │ │ │ +

#include <dune/functions/common/treedata.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::TreeData< T, ND, LO >::CopyVisitor:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -327,15 +327,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01331.html │ │ │ │ @@ -69,15 +69,15 @@ │ │ │ │
Dune::Functions::HasStaticSize< T > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Check if type is a statically sized container. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/type_traits.hh>

│ │ │ │ +

#include <dune/functions/common/type_traits.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::HasStaticSize< T >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -85,15 +85,15 @@ │ │ │ │ │ │ │ │
│ │ │ │

Detailed Description

│ │ │ │
template<class T>
│ │ │ │ struct Dune::Functions::HasStaticSize< T >

Check if type is a statically sized container.

│ │ │ │

Derives from std::true_type or std::false_type

│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01335.html │ │ │ │ @@ -69,15 +69,15 @@ │ │ │ │
Dune::Functions::StaticSize< T > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Obtain size of statically sized container. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/type_traits.hh>

│ │ │ │ +

#include <dune/functions/common/type_traits.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::StaticSize< T >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -85,15 +85,15 @@ │ │ │ │ │ │ │ │
│ │ │ │

Detailed Description

│ │ │ │
template<class T>
│ │ │ │ struct Dune::Functions::StaticSize< T >

Obtain size of statically sized container.

│ │ │ │

Derives from std::integral_constant<std::size_t, size>

│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01351.html │ │ │ │ @@ -73,15 +73,15 @@ │ │ │ │
Dune::Functions::TypeErasureBase< Interface, Implementation, bufferSize > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Base class for type-erased interface wrapper. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/typeerasure.hh>

│ │ │ │ +

#include <dune/functions/common/typeerasure.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::TypeErasureBase< Interface, Implementation, bufferSize >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -293,15 +293,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01383.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::LastType< T > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Get last entry of type list. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/utility.hh>

│ │ │ │ +

#include <dune/functions/common/utility.hh>

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

│ │ │ │ Public Types

using type = typename std::tuple_element< sizeof...(T) -1, std::tuple< T... > >::type
 
│ │ │ │

Detailed Description

│ │ │ │ @@ -100,15 +100,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01395.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::RotateTuple< T > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Rotate type list by one, such that last entry is moved to first position. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/common/utility.hh>

│ │ │ │ +

#include <dune/functions/common/utility.hh>

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

│ │ │ │ Public Types

using type = typename Imp::RotateHelper< std::tuple< T... >, std::make_index_sequence< sizeof...(T) -1 > >::type
 
│ │ │ │

Detailed Description

│ │ │ │ @@ -101,15 +101,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01411.html │ │ │ │ @@ -69,15 +69,15 @@ │ │ │ │
│ │ │ │ Public Member Functions | │ │ │ │ List of all members
│ │ │ │
Dune::Functions::Concept::IndexMergingStrategy Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/basistags.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/basistags.hh>

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

│ │ │ │ Public Member Functions

template<typename T >
auto require (T &&t) -> decltype(registerIndexMergingStrategy(t))
 
│ │ │ │ @@ -99,15 +99,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01415.html │ │ │ │ @@ -69,15 +69,15 @@ │ │ │ │
Dune::Functions::BasisFactory::IndexMergingStrategy Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Base class for index merging strategies to simplify detection. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/basistags.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/basistags.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::BasisFactory::IndexMergingStrategy:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -85,15 +85,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │

Detailed Description

│ │ │ │

Base class for index merging strategies to simplify detection.

│ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01419.html │ │ │ │ @@ -69,15 +69,15 @@ │ │ │ │
Dune::Functions::BasisFactory::FlatLexicographic Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Lexicographic merging of direct children without blocking. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/basistags.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/basistags.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::BasisFactory::FlatLexicographic:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -120,15 +120,15 @@ │ │ │ │ g_0 (2,k0) │ │ │ │ │ │ │ │ g_1 (3,k1) │ │ │ │ │ │ │ │ g_2 (4,k2) │ │ │ │ │ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01423.html │ │ │ │ @@ -69,15 +69,15 @@ │ │ │ │
Dune::Functions::BasisFactory::FlatInterleaved Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Interleaved merging of direct children without blocking. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/basistags.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/basistags.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::BasisFactory::FlatInterleaved:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -120,15 +120,15 @@ │ │ │ │ g_1 (3,i1) │ │ │ │ │ │ │ │ f_2 (4,i2) │ │ │ │ │ │ │ │ g_2 (5,i2) │ │ │ │ │ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01427.html │ │ │ │ @@ -69,15 +69,15 @@ │ │ │ │
Dune::Functions::BasisFactory::BlockedLexicographic Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Lexicographic merging of direct children with blocking (i.e. creating one block per direct child). │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/basistags.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/basistags.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::BasisFactory::BlockedLexicographic:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -120,15 +120,15 @@ │ │ │ │ g_0 (1,k0) │ │ │ │ │ │ │ │ g_1 (1,k1) │ │ │ │ │ │ │ │ g_2 (1,k2) │ │ │ │ │ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01431.html │ │ │ │ @@ -69,15 +69,15 @@ │ │ │ │
Dune::Functions::BasisFactory::BlockedInterleaved Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Interleaved merging of direct children with blocking (i.e. creating blocks at the leaves containing one leaf per child each). │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/basistags.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/basistags.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::BasisFactory::BlockedInterleaved:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -120,15 +120,15 @@ │ │ │ │ g_1 (i1,1) │ │ │ │ │ │ │ │ f_2 (i2,0) │ │ │ │ │ │ │ │ g_2 (i2,1) │ │ │ │ │ │ │ │

The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01467.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │ Protected Member Functions | │ │ │ │ Protected Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Functions::BrezziDouglasMariniNode< GV, k > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/brezzidouglasmarinibasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/brezzidouglasmarinibasis.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::BrezziDouglasMariniNode< GV, k >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -573,15 +573,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01471.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │ Static Public Attributes | │ │ │ │ Protected Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Functions::BrezziDouglasMariniPreBasis< GV, k > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/brezzidouglasmarinibasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/brezzidouglasmarinibasis.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -657,15 +657,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using GridView = GV
 The grid view that the FE space is defined on. More...
 
using size_type = std::size_t
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01475.html │ │ │ │ @@ -75,15 +75,15 @@ │ │ │ │
Dune::Functions::BSplineLocalFiniteElement< GV, R > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

LocalFiniteElement in the sense of dune-localfunctions, for the B-spline basis on tensor-product grids. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/bsplinebasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/bsplinebasis.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::BSplineLocalFiniteElement< GV, R >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -551,15 +551,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01479.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │
Dune::Functions::BSplinePreBasis< GV > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Pre-basis for B-spline basis. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/bsplinebasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/bsplinebasis.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1276,15 +1276,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Order of the B-spline for each space dimension.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01483.html │ │ │ │ @@ -74,15 +74,15 @@ │ │ │ │
Dune::Functions::BSplineLocalBasis< GV, R > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

LocalBasis class in the sense of dune-localfunctions, presenting the restriction of a B-spline patch to a knot span. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/bsplinebasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/bsplinebasis.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::BSplineLocalBasis< GV, R >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -415,15 +415,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using GridView = GV
 The grid view that the FE space is defined on. More...
 
using size_type = std::size_t
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01487.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::BSplineLocalCoefficients< dim > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Attaches a shape function to an entity. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/bsplinebasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/bsplinebasis.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -185,15 +185,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

number of coefficients

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

Local interpolation in the sense of dune-localfunctions, for the B-spline basis on tensor-product grids. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/bsplinebasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/bsplinebasis.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::BSplineLocalInterpolation< dim, LB >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -138,15 +138,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Local interpolation of a function.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01495.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │ Protected Member Functions | │ │ │ │ Protected Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Functions::BSplineNode< GV > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/bsplinebasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/bsplinebasis.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::BSplineNode< GV >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -555,15 +555,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Member Functions

void init (const std::array< unsigned, dim > &sizes)
 
std::size_t size () const
 number of coefficients More...
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01503.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
Dune::Functions::CompositePreBasis< IMS, SPB > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A pre-basis for composite bases. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/compositebasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/compositebasis.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -821,15 +821,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using SubPreBases = std::tuple< SPB... >
 Tuple of child pre-bases. More...
 
template<std::size_t i>
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01555.html │ │ │ │ @@ -74,15 +74,15 @@ │ │ │ │
Dune::Functions::DefaultGlobalBasis< PB > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Global basis for given pre-basis. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/defaultglobalbasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/defaultglobalbasis.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -725,15 +725,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using PreBasis = PB
 Pre-basis providing the implementation details. More...
 
using PrefixPath = TypeTree::HybridTreePath<>
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01559.html │ │ │ │ @@ -75,15 +75,15 @@ │ │ │ │
Dune::Functions::DefaultLocalView< GB > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

The restriction of a finite element basis to a single element. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/defaultlocalview.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/defaultlocalview.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -773,15 +773,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using GlobalBasis = GB
 The global FE basis that this is a view on. More...
 
using GridView = typename GlobalBasis::GridView
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01563.html │ │ │ │ @@ -74,15 +74,15 @@ │ │ │ │
Dune::Functions::DefaultNodeToRangeMap< Tree > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A simple node to range map using lexicographic ordering. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/defaultnodetorangemap.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/defaultnodetorangemap.hh>

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

│ │ │ │ Classes

struct  Visitor
 
│ │ │ │ │ │ │ │

│ │ │ │ @@ -253,15 +253,15 @@ │ │ │ │

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01567.html │ │ │ │ @@ -70,15 +70,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Public Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Functions::DefaultNodeToRangeMap< Tree >::Visitor Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/defaultnodetorangemap.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/defaultnodetorangemap.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::DefaultNodeToRangeMap< Tree >::Visitor:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -201,15 +201,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01619.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │ Protected Member Functions | │ │ │ │ Protected Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Functions::HierarchicalLagrangeNode< GV, k, R > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/hierarchicallagrangebasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/hierarchicallagrangebasis.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::HierarchicalLagrangeNode< GV, k, R >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -557,15 +557,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01623.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
Dune::Functions::HierarchicalLagrangePreBasis< GV, k, R > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A pre-basis for a hierarchical basis. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/hierarchicallagrangebasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/hierarchicallagrangebasis.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -670,15 +670,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using GridView = GV
 The grid view that the FE basis is defined on. More...
 
using size_type = std::size_t
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01627.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::HierarchicNodeToRangeMap Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A simple node to range map using the nested tree indices. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/hierarchicnodetorangemap.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/hierarchicnodetorangemap.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -177,15 +177,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Member Functions

template<class Node , class TreePath , class Range , std::enable_if_t< models< Concept::HasIndexAccess, Range, Dune::index_constant< 0 > >(), int > = 0>
decltype(auto) operator() (const Node &, const TreePath &treePath, Range &&y) const
 
template<class Node , class TreePath , class Range , std::enable_if_t< not models< Concept::HasIndexAccess, Range, Dune::index_constant< 0 > >(), int > = 0>
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01647.html │ │ │ │ @@ -74,15 +74,15 @@ │ │ │ │
Dune::Functions::HierarchicVectorWrapper< V, CO > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A wrapper providing multiindex access to vector entries. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/hierarchicvectorwrapper.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/hierarchicvectorwrapper.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -390,15 +390,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using Vector = V
 
template<class MultiIndex >
using Entry = Coefficient< MultiIndex >
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01667.html │ │ │ │ @@ -73,15 +73,15 @@ │ │ │ │ Protected Member Functions | │ │ │ │ Protected Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Functions::LagrangeNode< GV, k, R > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/lagrangebasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/lagrangebasis.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::LagrangeNode< GV, k, R >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -646,15 +646,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01671.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
Dune::Functions::LagrangePreBasis< GV, k, R > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A pre-basis for a PQ-lagrange bases with given order. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/lagrangebasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/lagrangebasis.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::LagrangePreBasis< GV, k, R >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1290,15 +1290,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01679.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │ Static Public Attributes | │ │ │ │ Protected Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Functions::LagrangeDGPreBasis< GV, k > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/lagrangedgbasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/lagrangedgbasis.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -893,15 +893,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using GridView = GV
 The grid view that the FE space is defined on. More...
 
using size_type = std::size_t
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01687.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │ Protected Member Functions | │ │ │ │ Protected Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Functions::NedelecNode< GV, Range, kind, order > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/nedelecbasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/nedelecbasis.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::NedelecNode< GV, Range, kind, order >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -573,15 +573,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01691.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │ Static Public Attributes | │ │ │ │ Protected Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Functions::NedelecPreBasis< GV, Range, kind, order > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/nedelecbasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/nedelecbasis.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -629,15 +629,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using GridView = GV
 The grid view that the FE space is defined on. More...
 
using size_type = std::size_t
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01707.html │ │ │ │ @@ -71,15 +71,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Protected Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Functions::BasisNodeMixin Class Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/nodes.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/nodes.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::BasisNodeMixin:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -344,15 +344,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01711.html │ │ │ │ @@ -71,15 +71,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Protected Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Functions::LeafBasisNode Class Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/nodes.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/nodes.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::LeafBasisNode:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -319,15 +319,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01715.html │ │ │ │ @@ -71,15 +71,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Protected Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Functions::PowerBasisNode< T, n > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/nodes.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/nodes.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::PowerBasisNode< T, n >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -421,15 +421,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01719.html │ │ │ │ @@ -71,15 +71,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Protected Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Functions::CompositeBasisNode< T > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/nodes.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/nodes.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::CompositeBasisNode< T >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -454,15 +454,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01723.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::BasisFactory::Experimental::PeriodicIndexSet Class Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Container storing identified indices for a periodic basis. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/periodicbasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/periodicbasis.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -151,15 +151,15 @@ │ │ │ │ │ │ │ │

Insert a pair of indices.

│ │ │ │

The two bases functions associated to the provided indices will be combined into a single basis function by associating them to a shared global index.

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01735.html │ │ │ │ @@ -74,15 +74,15 @@ │ │ │ │
Dune::Functions::PowerPreBasis< IMS, SPB, C > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A pre-basis for power bases. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/powerbasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/powerbasis.hh>

│ │ │ │

│ │ │ │ Public Member Functions

void unifyIndexPair (std::size_t a, std::size_t b)
 Insert a pair of indices. More...
 
const auto & indexPairSet () const
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -711,15 +711,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using SubPreBasis = SPB
 The child pre-basis. More...
 
using GridView = typename SPB::GridView
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01739.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │ Protected Member Functions | │ │ │ │ Protected Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Functions::RannacherTurekNode< GV > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/rannacherturekbasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/rannacherturekbasis.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::RannacherTurekNode< GV >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -528,15 +528,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01743.html │ │ │ │ @@ -75,15 +75,15 @@ │ │ │ │
Dune::Functions::RannacherTurekPreBasis< GV > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Pre-basis for a Rannacher-Turek basis. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/rannacherturekbasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/rannacherturekbasis.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -608,15 +608,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using GridView = GV
 The grid view that the FE basis is defined on. More...
 
using size_type = std::size_t
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01791.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │ Protected Member Functions | │ │ │ │ Protected Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Functions::RaviartThomasNode< GV, k > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/raviartthomasbasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/raviartthomasbasis.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::RaviartThomasNode< GV, k >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -573,15 +573,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01795.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │ Static Public Attributes | │ │ │ │ Protected Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Functions::RaviartThomasPreBasis< GV, k > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/raviartthomasbasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/raviartthomasbasis.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -657,15 +657,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using GridView = GV
 The grid view that the FE space is defined on. More...
 
using size_type = std::size_t
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01799.html │ │ │ │ @@ -74,15 +74,15 @@ │ │ │ │
Dune::Functions::SizeInfo< B > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A class encapsulating size information. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/sizeinfo.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/sizeinfo.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -304,15 +304,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using Basis = B
 
using size_type = typename Basis::size_type
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01803.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::SubEntityDOFs< GridView > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Range of DOFs associated to sub-entity. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/subentitydofs.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/subentitydofs.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -370,15 +370,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Return number of contained DOFs.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01807.html │ │ │ │ @@ -71,15 +71,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Protected Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Functions::SubspaceBasis< RB, TP > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/subspacebasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/subspacebasis.hh>

│ │ │ │

│ │ │ │ Public Member Functions

template<class LocalView >
SubEntityDOFsbind (const LocalView &localView, std::size_t subEntityIndex, std::size_t subEntityCodim)
 Bind SubEntityDOFs object to LocalView and sub-entity. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -599,15 +599,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using RootBasis = RB
 
using RootLocalView = typename RootBasis::LocalView
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01811.html │ │ │ │ @@ -74,15 +74,15 @@ │ │ │ │
Dune::Functions::SubspaceLocalView< RLV, PP > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

The restriction of a finite element basis to a single element. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/subspacelocalview.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/subspacelocalview.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -682,15 +682,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using RootLocalView = RLV
 
using GlobalBasis = SubspaceBasis< typename RootLocalView::GlobalBasis, PrefixPath >
 The global FE basis that this is a view on. More...
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01815.html │ │ │ │ @@ -71,15 +71,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Protected Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Functions::TaylorHoodVelocityTree< GV > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/taylorhoodbasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/taylorhoodbasis.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::TaylorHoodVelocityTree< GV >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -396,15 +396,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01819.html │ │ │ │ @@ -71,15 +71,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Protected Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Functions::TaylorHoodBasisTree< GV > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/taylorhoodbasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/taylorhoodbasis.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::TaylorHoodBasisTree< GV >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -395,15 +395,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01823.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │
Dune::Functions::TaylorHoodPreBasis< GV, HI > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Pre-basis for lowest order Taylor-Hood basis. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/taylorhoodbasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/taylorhoodbasis.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -805,15 +805,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using GridView = GV
 The grid view that the FE basis is defined on. More...
 
using size_type = std::size_t
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01827.html │ │ │ │ @@ -75,15 +75,15 @@ │ │ │ │
Dune::Functions::Experimental::TransformedIndexPreBasis< RPB, T > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A pre-basis transforming multi-indices. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/transformedindexbasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/transformedindexbasis.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -772,15 +772,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using RawPreBasis = RPB
 
using GridView = typename RawPreBasis::GridView
 The grid view that the FE basis is defined on. More...
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01831.html │ │ │ │ @@ -73,15 +73,15 @@ │ │ │ │
Dune::Functions::BasisFactory::Experimental::GenericIndexingTransformation< IndexTransformation, SizeImplementation, minIS, maxIS > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A generic implementation of a transformation. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/functionspacebases/transformedindexbasis.hh>

│ │ │ │ +

#include <dune/functions/functionspacebases/transformedindexbasis.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -313,15 +313,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Member Functions

template<class IT_R , class SI_R >
 GenericIndexingTransformation (IT_R &&indexTransformation, SI_R &&sizeImplementation)
 
template<class MultiIndex , class PreBasis >
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01843.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │ │ │ │ │ template<class F , class GridView > │ │ │ │ AnalyticGridViewFunction< typename std::invoke_result< F, typename GridView::template Codim< 0 >::Geometry::GlobalCoordinate >::type(typename GridView::template Codim< 0 >::Geometry::GlobalCoordinate), GridView, typename std::decay< F >::type > makeAnalyticGridViewFunction (F &&f, const GridView &gridView) │ │ │ │  Create an AnalyticGridViewFunction from a function and a grid view. More...
│ │ │ │   │ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01847.html │ │ │ │ @@ -74,15 +74,15 @@ │ │ │ │
Dune::Functions::AnalyticGridViewFunction< Range(Domain), GV, F, DerivativeTraits > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Class wrapping any differentiable function as grid function. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/gridfunctions/analyticgridviewfunction.hh>

│ │ │ │ +

#include <dune/functions/gridfunctions/analyticgridviewfunction.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -486,15 +486,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Construct the associated local-function.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01851.html │ │ │ │ @@ -78,15 +78,15 @@ │ │ │ │
Dune::Functions::ComposedGridFunction< OF, IF > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Composition of grid functions with another function. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/gridfunctions/composedgridfunction.hh>

│ │ │ │ +

#include <dune/functions/gridfunctions/composedgridfunction.hh>

│ │ │ │

│ │ │ │ Public Types

using Signature = Range(Domain)
 
using RawSignature = typename SignatureTraits< Signature >::RawSignature
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -483,15 +483,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using EntitySet = typename InnerFunction< 0 >::EntitySet
 
using Element = typename EntitySet::Element
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01859.html │ │ │ │ @@ -73,15 +73,15 @@ │ │ │ │ Protected Member Functions | │ │ │ │ Protected Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase< B, V, NTRE > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/gridfunctions/discreteglobalbasisfunction.hh>

│ │ │ │ +

#include <dune/functions/gridfunctions/discreteglobalbasisfunction.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase< B, V, NTRE >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -475,15 +475,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01863.html │ │ │ │ @@ -69,15 +69,15 @@ │ │ │ │
│ │ │ │ Public Attributes | │ │ │ │ List of all members
│ │ │ │
Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase< B, V, NTRE >::Data Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/gridfunctions/discreteglobalbasisfunction.hh>

│ │ │ │ +

#include <dune/functions/gridfunctions/discreteglobalbasisfunction.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -148,15 +148,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Attributes

EntitySet entitySet
 
std::shared_ptr< const Basisbasis
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01867.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │ Protected Member Functions | │ │ │ │ Protected Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase< B, V, NTRE >::LocalFunctionBase Class Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/gridfunctions/discreteglobalbasisfunction.hh>

│ │ │ │ +

#include <dune/functions/gridfunctions/discreteglobalbasisfunction.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase< B, V, NTRE >::LocalFunctionBase:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -535,15 +535,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01871.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
Dune::Functions::DiscreteGlobalBasisFunctionDerivative< DGBF > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Derivative of a DiscreteGlobalBasisFunction │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/gridfunctions/discreteglobalbasisfunction.hh>

│ │ │ │ +

#include <dune/functions/gridfunctions/discreteglobalbasisfunction.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::DiscreteGlobalBasisFunctionDerivative< DGBF >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -673,15 +673,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01875.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │
Dune::Functions::DiscreteGlobalBasisFunction< B, V, NTRE, R > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A grid function induced by a global basis and a coefficient vector. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/gridfunctions/discreteglobalbasisfunction.hh>

│ │ │ │ +

#include <dune/functions/gridfunctions/discreteglobalbasisfunction.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::DiscreteGlobalBasisFunction< B, V, NTRE, R >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -742,15 +742,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01879.html │ │ │ │ @@ -73,15 +73,15 @@ │ │ │ │ Protected Attributes | │ │ │ │ Friends | │ │ │ │ List of all members │ │ │ │
Dune::Functions::DiscreteGlobalBasisFunction< B, V, NTRE, R >::LocalFunction Class Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/gridfunctions/discreteglobalbasisfunction.hh>

│ │ │ │ +

#include <dune/functions/gridfunctions/discreteglobalbasisfunction.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::DiscreteGlobalBasisFunction< B, V, NTRE, R >::LocalFunction:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -577,15 +577,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01883.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
Dune::Functions::DiscreteGlobalBasisFunctionDerivative< DGBF >::LocalFunction Class Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

local function evaluating the derivative in reference coordinates │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/gridfunctions/discreteglobalbasisfunction.hh>

│ │ │ │ +

#include <dune/functions/gridfunctions/discreteglobalbasisfunction.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::DiscreteGlobalBasisFunctionDerivative< DGBF >::LocalFunction:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -585,15 +585,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01887.html │ │ │ │ @@ -75,15 +75,15 @@ │ │ │ │
Dune::Functions::FaceNormalGridFunction< GV > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Grid function implementing the piecewise element face normal. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/gridfunctions/facenormalgridfunction.hh>

│ │ │ │ +

#include <dune/functions/gridfunctions/facenormalgridfunction.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -373,15 +373,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Return a local-function associated to FaceNormalGridFunction.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01895.html │ │ │ │ @@ -66,27 +66,27 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::Functions::GridFunction< Signature, EntitySet, DerivativeTraits, bufferSize > Class Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/gridfunctions/gridfunction.hh>

│ │ │ │ +

#include <dune/functions/gridfunctions/gridfunction.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::GridFunction< Signature, EntitySet, DerivativeTraits, bufferSize >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01903.html │ │ │ │ @@ -73,15 +73,15 @@ │ │ │ │
Dune::Functions::GridFunction< Range(Domain), ES, DerivativeTraits, bufferSize > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Wrapper class for functions defined on a Grid. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/gridfunctions/gridfunction.hh>

│ │ │ │ +

#include <dune/functions/gridfunctions/gridfunction.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::GridFunction< Range(Domain), ES, DerivativeTraits, bufferSize >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -317,15 +317,15 @@ │ │ │ │

Get local function of wrapped function.

│ │ │ │

This is a free function, to be found by ADL.

│ │ │ │

Notice that the returned LocalFunction can only be used after it has been bound to a proper local context.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01919.html │ │ │ │ @@ -73,15 +73,15 @@ │ │ │ │
Dune::Functions::GridViewEntitySet< GV, cd > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

An entity set for all entities of given codim in a grid view. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/gridfunctions/gridviewentityset.hh>

│ │ │ │ +

#include <dune/functions/gridfunctions/gridviewentityset.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::GridViewEntitySet< GV, cd >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -453,15 +453,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Return number of Elements visited by an iterator.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01923.html │ │ │ │ @@ -66,17 +66,17 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Dune::Functions::GridViewFunction< Signature, GridView, DerivativeTraits, bufferSize > Class Template Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/gridfunctions/gridviewfunction.hh>

│ │ │ │ +

#include <dune/functions/gridfunctions/gridviewfunction.hh>

│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01927.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
Dune::Functions::GridViewFunction< Range(Domain), GV, DerivativeTraits, bufferSize > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Wrapper class for functions defined on a GridView. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/gridfunctions/gridviewfunction.hh>

│ │ │ │ +

#include <dune/functions/gridfunctions/gridviewfunction.hh>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::GridViewFunction< Range(Domain), GV, DerivativeTraits, bufferSize >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -120,15 +120,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using GridView = GV
 
using EntitySet = GridViewEntitySet< GridView, 0 >
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01931.html │ │ │ │ @@ -73,15 +73,15 @@ │ │ │ │
Dune::Functions::LocalDerivativeTraits< EntitySet, DerivativeTraits > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Derivative traits for local functions. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

#include <dune/functions/gridfunctions/localderivativetraits.hh>

│ │ │ │ +

#include <dune/functions/gridfunctions/localderivativetraits.hh>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -128,15 +128,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Classes

struct  Traits
 
struct  Traits< R(LocalDomain)>
 
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01935.html │ │ │ │ @@ -69,15 +69,15 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::Functions::LocalDerivativeTraits< EntitySet, DerivativeTraits >::Traits< Signature > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/gridfunctions/localderivativetraits.hh>

│ │ │ │ +

#include <dune/functions/gridfunctions/localderivativetraits.hh>

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

│ │ │ │ Public Types

typedef InvalidRange Range
 
│ │ │ │

Member Typedef Documentation

│ │ │ │ @@ -96,15 +96,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01939.html │ │ │ │ @@ -69,15 +69,15 @@ │ │ │ │
│ │ │ │ Public Types | │ │ │ │ List of all members
│ │ │ │
Dune::Functions::LocalDerivativeTraits< EntitySet, DerivativeTraits >::Traits< R(LocalDomain)> Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

#include <dune/functions/gridfunctions/localderivativetraits.hh>

│ │ │ │ +

#include <dune/functions/gridfunctions/localderivativetraits.hh>

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

│ │ │ │ Public Types

using Range = typename DerivativeTraits< R(Domain)>::Range
 
│ │ │ │

Member Typedef Documentation

│ │ │ │ @@ -96,15 +96,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a02876.html │ │ │ │ @@ -70,16 +70,16 @@ │ │ │ │ Classes | │ │ │ │ Namespaces │ │ │ │
functionspacebases/concepts.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │
#include <dune/common/concept.hh>
│ │ │ │ #include <dune/common/reservedvector.hh>
│ │ │ │ -#include <dune/functions/common/utility.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ +#include <dune/functions/common/utility.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a02876_source.html │ │ │ │ @@ -74,17 +74,17 @@ │ │ │ │
3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_CONCEPTS_HH
│ │ │ │
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_CONCEPTS_HH
│ │ │ │
5
│ │ │ │
6
│ │ │ │
7#include <dune/common/concept.hh>
│ │ │ │
8#include <dune/common/reservedvector.hh>
│ │ │ │
9
│ │ │ │ - │ │ │ │ + │ │ │ │
11
│ │ │ │ - │ │ │ │ + │ │ │ │
13
│ │ │ │
14
│ │ │ │
15namespace Dune {
│ │ │ │
16namespace Functions {
│ │ │ │
17namespace Concept {
│ │ │ │
18
│ │ │ │
19using namespace Dune::Concept;
│ │ │ │ @@ -285,16 +285,16 @@ │ │ │ │
214
│ │ │ │
215} // namespace Dune::Functions::Concept
│ │ │ │
216} // namespace Dune::Functions
│ │ │ │
217} // namespace Dune
│ │ │ │
218
│ │ │ │
219
│ │ │ │
220#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_CONCEPTS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │
Definition: polynomial.hh:10
│ │ │ │
Definition: functionspacebases/concepts.hh:23
│ │ │ │
auto require(C &&c) -> decltype(c.resize(0))
│ │ │ │
Definition: functionspacebases/concepts.hh:33
│ │ │ │
auto require(C &&c) -> decltype(c.size())
│ │ │ │
Definition: functionspacebases/concepts.hh:43
│ │ │ │
auto require(C &&c, I &&i) -> decltype(c[i])
│ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/dir_000001_000002.html │ │ │ │ @@ -62,14 +62,14 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -

backends → common Relation

│ │ │ │ Classes

struct  Dune::Functions::Concept::HasResize
 
File in dune/functions/backendsIncludes file in dune/functions/common
istlvectorbackend.hhindexaccess.hh
│ │ │ │ +

backends → common Relation

File in dune/functions/backendsIncludes file in dune/functions/common
istlvectorbackend.hhindexaccess.hh
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/dir_000001_000007.html │ │ │ │ @@ -62,14 +62,14 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -

backends → functionspacebases Relation

File in dune/functions/backendsIncludes file in dune/functions/functionspacebases
istlvectorbackend.hhfunctionspacebases/concepts.hh
│ │ │ │ +

backends → functionspacebases Relation

File in dune/functions/backendsIncludes file in dune/functions/functionspacebases
istlvectorbackend.hhfunctionspacebases/concepts.hh
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/dir_000002_000007.html │ │ │ │ @@ -62,14 +62,14 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -

common → functionspacebases Relation

File in dune/functions/commonIncludes file in dune/functions/functionspacebases
staticforloop.hhfunctionspacebases/concepts.hh
│ │ │ │ +

common → functionspacebases Relation

File in dune/functions/commonIncludes file in dune/functions/functionspacebases
staticforloop.hhfunctionspacebases/concepts.hh
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/dir_000002_000008.html │ │ │ │ @@ -62,14 +62,14 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -

common → gridfunctions Relation

File in dune/functions/commonIncludes file in dune/functions/gridfunctions
functionconcepts.hhgridviewentityset.hh
functionconcepts.hhlocalderivativetraits.hh
treedata.hhgridfunction.hh
treedata.hhgridviewentityset.hh
│ │ │ │ +

common → gridfunctions Relation

File in dune/functions/commonIncludes file in dune/functions/gridfunctions
functionconcepts.hhgridviewentityset.hh
functionconcepts.hhlocalderivativetraits.hh
treedata.hhgridfunction.hh
treedata.hhgridviewentityset.hh
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/dir_000007_000001.html │ │ │ │ @@ -62,14 +62,14 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -

functionspacebases → backends Relation

File in dune/functions/functionspacebasesIncludes file in dune/functions/backends
interpolate.hhbackends/concepts.hh
interpolate.hhistlvectorbackend.hh
│ │ │ │ +

functionspacebases → backends Relation

File in dune/functions/functionspacebasesIncludes file in dune/functions/backends
interpolate.hhbackends/concepts.hh
interpolate.hhistlvectorbackend.hh
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/dir_000007_000002.html │ │ │ │ @@ -62,14 +62,14 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

functionspacebases → common Relation

File in dune/functions/functionspacebasesIncludes file in dune/functions/common
compositebasis.hhstaticforloop.hh
compositebasis.hhtype_traits.hh
compositebasis.hhutility.hh
defaultglobalbasis.hhtype_traits.hh
defaultlocalview.hhmultiindex.hh
defaultlocalview.hhoverflowarray.hh
flatmultiindex.hhmultiindex.hh
functionspacebases/concepts.hhutility.hh
hierarchicnodetorangemap.hhindexaccess.hh
hierarchicvectorwrapper.hhindexaccess.hh
hierarchicvectorwrapper.hhtype_traits.hh
hierarchicvectorwrapper.hhutility.hh
interpolate.hhfunctionconcepts.hh
powerbasis.hhtype_traits.hh
powerbasis.hhutility.hh
subspacebasis.hhtype_traits.hh
transformedindexbasis.hhstaticforloop.hh
transformedindexbasis.hhtype_traits.hh
transformedindexbasis.hhutility.hh
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/dir_000007_000008.html │ │ │ │ @@ -62,14 +62,14 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -

functionspacebases → gridfunctions Relation

File in dune/functions/functionspacebasesIncludes file in dune/functions/gridfunctions
interpolate.hhgridviewfunction.hh
│ │ │ │ +

functionspacebases → gridfunctions Relation

File in dune/functions/functionspacebasesIncludes file in dune/functions/gridfunctions
interpolate.hhgridviewfunction.hh
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/dir_000008_000001.html │ │ │ │ @@ -62,14 +62,14 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -

gridfunctions → backends Relation

File in dune/functions/gridfunctionsIncludes file in dune/functions/backends
discreteglobalbasisfunction.hhbackends/concepts.hh
discreteglobalbasisfunction.hhistlvectorbackend.hh
│ │ │ │ +

gridfunctions → backends Relation

File in dune/functions/gridfunctionsIncludes file in dune/functions/backends
discreteglobalbasisfunction.hhbackends/concepts.hh
discreteglobalbasisfunction.hhistlvectorbackend.hh
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/dir_000008_000002.html │ │ │ │ @@ -62,14 +62,14 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

gridfunctions → common Relation

File in dune/functions/gridfunctionsIncludes file in dune/functions/common
analyticgridviewfunction.hhdefaultderivativetraits.hh
analyticgridviewfunction.hhdifferentiablefunction.hh
analyticgridviewfunction.hhdifferentiablefunction_imp.hh
analyticgridviewfunction.hhsignature.hh
composedgridfunction.hhdefaultderivativetraits.hh
composedgridfunction.hhdifferentiablefunction.hh
gridfunction.hhdefaultderivativetraits.hh
gridfunction.hhdifferentiablefunction.hh
gridfunction.hhfunctionconcepts.hh
gridfunction.hhlocalfunction.hh
gridfunction.hhtypeerasure.hh
gridfunction_imp.hhdifferentiablefunction_imp.hh
gridfunction_imp.hhinterfaces.hh
gridfunction_imp.hhtype_traits.hh
localderivativetraits.hhdefaultderivativetraits.hh
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/dir_000008_000007.html │ │ │ │ @@ -62,14 +62,14 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -

gridfunctions → functionspacebases Relation

File in dune/functions/gridfunctionsIncludes file in dune/functions/functionspacebases
discreteglobalbasisfunction.hhflatvectorview.hh
discreteglobalbasisfunction.hhhierarchicnodetorangemap.hh
│ │ │ │ +

gridfunctions → functionspacebases Relation

File in dune/functions/gridfunctionsIncludes file in dune/functions/functionspacebases
discreteglobalbasisfunction.hhflatvectorview.hh
discreteglobalbasisfunction.hhhierarchicnodetorangemap.hh
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/dir_14cf9ce796563c596e9b8f0f574fe0cc.html │ │ │ │ @@ -81,58 +81,58 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Files

file  callable.hh [code]
file  callable.hh [code]
 
file  defaultderivativetraits.hh [code]
file  defaultderivativetraits.hh [code]
 
file  differentiablefunction.hh [code]
file  differentiablefunction.hh [code]
 
file  differentiablefunction_imp.hh [code]
file  differentiablefunction_imp.hh [code]
 
file  differentiablefunctionfromcallables.hh [code]
file  differentiablefunctionfromcallables.hh [code]
 
file  functionconcepts.hh [code]
file  functionconcepts.hh [code]
 
file  functionfromcallable.hh [code]
file  functionfromcallable.hh [code]
 
file  indexaccess.hh [code]
file  indexaccess.hh [code]
 
file  interfaces.hh [code]
file  interfaces.hh [code]
 
file  localfunction.hh [code]
file  localfunction.hh [code]
 
file  localfunction_imp.hh [code]
file  localfunction_imp.hh [code]
 
file  multiindex.hh [code]
file  multiindex.hh [code]
 
file  overflowarray.hh [code]
file  overflowarray.hh [code]
 
file  polymorphicsmallobject.hh [code]
file  polymorphicsmallobject.hh [code]
 
file  referencehelper.hh [code]
file  referencehelper.hh [code]
 
file  reserveddeque.hh [code]
 An stl-compliant double-ended queue which stores everything on the stack.
file  reserveddeque.hh [code]
 An stl-compliant double-ended queue which stores everything on the stack.
 
file  signature.hh [code]
file  signature.hh [code]
 
file  staticforloop.hh [code]
file  staticforloop.hh [code]
 
file  treedata.hh [code]
file  treedata.hh [code]
 
file  type_traits.hh [code]
file  type_traits.hh [code]
 
file  typeerasure.hh [code]
file  typeerasure.hh [code]
 
file  utility.hh [code]
file  utility.hh [code]
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/dir_55b300d561fb400353f8dbad76da65d6.html │ │ │ │ @@ -83,31 +83,31 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Files

file  analyticgridviewfunction.hh [code]
file  analyticgridviewfunction.hh [code]
 
file  composedgridfunction.hh [code]
file  composedgridfunction.hh [code]
 
file  discreteglobalbasisfunction.hh [code]
file  discreteglobalbasisfunction.hh [code]
 
file  facenormalgridfunction.hh [code]
file  facenormalgridfunction.hh [code]
 
file  gridfunction.hh [code]
file  gridfunction.hh [code]
 
file  gridfunction_imp.hh [code]
file  gridfunction_imp.hh [code]
 
file  gridviewentityset.hh [code]
file  gridviewentityset.hh [code]
 
file  gridviewfunction.hh [code]
file  gridviewfunction.hh [code]
 
file  localderivativetraits.hh [code]
file  localderivativetraits.hh [code]
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/dir_8457ebf380090bd61e5d3eab5b7eb9a1.html │ │ │ │ @@ -83,15 +83,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Files

file  backends/concepts.hh [code]
 
file  istlvectorbackend.hh [code]
file  istlvectorbackend.hh [code]
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/dir_a2250aba7ee066a4c694d7c3cf43d078.html │ │ │ │ @@ -83,74 +83,74 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Files

file  basistags.hh [code]
file  basistags.hh [code]
 
file  boundarydofs.hh [code]
file  boundarydofs.hh [code]
 
file  brezzidouglasmarinibasis.hh [code]
file  brezzidouglasmarinibasis.hh [code]
 
file  bsplinebasis.hh [code]
 The B-spline global function space basis.
file  bsplinebasis.hh [code]
 The B-spline global function space basis.
 
file  compositebasis.hh [code]
file  compositebasis.hh [code]
 
file  functionspacebases/concepts.hh [code]
 
file  defaultglobalbasis.hh [code]
file  defaultglobalbasis.hh [code]
 
file  defaultlocalview.hh [code]
file  defaultlocalview.hh [code]
 
file  defaultnodetorangemap.hh [code]
file  defaultnodetorangemap.hh [code]
 
file  flatmultiindex.hh [code]
file  flatmultiindex.hh [code]
 
file  flatvectorview.hh [code]
file  flatvectorview.hh [code]
 
file  globalvaluedlocalfiniteelement.hh [code]
file  globalvaluedlocalfiniteelement.hh [code]
 
file  hierarchicallagrangebasis.hh [code]
file  hierarchicallagrangebasis.hh [code]
 
file  hierarchicnodetorangemap.hh [code]
file  hierarchicnodetorangemap.hh [code]
 
file  hierarchicvectorwrapper.hh [code]
file  hierarchicvectorwrapper.hh [code]
 
file  interpolate.hh [code]
file  interpolate.hh [code]
 
file  lagrangebasis.hh [code]
file  lagrangebasis.hh [code]
 
file  lagrangedgbasis.hh [code]
file  lagrangedgbasis.hh [code]
 
file  nedelecbasis.hh [code]
file  nedelecbasis.hh [code]
 
file  nodes.hh [code]
file  nodes.hh [code]
 
file  periodicbasis.hh [code]
file  periodicbasis.hh [code]
 
file  powerbasis.hh [code]
file  powerbasis.hh [code]
 
file  rannacherturekbasis.hh [code]
file  rannacherturekbasis.hh [code]
 
file  raviartthomasbasis.hh [code]
file  raviartthomasbasis.hh [code]
 
file  sizeinfo.hh [code]
file  sizeinfo.hh [code]
 
file  subentitydofs.hh [code]
file  subentitydofs.hh [code]
 
file  subspacebasis.hh [code]
file  subspacebasis.hh [code]
 
file  subspacelocalview.hh [code]
file  subspacelocalview.hh [code]
 
file  taylorhoodbasis.hh [code]
file  taylorhoodbasis.hh [code]
 
file  transformedindexbasis.hh [code]
file  transformedindexbasis.hh [code]
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/dir_e22f2c69b2799e923164d7b2e4fa3f8c.html │ │ │ │ @@ -77,17 +77,17 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Files

file  polynomial.hh [code]
file  polynomial.hh [code]
 
file  trigonometricfunction.hh [code]
file  trigonometricfunction.hh [code]
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/dune-functions.tag.gz │ │ │ │ ├── dune-functions.tag │ │ │ │ │ ├── dune-functions.tag │ │ │ │ │ │ @@ -4,70 +4,39 @@ │ │ │ │ │ │ mainpage.md │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/doc/doxygen/ │ │ │ │ │ │ a00197.html │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ polynomial.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/analyticfunctions/ │ │ │ │ │ │ - a00071.html │ │ │ │ │ │ + a00161.html │ │ │ │ │ │ Dune::Functions::Polynomial │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ trigonometricfunction.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/analyticfunctions/ │ │ │ │ │ │ - a00068.html │ │ │ │ │ │ + a00164.html │ │ │ │ │ │ Dune::Functions::TrigonometricFunction │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ TrigonometricFunction< K, -cosFactor, sinFactor > │ │ │ │ │ │ derivative │ │ │ │ │ │ a00209.html │ │ │ │ │ │ ga7ec424ff4be740ad675bd85750940472 │ │ │ │ │ │ (const TrigonometricFunction< K, sinFactor, cosFactor > &f) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - backends/concepts.hh │ │ │ │ │ │ - /build/reproducible-path/dune-functions-2.9.0/dune/functions/backends/ │ │ │ │ │ │ - a02873.html │ │ │ │ │ │ - Dune::Functions::Concept::ConstVectorBackend │ │ │ │ │ │ - Dune::Functions::Concept::VectorBackend │ │ │ │ │ │ - Dune │ │ │ │ │ │ - Dune::Functions │ │ │ │ │ │ - Dune::Functions::Concept │ │ │ │ │ │ - │ │ │ │ │ │ - │ │ │ │ │ │ - functionspacebases/concepts.hh │ │ │ │ │ │ - /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a02876.html │ │ │ │ │ │ - dune/functions/common/utility.hh │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ - Dune::Functions::Concept::HasResize │ │ │ │ │ │ - Dune::Functions::Concept::HasSizeMethod │ │ │ │ │ │ - Dune::Functions::Concept::HasIndexAccess │ │ │ │ │ │ - Dune::Functions::Concept::BasisNode │ │ │ │ │ │ - Dune::Functions::Concept::LeafBasisNode │ │ │ │ │ │ - Dune::Functions::Concept::PowerBasisNode │ │ │ │ │ │ - Dune::Functions::Concept::CompositeBasisNode │ │ │ │ │ │ - Dune::Functions::Concept::BasisTree │ │ │ │ │ │ - Dune::Functions::Concept::PreBasis │ │ │ │ │ │ - Dune::Functions::Concept::LocalView │ │ │ │ │ │ - Dune::Functions::Concept::GlobalBasis │ │ │ │ │ │ - Dune │ │ │ │ │ │ - Dune::Functions │ │ │ │ │ │ - Dune::Functions::Concept │ │ │ │ │ │ - │ │ │ │ │ │ - │ │ │ │ │ │ istlvectorbackend.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/backends/ │ │ │ │ │ │ - a00074.html │ │ │ │ │ │ - dune/functions/common/indexaccess.hh │ │ │ │ │ │ + a00158.html │ │ │ │ │ │ + dune/functions/common/indexaccess.hh │ │ │ │ │ │ dune/functions/functionspacebases/concepts.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ constexpr auto │ │ │ │ │ │ fieldTypes │ │ │ │ │ │ a00219.html │ │ │ │ │ │ @@ -95,15 +64,15 @@ │ │ │ │ │ │ ga50a181637103e7abc011235a9fd30611 │ │ │ │ │ │ (const Vector &v) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ callable.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/common/ │ │ │ │ │ │ - a00056.html │ │ │ │ │ │ + a00023.html │ │ │ │ │ │ Dune::Functions::CallableFunctionWrapper │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ CallableFunctionWrapper< F > │ │ │ │ │ │ callable │ │ │ │ │ │ a00209.html │ │ │ │ │ │ @@ -117,54 +86,54 @@ │ │ │ │ │ │ ga5831245ed303c2103ab06af079cb8cf9 │ │ │ │ │ │ (const std::shared_ptr< F > &fp) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ defaultderivativetraits.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/common/ │ │ │ │ │ │ - a00029.html │ │ │ │ │ │ + a00035.html │ │ │ │ │ │ Dune::Functions::InvalidRange │ │ │ │ │ │ Dune::Functions::DefaultDerivativeTraits │ │ │ │ │ │ Dune::Functions::DefaultDerivativeTraits< double(double) > │ │ │ │ │ │ Dune::Functions::DefaultDerivativeTraits< K(FieldVector< K, n >)> │ │ │ │ │ │ Dune::Functions::DefaultDerivativeTraits< FieldVector< K, m >(FieldVector< K, n >)> │ │ │ │ │ │ Dune::Functions::DefaultDerivativeTraits< FieldMatrix< K, 1, m >(FieldVector< K, n >)> │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ differentiablefunction.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/common/ │ │ │ │ │ │ - a00050.html │ │ │ │ │ │ - dune/functions/common/type_traits.hh │ │ │ │ │ │ - dune/functions/common/defaultderivativetraits.hh │ │ │ │ │ │ - dune/functions/common/differentiablefunction_imp.hh │ │ │ │ │ │ - dune/functions/common/signature.hh │ │ │ │ │ │ - dune/functions/common/typeerasure.hh │ │ │ │ │ │ - dune/functions/common/functionconcepts.hh │ │ │ │ │ │ + a00038.html │ │ │ │ │ │ + dune/functions/common/type_traits.hh │ │ │ │ │ │ + dune/functions/common/defaultderivativetraits.hh │ │ │ │ │ │ + dune/functions/common/differentiablefunction_imp.hh │ │ │ │ │ │ + dune/functions/common/signature.hh │ │ │ │ │ │ + dune/functions/common/typeerasure.hh │ │ │ │ │ │ + dune/functions/common/functionconcepts.hh │ │ │ │ │ │ Dune::Functions::DifferentiableFunction │ │ │ │ │ │ Dune::Functions::DifferentiableFunction< Range(Domain), DerivativeTraits, bufferSize > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ differentiablefunction_imp.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/common/ │ │ │ │ │ │ - a00008.html │ │ │ │ │ │ - dune/functions/common/type_traits.hh │ │ │ │ │ │ + a00020.html │ │ │ │ │ │ + dune/functions/common/type_traits.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ differentiablefunctionfromcallables.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/common/ │ │ │ │ │ │ - a00011.html │ │ │ │ │ │ - dune/functions/common/signature.hh │ │ │ │ │ │ - dune/functions/common/differentiablefunction.hh │ │ │ │ │ │ - dune/functions/common/functionconcepts.hh │ │ │ │ │ │ + a00014.html │ │ │ │ │ │ + dune/functions/common/signature.hh │ │ │ │ │ │ + dune/functions/common/differentiablefunction.hh │ │ │ │ │ │ + dune/functions/common/functionconcepts.hh │ │ │ │ │ │ Dune::Functions::DifferentiableFunctionFromCallables< Range(Domain), DerivativeTraits, F > │ │ │ │ │ │ Dune::Functions::DifferentiableFunctionFromCallables< Range(Domain), DerivativeTraits, F, DF, Derivatives... > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ DifferentiableFunctionFromCallables< Signature, DerivativeTraits, F... > │ │ │ │ │ │ makeDifferentiableFunctionFromCallables │ │ │ │ │ │ @@ -172,18 +141,18 @@ │ │ │ │ │ │ gad3bb1b3fe74c7f750a3980f4c0ce0449 │ │ │ │ │ │ (const SignatureTag< Signature, DerivativeTraits > &signatureTag, F &&... f) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ functionconcepts.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/common/ │ │ │ │ │ │ - a00026.html │ │ │ │ │ │ - dune/functions/common/signature.hh │ │ │ │ │ │ - dune/functions/gridfunctions/localderivativetraits.hh │ │ │ │ │ │ - dune/functions/gridfunctions/gridviewentityset.hh │ │ │ │ │ │ + a00005.html │ │ │ │ │ │ + dune/functions/common/signature.hh │ │ │ │ │ │ + dune/functions/gridfunctions/localderivativetraits.hh │ │ │ │ │ │ + dune/functions/gridfunctions/gridviewentityset.hh │ │ │ │ │ │ Dune::Functions::Concept::Callable │ │ │ │ │ │ Dune::Functions::Concept::Function< Range(Domain)> │ │ │ │ │ │ Dune::Functions::Concept::DifferentiableFunction< Range(Domain), DerivativeTraits > │ │ │ │ │ │ Dune::Functions::Concept::LocalFunction< Range(Domain), LocalContext > │ │ │ │ │ │ Dune::Functions::Concept::DifferentiableLocalFunction< Range(Domain), LocalContext, DerivativeTraits > │ │ │ │ │ │ Dune::Functions::Concept::EntitySet │ │ │ │ │ │ Dune::Functions::Concept::GridFunction< Range(Domain), EntitySet > │ │ │ │ │ │ @@ -284,25 +253,25 @@ │ │ │ │ │ │ ga5fe279401b9387533b85b085d6d521cc │ │ │ │ │ │ () │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ functionfromcallable.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/common/ │ │ │ │ │ │ - a00041.html │ │ │ │ │ │ - dune/functions/common/signature.hh │ │ │ │ │ │ + a00059.html │ │ │ │ │ │ + dune/functions/common/signature.hh │ │ │ │ │ │ Dune::Functions::FunctionFromCallable< Range(Domain), F, FunctionInterface > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ indexaccess.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/common/ │ │ │ │ │ │ - a00017.html │ │ │ │ │ │ - dune/functions/common/utility.hh │ │ │ │ │ │ + a00032.html │ │ │ │ │ │ + dune/functions/common/utility.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ auto │ │ │ │ │ │ hybridIndexAccess │ │ │ │ │ │ a00215.html │ │ │ │ │ │ ga2226fe3a86eb176df27c9801a98a10ae │ │ │ │ │ │ @@ -343,46 +312,46 @@ │ │ │ │ │ │ ga4cc6af2842348271c242c048e0411637 │ │ │ │ │ │ (C &&c, const MultiIndex &multiIndex) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ interfaces.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/common/ │ │ │ │ │ │ - a00047.html │ │ │ │ │ │ + a00053.html │ │ │ │ │ │ Dune::Functions::PolymorphicType │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ localfunction.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/common/ │ │ │ │ │ │ - a00062.html │ │ │ │ │ │ - dune/functions/common/defaultderivativetraits.hh │ │ │ │ │ │ - dune/functions/common/differentiablefunction.hh │ │ │ │ │ │ - dune/functions/common/localfunction_imp.hh │ │ │ │ │ │ - dune/functions/common/typeerasure.hh │ │ │ │ │ │ - dune/functions/common/functionconcepts.hh │ │ │ │ │ │ + a00002.html │ │ │ │ │ │ + dune/functions/common/defaultderivativetraits.hh │ │ │ │ │ │ + dune/functions/common/differentiablefunction.hh │ │ │ │ │ │ + dune/functions/common/localfunction_imp.hh │ │ │ │ │ │ + dune/functions/common/typeerasure.hh │ │ │ │ │ │ + dune/functions/common/functionconcepts.hh │ │ │ │ │ │ Dune::Functions::LocalFunction │ │ │ │ │ │ Dune::Functions::LocalFunction< Range(Domain), LocalContext, DerivativeTraits, bufferSize > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ localfunction_imp.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/common/ │ │ │ │ │ │ - a00023.html │ │ │ │ │ │ - dune/functions/common/type_traits.hh │ │ │ │ │ │ - dune/functions/common/differentiablefunction_imp.hh │ │ │ │ │ │ + a00011.html │ │ │ │ │ │ + dune/functions/common/type_traits.hh │ │ │ │ │ │ + dune/functions/common/differentiablefunction_imp.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ multiindex.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/common/ │ │ │ │ │ │ - a00059.html │ │ │ │ │ │ + a00056.html │ │ │ │ │ │ Dune::Functions::StaticMultiIndex │ │ │ │ │ │ Dune::Functions::StaticMultiIndex< size_type, 1 > │ │ │ │ │ │ std::tuple_size< Dune::Functions::StaticMultiIndex< size_type, n > > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ Stream & │ │ │ │ │ │ @@ -391,31 +360,31 @@ │ │ │ │ │ │ af1c4bfbe0c688f745e4731c519db55dd │ │ │ │ │ │ (Stream &stream, const StaticMultiIndex< size_type, n > &c) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ overflowarray.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/common/ │ │ │ │ │ │ - a00038.html │ │ │ │ │ │ + a00065.html │ │ │ │ │ │ Dune::Functions::OverflowArray │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ polymorphicsmallobject.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/common/ │ │ │ │ │ │ - a00035.html │ │ │ │ │ │ + a00062.html │ │ │ │ │ │ Dune::Functions::PolymorphicSmallObject │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ referencehelper.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/common/ │ │ │ │ │ │ - a00032.html │ │ │ │ │ │ + a00008.html │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ Dune::ResolveRef_t< T > │ │ │ │ │ │ ResolveRef_t │ │ │ │ │ │ a00219.html │ │ │ │ │ │ a51755a2fa6d9e5737a8e2b32cbe3cc15 │ │ │ │ │ │ @@ -435,31 +404,31 @@ │ │ │ │ │ │ a432dd9531e141b59ba6b90a6104f2cb7 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ reserveddeque.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/common/ │ │ │ │ │ │ - a00065.html │ │ │ │ │ │ + a00026.html │ │ │ │ │ │ Dune::Functions::ReservedDeque │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ #define │ │ │ │ │ │ CHECKSIZE │ │ │ │ │ │ - a00065.html │ │ │ │ │ │ + a00026.html │ │ │ │ │ │ a65543e75bc949ecdb95a25b1f4e11675 │ │ │ │ │ │ (X) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ signature.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/common/ │ │ │ │ │ │ - a00020.html │ │ │ │ │ │ - dune/functions/common/defaultderivativetraits.hh │ │ │ │ │ │ + a00017.html │ │ │ │ │ │ + dune/functions/common/defaultderivativetraits.hh │ │ │ │ │ │ Dune::Functions::SignatureTraits │ │ │ │ │ │ Dune::Functions::SignatureTag< Range(Domain), DerivativeTraitsT > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ auto │ │ │ │ │ │ derivativeSignatureTag │ │ │ │ │ │ @@ -474,45 +443,45 @@ │ │ │ │ │ │ ga95d38d90c6b8ee6d3a2a0202cb80b56d │ │ │ │ │ │ (Dune::Functions::SignatureTag< Signature, DerivativeTraits > tag) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ staticforloop.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/common/ │ │ │ │ │ │ - a00014.html │ │ │ │ │ │ - dune/functions/common/type_traits.hh │ │ │ │ │ │ + a00050.html │ │ │ │ │ │ + dune/functions/common/type_traits.hh │ │ │ │ │ │ dune/functions/functionspacebases/concepts.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ void │ │ │ │ │ │ staticFindInRange │ │ │ │ │ │ a00215.html │ │ │ │ │ │ gaa625ea93bc3285b8a09c9267302386ec │ │ │ │ │ │ (F &&f, Args &&... args) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ treedata.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/common/ │ │ │ │ │ │ - a00053.html │ │ │ │ │ │ - dune/functions/gridfunctions/gridviewentityset.hh │ │ │ │ │ │ - dune/functions/gridfunctions/gridfunction.hh │ │ │ │ │ │ + a00041.html │ │ │ │ │ │ + dune/functions/gridfunctions/gridviewentityset.hh │ │ │ │ │ │ + dune/functions/gridfunctions/gridfunction.hh │ │ │ │ │ │ Dune::Functions::UniformNodeVisitor │ │ │ │ │ │ Dune::Functions::TreeData │ │ │ │ │ │ Dune::Functions::TreeData::InitVisitor │ │ │ │ │ │ Dune::Functions::TreeData::DestroyVisitor │ │ │ │ │ │ Dune::Functions::TreeData::CopyVisitor │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ type_traits.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/common/ │ │ │ │ │ │ - a00005.html │ │ │ │ │ │ + a00044.html │ │ │ │ │ │ Dune::Functions::HasStaticSize │ │ │ │ │ │ Dune::Functions::StaticSize │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ typename std::enable_if< std::is_constructible< T, Args... >::value, int >::type │ │ │ │ │ │ enableIfConstructible │ │ │ │ │ │ @@ -520,27 +489,27 @@ │ │ │ │ │ │ ga673247dd74bcdd9e5acfc7735faf8a5b │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ typeerasure.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/common/ │ │ │ │ │ │ - a00002.html │ │ │ │ │ │ - dune/functions/common/type_traits.hh │ │ │ │ │ │ - dune/functions/common/interfaces.hh │ │ │ │ │ │ - dune/functions/common/polymorphicsmallobject.hh │ │ │ │ │ │ + a00029.html │ │ │ │ │ │ + dune/functions/common/type_traits.hh │ │ │ │ │ │ + dune/functions/common/interfaces.hh │ │ │ │ │ │ + dune/functions/common/polymorphicsmallobject.hh │ │ │ │ │ │ Dune::Functions::TypeErasureBase │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ utility.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/common/ │ │ │ │ │ │ - a00044.html │ │ │ │ │ │ - dune/functions/common/functionconcepts.hh │ │ │ │ │ │ + a00047.html │ │ │ │ │ │ + dune/functions/common/functionconcepts.hh │ │ │ │ │ │ Dune::Functions::LastType │ │ │ │ │ │ Dune::Functions::RotateTuple │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ typename Imp::ExpandTupleHelper< T, ArgTuple >::Type │ │ │ │ │ │ ExpandTuple │ │ │ │ │ │ @@ -618,15 +587,15 @@ │ │ │ │ │ │ a6bb3a351c2ab1b4eb46d4ba1ec3d95a0 │ │ │ │ │ │ (T &&t) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ basistags.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00161.html │ │ │ │ │ │ + a00092.html │ │ │ │ │ │ Dune::Functions::Concept::IndexMergingStrategy │ │ │ │ │ │ Dune::Functions::BasisFactory::IndexMergingStrategy │ │ │ │ │ │ Dune::Functions::BasisFactory::FlatLexicographic │ │ │ │ │ │ Dune::Functions::BasisFactory::FlatInterleaved │ │ │ │ │ │ Dune::Functions::BasisFactory::BlockedLexicographic │ │ │ │ │ │ Dune::Functions::BasisFactory::BlockedInterleaved │ │ │ │ │ │ Dune │ │ │ │ │ │ @@ -683,33 +652,33 @@ │ │ │ │ │ │ ga649b67336300e9f05e38b5479ca21a24 │ │ │ │ │ │ () │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ boundarydofs.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00116.html │ │ │ │ │ │ - dune/functions/functionspacebases/subentitydofs.hh │ │ │ │ │ │ + a00074.html │ │ │ │ │ │ + dune/functions/functionspacebases/subentitydofs.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ void │ │ │ │ │ │ forEachBoundaryDOF │ │ │ │ │ │ a00214.html │ │ │ │ │ │ gaa60b94e3da01aa62a555f6955a7f09e5 │ │ │ │ │ │ (const Basis &basis, F &&f) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ brezzidouglasmarinibasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00146.html │ │ │ │ │ │ - dune/functions/functionspacebases/globalvaluedlocalfiniteelement.hh │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ - dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ + a00098.html │ │ │ │ │ │ + dune/functions/functionspacebases/globalvaluedlocalfiniteelement.hh │ │ │ │ │ │ + dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ Dune::Functions::BrezziDouglasMariniPreBasis │ │ │ │ │ │ Dune::Functions::BrezziDouglasMariniNode │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ │ │ │ │ │ │ DefaultGlobalBasis< BrezziDouglasMariniPreBasis< GV, k > > │ │ │ │ │ │ @@ -725,17 +694,17 @@ │ │ │ │ │ │ ga72847f418332ba3d5444a7f153776610 │ │ │ │ │ │ () │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ bsplinebasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00167.html │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ - dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ + a00083.html │ │ │ │ │ │ + dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ Dune::Functions::BSplineLocalBasis │ │ │ │ │ │ Dune::Functions::BSplineLocalCoefficients │ │ │ │ │ │ Dune::Functions::BSplineLocalInterpolation │ │ │ │ │ │ Dune::Functions::BSplineLocalFiniteElement │ │ │ │ │ │ Dune::Functions::BSplinePreBasis │ │ │ │ │ │ Dune::Functions::BSplineNode │ │ │ │ │ │ Dune │ │ │ │ │ │ @@ -755,41 +724,72 @@ │ │ │ │ │ │ ga63a9701af71fffbbb851a38cb8cf886f │ │ │ │ │ │ (const std::vector< double > &knotVector, unsigned int order, bool makeOpen=true) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ compositebasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00107.html │ │ │ │ │ │ - dune/functions/common/staticforloop.hh │ │ │ │ │ │ - dune/functions/common/type_traits.hh │ │ │ │ │ │ - dune/functions/common/utility.hh │ │ │ │ │ │ - dune/functions/functionspacebases/basistags.hh │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + a00125.html │ │ │ │ │ │ + dune/functions/common/staticforloop.hh │ │ │ │ │ │ + dune/functions/common/type_traits.hh │ │ │ │ │ │ + dune/functions/common/utility.hh │ │ │ │ │ │ + dune/functions/functionspacebases/basistags.hh │ │ │ │ │ │ + dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ dune/functions/functionspacebases/concepts.hh │ │ │ │ │ │ - dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ + dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ Dune::Functions::CompositePreBasis │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ Dune::Functions::BasisBuilder │ │ │ │ │ │ │ │ │ │ │ │ auto │ │ │ │ │ │ composite │ │ │ │ │ │ a00213.html │ │ │ │ │ │ ga0ee62f9744ec8ba58fdfc4c68df34449 │ │ │ │ │ │ (Args &&... args) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + backends/concepts.hh │ │ │ │ │ │ + /build/reproducible-path/dune-functions-2.9.0/dune/functions/backends/ │ │ │ │ │ │ + a02873.html │ │ │ │ │ │ + Dune::Functions::Concept::ConstVectorBackend │ │ │ │ │ │ + Dune::Functions::Concept::VectorBackend │ │ │ │ │ │ + Dune │ │ │ │ │ │ + Dune::Functions │ │ │ │ │ │ + Dune::Functions::Concept │ │ │ │ │ │ + │ │ │ │ │ │ + │ │ │ │ │ │ + functionspacebases/concepts.hh │ │ │ │ │ │ + /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ + a02876.html │ │ │ │ │ │ + dune/functions/common/utility.hh │ │ │ │ │ │ + dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + Dune::Functions::Concept::HasResize │ │ │ │ │ │ + Dune::Functions::Concept::HasSizeMethod │ │ │ │ │ │ + Dune::Functions::Concept::HasIndexAccess │ │ │ │ │ │ + Dune::Functions::Concept::BasisNode │ │ │ │ │ │ + Dune::Functions::Concept::LeafBasisNode │ │ │ │ │ │ + Dune::Functions::Concept::PowerBasisNode │ │ │ │ │ │ + Dune::Functions::Concept::CompositeBasisNode │ │ │ │ │ │ + Dune::Functions::Concept::BasisTree │ │ │ │ │ │ + Dune::Functions::Concept::PreBasis │ │ │ │ │ │ + Dune::Functions::Concept::LocalView │ │ │ │ │ │ + Dune::Functions::Concept::GlobalBasis │ │ │ │ │ │ + Dune │ │ │ │ │ │ + Dune::Functions │ │ │ │ │ │ + Dune::Functions::Concept │ │ │ │ │ │ + │ │ │ │ │ │ + │ │ │ │ │ │ defaultglobalbasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00128.html │ │ │ │ │ │ - dune/functions/common/type_traits.hh │ │ │ │ │ │ - dune/functions/functionspacebases/defaultlocalview.hh │ │ │ │ │ │ + a00149.html │ │ │ │ │ │ + dune/functions/common/type_traits.hh │ │ │ │ │ │ + dune/functions/functionspacebases/defaultlocalview.hh │ │ │ │ │ │ dune/functions/functionspacebases/concepts.hh │ │ │ │ │ │ Dune::Functions::DefaultGlobalBasis │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ Dune::Functions::BasisBuilder │ │ │ │ │ │ │ │ │ │ │ │ @@ -813,26 +813,26 @@ │ │ │ │ │ │ a1f0dc55c03c3a9862c76456d5574abe2 │ │ │ │ │ │ (const GridView &gridView, PreBasisFactory &&preBasisFactory) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ defaultlocalview.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00131.html │ │ │ │ │ │ - dune/functions/common/overflowarray.hh │ │ │ │ │ │ - dune/functions/common/multiindex.hh │ │ │ │ │ │ + a00143.html │ │ │ │ │ │ + dune/functions/common/overflowarray.hh │ │ │ │ │ │ + dune/functions/common/multiindex.hh │ │ │ │ │ │ dune/functions/functionspacebases/concepts.hh │ │ │ │ │ │ Dune::Functions::DefaultLocalView │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ defaultnodetorangemap.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00170.html │ │ │ │ │ │ + a00068.html │ │ │ │ │ │ dune/functions/functionspacebases/concepts.hh │ │ │ │ │ │ Dune::Functions::DefaultNodeToRangeMap │ │ │ │ │ │ Dune::Functions::DefaultNodeToRangeMap::Visitor │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ DefaultNodeToRangeMap< Tree > │ │ │ │ │ │ @@ -848,30 +848,30 @@ │ │ │ │ │ │ ad5971c4cc40d4d8a400ef5fe9e596350 │ │ │ │ │ │ (const Basis &basis, TreePath &&treePath) -> decltype(makeDefaultNodeToRangeMap(TypeTree::child(basis.localView().tree(), treePath))) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ flatmultiindex.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00113.html │ │ │ │ │ │ - dune/functions/common/multiindex.hh │ │ │ │ │ │ + a00122.html │ │ │ │ │ │ + dune/functions/common/multiindex.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ StaticMultiIndex< size_type, 1 > │ │ │ │ │ │ FlatMultiIndex │ │ │ │ │ │ a00214.html │ │ │ │ │ │ ga6b523ca86bfec2581ea9c173a722f8f3 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ flatvectorview.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00140.html │ │ │ │ │ │ + a00095.html │ │ │ │ │ │ dune/functions/functionspacebases/concepts.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ auto │ │ │ │ │ │ flatVectorView │ │ │ │ │ │ a00219.html │ │ │ │ │ │ @@ -892,24 +892,24 @@ │ │ │ │ │ │ a4fac6802f21000f59e52aade3cd47b08 │ │ │ │ │ │ (T &&t) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ globalvaluedlocalfiniteelement.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00173.html │ │ │ │ │ │ + a00155.html │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ hierarchicallagrangebasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00119.html │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ - dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ + a00128.html │ │ │ │ │ │ + dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ Dune::Functions::HierarchicalLagrangePreBasis │ │ │ │ │ │ Dune::Functions::HierarchicalLagrangeNode │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ │ │ │ │ │ │ DefaultGlobalBasis< HierarchicalLagrangePreBasis< GV, k, R > > │ │ │ │ │ │ @@ -925,28 +925,28 @@ │ │ │ │ │ │ gae1668779c06b647fd909294cbedf28cf │ │ │ │ │ │ () │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ hierarchicnodetorangemap.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00185.html │ │ │ │ │ │ + a00134.html │ │ │ │ │ │ dune/functions/functionspacebases/concepts.hh │ │ │ │ │ │ - dune/functions/common/indexaccess.hh │ │ │ │ │ │ + dune/functions/common/indexaccess.hh │ │ │ │ │ │ Dune::Functions::HierarchicNodeToRangeMap │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ hierarchicvectorwrapper.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00176.html │ │ │ │ │ │ - dune/functions/common/indexaccess.hh │ │ │ │ │ │ - dune/functions/common/utility.hh │ │ │ │ │ │ - dune/functions/common/type_traits.hh │ │ │ │ │ │ + a00131.html │ │ │ │ │ │ + dune/functions/common/indexaccess.hh │ │ │ │ │ │ + dune/functions/common/utility.hh │ │ │ │ │ │ + dune/functions/common/type_traits.hh │ │ │ │ │ │ dune/functions/functionspacebases/concepts.hh │ │ │ │ │ │ Dune::Functions::HierarchicVectorWrapper │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ HierarchicVectorWrapper< V > │ │ │ │ │ │ hierarchicVector │ │ │ │ │ │ @@ -968,22 +968,22 @@ │ │ │ │ │ │ ae48bf799daaf0751086b47457350675e │ │ │ │ │ │ (V &v) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ interpolate.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00188.html │ │ │ │ │ │ - dune/functions/gridfunctions/gridviewfunction.hh │ │ │ │ │ │ - dune/functions/common/functionconcepts.hh │ │ │ │ │ │ + a00080.html │ │ │ │ │ │ + dune/functions/gridfunctions/gridviewfunction.hh │ │ │ │ │ │ + dune/functions/common/functionconcepts.hh │ │ │ │ │ │ dune/functions/backends/concepts.hh │ │ │ │ │ │ - dune/functions/backends/istlvectorbackend.hh │ │ │ │ │ │ - dune/functions/functionspacebases/sizeinfo.hh │ │ │ │ │ │ - dune/functions/functionspacebases/flatvectorview.hh │ │ │ │ │ │ - dune/functions/functionspacebases/hierarchicnodetorangemap.hh │ │ │ │ │ │ + dune/functions/backends/istlvectorbackend.hh │ │ │ │ │ │ + dune/functions/functionspacebases/sizeinfo.hh │ │ │ │ │ │ + dune/functions/functionspacebases/flatvectorview.hh │ │ │ │ │ │ + dune/functions/functionspacebases/hierarchicnodetorangemap.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ void │ │ │ │ │ │ interpolate │ │ │ │ │ │ a00219.html │ │ │ │ │ │ a13b0c6bf02d744e7b2078d1a535b5211 │ │ │ │ │ │ @@ -1003,17 +1003,17 @@ │ │ │ │ │ │ a2e34859322800ae26a292903910ef9f7 │ │ │ │ │ │ (const B &basis, C &&coeff, const F &f) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ lagrangebasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00134.html │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ - dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ + a00119.html │ │ │ │ │ │ + dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ Dune::Functions::LagrangePreBasis │ │ │ │ │ │ Dune::Functions::LagrangeNode │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ │ │ │ │ │ │ DefaultGlobalBasis< LagrangePreBasis< GV, k, R > > │ │ │ │ │ │ @@ -1036,18 +1036,18 @@ │ │ │ │ │ │ ga177b4e1b21990d7fc9350ac0caeb3c6c │ │ │ │ │ │ (int order) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ lagrangedgbasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00155.html │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ - dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ - dune/functions/functionspacebases/lagrangebasis.hh │ │ │ │ │ │ + a00146.html │ │ │ │ │ │ + dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ + dune/functions/functionspacebases/lagrangebasis.hh │ │ │ │ │ │ Dune::Functions::LagrangeDGPreBasis │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ │ │ │ │ │ │ LagrangeNode< GV, k > │ │ │ │ │ │ LagrangeDGNode │ │ │ │ │ │ @@ -1069,18 +1069,18 @@ │ │ │ │ │ │ gae7dbc0c4e48b9cf3da63d6ef431b3481 │ │ │ │ │ │ () │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ nedelecbasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00143.html │ │ │ │ │ │ - dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ - dune/functions/functionspacebases/globalvaluedlocalfiniteelement.hh │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + a00152.html │ │ │ │ │ │ + dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ + dune/functions/functionspacebases/globalvaluedlocalfiniteelement.hh │ │ │ │ │ │ + dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ Dune::Functions::NedelecPreBasis │ │ │ │ │ │ Dune::Functions::NedelecNode │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ │ │ │ │ │ │ DefaultGlobalBasis< NedelecPreBasis< GV, Range, kind, order > > │ │ │ │ │ │ @@ -1096,15 +1096,15 @@ │ │ │ │ │ │ gafe0fe439067c288f197101b8686223e8 │ │ │ │ │ │ () │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ nodes.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00110.html │ │ │ │ │ │ + a00116.html │ │ │ │ │ │ Dune::Functions::BasisNodeMixin │ │ │ │ │ │ Dune::Functions::LeafBasisNode │ │ │ │ │ │ Dune::Functions::PowerBasisNode │ │ │ │ │ │ Dune::Functions::CompositeBasisNode │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ @@ -1128,17 +1128,17 @@ │ │ │ │ │ │ a5e19b913a34ad68144f4fd873c51b977 │ │ │ │ │ │ (Tree &tree, std::size_t treeIndexOffset=0) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ periodicbasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00191.html │ │ │ │ │ │ + a00107.html │ │ │ │ │ │ dune/functions/functionspacebases/concepts.hh │ │ │ │ │ │ - dune/functions/functionspacebases/transformedindexbasis.hh │ │ │ │ │ │ + dune/functions/functionspacebases/transformedindexbasis.hh │ │ │ │ │ │ Dune::Functions::BasisFactory::Experimental::PeriodicIndexSet │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ Dune::Functions::BasisFactory::Experimental │ │ │ │ │ │ │ │ │ │ │ │ auto │ │ │ │ │ │ @@ -1147,21 +1147,21 @@ │ │ │ │ │ │ ga797d4c1dfcfe6b0a98de9284c4f6b5e3 │ │ │ │ │ │ (RawPreBasisIndicator &&rawPreBasisIndicator, PIS &&periodicIndexSet) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ powerbasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00152.html │ │ │ │ │ │ - dune/functions/common/utility.hh │ │ │ │ │ │ - dune/functions/common/type_traits.hh │ │ │ │ │ │ - dune/functions/functionspacebases/basistags.hh │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + a00086.html │ │ │ │ │ │ + dune/functions/common/utility.hh │ │ │ │ │ │ + dune/functions/common/type_traits.hh │ │ │ │ │ │ + dune/functions/functionspacebases/basistags.hh │ │ │ │ │ │ + dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ dune/functions/functionspacebases/concepts.hh │ │ │ │ │ │ - dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ + dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ Dune::Functions::PowerPreBasis │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ Dune::Functions::BasisBuilder │ │ │ │ │ │ │ │ │ │ │ │ auto │ │ │ │ │ │ @@ -1177,17 +1177,17 @@ │ │ │ │ │ │ gab84b622cf7be16d0373640b6f0478eb0 │ │ │ │ │ │ (ChildPreBasisFactory &&childPreBasisFactory) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ rannacherturekbasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00182.html │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ - dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ + a00113.html │ │ │ │ │ │ + dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ Dune::Functions::RannacherTurekPreBasis │ │ │ │ │ │ Dune::Functions::RannacherTurekNode │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ │ │ │ │ │ │ DefaultGlobalBasis< RannacherTurekPreBasis< GV > > │ │ │ │ │ │ @@ -1203,18 +1203,18 @@ │ │ │ │ │ │ ga366449c1a41fc29ff55fed0c1485f60b │ │ │ │ │ │ () │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ raviartthomasbasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00149.html │ │ │ │ │ │ - dune/functions/functionspacebases/globalvaluedlocalfiniteelement.hh │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ - dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ + a00140.html │ │ │ │ │ │ + dune/functions/functionspacebases/globalvaluedlocalfiniteelement.hh │ │ │ │ │ │ + dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ Dune::Functions::RaviartThomasPreBasis │ │ │ │ │ │ Dune::Functions::RaviartThomasNode │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ │ │ │ │ │ │ DefaultGlobalBasis< RaviartThomasPreBasis< GV, k > > │ │ │ │ │ │ @@ -1230,30 +1230,30 @@ │ │ │ │ │ │ gac7c656af99728aa385381f5d78ae0b98 │ │ │ │ │ │ () │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ sizeinfo.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00137.html │ │ │ │ │ │ + a00110.html │ │ │ │ │ │ Dune::Functions::SizeInfo │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ SizeInfo< Basis > │ │ │ │ │ │ sizeInfo │ │ │ │ │ │ a00219.html │ │ │ │ │ │ abd7e25a89325dbe2232b17308dae45f2 │ │ │ │ │ │ (const Basis &basis) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ subentitydofs.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00164.html │ │ │ │ │ │ + a00089.html │ │ │ │ │ │ Dune::Functions::SubEntityDOFs │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ auto │ │ │ │ │ │ subEntityDOFs │ │ │ │ │ │ a00214.html │ │ │ │ │ │ @@ -1274,17 +1274,17 @@ │ │ │ │ │ │ ga09ad7987f85909bfcf269a0de9c652d8 │ │ │ │ │ │ (const LocalView &localView, const Intersection &intersection) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ subspacebasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00158.html │ │ │ │ │ │ - dune/functions/common/type_traits.hh │ │ │ │ │ │ - dune/functions/functionspacebases/subspacelocalview.hh │ │ │ │ │ │ + a00104.html │ │ │ │ │ │ + dune/functions/common/type_traits.hh │ │ │ │ │ │ + dune/functions/functionspacebases/subspacelocalview.hh │ │ │ │ │ │ dune/functions/functionspacebases/concepts.hh │ │ │ │ │ │ Dune::Functions::SubspaceBasis │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ SubspaceBasis │ │ │ │ │ │ @@ -1313,27 +1313,27 @@ │ │ │ │ │ │ abb8781cf3fb98ca29446be66bcf65ac4 │ │ │ │ │ │ (const RootBasis &rootBasis, const PrefixTreeIndices &... prefixTreeIndices) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ subspacelocalview.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00122.html │ │ │ │ │ │ + a00101.html │ │ │ │ │ │ dune/functions/functionspacebases/concepts.hh │ │ │ │ │ │ Dune::Functions::SubspaceLocalView │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ taylorhoodbasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00125.html │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ - dune/functions/functionspacebases/lagrangebasis.hh │ │ │ │ │ │ - dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ + a00077.html │ │ │ │ │ │ + dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + dune/functions/functionspacebases/lagrangebasis.hh │ │ │ │ │ │ + dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ Dune::Functions::TaylorHoodPreBasis │ │ │ │ │ │ Dune::Functions::TaylorHoodVelocityTree │ │ │ │ │ │ Dune::Functions::TaylorHoodBasisTree │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ │ │ │ │ │ │ @@ -1350,22 +1350,22 @@ │ │ │ │ │ │ ga2384fc6a8ee2005fb29adb7221609ce3 │ │ │ │ │ │ () │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ transformedindexbasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00179.html │ │ │ │ │ │ - dune/functions/common/staticforloop.hh │ │ │ │ │ │ - dune/functions/common/type_traits.hh │ │ │ │ │ │ - dune/functions/common/utility.hh │ │ │ │ │ │ - dune/functions/functionspacebases/basistags.hh │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + a00137.html │ │ │ │ │ │ + dune/functions/common/staticforloop.hh │ │ │ │ │ │ + dune/functions/common/type_traits.hh │ │ │ │ │ │ + dune/functions/common/utility.hh │ │ │ │ │ │ + dune/functions/functionspacebases/basistags.hh │ │ │ │ │ │ + dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ dune/functions/functionspacebases/concepts.hh │ │ │ │ │ │ - dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ + dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ Dune::Functions::Experimental::TransformedIndexPreBasis │ │ │ │ │ │ Dune::Functions::BasisFactory::Experimental::GenericIndexingTransformation │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::Experimental │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ Dune::Functions::BasisFactory::Experimental │ │ │ │ │ │ @@ -1390,60 +1390,60 @@ │ │ │ │ │ │ af76509ea5d22293cf990c33c3306992f │ │ │ │ │ │ (IndexTransformation &&indexTransformation, SizeImplementation &&sizeImplementation, Dune::index_constant< minIndexSize >, Dune::index_constant< maxIndexSize >) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ analyticgridviewfunction.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/gridfunctions/ │ │ │ │ │ │ - a00092.html │ │ │ │ │ │ - dune/functions/common/signature.hh │ │ │ │ │ │ - dune/functions/common/defaultderivativetraits.hh │ │ │ │ │ │ - dune/functions/common/differentiablefunction_imp.hh │ │ │ │ │ │ - dune/functions/common/differentiablefunction.hh │ │ │ │ │ │ - dune/functions/gridfunctions/gridviewentityset.hh │ │ │ │ │ │ - dune/functions/gridfunctions/localderivativetraits.hh │ │ │ │ │ │ + a00185.html │ │ │ │ │ │ + dune/functions/common/signature.hh │ │ │ │ │ │ + dune/functions/common/defaultderivativetraits.hh │ │ │ │ │ │ + dune/functions/common/differentiablefunction_imp.hh │ │ │ │ │ │ + dune/functions/common/differentiablefunction.hh │ │ │ │ │ │ + dune/functions/gridfunctions/gridviewentityset.hh │ │ │ │ │ │ + dune/functions/gridfunctions/localderivativetraits.hh │ │ │ │ │ │ Dune::Functions::AnalyticGridViewFunction< Range(Domain), GV, F, DerivativeTraits > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ AnalyticGridViewFunction< typename std::invoke_result< F, typename GridView::template Codim< 0 >::Geometry::GlobalCoordinate >::type(typename GridView::template Codim< 0 >::Geometry::GlobalCoordinate), GridView, typename std::decay< F >::type > │ │ │ │ │ │ makeAnalyticGridViewFunction │ │ │ │ │ │ a00209.html │ │ │ │ │ │ gafe8f06fb6d4027bfaf39e0971d8eb3c6 │ │ │ │ │ │ (F &&f, const GridView &gridView) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ composedgridfunction.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/gridfunctions/ │ │ │ │ │ │ - a00089.html │ │ │ │ │ │ - dune/functions/common/defaultderivativetraits.hh │ │ │ │ │ │ - dune/functions/common/differentiablefunction.hh │ │ │ │ │ │ - dune/functions/gridfunctions/gridfunction.hh │ │ │ │ │ │ + a00167.html │ │ │ │ │ │ + dune/functions/common/defaultderivativetraits.hh │ │ │ │ │ │ + dune/functions/common/differentiablefunction.hh │ │ │ │ │ │ + dune/functions/gridfunctions/gridfunction.hh │ │ │ │ │ │ Dune::Functions::ComposedGridFunction │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ auto │ │ │ │ │ │ makeComposedGridFunction │ │ │ │ │ │ a00209.html │ │ │ │ │ │ ga9e5ac1cc0fdfb7d7a0e937f58aff21fd │ │ │ │ │ │ (OF &&outerFunction, IF &&... innerFunction) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ discreteglobalbasisfunction.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/gridfunctions/ │ │ │ │ │ │ - a00101.html │ │ │ │ │ │ - dune/functions/functionspacebases/hierarchicnodetorangemap.hh │ │ │ │ │ │ - dune/functions/functionspacebases/flatvectorview.hh │ │ │ │ │ │ - dune/functions/gridfunctions/gridviewentityset.hh │ │ │ │ │ │ - dune/functions/gridfunctions/gridfunction.hh │ │ │ │ │ │ + a00191.html │ │ │ │ │ │ + dune/functions/functionspacebases/hierarchicnodetorangemap.hh │ │ │ │ │ │ + dune/functions/functionspacebases/flatvectorview.hh │ │ │ │ │ │ + dune/functions/gridfunctions/gridviewentityset.hh │ │ │ │ │ │ + dune/functions/gridfunctions/gridfunction.hh │ │ │ │ │ │ dune/functions/backends/concepts.hh │ │ │ │ │ │ - dune/functions/backends/istlvectorbackend.hh │ │ │ │ │ │ + dune/functions/backends/istlvectorbackend.hh │ │ │ │ │ │ Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase │ │ │ │ │ │ Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::Data │ │ │ │ │ │ Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase::LocalFunctionBase │ │ │ │ │ │ Dune::Functions::DiscreteGlobalBasisFunction │ │ │ │ │ │ Dune::Functions::DiscreteGlobalBasisFunction::LocalFunction │ │ │ │ │ │ Dune::Functions::DiscreteGlobalBasisFunctionDerivative │ │ │ │ │ │ Dune::Functions::DiscreteGlobalBasisFunctionDerivative::LocalFunction │ │ │ │ │ │ @@ -1457,62 +1457,62 @@ │ │ │ │ │ │ ga9f1a8d6ac1558adad6150feb9b4e3168 │ │ │ │ │ │ (B &&basis, V &&vector) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ facenormalgridfunction.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/gridfunctions/ │ │ │ │ │ │ - a00086.html │ │ │ │ │ │ - dune/functions/gridfunctions/gridfunction.hh │ │ │ │ │ │ - dune/functions/gridfunctions/gridviewentityset.hh │ │ │ │ │ │ + a00188.html │ │ │ │ │ │ + dune/functions/gridfunctions/gridfunction.hh │ │ │ │ │ │ + dune/functions/gridfunctions/gridviewentityset.hh │ │ │ │ │ │ Dune::Functions::FaceNormalGridFunction │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ gridfunction.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/gridfunctions/ │ │ │ │ │ │ - a00098.html │ │ │ │ │ │ - dune/functions/common/typeerasure.hh │ │ │ │ │ │ - dune/functions/common/defaultderivativetraits.hh │ │ │ │ │ │ - dune/functions/common/differentiablefunction.hh │ │ │ │ │ │ - dune/functions/common/localfunction.hh │ │ │ │ │ │ - dune/functions/common/functionconcepts.hh │ │ │ │ │ │ - dune/functions/gridfunctions/localderivativetraits.hh │ │ │ │ │ │ - dune/functions/gridfunctions/gridfunction_imp.hh │ │ │ │ │ │ + a00170.html │ │ │ │ │ │ + dune/functions/common/typeerasure.hh │ │ │ │ │ │ + dune/functions/common/defaultderivativetraits.hh │ │ │ │ │ │ + dune/functions/common/differentiablefunction.hh │ │ │ │ │ │ + dune/functions/common/localfunction.hh │ │ │ │ │ │ + dune/functions/common/functionconcepts.hh │ │ │ │ │ │ + dune/functions/gridfunctions/localderivativetraits.hh │ │ │ │ │ │ + dune/functions/gridfunctions/gridfunction_imp.hh │ │ │ │ │ │ Dune::Functions::GridFunction │ │ │ │ │ │ Dune::Functions::GridFunction< Range(Domain), ES, DerivativeTraits, bufferSize > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ gridfunction_imp.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/gridfunctions/ │ │ │ │ │ │ - a00083.html │ │ │ │ │ │ - dune/functions/common/type_traits.hh │ │ │ │ │ │ - dune/functions/common/interfaces.hh │ │ │ │ │ │ - dune/functions/common/differentiablefunction_imp.hh │ │ │ │ │ │ + a00173.html │ │ │ │ │ │ + dune/functions/common/type_traits.hh │ │ │ │ │ │ + dune/functions/common/interfaces.hh │ │ │ │ │ │ + dune/functions/common/differentiablefunction_imp.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ gridviewentityset.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/gridfunctions/ │ │ │ │ │ │ - a00080.html │ │ │ │ │ │ + a00176.html │ │ │ │ │ │ Dune::Functions::GridViewEntitySet │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ gridviewfunction.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/gridfunctions/ │ │ │ │ │ │ - a00095.html │ │ │ │ │ │ - dune/functions/gridfunctions/gridfunction.hh │ │ │ │ │ │ - dune/functions/gridfunctions/gridviewentityset.hh │ │ │ │ │ │ - dune/functions/gridfunctions/analyticgridviewfunction.hh │ │ │ │ │ │ + a00182.html │ │ │ │ │ │ + dune/functions/gridfunctions/gridfunction.hh │ │ │ │ │ │ + dune/functions/gridfunctions/gridviewentityset.hh │ │ │ │ │ │ + dune/functions/gridfunctions/analyticgridviewfunction.hh │ │ │ │ │ │ Dune::Functions::GridViewFunction │ │ │ │ │ │ Dune::Functions::GridViewFunction< Range(Domain), GV, DerivativeTraits, bufferSize > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ std::decay< F >::type │ │ │ │ │ │ makeGridViewFunction │ │ │ │ │ │ @@ -1527,16 +1527,16 @@ │ │ │ │ │ │ a34f2d140a1fed46862286f68d26c9975 │ │ │ │ │ │ (F &&f, const GridView &gridView) -> decltype(makeAnalyticGridViewFunction(std::forward< F >(f), gridView)) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ localderivativetraits.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.9.0/dune/functions/gridfunctions/ │ │ │ │ │ │ - a00104.html │ │ │ │ │ │ - dune/functions/common/defaultderivativetraits.hh │ │ │ │ │ │ + a00179.html │ │ │ │ │ │ + dune/functions/common/defaultderivativetraits.hh │ │ │ │ │ │ Dune::Functions::LocalDerivativeTraits │ │ │ │ │ │ Dune::Functions::LocalDerivativeTraits::Traits │ │ │ │ │ │ Dune::Functions::LocalDerivativeTraits::Traits< R(LocalDomain)> │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/files.html │ │ │ │ @@ -68,83 +68,83 @@ │ │ │ │
Here is a list of all files with brief descriptions:
│ │ │ │
[detail level 1234]
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
  doc
 doxygen
  dune
  functions
  analyticfunctions
 polynomial.hh
 trigonometricfunction.hh
 polynomial.hh
 trigonometricfunction.hh
  backends
 backends/concepts.hh
 istlvectorbackend.hh
 istlvectorbackend.hh
  common
 callable.hh
 defaultderivativetraits.hh
 differentiablefunction.hh
 differentiablefunction_imp.hh
 differentiablefunctionfromcallables.hh
 functionconcepts.hh
 functionfromcallable.hh
 indexaccess.hh
 interfaces.hh
 localfunction.hh
 localfunction_imp.hh
 multiindex.hh
 overflowarray.hh
 polymorphicsmallobject.hh
 referencehelper.hh
 reserveddeque.hhAn stl-compliant double-ended queue which stores everything on the stack
 signature.hh
 staticforloop.hh
 treedata.hh
 type_traits.hh
 typeerasure.hh
 utility.hh
 callable.hh
 defaultderivativetraits.hh
 differentiablefunction.hh
 differentiablefunction_imp.hh
 differentiablefunctionfromcallables.hh
 functionconcepts.hh
 functionfromcallable.hh
 indexaccess.hh
 interfaces.hh
 localfunction.hh
 localfunction_imp.hh
 multiindex.hh
 overflowarray.hh
 polymorphicsmallobject.hh
 referencehelper.hh
 reserveddeque.hhAn stl-compliant double-ended queue which stores everything on the stack
 signature.hh
 staticforloop.hh
 treedata.hh
 type_traits.hh
 typeerasure.hh
 utility.hh
  functionspacebases
 basistags.hh
 boundarydofs.hh
 brezzidouglasmarinibasis.hh
 bsplinebasis.hhThe B-spline global function space basis
 compositebasis.hh
 basistags.hh
 boundarydofs.hh
 brezzidouglasmarinibasis.hh
 bsplinebasis.hhThe B-spline global function space basis
 compositebasis.hh
 functionspacebases/concepts.hh
 defaultglobalbasis.hh
 defaultlocalview.hh
 defaultnodetorangemap.hh
 flatmultiindex.hh
 flatvectorview.hh
 globalvaluedlocalfiniteelement.hh
 hierarchicallagrangebasis.hh
 hierarchicnodetorangemap.hh
 hierarchicvectorwrapper.hh
 interpolate.hh
 lagrangebasis.hh
 lagrangedgbasis.hh
 nedelecbasis.hh
 nodes.hh
 periodicbasis.hh
 powerbasis.hh
 rannacherturekbasis.hh
 raviartthomasbasis.hh
 sizeinfo.hh
 subentitydofs.hh
 subspacebasis.hh
 subspacelocalview.hh
 taylorhoodbasis.hh
 transformedindexbasis.hh
 defaultglobalbasis.hh
 defaultlocalview.hh
 defaultnodetorangemap.hh
 flatmultiindex.hh
 flatvectorview.hh
 globalvaluedlocalfiniteelement.hh
 hierarchicallagrangebasis.hh
 hierarchicnodetorangemap.hh
 hierarchicvectorwrapper.hh
 interpolate.hh
 lagrangebasis.hh
 lagrangedgbasis.hh
 nedelecbasis.hh
 nodes.hh
 periodicbasis.hh
 powerbasis.hh
 rannacherturekbasis.hh
 raviartthomasbasis.hh
 sizeinfo.hh
 subentitydofs.hh
 subspacebasis.hh
 subspacelocalview.hh
 taylorhoodbasis.hh
 transformedindexbasis.hh
  gridfunctions
 analyticgridviewfunction.hh
 composedgridfunction.hh
 discreteglobalbasisfunction.hh
 facenormalgridfunction.hh
 gridfunction.hh
 gridfunction_imp.hh
 gridviewentityset.hh
 gridviewfunction.hh
 localderivativetraits.hh
 analyticgridviewfunction.hh
 composedgridfunction.hh
 discreteglobalbasisfunction.hh
 facenormalgridfunction.hh
 gridfunction.hh
 gridfunction_imp.hh
 gridviewentityset.hh
 gridviewfunction.hh
 localderivativetraits.hh
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/globals.html │ │ │ │ @@ -59,15 +59,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Here is a list of all file members with links to the files they belong to:
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/globals_defs.html │ │ │ │ @@ -59,15 +59,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │   │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │