--- /srv/reproducible-results/rbuild-debian/r-b-build.vxWWRcRr/b1/dune-functions_2.10.0-2_i386.changes +++ /srv/reproducible-results/rbuild-debian/r-b-build.vxWWRcRr/b2/dune-functions_2.10.0-2_i386.changes ├── Files │ @@ -1,3 +1,3 @@ │ │ 0b581a3ff2b4ffa7f4e435f811978322 91624 libdevel optional libdune-functions-dev_2.10.0-2_i386.deb │ - 2a6b616264ce644c3282bbc5df11f987 2609248 doc optional libdune-functions-doc_2.10.0-2_all.deb │ + 9eeffbbd797084654aad86c810f98dd0 2609392 doc optional libdune-functions-doc_2.10.0-2_all.deb ├── libdune-functions-doc_2.10.0-2_all.deb │ ├── file list │ │ @@ -1,3 +1,3 @@ │ │ -rw-r--r-- 0 0 0 4 2024-11-18 22:19:43.000000 debian-binary │ │ --rw-r--r-- 0 0 0 13812 2024-11-18 22:19:43.000000 control.tar.xz │ │ --rw-r--r-- 0 0 0 2595244 2024-11-18 22:19:43.000000 data.tar.xz │ │ +-rw-r--r-- 0 0 0 13760 2024-11-18 22:19:43.000000 control.tar.xz │ │ +-rw-r--r-- 0 0 0 2595440 2024-11-18 22:19:43.000000 data.tar.xz │ ├── control.tar.xz │ │ ├── control.tar │ │ │ ├── ./md5sums │ │ │ │ ├── ./md5sums │ │ │ │ │┄ Files differ │ │ │ │ ├── line order │ │ │ │ │ @@ -1,14 +1,16 @@ │ │ │ │ │ usr/share/doc/libdune-functions-doc/changelog.Debian.gz │ │ │ │ │ usr/share/doc/libdune-functions-doc/changelog.gz │ │ │ │ │ usr/share/doc/libdune-functions-doc/copyright │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00002.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00002_source.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00005.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00005_source.html │ │ │ │ │ +usr/share/doc/libdune-functions-doc/doxygen/a00008.html │ │ │ │ │ +usr/share/doc/libdune-functions-doc/doxygen/a00008_source.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00011.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00011_source.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00014.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00014_source.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00017.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00017_source.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00020.html │ │ │ │ │ @@ -53,16 +55,14 @@ │ │ │ │ │ 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 │ │ │ │ │ -usr/share/doc/libdune-functions-doc/doxygen/a00089_source.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00092.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00092_source.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00095.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00095_source.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00098.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00098_source.html │ │ │ │ │ usr/share/doc/libdune-functions-doc/doxygen/a00101.html │ ├── data.tar.xz │ │ ├── data.tar │ │ │ ├── file list │ │ │ │ @@ -3,144 +3,144 @@ │ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2024-11-18 22:19:43.000000 ./usr/share/ │ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2024-11-18 22:19:43.000000 ./usr/share/doc/ │ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 1032 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/changelog.Debian.gz │ │ │ │ -rw-r--r-- 0 root (0) root (0) 5502 2024-09-05 06:39:05.000000 ./usr/share/doc/libdune-functions-doc/changelog.gz │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3358 2024-11-14 20:25:37.000000 ./usr/share/doc/libdune-functions-doc/copyright │ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/ │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9887 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00002.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 38530 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00002_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6394 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00005.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 11402 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00005_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8254 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00011.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 54827 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00011_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8068 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00014.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 48738 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00014_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6406 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00017.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 29529 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00017_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7538 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00020.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 39745 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00020_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5103 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00023.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 23183 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00023_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10144 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00026.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 136554 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00026_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5920 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00029.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 13339 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00029_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4706 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00032.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 14586 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00032_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5683 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00035.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 37242 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00035_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8235 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00038.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 17577 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00038_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10246 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00041.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 53025 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00041_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 15790 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00044.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 50423 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00044_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 23371 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00047.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 71415 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00047_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5657 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00050.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 12836 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00050_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6896 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00053.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 48771 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00053_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6394 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00002.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 11402 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00002_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9887 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00005.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 38530 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00005_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4592 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00008.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 18943 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00008_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10246 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00011.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 53025 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00011_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6160 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00014.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 28132 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00014_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6896 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00017.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 48771 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00017_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6290 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00020.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 23469 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00020_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 23371 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00023.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 71415 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00023_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4585 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00026.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 14592 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00026_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6961 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00029.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 20704 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00029_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5078 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00032.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 11203 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00032_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5268 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00035.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 31670 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00035_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 15790 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00038.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 50423 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00038_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7754 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00041.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 29915 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00041_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8790 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00044.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 13441 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00044_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7848 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00047.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 16631 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00047_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5333 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00050.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 52266 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00050_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7865 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00053.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 28322 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00053_source.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 5525 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00056.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 27268 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00056_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6160 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00059.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 28132 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00059_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6290 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00062.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 23469 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00062_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5333 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00065.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 52266 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00065_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4585 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00068.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 14592 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00068_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7848 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00071.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 16631 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00071_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7865 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00074.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 28322 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00074_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5268 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00077.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 31670 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00077_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8790 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00080.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 13441 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00080_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5078 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00083.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 11203 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00083_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4592 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00086.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 18943 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00086_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6961 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00089.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 20704 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00089_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7754 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00092.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 29915 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00092_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10935 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00095.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 221442 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00095_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8655 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00098.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 73204 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00098_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9035 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00101.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 36744 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00101_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7430 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00104.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 35449 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00104_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8482 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00107.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 96437 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00107_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8697 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00110.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 44628 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00110_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5545 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00113.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8490 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00113_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9395 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00116.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 117378 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00116_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7186 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00119.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 31410 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00119_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8657 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00122.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 71257 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00122_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4939 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00125.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 50087 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00125_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9300 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00128.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 82142 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00128_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5699 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00131.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 41452 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00131_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8627 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00134.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 55489 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00134_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5363 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00137.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 36356 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00137_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8357 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00140.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 22357 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00140_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8080 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00143.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 27402 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00143_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5908 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00146.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 18136 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00146_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8153 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00149.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 47706 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00149_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 12007 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00152.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 66376 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00152_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5461 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00155.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 13550 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00155_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8522 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00158.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 48874 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00158_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 15549 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00161.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 51686 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00161_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8228 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00164.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 47104 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00164_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7169 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00167.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 28654 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00167_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7323 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00170.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 24861 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00170_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8829 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00173.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 40245 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00173_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8654 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00176.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 39119 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00176_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 13368 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00179.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 24023 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00179_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9102 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00182.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 73644 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00182_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5702 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00185.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 17641 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00185_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6442 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00188.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 31003 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00188_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7058 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00191.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 85683 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00191_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8625 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00194.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 60013 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00194_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5314 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00197.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 17886 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00197_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5657 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00059.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 12836 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00059_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5683 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00062.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 37242 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00062_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8235 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00065.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 17577 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00065_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8068 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00068.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 48738 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00068_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10144 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00071.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 136554 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00071_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5103 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00074.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 23183 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00074_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7538 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00077.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 39745 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00077_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6406 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00080.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 29529 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00080_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5920 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00083.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 13339 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00083_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4706 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00086.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 14586 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00086_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8254 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00092.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 54827 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00092_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5699 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00095.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 41452 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00095_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9102 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00098.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 73644 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00098_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7430 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00101.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 35449 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00101_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6442 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00104.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 31003 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00104_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9035 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00107.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 36744 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00107_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8482 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00110.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 96437 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00110_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9395 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00113.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 117378 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00113_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8655 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00116.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 73204 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00116_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7323 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00119.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 24861 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00119_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8627 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00122.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 55489 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00122_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5908 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00125.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 18136 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00125_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7058 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00128.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 85683 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00128_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7169 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00131.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 28654 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00131_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5363 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00134.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 36356 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00134_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8357 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00137.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 22357 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00137_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7186 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00140.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 31410 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00140_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5545 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00143.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8490 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00143_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5461 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00146.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 13550 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00146_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 13368 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00149.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 24023 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00149_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 15549 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00152.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 51686 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00152_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8153 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00155.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 47706 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00155_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5314 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00158.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 17886 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00158_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8625 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00161.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 60013 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00161_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5702 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00164.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 17641 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00164_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8228 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00167.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 47104 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00167_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4939 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00170.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 50087 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00170_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8654 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00173.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 39119 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00173_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9300 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00176.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 82142 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00176_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 12007 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00179.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 66376 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00179_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10935 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00182.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 221442 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00182_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8657 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00185.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 71257 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00185_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8080 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00188.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 27402 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00188_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8829 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00191.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 40245 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00191_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8697 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00194.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 44628 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00194_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8522 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00197.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 48874 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00197_source.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3040 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00200.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3048 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00203.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3046 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00206.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 5790 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00209.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 5178 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00210.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 6407 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00212.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 13117 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/a00212.png │ │ │ │ @@ -540,15 +540,15 @@ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 9899 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/dir_a2250aba7ee066a4c694d7c3cf43d078_dep.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 8548 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/dir_a5545368301c4029d7054f90c0ed45fc.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 25768 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/dir_a5545368301c4029d7054f90c0ed45fc_dep.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 4883 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/dir_e22f2c69b2799e923164d7b2e4fa3f8c.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 2965 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/dir_e22f2c69b2799e923164d7b2e4fa3f8c_dep.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3674 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/dir_e68e8157741866f444e17edd764ebbae.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 45631 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/doxygen.css │ │ │ │ --rw-r--r-- 0 root (0) root (0) 54538 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/dune-functions.tag.gz │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 54544 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/dune-functions.tag.gz │ │ │ │ -rw-r--r-- 0 root (0) root (0) 7704 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/dynsections.js │ │ │ │ -rw-r--r-- 0 root (0) root (0) 25698 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/files.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3674 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/functions.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 9418 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/functions_b.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 9416 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/functions_c.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 15825 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/functions_d.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 13266 2024-11-18 22:19:43.000000 ./usr/share/doc/libdune-functions-doc/doxygen/functions_e.html │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00002.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: polynomial.hh File Reference │ │ │ │ +dune-functions: trigonometricfunction.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -73,59 +73,40 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
polynomial.hh File Reference
│ │ │ │ +
trigonometricfunction.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │
#include <cmath>
│ │ │ │ -#include <initializer_list>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::Polynomial< K, C >
 A univariate polynomial implementation. More...
class  Dune::Functions::TrigonometricFunction< K, sinFactor, cosFactor >
 A linear combination of trigonomic functions. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ Functions

template<class K >
 Dune::Functions::Polynomial (std::vector< K >) -> Polynomial< K, std::vector< K > >
 
template<class K , std::size_t n>
 Dune::Functions::Polynomial (std::array< K, n >) -> Polynomial< K, std::array< K, n > >
 
template<class K , K... ci>
 Dune::Functions::Polynomial (std::integer_sequence< K, ci... >) -> Polynomial< K, std::integer_sequence< K, ci... > >
 
template<class K >
 Dune::Functions::Polynomial (std::initializer_list< K >) -> Polynomial< K, std::vector< K > >
 
template<class K , class Coefficients >
auto Dune::Functions::makePolynomial (Coefficients coefficients)
 Create Polynomial.
 
template<class K , class C >
auto Dune::Functions::makePolynomial (std::initializer_list< C > coefficients)
 Create Polynomial.
 
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.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -2,49 +2,29 @@ │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _a_n_a_l_y_t_i_c_f_u_n_c_t_i_o_n_s │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -polynomial.hh File Reference │ │ │ │ │ +trigonometricfunction.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l_<_ _K_,_ _C_ _> │ │ │ │ │ -  A univariate polynomial implementation. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_r_i_g_o_n_o_m_e_t_r_i_c_F_u_n_c_t_i_o_n_<_ _K_,_ _s_i_n_F_a_c_t_o_r_,_ _c_o_s_F_a_c_t_o_r_ _> │ │ │ │ │ +  A linear combination of trigonomic functions. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l (std::vector< K >) -> _P_o_l_y_n_o_m_i_a_l< K, std:: │ │ │ │ │ - vector< K > > │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l (std::array< K, n >) -> _P_o_l_y_n_o_m_i_a_l< K, std:: │ │ │ │ │ - array< K, n > > │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l (std::integer_sequence< K, ci... >) - │ │ │ │ │ - > _P_o_l_y_n_o_m_i_a_l< K, std::integer_sequence< K, ci... > > │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l (std::initializer_list< K >) -> _P_o_l_y_n_o_m_i_a_l< │ │ │ │ │ - K, std::vector< K > > │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_P_o_l_y_n_o_m_i_a_l (Coefficients coefficients) │ │ │ │ │ -  Create _P_o_l_y_n_o_m_i_a_l. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_P_o_l_y_n_o_m_i_a_l (std::initializer_list< C > coefficients) │ │ │ │ │ -  Create _P_o_l_y_n_o_m_i_a_l. │ │ │ │ │ +template │ │ │ │ │ +_T_r_i_g_o_n_o_m_e_t_r_i_c_F_u_n_c_t_i_o_n< K, -cosFactor, _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_d_e_r_i_v_a_t_i_v_e (const │ │ │ │ │ + sinFactor >  _T_r_i_g_o_n_o_m_e_t_r_i_c_F_u_n_c_t_i_o_n< K, sinFactor, │ │ │ │ │ + cosFactor > &f) │ │ │ │ │ +  Obtain derivative of │ │ │ │ │ + _T_r_i_g_o_n_o_m_e_t_r_i_c_F_u_n_c_t_i_o_n function. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00002_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: polynomial.hh Source File │ │ │ │ +dune-functions: trigonometricfunction.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,232 +74,67 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
polynomial.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_ANALYTICFUNCTIONS_POLYNOMIAL_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_ANALYTICFUNCTIONS_POLYNOMIAL_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_ANALYTICFUNCTIONS_TRIGONOMETRICFUNCTION_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_ANALYTICFUNCTIONS_TRIGONOMETRICFUNCTION_HH
│ │ │ │
9
│ │ │ │
10#include <cmath>
│ │ │ │ -
11#include <initializer_list>
│ │ │ │ -
12#include <vector>
│ │ │ │ -
13
│ │ │ │ +
11
│ │ │ │ +
12namespace Dune {
│ │ │ │ +
13namespace Functions {
│ │ │ │
14
│ │ │ │ -
15#include <dune/common/hybridutilities.hh>
│ │ │ │ +
15
│ │ │ │
16
│ │ │ │ -
│ │ │ │ -
17namespace Dune {
│ │ │ │ -
│ │ │ │ -
18namespace Functions {
│ │ │ │ -
19
│ │ │ │ -
20namespace Impl {
│ │ │ │ -
21
│ │ │ │ -
22 // Compute coefficients of derivative of polynomial.
│ │ │ │ -
23 // Overload for std::vector
│ │ │ │ -
24 template<class K, class Allocator>
│ │ │ │ -
25 auto polynomialDerivativeCoefficients(const std::vector<K, Allocator>& coefficients) {
│ │ │ │ -
26 if (coefficients.size()==0)
│ │ │ │ -
27 return std::vector<K, Allocator>();
│ │ │ │ -
28 std::vector<K, Allocator> dpCoefficients(coefficients.size()-1);
│ │ │ │ -
29 for (size_t i=1; i<coefficients.size(); ++i)
│ │ │ │ -
30 dpCoefficients[i-1] = coefficients[i]*K(i);
│ │ │ │ -
31 return dpCoefficients;
│ │ │ │ -
32 }
│ │ │ │ -
33
│ │ │ │ -
34 // Compute coefficients of derivative of polynomial.
│ │ │ │ -
35 // Overload for std::array
│ │ │ │ -
36 template<class K, std::size_t n>
│ │ │ │ -
37 auto polynomialDerivativeCoefficients(const std::array<K, n>& coefficients) {
│ │ │ │ -
38 if constexpr (n==0)
│ │ │ │ -
39 return coefficients;
│ │ │ │ -
40 else
│ │ │ │ -
41 {
│ │ │ │ -
42 std::array<K, n-1> dpCoefficients;
│ │ │ │ -
43 for (size_t i=1; i<coefficients.size(); ++i)
│ │ │ │ -
44 dpCoefficients[i-1] = coefficients[i]*K(i);
│ │ │ │ -
45 return dpCoefficients;
│ │ │ │ -
46 }
│ │ │ │ -
47 }
│ │ │ │ -
48
│ │ │ │ -
49 // Compute coefficients of derivative of polynomial.
│ │ │ │ -
50 // Helper function for the std::integer_sequence overload.
│ │ │ │ -
51 // With C++20 this can be avoided, because lambda function
│ │ │ │ -
52 // can partially specify template arguments which allows
│ │ │ │ -
53 // to do the same inline.
│ │ │ │ -
54 template<class I, I i0, I... i, class J, J j0, J... j>
│ │ │ │ -
55 auto polynomialDerivativeCoefficientsHelper(std::integer_sequence<I, i0, i...>, std::integer_sequence<J, j0, j...>) {
│ │ │ │ -
56 return std::integer_sequence<I, i*I(j)...>();
│ │ │ │ -
57 }
│ │ │ │ -
58
│ │ │ │ -
59 // Compute coefficients of derivative of polynomial.
│ │ │ │ -
60 // Overload for std::integer_sequence
│ │ │ │ -
61 template<class I, I... i>
│ │ │ │ -
62 auto polynomialDerivativeCoefficients(std::integer_sequence<I, i...> coefficients) {
│ │ │ │ -
63 if constexpr (sizeof...(i)==0)
│ │ │ │ -
64 return coefficients;
│ │ │ │ -
65 else
│ │ │ │ -
66 return polynomialDerivativeCoefficientsHelper(coefficients, std::make_index_sequence<sizeof...(i)>());
│ │ │ │ -
67 }
│ │ │ │ -
68
│ │ │ │ -
69 // Compute coefficients of derivative of polynomial.
│ │ │ │ -
70 // Overload for std::tuple
│ │ │ │ -
71 template<class...T>
│ │ │ │ -
72 auto polynomialDerivativeCoefficients(const std::tuple<T...>& coefficients) {
│ │ │ │ -
73 if constexpr (sizeof...(T)==0)
│ │ │ │ -
74 return coefficients;
│ │ │ │ -
75 else
│ │ │ │ -
76 {
│ │ │ │ -
77 // Notice that std::multiplies<void> has issues with signed types.
│ │ │ │ -
78 // E.g., `decltype(-2,2ul)` is `long unsigned int`.
│ │ │ │ -
79 // Hence the same is deduced as return type in std::multiplies.
│ │ │ │ -
80 // To avoid this, we explicitly pass the exponent `i+1` as signed type.
│ │ │ │ -
81 // If the coefficient is signed, both types are now signed and
│ │ │ │ -
82 // so is the deduced result type of std::multiplies.
│ │ │ │ -
83 auto mult = Dune::Hybrid::hybridFunctor(std::multiplies());
│ │ │ │ -
84 return Dune::unpackIntegerSequence([&](auto... i) {
│ │ │ │ -
85 using signed_type = std::conditional_t<std::is_same_v<std::size_t, long unsigned int>,
│ │ │ │ -
86 long signed int, signed int>;
│ │ │ │ -
87 return std::tuple(mult(std::get<i+1>(coefficients), std::integral_constant<signed_type, i+1>()) ...);
│ │ │ │ -
88 }, std::make_index_sequence<sizeof...(T)-1>());
│ │ │ │ -
89 }
│ │ │ │ -
90 }
│ │ │ │ -
91
│ │ │ │ -
92} // namespace Impl in Dune::Functions::
│ │ │ │ -
93
│ │ │ │ -
94
│ │ │ │ -
95
│ │ │ │ -
122template<class K, class C=std::vector<K>>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
124{
│ │ │ │ -
125 template<class CC>
│ │ │ │ -
126 struct IsIntegerSequence : public std::false_type {};
│ │ │ │ -
127
│ │ │ │ -
128 template<class I, I... i>
│ │ │ │ -
129 struct IsIntegerSequence<std::integer_sequence<I, i...>> : public std::true_type {};
│ │ │ │ -
130
│ │ │ │ -
131public:
│ │ │ │ -
132
│ │ │ │ -
134 using Coefficients = C;
│ │ │ │ -
135
│ │ │ │ -
137 Polynomial() = default;
│ │ │ │ -
138
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
148 coefficients_(std::move(coefficients))
│ │ │ │ -
149 {}
│ │ │ │ -
│ │ │ │ -
150
│ │ │ │ -
│ │ │ │ -
152 K operator() (const K& x) const
│ │ │ │ -
153 {
│ │ │ │ -
154 auto y = K(0);
│ │ │ │ -
155 auto n = Dune::Hybrid::size(coefficients_);
│ │ │ │ -
156 Dune::Hybrid::forEach(Dune::range(n), [&](auto i) {
│ │ │ │ -
157 y += Dune::Hybrid::elementAt(coefficients_, i) * std::pow(x, int(i));
│ │ │ │ -
158 });
│ │ │ │ -
159 return y;
│ │ │ │ -
160 }
│ │ │ │ -
│ │ │ │ -
161
│ │ │ │ -
│ │ │ │ -
163 bool operator==(const Polynomial& other) const
│ │ │ │ -
164 {
│ │ │ │ -
165 if constexpr (IsIntegerSequence<Coefficients>::value)
│ │ │ │ -
166 return true;
│ │ │ │ -
167 else
│ │ │ │ -
168 return coefficients()==other.coefficients();
│ │ │ │ -
169 }
│ │ │ │ -
│ │ │ │ -
170
│ │ │ │ -
│ │ │ │ -
180 friend auto derivative(const Polynomial& p)
│ │ │ │ -
181 {
│ │ │ │ -
182 auto derivativeCoefficients = Impl::polynomialDerivativeCoefficients(p.coefficients());
│ │ │ │ -
183 using DerivativeCoefficients = decltype(derivativeCoefficients);
│ │ │ │ -
184 return Polynomial<K, DerivativeCoefficients>(std::move(derivativeCoefficients));
│ │ │ │ -
185 }
│ │ │ │ -
│ │ │ │ -
186
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
189 {
│ │ │ │ -
190 return coefficients_;
│ │ │ │ -
191 }
│ │ │ │ -
│ │ │ │ -
192
│ │ │ │ -
193private:
│ │ │ │ -
194 Coefficients coefficients_;
│ │ │ │ -
195};
│ │ │ │ +
29template<class K, int sinFactor, int cosFactor>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
31{
│ │ │ │ +
32public:
│ │ │ │ +
│ │ │ │ +
34 K operator () (const K& x) const
│ │ │ │ +
35 {
│ │ │ │ +
36 return sinFactor * std::sin(x) + cosFactor * std::cos(x);
│ │ │ │ +
37 }
│ │ │ │ +
│ │ │ │ +
38};
│ │ │ │ +
│ │ │ │ +
39
│ │ │ │ +
40
│ │ │ │ +
42template<class K, int sinFactor, int cosFactor>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
44{
│ │ │ │ +
45 return TrigonometricFunction<K, -cosFactor, sinFactor>();
│ │ │ │ +
46}
│ │ │ │
│ │ │ │ -
196
│ │ │ │ -
197
│ │ │ │ -
198
│ │ │ │ -
199template<class K>
│ │ │ │ - │ │ │ │ -
201
│ │ │ │ -
202template<class K, std::size_t n>
│ │ │ │ - │ │ │ │ -
204
│ │ │ │ -
205template<class K, K... ci>
│ │ │ │ -
206Polynomial(std::integer_sequence<K, ci...>) -> Polynomial<K, std::integer_sequence<K,ci...>>;
│ │ │ │ -
207
│ │ │ │ -
208template<class K>
│ │ │ │ -
209Polynomial(std::initializer_list<K>) -> Polynomial<K, std::vector<K>>;
│ │ │ │ -
210
│ │ │ │ -
211
│ │ │ │ -
212
│ │ │ │ -
225template<class K, class Coefficients>
│ │ │ │ -
│ │ │ │ -
226auto makePolynomial(Coefficients coefficients)
│ │ │ │ -
227{
│ │ │ │ -
228 return Polynomial<K, Coefficients>(std::move(coefficients));
│ │ │ │ -
229}
│ │ │ │ -
│ │ │ │ -
230
│ │ │ │ -
240template<class K, class C>
│ │ │ │ -
│ │ │ │ -
241auto makePolynomial(std::initializer_list<C> coefficients)
│ │ │ │ -
242{
│ │ │ │ -
243 return Polynomial<K>(std::move(coefficients));
│ │ │ │ -
244}
│ │ │ │ -
│ │ │ │ -
245
│ │ │ │ -
246
│ │ │ │ -
247
│ │ │ │ -
248
│ │ │ │ -
249
│ │ │ │ -
250}} // namespace Dune::Functions
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
251
│ │ │ │ -
252
│ │ │ │ -
253
│ │ │ │ -
254#endif // DUNE_FUNCTIONS_ANALYTICFUNCTIONS_POLYNOMIAL_HH
│ │ │ │ -
friend auto derivative(const Polynomial &p)
Obtain derivative of Polynomial function.
Definition polynomial.hh:180
│ │ │ │ +
47
│ │ │ │ +
48
│ │ │ │ +
49
│ │ │ │ +
50}} // namespace Dune::Functions
│ │ │ │ +
51
│ │ │ │ +
52
│ │ │ │ +
53
│ │ │ │ +
54#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:43
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
auto makePolynomial(Coefficients coefficients)
Create Polynomial.
Definition polynomial.hh:226
│ │ │ │ -
A univariate polynomial implementation.
Definition polynomial.hh:124
│ │ │ │ -
Polynomial()=default
Default constructor.
│ │ │ │ -
K operator()(const K &x) const
Evaluate polynomial.
Definition polynomial.hh:152
│ │ │ │ -
C Coefficients
The type of the stored coefficient container.
Definition polynomial.hh:134
│ │ │ │ -
const Coefficients & coefficients() const
Obtain reference to coefficient vector.
Definition polynomial.hh:188
│ │ │ │ -
Polynomial(Coefficients coefficients)
Create from container of coefficients.
Definition polynomial.hh:147
│ │ │ │ -
bool operator==(const Polynomial &other) const
Comparison of coefficients.
Definition polynomial.hh:163
│ │ │ │ +
A linear combination of trigonomic functions.
Definition trigonometricfunction.hh:31
│ │ │ │ +
K operator()(const K &x) const
Evaluate function.
Definition trigonometricfunction.hh:34
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,246 +1,68 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _a_n_a_l_y_t_i_c_f_u_n_c_t_i_o_n_s │ │ │ │ │ -polynomial.hh │ │ │ │ │ +trigonometricfunction.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_ANALYTICFUNCTIONS_POLYNOMIAL_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_ANALYTICFUNCTIONS_POLYNOMIAL_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_ANALYTICFUNCTIONS_TRIGONOMETRICFUNCTION_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_ANALYTICFUNCTIONS_TRIGONOMETRICFUNCTION_HH │ │ │ │ │ 9 │ │ │ │ │ 10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13 │ │ │ │ │ +11 │ │ │ │ │ +12namespace _D_u_n_e { │ │ │ │ │ +13namespace Functions { │ │ │ │ │ 14 │ │ │ │ │ -15#include │ │ │ │ │ +15 │ │ │ │ │ 16 │ │ │ │ │ -_1_7namespace _D_u_n_e { │ │ │ │ │ -_1_8namespace Functions { │ │ │ │ │ -19 │ │ │ │ │ -20namespace Impl { │ │ │ │ │ -21 │ │ │ │ │ -22 // Compute coefficients of derivative of polynomial. │ │ │ │ │ -23 // Overload for std::vector │ │ │ │ │ -24 template │ │ │ │ │ -25 auto polynomialDerivativeCoefficients(const std::vector& │ │ │ │ │ -coefficients) { │ │ │ │ │ -26 if (coefficients.size()==0) │ │ │ │ │ -27 return std::vector(); │ │ │ │ │ -28 std::vector dpCoefficients(coefficients.size()-1); │ │ │ │ │ -29 for (size_t i=1; i │ │ │ │ │ -37 auto polynomialDerivativeCoefficients(const std::array& coefficients) │ │ │ │ │ -{ │ │ │ │ │ -38 if constexpr (n==0) │ │ │ │ │ -39 return coefficients; │ │ │ │ │ -40 else │ │ │ │ │ -41 { │ │ │ │ │ -42 std::array dpCoefficients; │ │ │ │ │ -43 for (size_t i=1; i │ │ │ │ │ +_3_0class _T_r_i_g_o_n_o_m_e_t_r_i_c_F_u_n_c_t_i_o_n │ │ │ │ │ +31{ │ │ │ │ │ +32public: │ │ │ │ │ +_3_4 K _o_p_e_r_a_t_o_r_ _(_)_ (const K& x) const │ │ │ │ │ +35 { │ │ │ │ │ +36 return sinFactor * std::sin(x) + cosFactor * std::cos(x); │ │ │ │ │ +37 } │ │ │ │ │ +38}; │ │ │ │ │ +39 │ │ │ │ │ +40 │ │ │ │ │ +42template │ │ │ │ │ +_4_3_T_r_i_g_o_n_o_m_e_t_r_i_c_F_u_n_c_t_i_o_n _d_e_r_i_v_a_t_i_v_e(const │ │ │ │ │ +_T_r_i_g_o_n_o_m_e_t_r_i_c_F_u_n_c_t_i_o_n_<_K_,_ _s_i_n_F_a_c_t_o_r_,_ _c_o_s_F_a_c_t_o_r_>& f) │ │ │ │ │ +44{ │ │ │ │ │ +45 return _T_r_i_g_o_n_o_m_e_t_r_i_c_F_u_n_c_t_i_o_n(); │ │ │ │ │ +46} │ │ │ │ │ +47 │ │ │ │ │ 48 │ │ │ │ │ -49 // Compute coefficients of derivative of polynomial. │ │ │ │ │ -50 // Helper function for the std::integer_sequence overload. │ │ │ │ │ -51 // With C++20 this can be avoided, because lambda function │ │ │ │ │ -52 // can partially specify template arguments which allows │ │ │ │ │ -53 // to do the same inline. │ │ │ │ │ -54 template │ │ │ │ │ -55 auto polynomialDerivativeCoefficientsHelper(std::integer_sequence, std::integer_sequence) { │ │ │ │ │ -56 return std::integer_sequence(); │ │ │ │ │ -57 } │ │ │ │ │ -58 │ │ │ │ │ -59 // Compute coefficients of derivative of polynomial. │ │ │ │ │ -60 // Overload for std::integer_sequence │ │ │ │ │ -61 template │ │ │ │ │ -62 auto polynomialDerivativeCoefficients(std::integer_sequence │ │ │ │ │ -coefficients) { │ │ │ │ │ -63 if constexpr (sizeof...(i)==0) │ │ │ │ │ -64 return coefficients; │ │ │ │ │ -65 else │ │ │ │ │ -66 return polynomialDerivativeCoefficientsHelper(coefficients, std:: │ │ │ │ │ -make_index_sequence()); │ │ │ │ │ -67 } │ │ │ │ │ -68 │ │ │ │ │ -69 // Compute coefficients of derivative of polynomial. │ │ │ │ │ -70 // Overload for std::tuple │ │ │ │ │ -71 template │ │ │ │ │ -72 auto polynomialDerivativeCoefficients(const std::tuple& coefficients) │ │ │ │ │ -{ │ │ │ │ │ -73 if constexpr (sizeof...(T)==0) │ │ │ │ │ -74 return coefficients; │ │ │ │ │ -75 else │ │ │ │ │ -76 { │ │ │ │ │ -77 // Notice that std::multiplies has issues with signed types. │ │ │ │ │ -78 // E.g., `decltype(-2,2ul)` is `long unsigned int`. │ │ │ │ │ -79 // Hence the same is deduced as return type in std::multiplies. │ │ │ │ │ -80 // To avoid this, we explicitly pass the exponent `i+1` as signed type. │ │ │ │ │ -81 // If the coefficient is signed, both types are now signed and │ │ │ │ │ -82 // so is the deduced result type of std::multiplies. │ │ │ │ │ -83 auto mult = Dune::Hybrid::hybridFunctor(std::multiplies()); │ │ │ │ │ -84 return Dune::unpackIntegerSequence([&](auto... i) { │ │ │ │ │ -85 using signed_type = std::conditional_t, │ │ │ │ │ -86 long signed int, signed int>; │ │ │ │ │ -87 return std::tuple(mult(std::get(coefficients), std:: │ │ │ │ │ -integral_constant()) ...); │ │ │ │ │ -88 }, std::make_index_sequence()); │ │ │ │ │ -89 } │ │ │ │ │ -90 } │ │ │ │ │ -91 │ │ │ │ │ -92} // namespace Impl in Dune::Functions:: │ │ │ │ │ -93 │ │ │ │ │ -94 │ │ │ │ │ -95 │ │ │ │ │ -122template> │ │ │ │ │ -_1_2_3class _P_o_l_y_n_o_m_i_a_l │ │ │ │ │ -124{ │ │ │ │ │ -125 template │ │ │ │ │ -126 struct IsIntegerSequence : public std::false_type {}; │ │ │ │ │ -127 │ │ │ │ │ -128 template │ │ │ │ │ -129 struct IsIntegerSequence> : public std:: │ │ │ │ │ -true_type {}; │ │ │ │ │ -130 │ │ │ │ │ -131public: │ │ │ │ │ -132 │ │ │ │ │ -_1_3_4 using _C_o_e_f_f_i_c_i_e_n_t_s = C; │ │ │ │ │ -135 │ │ │ │ │ -_1_3_7 _P_o_l_y_n_o_m_i_a_l() = default; │ │ │ │ │ -138 │ │ │ │ │ -_1_4_7 _P_o_l_y_n_o_m_i_a_l(_C_o_e_f_f_i_c_i_e_n_t_s _c_o_e_f_f_i_c_i_e_n_t_s) : │ │ │ │ │ -148 coefficients_(std::move(_c_o_e_f_f_i_c_i_e_n_t_s)) │ │ │ │ │ -149 {} │ │ │ │ │ -150 │ │ │ │ │ -_1_5_2 K _o_p_e_r_a_t_o_r_(_)_ (const K& x) const │ │ │ │ │ -153 { │ │ │ │ │ -154 auto y = K(0); │ │ │ │ │ -155 auto n = Dune::Hybrid::size(coefficients_); │ │ │ │ │ -156 Dune::Hybrid::forEach(Dune::range(n), [&](auto i) { │ │ │ │ │ -157 y += Dune::Hybrid::elementAt(coefficients_, i) * std::pow(x, int(i)); │ │ │ │ │ -158 }); │ │ │ │ │ -159 return y; │ │ │ │ │ -160 } │ │ │ │ │ -161 │ │ │ │ │ -_1_6_3 bool _o_p_e_r_a_t_o_r_=_=(const _P_o_l_y_n_o_m_i_a_l& other) const │ │ │ │ │ -164 { │ │ │ │ │ -165 if constexpr (IsIntegerSequence::value) │ │ │ │ │ -166 return true; │ │ │ │ │ -167 else │ │ │ │ │ -168 return _c_o_e_f_f_i_c_i_e_n_t_s()==other._c_o_e_f_f_i_c_i_e_n_t_s(); │ │ │ │ │ -169 } │ │ │ │ │ -170 │ │ │ │ │ -_1_8_0 friend auto _d_e_r_i_v_a_t_i_v_e(const _P_o_l_y_n_o_m_i_a_l& p) │ │ │ │ │ -181 { │ │ │ │ │ -182 auto derivativeCoefficients = Impl::polynomialDerivativeCoefficients │ │ │ │ │ -(p._c_o_e_f_f_i_c_i_e_n_t_s()); │ │ │ │ │ -183 using DerivativeCoefficients = decltype(derivativeCoefficients); │ │ │ │ │ -184 return _P_o_l_y_n_o_m_i_a_l_<_K_,_ _D_e_r_i_v_a_t_i_v_e_C_o_e_f_f_i_c_i_e_n_t_s_>(std::move │ │ │ │ │ -(derivativeCoefficients)); │ │ │ │ │ -185 } │ │ │ │ │ -186 │ │ │ │ │ -_1_8_8 const _C_o_e_f_f_i_c_i_e_n_t_s& _c_o_e_f_f_i_c_i_e_n_t_s() const │ │ │ │ │ -189 { │ │ │ │ │ -190 return coefficients_; │ │ │ │ │ -191 } │ │ │ │ │ -192 │ │ │ │ │ -193private: │ │ │ │ │ -194 _C_o_e_f_f_i_c_i_e_n_t_s coefficients_; │ │ │ │ │ -195}; │ │ │ │ │ -196 │ │ │ │ │ -197 │ │ │ │ │ -198 │ │ │ │ │ -199template │ │ │ │ │ -_2_0_0_P_o_l_y_n_o_m_i_a_l(std::vector) -> _P_o_l_y_n_o_m_i_a_l_<_K_,_ _s_t_d_:_:_v_e_c_t_o_r_<_K_>>; │ │ │ │ │ -201 │ │ │ │ │ -202template │ │ │ │ │ -_2_0_3_P_o_l_y_n_o_m_i_a_l(std::array) -> _P_o_l_y_n_o_m_i_a_l_<_K_,_ _s_t_d_:_:_a_r_r_a_y_<_K_,_n_>>; │ │ │ │ │ -204 │ │ │ │ │ -205template │ │ │ │ │ -_2_0_6_P_o_l_y_n_o_m_i_a_l(std::integer_sequence) -> _P_o_l_y_n_o_m_i_a_l>; │ │ │ │ │ -207 │ │ │ │ │ -208template │ │ │ │ │ -_2_0_9_P_o_l_y_n_o_m_i_a_l(std::initializer_list) -> _P_o_l_y_n_o_m_i_a_l_<_K_,_ _s_t_d_:_:_v_e_c_t_o_r_<_K_>>; │ │ │ │ │ -210 │ │ │ │ │ -211 │ │ │ │ │ -212 │ │ │ │ │ -225template │ │ │ │ │ -_2_2_6auto _m_a_k_e_P_o_l_y_n_o_m_i_a_l(Coefficients coefficients) │ │ │ │ │ -227{ │ │ │ │ │ -228 return _P_o_l_y_n_o_m_i_a_l_<_K_,_ _C_o_e_f_f_i_c_i_e_n_t_s_>(std::move(coefficients)); │ │ │ │ │ -229} │ │ │ │ │ -230 │ │ │ │ │ -240template │ │ │ │ │ -_2_4_1auto _m_a_k_e_P_o_l_y_n_o_m_i_a_l(std::initializer_list coefficients) │ │ │ │ │ -242{ │ │ │ │ │ -243 return _P_o_l_y_n_o_m_i_a_l_<_K_>(std::move(coefficients)); │ │ │ │ │ -244} │ │ │ │ │ -245 │ │ │ │ │ -246 │ │ │ │ │ -247 │ │ │ │ │ -248 │ │ │ │ │ -249 │ │ │ │ │ -250}} // namespace Dune::Functions │ │ │ │ │ -251 │ │ │ │ │ -252 │ │ │ │ │ -253 │ │ │ │ │ -254#endif // DUNE_FUNCTIONS_ANALYTICFUNCTIONS_POLYNOMIAL_HH │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ -friend auto derivative(const Polynomial &p) │ │ │ │ │ -Obtain derivative of Polynomial function. │ │ │ │ │ -DDeeffiinniittiioonn polynomial.hh:180 │ │ │ │ │ +49 │ │ │ │ │ +50}} // namespace Dune::Functions │ │ │ │ │ +51 │ │ │ │ │ +52 │ │ │ │ │ +53 │ │ │ │ │ +54#endif // DUNE_FUNCTIONS_ANALYTICFUNCTIONS_TRIGONOMETRICFUNCTION_HH │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ +TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const │ │ │ │ │ +TrigonometricFunction< K, sinFactor, cosFactor > &f) │ │ │ │ │ +Obtain derivative of TrigonometricFunction function. │ │ │ │ │ +DDeeffiinniittiioonn trigonometricfunction.hh:43 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_P_o_l_y_n_o_m_i_a_l │ │ │ │ │ -auto makePolynomial(Coefficients coefficients) │ │ │ │ │ -Create Polynomial. │ │ │ │ │ -DDeeffiinniittiioonn polynomial.hh:226 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l │ │ │ │ │ -A univariate polynomial implementation. │ │ │ │ │ -DDeeffiinniittiioonn polynomial.hh:124 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l_:_:_P_o_l_y_n_o_m_i_a_l │ │ │ │ │ -Polynomial()=default │ │ │ │ │ -Default constructor. │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_r_i_g_o_n_o_m_e_t_r_i_c_F_u_n_c_t_i_o_n │ │ │ │ │ +A linear combination of trigonomic functions. │ │ │ │ │ +DDeeffiinniittiioonn trigonometricfunction.hh:31 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_r_i_g_o_n_o_m_e_t_r_i_c_F_u_n_c_t_i_o_n_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ K operator()(const K &x) const │ │ │ │ │ -Evaluate polynomial. │ │ │ │ │ -DDeeffiinniittiioonn polynomial.hh:152 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l_:_:_C_o_e_f_f_i_c_i_e_n_t_s │ │ │ │ │ -C Coefficients │ │ │ │ │ -The type of the stored coefficient container. │ │ │ │ │ -DDeeffiinniittiioonn polynomial.hh:134 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l_:_:_c_o_e_f_f_i_c_i_e_n_t_s │ │ │ │ │ -const Coefficients & coefficients() const │ │ │ │ │ -Obtain reference to coefficient vector. │ │ │ │ │ -DDeeffiinniittiioonn polynomial.hh:188 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l_:_:_P_o_l_y_n_o_m_i_a_l │ │ │ │ │ -Polynomial(Coefficients coefficients) │ │ │ │ │ -Create from container of coefficients. │ │ │ │ │ -DDeeffiinniittiioonn polynomial.hh:147 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ -bool operator==(const Polynomial &other) const │ │ │ │ │ -Comparison of coefficients. │ │ │ │ │ -DDeeffiinniittiioonn polynomial.hh:163 │ │ │ │ │ +Evaluate function. │ │ │ │ │ +DDeeffiinniittiioonn trigonometricfunction.hh:34 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00005.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: trigonometricfunction.hh File Reference │ │ │ │ +dune-functions: polynomial.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -73,40 +73,59 @@ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
trigonometricfunction.hh File Reference
│ │ │ │ +
polynomial.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │
#include <cmath>
│ │ │ │ +#include <initializer_list>
│ │ │ │ +#include <vector>
│ │ │ │ +#include <dune/common/hybridutilities.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::TrigonometricFunction< K, sinFactor, cosFactor >
 A linear combination of trigonomic functions. More...
class  Dune::Functions::Polynomial< K, C >
 A univariate polynomial implementation. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ 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.
 
template<class K >
 Dune::Functions::Polynomial (std::vector< K >) -> Polynomial< K, std::vector< K > >
 
template<class K , std::size_t n>
 Dune::Functions::Polynomial (std::array< K, n >) -> Polynomial< K, std::array< K, n > >
 
template<class K , K... ci>
 Dune::Functions::Polynomial (std::integer_sequence< K, ci... >) -> Polynomial< K, std::integer_sequence< K, ci... > >
 
template<class K >
 Dune::Functions::Polynomial (std::initializer_list< K >) -> Polynomial< K, std::vector< K > >
 
template<class K , class Coefficients >
auto Dune::Functions::makePolynomial (Coefficients coefficients)
 Create Polynomial.
 
template<class K , class C >
auto Dune::Functions::makePolynomial (std::initializer_list< C > coefficients)
 Create Polynomial.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -2,29 +2,49 @@ │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _a_n_a_l_y_t_i_c_f_u_n_c_t_i_o_n_s │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -trigonometricfunction.hh File Reference │ │ │ │ │ +polynomial.hh File Reference │ │ │ │ │ #include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_r_i_g_o_n_o_m_e_t_r_i_c_F_u_n_c_t_i_o_n_<_ _K_,_ _s_i_n_F_a_c_t_o_r_,_ _c_o_s_F_a_c_t_o_r_ _> │ │ │ │ │ -  A linear combination of trigonomic functions. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l_<_ _K_,_ _C_ _> │ │ │ │ │ +  A univariate polynomial implementation. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -_T_r_i_g_o_n_o_m_e_t_r_i_c_F_u_n_c_t_i_o_n< K, -cosFactor, _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_d_e_r_i_v_a_t_i_v_e (const │ │ │ │ │ - sinFactor >  _T_r_i_g_o_n_o_m_e_t_r_i_c_F_u_n_c_t_i_o_n< K, sinFactor, │ │ │ │ │ - cosFactor > &f) │ │ │ │ │ -  Obtain derivative of │ │ │ │ │ - _T_r_i_g_o_n_o_m_e_t_r_i_c_F_u_n_c_t_i_o_n function. │ │ │ │ │ +template │ │ │ │ │ +   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l (std::vector< K >) -> _P_o_l_y_n_o_m_i_a_l< K, std:: │ │ │ │ │ + vector< K > > │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l (std::array< K, n >) -> _P_o_l_y_n_o_m_i_a_l< K, std:: │ │ │ │ │ + array< K, n > > │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l (std::integer_sequence< K, ci... >) - │ │ │ │ │ + > _P_o_l_y_n_o_m_i_a_l< K, std::integer_sequence< K, ci... > > │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l (std::initializer_list< K >) -> _P_o_l_y_n_o_m_i_a_l< │ │ │ │ │ + K, std::vector< K > > │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_P_o_l_y_n_o_m_i_a_l (Coefficients coefficients) │ │ │ │ │ +  Create _P_o_l_y_n_o_m_i_a_l. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_P_o_l_y_n_o_m_i_a_l (std::initializer_list< C > coefficients) │ │ │ │ │ +  Create _P_o_l_y_n_o_m_i_a_l. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00005_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: trigonometricfunction.hh Source File │ │ │ │ +dune-functions: polynomial.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,67 +74,232 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
trigonometricfunction.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_ANALYTICFUNCTIONS_TRIGONOMETRICFUNCTION_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_ANALYTICFUNCTIONS_TRIGONOMETRICFUNCTION_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_ANALYTICFUNCTIONS_POLYNOMIAL_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_ANALYTICFUNCTIONS_POLYNOMIAL_HH
│ │ │ │
9
│ │ │ │
10#include <cmath>
│ │ │ │ -
11
│ │ │ │ -
12namespace Dune {
│ │ │ │ -
13namespace Functions {
│ │ │ │ +
11#include <initializer_list>
│ │ │ │ +
12#include <vector>
│ │ │ │ +
13
│ │ │ │
14
│ │ │ │ -
15
│ │ │ │ +
15#include <dune/common/hybridutilities.hh>
│ │ │ │
16
│ │ │ │ -
29template<class K, int sinFactor, int cosFactor>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
31{
│ │ │ │ -
32public:
│ │ │ │ -
│ │ │ │ -
34 K operator () (const K& x) const
│ │ │ │ -
35 {
│ │ │ │ -
36 return sinFactor * std::sin(x) + cosFactor * std::cos(x);
│ │ │ │ -
37 }
│ │ │ │ -
│ │ │ │ -
38};
│ │ │ │ -
│ │ │ │ -
39
│ │ │ │ -
40
│ │ │ │ -
42template<class K, int sinFactor, int cosFactor>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
44{
│ │ │ │ -
45 return TrigonometricFunction<K, -cosFactor, sinFactor>();
│ │ │ │ -
46}
│ │ │ │ -
│ │ │ │ -
47
│ │ │ │ +
│ │ │ │ +
17namespace Dune {
│ │ │ │ +
│ │ │ │ +
18namespace Functions {
│ │ │ │ +
19
│ │ │ │ +
20namespace Impl {
│ │ │ │ +
21
│ │ │ │ +
22 // Compute coefficients of derivative of polynomial.
│ │ │ │ +
23 // Overload for std::vector
│ │ │ │ +
24 template<class K, class Allocator>
│ │ │ │ +
25 auto polynomialDerivativeCoefficients(const std::vector<K, Allocator>& coefficients) {
│ │ │ │ +
26 if (coefficients.size()==0)
│ │ │ │ +
27 return std::vector<K, Allocator>();
│ │ │ │ +
28 std::vector<K, Allocator> dpCoefficients(coefficients.size()-1);
│ │ │ │ +
29 for (size_t i=1; i<coefficients.size(); ++i)
│ │ │ │ +
30 dpCoefficients[i-1] = coefficients[i]*K(i);
│ │ │ │ +
31 return dpCoefficients;
│ │ │ │ +
32 }
│ │ │ │ +
33
│ │ │ │ +
34 // Compute coefficients of derivative of polynomial.
│ │ │ │ +
35 // Overload for std::array
│ │ │ │ +
36 template<class K, std::size_t n>
│ │ │ │ +
37 auto polynomialDerivativeCoefficients(const std::array<K, n>& coefficients) {
│ │ │ │ +
38 if constexpr (n==0)
│ │ │ │ +
39 return coefficients;
│ │ │ │ +
40 else
│ │ │ │ +
41 {
│ │ │ │ +
42 std::array<K, n-1> dpCoefficients;
│ │ │ │ +
43 for (size_t i=1; i<coefficients.size(); ++i)
│ │ │ │ +
44 dpCoefficients[i-1] = coefficients[i]*K(i);
│ │ │ │ +
45 return dpCoefficients;
│ │ │ │ +
46 }
│ │ │ │ +
47 }
│ │ │ │
48
│ │ │ │ -
49
│ │ │ │ -
50}} // namespace Dune::Functions
│ │ │ │ -
51
│ │ │ │ -
52
│ │ │ │ -
53
│ │ │ │ -
54#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:43
│ │ │ │ +
49 // Compute coefficients of derivative of polynomial.
│ │ │ │ +
50 // Helper function for the std::integer_sequence overload.
│ │ │ │ +
51 // With C++20 this can be avoided, because lambda function
│ │ │ │ +
52 // can partially specify template arguments which allows
│ │ │ │ +
53 // to do the same inline.
│ │ │ │ +
54 template<class I, I i0, I... i, class J, J j0, J... j>
│ │ │ │ +
55 auto polynomialDerivativeCoefficientsHelper(std::integer_sequence<I, i0, i...>, std::integer_sequence<J, j0, j...>) {
│ │ │ │ +
56 return std::integer_sequence<I, i*I(j)...>();
│ │ │ │ +
57 }
│ │ │ │ +
58
│ │ │ │ +
59 // Compute coefficients of derivative of polynomial.
│ │ │ │ +
60 // Overload for std::integer_sequence
│ │ │ │ +
61 template<class I, I... i>
│ │ │ │ +
62 auto polynomialDerivativeCoefficients(std::integer_sequence<I, i...> coefficients) {
│ │ │ │ +
63 if constexpr (sizeof...(i)==0)
│ │ │ │ +
64 return coefficients;
│ │ │ │ +
65 else
│ │ │ │ +
66 return polynomialDerivativeCoefficientsHelper(coefficients, std::make_index_sequence<sizeof...(i)>());
│ │ │ │ +
67 }
│ │ │ │ +
68
│ │ │ │ +
69 // Compute coefficients of derivative of polynomial.
│ │ │ │ +
70 // Overload for std::tuple
│ │ │ │ +
71 template<class...T>
│ │ │ │ +
72 auto polynomialDerivativeCoefficients(const std::tuple<T...>& coefficients) {
│ │ │ │ +
73 if constexpr (sizeof...(T)==0)
│ │ │ │ +
74 return coefficients;
│ │ │ │ +
75 else
│ │ │ │ +
76 {
│ │ │ │ +
77 // Notice that std::multiplies<void> has issues with signed types.
│ │ │ │ +
78 // E.g., `decltype(-2,2ul)` is `long unsigned int`.
│ │ │ │ +
79 // Hence the same is deduced as return type in std::multiplies.
│ │ │ │ +
80 // To avoid this, we explicitly pass the exponent `i+1` as signed type.
│ │ │ │ +
81 // If the coefficient is signed, both types are now signed and
│ │ │ │ +
82 // so is the deduced result type of std::multiplies.
│ │ │ │ +
83 auto mult = Dune::Hybrid::hybridFunctor(std::multiplies());
│ │ │ │ +
84 return Dune::unpackIntegerSequence([&](auto... i) {
│ │ │ │ +
85 using signed_type = std::conditional_t<std::is_same_v<std::size_t, long unsigned int>,
│ │ │ │ +
86 long signed int, signed int>;
│ │ │ │ +
87 return std::tuple(mult(std::get<i+1>(coefficients), std::integral_constant<signed_type, i+1>()) ...);
│ │ │ │ +
88 }, std::make_index_sequence<sizeof...(T)-1>());
│ │ │ │ +
89 }
│ │ │ │ +
90 }
│ │ │ │ +
91
│ │ │ │ +
92} // namespace Impl in Dune::Functions::
│ │ │ │ +
93
│ │ │ │ +
94
│ │ │ │ +
95
│ │ │ │ +
122template<class K, class C=std::vector<K>>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
124{
│ │ │ │ +
125 template<class CC>
│ │ │ │ +
126 struct IsIntegerSequence : public std::false_type {};
│ │ │ │ +
127
│ │ │ │ +
128 template<class I, I... i>
│ │ │ │ +
129 struct IsIntegerSequence<std::integer_sequence<I, i...>> : public std::true_type {};
│ │ │ │ +
130
│ │ │ │ +
131public:
│ │ │ │ +
132
│ │ │ │ +
134 using Coefficients = C;
│ │ │ │ +
135
│ │ │ │ +
137 Polynomial() = default;
│ │ │ │ +
138
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
148 coefficients_(std::move(coefficients))
│ │ │ │ +
149 {}
│ │ │ │ +
│ │ │ │ +
150
│ │ │ │ +
│ │ │ │ +
152 K operator() (const K& x) const
│ │ │ │ +
153 {
│ │ │ │ +
154 auto y = K(0);
│ │ │ │ +
155 auto n = Dune::Hybrid::size(coefficients_);
│ │ │ │ +
156 Dune::Hybrid::forEach(Dune::range(n), [&](auto i) {
│ │ │ │ +
157 y += Dune::Hybrid::elementAt(coefficients_, i) * std::pow(x, int(i));
│ │ │ │ +
158 });
│ │ │ │ +
159 return y;
│ │ │ │ +
160 }
│ │ │ │ +
│ │ │ │ +
161
│ │ │ │ +
│ │ │ │ +
163 bool operator==(const Polynomial& other) const
│ │ │ │ +
164 {
│ │ │ │ +
165 if constexpr (IsIntegerSequence<Coefficients>::value)
│ │ │ │ +
166 return true;
│ │ │ │ +
167 else
│ │ │ │ +
168 return coefficients()==other.coefficients();
│ │ │ │ +
169 }
│ │ │ │ +
│ │ │ │ +
170
│ │ │ │ +
│ │ │ │ +
180 friend auto derivative(const Polynomial& p)
│ │ │ │ +
181 {
│ │ │ │ +
182 auto derivativeCoefficients = Impl::polynomialDerivativeCoefficients(p.coefficients());
│ │ │ │ +
183 using DerivativeCoefficients = decltype(derivativeCoefficients);
│ │ │ │ +
184 return Polynomial<K, DerivativeCoefficients>(std::move(derivativeCoefficients));
│ │ │ │ +
185 }
│ │ │ │ +
│ │ │ │ +
186
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
189 {
│ │ │ │ +
190 return coefficients_;
│ │ │ │ +
191 }
│ │ │ │ +
│ │ │ │ +
192
│ │ │ │ +
193private:
│ │ │ │ +
194 Coefficients coefficients_;
│ │ │ │ +
195};
│ │ │ │ +
│ │ │ │ +
196
│ │ │ │ +
197
│ │ │ │ +
198
│ │ │ │ +
199template<class K>
│ │ │ │ + │ │ │ │ +
201
│ │ │ │ +
202template<class K, std::size_t n>
│ │ │ │ + │ │ │ │ +
204
│ │ │ │ +
205template<class K, K... ci>
│ │ │ │ +
206Polynomial(std::integer_sequence<K, ci...>) -> Polynomial<K, std::integer_sequence<K,ci...>>;
│ │ │ │ +
207
│ │ │ │ +
208template<class K>
│ │ │ │ +
209Polynomial(std::initializer_list<K>) -> Polynomial<K, std::vector<K>>;
│ │ │ │ +
210
│ │ │ │ +
211
│ │ │ │ +
212
│ │ │ │ +
225template<class K, class Coefficients>
│ │ │ │ +
│ │ │ │ +
226auto makePolynomial(Coefficients coefficients)
│ │ │ │ +
227{
│ │ │ │ +
228 return Polynomial<K, Coefficients>(std::move(coefficients));
│ │ │ │ +
229}
│ │ │ │ +
│ │ │ │ +
230
│ │ │ │ +
240template<class K, class C>
│ │ │ │ +
│ │ │ │ +
241auto makePolynomial(std::initializer_list<C> coefficients)
│ │ │ │ +
242{
│ │ │ │ +
243 return Polynomial<K>(std::move(coefficients));
│ │ │ │ +
244}
│ │ │ │ +
│ │ │ │ +
245
│ │ │ │ +
246
│ │ │ │ +
247
│ │ │ │ +
248
│ │ │ │ +
249
│ │ │ │ +
250}} // namespace Dune::Functions
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
251
│ │ │ │ +
252
│ │ │ │ +
253
│ │ │ │ +
254#endif // DUNE_FUNCTIONS_ANALYTICFUNCTIONS_POLYNOMIAL_HH
│ │ │ │ +
friend auto derivative(const Polynomial &p)
Obtain derivative of Polynomial function.
Definition polynomial.hh:180
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
A linear combination of trigonomic functions.
Definition trigonometricfunction.hh:31
│ │ │ │ -
K operator()(const K &x) const
Evaluate function.
Definition trigonometricfunction.hh:34
│ │ │ │ +
auto makePolynomial(Coefficients coefficients)
Create Polynomial.
Definition polynomial.hh:226
│ │ │ │ +
A univariate polynomial implementation.
Definition polynomial.hh:124
│ │ │ │ +
Polynomial()=default
Default constructor.
│ │ │ │ +
K operator()(const K &x) const
Evaluate polynomial.
Definition polynomial.hh:152
│ │ │ │ +
C Coefficients
The type of the stored coefficient container.
Definition polynomial.hh:134
│ │ │ │ +
const Coefficients & coefficients() const
Obtain reference to coefficient vector.
Definition polynomial.hh:188
│ │ │ │ +
Polynomial(Coefficients coefficients)
Create from container of coefficients.
Definition polynomial.hh:147
│ │ │ │ +
bool operator==(const Polynomial &other) const
Comparison of coefficients.
Definition polynomial.hh:163
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,68 +1,246 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _a_n_a_l_y_t_i_c_f_u_n_c_t_i_o_n_s │ │ │ │ │ -trigonometricfunction.hh │ │ │ │ │ +polynomial.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_ANALYTICFUNCTIONS_TRIGONOMETRICFUNCTION_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_ANALYTICFUNCTIONS_TRIGONOMETRICFUNCTION_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_ANALYTICFUNCTIONS_POLYNOMIAL_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_ANALYTICFUNCTIONS_POLYNOMIAL_HH │ │ │ │ │ 9 │ │ │ │ │ 10#include │ │ │ │ │ -11 │ │ │ │ │ -12namespace _D_u_n_e { │ │ │ │ │ -13namespace Functions { │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13 │ │ │ │ │ 14 │ │ │ │ │ -15 │ │ │ │ │ +15#include │ │ │ │ │ 16 │ │ │ │ │ -29template │ │ │ │ │ -_3_0class _T_r_i_g_o_n_o_m_e_t_r_i_c_F_u_n_c_t_i_o_n │ │ │ │ │ -31{ │ │ │ │ │ -32public: │ │ │ │ │ -_3_4 K _o_p_e_r_a_t_o_r_ _(_)_ (const K& x) const │ │ │ │ │ -35 { │ │ │ │ │ -36 return sinFactor * std::sin(x) + cosFactor * std::cos(x); │ │ │ │ │ -37 } │ │ │ │ │ -38}; │ │ │ │ │ -39 │ │ │ │ │ -40 │ │ │ │ │ -42template │ │ │ │ │ -_4_3_T_r_i_g_o_n_o_m_e_t_r_i_c_F_u_n_c_t_i_o_n _d_e_r_i_v_a_t_i_v_e(const │ │ │ │ │ -_T_r_i_g_o_n_o_m_e_t_r_i_c_F_u_n_c_t_i_o_n_<_K_,_ _s_i_n_F_a_c_t_o_r_,_ _c_o_s_F_a_c_t_o_r_>& f) │ │ │ │ │ -44{ │ │ │ │ │ -45 return _T_r_i_g_o_n_o_m_e_t_r_i_c_F_u_n_c_t_i_o_n(); │ │ │ │ │ -46} │ │ │ │ │ -47 │ │ │ │ │ +_1_7namespace _D_u_n_e { │ │ │ │ │ +_1_8namespace Functions { │ │ │ │ │ +19 │ │ │ │ │ +20namespace Impl { │ │ │ │ │ +21 │ │ │ │ │ +22 // Compute coefficients of derivative of polynomial. │ │ │ │ │ +23 // Overload for std::vector │ │ │ │ │ +24 template │ │ │ │ │ +25 auto polynomialDerivativeCoefficients(const std::vector& │ │ │ │ │ +coefficients) { │ │ │ │ │ +26 if (coefficients.size()==0) │ │ │ │ │ +27 return std::vector(); │ │ │ │ │ +28 std::vector dpCoefficients(coefficients.size()-1); │ │ │ │ │ +29 for (size_t i=1; i │ │ │ │ │ +37 auto polynomialDerivativeCoefficients(const std::array& coefficients) │ │ │ │ │ +{ │ │ │ │ │ +38 if constexpr (n==0) │ │ │ │ │ +39 return coefficients; │ │ │ │ │ +40 else │ │ │ │ │ +41 { │ │ │ │ │ +42 std::array dpCoefficients; │ │ │ │ │ +43 for (size_t i=1; i derivative(const │ │ │ │ │ -TrigonometricFunction< K, sinFactor, cosFactor > &f) │ │ │ │ │ -Obtain derivative of TrigonometricFunction function. │ │ │ │ │ -DDeeffiinniittiioonn trigonometricfunction.hh:43 │ │ │ │ │ +49 // Compute coefficients of derivative of polynomial. │ │ │ │ │ +50 // Helper function for the std::integer_sequence overload. │ │ │ │ │ +51 // With C++20 this can be avoided, because lambda function │ │ │ │ │ +52 // can partially specify template arguments which allows │ │ │ │ │ +53 // to do the same inline. │ │ │ │ │ +54 template │ │ │ │ │ +55 auto polynomialDerivativeCoefficientsHelper(std::integer_sequence, std::integer_sequence) { │ │ │ │ │ +56 return std::integer_sequence(); │ │ │ │ │ +57 } │ │ │ │ │ +58 │ │ │ │ │ +59 // Compute coefficients of derivative of polynomial. │ │ │ │ │ +60 // Overload for std::integer_sequence │ │ │ │ │ +61 template │ │ │ │ │ +62 auto polynomialDerivativeCoefficients(std::integer_sequence │ │ │ │ │ +coefficients) { │ │ │ │ │ +63 if constexpr (sizeof...(i)==0) │ │ │ │ │ +64 return coefficients; │ │ │ │ │ +65 else │ │ │ │ │ +66 return polynomialDerivativeCoefficientsHelper(coefficients, std:: │ │ │ │ │ +make_index_sequence()); │ │ │ │ │ +67 } │ │ │ │ │ +68 │ │ │ │ │ +69 // Compute coefficients of derivative of polynomial. │ │ │ │ │ +70 // Overload for std::tuple │ │ │ │ │ +71 template │ │ │ │ │ +72 auto polynomialDerivativeCoefficients(const std::tuple& coefficients) │ │ │ │ │ +{ │ │ │ │ │ +73 if constexpr (sizeof...(T)==0) │ │ │ │ │ +74 return coefficients; │ │ │ │ │ +75 else │ │ │ │ │ +76 { │ │ │ │ │ +77 // Notice that std::multiplies has issues with signed types. │ │ │ │ │ +78 // E.g., `decltype(-2,2ul)` is `long unsigned int`. │ │ │ │ │ +79 // Hence the same is deduced as return type in std::multiplies. │ │ │ │ │ +80 // To avoid this, we explicitly pass the exponent `i+1` as signed type. │ │ │ │ │ +81 // If the coefficient is signed, both types are now signed and │ │ │ │ │ +82 // so is the deduced result type of std::multiplies. │ │ │ │ │ +83 auto mult = Dune::Hybrid::hybridFunctor(std::multiplies()); │ │ │ │ │ +84 return Dune::unpackIntegerSequence([&](auto... i) { │ │ │ │ │ +85 using signed_type = std::conditional_t, │ │ │ │ │ +86 long signed int, signed int>; │ │ │ │ │ +87 return std::tuple(mult(std::get(coefficients), std:: │ │ │ │ │ +integral_constant()) ...); │ │ │ │ │ +88 }, std::make_index_sequence()); │ │ │ │ │ +89 } │ │ │ │ │ +90 } │ │ │ │ │ +91 │ │ │ │ │ +92} // namespace Impl in Dune::Functions:: │ │ │ │ │ +93 │ │ │ │ │ +94 │ │ │ │ │ +95 │ │ │ │ │ +122template> │ │ │ │ │ +_1_2_3class _P_o_l_y_n_o_m_i_a_l │ │ │ │ │ +124{ │ │ │ │ │ +125 template │ │ │ │ │ +126 struct IsIntegerSequence : public std::false_type {}; │ │ │ │ │ +127 │ │ │ │ │ +128 template │ │ │ │ │ +129 struct IsIntegerSequence> : public std:: │ │ │ │ │ +true_type {}; │ │ │ │ │ +130 │ │ │ │ │ +131public: │ │ │ │ │ +132 │ │ │ │ │ +_1_3_4 using _C_o_e_f_f_i_c_i_e_n_t_s = C; │ │ │ │ │ +135 │ │ │ │ │ +_1_3_7 _P_o_l_y_n_o_m_i_a_l() = default; │ │ │ │ │ +138 │ │ │ │ │ +_1_4_7 _P_o_l_y_n_o_m_i_a_l(_C_o_e_f_f_i_c_i_e_n_t_s _c_o_e_f_f_i_c_i_e_n_t_s) : │ │ │ │ │ +148 coefficients_(std::move(_c_o_e_f_f_i_c_i_e_n_t_s)) │ │ │ │ │ +149 {} │ │ │ │ │ +150 │ │ │ │ │ +_1_5_2 K _o_p_e_r_a_t_o_r_(_)_ (const K& x) const │ │ │ │ │ +153 { │ │ │ │ │ +154 auto y = K(0); │ │ │ │ │ +155 auto n = Dune::Hybrid::size(coefficients_); │ │ │ │ │ +156 Dune::Hybrid::forEach(Dune::range(n), [&](auto i) { │ │ │ │ │ +157 y += Dune::Hybrid::elementAt(coefficients_, i) * std::pow(x, int(i)); │ │ │ │ │ +158 }); │ │ │ │ │ +159 return y; │ │ │ │ │ +160 } │ │ │ │ │ +161 │ │ │ │ │ +_1_6_3 bool _o_p_e_r_a_t_o_r_=_=(const _P_o_l_y_n_o_m_i_a_l& other) const │ │ │ │ │ +164 { │ │ │ │ │ +165 if constexpr (IsIntegerSequence::value) │ │ │ │ │ +166 return true; │ │ │ │ │ +167 else │ │ │ │ │ +168 return _c_o_e_f_f_i_c_i_e_n_t_s()==other._c_o_e_f_f_i_c_i_e_n_t_s(); │ │ │ │ │ +169 } │ │ │ │ │ +170 │ │ │ │ │ +_1_8_0 friend auto _d_e_r_i_v_a_t_i_v_e(const _P_o_l_y_n_o_m_i_a_l& p) │ │ │ │ │ +181 { │ │ │ │ │ +182 auto derivativeCoefficients = Impl::polynomialDerivativeCoefficients │ │ │ │ │ +(p._c_o_e_f_f_i_c_i_e_n_t_s()); │ │ │ │ │ +183 using DerivativeCoefficients = decltype(derivativeCoefficients); │ │ │ │ │ +184 return _P_o_l_y_n_o_m_i_a_l_<_K_,_ _D_e_r_i_v_a_t_i_v_e_C_o_e_f_f_i_c_i_e_n_t_s_>(std::move │ │ │ │ │ +(derivativeCoefficients)); │ │ │ │ │ +185 } │ │ │ │ │ +186 │ │ │ │ │ +_1_8_8 const _C_o_e_f_f_i_c_i_e_n_t_s& _c_o_e_f_f_i_c_i_e_n_t_s() const │ │ │ │ │ +189 { │ │ │ │ │ +190 return coefficients_; │ │ │ │ │ +191 } │ │ │ │ │ +192 │ │ │ │ │ +193private: │ │ │ │ │ +194 _C_o_e_f_f_i_c_i_e_n_t_s coefficients_; │ │ │ │ │ +195}; │ │ │ │ │ +196 │ │ │ │ │ +197 │ │ │ │ │ +198 │ │ │ │ │ +199template │ │ │ │ │ +_2_0_0_P_o_l_y_n_o_m_i_a_l(std::vector) -> _P_o_l_y_n_o_m_i_a_l_<_K_,_ _s_t_d_:_:_v_e_c_t_o_r_<_K_>>; │ │ │ │ │ +201 │ │ │ │ │ +202template │ │ │ │ │ +_2_0_3_P_o_l_y_n_o_m_i_a_l(std::array) -> _P_o_l_y_n_o_m_i_a_l_<_K_,_ _s_t_d_:_:_a_r_r_a_y_<_K_,_n_>>; │ │ │ │ │ +204 │ │ │ │ │ +205template │ │ │ │ │ +_2_0_6_P_o_l_y_n_o_m_i_a_l(std::integer_sequence) -> _P_o_l_y_n_o_m_i_a_l>; │ │ │ │ │ +207 │ │ │ │ │ +208template │ │ │ │ │ +_2_0_9_P_o_l_y_n_o_m_i_a_l(std::initializer_list) -> _P_o_l_y_n_o_m_i_a_l_<_K_,_ _s_t_d_:_:_v_e_c_t_o_r_<_K_>>; │ │ │ │ │ +210 │ │ │ │ │ +211 │ │ │ │ │ +212 │ │ │ │ │ +225template │ │ │ │ │ +_2_2_6auto _m_a_k_e_P_o_l_y_n_o_m_i_a_l(Coefficients coefficients) │ │ │ │ │ +227{ │ │ │ │ │ +228 return _P_o_l_y_n_o_m_i_a_l_<_K_,_ _C_o_e_f_f_i_c_i_e_n_t_s_>(std::move(coefficients)); │ │ │ │ │ +229} │ │ │ │ │ +230 │ │ │ │ │ +240template │ │ │ │ │ +_2_4_1auto _m_a_k_e_P_o_l_y_n_o_m_i_a_l(std::initializer_list coefficients) │ │ │ │ │ +242{ │ │ │ │ │ +243 return _P_o_l_y_n_o_m_i_a_l_<_K_>(std::move(coefficients)); │ │ │ │ │ +244} │ │ │ │ │ +245 │ │ │ │ │ +246 │ │ │ │ │ +247 │ │ │ │ │ +248 │ │ │ │ │ +249 │ │ │ │ │ +250}} // namespace Dune::Functions │ │ │ │ │ +251 │ │ │ │ │ +252 │ │ │ │ │ +253 │ │ │ │ │ +254#endif // DUNE_FUNCTIONS_ANALYTICFUNCTIONS_POLYNOMIAL_HH │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ +friend auto derivative(const Polynomial &p) │ │ │ │ │ +Obtain derivative of Polynomial function. │ │ │ │ │ +DDeeffiinniittiioonn polynomial.hh:180 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_r_i_g_o_n_o_m_e_t_r_i_c_F_u_n_c_t_i_o_n │ │ │ │ │ -A linear combination of trigonomic functions. │ │ │ │ │ -DDeeffiinniittiioonn trigonometricfunction.hh:31 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_r_i_g_o_n_o_m_e_t_r_i_c_F_u_n_c_t_i_o_n_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_P_o_l_y_n_o_m_i_a_l │ │ │ │ │ +auto makePolynomial(Coefficients coefficients) │ │ │ │ │ +Create Polynomial. │ │ │ │ │ +DDeeffiinniittiioonn polynomial.hh:226 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l │ │ │ │ │ +A univariate polynomial implementation. │ │ │ │ │ +DDeeffiinniittiioonn polynomial.hh:124 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l_:_:_P_o_l_y_n_o_m_i_a_l │ │ │ │ │ +Polynomial()=default │ │ │ │ │ +Default constructor. │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ K operator()(const K &x) const │ │ │ │ │ -Evaluate function. │ │ │ │ │ -DDeeffiinniittiioonn trigonometricfunction.hh:34 │ │ │ │ │ +Evaluate polynomial. │ │ │ │ │ +DDeeffiinniittiioonn polynomial.hh:152 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l_:_:_C_o_e_f_f_i_c_i_e_n_t_s │ │ │ │ │ +C Coefficients │ │ │ │ │ +The type of the stored coefficient container. │ │ │ │ │ +DDeeffiinniittiioonn polynomial.hh:134 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l_:_:_c_o_e_f_f_i_c_i_e_n_t_s │ │ │ │ │ +const Coefficients & coefficients() const │ │ │ │ │ +Obtain reference to coefficient vector. │ │ │ │ │ +DDeeffiinniittiioonn polynomial.hh:188 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l_:_:_P_o_l_y_n_o_m_i_a_l │ │ │ │ │ +Polynomial(Coefficients coefficients) │ │ │ │ │ +Create from container of coefficients. │ │ │ │ │ +DDeeffiinniittiioonn polynomial.hh:147 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_n_o_m_i_a_l_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ +bool operator==(const Polynomial &other) const │ │ │ │ │ +Comparison of coefficients. │ │ │ │ │ +DDeeffiinniittiioonn polynomial.hh:163 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00011.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: istlvectorbackend.hh File Reference │ │ │ │ +dune-functions: indexaccess.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,61 +65,66 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
istlvectorbackend.hh File Reference
│ │ │ │ +
indexaccess.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <cstddef>
│ │ │ │ -#include <utility>
│ │ │ │ +
#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/typetraits.hh>
│ │ │ │ #include <dune/common/concept.hh>
│ │ │ │ -#include <dune/functions/common/indexaccess.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/concepts.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
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<class V >
constexpr auto Dune::Functions::fieldTypes ()
 Generate list of field types in container.
 
template<class V >
constexpr bool Dune::Functions::hasUniqueFieldType ()
 Check if container has a unique field type.
 
template<class Vector >
auto Dune::Functions::istlVectorBackend (Vector &v)
 Return a vector backend wrapping non-const ISTL like containers.
 
template<class Vector >
auto Dune::Functions::istlVectorBackend (const Vector &v)
 Return a vector backend wrapping const ISTL like containers.
 
template<class C , class I , class F , std::enable_if_t< Dune::models< Imp::Concept::HasDynamicIndexAccess< I >, C >(), int > = 0>
auto Dune::Functions::hybridIndexAccess (C &&c, const I &i, F &&f) -> decltype(f(c[i]))
 Provide operator[] index-access for containers.
 
template<class C , class I , class F , std::enable_if_t< not Dune::models< Imp::Concept::HasDynamicIndexAccess< I >, C >(), int > = 0>
decltype(auto) Dune::Functions::hybridIndexAccess (C &&c, const I &i, F &&f)
 Provide operator[] index-access for containers.
 
template<class Result , class C , class MultiIndex >
Result Dune::Functions::hybridMultiIndexAccess (C &&c, const MultiIndex &index)
 Provide multi-index access by chaining operator[].
 
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[].
 
template<class C , class MultiIndex >
constexpr decltype(auto) Dune::Functions::resolveDynamicMultiIndex (C &&c, const MultiIndex &multiIndex)
 Provide multi-index access by chaining operator[].
 
template<class C , class MultiIndex >
constexpr decltype(auto) Dune::Functions::resolveStaticMultiIndex (C &&c, const MultiIndex &multiIndex)
 Provide multi-index access by chaining operator[].
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,44 +1,56 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _b_a_c_k_e_n_d_s │ │ │ │ │ + * _c_o_m_m_o_n │ │ │ │ │ _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -istlvectorbackend.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +indexaccess.hh File Reference │ │ │ │ │ #include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_i_n_d_e_x_a_c_c_e_s_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_u_t_i_l_i_t_y_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -constexpr auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_i_e_l_d_T_y_p_e_s () │ │ │ │ │ -  Generate list of field types in container. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_h_a_s_U_n_i_q_u_e_F_i_e_l_d_T_y_p_e () │ │ │ │ │ -  Check if container has a unique field type. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d (Vector &v) │ │ │ │ │ -  Return a vector backend wrapping non-const ISTL like │ │ │ │ │ - containers. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d (const Vector &v) │ │ │ │ │ -  Return a vector backend wrapping const ISTL like containers. │ │ │ │ │ +template, C >(), int > = 0> │ │ │ │ │ + auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_h_y_b_r_i_d_I_n_d_e_x_A_c_c_e_s_s (C &&c, const I │ │ │ │ │ + &i, F &&f) -> decltype(f(c[i])) │ │ │ │ │ +  Provide operator[] index-access for containers. │ │ │ │ │ +  │ │ │ │ │ +template, C >(), int > = 0> │ │ │ │ │ + decltype(auto)  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_h_y_b_r_i_d_I_n_d_e_x_A_c_c_e_s_s (C &&c, const I │ │ │ │ │ + &i, F &&f) │ │ │ │ │ +  Provide operator[] index-access for containers. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + Result  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_h_y_b_r_i_d_M_u_l_t_i_I_n_d_e_x_A_c_c_e_s_s (C &&c, const │ │ │ │ │ + MultiIndex &index) │ │ │ │ │ +  Provide multi-index access by chaining operator[]. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +constexpr decltype(auto)  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_r_e_s_o_l_v_e_D_y_n_a_m_i_c_M_u_l_t_i_I_n_d_e_x (C &&c, │ │ │ │ │ + const MultiIndex &multiIndex, const IsFinal &isFinal) │ │ │ │ │ +  Provide multi-index access by chaining operator[]. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +constexpr decltype(auto)  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_r_e_s_o_l_v_e_D_y_n_a_m_i_c_M_u_l_t_i_I_n_d_e_x (C &&c, │ │ │ │ │ + const MultiIndex &multiIndex) │ │ │ │ │ +  Provide multi-index access by chaining operator[]. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +constexpr decltype(auto)  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_r_e_s_o_l_v_e_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x (C &&c, │ │ │ │ │ + const MultiIndex &multiIndex) │ │ │ │ │ +  Provide multi-index access by chaining operator[]. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00011_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: istlvectorbackend.hh Source File │ │ │ │ +dune-functions: indexaccess.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,352 +70,343 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
istlvectorbackend.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_ISTLVECTORBACKEND_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_ISTLVECTORBACKEND_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_COMMON_INDEX_ACCESS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_COMMON_INDEX_ACCESS_HH
│ │ │ │
9
│ │ │ │ -
10#include <cstddef>
│ │ │ │ +
10
│ │ │ │
11#include <utility>
│ │ │ │
12#include <type_traits>
│ │ │ │
13
│ │ │ │ -
14#include <dune/common/std/type_traits.hh>
│ │ │ │ -
15#include <dune/common/indices.hh>
│ │ │ │ +
14#include <dune/common/typetraits.hh>
│ │ │ │ +
15#include <dune/common/concept.hh>
│ │ │ │
16#include <dune/common/hybridutilities.hh>
│ │ │ │ -
17#include <dune/common/concept.hh>
│ │ │ │ -
18
│ │ │ │ - │ │ │ │ - │ │ │ │ +
17
│ │ │ │ + │ │ │ │ +
19
│ │ │ │ +
20
│ │ │ │
21
│ │ │ │ -
22
│ │ │ │ -
23namespace Dune {
│ │ │ │ -
24namespace Functions {
│ │ │ │ +
22namespace Dune {
│ │ │ │ +
23namespace Functions {
│ │ │ │ +
24
│ │ │ │
25
│ │ │ │ -
26namespace Impl {
│ │ │ │ +
26namespace Imp {
│ │ │ │
27
│ │ │ │ -
28template<class V,
│ │ │ │ -
29 std::enable_if_t<not Dune::models<Imp::Concept::HasStaticIndexAccess, V>() , int> = 0>
│ │ │ │ -
30auto fieldTypes(V&& /*v*/)
│ │ │ │ -
31{
│ │ │ │ -
32 return TypeList<V>{};
│ │ │ │ -
33}
│ │ │ │ -
34
│ │ │ │ -
35template<class V,
│ │ │ │ -
36 std::enable_if_t<Dune::models<Imp::Concept::HasStaticIndexAccess, V>(), int> = 0>
│ │ │ │ -
37auto fieldTypes(V&& v)
│ │ │ │ -
38{
│ │ │ │ -
39 if constexpr (Dune::models<Imp::Concept::HasDynamicIndexAccess<std::size_t>, V>())
│ │ │ │ -
40 return fieldTypes(v[std::size_t{0}]);
│ │ │ │ -
41 else
│ │ │ │ -
42 {
│ │ │ │ -
43 auto indexRange = typename decltype(range(Hybrid::size(v)))::integer_sequence();
│ │ │ │ -
44 return unpackIntegerSequence([&](auto... i) {
│ │ │ │ -
45 return uniqueTypeList(std::tuple_cat(fieldTypes(v[i])...));
│ │ │ │ -
46 }, indexRange);
│ │ │ │ -
47 }
│ │ │ │ -
48}
│ │ │ │ -
49
│ │ │ │ -
50} // namespace Impl
│ │ │ │ +
28namespace Concept {
│ │ │ │ +
29
│ │ │ │ +
30template<class size_type>
│ │ │ │ +
31struct HasDynamicIndexAccess
│ │ │ │ +
32{
│ │ │ │ +
33 template<class C>
│ │ │ │ +
34 auto require(C&& c) -> decltype(
│ │ │ │ +
35 c[std::declval<size_type>()]
│ │ │ │ +
36 );
│ │ │ │ +
37};
│ │ │ │ +
38
│ │ │ │ +
39struct HasStaticIndexAccess
│ │ │ │ +
40{
│ │ │ │ +
41 template<class C>
│ │ │ │ +
42 auto require(C&& c) -> decltype(
│ │ │ │ +
43 c[Dune::Indices::_0]
│ │ │ │ +
44 );
│ │ │ │ +
45};
│ │ │ │ +
46
│ │ │ │ +
47} // namespace Concept
│ │ │ │ +
48
│ │ │ │ +
49} // namespace Imp
│ │ │ │ +
50
│ │ │ │
51
│ │ │ │
52
│ │ │ │ -
53
│ │ │ │ -
66template<class V>
│ │ │ │ +
65template<class C, class I, class F,
│ │ │ │ +
66 std::enable_if_t< Dune::models<Imp::Concept::HasDynamicIndexAccess<I>, C>(), int> = 0>
│ │ │ │
│ │ │ │ -
67constexpr auto fieldTypes()
│ │ │ │ -
68{
│ │ │ │ -
69 return decltype(Impl::fieldTypes(std::declval<V>())){};
│ │ │ │ -
70}
│ │ │ │ -
│ │ │ │ -
71
│ │ │ │ -
77template<class V>
│ │ │ │ -
│ │ │ │ -
78constexpr bool hasUniqueFieldType()
│ │ │ │ -
79{
│ │ │ │ -
80 return std::tuple_size_v<std::decay_t<decltype(fieldTypes<V>())>> ==1;
│ │ │ │ -
81}
│ │ │ │ -
│ │ │ │ -
82
│ │ │ │ -
83
│ │ │ │ -
84
│ │ │ │ -
85namespace Impl {
│ │ │ │ -
86
│ │ │ │ -
87/*
│ │ │ │ -
88 * \brief A wrapper providing multi-index access to vector entries
│ │ │ │ -
89 *
│ │ │ │ -
90 * The wrapped vector type should be an istl like random
│ │ │ │ -
91 * access container providing operator[] and size() methods.
│ │ │ │ -
92 * For classical containers this should support indices
│ │ │ │ -
93 * of type std::size_t. For multi-type containers indices
│ │ │ │ -
94 * of the form Dune::index_constant<i> should be supported
│ │ │ │ -
95 * while size() should be a static constexpr method.
│ │ │ │ -
96 *
│ │ │ │ -
97 * When resolving multi-indices the backend appends indices
│ │ │ │ -
98 * using operator[] as long as the result is not a scalar.
│ │ │ │ -
99 * If this exhausts the digits of the multi-index, additional
│ │ │ │ -
100 * zero`s are appended.
│ │ │ │ -
101 *
│ │ │ │ -
102 * \tparam V Type of the raw wrapper vector
│ │ │ │ -
103 */
│ │ │ │ -
104template<class V>
│ │ │ │ -
105class ISTLVectorBackend
│ │ │ │ -
106{
│ │ │ │ -
107
│ │ │ │ -
108 // Template aliases for using detection idiom.
│ │ │ │ -
109 template<class C>
│ │ │ │ -
110 using dynamicIndexAccess_t = decltype(std::declval<C>()[0]);
│ │ │ │ -
111
│ │ │ │ -
112 template<class C>
│ │ │ │ -
113 using staticIndexAccess_t = decltype(std::declval<C>()[Dune::Indices::_0]);
│ │ │ │ -
114
│ │ │ │ -
115 template<class C>
│ │ │ │ -
116 using resizeMethod_t = decltype(std::declval<C>().resize(0));
│ │ │ │ -
117
│ │ │ │ -
118
│ │ │ │ -
119
│ │ │ │ -
120 // Short cuts for feature detection
│ │ │ │ -
121 template<class C>
│ │ │ │ -
122 using hasDynamicIndexAccess = Dune::Std::is_detected<dynamicIndexAccess_t, std::remove_reference_t<C>>;
│ │ │ │ -
123
│ │ │ │ -
124 template<class C>
│ │ │ │ -
125 using hasStaticIndexAccess = Dune::Std::is_detected<staticIndexAccess_t, std::remove_reference_t<C>>;
│ │ │ │ +
67auto hybridIndexAccess(C&& c, const I& i, F&& f)
│ │ │ │ +
68 -> decltype(f(c[i]))
│ │ │ │ +
69{
│ │ │ │ +
70 return f(c[i]);
│ │ │ │ +
71}
│ │ │ │ +
│ │ │ │ +
72
│ │ │ │ +
90template<class C, class I, class F,
│ │ │ │ +
91 std::enable_if_t< not Dune::models<Imp::Concept::HasDynamicIndexAccess<I>, C>(), int> = 0>
│ │ │ │ +
│ │ │ │ +
92decltype(auto) hybridIndexAccess(C&& c, const I& i, F&& f)
│ │ │ │ +
93{
│ │ │ │ +
94 using Size = decltype(Hybrid::size(c));
│ │ │ │ +
95 return Hybrid::switchCases(std::make_index_sequence<Size::value>(), i,
│ │ │ │ +
96 [&](const auto& ii) -> decltype(auto){
│ │ │ │ +
97 return f(c[ii]);
│ │ │ │ +
98 }, [&]() -> decltype(auto){
│ │ │ │ +
99 return f(c[Dune::Indices::_0]);
│ │ │ │ +
100 });
│ │ │ │ +
101}
│ │ │ │ +
│ │ │ │ +
102
│ │ │ │ +
103
│ │ │ │ +
104namespace Imp {
│ │ │ │ +
105
│ │ │ │ +
119 template<class Index, std::size_t offset=1>
│ │ │ │ +
120 class ShiftedDynamicMultiIndex
│ │ │ │ +
121 {
│ │ │ │ +
122 public:
│ │ │ │ +
123 ShiftedDynamicMultiIndex(const Index& index) :
│ │ │ │ +
124 index_(index)
│ │ │ │ +
125 {}
│ │ │ │
126
│ │ │ │ -
127 template<class C>
│ │ │ │ -
128 using hasResizeMethod = Dune::Std::is_detected<resizeMethod_t, std::remove_reference_t<C>>;
│ │ │ │ -
129
│ │ │ │ -
130 template<class C>
│ │ │ │ -
131 using isDynamicVector = Dune::Std::is_detected<dynamicIndexAccess_t, std::remove_reference_t<C>>;
│ │ │ │ -
132
│ │ │ │ -
133 template<class C>
│ │ │ │ -
134 using isStaticVector = Dune::Std::bool_constant<
│ │ │ │ -
135 Dune::Std::is_detected_v<staticIndexAccess_t, std::remove_reference_t<C>>
│ │ │ │ -
136 and not Dune::Std::is_detected_v<dynamicIndexAccess_t, std::remove_reference_t<C>>>;
│ │ │ │ -
137
│ │ │ │ -
138 template<class C>
│ │ │ │ -
139 using isScalar = Dune::Std::bool_constant<not Dune::Std::is_detected_v<staticIndexAccess_t, std::remove_reference_t<C>>>;
│ │ │ │ -
140
│ │ │ │ -
141 template<class C>
│ │ │ │ -
142 using isVector = Dune::Std::bool_constant<Dune::Std::is_detected_v<staticIndexAccess_t, std::remove_reference_t<C>>>;
│ │ │ │ -
143
│ │ │ │ -
144
│ │ │ │ -
145
│ │ │ │ -
146 template<class... Args>
│ │ │ │ -
147 static void forwardToResize(Args&&... args)
│ │ │ │ -
148 {
│ │ │ │ -
149 resize(std::forward<Args>(args)...);
│ │ │ │ -
150 }
│ │ │ │ -
151
│ │ │ │ -
152
│ │ │ │ -
153 template<class C, class SizeProvider,
│ │ │ │ -
154 std::enable_if_t<hasResizeMethod<C>::value, int> = 0>
│ │ │ │ -
155 static void resize(C&& c, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ -
156 {
│ │ │ │ -
157 auto size = sizeProvider.size(prefix);
│ │ │ │ -
158 if (size==0)
│ │ │ │ -
159 {
│ │ │ │ -
160 // If size==0 this prefix refers to a single coefficient c.
│ │ │ │ -
161 // But being in this overload means that c is not a scalar
│ │ │ │ -
162 // because is has a resize() method. Since operator[] deliberately
│ │ │ │ -
163 // supports implicit padding of multi-indices by as many
│ │ │ │ -
164 // [0]'s as needed to resolve a scalar entry, we should also
│ │ │ │ -
165 // except a non-scalar c here. However, this requires that
│ │ │ │ -
166 // we silently believe that whatever size c already has is
│ │ │ │ -
167 // intended by the user. The only exception is c.size()==0
│ │ │ │ -
168 // which is not acceptable but we also cannot know the desired size.
│ │ │ │ -
169 if (c.size()==0)
│ │ │ │ -
170 DUNE_THROW(RangeError, "The vector entry v[" << prefix << "] should refer to a "
│ │ │ │ -
171 << "scalar coefficient, but is a dynamically sized vector of size==0");
│ │ │ │ -
172 else
│ │ │ │ -
173 // Accept non-zero sized coefficients to avoid that resize(basis)
│ │ │ │ -
174 // fails for a vector that works with operator[] and already
│ │ │ │ -
175 // has the appropriate size.
│ │ │ │ -
176 return;
│ │ │ │ -
177 }
│ │ │ │ -
178 c.resize(size);
│ │ │ │ -
179 prefix.push_back(0);
│ │ │ │ -
180 for(std::size_t i=0; i<size; ++i)
│ │ │ │ -
181 {
│ │ │ │ -
182 prefix.back() = i;
│ │ │ │ -
183 resize(c[i], sizeProvider, prefix);
│ │ │ │ +
127 std::size_t operator[](std::size_t position) const
│ │ │ │ +
128 {
│ │ │ │ +
129 if (position<size())
│ │ │ │ +
130 return index_[position+offset];
│ │ │ │ +
131 else
│ │ │ │ +
132 return 0;
│ │ │ │ +
133 }
│ │ │ │ +
134
│ │ │ │ +
138 ShiftedDynamicMultiIndex<Index, offset+1> pop() const
│ │ │ │ +
139 {
│ │ │ │ +
140 return {index_};
│ │ │ │ +
141 }
│ │ │ │ +
142
│ │ │ │ +
143 std::size_t size() const
│ │ │ │ +
144 {
│ │ │ │ +
145 if (offset < index_.size())
│ │ │ │ +
146 return index_.size() - offset;
│ │ │ │ +
147 else
│ │ │ │ +
148 return 0;
│ │ │ │ +
149 }
│ │ │ │ +
150
│ │ │ │ +
151 const Index& originalIndex() const
│ │ │ │ +
152 {
│ │ │ │ +
153 return index_;
│ │ │ │ +
154 }
│ │ │ │ +
155
│ │ │ │ +
156 private:
│ │ │ │ +
157 const Index& index_;
│ │ │ │ +
158 };
│ │ │ │ +
159
│ │ │ │ +
160 template<class Index, std::size_t offset=1>
│ │ │ │ +
161 class ShiftedStaticMultiIndex
│ │ │ │ +
162 {
│ │ │ │ +
163 public:
│ │ │ │ +
164 ShiftedStaticMultiIndex(const Index& index) :
│ │ │ │ +
165 index_(index)
│ │ │ │ +
166 {}
│ │ │ │ +
167
│ │ │ │ +
168 template<std::size_t i>
│ │ │ │ +
169 auto operator[](Dune::index_constant<i>) const
│ │ │ │ +
170 {
│ │ │ │ +
171 if constexpr (i<size()) {
│ │ │ │ +
172 return index_[Dune::index_constant<i+offset>{}];
│ │ │ │ +
173 } else {
│ │ │ │ +
174 return Dune::index_constant<0>{};
│ │ │ │ +
175 }
│ │ │ │ +
176 }
│ │ │ │ +
177
│ │ │ │ +
181 ShiftedStaticMultiIndex<Index, offset+1> pop() const
│ │ │ │ +
182 {
│ │ │ │ +
183 return {index_};
│ │ │ │
184 }
│ │ │ │ -
185 }
│ │ │ │ -
186
│ │ │ │ -
187 template<class C, class SizeProvider,
│ │ │ │ -
188 std::enable_if_t<not hasResizeMethod<C>::value, int> = 0,
│ │ │ │ -
189 std::enable_if_t<isVector<C>::value, int> = 0>
│ │ │ │ -
190 static void resize(C&& c, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ -
191 {
│ │ │ │ -
192 auto size = sizeProvider.size(prefix);
│ │ │ │ -
193 // If size == 0 there's nothing to do:
│ │ │ │ -
194 // We can't resize c and it's already
│ │ │ │ -
195 // large enough anyway.
│ │ │ │ -
196 if (size == 0)
│ │ │ │ -
197 return;
│ │ │ │ +
185
│ │ │ │ +
186 static constexpr std::size_t size()
│ │ │ │ +
187 {
│ │ │ │ +
188 auto fullSize = decltype(Hybrid::size(std::declval<Index>()))::value;
│ │ │ │ +
189 if (offset < fullSize)
│ │ │ │ +
190 return fullSize - offset;
│ │ │ │ +
191 else
│ │ │ │ +
192 return 0;
│ │ │ │ +
193 }
│ │ │ │ +
194
│ │ │ │ +
195 private:
│ │ │ │ +
196 const Index& index_;
│ │ │ │ +
197 };
│ │ │ │
198
│ │ │ │ -
199 // If size>0 but c does not have the appropriate
│ │ │ │ -
200 // size we throw an exception.
│ │ │ │ -
201 //
│ │ │ │ -
202 // We could perhaps also allow c.size()>size.
│ │ │ │ -
203 // But then looping the loop below gets complicated:
│ │ │ │ -
204 // We're not allowed to loop until c.size(). But
│ │ │ │ -
205 // we also cannot use size for termination,
│ │ │ │ -
206 // because this fails if c is a static vector.
│ │ │ │ -
207 if (c.size() != size)
│ │ │ │ -
208 DUNE_THROW(RangeError, "Can't resize non-resizable entry v[" << prefix << "] of size " << c.size() << " to size(" << prefix << ")=" << size);
│ │ │ │ +
204 template<std::size_t offset, class Index>
│ │ │ │ +
205 ShiftedDynamicMultiIndex<Index, offset> shiftedDynamicMultiIndex(const Index& index)
│ │ │ │ +
206 {
│ │ │ │ +
207 return {index};
│ │ │ │ +
208 }
│ │ │ │
209
│ │ │ │ -
210 // Recursively resize all entries of c now.
│ │ │ │ -
211 using namespace Dune::Hybrid;
│ │ │ │ -
212 prefix.push_back(0);
│ │ │ │ -
213 forEach(integralRange(Hybrid::size(c)), [&](auto&& i) {
│ │ │ │ -
214 prefix.back() = i;
│ │ │ │ -
215 // Here we'd simply like to call resize(c[i], sizeProvider, prefix);
│ │ │ │ -
216 // but even gcc-7 does not except this bus reports
│ │ │ │ -
217 // "error: ‘this’ was not captured for this lambda function"
│ │ │ │ -
218 // although there's no 'this' because we're in a static method.
│ │ │ │ -
219 // Bypassing this by and additional method that does perfect
│ │ │ │ -
220 // forwarding allows to workaround this.
│ │ │ │ -
221 ISTLVectorBackend<V>::forwardToResize(c[i], sizeProvider, prefix);
│ │ │ │ -
222 });
│ │ │ │ -
223 }
│ │ │ │ -
224
│ │ │ │ -
225 template<class C, class SizeProvider,
│ │ │ │ -
226 std::enable_if_t<not hasResizeMethod<C>::value, int> = 0,
│ │ │ │ -
227 std::enable_if_t<isScalar<C>::value, int> = 0>
│ │ │ │ -
228 static void resize(C&&, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ -
229 {
│ │ │ │ -
230 auto size = sizeProvider.size(prefix);
│ │ │ │ -
231 if (size != 0)
│ │ │ │ -
232 DUNE_THROW(RangeError, "Can't resize scalar vector entry v[" << prefix << "] to size(" << prefix << ")=" << size);
│ │ │ │ -
233 }
│ │ │ │ +
218 template<std::size_t offset, class Index, std::size_t oldOffset>
│ │ │ │ +
219 ShiftedDynamicMultiIndex<Index, offset+oldOffset> shiftedDynamicMultiIndex(const ShiftedDynamicMultiIndex<Index, oldOffset>& index)
│ │ │ │ +
220 {
│ │ │ │ +
221 return {index.originalIndex()};
│ │ │ │ +
222 }
│ │ │ │ +
223
│ │ │ │ +
224 template<std::size_t offset, class Index>
│ │ │ │ +
225 ShiftedStaticMultiIndex<Index, offset> shiftedStaticMultiIndex(const Index& index)
│ │ │ │ +
226 {
│ │ │ │ +
227 return {index};
│ │ │ │ +
228 }
│ │ │ │ +
229
│ │ │ │ +
230} // namespace Imp
│ │ │ │ +
231
│ │ │ │ +
232
│ │ │ │ +
233
│ │ │ │
234
│ │ │ │ -
235 template<class C, class T,
│ │ │ │ -
236 std::enable_if_t<std::is_assignable_v<C&,T>, int> = 0>
│ │ │ │ -
237 void recursiveAssign(C& c, const T& t)
│ │ │ │ -
238 {
│ │ │ │ -
239 c = t;
│ │ │ │ -
240 }
│ │ │ │ -
241
│ │ │ │ -
242 template<class C, class T,
│ │ │ │ -
243 std::enable_if_t<not std::is_assignable_v<C&,T>, int> = 0>
│ │ │ │ -
244 void recursiveAssign(C& c, const T& t)
│ │ │ │ -
245 {
│ │ │ │ -
246 Dune::Hybrid::forEach(c, [&](auto&& ci) {
│ │ │ │ -
247 recursiveAssign(ci, t);
│ │ │ │ -
248 });
│ │ │ │ -
249 }
│ │ │ │ -
250
│ │ │ │ -
251public:
│ │ │ │ +
235namespace Imp {
│ │ │ │ +
236
│ │ │ │ +
237template<class Result, class Index>
│ │ │ │ +
238struct MultiIndexResolver
│ │ │ │ +
239{
│ │ │ │ +
240 MultiIndexResolver(const Index& index) :
│ │ │ │ +
241 index_(index)
│ │ │ │ +
242 {}
│ │ │ │ +
243
│ │ │ │ +
244 template<class C,
│ │ │ │ +
245 std::enable_if_t<not std::is_convertible_v<C&, Result>, int> = 0>
│ │ │ │ +
246 Result operator()(C&& c)
│ │ │ │ +
247 {
│ │ │ │ +
248 auto&& subIndex = Imp::shiftedDynamicMultiIndex<1>(index_);
│ │ │ │ +
249 auto&& subIndexResolver = MultiIndexResolver<Result, decltype(subIndex)>(subIndex);
│ │ │ │ +
250 return (Result)(hybridIndexAccess(c, index_[Dune::Indices::_0], subIndexResolver));
│ │ │ │ +
251 }
│ │ │ │
252
│ │ │ │ -
253 using Vector = V;
│ │ │ │ -
254
│ │ │ │ -
255 ISTLVectorBackend(Vector& vector) :
│ │ │ │ -
256 vector_(&vector)
│ │ │ │ -
257 {}
│ │ │ │ -
258
│ │ │ │ -
259 template<class SizeProvider>
│ │ │ │ -
260 void resize(const SizeProvider& sizeProvider)
│ │ │ │ -
261 {
│ │ │ │ -
262 auto prefix = typename SizeProvider::SizePrefix();
│ │ │ │ -
263 prefix.resize(0);
│ │ │ │ -
264 resize(*vector_, sizeProvider, prefix);
│ │ │ │ -
265 }
│ │ │ │ +
253 template<class C,
│ │ │ │ +
254 std::enable_if_t<std::is_convertible_v<C&, Result>, int> = 0>
│ │ │ │ +
255 Result operator()(C&& c)
│ │ │ │ +
256 {
│ │ │ │ +
257 return (Result)(std::forward<C>(c));
│ │ │ │ +
258 }
│ │ │ │ +
259
│ │ │ │ +
260 const Index& index_;
│ │ │ │ +
261};
│ │ │ │ +
262
│ │ │ │ +
263} // namespace Imp
│ │ │ │ +
264
│ │ │ │ +
265
│ │ │ │
266
│ │ │ │ -
267 template<class MultiIndex>
│ │ │ │ -
268 decltype(auto) operator[](const MultiIndex& index) const
│ │ │ │ -
269 {
│ │ │ │ -
270 return resolveDynamicMultiIndex(*vector_, index);
│ │ │ │ -
271 }
│ │ │ │ -
272
│ │ │ │ -
273 template<class MultiIndex>
│ │ │ │ -
274 decltype(auto) operator[](const MultiIndex& index)
│ │ │ │ -
275 {
│ │ │ │ -
276 return resolveDynamicMultiIndex(*vector_, index);
│ │ │ │ -
277 }
│ │ │ │ -
278
│ │ │ │ -
287 template<typename T>
│ │ │ │ -
288 void operator= (const T& other)
│ │ │ │ -
289 {
│ │ │ │ -
290 recursiveAssign(vector(), other);
│ │ │ │ -
291 }
│ │ │ │ +
285template<class Result, class C, class MultiIndex>
│ │ │ │ +
│ │ │ │ +
286Result hybridMultiIndexAccess(C&& c, const MultiIndex& index)
│ │ │ │ +
287{
│ │ │ │ +
288
│ │ │ │ +
289 Imp::MultiIndexResolver<Result, MultiIndex> multiIndexResolver(index);
│ │ │ │ +
290 return multiIndexResolver(c);
│ │ │ │ +
291}
│ │ │ │ +
│ │ │ │
292
│ │ │ │ -
293 template<typename T>
│ │ │ │ -
294 void operator= (const ISTLVectorBackend<T>& other)
│ │ │ │ -
295 {
│ │ │ │ -
296 vector() = other.vector();
│ │ │ │ -
297 }
│ │ │ │ -
298
│ │ │ │ -
299 const Vector& vector() const
│ │ │ │ -
300 {
│ │ │ │ -
301 return *vector_;
│ │ │ │ -
302 }
│ │ │ │ -
303
│ │ │ │ -
304 Vector& vector()
│ │ │ │ -
305 {
│ │ │ │ -
306 return *vector_;
│ │ │ │ -
307 }
│ │ │ │ -
308
│ │ │ │ -
309private:
│ │ │ │ +
293
│ │ │ │ +
294
│ │ │ │ +
295
│ │ │ │ +
296
│ │ │ │ +
297
│ │ │ │ +
298namespace Imp {
│ │ │ │ +
299
│ │ │ │ +
300 template<class C, class MultiIndex, class IsFinal>
│ │ │ │ +
301 constexpr decltype(auto) resolveDynamicMultiIndex(C&& c, const MultiIndex& multiIndex, const IsFinal& isFinal)
│ │ │ │ +
302 {
│ │ │ │ +
303 // If c is already considered final simply return it,
│ │ │ │ +
304 // else resolve the next multiIndex entry.
│ │ │ │ +
305 return Hybrid::ifElse(isFinal(c), [&, c = forwardCapture(std::forward<C>(c))](auto) -> decltype(auto) {
│ │ │ │ +
306 assert(multiIndex.size() == 0);
│ │ │ │ +
307 return c.forward();
│ │ │ │ +
308 }, [&](auto) -> decltype(auto) {
│ │ │ │ +
309 auto hasDynamicAccess = callableCheck([](auto&& cc) -> std::void_t<decltype(cc[0])> {});
│ │ │ │
310
│ │ │ │ -
311 Vector* vector_;
│ │ │ │ -
312};
│ │ │ │ -
313
│ │ │ │ -
314} // end namespace Impl
│ │ │ │ -
315
│ │ │ │ -
316
│ │ │ │ -
317
│ │ │ │ -
349template<class Vector>
│ │ │ │ -
│ │ │ │ -
350auto istlVectorBackend(Vector& v)
│ │ │ │ -
351{
│ │ │ │ -
352 static_assert(hasUniqueFieldType<Vector&>(), "Vector type passed to istlVectorBackend() does not have a unique field type.");
│ │ │ │ -
353 return Impl::ISTLVectorBackend<Vector>(v);
│ │ │ │ -
354}
│ │ │ │ -
│ │ │ │ -
355
│ │ │ │ -
356
│ │ │ │ -
357
│ │ │ │ -
387template<class Vector>
│ │ │ │ -
│ │ │ │ -
388auto istlVectorBackend(const Vector& v)
│ │ │ │ -
389{
│ │ │ │ -
390 static_assert(hasUniqueFieldType<const Vector&>(), "Vector type passed to istlVectorBackend() does not have a unique field type.");
│ │ │ │ -
391 return Impl::ISTLVectorBackend<const Vector>(v);
│ │ │ │ -
392}
│ │ │ │ -
│ │ │ │ -
393
│ │ │ │ -
394
│ │ │ │ -
395
│ │ │ │ -
396} // namespace Functions
│ │ │ │ -
397} // namespace Dune
│ │ │ │ -
398
│ │ │ │ -
399
│ │ │ │ -
400#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_ISTLVECTORBACKEND_HH
│ │ │ │ - │ │ │ │ -
auto istlVectorBackend(Vector &v)
Return a vector backend wrapping non-const ISTL like containers.
Definition istlvectorbackend.hh:350
│ │ │ │ +
311 // Split multiIndex into first entry and remaining ones.
│ │ │ │ +
312 auto i = multiIndex[0];
│ │ │ │ +
313 auto tail = multiIndex.pop();
│ │ │ │ +
314
│ │ │ │ +
315 // Resolve first multiIndex entry by c[multiIndex[0]] and
│ │ │ │ +
316 // continue resolving with the remaining remaining ones.
│ │ │ │ +
317 // If c has a dynamic operator[] this is straight forward.
│ │ │ │ +
318 // Else the dynamic multiIndex[0] has to be translated into
│ │ │ │ +
319 // a static one using hybridIndexAccess.
│ │ │ │ +
320 return Hybrid::ifElse(hasDynamicAccess(c), [&](auto id) -> decltype(auto) {
│ │ │ │ +
321 return Imp::resolveDynamicMultiIndex(id(c)[i], tail, isFinal);
│ │ │ │ +
322 }, [&](auto id) -> decltype(auto) {
│ │ │ │ +
323 // auto indexRange = range(Hybrid::size(id(c)));
│ │ │ │ +
324 auto indexRange = typename decltype(range(Hybrid::size(id(c))))::integer_sequence();
│ │ │ │ +
325 return Hybrid::switchCases(indexRange, i, [&](auto static_i) -> decltype(auto){
│ │ │ │ +
326 // Do rescursion with static version of i
│ │ │ │ +
327 return Imp::resolveDynamicMultiIndex(id(c)[static_i], tail, isFinal);
│ │ │ │ +
328 }, [&]() -> decltype(auto){
│ │ │ │ +
329 // As fallback we use c[0] this is needed, because there must be one branch that matches.
│ │ │ │ +
330 return Imp::resolveDynamicMultiIndex(id(c)[Dune::Indices::_0], tail, isFinal);
│ │ │ │ +
331 });
│ │ │ │ +
332 });
│ │ │ │ +
333 });
│ │ │ │ +
334 }
│ │ │ │ +
335
│ │ │ │ +
336 template<class C, class MultiIndex>
│ │ │ │ +
337 constexpr decltype(auto) resolveStaticMultiIndex(C&& c, const MultiIndex& multiIndex)
│ │ │ │ +
338 {
│ │ │ │ +
339 auto isExhausted = Hybrid::equal_to(Hybrid::size(multiIndex), Dune::Indices::_0);
│ │ │ │ +
340 return Hybrid::ifElse(isExhausted, [&, c = forwardCapture(std::forward<C>(c))](auto) -> decltype(auto) {
│ │ │ │ +
341 return c.forward();
│ │ │ │ +
342 }, [&](auto id) -> decltype(auto) {
│ │ │ │ +
343 auto head = multiIndex[Dune::Indices::_0];
│ │ │ │ +
344 auto tail = multiIndex.pop();
│ │ │ │ +
345
│ │ │ │ +
346 return Imp::resolveStaticMultiIndex(id(c)[head], tail);
│ │ │ │ +
347 });
│ │ │ │ +
348 }
│ │ │ │ +
349
│ │ │ │ +
350} // namespace Imp
│ │ │ │ +
351
│ │ │ │ +
352
│ │ │ │ +
353
│ │ │ │ +
376template<class C, class MultiIndex, class IsFinal>
│ │ │ │ +
│ │ │ │ +
377constexpr decltype(auto) resolveDynamicMultiIndex(C&& c, const MultiIndex& multiIndex, const IsFinal& isFinal)
│ │ │ │ +
378{
│ │ │ │ +
379 return Imp::resolveDynamicMultiIndex(std::forward<C>(c), Imp::shiftedDynamicMultiIndex<0>(multiIndex), isFinal);
│ │ │ │ +
380}
│ │ │ │ +
│ │ │ │ +
381
│ │ │ │ +
398template<class C, class MultiIndex>
│ │ │ │ +
│ │ │ │ +
399constexpr decltype(auto) resolveDynamicMultiIndex(C&& c, const MultiIndex& multiIndex)
│ │ │ │ +
400{
│ │ │ │ +
401 auto hasNoIndexAccess = negatePredicate(callableCheck([](auto&& cc) -> std::void_t<decltype(cc[Dune::Indices::_0])> {}));
│ │ │ │ +
402 return Imp::resolveDynamicMultiIndex(std::forward<C>(c), Imp::shiftedDynamicMultiIndex<0>(multiIndex), hasNoIndexAccess);
│ │ │ │ +
403}
│ │ │ │ +
│ │ │ │ +
404
│ │ │ │ +
420template<class C, class MultiIndex>
│ │ │ │ +
│ │ │ │ +
421constexpr decltype(auto) resolveStaticMultiIndex(C&& c, const MultiIndex& multiIndex)
│ │ │ │ +
422{
│ │ │ │ +
423 return Imp::resolveStaticMultiIndex(std::forward<C>(c), Imp::shiftedStaticMultiIndex<0>(multiIndex));
│ │ │ │ +
424}
│ │ │ │ +
│ │ │ │ +
425
│ │ │ │ +
426
│ │ │ │ +
427
│ │ │ │ +
428} // namespace Dune::Functions
│ │ │ │ +
429} // namespace Dune
│ │ │ │ +
430
│ │ │ │ +
431
│ │ │ │ +
432
│ │ │ │ +
433#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:67
│ │ │ │ +
constexpr decltype(auto) resolveStaticMultiIndex(C &&c, const MultiIndex &multiIndex)
Provide multi-index access by chaining operator[].
Definition indexaccess.hh:421
│ │ │ │ +
auto callableCheck(Expression f)
Create a predicate for checking validity of expressions.
Definition utility.hh:283
│ │ │ │
constexpr decltype(auto) resolveDynamicMultiIndex(C &&c, const MultiIndex &multiIndex, const IsFinal &isFinal)
Provide multi-index access by chaining operator[].
Definition indexaccess.hh:377
│ │ │ │ +
Result hybridMultiIndexAccess(C &&c, const MultiIndex &index)
Provide multi-index access by chaining operator[].
Definition indexaccess.hh:286
│ │ │ │ +
auto negatePredicate(Check check)
Negate given predicate.
Definition utility.hh:308
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
constexpr auto fieldTypes()
Generate list of field types in container.
Definition istlvectorbackend.hh:67
│ │ │ │ -
constexpr bool hasUniqueFieldType()
Check if container has a unique field type.
Definition istlvectorbackend.hh:78
│ │ │ │ -
std::vector< Child > Vector
Descriptor for vectors with all children of the same type and dynamic size.
Definition containerdescriptors.hh:124
│ │ │ │ - │ │ │ │ +
auto forwardCapture(T &&t)
Create a capture object for perfect forwarding.
Definition utility.hh:376
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,372 +1,371 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _b_a_c_k_e_n_d_s │ │ │ │ │ -istlvectorbackend.hh │ │ │ │ │ + * _c_o_m_m_o_n │ │ │ │ │ +indexaccess.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_ISTLVECTORBACKEND_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_ISTLVECTORBACKEND_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_COMMON_INDEX_ACCESS_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_COMMON_INDEX_ACCESS_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ +10 │ │ │ │ │ 11#include │ │ │ │ │ 12#include │ │ │ │ │ 13 │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ 16#include │ │ │ │ │ -17#include │ │ │ │ │ -18 │ │ │ │ │ -19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_i_n_d_e_x_a_c_c_e_s_s_._h_h> │ │ │ │ │ -20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +17 │ │ │ │ │ +18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_u_t_i_l_i_t_y_._h_h> │ │ │ │ │ +19 │ │ │ │ │ +20 │ │ │ │ │ 21 │ │ │ │ │ -22 │ │ │ │ │ -23namespace _D_u_n_e { │ │ │ │ │ -24namespace Functions { │ │ │ │ │ +22namespace _D_u_n_e { │ │ │ │ │ +23namespace Functions { │ │ │ │ │ +24 │ │ │ │ │ 25 │ │ │ │ │ -26namespace Impl { │ │ │ │ │ +26namespace Imp { │ │ │ │ │ 27 │ │ │ │ │ -28template() , │ │ │ │ │ -int> = 0> │ │ │ │ │ -30auto _f_i_e_l_d_T_y_p_e_s(V&& /*v*/) │ │ │ │ │ -31{ │ │ │ │ │ -32 return TypeList{}; │ │ │ │ │ -33} │ │ │ │ │ -34 │ │ │ │ │ -35template(), int> │ │ │ │ │ -= 0> │ │ │ │ │ -37auto _f_i_e_l_d_T_y_p_e_s(V&& v) │ │ │ │ │ -38{ │ │ │ │ │ -39 if constexpr (Dune::models, │ │ │ │ │ -V>()) │ │ │ │ │ -40 return _f_i_e_l_d_T_y_p_e_s(v[std::size_t{0}]); │ │ │ │ │ -41 else │ │ │ │ │ -42 { │ │ │ │ │ -43 auto indexRange = typename decltype(range(Hybrid::size(v))):: │ │ │ │ │ -integer_sequence(); │ │ │ │ │ -44 return unpackIntegerSequence([&](auto... i) { │ │ │ │ │ -45 return uniqueTypeList(std::tuple_cat(_f_i_e_l_d_T_y_p_e_s(v[i])...)); │ │ │ │ │ -46 }, indexRange); │ │ │ │ │ -47 } │ │ │ │ │ -48} │ │ │ │ │ -49 │ │ │ │ │ -50} // namespace Impl │ │ │ │ │ +28namespace Concept { │ │ │ │ │ +29 │ │ │ │ │ +30template │ │ │ │ │ +31struct HasDynamicIndexAccess │ │ │ │ │ +32{ │ │ │ │ │ +33 template │ │ │ │ │ +34 auto require(C&& c) -> decltype( │ │ │ │ │ +35 c[std::declval()] │ │ │ │ │ +36 ); │ │ │ │ │ +37}; │ │ │ │ │ +38 │ │ │ │ │ +39struct HasStaticIndexAccess │ │ │ │ │ +40{ │ │ │ │ │ +41 template │ │ │ │ │ +42 auto require(C&& c) -> decltype( │ │ │ │ │ +43 c[Dune::Indices::_0] │ │ │ │ │ +44 ); │ │ │ │ │ +45}; │ │ │ │ │ +46 │ │ │ │ │ +47} // namespace Concept │ │ │ │ │ +48 │ │ │ │ │ +49} // namespace Imp │ │ │ │ │ +50 │ │ │ │ │ 51 │ │ │ │ │ 52 │ │ │ │ │ -53 │ │ │ │ │ -66template │ │ │ │ │ -_6_7constexpr auto _f_i_e_l_d_T_y_p_e_s() │ │ │ │ │ -68{ │ │ │ │ │ -69 return decltype(Impl::fieldTypes(std::declval())){}; │ │ │ │ │ -70} │ │ │ │ │ -71 │ │ │ │ │ -77template │ │ │ │ │ -_7_8constexpr bool _h_a_s_U_n_i_q_u_e_F_i_e_l_d_T_y_p_e() │ │ │ │ │ -79{ │ │ │ │ │ -80 return std::tuple_size_v())>> ==1; │ │ │ │ │ -81} │ │ │ │ │ -82 │ │ │ │ │ -83 │ │ │ │ │ -84 │ │ │ │ │ -85namespace Impl { │ │ │ │ │ -86 │ │ │ │ │ -87/* │ │ │ │ │ -88 * \brief A wrapper providing multi-index access to vector entries │ │ │ │ │ -89 * │ │ │ │ │ -90 * The wrapped vector type should be an istl like random │ │ │ │ │ -91 * access container providing operator[] and size() methods. │ │ │ │ │ -92 * For classical containers this should support indices │ │ │ │ │ -93 * of type std::size_t. For multi-type containers indices │ │ │ │ │ -94 * of the form Dune::index_constant should be supported │ │ │ │ │ -95 * while size() should be a static constexpr method. │ │ │ │ │ -96 * │ │ │ │ │ -97 * When resolving multi-indices the backend appends indices │ │ │ │ │ -98 * using operator[] as long as the result is not a scalar. │ │ │ │ │ -99 * If this exhausts the digits of the multi-index, additional │ │ │ │ │ -100 * zero`s are appended. │ │ │ │ │ -101 * │ │ │ │ │ -102 * \tparam V Type of the raw wrapper vector │ │ │ │ │ -103 */ │ │ │ │ │ -104template │ │ │ │ │ -105class ISTLVectorBackend │ │ │ │ │ -106{ │ │ │ │ │ -107 │ │ │ │ │ -108 // Template aliases for using detection idiom. │ │ │ │ │ -109 template │ │ │ │ │ -110 using dynamicIndexAccess_t = decltype(std::declval()[0]); │ │ │ │ │ -111 │ │ │ │ │ -112 template │ │ │ │ │ -113 using staticIndexAccess_t = decltype(std::declval()[Dune::Indices::_0]); │ │ │ │ │ -114 │ │ │ │ │ -115 template │ │ │ │ │ -116 using resizeMethod_t = decltype(std::declval().resize(0)); │ │ │ │ │ -117 │ │ │ │ │ -118 │ │ │ │ │ -119 │ │ │ │ │ -120 // Short cuts for feature detection │ │ │ │ │ -121 template │ │ │ │ │ -122 using hasDynamicIndexAccess = Dune::Std::is_detected>; │ │ │ │ │ -123 │ │ │ │ │ -124 template │ │ │ │ │ -125 using hasStaticIndexAccess = Dune::Std::is_detected>; │ │ │ │ │ +65template, C>(), │ │ │ │ │ +int> = 0> │ │ │ │ │ +_6_7auto _h_y_b_r_i_d_I_n_d_e_x_A_c_c_e_s_s(C&& c, const I& i, F&& f) │ │ │ │ │ +68 -> decltype(f(c[i])) │ │ │ │ │ +69{ │ │ │ │ │ +70 return f(c[i]); │ │ │ │ │ +71} │ │ │ │ │ +72 │ │ │ │ │ +90template, │ │ │ │ │ +C>(), int> = 0> │ │ │ │ │ +_9_2decltype(auto) _h_y_b_r_i_d_I_n_d_e_x_A_c_c_e_s_s(C&& c, const I& i, F&& f) │ │ │ │ │ +93{ │ │ │ │ │ +94 using Size = decltype(Hybrid::size(c)); │ │ │ │ │ +95 return Hybrid::switchCases(std::make_index_sequence(), i, │ │ │ │ │ +96 [&](const auto& ii) -> decltype(auto){ │ │ │ │ │ +97 return f(c[ii]); │ │ │ │ │ +98 }, [&]() -> decltype(auto){ │ │ │ │ │ +99 return f(c[Dune::Indices::_0]); │ │ │ │ │ +100 }); │ │ │ │ │ +101} │ │ │ │ │ +102 │ │ │ │ │ +103 │ │ │ │ │ +104namespace Imp { │ │ │ │ │ +105 │ │ │ │ │ +119 template │ │ │ │ │ +120 class ShiftedDynamicMultiIndex │ │ │ │ │ +121 { │ │ │ │ │ +122 public: │ │ │ │ │ +123 ShiftedDynamicMultiIndex(const Index& index) : │ │ │ │ │ +124 index_(index) │ │ │ │ │ +125 {} │ │ │ │ │ 126 │ │ │ │ │ -127 template │ │ │ │ │ -128 using hasResizeMethod = Dune::Std::is_detected>; │ │ │ │ │ -129 │ │ │ │ │ -130 template │ │ │ │ │ -131 using isDynamicVector = Dune::Std::is_detected>; │ │ │ │ │ -132 │ │ │ │ │ -133 template │ │ │ │ │ -134 using isStaticVector = Dune::Std::bool_constant< │ │ │ │ │ -135 Dune::Std::is_detected_v> │ │ │ │ │ -136 and not Dune::Std::is_detected_v>>; │ │ │ │ │ -137 │ │ │ │ │ -138 template │ │ │ │ │ -139 using isScalar = Dune::Std::bool_constant>>; │ │ │ │ │ -140 │ │ │ │ │ -141 template │ │ │ │ │ -142 using isVector = Dune::Std::bool_constant>>; │ │ │ │ │ -143 │ │ │ │ │ -144 │ │ │ │ │ -145 │ │ │ │ │ -146 template │ │ │ │ │ -147 static void forwardToResize(Args&&... args) │ │ │ │ │ -148 { │ │ │ │ │ -149 resize(std::forward(args)...); │ │ │ │ │ -150 } │ │ │ │ │ -151 │ │ │ │ │ -152 │ │ │ │ │ -153 template::value, int> = 0> │ │ │ │ │ -155 static void resize(C&& c, const SizeProvider& sizeProvider, typename │ │ │ │ │ -SizeProvider::SizePrefix prefix) │ │ │ │ │ -156 { │ │ │ │ │ -157 auto size = sizeProvider.size(prefix); │ │ │ │ │ -158 if (size==0) │ │ │ │ │ -159 { │ │ │ │ │ -160 // If size==0 this prefix refers to a single coefficient c. │ │ │ │ │ -161 // But being in this overload means that c is not a scalar │ │ │ │ │ -162 // because is has a resize() method. Since operator[] deliberately │ │ │ │ │ -163 // supports implicit padding of multi-indices by as many │ │ │ │ │ -164 // [0]'s as needed to resolve a scalar entry, we should also │ │ │ │ │ -165 // except a non-scalar c here. However, this requires that │ │ │ │ │ -166 // we silently believe that whatever size c already has is │ │ │ │ │ -167 // intended by the user. The only exception is c.size()==0 │ │ │ │ │ -168 // which is not acceptable but we also cannot know the desired size. │ │ │ │ │ -169 if (c.size()==0) │ │ │ │ │ -170 DUNE_THROW(RangeError, "The vector entry v[" << prefix << "] should refer │ │ │ │ │ -to a " │ │ │ │ │ -171 << "scalar coefficient, but is a dynamically sized vector of size==0"); │ │ │ │ │ -172 else │ │ │ │ │ -173 // Accept non-zero sized coefficients to avoid that resize(basis) │ │ │ │ │ -174 // fails for a vector that works with operator[] and already │ │ │ │ │ -175 // has the appropriate size. │ │ │ │ │ -176 return; │ │ │ │ │ -177 } │ │ │ │ │ -178 c.resize(size); │ │ │ │ │ -179 prefix.push_back(0); │ │ │ │ │ -180 for(std::size_t i=0; i pop() const │ │ │ │ │ +139 { │ │ │ │ │ +140 return {index_}; │ │ │ │ │ +141 } │ │ │ │ │ +142 │ │ │ │ │ +143 std::size_t size() const │ │ │ │ │ +144 { │ │ │ │ │ +145 if (offset < index_.size()) │ │ │ │ │ +146 return index_.size() - offset; │ │ │ │ │ +147 else │ │ │ │ │ +148 return 0; │ │ │ │ │ +149 } │ │ │ │ │ +150 │ │ │ │ │ +151 const Index& originalIndex() const │ │ │ │ │ +152 { │ │ │ │ │ +153 return index_; │ │ │ │ │ +154 } │ │ │ │ │ +155 │ │ │ │ │ +156 private: │ │ │ │ │ +157 const Index& index_; │ │ │ │ │ +158 }; │ │ │ │ │ +159 │ │ │ │ │ +160 template │ │ │ │ │ +161 class ShiftedStaticMultiIndex │ │ │ │ │ +162 { │ │ │ │ │ +163 public: │ │ │ │ │ +164 ShiftedStaticMultiIndex(const Index& index) : │ │ │ │ │ +165 index_(index) │ │ │ │ │ +166 {} │ │ │ │ │ +167 │ │ │ │ │ +168 template │ │ │ │ │ +169 auto operator[](Dune::index_constant) const │ │ │ │ │ +170 { │ │ │ │ │ +171 if constexpr (i{}]; │ │ │ │ │ +173 } else { │ │ │ │ │ +174 return Dune::index_constant<0>{}; │ │ │ │ │ +175 } │ │ │ │ │ +176 } │ │ │ │ │ +177 │ │ │ │ │ +181 ShiftedStaticMultiIndex pop() const │ │ │ │ │ +182 { │ │ │ │ │ +183 return {index_}; │ │ │ │ │ 184 } │ │ │ │ │ -185 } │ │ │ │ │ -186 │ │ │ │ │ -187 template::value, int> = 0, │ │ │ │ │ -189 std::enable_if_t::value, int> = 0> │ │ │ │ │ -190 static void resize(C&& c, const SizeProvider& sizeProvider, typename │ │ │ │ │ -SizeProvider::SizePrefix prefix) │ │ │ │ │ -191 { │ │ │ │ │ -192 auto size = sizeProvider.size(prefix); │ │ │ │ │ -193 // If size == 0 there's nothing to do: │ │ │ │ │ -194 // We can't resize c and it's already │ │ │ │ │ -195 // large enough anyway. │ │ │ │ │ -196 if (size == 0) │ │ │ │ │ -197 return; │ │ │ │ │ +185 │ │ │ │ │ +186 static constexpr std::size_t size() │ │ │ │ │ +187 { │ │ │ │ │ +188 auto fullSize = decltype(Hybrid::size(std::declval()))::value; │ │ │ │ │ +189 if (offset < fullSize) │ │ │ │ │ +190 return fullSize - offset; │ │ │ │ │ +191 else │ │ │ │ │ +192 return 0; │ │ │ │ │ +193 } │ │ │ │ │ +194 │ │ │ │ │ +195 private: │ │ │ │ │ +196 const Index& index_; │ │ │ │ │ +197 }; │ │ │ │ │ 198 │ │ │ │ │ -199 // If size>0 but c does not have the appropriate │ │ │ │ │ -200 // size we throw an exception. │ │ │ │ │ -201 // │ │ │ │ │ -202 // We could perhaps also allow c.size()>size. │ │ │ │ │ -203 // But then looping the loop below gets complicated: │ │ │ │ │ -204 // We're not allowed to loop until c.size(). But │ │ │ │ │ -205 // we also cannot use size for termination, │ │ │ │ │ -206 // because this fails if c is a static vector. │ │ │ │ │ -207 if (c.size() != size) │ │ │ │ │ -208 DUNE_THROW(RangeError, "Can't resize non-resizable entry v[" << prefix << │ │ │ │ │ -"] of size " << c.size() << " to size(" << prefix << ")=" << size); │ │ │ │ │ +204 template │ │ │ │ │ +205 ShiftedDynamicMultiIndex shiftedDynamicMultiIndex(const │ │ │ │ │ +Index& index) │ │ │ │ │ +206 { │ │ │ │ │ +207 return {index}; │ │ │ │ │ +208 } │ │ │ │ │ 209 │ │ │ │ │ -210 // Recursively resize all entries of c now. │ │ │ │ │ -211 using namespace Dune::Hybrid; │ │ │ │ │ -212 prefix.push_back(0); │ │ │ │ │ -213 forEach(integralRange(Hybrid::size(c)), [&](auto&& i) { │ │ │ │ │ -214 prefix.back() = i; │ │ │ │ │ -215 // Here we'd simply like to call resize(c[i], sizeProvider, prefix); │ │ │ │ │ -216 // but even gcc-7 does not except this bus reports │ │ │ │ │ -217 // "error: ‘this’ was not captured for this lambda function" │ │ │ │ │ -218 // although there's no 'this' because we're in a static method. │ │ │ │ │ -219 // Bypassing this by and additional method that does perfect │ │ │ │ │ -220 // forwarding allows to workaround this. │ │ │ │ │ -221 ISTLVectorBackend::forwardToResize(c[i], sizeProvider, prefix); │ │ │ │ │ -222 }); │ │ │ │ │ -223 } │ │ │ │ │ -224 │ │ │ │ │ -225 template::value, int> = 0, │ │ │ │ │ -227 std::enable_if_t::value, int> = 0> │ │ │ │ │ -228 static void resize(C&&, const SizeProvider& sizeProvider, typename │ │ │ │ │ -SizeProvider::SizePrefix prefix) │ │ │ │ │ -229 { │ │ │ │ │ -230 auto size = sizeProvider.size(prefix); │ │ │ │ │ -231 if (size != 0) │ │ │ │ │ -232 DUNE_THROW(RangeError, "Can't resize scalar vector entry v[" << prefix << │ │ │ │ │ -"] to size(" << prefix << ")=" << size); │ │ │ │ │ -233 } │ │ │ │ │ +218 template │ │ │ │ │ +219 ShiftedDynamicMultiIndex shiftedDynamicMultiIndex │ │ │ │ │ +(const ShiftedDynamicMultiIndex& index) │ │ │ │ │ +220 { │ │ │ │ │ +221 return {index.originalIndex()}; │ │ │ │ │ +222 } │ │ │ │ │ +223 │ │ │ │ │ +224 template │ │ │ │ │ +225 ShiftedStaticMultiIndex shiftedStaticMultiIndex(const Index& │ │ │ │ │ +index) │ │ │ │ │ +226 { │ │ │ │ │ +227 return {index}; │ │ │ │ │ +228 } │ │ │ │ │ +229 │ │ │ │ │ +230} // namespace Imp │ │ │ │ │ +231 │ │ │ │ │ +232 │ │ │ │ │ +233 │ │ │ │ │ 234 │ │ │ │ │ -235 template, int> = 0> │ │ │ │ │ -237 void recursiveAssign(C& c, const T& t) │ │ │ │ │ -238 { │ │ │ │ │ -239 c = t; │ │ │ │ │ -240 } │ │ │ │ │ -241 │ │ │ │ │ -242 template, int> = 0> │ │ │ │ │ -244 void recursiveAssign(C& c, const T& t) │ │ │ │ │ -245 { │ │ │ │ │ -246 Dune::Hybrid::forEach(c, [&](auto&& ci) { │ │ │ │ │ -247 recursiveAssign(ci, t); │ │ │ │ │ -248 }); │ │ │ │ │ -249 } │ │ │ │ │ -250 │ │ │ │ │ -251public: │ │ │ │ │ +235namespace Imp { │ │ │ │ │ +236 │ │ │ │ │ +237template │ │ │ │ │ +238struct MultiIndexResolver │ │ │ │ │ +239{ │ │ │ │ │ +240 MultiIndexResolver(const Index& index) : │ │ │ │ │ +241 index_(index) │ │ │ │ │ +242 {} │ │ │ │ │ +243 │ │ │ │ │ +244 template, int> = 0> │ │ │ │ │ +246 Result operator()(C&& c) │ │ │ │ │ +247 { │ │ │ │ │ +248 auto&& subIndex = Imp::shiftedDynamicMultiIndex<1>(index_); │ │ │ │ │ +249 auto&& subIndexResolver = MultiIndexResolver │ │ │ │ │ +(subIndex); │ │ │ │ │ +250 return (Result)(_h_y_b_r_i_d_I_n_d_e_x_A_c_c_e_s_s(c, index_[Dune::Indices::_0], │ │ │ │ │ +subIndexResolver)); │ │ │ │ │ +251 } │ │ │ │ │ 252 │ │ │ │ │ -253 using _V_e_c_t_o_r = V; │ │ │ │ │ -254 │ │ │ │ │ -255 ISTLVectorBackend(Vector& vector) : │ │ │ │ │ -256 vector_(&vector) │ │ │ │ │ -257 {} │ │ │ │ │ -258 │ │ │ │ │ -259 template │ │ │ │ │ -260 void resize(const SizeProvider& sizeProvider) │ │ │ │ │ -261 { │ │ │ │ │ -262 auto prefix = typename SizeProvider::SizePrefix(); │ │ │ │ │ -263 prefix.resize(0); │ │ │ │ │ -264 resize(*vector_, sizeProvider, prefix); │ │ │ │ │ -265 } │ │ │ │ │ +253 template, int> = 0> │ │ │ │ │ +255 Result operator()(C&& c) │ │ │ │ │ +256 { │ │ │ │ │ +257 return (Result)(std::forward(c)); │ │ │ │ │ +258 } │ │ │ │ │ +259 │ │ │ │ │ +260 const Index& index_; │ │ │ │ │ +261}; │ │ │ │ │ +262 │ │ │ │ │ +263} // namespace Imp │ │ │ │ │ +264 │ │ │ │ │ +265 │ │ │ │ │ 266 │ │ │ │ │ -267 template │ │ │ │ │ -268 decltype(auto) operator[](const MultiIndex& index) const │ │ │ │ │ -269 { │ │ │ │ │ -270 return _r_e_s_o_l_v_e_D_y_n_a_m_i_c_M_u_l_t_i_I_n_d_e_x(*vector_, index); │ │ │ │ │ -271 } │ │ │ │ │ -272 │ │ │ │ │ -273 template │ │ │ │ │ -274 decltype(auto) operator[](const MultiIndex& index) │ │ │ │ │ -275 { │ │ │ │ │ -276 return _r_e_s_o_l_v_e_D_y_n_a_m_i_c_M_u_l_t_i_I_n_d_e_x(*vector_, index); │ │ │ │ │ -277 } │ │ │ │ │ -278 │ │ │ │ │ -287 template │ │ │ │ │ -288 void operator= (const T& other) │ │ │ │ │ -289 { │ │ │ │ │ -290 recursiveAssign(vector(), other); │ │ │ │ │ -291 } │ │ │ │ │ +285template │ │ │ │ │ +_2_8_6Result _h_y_b_r_i_d_M_u_l_t_i_I_n_d_e_x_A_c_c_e_s_s(C&& c, const MultiIndex& index) │ │ │ │ │ +287{ │ │ │ │ │ +288 │ │ │ │ │ +289 Imp::MultiIndexResolver multiIndexResolver(index); │ │ │ │ │ +290 return multiIndexResolver(c); │ │ │ │ │ +291} │ │ │ │ │ 292 │ │ │ │ │ -293 template │ │ │ │ │ -294 void operator= (const ISTLVectorBackend& other) │ │ │ │ │ -295 { │ │ │ │ │ -296 vector() = other.vector(); │ │ │ │ │ -297 } │ │ │ │ │ -298 │ │ │ │ │ -299 const _V_e_c_t_o_r& vector() const │ │ │ │ │ -300 { │ │ │ │ │ -301 return *vector_; │ │ │ │ │ -302 } │ │ │ │ │ -303 │ │ │ │ │ -304 _V_e_c_t_o_r& vector() │ │ │ │ │ -305 { │ │ │ │ │ -306 return *vector_; │ │ │ │ │ -307 } │ │ │ │ │ -308 │ │ │ │ │ -309private: │ │ │ │ │ +293 │ │ │ │ │ +294 │ │ │ │ │ +295 │ │ │ │ │ +296 │ │ │ │ │ +297 │ │ │ │ │ +298namespace Imp { │ │ │ │ │ +299 │ │ │ │ │ +300 template │ │ │ │ │ +301 constexpr decltype(auto) resolveDynamicMultiIndex(C&& c, const MultiIndex& │ │ │ │ │ +multiIndex, const IsFinal& isFinal) │ │ │ │ │ +302 { │ │ │ │ │ +303 // If c is already considered final simply return it, │ │ │ │ │ +304 // else resolve the next multiIndex entry. │ │ │ │ │ +305 return Hybrid::ifElse(isFinal(c), [&, c = _f_o_r_w_a_r_d_C_a_p_t_u_r_e(std::forward │ │ │ │ │ +(c))](auto) -> decltype(auto) { │ │ │ │ │ +306 assert(multiIndex.size() == 0); │ │ │ │ │ +307 return c.forward(); │ │ │ │ │ +308 }, [&](auto) -> decltype(auto) { │ │ │ │ │ +309 auto hasDynamicAccess = _c_a_l_l_a_b_l_e_C_h_e_c_k([](auto&& cc) -> std::void_t {}); │ │ │ │ │ 310 │ │ │ │ │ -311 _V_e_c_t_o_r* vector_; │ │ │ │ │ -312}; │ │ │ │ │ -313 │ │ │ │ │ -314} // end namespace Impl │ │ │ │ │ -315 │ │ │ │ │ -316 │ │ │ │ │ -317 │ │ │ │ │ -349template │ │ │ │ │ -_3_5_0auto _i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d(Vector& v) │ │ │ │ │ -351{ │ │ │ │ │ -352 static_assert(hasUniqueFieldType(), "Vector type passed to │ │ │ │ │ -istlVectorBackend() does not have a unique field type."); │ │ │ │ │ -353 return Impl::ISTLVectorBackend(v); │ │ │ │ │ -354} │ │ │ │ │ -355 │ │ │ │ │ -356 │ │ │ │ │ -357 │ │ │ │ │ -387template │ │ │ │ │ -_3_8_8auto _i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d(const Vector& v) │ │ │ │ │ -389{ │ │ │ │ │ -390 static_assert(hasUniqueFieldType(), "Vector type passed to │ │ │ │ │ -istlVectorBackend() does not have a unique field type."); │ │ │ │ │ -391 return Impl::ISTLVectorBackend(v); │ │ │ │ │ -392} │ │ │ │ │ -393 │ │ │ │ │ -394 │ │ │ │ │ -395 │ │ │ │ │ -396} // namespace Functions │ │ │ │ │ -397} // namespace Dune │ │ │ │ │ -398 │ │ │ │ │ -399 │ │ │ │ │ -400#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_ISTLVECTORBACKEND_HH │ │ │ │ │ -_i_n_d_e_x_a_c_c_e_s_s_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d │ │ │ │ │ -auto istlVectorBackend(Vector &v) │ │ │ │ │ -Return a vector backend wrapping non-const ISTL like containers. │ │ │ │ │ -DDeeffiinniittiioonn istlvectorbackend.hh:350 │ │ │ │ │ +311 // Split multiIndex into first entry and remaining ones. │ │ │ │ │ +312 auto i = multiIndex[0]; │ │ │ │ │ +313 auto tail = multiIndex.pop(); │ │ │ │ │ +314 │ │ │ │ │ +315 // Resolve first multiIndex entry by c[multiIndex[0]] and │ │ │ │ │ +316 // continue resolving with the remaining remaining ones. │ │ │ │ │ +317 // If c has a dynamic operator[] this is straight forward. │ │ │ │ │ +318 // Else the dynamic multiIndex[0] has to be translated into │ │ │ │ │ +319 // a static one using hybridIndexAccess. │ │ │ │ │ +320 return Hybrid::ifElse(hasDynamicAccess(c), [&](auto id) -> decltype(auto) { │ │ │ │ │ +321 return Imp::resolveDynamicMultiIndex(id(c)[i], tail, isFinal); │ │ │ │ │ +322 }, [&](auto id) -> decltype(auto) { │ │ │ │ │ +323 // auto indexRange = range(Hybrid::size(id(c))); │ │ │ │ │ +324 auto indexRange = typename decltype(range(Hybrid::size(id(c)))):: │ │ │ │ │ +integer_sequence(); │ │ │ │ │ +325 return Hybrid::switchCases(indexRange, i, [&](auto static_i) -> decltype │ │ │ │ │ +(auto){ │ │ │ │ │ +326 // Do rescursion with static version of i │ │ │ │ │ +327 return Imp::resolveDynamicMultiIndex(id(c)[static_i], tail, isFinal); │ │ │ │ │ +328 }, [&]() -> decltype(auto){ │ │ │ │ │ +329 // As fallback we use c[0] this is needed, because there must be one branch │ │ │ │ │ +that matches. │ │ │ │ │ +330 return Imp::resolveDynamicMultiIndex(id(c)[Dune::Indices::_0], tail, │ │ │ │ │ +isFinal); │ │ │ │ │ +331 }); │ │ │ │ │ +332 }); │ │ │ │ │ +333 }); │ │ │ │ │ +334 } │ │ │ │ │ +335 │ │ │ │ │ +336 template │ │ │ │ │ +337 constexpr decltype(auto) resolveStaticMultiIndex(C&& c, const MultiIndex& │ │ │ │ │ +multiIndex) │ │ │ │ │ +338 { │ │ │ │ │ +339 auto isExhausted = Hybrid::equal_to(Hybrid::size(multiIndex), Dune:: │ │ │ │ │ +Indices::_0); │ │ │ │ │ +340 return Hybrid::ifElse(isExhausted, [&, c = _f_o_r_w_a_r_d_C_a_p_t_u_r_e(std::forward │ │ │ │ │ +(c))](auto) -> decltype(auto) { │ │ │ │ │ +341 return c.forward(); │ │ │ │ │ +342 }, [&](auto id) -> decltype(auto) { │ │ │ │ │ +343 auto head = multiIndex[Dune::Indices::_0]; │ │ │ │ │ +344 auto tail = multiIndex.pop(); │ │ │ │ │ +345 │ │ │ │ │ +346 return Imp::resolveStaticMultiIndex(id(c)[head], tail); │ │ │ │ │ +347 }); │ │ │ │ │ +348 } │ │ │ │ │ +349 │ │ │ │ │ +350} // namespace Imp │ │ │ │ │ +351 │ │ │ │ │ +352 │ │ │ │ │ +353 │ │ │ │ │ +376template │ │ │ │ │ +_3_7_7constexpr decltype(auto) _r_e_s_o_l_v_e_D_y_n_a_m_i_c_M_u_l_t_i_I_n_d_e_x(C&& c, const MultiIndex& │ │ │ │ │ +multiIndex, const IsFinal& isFinal) │ │ │ │ │ +378{ │ │ │ │ │ +379 return Imp::resolveDynamicMultiIndex(std::forward(c), Imp:: │ │ │ │ │ +shiftedDynamicMultiIndex<0>(multiIndex), isFinal); │ │ │ │ │ +380} │ │ │ │ │ +381 │ │ │ │ │ +398template │ │ │ │ │ +_3_9_9constexpr decltype(auto) _r_e_s_o_l_v_e_D_y_n_a_m_i_c_M_u_l_t_i_I_n_d_e_x(C&& c, const MultiIndex& │ │ │ │ │ +multiIndex) │ │ │ │ │ +400{ │ │ │ │ │ +401 auto hasNoIndexAccess = _n_e_g_a_t_e_P_r_e_d_i_c_a_t_e(_c_a_l_l_a_b_l_e_C_h_e_c_k([](auto&& cc) - │ │ │ │ │ +> std::void_t {})); │ │ │ │ │ +402 return Imp::resolveDynamicMultiIndex(std::forward(c), Imp:: │ │ │ │ │ +shiftedDynamicMultiIndex<0>(multiIndex), hasNoIndexAccess); │ │ │ │ │ +403} │ │ │ │ │ +404 │ │ │ │ │ +420template │ │ │ │ │ +_4_2_1constexpr decltype(auto) _r_e_s_o_l_v_e_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x(C&& c, const MultiIndex& │ │ │ │ │ +multiIndex) │ │ │ │ │ +422{ │ │ │ │ │ +423 return Imp::resolveStaticMultiIndex(std::forward(c), Imp:: │ │ │ │ │ +shiftedStaticMultiIndex<0>(multiIndex)); │ │ │ │ │ +424} │ │ │ │ │ +425 │ │ │ │ │ +426 │ │ │ │ │ +427 │ │ │ │ │ +428} // namespace Dune::Functions │ │ │ │ │ +429} // namespace Dune │ │ │ │ │ +430 │ │ │ │ │ +431 │ │ │ │ │ +432 │ │ │ │ │ +433#endif // DUNE_FUNCTIONS_COMMON_INDEX_ACCESS_HH │ │ │ │ │ +_u_t_i_l_i_t_y_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_h_y_b_r_i_d_I_n_d_e_x_A_c_c_e_s_s │ │ │ │ │ +auto hybridIndexAccess(C &&c, const I &i, F &&f) -> decltype(f(c[i])) │ │ │ │ │ +Provide operator[] index-access for containers. │ │ │ │ │ +DDeeffiinniittiioonn indexaccess.hh:67 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_r_e_s_o_l_v_e_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x │ │ │ │ │ +constexpr decltype(auto) resolveStaticMultiIndex(C &&c, const MultiIndex │ │ │ │ │ +&multiIndex) │ │ │ │ │ +Provide multi-index access by chaining operator[]. │ │ │ │ │ +DDeeffiinniittiioonn indexaccess.hh:421 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_a_l_l_a_b_l_e_C_h_e_c_k │ │ │ │ │ +auto callableCheck(Expression f) │ │ │ │ │ +Create a predicate for checking validity of expressions. │ │ │ │ │ +DDeeffiinniittiioonn utility.hh:283 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_r_e_s_o_l_v_e_D_y_n_a_m_i_c_M_u_l_t_i_I_n_d_e_x │ │ │ │ │ constexpr decltype(auto) resolveDynamicMultiIndex(C &&c, const MultiIndex │ │ │ │ │ &multiIndex, const IsFinal &isFinal) │ │ │ │ │ Provide multi-index access by chaining operator[]. │ │ │ │ │ DDeeffiinniittiioonn indexaccess.hh:377 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_h_y_b_r_i_d_M_u_l_t_i_I_n_d_e_x_A_c_c_e_s_s │ │ │ │ │ +Result hybridMultiIndexAccess(C &&c, const MultiIndex &index) │ │ │ │ │ +Provide multi-index access by chaining operator[]. │ │ │ │ │ +DDeeffiinniittiioonn indexaccess.hh:286 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_n_e_g_a_t_e_P_r_e_d_i_c_a_t_e │ │ │ │ │ +auto negatePredicate(Check check) │ │ │ │ │ +Negate given predicate. │ │ │ │ │ +DDeeffiinniittiioonn utility.hh:308 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_i_e_l_d_T_y_p_e_s │ │ │ │ │ -constexpr auto fieldTypes() │ │ │ │ │ -Generate list of field types in container. │ │ │ │ │ -DDeeffiinniittiioonn istlvectorbackend.hh:67 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_h_a_s_U_n_i_q_u_e_F_i_e_l_d_T_y_p_e │ │ │ │ │ -constexpr bool hasUniqueFieldType() │ │ │ │ │ -Check if container has a unique field type. │ │ │ │ │ -DDeeffiinniittiioonn istlvectorbackend.hh:78 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_V_e_c_t_o_r │ │ │ │ │ -std::vector< Child > Vector │ │ │ │ │ -Descriptor for vectors with all children of the same type and dynamic size. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:124 │ │ │ │ │ -_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_o_r_w_a_r_d_C_a_p_t_u_r_e │ │ │ │ │ +auto forwardCapture(T &&t) │ │ │ │ │ +Create a capture object for perfect forwarding. │ │ │ │ │ +DDeeffiinniittiioonn utility.hh:376 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00014.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: analyticgridviewfunction.hh File Reference │ │ │ │ +dune-functions: localfunction.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,60 +65,48 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
analyticgridviewfunction.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
localfunction.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │
#include <type_traits>
│ │ │ │ -#include <optional>
│ │ │ │ -#include <dune/common/copyableoptional.hh>
│ │ │ │ #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/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::AnalyticGridViewFunction< Range(Domain), GV, F, DerivativeTraits >
 Class wrapping any differentiable function as grid function. 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
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<class F , class GridView , class Domain = typename GridView::template Codim<0>::Geometry::GlobalCoordinate, class Range = std::invoke_result_t<F,Domain>>
 Dune::Functions::AnalyticGridViewFunction (const F &, const GridView &) -> AnalyticGridViewFunction< Range(Domain), GridView, F >
 
template<class F , class GridView >
auto Dune::Functions::makeAnalyticGridViewFunction (F &&f, const GridView &gridView)
 Create an AnalyticGridViewFunction from a function and a grid view.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,44 +1,32 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -analyticgridviewfunction.hh File Reference │ │ │ │ │ + * _c_o_m_m_o_n │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +localfunction.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ #include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_s_i_g_n_a_t_u_r_e_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n___i_m_p_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_l_o_c_a_l_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_l_o_c_a_l_f_u_n_c_t_i_o_n___i_m_p_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e_e_r_a_s_u_r_e_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ - _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _> │ │ │ │ │ -  Class wrapping any differentiable function as grid function. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _S_i_g_n_a_t_u_r_e_,_ _L_o_c_a_l_C_o_n_t_e_x_t_, │ │ │ │ │ + _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _b_u_f_f_e_r_S_i_z_e_ _> │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _L_o_c_a_l_C_o_n_t_e_x_t_, │ │ │ │ │ + _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _b_u_f_f_e_r_S_i_z_e_ _> │ │ │ │ │ +  Class storing local functions using type erasure. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template::Geometry::GlobalCoordinate, class Range = std:: │ │ │ │ │ -invoke_result_t> │ │ │ │ │ -   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n (const F &, const GridView &) - │ │ │ │ │ - > _A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n< Range(Domain), GridView, F > │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n (F &&f, const GridView │ │ │ │ │ - &gridView) │ │ │ │ │ -  Create an _A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n from a function and a grid view. │ │ │ │ │ -  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00014_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: analyticgridviewfunction.hh Source File │ │ │ │ +dune-functions: localfunction.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,261 +70,178 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
analyticgridviewfunction.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_COMMON_LOCAL_FUNCTION_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_COMMON_LOCAL_FUNCTION_HH
│ │ │ │
9
│ │ │ │
10#include <type_traits>
│ │ │ │ -
11#include <optional>
│ │ │ │ -
12
│ │ │ │ -
13#include <dune/common/copyableoptional.hh>
│ │ │ │ -
14#include <dune/common/typeutilities.hh>
│ │ │ │ -
15
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
22
│ │ │ │ -
23
│ │ │ │ -
24namespace Dune {
│ │ │ │ -
25namespace Functions {
│ │ │ │ +
11
│ │ │ │ +
12#include <dune/common/typeutilities.hh>
│ │ │ │ +
13
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
19
│ │ │ │ +
20
│ │ │ │ +
21
│ │ │ │ +
22namespace Dune {
│ │ │ │ +
23namespace Functions {
│ │ │ │ +
24
│ │ │ │ +
25
│ │ │ │
26
│ │ │ │ -
27namespace Imp {
│ │ │ │ -
28
│ │ │ │ -
29template<class Signature, class GV, class FLocal, template<class> class DerivativeTraits=DefaultDerivativeTraits>
│ │ │ │ -
30class LocalAnalyticGridViewFunction;
│ │ │ │ -
31
│ │ │ │ -
32template<class Range, class LocalDomain, class GV, class F, template<class> class DerivativeTraits>
│ │ │ │ -
33class LocalAnalyticGridViewFunction<Range(LocalDomain), GV, F, DerivativeTraits>
│ │ │ │ -
34{
│ │ │ │ -
35public:
│ │ │ │ -
36 using Signature = Range(LocalDomain);
│ │ │ │ -
37 using RawSignature = typename SignatureTraits<Signature>::RawSignature;
│ │ │ │ -
38 using DerivativeSignature = typename DerivativeTraits<RawSignature>::Range(LocalDomain);
│ │ │ │ -
39
│ │ │ │ -
40 using GridView = GV;
│ │ │ │ -
41 using EntitySet = GridViewEntitySet<GridView, 0>;
│ │ │ │ -
42 using Element = typename EntitySet::Element;
│ │ │ │ -
43// using Geometry = typename Element::Geometry;
│ │ │ │ -
44 using Geometry = std::decay_t<typename Element::Geometry>;
│ │ │ │ -
45
│ │ │ │ -
46 // Use the indirection via derivativeIfImplemented to also support
│ │ │ │ -
47 // function types F that do not implement derivative. In this case
│ │ │ │ -
48 // the interface type DifferentiableFunction is using a dummy for
│ │ │ │ -
49 // the derivative type
│ │ │ │ -
50 using DerivativeDummy = DifferentiableFunction<DerivativeSignature>;
│ │ │ │ -
51 using GlobalRawDerivative = decltype(Imp::derivativeIfImplemented<DerivativeDummy, F>(std::declval<F>()));
│ │ │ │ -
52 using LocalDerivative = LocalAnalyticGridViewFunction<DerivativeSignature, GridView, GlobalRawDerivative, DerivativeTraits>;
│ │ │ │ -
53
│ │ │ │ -
55 template<class FT, disableCopyMove<LocalAnalyticGridViewFunction, FT> = 0>
│ │ │ │ -
56 LocalAnalyticGridViewFunction(FT&& f) :
│ │ │ │ -
57 f_(std::forward<FT>(f))
│ │ │ │ -
58 {}
│ │ │ │ -
59
│ │ │ │ -
61 template<class FT>
│ │ │ │ -
62 LocalAnalyticGridViewFunction(FT&& f, const Element& element, const std::optional<Geometry>& geometry) :
│ │ │ │ -
63 f_(std::forward<FT>(f)),
│ │ │ │ -
64 element_(element),
│ │ │ │ -
65 geometry_(geometry)
│ │ │ │ -
66 {}
│ │ │ │ +
27/*
│ │ │ │ +
28 * Default implementation is empty
│ │ │ │ +
29 * The actual implementation is only given if Signature is an type
│ │ │ │ +
30 * describing a function signature as Range(Domain).
│ │ │ │ +
31 */
│ │ │ │ +
32template<class Signature, class LocalContext, template<class> class DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
34{};
│ │ │ │ +
│ │ │ │ +
35
│ │ │ │ +
36
│ │ │ │ +
37
│ │ │ │ +
38namespace Imp
│ │ │ │ +
39{
│ │ │ │ +
40
│ │ │ │ +
42 template<class S, class L, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ +
43 struct LocalFunctionTraits :
│ │ │ │ +
44 DifferentiableFunctionTraits<S, DerivativeTraits, bufferSize>
│ │ │ │ +
45 {
│ │ │ │ +
46 protected:
│ │ │ │ +
47 using Base=DifferentiableFunctionTraits<S, DerivativeTraits, bufferSize>;
│ │ │ │ +
48
│ │ │ │ +
49 public:
│ │ │ │ +
51 using LocalContext = L;
│ │ │ │ +
52
│ │ │ │ +
54 using DerivativeSignature = typename Base::DerivativeSignature;
│ │ │ │ +
55
│ │ │ │ + │ │ │ │ +
58
│ │ │ │ +
60 using Concept = LocalFunctionWrapperInterface<S, DerivativeInterface, L>;
│ │ │ │ +
61
│ │ │ │ +
63 template<class B>
│ │ │ │ +
64 using Model = LocalFunctionWrapperImplementation<S, DerivativeInterface, L, B>;
│ │ │ │ +
65 };
│ │ │ │ +
66}
│ │ │ │
67
│ │ │ │
68
│ │ │ │ -
77 void bind(const Element& element)
│ │ │ │ -
78 {
│ │ │ │ -
79 element_ = element;
│ │ │ │ -
80 geometry_.emplace(element_.geometry());
│ │ │ │ -
81 }
│ │ │ │ -
82
│ │ │ │ -
84 void unbind()
│ │ │ │ -
85 {
│ │ │ │ -
86 geometry_.reset();
│ │ │ │ -
87 }
│ │ │ │ -
88
│ │ │ │ -
91 bool bound() const
│ │ │ │ -
92 {
│ │ │ │ -
93 return static_cast<bool>(geometry_);
│ │ │ │ -
94 }
│ │ │ │ -
95
│ │ │ │ -
105 Range operator()(const LocalDomain& x) const
│ │ │ │ -
106 {
│ │ │ │ -
107 assert(!!geometry_);
│ │ │ │ -
108 return (*f_)(geometry_->global(x));
│ │ │ │ -
109 }
│ │ │ │ -
110
│ │ │ │ -
112 const Element& localContext() const
│ │ │ │ -
113 {
│ │ │ │ -
114 assert(!!geometry_);
│ │ │ │ -
115 return element_;
│ │ │ │ -
116 }
│ │ │ │ -
117
│ │ │ │ -
126 friend LocalDerivative derivative(const LocalAnalyticGridViewFunction& t)
│ │ │ │ -
127 {
│ │ │ │ -
128 return LocalDerivative(Imp::derivativeIfImplemented<DerivativeDummy, F>(*t.f_), t.element_, t.geometry_);
│ │ │ │ -
129 }
│ │ │ │ -
130
│ │ │ │ -
131private:
│ │ │ │ -
132 // Wrap the function into CopyableOptional to make it copy-assignable
│ │ │ │ -
133 CopyableOptional<F> f_;
│ │ │ │ -
134 Element element_;
│ │ │ │ -
135 std::optional<Geometry> geometry_ = std::nullopt;
│ │ │ │ -
136};
│ │ │ │ -
137
│ │ │ │ -
138} // end namespace Imp
│ │ │ │ -
139
│ │ │ │ -
140
│ │ │ │ -
141
│ │ │ │ -
142
│ │ │ │ -
143template<class Signature, class GV, class F, template<class> class DerivativeTraits=DefaultDerivativeTraits>
│ │ │ │ - │ │ │ │ -
145
│ │ │ │ -
146
│ │ │ │ -
152template<class Range, class Domain, class GV, class F, template<class> class DerivativeTraits>
│ │ │ │ -
│ │ │ │ -
153class AnalyticGridViewFunction<Range(Domain), GV, F, DerivativeTraits>
│ │ │ │ -
154{
│ │ │ │ -
155public:
│ │ │ │ -
156 using Signature = Range(Domain);
│ │ │ │ - │ │ │ │ -
158 using DerivativeSignature = typename DerivativeTraits<RawSignature>::Range(Domain);
│ │ │ │ -
159
│ │ │ │ -
160 using GridView = GV;
│ │ │ │ - │ │ │ │ -
162 using Element = typename EntitySet::Element;
│ │ │ │ -
163 using Geometry = typename Element::Geometry;
│ │ │ │ -
164
│ │ │ │ -
165 // Use the indirection via derivativeIfImplemented to also support
│ │ │ │ -
166 // function types F that do not implement derivative. In this case
│ │ │ │ -
167 // the interface type DifferentiableFunction is used a dummy for
│ │ │ │ -
168 // the derivative type
│ │ │ │ - │ │ │ │ -
170 using GlobalRawDerivative = decltype(Imp::derivativeIfImplemented<DerivativeDummy, F>(std::declval<F>()));
│ │ │ │ - │ │ │ │ -
172
│ │ │ │ - │ │ │ │ -
174 using LocalFunction = typename Imp::LocalAnalyticGridViewFunction<Range(LocalDomain), GridView, F, LocalDerivativeTraits<EntitySet, DerivativeTraits>::template Traits>;
│ │ │ │ -
175
│ │ │ │ -
177 template<class FT>
│ │ │ │ -
│ │ │ │ -
178 AnalyticGridViewFunction(FT&& f, const GridView& gridView) :
│ │ │ │ -
179 f_(std::forward<FT>(f)),
│ │ │ │ -
180 entitySet_(gridView)
│ │ │ │ -
181 {}
│ │ │ │ -
│ │ │ │ +
69
│ │ │ │ +
90template<class Range, class Domain, class LocalContext, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ +
│ │ │ │ +
91class LocalFunction< Range(Domain), LocalContext, DerivativeTraits, bufferSize> :
│ │ │ │ +
92 public TypeErasureBase<
│ │ │ │ +
93 typename Imp::LocalFunctionTraits<Range(Domain), LocalContext, DerivativeTraits, bufferSize>::Concept,
│ │ │ │ +
94 Imp::LocalFunctionTraits<Range(Domain), LocalContext, DerivativeTraits, bufferSize>::template Model>
│ │ │ │ +
95{
│ │ │ │ +
96 using Traits = Imp::LocalFunctionTraits<Range(Domain), LocalContext, DerivativeTraits, bufferSize>;
│ │ │ │ +
97
│ │ │ │ + │ │ │ │ +
99
│ │ │ │ +
100 using DerivativeInterface = typename Traits::DerivativeInterface;
│ │ │ │ +
101
│ │ │ │ +
102public:
│ │ │ │ +
103
│ │ │ │ +
115 template<class F, disableCopyMove<LocalFunction, F> = 0 >
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
117 Base(std::forward<F>(f))
│ │ │ │ +
118 {
│ │ │ │ +
119 static_assert(Dune::Functions::Concept::isLocalFunction<F, Range(Domain), LocalContext>(), "Trying to construct a LocalFunction from type that does not model the LocalFunction concept");
│ │ │ │ +
120 }
│ │ │ │ +
│ │ │ │ +
121
│ │ │ │ +
122 LocalFunction() = default;
│ │ │ │ +
123
│ │ │ │ +
│ │ │ │ +
127 Range operator() (const Domain& x) const
│ │ │ │ +
128 {
│ │ │ │ +
129 return this->asInterface().operator()(x);
│ │ │ │ +
130 }
│ │ │ │ +
│ │ │ │ +
131
│ │ │ │ +
│ │ │ │ +
139 friend DerivativeInterface derivative(const LocalFunction& t)
│ │ │ │ +
140 {
│ │ │ │ +
141 return t.asInterface().derivative();
│ │ │ │ +
142 }
│ │ │ │ +
│ │ │ │ +
143
│ │ │ │ +
│ │ │ │ +
150 void bind(const LocalContext& context)
│ │ │ │ +
151 {
│ │ │ │ +
152 this->asInterface().bind(context);
│ │ │ │ +
153 }
│ │ │ │ +
│ │ │ │ +
154
│ │ │ │ +
│ │ │ │ +
158 void unbind()
│ │ │ │ +
159 {
│ │ │ │ +
160 this->asInterface().unbind();
│ │ │ │ +
161 }
│ │ │ │ +
│ │ │ │ +
162
│ │ │ │ +
│ │ │ │ +
165 bool bound() const
│ │ │ │ +
166 {
│ │ │ │ +
167 return this->asInterface().bound();
│ │ │ │ +
168 }
│ │ │ │ +
│ │ │ │ +
169
│ │ │ │ +
│ │ │ │ +
173 const LocalContext& localContext() const
│ │ │ │ +
174 {
│ │ │ │ +
175 return this->asInterface().localContext();
│ │ │ │ +
176 }
│ │ │ │ +
│ │ │ │ +
177};
│ │ │ │ +
│ │ │ │ +
178
│ │ │ │ +
179
│ │ │ │ +
180
│ │ │ │ +
181}} // namespace Dune::Functions
│ │ │ │
182
│ │ │ │ -
│ │ │ │ -
184 Range operator()(const Domain& x) const
│ │ │ │ -
185 {
│ │ │ │ -
186 return (*f_)(x);
│ │ │ │ -
187 }
│ │ │ │ -
│ │ │ │ -
188
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
191 {
│ │ │ │ -
192 return Derivative(Imp::derivativeIfImplemented<DerivativeDummy, F>(*t.f_), t.entitySet_.gridView());
│ │ │ │ -
193 }
│ │ │ │ -
│ │ │ │ -
194
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
197 {
│ │ │ │ -
198 return LocalFunction(*t.f_);
│ │ │ │ -
199 }
│ │ │ │ -
│ │ │ │ -
200
│ │ │ │ -
│ │ │ │ -
202 const EntitySet& entitySet() const
│ │ │ │ -
203 {
│ │ │ │ -
204 return entitySet_;
│ │ │ │ -
205 }
│ │ │ │ -
│ │ │ │ -
206
│ │ │ │ -
207private:
│ │ │ │ -
208 // Wrap the function into CopyableOptional to make it copy-assignable
│ │ │ │ -
209 CopyableOptional<F> f_;
│ │ │ │ -
210 EntitySet entitySet_;
│ │ │ │ -
211};
│ │ │ │ -
│ │ │ │ -
212
│ │ │ │ -
213// deduction guides
│ │ │ │ -
214template<class F, class GridView,
│ │ │ │ -
215 class Domain = typename GridView::template Codim<0>::Geometry::GlobalCoordinate,
│ │ │ │ -
216 class Range = std::invoke_result_t<F,Domain>>
│ │ │ │ -
217AnalyticGridViewFunction(const F&, const GridView&)
│ │ │ │ -
218 -> AnalyticGridViewFunction<Range(Domain), GridView, F>;
│ │ │ │ -
219
│ │ │ │ -
220
│ │ │ │ -
237template<class F, class GridView>
│ │ │ │ -
│ │ │ │ -
238auto makeAnalyticGridViewFunction(F&& f, const GridView& gridView)
│ │ │ │ -
239{
│ │ │ │ -
240 using Domain = typename GridView::template Codim<0>::Geometry::GlobalCoordinate;
│ │ │ │ -
241 using Range = std::invoke_result_t<F, Domain>;
│ │ │ │ -
242 using FRaw = std::decay_t<F>;
│ │ │ │ -
243
│ │ │ │ -
244 return AnalyticGridViewFunction<Range(Domain), GridView, FRaw>(std::forward<F>(f), gridView);
│ │ │ │ -
245}
│ │ │ │ -
│ │ │ │ -
246
│ │ │ │ -
247
│ │ │ │ -
248
│ │ │ │ -
249}} // namespace Dune::Functions
│ │ │ │ -
250
│ │ │ │ -
251
│ │ │ │ -
252
│ │ │ │ -
253#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:43
│ │ │ │ -
auto makeAnalyticGridViewFunction(F &&f, const GridView &gridView)
Create an AnalyticGridViewFunction from a function and a grid view.
Definition analyticgridviewfunction.hh:238
│ │ │ │ +
183
│ │ │ │ +
184
│ │ │ │ +
185#endif // DUNE_FUNCTIONS_COMMON_LOCAL_FUNCTION_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
friend DerivativeInterface derivative(const LocalFunction &t)
Get derivative of wrapped function.
Definition localfunction.hh:139
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
Definition differentiablefunction.hh:33
│ │ │ │ -
Helper class to deduce the signature of a callable.
Definition signature.hh:60
│ │ │ │ -
Definition analyticgridviewfunction.hh:144
│ │ │ │ -
Range operator()(const Domain &x) const
Evaluate the wrapped function f directly in global coordinates x.
Definition analyticgridviewfunction.hh:184
│ │ │ │ -
typename EntitySet::LocalCoordinate LocalDomain
Definition analyticgridviewfunction.hh:173
│ │ │ │ -
friend Derivative derivative(const AnalyticGridViewFunction &t)
Create a derivative grid-function by wrapping the derivative of f.
Definition analyticgridviewfunction.hh:190
│ │ │ │ -
typename Element::Geometry Geometry
Definition analyticgridviewfunction.hh:163
│ │ │ │ -
typename EntitySet::Element Element
Definition analyticgridviewfunction.hh:162
│ │ │ │ - │ │ │ │ -
decltype(Imp::derivativeIfImplemented< DerivativeDummy, F >(std::declval< F >())) GlobalRawDerivative
Definition analyticgridviewfunction.hh:170
│ │ │ │ -
Range(Domain) Signature
Definition analyticgridviewfunction.hh:156
│ │ │ │ -
AnalyticGridViewFunction(FT &&f, const GridView &gridView)
Create the grid-function by wrapping a function f and create a GridViewEntitySet.
Definition analyticgridviewfunction.hh:178
│ │ │ │ -
friend LocalFunction localFunction(const AnalyticGridViewFunction &t)
Construct the associated local-function.
Definition analyticgridviewfunction.hh:196
│ │ │ │ -
typename Imp::LocalAnalyticGridViewFunction< Range(LocalDomain), GridView, F, LocalDerivativeTraits< EntitySet, DerivativeTraits >::template Traits > LocalFunction
Definition analyticgridviewfunction.hh:174
│ │ │ │ -
typename SignatureTraits< Signature >::RawSignature RawSignature
Definition analyticgridviewfunction.hh:157
│ │ │ │ -
const EntitySet & entitySet() const
Return the set of entities this local-function can be bound to.
Definition analyticgridviewfunction.hh:202
│ │ │ │ -
typename DerivativeTraits< RawSignature >::Range(Domain) DerivativeSignature
Definition analyticgridviewfunction.hh:158
│ │ │ │ - │ │ │ │ -
GridView::template Codim< codim >::Entity Element
Type of Elements contained in this EntitySet.
Definition gridviewentityset.hh:36
│ │ │ │ -
Element::Geometry::LocalCoordinate LocalCoordinate
Type of local coordinates with respect to the Element.
Definition gridviewentityset.hh:39
│ │ │ │ -
Derivative traits for local functions.
Definition localderivativetraits.hh:32
│ │ │ │ +
Definition localfunction.hh:34
│ │ │ │ +
const LocalContext & localContext() const
Obtain local context this LocalFunction is bound to.
Definition localfunction.hh:173
│ │ │ │ +
LocalFunction(F &&f)
Construct from function.
Definition localfunction.hh:116
│ │ │ │ +
void unbind()
Unbind from local context.
Definition localfunction.hh:158
│ │ │ │ +
bool bound() const
Return if the local function is bound to a grid element.
Definition localfunction.hh:165
│ │ │ │ +
void bind(const LocalContext &context)
Bind function to a local context.
Definition localfunction.hh:150
│ │ │ │ + │ │ │ │ +
Base class for type-erased interface wrapper.
Definition typeerasure.hh:169
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,329 +1,194 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ -analyticgridviewfunction.hh │ │ │ │ │ + * _c_o_m_m_o_n │ │ │ │ │ +localfunction.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_COMMON_LOCAL_FUNCTION_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_COMMON_LOCAL_FUNCTION_HH │ │ │ │ │ 9 │ │ │ │ │ 10#include │ │ │ │ │ -11#include │ │ │ │ │ -12 │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15 │ │ │ │ │ -16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_s_i_g_n_a_t_u_r_e_._h_h> │ │ │ │ │ -17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n___i_m_p_._h_h> │ │ │ │ │ -19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ -20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h> │ │ │ │ │ -21#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_l_o_c_a_l_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -22 │ │ │ │ │ -23 │ │ │ │ │ -24namespace _D_u_n_e { │ │ │ │ │ -25namespace Functions { │ │ │ │ │ +11 │ │ │ │ │ +12#include │ │ │ │ │ +13 │ │ │ │ │ +14#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +15#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ +16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_l_o_c_a_l_f_u_n_c_t_i_o_n___i_m_p_._h_h> │ │ │ │ │ +17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e_e_r_a_s_u_r_e_._h_h> │ │ │ │ │ +18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +19 │ │ │ │ │ +20 │ │ │ │ │ +21 │ │ │ │ │ +22namespace _D_u_n_e { │ │ │ │ │ +23namespace Functions { │ │ │ │ │ +24 │ │ │ │ │ +25 │ │ │ │ │ 26 │ │ │ │ │ -27namespace Imp { │ │ │ │ │ -28 │ │ │ │ │ -29template class │ │ │ │ │ -DerivativeTraits=DefaultDerivativeTraits> │ │ │ │ │ -30class LocalAnalyticGridViewFunction; │ │ │ │ │ -31 │ │ │ │ │ -32template │ │ │ │ │ -class DerivativeTraits> │ │ │ │ │ -33class LocalAnalyticGridViewFunction │ │ │ │ │ -34{ │ │ │ │ │ -35public: │ │ │ │ │ -36 using Signature = Range(LocalDomain); │ │ │ │ │ -37 using RawSignature = typename SignatureTraits::RawSignature; │ │ │ │ │ -38 using DerivativeSignature = typename DerivativeTraits::Range │ │ │ │ │ -(LocalDomain); │ │ │ │ │ -39 │ │ │ │ │ -40 using GridView = GV; │ │ │ │ │ -41 using EntitySet = GridViewEntitySet; │ │ │ │ │ -42 using Element = typename EntitySet::Element; │ │ │ │ │ -43// using Geometry = typename Element::Geometry; │ │ │ │ │ -44 using Geometry = std::decay_t; │ │ │ │ │ -45 │ │ │ │ │ -46 // Use the indirection via derivativeIfImplemented to also support │ │ │ │ │ -47 // function types F that do not implement derivative. In this case │ │ │ │ │ -48 // the interface type DifferentiableFunction is using a dummy for │ │ │ │ │ -49 // the derivative type │ │ │ │ │ -50 using DerivativeDummy = DifferentiableFunction; │ │ │ │ │ -51 using GlobalRawDerivative = decltype(Imp:: │ │ │ │ │ -derivativeIfImplemented(std::declval())); │ │ │ │ │ -52 using LocalDerivative = LocalAnalyticGridViewFunction; │ │ │ │ │ -53 │ │ │ │ │ -55 template = 0> │ │ │ │ │ -56 LocalAnalyticGridViewFunction(FT&& f) : │ │ │ │ │ -57 f_(std::forward(f)) │ │ │ │ │ -58 {} │ │ │ │ │ -59 │ │ │ │ │ -61 template │ │ │ │ │ -62 LocalAnalyticGridViewFunction(FT&& f, const Element& element, const std:: │ │ │ │ │ -optional& geometry) : │ │ │ │ │ -63 f_(std::forward(f)), │ │ │ │ │ -64 element_(element), │ │ │ │ │ -65 geometry_(geometry) │ │ │ │ │ -66 {} │ │ │ │ │ +27/* │ │ │ │ │ +28 * Default implementation is empty │ │ │ │ │ +29 * The actual implementation is only given if Signature is an type │ │ │ │ │ +30 * describing a function signature as Range(Domain). │ │ │ │ │ +31 */ │ │ │ │ │ +32template class │ │ │ │ │ +DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56> │ │ │ │ │ +_3_3class _L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ +34{}; │ │ │ │ │ +35 │ │ │ │ │ +36 │ │ │ │ │ +37 │ │ │ │ │ +38namespace Imp │ │ │ │ │ +39{ │ │ │ │ │ +40 │ │ │ │ │ +42 template class DerivativeTraits, size_t │ │ │ │ │ +bufferSize> │ │ │ │ │ +43 struct LocalFunctionTraits : │ │ │ │ │ +44 DifferentiableFunctionTraits │ │ │ │ │ +45 { │ │ │ │ │ +46 protected: │ │ │ │ │ +47 using Base=DifferentiableFunctionTraits; │ │ │ │ │ +48 │ │ │ │ │ +49 public: │ │ │ │ │ +51 using LocalContext = L; │ │ │ │ │ +52 │ │ │ │ │ +54 using DerivativeSignature = typename Base::DerivativeSignature; │ │ │ │ │ +55 │ │ │ │ │ +57 using DerivativeInterface = _L_o_c_a_l_F_u_n_c_t_i_o_n_<_D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_,_ _L_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _b_u_f_f_e_r_S_i_z_e_>; │ │ │ │ │ +58 │ │ │ │ │ +60 using Concept = LocalFunctionWrapperInterface; │ │ │ │ │ +61 │ │ │ │ │ +63 template │ │ │ │ │ +64 using Model = LocalFunctionWrapperImplementation; │ │ │ │ │ +65 }; │ │ │ │ │ +66} │ │ │ │ │ 67 │ │ │ │ │ 68 │ │ │ │ │ -77 void bind(const Element& element) │ │ │ │ │ -78 { │ │ │ │ │ -79 element_ = element; │ │ │ │ │ -80 geometry_.emplace(element_.geometry()); │ │ │ │ │ -81 } │ │ │ │ │ -82 │ │ │ │ │ -84 void unbind() │ │ │ │ │ -85 { │ │ │ │ │ -86 geometry_.reset(); │ │ │ │ │ -87 } │ │ │ │ │ -88 │ │ │ │ │ -91 bool bound() const │ │ │ │ │ -92 { │ │ │ │ │ -93 return static_cast(geometry_); │ │ │ │ │ -94 } │ │ │ │ │ -95 │ │ │ │ │ -105 Range operator()(const LocalDomain& x) const │ │ │ │ │ -106 { │ │ │ │ │ -107 assert(!!geometry_); │ │ │ │ │ -108 return (*f_)(geometry_->global(x)); │ │ │ │ │ -109 } │ │ │ │ │ -110 │ │ │ │ │ -112 const Element& localContext() const │ │ │ │ │ -113 { │ │ │ │ │ -114 assert(!!geometry_); │ │ │ │ │ -115 return element_; │ │ │ │ │ -116 } │ │ │ │ │ -117 │ │ │ │ │ -126 friend LocalDerivative _d_e_r_i_v_a_t_i_v_e(const LocalAnalyticGridViewFunction& t) │ │ │ │ │ -127 { │ │ │ │ │ -128 return LocalDerivative(Imp::derivativeIfImplemented │ │ │ │ │ -(*t.f_), t.element_, t.geometry_); │ │ │ │ │ -129 } │ │ │ │ │ -130 │ │ │ │ │ -131private: │ │ │ │ │ -132 // Wrap the function into CopyableOptional to make it copy-assignable │ │ │ │ │ -133 CopyableOptional f_; │ │ │ │ │ -134 Element element_; │ │ │ │ │ -135 std::optional geometry_ = std::nullopt; │ │ │ │ │ -136}; │ │ │ │ │ -137 │ │ │ │ │ -138} // end namespace Imp │ │ │ │ │ -139 │ │ │ │ │ -140 │ │ │ │ │ -141 │ │ │ │ │ -142 │ │ │ │ │ -143template class │ │ │ │ │ -DerivativeTraits=DefaultDerivativeTraits> │ │ │ │ │ -_1_4_4class _A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n; │ │ │ │ │ -145 │ │ │ │ │ -146 │ │ │ │ │ -152template class │ │ │ │ │ -DerivativeTraits> │ │ │ │ │ -_1_5_3class _A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ -154{ │ │ │ │ │ -155public: │ │ │ │ │ -_1_5_6 using _S_i_g_n_a_t_u_r_e = Range(Domain); │ │ │ │ │ -_1_5_7 using _R_a_w_S_i_g_n_a_t_u_r_e = typename _S_i_g_n_a_t_u_r_e_T_r_a_i_t_s_<_S_i_g_n_a_t_u_r_e_>_:_:_R_a_w_S_i_g_n_a_t_u_r_e; │ │ │ │ │ -_1_5_8 using _D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e = typename DerivativeTraits::Range │ │ │ │ │ -(Domain); │ │ │ │ │ -159 │ │ │ │ │ -_1_6_0 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ -_1_6_1 using _E_n_t_i_t_y_S_e_t = _G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_G_r_i_d_V_i_e_w_,_ _0_>; │ │ │ │ │ -_1_6_2 using _E_l_e_m_e_n_t = typename _E_n_t_i_t_y_S_e_t_:_:_E_l_e_m_e_n_t; │ │ │ │ │ -_1_6_3 using _G_e_o_m_e_t_r_y = typename Element::Geometry; │ │ │ │ │ -164 │ │ │ │ │ -165 // Use the indirection via derivativeIfImplemented to also support │ │ │ │ │ -166 // function types F that do not implement derivative. In this case │ │ │ │ │ -167 // the interface type DifferentiableFunction is used a dummy for │ │ │ │ │ -168 // the derivative type │ │ │ │ │ -_1_6_9 using _D_e_r_i_v_a_t_i_v_e_D_u_m_m_y = _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_>; │ │ │ │ │ -_1_7_0 using _G_l_o_b_a_l_R_a_w_D_e_r_i_v_a_t_i_v_e = decltype(Imp:: │ │ │ │ │ -derivativeIfImplemented(std::declval())); │ │ │ │ │ -_1_7_1 using _D_e_r_i_v_a_t_i_v_e = _A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_,_ _G_r_i_d_V_i_e_w_, │ │ │ │ │ -_G_l_o_b_a_l_R_a_w_D_e_r_i_v_a_t_i_v_e_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_>; │ │ │ │ │ -172 │ │ │ │ │ -_1_7_3 using _L_o_c_a_l_D_o_m_a_i_n = typename _E_n_t_i_t_y_S_e_t_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ -_1_7_4 using _L_o_c_a_l_F_u_n_c_t_i_o_n = typename Imp::LocalAnalyticGridViewFunction_:_:_t_e_m_p_l_a_t_e Traits>; │ │ │ │ │ -175 │ │ │ │ │ -177 template │ │ │ │ │ -_1_7_8 _A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n(FT&& f, const _G_r_i_d_V_i_e_w& gridView) : │ │ │ │ │ -179 f_(std::forward(f)), │ │ │ │ │ -180 entitySet_(gridView) │ │ │ │ │ -181 {} │ │ │ │ │ +69 │ │ │ │ │ +90template class │ │ │ │ │ +DerivativeTraits, size_t bufferSize> │ │ │ │ │ +_9_1class _L_o_c_a_l_F_u_n_c_t_i_o_n< Range(Domain), LocalContext, DerivativeTraits, │ │ │ │ │ +bufferSize> : │ │ │ │ │ +92 public _T_y_p_e_E_r_a_s_u_r_e_B_a_s_e< │ │ │ │ │ +93 typename Imp::LocalFunctionTraits::Concept, │ │ │ │ │ +94 Imp::LocalFunctionTraits::template Model> │ │ │ │ │ +95{ │ │ │ │ │ +96 using Traits = Imp::LocalFunctionTraits; │ │ │ │ │ +97 │ │ │ │ │ +98 using _B_a_s_e = _T_y_p_e_E_r_a_s_u_r_e_B_a_s_e_<_t_y_p_e_n_a_m_e_ _T_r_a_i_t_s_:_:_C_o_n_c_e_p_t_,_ _T_r_a_i_t_s_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ +_M_o_d_e_l_>; │ │ │ │ │ +99 │ │ │ │ │ +100 using DerivativeInterface = typename _T_r_a_i_t_s_:_:_D_e_r_i_v_a_t_i_v_e_I_n_t_e_r_f_a_c_e; │ │ │ │ │ +101 │ │ │ │ │ +102public: │ │ │ │ │ +103 │ │ │ │ │ +115 template = 0 > │ │ │ │ │ +_1_1_6 _L_o_c_a_l_F_u_n_c_t_i_o_n(F&& f) : │ │ │ │ │ +117 _B_a_s_e(std::forward(f)) │ │ │ │ │ +118 { │ │ │ │ │ +119 static_assert(Dune::Functions::Concept::isLocalFunction(), "Trying to construct a LocalFunction from type that does not │ │ │ │ │ +model the LocalFunction concept"); │ │ │ │ │ +120 } │ │ │ │ │ +121 │ │ │ │ │ +_1_2_2 _L_o_c_a_l_F_u_n_c_t_i_o_n() = default; │ │ │ │ │ +123 │ │ │ │ │ +_1_2_7 Range operator() (const Domain& x) const │ │ │ │ │ +128 { │ │ │ │ │ +129 return this->asInterface().operator()(x); │ │ │ │ │ +130 } │ │ │ │ │ +131 │ │ │ │ │ +_1_3_9 friend DerivativeInterface _d_e_r_i_v_a_t_i_v_e(const _L_o_c_a_l_F_u_n_c_t_i_o_n& t) │ │ │ │ │ +140 { │ │ │ │ │ +141 return t.asInterface().derivative(); │ │ │ │ │ +142 } │ │ │ │ │ +143 │ │ │ │ │ +_1_5_0 void _b_i_n_d(const LocalContext& context) │ │ │ │ │ +151 { │ │ │ │ │ +152 this->asInterface().bind(context); │ │ │ │ │ +153 } │ │ │ │ │ +154 │ │ │ │ │ +_1_5_8 void _u_n_b_i_n_d() │ │ │ │ │ +159 { │ │ │ │ │ +160 this->asInterface().unbind(); │ │ │ │ │ +161 } │ │ │ │ │ +162 │ │ │ │ │ +_1_6_5 bool _b_o_u_n_d() const │ │ │ │ │ +166 { │ │ │ │ │ +167 return this->asInterface().bound(); │ │ │ │ │ +168 } │ │ │ │ │ +169 │ │ │ │ │ +_1_7_3 const LocalContext& _l_o_c_a_l_C_o_n_t_e_x_t() const │ │ │ │ │ +174 { │ │ │ │ │ +175 return this->asInterface().localContext(); │ │ │ │ │ +176 } │ │ │ │ │ +177}; │ │ │ │ │ +178 │ │ │ │ │ +179 │ │ │ │ │ +180 │ │ │ │ │ +181}} // namespace Dune::Functions │ │ │ │ │ 182 │ │ │ │ │ -_1_8_4 Range _o_p_e_r_a_t_o_r_(_)(const Domain& x) const │ │ │ │ │ -185 { │ │ │ │ │ -186 return (*f_)(x); │ │ │ │ │ -187 } │ │ │ │ │ -188 │ │ │ │ │ -_1_9_0 friend _D_e_r_i_v_a_t_i_v_e _d_e_r_i_v_a_t_i_v_e(const _A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n& t) │ │ │ │ │ -191 { │ │ │ │ │ -192 return _D_e_r_i_v_a_t_i_v_e(Imp::derivativeIfImplemented(*t.f_), │ │ │ │ │ -t.entitySet_.gridView()); │ │ │ │ │ -193 } │ │ │ │ │ -194 │ │ │ │ │ -_1_9_6 friend _L_o_c_a_l_F_u_n_c_t_i_o_n _l_o_c_a_l_F_u_n_c_t_i_o_n(const _A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n& t) │ │ │ │ │ -197 { │ │ │ │ │ -198 return _L_o_c_a_l_F_u_n_c_t_i_o_n(*t.f_); │ │ │ │ │ -199 } │ │ │ │ │ -200 │ │ │ │ │ -_2_0_2 const _E_n_t_i_t_y_S_e_t& _e_n_t_i_t_y_S_e_t() const │ │ │ │ │ -203 { │ │ │ │ │ -204 return entitySet_; │ │ │ │ │ -205 } │ │ │ │ │ -206 │ │ │ │ │ -207private: │ │ │ │ │ -208 // Wrap the function into CopyableOptional to make it copy-assignable │ │ │ │ │ -209 CopyableOptional f_; │ │ │ │ │ -210 EntitySet entitySet_; │ │ │ │ │ -211}; │ │ │ │ │ -212 │ │ │ │ │ -213// deduction guides │ │ │ │ │ -214template::Geometry:: │ │ │ │ │ -GlobalCoordinate, │ │ │ │ │ -216 class Range = std::invoke_result_t> │ │ │ │ │ -_2_1_7_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n(const F&, const GridView&) │ │ │ │ │ -218 -> _A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n; │ │ │ │ │ -219 │ │ │ │ │ -220 │ │ │ │ │ -237template │ │ │ │ │ -_2_3_8auto _m_a_k_e_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n(F&& f, const GridView& gridView) │ │ │ │ │ -239{ │ │ │ │ │ -240 using Domain = typename GridView::template Codim<0>::Geometry:: │ │ │ │ │ -GlobalCoordinate; │ │ │ │ │ -241 using Range = std::invoke_result_t; │ │ │ │ │ -242 using FRaw = std::decay_t; │ │ │ │ │ -243 │ │ │ │ │ -244 return _A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_r_i_d_V_i_e_w_,_ _F_R_a_w_>(std:: │ │ │ │ │ -forward(f), gridView); │ │ │ │ │ -245} │ │ │ │ │ -246 │ │ │ │ │ -247 │ │ │ │ │ -248 │ │ │ │ │ -249}} // namespace Dune::Functions │ │ │ │ │ -250 │ │ │ │ │ -251 │ │ │ │ │ -252 │ │ │ │ │ -253#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH │ │ │ │ │ -_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h │ │ │ │ │ -_l_o_c_a_l_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h │ │ │ │ │ +183 │ │ │ │ │ +184 │ │ │ │ │ +185#endif // DUNE_FUNCTIONS_COMMON_LOCAL_FUNCTION_HH │ │ │ │ │ _d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h │ │ │ │ │ +_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ +_l_o_c_a_l_f_u_n_c_t_i_o_n___i_m_p_._h_h │ │ │ │ │ _d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h │ │ │ │ │ -_s_i_g_n_a_t_u_r_e_._h_h │ │ │ │ │ -_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n___i_m_p_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ -TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const │ │ │ │ │ -TrigonometricFunction< K, sinFactor, cosFactor > &f) │ │ │ │ │ -Obtain derivative of TrigonometricFunction function. │ │ │ │ │ -DDeeffiinniittiioonn trigonometricfunction.hh:43 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_:_:_m_a_k_e_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ -auto makeAnalyticGridViewFunction(F &&f, const GridView &gridView) │ │ │ │ │ -Create an AnalyticGridViewFunction from a function and a grid view. │ │ │ │ │ -DDeeffiinniittiioonn analyticgridviewfunction.hh:238 │ │ │ │ │ +_t_y_p_e_e_r_a_s_u_r_e_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _L_o_c_a_l_C_o_n_t_e_x_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ +_b_u_f_f_e_r_S_i_z_e_ _>_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ +friend DerivativeInterface derivative(const LocalFunction &t) │ │ │ │ │ +Get derivative of wrapped function. │ │ │ │ │ +DDeeffiinniittiioonn localfunction.hh:139 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn differentiablefunction.hh:33 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_r_a_i_t_s │ │ │ │ │ -Helper class to deduce the signature of a callable. │ │ │ │ │ -DDeeffiinniittiioonn signature.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn analyticgridviewfunction.hh:144 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -Range operator()(const Domain &x) const │ │ │ │ │ -Evaluate the wrapped function f directly in global coordinates x. │ │ │ │ │ -DDeeffiinniittiioonn analyticgridviewfunction.hh:184 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_L_o_c_a_l_D_o_m_a_i_n │ │ │ │ │ -typename EntitySet::LocalCoordinate LocalDomain │ │ │ │ │ -DDeeffiinniittiioonn analyticgridviewfunction.hh:173 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ -friend Derivative derivative(const AnalyticGridViewFunction &t) │ │ │ │ │ -Create a derivative grid-function by wrapping the derivative of f. │ │ │ │ │ -DDeeffiinniittiioonn analyticgridviewfunction.hh:190 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ -typename Element::Geometry Geometry │ │ │ │ │ -DDeeffiinniittiioonn analyticgridviewfunction.hh:163 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_E_l_e_m_e_n_t │ │ │ │ │ -typename EntitySet::Element Element │ │ │ │ │ -DDeeffiinniittiioonn analyticgridviewfunction.hh:162 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ -GV GridView │ │ │ │ │ -DDeeffiinniittiioonn analyticgridviewfunction.hh:160 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_G_l_o_b_a_l_R_a_w_D_e_r_i_v_a_t_i_v_e │ │ │ │ │ -decltype(Imp::derivativeIfImplemented< DerivativeDummy, F >(std::declval< F > │ │ │ │ │ -())) GlobalRawDerivative │ │ │ │ │ -DDeeffiinniittiioonn analyticgridviewfunction.hh:170 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_S_i_g_n_a_t_u_r_e │ │ │ │ │ -Range(Domain) Signature │ │ │ │ │ -DDeeffiinniittiioonn analyticgridviewfunction.hh:156 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ -AnalyticGridViewFunction(FT &&f, const GridView &gridView) │ │ │ │ │ -Create the grid-function by wrapping a function f and create a │ │ │ │ │ -GridViewEntitySet. │ │ │ │ │ -DDeeffiinniittiioonn analyticgridviewfunction.hh:178 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_l_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ -friend LocalFunction localFunction(const AnalyticGridViewFunction &t) │ │ │ │ │ -Construct the associated local-function. │ │ │ │ │ -DDeeffiinniittiioonn analyticgridviewfunction.hh:196 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ -typename Imp::LocalAnalyticGridViewFunction< Range(LocalDomain), GridView, F, │ │ │ │ │ -LocalDerivativeTraits< EntitySet, DerivativeTraits >::template Traits > │ │ │ │ │ -LocalFunction │ │ │ │ │ -DDeeffiinniittiioonn analyticgridviewfunction.hh:174 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_R_a_w_S_i_g_n_a_t_u_r_e │ │ │ │ │ -typename SignatureTraits< Signature >::RawSignature RawSignature │ │ │ │ │ -DDeeffiinniittiioonn analyticgridviewfunction.hh:157 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_e_n_t_i_t_y_S_e_t │ │ │ │ │ -const EntitySet & entitySet() const │ │ │ │ │ -Return the set of entities this local-function can be bound to. │ │ │ │ │ -DDeeffiinniittiioonn analyticgridviewfunction.hh:202 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e │ │ │ │ │ -typename DerivativeTraits< RawSignature >::Range(Domain) DerivativeSignature │ │ │ │ │ -DDeeffiinniittiioonn analyticgridviewfunction.hh:158 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_ _G_r_i_d_V_i_e_w_,_ _0_ _> │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_ _G_r_i_d_V_i_e_w_,_ _0_ _>_:_:_E_l_e_m_e_n_t │ │ │ │ │ -GridView::template Codim< codim >::Entity Element │ │ │ │ │ -Type of Elements contained in this EntitySet. │ │ │ │ │ -DDeeffiinniittiioonn gridviewentityset.hh:36 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_ _G_r_i_d_V_i_e_w_,_ _0_ _>_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -Element::Geometry::LocalCoordinate LocalCoordinate │ │ │ │ │ -Type of local coordinates with respect to the Element. │ │ │ │ │ -DDeeffiinniittiioonn gridviewentityset.hh:39 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ -Derivative traits for local functions. │ │ │ │ │ -DDeeffiinniittiioonn localderivativetraits.hh:32 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn localfunction.hh:34 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _L_o_c_a_l_C_o_n_t_e_x_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ +_b_u_f_f_e_r_S_i_z_e_ _>_:_:_l_o_c_a_l_C_o_n_t_e_x_t │ │ │ │ │ +const LocalContext & localContext() const │ │ │ │ │ +Obtain local context this LocalFunction is bound to. │ │ │ │ │ +DDeeffiinniittiioonn localfunction.hh:173 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _L_o_c_a_l_C_o_n_t_e_x_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ +_b_u_f_f_e_r_S_i_z_e_ _>_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ +LocalFunction(F &&f) │ │ │ │ │ +Construct from function. │ │ │ │ │ +DDeeffiinniittiioonn localfunction.hh:116 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _L_o_c_a_l_C_o_n_t_e_x_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ +_b_u_f_f_e_r_S_i_z_e_ _>_:_:_u_n_b_i_n_d │ │ │ │ │ +void unbind() │ │ │ │ │ +Unbind from local context. │ │ │ │ │ +DDeeffiinniittiioonn localfunction.hh:158 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _L_o_c_a_l_C_o_n_t_e_x_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ +_b_u_f_f_e_r_S_i_z_e_ _>_:_:_b_o_u_n_d │ │ │ │ │ +bool bound() const │ │ │ │ │ +Return if the local function is bound to a grid element. │ │ │ │ │ +DDeeffiinniittiioonn localfunction.hh:165 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _L_o_c_a_l_C_o_n_t_e_x_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ +_b_u_f_f_e_r_S_i_z_e_ _>_:_:_b_i_n_d │ │ │ │ │ +void bind(const LocalContext &context) │ │ │ │ │ +Bind function to a local context. │ │ │ │ │ +DDeeffiinniittiioonn localfunction.hh:150 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _L_o_c_a_l_C_o_n_t_e_x_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ +_b_u_f_f_e_r_S_i_z_e_ _>_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ +LocalFunction()=default │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_y_p_e_E_r_a_s_u_r_e_B_a_s_e │ │ │ │ │ +Base class for type-erased interface wrapper. │ │ │ │ │ +DDeeffiinniittiioonn typeerasure.hh:169 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00017.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: gridfunction.hh File Reference │ │ │ │ +dune-functions: reserveddeque.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,51 +65,75 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
gridfunction.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Macros
│ │ │ │ +
reserveddeque.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>
│ │ │ │ + │ │ │ │ +

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

class  Dune::Functions::GridFunction< Signature, EntitySet, DerivativeTraits, bufferSize >
 
class  Dune::Functions::GridFunction< Range(Domain), ES, DerivativeTraits, bufferSize >
 Wrapper class for functions defined on a Grid. More...
class  Dune::Functions::ReservedDeque< T, n >
 A double-ended queue (deque) class with statically reserved memory. 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 {} │ │ │ │ │ @@ -1,34 +1,37 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -gridfunction.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e_e_r_a_s_u_r_e_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_l_o_c_a_l_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_l_o_c_a_l_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n___i_m_p_._h_h> │ │ │ │ │ + * _c_o_m_m_o_n │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s │ │ │ │ │ +reserveddeque.hh File Reference │ │ │ │ │ +An stl-compliant double-ended queue which stores everything on the stack. │ │ │ │ │ +_M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_F_u_n_c_t_i_o_n_<_ _S_i_g_n_a_t_u_r_e_,_ _E_n_t_i_t_y_S_e_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ - _b_u_f_f_e_r_S_i_z_e_ _> │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_S_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ - _b_u_f_f_e_r_S_i_z_e_ _> │ │ │ │ │ -  Wrapper class for functions defined on a Grid. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_<_ _T_,_ _n_ _> │ │ │ │ │ +  A double-ended queue (deque) class with statically reserved memory. │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ +MMaaccrrooss │ │ │ │ │ +#define  _C_H_E_C_K_S_I_Z_E(X)   {} │ │ │ │ │ +  │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +An stl-compliant double-ended queue which stores everything on the stack. │ │ │ │ │ +********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ +********** _?◆_? CCHHEECCKKSSIIZZEE ********** │ │ │ │ │ +#define CHECKSIZE (   X )    {} │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00017_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: gridfunction.hh Source File │ │ │ │ +dune-functions: reserveddeque.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,183 +70,285 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
gridfunction.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_COMMON_RESERVEDDEQUE_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_COMMON_RESERVEDDEQUE_HH
│ │ │ │
9
│ │ │ │ -
10#include <type_traits>
│ │ │ │ -
11
│ │ │ │ -
12#include <dune/common/typeutilities.hh>
│ │ │ │ -
13
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
21
│ │ │ │ -
22
│ │ │ │ -
23
│ │ │ │ -
24namespace Dune {
│ │ │ │ -
25namespace Functions {
│ │ │ │ +
14#include <algorithm>
│ │ │ │ +
15#include <iostream>
│ │ │ │ +
16#include <cstddef>
│ │ │ │ +
17#include <initializer_list>
│ │ │ │ +
18
│ │ │ │ +
19#include <dune/common/genericiterator.hh>
│ │ │ │ +
20
│ │ │ │ +
21#ifdef CHECK_RESERVEDDEQUE
│ │ │ │ +
22#define CHECKSIZE(X) assert(X)
│ │ │ │ +
23#else
│ │ │ │ +
24#define CHECKSIZE(X) {}
│ │ │ │ +
25#endif
│ │ │ │
26
│ │ │ │ -
27
│ │ │ │ -
28
│ │ │ │ -
29/*
│ │ │ │ -
30 * Default implementation is empty
│ │ │ │ -
31 * The actual implementation is only given if Signature is an type
│ │ │ │ -
32 * describing a function signature as Range(Domain).
│ │ │ │ -
33 */
│ │ │ │ -
34template<class Signature, class EntitySet, template<class> class DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
36{};
│ │ │ │ -
│ │ │ │ -
37
│ │ │ │ -
38
│ │ │ │ -
39
│ │ │ │ -
40namespace Imp
│ │ │ │ -
41{
│ │ │ │ -
42
│ │ │ │ -
44 template<class S, class ES, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ -
45 struct GridFunctionTraits :
│ │ │ │ -
46 DifferentiableFunctionTraits<S, DerivativeTraits, bufferSize>
│ │ │ │ -
47 {
│ │ │ │ -
48 protected:
│ │ │ │ -
49 using Base=DifferentiableFunctionTraits<S, DerivativeTraits, bufferSize>;
│ │ │ │ -
50
│ │ │ │ -
51 public:
│ │ │ │ -
53 using EntitySet = ES;
│ │ │ │ -
54
│ │ │ │ -
56 using Element = typename EntitySet::Element;
│ │ │ │ -
57
│ │ │ │ -
59 using DerivativeSignature = typename Base::DerivativeSignature;
│ │ │ │ -
60
│ │ │ │ - │ │ │ │ -
63
│ │ │ │ -
65 using LocalSignature = typename Base::Range(typename EntitySet::LocalCoordinate);
│ │ │ │ -
66
│ │ │ │ -
68 template<class R>
│ │ │ │ - │ │ │ │ +
27namespace Dune {
│ │ │ │ +
28namespace Functions {
│ │ │ │ +
29
│ │ │ │ +
47 template<class T, int n>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
49 {
│ │ │ │ +
50 public:
│ │ │ │ +
51
│ │ │ │ +
55 typedef T value_type;
│ │ │ │ +
57 typedef T* pointer;
│ │ │ │ +
59 typedef T& reference;
│ │ │ │ +
61 typedef const T& const_reference;
│ │ │ │ +
63 typedef size_t size_type;
│ │ │ │ +
65 typedef std::ptrdiff_t difference_type;
│ │ │ │ +
67 typedef Dune::GenericIterator<ReservedDeque, value_type> iterator;
│ │ │ │ +
69 typedef Dune::GenericIterator<const ReservedDeque, const value_type> const_iterator;
│ │ │ │
70
│ │ │ │ -
72 using LocalFunctionTraits = typename Dune::Functions::Imp::LocalFunctionTraits<LocalSignature, Element, LocalDerivativeTraits, bufferSize>;
│ │ │ │ -
73
│ │ │ │ - │ │ │ │ -
76
│ │ │ │ -
78 using Concept = GridFunctionWrapperInterface<S, DerivativeInterface, LocalFunctionInterface, ES>;
│ │ │ │ -
79
│ │ │ │ -
81 template<class B>
│ │ │ │ -
82 using Model = GridFunctionWrapperImplementation<S, DerivativeInterface, LocalFunctionInterface, ES, B>;
│ │ │ │ -
83 };
│ │ │ │ -
84}
│ │ │ │ -
85
│ │ │ │ -
86
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
77 size_(0),
│ │ │ │ +
78 first_(0)
│ │ │ │ +
79 {}
│ │ │ │ +
│ │ │ │ +
80
│ │ │ │ +
│ │ │ │ +
81 ReservedDeque(std::initializer_list<T> const &l)
│ │ │ │ +
82 {
│ │ │ │ +
83 assert(l.size() <= n);// Actually, this is not needed any more!
│ │ │ │ +
84 size_ = l.size();
│ │ │ │ +
85 std::copy_n(l.begin(), size_, data_);
│ │ │ │ +
86 }
│ │ │ │ +
│ │ │ │
87
│ │ │ │ -
99template<class Range, class Domain, class ES, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ -
│ │ │ │ -
100class GridFunction<Range(Domain), ES, DerivativeTraits, bufferSize> :
│ │ │ │ -
101 public TypeErasureBase<
│ │ │ │ -
102 typename Imp::GridFunctionTraits<Range(Domain), ES, DerivativeTraits, bufferSize>::Concept,
│ │ │ │ -
103 Imp::GridFunctionTraits<Range(Domain), ES, DerivativeTraits, bufferSize>::template Model>
│ │ │ │ -
104{
│ │ │ │ -
105 using Traits = Imp::GridFunctionTraits<Range(Domain), ES, DerivativeTraits, bufferSize>;
│ │ │ │ -
106
│ │ │ │ - │ │ │ │ -
108
│ │ │ │ -
109 using DerivativeInterface = typename Traits::DerivativeInterface;
│ │ │ │ -
110
│ │ │ │ -
111 using LocalFunctionInterface = typename Traits::LocalFunctionInterface;
│ │ │ │ -
112
│ │ │ │ -
113 using EntitySet = typename Traits::EntitySet;
│ │ │ │ -
114
│ │ │ │ -
115public:
│ │ │ │ -
116
│ │ │ │ -
128 template<class F, disableCopyMove<GridFunction, F> = 0 >
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
130 Base(std::forward<F>(f))
│ │ │ │ -
131 {
│ │ │ │ -
132 static_assert(Dune::Functions::Concept::isGridFunction<F, Range(Domain), EntitySet>(), "Trying to construct a GridFunction from type that does not model the GridFunction concept");
│ │ │ │ -
133 }
│ │ │ │ -
│ │ │ │ -
134
│ │ │ │ -
135 GridFunction() = default;
│ │ │ │ -
136
│ │ │ │ -
│ │ │ │ -
142 Range operator() (const Domain& x) const
│ │ │ │ -
143 {
│ │ │ │ -
144 return this->asInterface().operator()(x);
│ │ │ │ -
145 }
│ │ │ │ -
│ │ │ │ -
146
│ │ │ │ -
│ │ │ │ -
155 friend DerivativeInterface derivative(const GridFunction& t)
│ │ │ │ -
156 {
│ │ │ │ -
157 return t.asInterface().derivative();
│ │ │ │ -
158 }
│ │ │ │ -
│ │ │ │ -
159
│ │ │ │ -
│ │ │ │ -
169 friend LocalFunctionInterface localFunction(const GridFunction& t)
│ │ │ │ -
170 {
│ │ │ │ -
171 return t.asInterface().wrappedLocalFunction();
│ │ │ │ -
172 }
│ │ │ │ -
│ │ │ │ -
173
│ │ │ │ -
│ │ │ │ -
180 const EntitySet& entitySet() const
│ │ │ │ -
181 {
│ │ │ │ -
182 return this->asInterface().wrappedEntitySet();
│ │ │ │ -
183 }
│ │ │ │ +
│ │ │ │ +
93 void clear()
│ │ │ │ +
94 {
│ │ │ │ +
95 first_ = 0;
│ │ │ │ +
96 size_ = 0;
│ │ │ │ +
97 }
│ │ │ │ +
│ │ │ │ +
98
│ │ │ │ +
│ │ │ │ +
100 void resize(size_t s)
│ │ │ │ +
101 {
│ │ │ │ +
102 CHECKSIZE(s<=n);
│ │ │ │ +
103 size_ = s;
│ │ │ │ +
104 }
│ │ │ │ +
│ │ │ │ +
105
│ │ │ │ +
│ │ │ │ +
107 void push_back(const T& t)
│ │ │ │ +
108 {
│ │ │ │ +
109 CHECKSIZE(size_<n);
│ │ │ │ +
110 data_[size_++ % n] = t;
│ │ │ │ +
111 }
│ │ │ │
│ │ │ │ -
184};
│ │ │ │ +
112
│ │ │ │ +
│ │ │ │ +
114 void push_front(const T& t)
│ │ │ │ +
115 {
│ │ │ │ +
116 CHECKSIZE(size_<n);
│ │ │ │ +
117 ++size_;
│ │ │ │ +
118 first_ = (first_+(n-1)) % n;
│ │ │ │ +
119 data_[first_] = t;
│ │ │ │ +
120 }
│ │ │ │ +
│ │ │ │ +
121
│ │ │ │ +
│ │ │ │ +
123 void pop_back()
│ │ │ │ +
124 {
│ │ │ │ +
125 if (! empty())
│ │ │ │ +
126 size_--;
│ │ │ │ +
127 }
│ │ │ │ +
│ │ │ │ +
128
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
131 {
│ │ │ │ +
132 if (! empty())
│ │ │ │ +
133 {
│ │ │ │ +
134 size_--;
│ │ │ │ +
135 first_ = (++first_) % n;
│ │ │ │ +
136 }
│ │ │ │ +
137 }
│ │ │ │ +
│ │ │ │ +
138
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
141 return iterator(*this, 0);
│ │ │ │ +
142 }
│ │ │ │ +
│ │ │ │ +
143
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
146 return const_iterator(*this, 0);
│ │ │ │ +
147 }
│ │ │ │ +
│ │ │ │ +
148
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
151 return iterator(*this, size_);
│ │ │ │ +
152 }
│ │ │ │ +
│ │ │ │ +
153
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
156 return const_iterator(*this, size_);
│ │ │ │ +
157 }
│ │ │ │ +
│ │ │ │ +
158
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
161 {
│ │ │ │ +
162 CHECKSIZE(size_>i);
│ │ │ │ +
163 return data_[(first_ + i) % n];
│ │ │ │ +
164 }
│ │ │ │ +
│ │ │ │ +
165
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
168 {
│ │ │ │ +
169 CHECKSIZE(size_>i);
│ │ │ │ +
170 return data_[(first_ + i) % n];
│ │ │ │ +
171 }
│ │ │ │ +
│ │ │ │ +
172
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
175 {
│ │ │ │ +
176 CHECKSIZE(size_>0);
│ │ │ │ +
177 return data_[first_];
│ │ │ │ +
178 }
│ │ │ │ +
│ │ │ │ +
179
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
182 {
│ │ │ │ +
183 CHECKSIZE(size_>0);
│ │ │ │ +
184 return data_[first_];
│ │ │ │ +
185 }
│ │ │ │
│ │ │ │ -
185
│ │ │ │
186
│ │ │ │ -
187
│ │ │ │ -
188}} // namespace Dune::Functions
│ │ │ │ -
189
│ │ │ │ -
190
│ │ │ │ -
191
│ │ │ │ -
192#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +
│ │ │ │ + │ │ │ │ +
189 {
│ │ │ │ +
190 CHECKSIZE(size_>0);
│ │ │ │ +
191 return data_[(first_ + size_-1) % n];
│ │ │ │ +
192 }
│ │ │ │ +
│ │ │ │ +
193
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
196 {
│ │ │ │ +
197 CHECKSIZE(size_>0);
│ │ │ │ +
198 return data_[(first_ + size_-1) % n];
│ │ │ │ +
199 }
│ │ │ │ +
│ │ │ │ +
200
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
207 {
│ │ │ │ +
208 return size_;
│ │ │ │ +
209 }
│ │ │ │ +
│ │ │ │ +
210
│ │ │ │ +
│ │ │ │ +
212 bool empty() const
│ │ │ │ +
213 {
│ │ │ │ +
214 return size_==0;
│ │ │ │ +
215 }
│ │ │ │ +
│ │ │ │ +
216
│ │ │ │ +
│ │ │ │ +
218 static constexpr size_type capacity()
│ │ │ │ +
219 {
│ │ │ │ +
220 return n;
│ │ │ │ +
221 }
│ │ │ │ +
│ │ │ │ +
222
│ │ │ │ +
│ │ │ │ +
224 static constexpr size_type max_size()
│ │ │ │ +
225 {
│ │ │ │ +
226 return n;
│ │ │ │ +
227 }
│ │ │ │ +
│ │ │ │ +
228
│ │ │ │ +
│ │ │ │ +
232 friend std::ostream& operator<< (std::ostream& s, const ReservedDeque& v)
│ │ │ │ +
233 {
│ │ │ │ +
234 for (size_t i=0; i<v.size(); i++)
│ │ │ │ +
235 s << v[i] << " ";
│ │ │ │ +
236 return s;
│ │ │ │ +
237 }
│ │ │ │ +
│ │ │ │ +
238
│ │ │ │ +
239 private:
│ │ │ │ +
240 T data_[n];
│ │ │ │ +
241 size_type first_;
│ │ │ │ +
242 size_type size_;
│ │ │ │ +
243 };
│ │ │ │ +
│ │ │ │ +
244
│ │ │ │ +
245} // end namespace Functions
│ │ │ │ +
246} // end namespace Dune
│ │ │ │ +
247
│ │ │ │ +
248#undef CHECKSIZE
│ │ │ │ +
249
│ │ │ │ +
250#endif // DUNE_FUNCTIONS_COMMON_RESERVEDDEQUE_HH
│ │ │ │ +
#define CHECKSIZE(X)
Definition reserveddeque.hh:24
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
Definition localfunction.hh:34
│ │ │ │ -
Base class for type-erased interface wrapper.
Definition typeerasure.hh:169
│ │ │ │ -
Definition gridfunction.hh:36
│ │ │ │ -
friend DerivativeInterface derivative(const GridFunction &t)
Get derivative of wrapped function.
Definition gridfunction.hh:155
│ │ │ │ - │ │ │ │ -
const EntitySet & entitySet() const
Get associated EntitySet.
Definition gridfunction.hh:180
│ │ │ │ -
GridFunction(F &&f)
Construct from function.
Definition gridfunction.hh:129
│ │ │ │ -
friend LocalFunctionInterface localFunction(const GridFunction &t)
Get local function of wrapped function.
Definition gridfunction.hh:169
│ │ │ │ -
Derivative traits for local functions.
Definition localderivativetraits.hh:32
│ │ │ │ +
A double-ended queue (deque) class with statically reserved memory.
Definition reserveddeque.hh:49
│ │ │ │ +
void pop_front()
Erases the first element of the vector, O(1) time.
Definition reserveddeque.hh:130
│ │ │ │ +
static constexpr size_type capacity()
Returns current capacity (allocated memory) of the vector.
Definition reserveddeque.hh:218
│ │ │ │ +
void clear()
Erases all elements.
Definition reserveddeque.hh:93
│ │ │ │ +
Dune::GenericIterator< ReservedDeque, value_type > iterator
Iterator used to iterate through a vector.
Definition reserveddeque.hh:67
│ │ │ │ +
T value_type
The type of object, T, stored in the vector.
Definition reserveddeque.hh:55
│ │ │ │ +
ReservedDeque()
Constructor.
Definition reserveddeque.hh:76
│ │ │ │ +
bool empty() const
Returns true if vector has no elements.
Definition reserveddeque.hh:212
│ │ │ │ +
const_reference back() const
Returns const reference to last element of vector.
Definition reserveddeque.hh:195
│ │ │ │ +
friend std::ostream & operator<<(std::ostream &s, const ReservedDeque &v)
Send ReservedDeque to an output stream.
Definition reserveddeque.hh:232
│ │ │ │ +
void push_front(const T &t)
Prepends an element to the begin of a deque if size<capacity, O(1) time.
Definition reserveddeque.hh:114
│ │ │ │ +
reference operator[](size_type i)
Returns reference to the i'th element.
Definition reserveddeque.hh:160
│ │ │ │ +
reference front()
Returns reference to first element of vector.
Definition reserveddeque.hh:174
│ │ │ │ +
T * pointer
Pointer to T.
Definition reserveddeque.hh:57
│ │ │ │ +
const_reference front() const
Returns const reference to first element of vector.
Definition reserveddeque.hh:181
│ │ │ │ +
iterator end()
Returns an iterator pointing to the end of the vector.
Definition reserveddeque.hh:150
│ │ │ │ +
reference back()
Returns reference to last element of vector.
Definition reserveddeque.hh:188
│ │ │ │ +
void pop_back()
Erases the last element of the vector, O(1) time.
Definition reserveddeque.hh:123
│ │ │ │ +
const T & const_reference
Const reference to T.
Definition reserveddeque.hh:61
│ │ │ │ +
static constexpr size_type max_size()
Returns the maximum length of the vector.
Definition reserveddeque.hh:224
│ │ │ │ +
std::ptrdiff_t difference_type
A signed integral type.
Definition reserveddeque.hh:65
│ │ │ │ +
T & reference
Reference to T.
Definition reserveddeque.hh:59
│ │ │ │ +
Dune::GenericIterator< const ReservedDeque, const value_type > const_iterator
Const iterator used to iterate through a vector.
Definition reserveddeque.hh:69
│ │ │ │ +
size_type size() const
Returns number of elements in the vector.
Definition reserveddeque.hh:206
│ │ │ │ +
const_iterator end() const
Returns a const_iterator pointing to the end of the vector.
Definition reserveddeque.hh:155
│ │ │ │ +
void resize(size_t s)
Specifies a new size for the vector.
Definition reserveddeque.hh:100
│ │ │ │ +
iterator begin()
Returns a iterator pointing to the beginning of the vector.
Definition reserveddeque.hh:140
│ │ │ │ +
const_iterator begin() const
Returns a const_iterator pointing to the beginning of the vector.
Definition reserveddeque.hh:145
│ │ │ │ +
ReservedDeque(std::initializer_list< T > const &l)
Definition reserveddeque.hh:81
│ │ │ │ +
size_t size_type
An unsigned integral type.
Definition reserveddeque.hh:63
│ │ │ │ +
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:107
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,203 +1,324 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ -gridfunction.hh │ │ │ │ │ + * _c_o_m_m_o_n │ │ │ │ │ +reserveddeque.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_COMMON_RESERVEDDEQUE_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_COMMON_RESERVEDDEQUE_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11 │ │ │ │ │ -12#include │ │ │ │ │ -13 │ │ │ │ │ -14#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e_e_r_a_s_u_r_e_._h_h> │ │ │ │ │ -15#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ -17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_l_o_c_a_l_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ -18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ -19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_l_o_c_a_l_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n___i_m_p_._h_h> │ │ │ │ │ -21 │ │ │ │ │ -22 │ │ │ │ │ -23 │ │ │ │ │ -24namespace _D_u_n_e { │ │ │ │ │ -25namespace Functions { │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17#include │ │ │ │ │ +18 │ │ │ │ │ +19#include │ │ │ │ │ +20 │ │ │ │ │ +21#ifdef CHECK_RESERVEDDEQUE │ │ │ │ │ +22#define CHECKSIZE(X) assert(X) │ │ │ │ │ +23#else │ │ │ │ │ +_2_4#define CHECKSIZE(X) {} │ │ │ │ │ +25#endif │ │ │ │ │ 26 │ │ │ │ │ -27 │ │ │ │ │ -28 │ │ │ │ │ -29/* │ │ │ │ │ -30 * Default implementation is empty │ │ │ │ │ -31 * The actual implementation is only given if Signature is an type │ │ │ │ │ -32 * describing a function signature as Range(Domain). │ │ │ │ │ -33 */ │ │ │ │ │ -34template class │ │ │ │ │ -DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56> │ │ │ │ │ -_3_5class _G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ -36{}; │ │ │ │ │ -37 │ │ │ │ │ -38 │ │ │ │ │ -39 │ │ │ │ │ -40namespace Imp │ │ │ │ │ -41{ │ │ │ │ │ -42 │ │ │ │ │ -44 template class DerivativeTraits, size_t │ │ │ │ │ -bufferSize> │ │ │ │ │ -45 struct GridFunctionTraits : │ │ │ │ │ -46 DifferentiableFunctionTraits │ │ │ │ │ -47 { │ │ │ │ │ -48 protected: │ │ │ │ │ -49 using Base=DifferentiableFunctionTraits; │ │ │ │ │ -50 │ │ │ │ │ -51 public: │ │ │ │ │ -53 using EntitySet = ES; │ │ │ │ │ -54 │ │ │ │ │ -56 using Element = typename EntitySet::Element; │ │ │ │ │ -57 │ │ │ │ │ -59 using DerivativeSignature = typename Base::DerivativeSignature; │ │ │ │ │ -60 │ │ │ │ │ -62 using DerivativeInterface = _G_r_i_d_F_u_n_c_t_i_o_n_<_D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_,_ _E_S_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _b_u_f_f_e_r_S_i_z_e_>; │ │ │ │ │ -63 │ │ │ │ │ -65 using LocalSignature = typename Base::Range(typename EntitySet:: │ │ │ │ │ -LocalCoordinate); │ │ │ │ │ -66 │ │ │ │ │ -68 template │ │ │ │ │ -69 using _L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s = typename _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_: │ │ │ │ │ -_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_E_n_t_i_t_y_S_e_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_>_:_:_t_e_m_p_l_a_t_e Traits; │ │ │ │ │ +27namespace _D_u_n_e { │ │ │ │ │ +28namespace Functions { │ │ │ │ │ +29 │ │ │ │ │ +47 template │ │ │ │ │ +_4_8 class _R_e_s_e_r_v_e_d_D_e_q_u_e │ │ │ │ │ +49 { │ │ │ │ │ +50 public: │ │ │ │ │ +51 │ │ │ │ │ +_5_5 typedef T _v_a_l_u_e___t_y_p_e; │ │ │ │ │ +_5_7 typedef T* _p_o_i_n_t_e_r; │ │ │ │ │ +_5_9 typedef T& _r_e_f_e_r_e_n_c_e; │ │ │ │ │ +_6_1 typedef const T& _c_o_n_s_t___r_e_f_e_r_e_n_c_e; │ │ │ │ │ +_6_3 typedef size_t _s_i_z_e___t_y_p_e; │ │ │ │ │ +_6_5 typedef std::ptrdiff_t _d_i_f_f_e_r_e_n_c_e___t_y_p_e; │ │ │ │ │ +_6_7 typedef Dune::GenericIterator _i_t_e_r_a_t_o_r; │ │ │ │ │ +_6_9 typedef Dune::GenericIterator │ │ │ │ │ +_c_o_n_s_t___i_t_e_r_a_t_o_r; │ │ │ │ │ 70 │ │ │ │ │ -72 using LocalFunctionTraits = typename Dune::Functions::Imp:: │ │ │ │ │ -LocalFunctionTraits; │ │ │ │ │ -73 │ │ │ │ │ -75 using LocalFunctionInterface = _L_o_c_a_l_F_u_n_c_t_i_o_n_<_L_o_c_a_l_S_i_g_n_a_t_u_r_e_,_ _E_l_e_m_e_n_t_, │ │ │ │ │ -_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _b_u_f_f_e_r_S_i_z_e_>; │ │ │ │ │ -76 │ │ │ │ │ -78 using Concept = GridFunctionWrapperInterface; │ │ │ │ │ -79 │ │ │ │ │ -81 template │ │ │ │ │ -82 using Model = GridFunctionWrapperImplementation; │ │ │ │ │ -83 }; │ │ │ │ │ -84} │ │ │ │ │ -85 │ │ │ │ │ -86 │ │ │ │ │ +_7_6 _R_e_s_e_r_v_e_d_D_e_q_u_e() : │ │ │ │ │ +77 size_(0), │ │ │ │ │ +78 first_(0) │ │ │ │ │ +79 {} │ │ │ │ │ +80 │ │ │ │ │ +_8_1 _R_e_s_e_r_v_e_d_D_e_q_u_e(std::initializer_list const &l) │ │ │ │ │ +82 { │ │ │ │ │ +83 assert(l.size() <= n);// Actually, this is not needed any more! │ │ │ │ │ +84 size_ = l.size(); │ │ │ │ │ +85 std::copy_n(l.begin(), size_, data_); │ │ │ │ │ +86 } │ │ │ │ │ 87 │ │ │ │ │ -99template class │ │ │ │ │ -DerivativeTraits, size_t bufferSize> │ │ │ │ │ -_1_0_0class _G_r_i_d_F_u_n_c_t_i_o_n : │ │ │ │ │ -101 public _T_y_p_e_E_r_a_s_u_r_e_B_a_s_e< │ │ │ │ │ -102 typename Imp::GridFunctionTraits::Concept, │ │ │ │ │ -103 Imp::GridFunctionTraits:: │ │ │ │ │ -template Model> │ │ │ │ │ -104{ │ │ │ │ │ -105 using Traits = Imp::GridFunctionTraits; │ │ │ │ │ -106 │ │ │ │ │ -107 using _B_a_s_e = _T_y_p_e_E_r_a_s_u_r_e_B_a_s_e_<_t_y_p_e_n_a_m_e_ _T_r_a_i_t_s_:_:_C_o_n_c_e_p_t_,_ _T_r_a_i_t_s_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ -_M_o_d_e_l_>; │ │ │ │ │ -108 │ │ │ │ │ -109 using DerivativeInterface = typename _T_r_a_i_t_s_:_:_D_e_r_i_v_a_t_i_v_e_I_n_t_e_r_f_a_c_e; │ │ │ │ │ -110 │ │ │ │ │ -111 using LocalFunctionInterface = typename _T_r_a_i_t_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_I_n_t_e_r_f_a_c_e; │ │ │ │ │ +_9_3 void _c_l_e_a_r() │ │ │ │ │ +94 { │ │ │ │ │ +95 first_ = 0; │ │ │ │ │ +96 size_ = 0; │ │ │ │ │ +97 } │ │ │ │ │ +98 │ │ │ │ │ +_1_0_0 void _r_e_s_i_z_e(size_t s) │ │ │ │ │ +101 { │ │ │ │ │ +102 _C_H_E_C_K_S_I_Z_E(s<=n); │ │ │ │ │ +103 size_ = s; │ │ │ │ │ +104 } │ │ │ │ │ +105 │ │ │ │ │ +_1_0_7 void _p_u_s_h___b_a_c_k(const T& t) │ │ │ │ │ +108 { │ │ │ │ │ +109 _C_H_E_C_K_S_I_Z_E(size_ = 0 > │ │ │ │ │ -_1_2_9 _G_r_i_d_F_u_n_c_t_i_o_n(F&& f) : │ │ │ │ │ -130 _B_a_s_e(std::forward(f)) │ │ │ │ │ +_1_1_4 void _p_u_s_h___f_r_o_n_t(const T& t) │ │ │ │ │ +115 { │ │ │ │ │ +116 _C_H_E_C_K_S_I_Z_E(size_(), "Trying to construct a GridFunction from type that does not model │ │ │ │ │ -the GridFunction concept"); │ │ │ │ │ -133 } │ │ │ │ │ -134 │ │ │ │ │ -_1_3_5 _G_r_i_d_F_u_n_c_t_i_o_n() = default; │ │ │ │ │ -136 │ │ │ │ │ -_1_4_2 Range operator() (const Domain& x) const │ │ │ │ │ -143 { │ │ │ │ │ -144 return this->asInterface().operator()(x); │ │ │ │ │ -145 } │ │ │ │ │ -146 │ │ │ │ │ -_1_5_5 friend DerivativeInterface _d_e_r_i_v_a_t_i_v_e(const _G_r_i_d_F_u_n_c_t_i_o_n& t) │ │ │ │ │ -156 { │ │ │ │ │ -157 return t.asInterface().derivative(); │ │ │ │ │ -158 } │ │ │ │ │ -159 │ │ │ │ │ -_1_6_9 friend LocalFunctionInterface _l_o_c_a_l_F_u_n_c_t_i_o_n(const _G_r_i_d_F_u_n_c_t_i_o_n& t) │ │ │ │ │ -170 { │ │ │ │ │ -171 return t.asInterface().wrappedLocalFunction(); │ │ │ │ │ -172 } │ │ │ │ │ -173 │ │ │ │ │ -_1_8_0 const EntitySet& _e_n_t_i_t_y_S_e_t() const │ │ │ │ │ -181 { │ │ │ │ │ -182 return this->asInterface().wrappedEntitySet(); │ │ │ │ │ -183 } │ │ │ │ │ -184}; │ │ │ │ │ -185 │ │ │ │ │ +132 if (! _e_m_p_t_y()) │ │ │ │ │ +133 { │ │ │ │ │ +134 size_--; │ │ │ │ │ +135 first_ = (++first_) % n; │ │ │ │ │ +136 } │ │ │ │ │ +137 } │ │ │ │ │ +138 │ │ │ │ │ +_1_4_0 _i_t_e_r_a_t_o_r _b_e_g_i_n(){ │ │ │ │ │ +141 return _i_t_e_r_a_t_o_r(*this, 0); │ │ │ │ │ +142 } │ │ │ │ │ +143 │ │ │ │ │ +_1_4_5 _c_o_n_s_t___i_t_e_r_a_t_o_r _b_e_g_i_n() const { │ │ │ │ │ +146 return _c_o_n_s_t___i_t_e_r_a_t_o_r(*this, 0); │ │ │ │ │ +147 } │ │ │ │ │ +148 │ │ │ │ │ +_1_5_0 _i_t_e_r_a_t_o_r _e_n_d(){ │ │ │ │ │ +151 return _i_t_e_r_a_t_o_r(*this, size_); │ │ │ │ │ +152 } │ │ │ │ │ +153 │ │ │ │ │ +_1_5_5 _c_o_n_s_t___i_t_e_r_a_t_o_r _e_n_d() const { │ │ │ │ │ +156 return _c_o_n_s_t___i_t_e_r_a_t_o_r(*this, size_); │ │ │ │ │ +157 } │ │ │ │ │ +158 │ │ │ │ │ +_1_6_0 _r_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_[_]_ (_s_i_z_e___t_y_p_e i) │ │ │ │ │ +161 { │ │ │ │ │ +162 _C_H_E_C_K_S_I_Z_E(size_>i); │ │ │ │ │ +163 return data_[(first_ + i) % n]; │ │ │ │ │ +164 } │ │ │ │ │ +165 │ │ │ │ │ +_1_6_7 _c_o_n_s_t___r_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_[_]_ (_s_i_z_e___t_y_p_e i) const │ │ │ │ │ +168 { │ │ │ │ │ +169 _C_H_E_C_K_S_I_Z_E(size_>i); │ │ │ │ │ +170 return data_[(first_ + i) % n]; │ │ │ │ │ +171 } │ │ │ │ │ +172 │ │ │ │ │ +_1_7_4 _r_e_f_e_r_e_n_c_e _f_r_o_n_t() │ │ │ │ │ +175 { │ │ │ │ │ +176 _C_H_E_C_K_S_I_Z_E(size_>0); │ │ │ │ │ +177 return data_[first_]; │ │ │ │ │ +178 } │ │ │ │ │ +179 │ │ │ │ │ +_1_8_1 _c_o_n_s_t___r_e_f_e_r_e_n_c_e _f_r_o_n_t() const │ │ │ │ │ +182 { │ │ │ │ │ +183 _C_H_E_C_K_S_I_Z_E(size_>0); │ │ │ │ │ +184 return data_[first_]; │ │ │ │ │ +185 } │ │ │ │ │ 186 │ │ │ │ │ -187 │ │ │ │ │ -188}} // namespace Dune::Functions │ │ │ │ │ -189 │ │ │ │ │ -190 │ │ │ │ │ -191 │ │ │ │ │ -192#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_HH │ │ │ │ │ -_l_o_c_a_l_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h │ │ │ │ │ -_g_r_i_d_f_u_n_c_t_i_o_n___i_m_p_._h_h │ │ │ │ │ -_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ -_t_y_p_e_e_r_a_s_u_r_e_._h_h │ │ │ │ │ -_l_o_c_a_l_f_u_n_c_t_i_o_n_._h_h │ │ │ │ │ -_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h │ │ │ │ │ -_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h │ │ │ │ │ +_1_8_8 _r_e_f_e_r_e_n_c_e _b_a_c_k() │ │ │ │ │ +189 { │ │ │ │ │ +190 _C_H_E_C_K_S_I_Z_E(size_>0); │ │ │ │ │ +191 return data_[(first_ + size_-1) % n]; │ │ │ │ │ +192 } │ │ │ │ │ +193 │ │ │ │ │ +_1_9_5 _c_o_n_s_t___r_e_f_e_r_e_n_c_e _b_a_c_k() const │ │ │ │ │ +196 { │ │ │ │ │ +197 _C_H_E_C_K_S_I_Z_E(size_>0); │ │ │ │ │ +198 return data_[(first_ + size_-1) % n]; │ │ │ │ │ +199 } │ │ │ │ │ +200 │ │ │ │ │ +_2_0_6 _s_i_z_e___t_y_p_e _s_i_z_e () const │ │ │ │ │ +207 { │ │ │ │ │ +208 return size_; │ │ │ │ │ +209 } │ │ │ │ │ +210 │ │ │ │ │ +_2_1_2 bool _e_m_p_t_y() const │ │ │ │ │ +213 { │ │ │ │ │ +214 return size_==0; │ │ │ │ │ +215 } │ │ │ │ │ +216 │ │ │ │ │ +_2_1_8 static constexpr _s_i_z_e___t_y_p_e _c_a_p_a_c_i_t_y() │ │ │ │ │ +219 { │ │ │ │ │ +220 return n; │ │ │ │ │ +221 } │ │ │ │ │ +222 │ │ │ │ │ +_2_2_4 static constexpr _s_i_z_e___t_y_p_e _m_a_x___s_i_z_e() │ │ │ │ │ +225 { │ │ │ │ │ +226 return n; │ │ │ │ │ +227 } │ │ │ │ │ +228 │ │ │ │ │ +_2_3_2 friend std::ostream& _o_p_e_r_a_t_o_r_<_<_ (std::ostream& s, const _R_e_s_e_r_v_e_d_D_e_q_u_e& v) │ │ │ │ │ +233 { │ │ │ │ │ +234 for (size_t i=0; i_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ -friend DerivativeInterface derivative(const GridFunction &t) │ │ │ │ │ -Get derivative of wrapped function. │ │ │ │ │ -DDeeffiinniittiioonn gridfunction.hh:155 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_S_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _b_u_f_f_e_r_S_i_z_e │ │ │ │ │ -_>_:_:_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ -GridFunction()=default │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_S_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _b_u_f_f_e_r_S_i_z_e │ │ │ │ │ -_>_:_:_e_n_t_i_t_y_S_e_t │ │ │ │ │ -const EntitySet & entitySet() const │ │ │ │ │ -Get associated EntitySet. │ │ │ │ │ -DDeeffiinniittiioonn gridfunction.hh:180 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_S_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _b_u_f_f_e_r_S_i_z_e │ │ │ │ │ -_>_:_:_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ -GridFunction(F &&f) │ │ │ │ │ -Construct from function. │ │ │ │ │ -DDeeffiinniittiioonn gridfunction.hh:129 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_S_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _b_u_f_f_e_r_S_i_z_e │ │ │ │ │ -_>_:_:_l_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ -friend LocalFunctionInterface localFunction(const GridFunction &t) │ │ │ │ │ -Get local function of wrapped function. │ │ │ │ │ -DDeeffiinniittiioonn gridfunction.hh:169 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ -Derivative traits for local functions. │ │ │ │ │ -DDeeffiinniittiioonn localderivativetraits.hh:32 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e │ │ │ │ │ +A double-ended queue (deque) class with statically reserved memory. │ │ │ │ │ +DDeeffiinniittiioonn reserveddeque.hh:49 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_p_o_p___f_r_o_n_t │ │ │ │ │ +void pop_front() │ │ │ │ │ +Erases the first element of the vector, O(1) time. │ │ │ │ │ +DDeeffiinniittiioonn reserveddeque.hh:130 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_c_a_p_a_c_i_t_y │ │ │ │ │ +static constexpr size_type capacity() │ │ │ │ │ +Returns current capacity (allocated memory) of the vector. │ │ │ │ │ +DDeeffiinniittiioonn reserveddeque.hh:218 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_c_l_e_a_r │ │ │ │ │ +void clear() │ │ │ │ │ +Erases all elements. │ │ │ │ │ +DDeeffiinniittiioonn reserveddeque.hh:93 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +Dune::GenericIterator< ReservedDeque, value_type > iterator │ │ │ │ │ +Iterator used to iterate through a vector. │ │ │ │ │ +DDeeffiinniittiioonn reserveddeque.hh:67 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ +T value_type │ │ │ │ │ +The type of object, T, stored in the vector. │ │ │ │ │ +DDeeffiinniittiioonn reserveddeque.hh:55 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e │ │ │ │ │ +ReservedDeque() │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn reserveddeque.hh:76 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_e_m_p_t_y │ │ │ │ │ +bool empty() const │ │ │ │ │ +Returns true if vector has no elements. │ │ │ │ │ +DDeeffiinniittiioonn reserveddeque.hh:212 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_b_a_c_k │ │ │ │ │ +const_reference back() const │ │ │ │ │ +Returns const reference to last element of vector. │ │ │ │ │ +DDeeffiinniittiioonn reserveddeque.hh:195 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ +friend std::ostream & operator<<(std::ostream &s, const ReservedDeque &v) │ │ │ │ │ +Send ReservedDeque to an output stream. │ │ │ │ │ +DDeeffiinniittiioonn reserveddeque.hh:232 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_p_u_s_h___f_r_o_n_t │ │ │ │ │ +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. │ │ │ │ │ +DDeeffiinniittiioonn reserveddeque.hh:69 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_s_i_z_e │ │ │ │ │ +size_type size() const │ │ │ │ │ +Returns number of elements in the vector. │ │ │ │ │ +DDeeffiinniittiioonn reserveddeque.hh:206 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_e_n_d │ │ │ │ │ +const_iterator end() const │ │ │ │ │ +Returns a const_iterator pointing to the end of the vector. │ │ │ │ │ +DDeeffiinniittiioonn reserveddeque.hh:155 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_r_e_s_i_z_e │ │ │ │ │ +void resize(size_t s) │ │ │ │ │ +Specifies a new size for the vector. │ │ │ │ │ +DDeeffiinniittiioonn reserveddeque.hh:100 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_b_e_g_i_n │ │ │ │ │ +iterator begin() │ │ │ │ │ +Returns a iterator pointing to the beginning of the vector. │ │ │ │ │ +DDeeffiinniittiioonn reserveddeque.hh:140 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_b_e_g_i_n │ │ │ │ │ +const_iterator begin() const │ │ │ │ │ +Returns a const_iterator pointing to the beginning of the vector. │ │ │ │ │ +DDeeffiinniittiioonn reserveddeque.hh:145 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e │ │ │ │ │ +ReservedDeque(std::initializer_list< T > const &l) │ │ │ │ │ +DDeeffiinniittiioonn reserveddeque.hh:81 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +size_t size_type │ │ │ │ │ +An unsigned integral type. │ │ │ │ │ +DDeeffiinniittiioonn reserveddeque.hh:63 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_p_u_s_h___b_a_c_k │ │ │ │ │ +void push_back(const T &t) │ │ │ │ │ +Appends an element to the end of a vector, up to the maximum size n, O(1) time. │ │ │ │ │ +DDeeffiinniittiioonn reserveddeque.hh:107 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00020.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: composedgridfunction.hh File Reference │ │ │ │ +dune-functions: differentiablefunction.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,57 +65,49 @@ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
composedgridfunction.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
differentiablefunction.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 <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.

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

│ │ │ │ Classes

class  Dune::Functions::ComposedGridFunction< OF, IF >
 Composition of grid functions with another function. 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
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<class OF , class... IF>
 Dune::Functions::ComposedGridFunction (const OF &, const IF &...) -> ComposedGridFunction< OF, IF... >
 
template<class OF , class... IF>
auto Dune::Functions::makeComposedGridFunction (OF &&outerFunction, IF &&... innerFunction)
 Create a ComposedGridFunction that composes grid-functions with another function.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,39 +1,33 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -composedgridfunction.hh File Reference │ │ │ │ │ + * _c_o_m_m_o_n │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +differentiablefunction.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ #include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n___i_m_p_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_s_i_g_n_a_t_u_r_e_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e_e_r_a_s_u_r_e_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_<_ _O_F_,_ _I_F_ _> │ │ │ │ │ -  Composition of grid functions with another function. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_ _S_i_g_n_a_t_u_r_e_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ + _b_u_f_f_e_r_S_i_z_e_ _> │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ + _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _b_u_f_f_e_r_S_i_z_e_ _> │ │ │ │ │ +  Class storing differentiable functions using type erasure. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n (const OF &, const IF &...) - │ │ │ │ │ - > _C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n< OF, IF... > │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n (OF &&outerFunction, IF &&... │ │ │ │ │ - innerFunction) │ │ │ │ │ -  Create a _C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n that composes grid-functions with another │ │ │ │ │ - function. │ │ │ │ │ -  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00020_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: composedgridfunction.hh Source File │ │ │ │ +dune-functions: differentiablefunction.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,225 +70,146 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
composedgridfunction.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH
│ │ │ │
9
│ │ │ │
10#include <type_traits>
│ │ │ │ -
11#include <tuple>
│ │ │ │ -
12
│ │ │ │ -
13#include <dune/common/referencehelper.hh>
│ │ │ │ -
14#include <dune/common/typeutilities.hh>
│ │ │ │ -
15
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
19
│ │ │ │ +
11
│ │ │ │ +
12#include <dune/common/typeutilities.hh>
│ │ │ │ +
13
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
20
│ │ │ │
21namespace Dune {
│ │ │ │
22namespace Functions {
│ │ │ │
23
│ │ │ │
24
│ │ │ │
25
│ │ │ │ -
44template<class OF, class... IF>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
46{
│ │ │ │ -
47 using InnerFunctions = std::tuple<IF...>;
│ │ │ │ -
48 using InnerLocalFunctions = std::tuple<decltype(localFunction(resolveRef(std::declval<const IF&>())))...>;
│ │ │ │ +
26/*
│ │ │ │ +
27 * Default implementation is empty
│ │ │ │ +
28 * The actual implementation is only given if Signature is an type
│ │ │ │ +
29 * describing a function signature as Range(Domain).
│ │ │ │ +
30 */
│ │ │ │ +
31template<class Signature, template<class> class DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
33{};
│ │ │ │ +
│ │ │ │ +
34
│ │ │ │ +
35
│ │ │ │ +
36
│ │ │ │ +
37namespace Imp
│ │ │ │ +
38{
│ │ │ │ +
39
│ │ │ │ +
41 template<class S, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ +
42 struct DifferentiableFunctionTraits
│ │ │ │ +
43 {
│ │ │ │ +
45 using Signature = S;
│ │ │ │ +
46
│ │ │ │ +
48 using Range = typename SignatureTraits<Signature>::Range;
│ │ │ │
49
│ │ │ │ -
50 template<std::size_t i>
│ │ │ │ -
51 using InnerFunction = std::decay_t<ResolveRef_t<std::tuple_element_t<i, InnerFunctions>>>;
│ │ │ │ +
51 using Domain = typename SignatureTraits<Signature>::Domain;
│ │ │ │
52
│ │ │ │ -
53 using OuterFunction = OF;
│ │ │ │ -
54
│ │ │ │ -
55public:
│ │ │ │ -
56
│ │ │ │ -
57 using EntitySet = typename InnerFunction<0>::EntitySet;
│ │ │ │ -
58 using Element = typename EntitySet::Element;
│ │ │ │ -
59
│ │ │ │ -
60 using Domain = typename EntitySet::GlobalCoordinate;
│ │ │ │ -
61 using LocalDomain = typename EntitySet::LocalCoordinate;
│ │ │ │ -
62
│ │ │ │ -
63 using Range = decltype(std::declval<OF>()(std::declval<IF>()(std::declval<Domain>())...));
│ │ │ │ -
64
│ │ │ │ -
65private:
│ │ │ │ -
66
│ │ │ │ -
67 using Traits = Imp::GridFunctionTraits<Range(Domain), EntitySet, DefaultDerivativeTraits, 16>;
│ │ │ │ +
54 using DerivativeSignature = typename SignatureTraits<Signature>::template DerivativeSignature<DerivativeTraits>;
│ │ │ │ +
55
│ │ │ │ + │ │ │ │ +
58
│ │ │ │ +
60 using Concept = DifferentiableFunctionWrapperInterface<Signature, DerivativeInterface>;
│ │ │ │ +
61
│ │ │ │ +
63 template<class B>
│ │ │ │ +
64 using Model = DifferentiableFunctionWrapperImplementation<Signature, DerivativeInterface, B>;
│ │ │ │ +
65 };
│ │ │ │ +
66}
│ │ │ │ +
67
│ │ │ │
68
│ │ │ │ -
69 class LocalFunction
│ │ │ │ -
70 {
│ │ │ │ -
71 public:
│ │ │ │ -
78 LocalFunction(const ComposedGridFunction& globalFunction) :
│ │ │ │ -
79 globalFunction_(globalFunction),
│ │ │ │ -
80 innerLocalFunctions_(globalFunction.innerLocalFunctions())
│ │ │ │ -
81 {}
│ │ │ │ -
82
│ │ │ │ -
92 void bind(const Element& element)
│ │ │ │ -
93 {
│ │ │ │ -
94 std::apply([&](auto&... innerFunction) {
│ │ │ │ -
95 (innerFunction.bind(element),...);
│ │ │ │ -
96 }, innerLocalFunctions_);
│ │ │ │ -
97 }
│ │ │ │ -
98
│ │ │ │ -
100 void unbind()
│ │ │ │ -
101 {
│ │ │ │ -
102 std::apply([&](auto&... innerFunction) {
│ │ │ │ -
103 (innerFunction.unbind(),...);
│ │ │ │ -
104 }, innerLocalFunctions_);
│ │ │ │ -
105 }
│ │ │ │ -
106
│ │ │ │ -
109 bool bound() const
│ │ │ │ -
110 {
│ │ │ │ -
111 return std::apply([](const auto&... innerFunction) {
│ │ │ │ -
112 return (innerFunction.bound() && ...);
│ │ │ │ -
113 }, innerLocalFunctions_);
│ │ │ │ -
114 }
│ │ │ │ +
69
│ │ │ │ +
84template<class Range, class Domain, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ +
│ │ │ │ +
85class DifferentiableFunction< Range(Domain), DerivativeTraits, bufferSize> :
│ │ │ │ +
86 public TypeErasureBase<
│ │ │ │ +
87 typename Imp::DifferentiableFunctionTraits<Range(Domain), DerivativeTraits, bufferSize>::Concept,
│ │ │ │ +
88 Imp::DifferentiableFunctionTraits<Range(Domain), DerivativeTraits, bufferSize>::template Model>
│ │ │ │ +
89{
│ │ │ │ +
90 using Traits = Imp::DifferentiableFunctionTraits<Range(Domain), DerivativeTraits, bufferSize>;
│ │ │ │ +
91
│ │ │ │ + │ │ │ │ +
93
│ │ │ │ +
94 using DerivativeInterface = typename Traits::DerivativeInterface;
│ │ │ │ +
95
│ │ │ │ +
96public:
│ │ │ │ +
97
│ │ │ │ +
109 template<class F, disableCopyMove<DifferentiableFunction, F> = 0 >
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
111 Base(std::forward<F>(f))
│ │ │ │ +
112 {
│ │ │ │ +
113 static_assert(Dune::Functions::Concept::isFunction<F, Range(Domain)>(), "Trying to construct a DifferentiableFunction from type that does not model the Function concept");
│ │ │ │ +
114 }
│ │ │ │ +
│ │ │ │
115
│ │ │ │ -
125 Range operator()(const LocalDomain& x) const
│ │ │ │ -
126 {
│ │ │ │ -
127 return std::apply([&](const auto&... innerFunction) {
│ │ │ │ -
128 return globalFunction_.outerFunction_(innerFunction(x)...);
│ │ │ │ -
129 }, innerLocalFunctions_);
│ │ │ │ -
130 }
│ │ │ │ -
131
│ │ │ │ -
141 const Element& localContext() const
│ │ │ │ -
142 {
│ │ │ │ -
143 return std::get<0>(innerLocalFunctions_).localContext();
│ │ │ │ -
144 }
│ │ │ │ + │ │ │ │ +
118
│ │ │ │ +
│ │ │ │ +
122 Range operator() (const Domain& x) const
│ │ │ │ +
123 {
│ │ │ │ +
124 return this->asInterface().operator()(x);
│ │ │ │ +
125 }
│ │ │ │ +
│ │ │ │ +
126
│ │ │ │ +
│ │ │ │ +
134 friend DerivativeInterface derivative(const DifferentiableFunction& t)
│ │ │ │ +
135 {
│ │ │ │ +
136 return t.asInterface().derivative();
│ │ │ │ +
137 }
│ │ │ │ +
│ │ │ │ +
138};
│ │ │ │ +
│ │ │ │ +
139
│ │ │ │ +
140
│ │ │ │ +
141
│ │ │ │ +
142}} // namespace Dune::Functions
│ │ │ │ +
143
│ │ │ │ +
144
│ │ │ │
145
│ │ │ │ -
147 friend typename Traits::LocalFunctionTraits::DerivativeInterface derivative(const LocalFunction& t)
│ │ │ │ -
148 {
│ │ │ │ -
149 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │ -
150 }
│ │ │ │ -
151
│ │ │ │ -
152 private:
│ │ │ │ -
153 const ComposedGridFunction& globalFunction_;
│ │ │ │ -
154 InnerLocalFunctions innerLocalFunctions_;
│ │ │ │ -
155 };
│ │ │ │ -
156
│ │ │ │ -
157public:
│ │ │ │ -
158
│ │ │ │ -
168 template<class OFT, class... IFT,
│ │ │ │ -
169 disableCopyMove<ComposedGridFunction, OFT> = 0,
│ │ │ │ -
170 std::enable_if_t<(sizeof...(IFT) > 0), int> = 0>
│ │ │ │ -
│ │ │ │ -
171 ComposedGridFunction(OFT&& outerFunction, IFT&&... innerFunctions) :
│ │ │ │ -
172 outerFunction_(std::forward<OFT>(outerFunction)),
│ │ │ │ -
173 innerFunctions_(std::forward<IFT>(innerFunctions)...)
│ │ │ │ -
174 {}
│ │ │ │ -
│ │ │ │ -
175
│ │ │ │ -
│ │ │ │ -
177 Range operator()(const Domain& x) const
│ │ │ │ -
178 {
│ │ │ │ -
179 return std::apply([&](const auto&... innerFunction) {
│ │ │ │ -
180 return outerFunction_(innerFunction(x)...);
│ │ │ │ -
181 }, innerFunctions_);
│ │ │ │ -
182 }
│ │ │ │ -
│ │ │ │ -
183
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
186 {
│ │ │ │ -
187 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │ -
188 }
│ │ │ │ -
│ │ │ │ -
189
│ │ │ │ -
│ │ │ │ -
196 friend LocalFunction localFunction(const ComposedGridFunction& cgf)
│ │ │ │ -
197 {
│ │ │ │ -
198 return LocalFunction(cgf);
│ │ │ │ -
199 }
│ │ │ │ -
│ │ │ │ -
200
│ │ │ │ -
│ │ │ │ -
211 const EntitySet& entitySet() const
│ │ │ │ -
212 {
│ │ │ │ -
213 return resolveRef(std::get<0>(innerFunctions_)).entitySet();
│ │ │ │ -
214 }
│ │ │ │ -
│ │ │ │ -
215
│ │ │ │ -
216protected:
│ │ │ │ -
217
│ │ │ │ -
│ │ │ │ -
218 InnerLocalFunctions innerLocalFunctions() const
│ │ │ │ -
219 {
│ │ │ │ -
220 return std::apply([&](const auto&... innerFunction) {
│ │ │ │ -
221 return std::make_tuple(localFunction(resolveRef(innerFunction))...);
│ │ │ │ -
222 }, innerFunctions_);
│ │ │ │ -
223 }
│ │ │ │ -
│ │ │ │ -
224
│ │ │ │ -
225 OuterFunction outerFunction_;
│ │ │ │ -
226 InnerFunctions innerFunctions_;
│ │ │ │ -
227};
│ │ │ │ -
│ │ │ │ -
228
│ │ │ │ -
229// deduction guides
│ │ │ │ -
230template<class OF, class... IF>
│ │ │ │ -
231ComposedGridFunction(const OF&, const IF&...)
│ │ │ │ -
232 -> ComposedGridFunction<OF,IF...>;
│ │ │ │ -
233
│ │ │ │ -
234
│ │ │ │ -
257template<class OF, class... IF>
│ │ │ │ -
│ │ │ │ -
258auto makeComposedGridFunction(OF&& outerFunction, IF&&... innerFunction)
│ │ │ │ -
259{
│ │ │ │ -
260 using ComposedGridFunctionType = ComposedGridFunction<std::decay_t<OF>, std::decay_t<IF>...>;
│ │ │ │ -
261 return ComposedGridFunctionType(std::forward<OF>(outerFunction), std::forward<IF>(innerFunction)...);
│ │ │ │ -
262}
│ │ │ │ -
│ │ │ │ -
263
│ │ │ │ -
264
│ │ │ │ -
265
│ │ │ │ -
266}} // namespace Dune::Functions
│ │ │ │ -
267
│ │ │ │ -
268
│ │ │ │ -
269
│ │ │ │ -
270#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const TrigonometricFunction< K, sinFactor, cosFactor > &f)
Obtain derivative of TrigonometricFunction function.
Definition trigonometricfunction.hh:43
│ │ │ │ -
auto makeComposedGridFunction(OF &&outerFunction, IF &&... innerFunction)
Create a ComposedGridFunction that composes grid-functions with another function.
Definition composedgridfunction.hh:258
│ │ │ │ +
146#endif // DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
friend DerivativeInterface derivative(const DifferentiableFunction &t)
Get derivative of wrapped function.
Definition differentiablefunction.hh:134
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
Default implementation for derivative traits.
Definition defaultderivativetraits.hh:41
│ │ │ │ -
Composition of grid functions with another function.
Definition composedgridfunction.hh:46
│ │ │ │ -
OuterFunction outerFunction_
Definition composedgridfunction.hh:225
│ │ │ │ -
InnerFunctions innerFunctions_
Definition composedgridfunction.hh:226
│ │ │ │ -
ComposedGridFunction(OFT &&outerFunction, IFT &&... innerFunctions)
Create ComposedGridFunction.
Definition composedgridfunction.hh:171
│ │ │ │ -
const EntitySet & entitySet() const
Return the EntitySet associated to this composed grid-function.
Definition composedgridfunction.hh:211
│ │ │ │ -
typename InnerFunction< 0 >::EntitySet EntitySet
Definition composedgridfunction.hh:57
│ │ │ │ -
typename EntitySet::LocalCoordinate LocalDomain
Definition composedgridfunction.hh:61
│ │ │ │ -
typename EntitySet::Element Element
Definition composedgridfunction.hh:58
│ │ │ │ -
InnerLocalFunctions innerLocalFunctions() const
Definition composedgridfunction.hh:218
│ │ │ │ -
friend LocalFunction localFunction(const ComposedGridFunction &cgf)
Create a local-function of this composed grid-function.
Definition composedgridfunction.hh:196
│ │ │ │ -
decltype(std::declval< OF >()(std::declval< IF >()(std::declval< Domain >())...)) Range
Definition composedgridfunction.hh:63
│ │ │ │ -
typename EntitySet::GlobalCoordinate Domain
Definition composedgridfunction.hh:60
│ │ │ │ -
Range operator()(const Domain &x) const
Evaluation of the composed grid function in coordinates x
Definition composedgridfunction.hh:177
│ │ │ │ -
friend Traits::DerivativeInterface derivative(const ComposedGridFunction &t)
Not implemented.
Definition composedgridfunction.hh:185
│ │ │ │ -
Definition gridfunction.hh:36
│ │ │ │ +
Definition differentiablefunction.hh:33
│ │ │ │ +
DifferentiableFunction(F &&f)
Construct from function.
Definition differentiablefunction.hh:110
│ │ │ │ + │ │ │ │ +
Helper class to deduce the signature of a callable.
Definition signature.hh:60
│ │ │ │ +
Base class for type-erased interface wrapper.
Definition typeerasure.hh:169
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,255 +1,157 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ -composedgridfunction.hh │ │ │ │ │ + * _c_o_m_m_o_n │ │ │ │ │ +differentiablefunction.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH │ │ │ │ │ 9 │ │ │ │ │ 10#include │ │ │ │ │ -11#include │ │ │ │ │ -12 │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15 │ │ │ │ │ -16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ -18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ -19 │ │ │ │ │ +11 │ │ │ │ │ +12#include │ │ │ │ │ +13 │ │ │ │ │ +14#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ +15#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n___i_m_p_._h_h> │ │ │ │ │ +17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_s_i_g_n_a_t_u_r_e_._h_h> │ │ │ │ │ +18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e_e_r_a_s_u_r_e_._h_h> │ │ │ │ │ +19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ 20 │ │ │ │ │ 21namespace _D_u_n_e { │ │ │ │ │ 22namespace Functions { │ │ │ │ │ 23 │ │ │ │ │ 24 │ │ │ │ │ 25 │ │ │ │ │ -44template │ │ │ │ │ -_4_5class _C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ -46{ │ │ │ │ │ -47 using InnerFunctions = std::tuple; │ │ │ │ │ -48 using InnerLocalFunctions = std::tuple())))...>; │ │ │ │ │ +26/* │ │ │ │ │ +27 * Default implementation is empty │ │ │ │ │ +28 * The actual implementation is only given if Signature is an type │ │ │ │ │ +29 * describing a function signature as Range(Domain). │ │ │ │ │ +30 */ │ │ │ │ │ +31template class │ │ │ │ │ +DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56> │ │ │ │ │ +_3_2class _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n │ │ │ │ │ +33{}; │ │ │ │ │ +34 │ │ │ │ │ +35 │ │ │ │ │ +36 │ │ │ │ │ +37namespace Imp │ │ │ │ │ +38{ │ │ │ │ │ +39 │ │ │ │ │ +41 template class DerivativeTraits, size_t bufferSize> │ │ │ │ │ +42 struct DifferentiableFunctionTraits │ │ │ │ │ +43 { │ │ │ │ │ +45 using Signature = S; │ │ │ │ │ +46 │ │ │ │ │ +48 using Range = typename _S_i_g_n_a_t_u_r_e_T_r_a_i_t_s_<_S_i_g_n_a_t_u_r_e_>_:_:_R_a_n_g_e; │ │ │ │ │ 49 │ │ │ │ │ -50 template │ │ │ │ │ -51 using InnerFunction = std::decay_t>>; │ │ │ │ │ +51 using Domain = typename _S_i_g_n_a_t_u_r_e_T_r_a_i_t_s_<_S_i_g_n_a_t_u_r_e_>_:_:_D_o_m_a_i_n; │ │ │ │ │ 52 │ │ │ │ │ -53 using OuterFunction = OF; │ │ │ │ │ -54 │ │ │ │ │ -55public: │ │ │ │ │ -56 │ │ │ │ │ -_5_7 using _E_n_t_i_t_y_S_e_t = typename InnerFunction<0>::EntitySet; │ │ │ │ │ -_5_8 using _E_l_e_m_e_n_t = typename EntitySet::Element; │ │ │ │ │ -59 │ │ │ │ │ -_6_0 using _D_o_m_a_i_n = typename EntitySet::GlobalCoordinate; │ │ │ │ │ -_6_1 using _L_o_c_a_l_D_o_m_a_i_n = typename EntitySet::LocalCoordinate; │ │ │ │ │ -62 │ │ │ │ │ -_6_3 using _R_a_n_g_e = decltype(std::declval()(std::declval()(std:: │ │ │ │ │ -declval())...)); │ │ │ │ │ -64 │ │ │ │ │ -65private: │ │ │ │ │ -66 │ │ │ │ │ -67 using Traits = Imp::GridFunctionTraits<_R_a_n_g_e(_D_o_m_a_i_n), _E_n_t_i_t_y_S_e_t, │ │ │ │ │ -_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s, 16>; │ │ │ │ │ +54 using DerivativeSignature = typename _S_i_g_n_a_t_u_r_e_T_r_a_i_t_s_<_S_i_g_n_a_t_u_r_e_>_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ +DerivativeSignature; │ │ │ │ │ +55 │ │ │ │ │ +57 using DerivativeInterface = _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _b_u_f_f_e_r_S_i_z_e_>; │ │ │ │ │ +58 │ │ │ │ │ +60 using Concept = DifferentiableFunctionWrapperInterface; │ │ │ │ │ +61 │ │ │ │ │ +63 template │ │ │ │ │ +64 using Model = DifferentiableFunctionWrapperImplementation; │ │ │ │ │ +65 }; │ │ │ │ │ +66} │ │ │ │ │ +67 │ │ │ │ │ 68 │ │ │ │ │ -69 class LocalFunction │ │ │ │ │ -70 { │ │ │ │ │ -71 public: │ │ │ │ │ -78 LocalFunction(const _C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n& globalFunction) : │ │ │ │ │ -79 globalFunction_(globalFunction), │ │ │ │ │ -80 innerLocalFunctions_(globalFunction._i_n_n_e_r_L_o_c_a_l_F_u_n_c_t_i_o_n_s()) │ │ │ │ │ -81 {} │ │ │ │ │ -82 │ │ │ │ │ -92 void bind(const _E_l_e_m_e_n_t& element) │ │ │ │ │ -93 { │ │ │ │ │ -94 std::apply([&](auto&... innerFunction) { │ │ │ │ │ -95 (innerFunction.bind(element),...); │ │ │ │ │ -96 }, innerLocalFunctions_); │ │ │ │ │ -97 } │ │ │ │ │ -98 │ │ │ │ │ -100 void unbind() │ │ │ │ │ -101 { │ │ │ │ │ -102 std::apply([&](auto&... innerFunction) { │ │ │ │ │ -103 (innerFunction.unbind(),...); │ │ │ │ │ -104 }, innerLocalFunctions_); │ │ │ │ │ -105 } │ │ │ │ │ -106 │ │ │ │ │ -109 bool bound() const │ │ │ │ │ -110 { │ │ │ │ │ -111 return std::apply([](const auto&... innerFunction) { │ │ │ │ │ -112 return (innerFunction.bound() && ...); │ │ │ │ │ -113 }, innerLocalFunctions_); │ │ │ │ │ +69 │ │ │ │ │ +84template class DerivativeTraits, │ │ │ │ │ +size_t bufferSize> │ │ │ │ │ +_8_5class _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n< Range(Domain), DerivativeTraits, bufferSize> : │ │ │ │ │ +86 public _T_y_p_e_E_r_a_s_u_r_e_B_a_s_e< │ │ │ │ │ +87 typename Imp::DifferentiableFunctionTraits::Concept, │ │ │ │ │ +88 Imp::DifferentiableFunctionTraits::template Model> │ │ │ │ │ +89{ │ │ │ │ │ +90 using Traits = Imp::DifferentiableFunctionTraits; │ │ │ │ │ +91 │ │ │ │ │ +92 using _B_a_s_e = _T_y_p_e_E_r_a_s_u_r_e_B_a_s_e_<_t_y_p_e_n_a_m_e_ _T_r_a_i_t_s_:_:_C_o_n_c_e_p_t_,_ _T_r_a_i_t_s_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ +_M_o_d_e_l_>; │ │ │ │ │ +93 │ │ │ │ │ +94 using DerivativeInterface = typename _T_r_a_i_t_s_:_:_D_e_r_i_v_a_t_i_v_e_I_n_t_e_r_f_a_c_e; │ │ │ │ │ +95 │ │ │ │ │ +96public: │ │ │ │ │ +97 │ │ │ │ │ +109 template = 0 > │ │ │ │ │ +_1_1_0 _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n(F&& f) : │ │ │ │ │ +111 _B_a_s_e(std::forward(f)) │ │ │ │ │ +112 { │ │ │ │ │ +113 static_assert(Dune::Functions::Concept::isFunction(), │ │ │ │ │ +"Trying to construct a DifferentiableFunction from type that does not model the │ │ │ │ │ +Function concept"); │ │ │ │ │ 114 } │ │ │ │ │ 115 │ │ │ │ │ -125 _R_a_n_g_e operator()(const _L_o_c_a_l_D_o_m_a_i_n& x) const │ │ │ │ │ -126 { │ │ │ │ │ -127 return std::apply([&](const auto&... innerFunction) { │ │ │ │ │ -128 return globalFunction_.outerFunction_(innerFunction(x)...); │ │ │ │ │ -129 }, innerLocalFunctions_); │ │ │ │ │ -130 } │ │ │ │ │ -131 │ │ │ │ │ -141 const _E_l_e_m_e_n_t& localContext() const │ │ │ │ │ -142 { │ │ │ │ │ -143 return std::get<0>(innerLocalFunctions_).localContext(); │ │ │ │ │ -144 } │ │ │ │ │ +_1_1_7 _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n() = default; │ │ │ │ │ +118 │ │ │ │ │ +_1_2_2 Range operator() (const Domain& x) const │ │ │ │ │ +123 { │ │ │ │ │ +124 return this->asInterface().operator()(x); │ │ │ │ │ +125 } │ │ │ │ │ +126 │ │ │ │ │ +_1_3_4 friend DerivativeInterface _d_e_r_i_v_a_t_i_v_e(const _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n& t) │ │ │ │ │ +135 { │ │ │ │ │ +136 return t.asInterface().derivative(); │ │ │ │ │ +137 } │ │ │ │ │ +138}; │ │ │ │ │ +139 │ │ │ │ │ +140 │ │ │ │ │ +141 │ │ │ │ │ +142}} // namespace Dune::Functions │ │ │ │ │ +143 │ │ │ │ │ +144 │ │ │ │ │ 145 │ │ │ │ │ -147 friend typename _T_r_a_i_t_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_T_r_a_i_t_s_:_:_D_e_r_i_v_a_t_i_v_e_I_n_t_e_r_f_a_c_e _d_e_r_i_v_a_t_i_v_e │ │ │ │ │ -(const LocalFunction& t) │ │ │ │ │ -148 { │ │ │ │ │ -149 DUNE_THROW(NotImplemented,"not implemented"); │ │ │ │ │ -150 } │ │ │ │ │ -151 │ │ │ │ │ -152 private: │ │ │ │ │ -153 const _C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n& globalFunction_; │ │ │ │ │ -154 InnerLocalFunctions innerLocalFunctions_; │ │ │ │ │ -155 }; │ │ │ │ │ -156 │ │ │ │ │ -157public: │ │ │ │ │ -158 │ │ │ │ │ -168 template = 0, │ │ │ │ │ -170 std::enable_if_t<(sizeof...(IFT) > 0), int> = 0> │ │ │ │ │ -_1_7_1 _C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n(OFT&& outerFunction, IFT&&... innerFunctions) : │ │ │ │ │ -172 _o_u_t_e_r_F_u_n_c_t_i_o_n__(std::forward(outerFunction)), │ │ │ │ │ -173 _i_n_n_e_r_F_u_n_c_t_i_o_n_s__(std::forward(innerFunctions)...) │ │ │ │ │ -174 {} │ │ │ │ │ -175 │ │ │ │ │ -_1_7_7 _R_a_n_g_e _o_p_e_r_a_t_o_r_(_)(const _D_o_m_a_i_n& x) const │ │ │ │ │ -178 { │ │ │ │ │ -179 return std::apply([&](const auto&... innerFunction) { │ │ │ │ │ -180 return _o_u_t_e_r_F_u_n_c_t_i_o_n__(innerFunction(x)...); │ │ │ │ │ -181 }, _i_n_n_e_r_F_u_n_c_t_i_o_n_s__); │ │ │ │ │ -182 } │ │ │ │ │ -183 │ │ │ │ │ -_1_8_5 friend typename _T_r_a_i_t_s_:_:_D_e_r_i_v_a_t_i_v_e_I_n_t_e_r_f_a_c_e _d_e_r_i_v_a_t_i_v_e(const │ │ │ │ │ -_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n& t) │ │ │ │ │ -186 { │ │ │ │ │ -187 DUNE_THROW(NotImplemented,"not implemented"); │ │ │ │ │ -188 } │ │ │ │ │ -189 │ │ │ │ │ -_1_9_6 friend LocalFunction _l_o_c_a_l_F_u_n_c_t_i_o_n(const _C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n& cgf) │ │ │ │ │ -197 { │ │ │ │ │ -198 return LocalFunction(cgf); │ │ │ │ │ -199 } │ │ │ │ │ -200 │ │ │ │ │ -_2_1_1 const _E_n_t_i_t_y_S_e_t& _e_n_t_i_t_y_S_e_t() const │ │ │ │ │ -212 { │ │ │ │ │ -213 return resolveRef(std::get<0>(_i_n_n_e_r_F_u_n_c_t_i_o_n_s__)).entitySet(); │ │ │ │ │ -214 } │ │ │ │ │ -215 │ │ │ │ │ -216protected: │ │ │ │ │ -217 │ │ │ │ │ -_2_1_8 InnerLocalFunctions _i_n_n_e_r_L_o_c_a_l_F_u_n_c_t_i_o_n_s() const │ │ │ │ │ -219 { │ │ │ │ │ -220 return std::apply([&](const auto&... innerFunction) { │ │ │ │ │ -221 return std::make_tuple(_l_o_c_a_l_F_u_n_c_t_i_o_n(resolveRef(innerFunction))...); │ │ │ │ │ -222 }, _i_n_n_e_r_F_u_n_c_t_i_o_n_s__); │ │ │ │ │ -223 } │ │ │ │ │ -224 │ │ │ │ │ -_2_2_5 OuterFunction _o_u_t_e_r_F_u_n_c_t_i_o_n__; │ │ │ │ │ -_2_2_6 InnerFunctions _i_n_n_e_r_F_u_n_c_t_i_o_n_s__; │ │ │ │ │ -227}; │ │ │ │ │ -228 │ │ │ │ │ -229// deduction guides │ │ │ │ │ -230template │ │ │ │ │ -_2_3_1_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n(const OF&, const IF&...) │ │ │ │ │ -232 -> _C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n; │ │ │ │ │ -233 │ │ │ │ │ -234 │ │ │ │ │ -257template │ │ │ │ │ -_2_5_8auto _m_a_k_e_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n(OF&& outerFunction, IF&&... innerFunction) │ │ │ │ │ -259{ │ │ │ │ │ -260 using ComposedGridFunctionType = _C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_<_s_t_d_:_:_d_e_c_a_y___t_<_O_F_>, │ │ │ │ │ -std::decay_t...>; │ │ │ │ │ -261 return ComposedGridFunctionType(std::forward(outerFunction), std:: │ │ │ │ │ -forward(innerFunction)...); │ │ │ │ │ -262} │ │ │ │ │ -263 │ │ │ │ │ -264 │ │ │ │ │ -265 │ │ │ │ │ -266}} // namespace Dune::Functions │ │ │ │ │ -267 │ │ │ │ │ -268 │ │ │ │ │ -269 │ │ │ │ │ -270#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH │ │ │ │ │ -_g_r_i_d_f_u_n_c_t_i_o_n_._h_h │ │ │ │ │ -_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h │ │ │ │ │ +146#endif // DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH │ │ │ │ │ +_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n___i_m_p_._h_h │ │ │ │ │ +_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ +_t_y_p_e___t_r_a_i_t_s_._h_h │ │ │ │ │ _d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ -TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const │ │ │ │ │ -TrigonometricFunction< K, sinFactor, cosFactor > &f) │ │ │ │ │ -Obtain derivative of TrigonometricFunction function. │ │ │ │ │ -DDeeffiinniittiioonn trigonometricfunction.hh:43 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_m_a_k_e_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ -auto makeComposedGridFunction(OF &&outerFunction, IF &&... innerFunction) │ │ │ │ │ -Create a ComposedGridFunction that composes grid-functions with another │ │ │ │ │ -function. │ │ │ │ │ -DDeeffiinniittiioonn composedgridfunction.hh:258 │ │ │ │ │ +_s_i_g_n_a_t_u_r_e_._h_h │ │ │ │ │ +_t_y_p_e_e_r_a_s_u_r_e_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ +_b_u_f_f_e_r_S_i_z_e_ _>_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ +friend DerivativeInterface derivative(const DifferentiableFunction &t) │ │ │ │ │ +Get derivative of wrapped function. │ │ │ │ │ +DDeeffiinniittiioonn differentiablefunction.hh:134 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ -Default implementation for derivative traits. │ │ │ │ │ -DDeeffiinniittiioonn defaultderivativetraits.hh:41 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ -Composition of grid functions with another function. │ │ │ │ │ -DDeeffiinniittiioonn composedgridfunction.hh:46 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_o_u_t_e_r_F_u_n_c_t_i_o_n__ │ │ │ │ │ -OuterFunction outerFunction_ │ │ │ │ │ -DDeeffiinniittiioonn composedgridfunction.hh:225 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_i_n_n_e_r_F_u_n_c_t_i_o_n_s__ │ │ │ │ │ -InnerFunctions innerFunctions_ │ │ │ │ │ -DDeeffiinniittiioonn composedgridfunction.hh:226 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ -ComposedGridFunction(OFT &&outerFunction, IFT &&... innerFunctions) │ │ │ │ │ -Create ComposedGridFunction. │ │ │ │ │ -DDeeffiinniittiioonn composedgridfunction.hh:171 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_e_n_t_i_t_y_S_e_t │ │ │ │ │ -const EntitySet & entitySet() const │ │ │ │ │ -Return the EntitySet associated to this composed grid-function. │ │ │ │ │ -DDeeffiinniittiioonn composedgridfunction.hh:211 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_E_n_t_i_t_y_S_e_t │ │ │ │ │ -typename InnerFunction< 0 >::EntitySet EntitySet │ │ │ │ │ -DDeeffiinniittiioonn composedgridfunction.hh:57 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_L_o_c_a_l_D_o_m_a_i_n │ │ │ │ │ -typename EntitySet::LocalCoordinate LocalDomain │ │ │ │ │ -DDeeffiinniittiioonn composedgridfunction.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_E_l_e_m_e_n_t │ │ │ │ │ -typename EntitySet::Element Element │ │ │ │ │ -DDeeffiinniittiioonn composedgridfunction.hh:58 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_i_n_n_e_r_L_o_c_a_l_F_u_n_c_t_i_o_n_s │ │ │ │ │ -InnerLocalFunctions innerLocalFunctions() const │ │ │ │ │ -DDeeffiinniittiioonn composedgridfunction.hh:218 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_l_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ -friend LocalFunction localFunction(const ComposedGridFunction &cgf) │ │ │ │ │ -Create a local-function of this composed grid-function. │ │ │ │ │ -DDeeffiinniittiioonn composedgridfunction.hh:196 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_R_a_n_g_e │ │ │ │ │ -decltype(std::declval< OF >()(std::declval< IF >()(std::declval< Domain > │ │ │ │ │ -())...)) Range │ │ │ │ │ -DDeeffiinniittiioonn composedgridfunction.hh:63 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_D_o_m_a_i_n │ │ │ │ │ -typename EntitySet::GlobalCoordinate Domain │ │ │ │ │ -DDeeffiinniittiioonn composedgridfunction.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -Range operator()(const Domain &x) const │ │ │ │ │ -Evaluation of the composed grid function in coordinates x │ │ │ │ │ -DDeeffiinniittiioonn composedgridfunction.hh:177 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ -friend Traits::DerivativeInterface derivative(const ComposedGridFunction &t) │ │ │ │ │ -Not implemented. │ │ │ │ │ -DDeeffiinniittiioonn composedgridfunction.hh:185 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn gridfunction.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn differentiablefunction.hh:33 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ +_b_u_f_f_e_r_S_i_z_e_ _>_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n │ │ │ │ │ +DifferentiableFunction(F &&f) │ │ │ │ │ +Construct from function. │ │ │ │ │ +DDeeffiinniittiioonn differentiablefunction.hh:110 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ +_b_u_f_f_e_r_S_i_z_e_ _>_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n │ │ │ │ │ +DifferentiableFunction()=default │ │ │ │ │ +Default constructor. │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_r_a_i_t_s │ │ │ │ │ +Helper class to deduce the signature of a callable. │ │ │ │ │ +DDeeffiinniittiioonn signature.hh:60 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_y_p_e_E_r_a_s_u_r_e_B_a_s_e │ │ │ │ │ +Base class for type-erased interface wrapper. │ │ │ │ │ +DDeeffiinniittiioonn typeerasure.hh:169 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00023.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: gridviewentityset.hh File Reference │ │ │ │ +dune-functions: functionconcepts.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,40 +65,129 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
gridviewentityset.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
functionconcepts.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <memory>
│ │ │ │ +
#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.

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

│ │ │ │ Classes

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

│ │ │ │ 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.
 
template<class F , class... Args>
static constexpr auto Dune::Functions::Concept::isCallable (F &&, Args &&...)
 Check if f is callable with given argument list.
 
template<class F , class Signature >
static constexpr bool Dune::Functions::Concept::isFunction ()
 Check if F models the Function concept with given signature.
 
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.
 
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.
 
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.
 
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.
 
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.
 
template<class E >
static constexpr bool Dune::Functions::Concept::isEntitySet ()
 Check if F models the GridFunction concept with given signature and entity set.
 
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.
 
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.
 
template<class F , class Signature , class GridView >
static constexpr bool Dune::Functions::Concept::isGridViewFunction ()
 Check if F models the GridViewFunction concept with given signature.
 
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.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,22 +1,136 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -gridviewentityset.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ + * _c_o_m_m_o_n │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +functionconcepts.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_s_i_g_n_a_t_u_r_e_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_l_o_c_a_l_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_ _G_V_,_ _c_d_ _> │ │ │ │ │ -  An entity set for all entities of given codim in a grid view. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_C_a_l_l_a_b_l_e_<_ _A_r_g_s_ _> │ │ │ │ │ +  _C_o_n_c_e_p_t objects that can be called with given argument list. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_> │ │ │ │ │ +  _C_o_n_c_e_p_t for a function mapping Domain to Range. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ + _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _> │ │ │ │ │ +  _C_o_n_c_e_p_t for a differentiable function mapping Domain to Range. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _L_o_c_a_l_C_o_n_t_e_x_t_ _> │ │ │ │ │ +  _C_o_n_c_e_p_t for a local function mapping Domain to Range. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ + _L_o_c_a_l_C_o_n_t_e_x_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _> │ │ │ │ │ +  _C_o_n_c_e_p_t for a differentiable local function mapping Domain to Range. │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_E_n_t_i_t_y_S_e_t │ │ │ │ │ +  _C_o_n_c_e_p_t for an entity set for a Concept::GridFunction _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_n_t_i_t_y_S_e_t_ _> │ │ │ │ │ +  _C_o_n_c_e_p_t for a grid function mapping Domain to Range. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ + _E_n_t_i_t_y_S_e_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _> │ │ │ │ │ +  _C_o_n_c_e_p_t for a differentiable grid function mapping Domain to Range. │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_r_i_d_V_i_e_w_ _> │ │ │ │ │ +  _C_o_n_c_e_p_t for a grid view function mapping Domain to Range. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e │ │ │ │ │ + _(_D_o_m_a_i_n_)_,_ _G_r_i_d_V_i_e_w_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _> │ │ │ │ │ +  _C_o_n_c_e_p_t for a differentiable grid view function mapping Domain to │ │ │ │ │ + Range. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ +namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t │ │ │ │ │ +  │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +static constexpr auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_C_a_l_l_a_b_l_e () │ │ │ │ │ +  Check if f is callable with given argument list. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +static constexpr auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_C_a_l_l_a_b_l_e (F &&, Args &&...) │ │ │ │ │ +  Check if f is callable with given argument list. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_F_u_n_c_t_i_o_n () │ │ │ │ │ +  Check if F models the _F_u_n_c_t_i_o_n concept with given │ │ │ │ │ + signature. │ │ │ │ │ +  │ │ │ │ │ +template class DerivativeTraits> │ │ │ │ │ +static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_F_u_n_c_t_i_o_n (F &&f, │ │ │ │ │ + _S_i_g_n_a_t_u_r_e_T_a_g< Signature, DerivativeTraits >) │ │ │ │ │ +  Check if f models the _F_u_n_c_t_i_o_n concept with given │ │ │ │ │ + signature. │ │ │ │ │ +  │ │ │ │ │ +template class DerivativeTraits = │ │ │ │ │ +DefaultDerivativeTraits> │ │ │ │ │ +static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n () │ │ │ │ │ +  Check if F models the _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n concept │ │ │ │ │ + with given signature. │ │ │ │ │ +  │ │ │ │ │ +template class DerivativeTraits> │ │ │ │ │ +static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n (F │ │ │ │ │ + &&f, _S_i_g_n_a_t_u_r_e_T_a_g< Signature, DerivativeTraits >) │ │ │ │ │ +  Check if f models the _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n concept │ │ │ │ │ + with given signature. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_L_o_c_a_l_F_u_n_c_t_i_o_n () │ │ │ │ │ +  Check if F models the _L_o_c_a_l_F_u_n_c_t_i_o_n concept with given │ │ │ │ │ + signature and local context. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +class DerivativeTraits = DefaultDerivativeTraits> │ │ │ │ │ +static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ + () │ │ │ │ │ +  Check if F models the _D_i_f_f_e_r_e_n_t_i_a_b_l_e_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ + concept with given signature and local context. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_E_n_t_i_t_y_S_e_t () │ │ │ │ │ +  Check if F models the _G_r_i_d_F_u_n_c_t_i_o_n concept with given │ │ │ │ │ + signature and entity set. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_G_r_i_d_F_u_n_c_t_i_o_n () │ │ │ │ │ +  Check if F models the _G_r_i_d_F_u_n_c_t_i_o_n concept with given │ │ │ │ │ + signature and entity set. │ │ │ │ │ +  │ │ │ │ │ +template class │ │ │ │ │ +DerivativeTraits = DefaultDerivativeTraits> │ │ │ │ │ +static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ + () │ │ │ │ │ +  Check if F models the _D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_F_u_n_c_t_i_o_n concept │ │ │ │ │ + with given signature and entity set. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n () │ │ │ │ │ +  Check if F models the _G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n concept with │ │ │ │ │ + given signature. │ │ │ │ │ +  │ │ │ │ │ +template class │ │ │ │ │ +DerivativeTraits = DefaultDerivativeTraits> │ │ │ │ │ +static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_: │ │ │ │ │ + _i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n () │ │ │ │ │ +  Check if F models the _D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ + concept with given signature. │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00023_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: gridviewentityset.hh Source File │ │ │ │ +dune-functions: functionconcepts.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,127 +70,374 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
gridviewentityset.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWENTITYSET_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWENTITYSET_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH
│ │ │ │
9
│ │ │ │ -
10#include <memory>
│ │ │ │ -
11
│ │ │ │ +
10#include <dune/common/typelist.hh>
│ │ │ │ +
11#include <dune/common/concept.hh>
│ │ │ │
12
│ │ │ │ -
13namespace Dune {
│ │ │ │ -
14
│ │ │ │ -
15namespace Functions {
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
16
│ │ │ │ -
17
│ │ │ │ -
25template<class GV, int cd>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
27{
│ │ │ │ -
28public:
│ │ │ │ -
29
│ │ │ │ -
30 typedef GV GridView;
│ │ │ │ -
31 enum {
│ │ │ │ -
32 codim = cd
│ │ │ │ -
33 };
│ │ │ │ -
34
│ │ │ │ -
36 typedef typename GridView::template Codim<codim>::Entity Element;
│ │ │ │ -
37
│ │ │ │ -
39 typedef typename Element::Geometry::LocalCoordinate LocalCoordinate;
│ │ │ │ -
40 typedef typename Element::Geometry::GlobalCoordinate GlobalCoordinate;
│ │ │ │ -
41
│ │ │ │ - │ │ │ │ +
17namespace Dune {
│ │ │ │ +
18namespace Functions {
│ │ │ │ +
19namespace Concept {
│ │ │ │ +
20
│ │ │ │ +
21using namespace Dune::Concept;
│ │ │ │ +
22
│ │ │ │ +
23
│ │ │ │ +
24
│ │ │ │ +
25// Callable concept ############################################################
│ │ │ │ +
26
│ │ │ │ +
27
│ │ │ │ +
35template<class... Args>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
37{
│ │ │ │ +
38 template<class F>
│ │ │ │ +
39 auto require(F&& f) -> decltype(
│ │ │ │ +
40 f(std::declval<Args>()...)
│ │ │ │ +
41 );
│ │ │ │ +
42};
│ │ │ │ +
│ │ │ │
43
│ │ │ │ -
45 typedef typename GridView::template Codim<codim>::Iterator const_iterator;
│ │ │ │ -
46
│ │ │ │ - │ │ │ │ -
49
│ │ │ │ +
50template<class F, class... Args>
│ │ │ │
│ │ │ │ - │ │ │ │ -
52 gv_(gv)
│ │ │ │ -
53 {}
│ │ │ │ -
│ │ │ │ -
54
│ │ │ │ -
│ │ │ │ -
56 bool contains(const Element& e) const
│ │ │ │ -
57 {
│ │ │ │ -
58 return gv_.contains(e);
│ │ │ │ -
59 }
│ │ │ │ -
│ │ │ │ -
60
│ │ │ │ -
│ │ │ │ -
62 size_t size() const
│ │ │ │ -
63 {
│ │ │ │ -
64 return gv_.size(codim);
│ │ │ │ -
65 }
│ │ │ │ +
51static constexpr auto isCallable()
│ │ │ │ +
52{ return models<Concept::Callable<Args...>, F>(); }
│ │ │ │ +
│ │ │ │ +
53
│ │ │ │ +
60template<class F, class... Args>
│ │ │ │ +
│ │ │ │ +
61static constexpr auto isCallable(F&&, Args&&...)
│ │ │ │ +
62{
│ │ │ │ +
63 return models<Concept::Callable<Args&&...>, F>();
│ │ │ │ +
64}
│ │ │ │
│ │ │ │ +
65
│ │ │ │
66
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
69 {
│ │ │ │ -
70 return gv_.template begin<codim>();
│ │ │ │ -
71 }
│ │ │ │ -
│ │ │ │ -
72
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
75 {
│ │ │ │ -
76 return gv_.template end<codim>();
│ │ │ │ -
77 }
│ │ │ │ -
│ │ │ │ -
78
│ │ │ │ -
│ │ │ │ -
80 const GridView& gridView() const
│ │ │ │ -
81 {
│ │ │ │ -
82 return gv_;
│ │ │ │ -
83 }
│ │ │ │ -
│ │ │ │ -
84
│ │ │ │ -
85private:
│ │ │ │ -
86 GridView gv_;
│ │ │ │ -
87};
│ │ │ │ +
67
│ │ │ │ +
68// Function concept ############################################################
│ │ │ │ +
69template<class Signature>
│ │ │ │ +
70struct Function;
│ │ │ │ +
71
│ │ │ │ +
80template<class Range, class Domain>
│ │ │ │ +
│ │ │ │ +
81struct Function<Range(Domain)> : Refines<Callable<Domain> >
│ │ │ │ +
82{
│ │ │ │ +
83 template<class F>
│ │ │ │ +
84 auto require(F&& f) -> decltype(
│ │ │ │ +
85 // F models Function<Range(Domain)> if the result of F(Domain) is implicitly convertible to Range
│ │ │ │ +
86 requireConvertible<Range>(f(std::declval<Domain>()))
│ │ │ │ +
87 );
│ │ │ │ +
88};
│ │ │ │
│ │ │ │ -
88
│ │ │ │
89
│ │ │ │ -
90} // end of namespace Dune::Functions
│ │ │ │ -
91} // end of namespace Dune
│ │ │ │ -
92
│ │ │ │ -
93#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWENTITYSET_HH
│ │ │ │ +
91template<class F, class Signature>
│ │ │ │ +
│ │ │ │ +
92static constexpr bool isFunction()
│ │ │ │ +
93{ return models<Concept::Function<Signature>, F>(); }
│ │ │ │ +
│ │ │ │ +
94
│ │ │ │ +
96template<class F, class Signature, template<class> class DerivativeTraits>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
98{ return models<Concept::Function<Signature>, F>(); }
│ │ │ │ +
│ │ │ │ +
99
│ │ │ │ +
100
│ │ │ │ +
101
│ │ │ │ +
102// DifferentiableFunction concept ##############################################
│ │ │ │ +
103template<class Signature, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ + │ │ │ │ +
105
│ │ │ │ +
117template<class Range, class Domain, template<class> class DerivativeTraits>
│ │ │ │ +
│ │ │ │ +
118struct DifferentiableFunction<Range(Domain), DerivativeTraits> : Refines<Dune::Functions::Concept::Function<Range(Domain)> >
│ │ │ │ +
119{
│ │ │ │ + │ │ │ │ +
121
│ │ │ │ +
122 template<class F>
│ │ │ │ +
123 auto require(F&& f) -> decltype(
│ │ │ │ +
124 derivative(f),
│ │ │ │ +
125 requireConcept<Function<DerivativeSignature>>(derivative(f))
│ │ │ │ +
126 );
│ │ │ │ +
127};
│ │ │ │ +
│ │ │ │ +
128
│ │ │ │ +
130template<class F, class Signature, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ +
│ │ │ │ +
131static constexpr bool isDifferentiableFunction()
│ │ │ │ +
132{ return models<Concept::DifferentiableFunction<Signature, DerivativeTraits>, F>(); }
│ │ │ │ +
│ │ │ │ +
133
│ │ │ │ +
135template<class F, class Signature, template<class> class DerivativeTraits>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
137{ return models<Concept::DifferentiableFunction<Signature, DerivativeTraits>, F>(); }
│ │ │ │ +
│ │ │ │ +
138
│ │ │ │ +
139
│ │ │ │ +
140
│ │ │ │ +
141// LocalFunction concept ##############################################
│ │ │ │ +
142template<class Signature, class LocalContext>
│ │ │ │ + │ │ │ │ +
144
│ │ │ │ +
154template<class Range, class Domain, class LocalContext>
│ │ │ │ +
│ │ │ │ +
155struct LocalFunction<Range(Domain), LocalContext> :
│ │ │ │ +
156 Refines<Dune::Functions::Concept::Function<Range(Domain)> >
│ │ │ │ +
157{
│ │ │ │ +
158 template<class F>
│ │ │ │ +
159 auto require(F&& f) -> decltype(
│ │ │ │ +
160 f.bind(std::declval<LocalContext>()),
│ │ │ │ +
161 f.unbind(),
│ │ │ │ +
162 requireConvertible<bool>(f.bound()),
│ │ │ │ +
163 f.localContext(),
│ │ │ │ +
164 requireConvertible<LocalContext>(f.localContext())
│ │ │ │ +
165 );
│ │ │ │ +
166};
│ │ │ │ +
│ │ │ │ +
167
│ │ │ │ +
169template<class F, class Signature, class LocalContext>
│ │ │ │ +
│ │ │ │ +
170static constexpr bool isLocalFunction()
│ │ │ │ +
171{ return models<Concept::LocalFunction<Signature, LocalContext>, F>(); }
│ │ │ │ +
│ │ │ │ +
172
│ │ │ │ +
173
│ │ │ │ +
174// DifferentiableLocalFunction concept ##############################################
│ │ │ │ +
175template<class Signature, class LocalContext, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ + │ │ │ │ +
177
│ │ │ │ +
190template<class Range, class Domain, class LocalContext, template<class> class DerivativeTraits>
│ │ │ │ +
│ │ │ │ +
191struct DifferentiableLocalFunction<Range(Domain), LocalContext, DerivativeTraits> :
│ │ │ │ +
192 Refines<
│ │ │ │ +
193 Dune::Functions::Concept::DifferentiableFunction<Range(Domain), DerivativeTraits>,
│ │ │ │ +
194 Dune::Functions::Concept::LocalFunction<Range(Domain),LocalContext>
│ │ │ │ +
195 >
│ │ │ │ +
196{
│ │ │ │ +
197 template<class F>
│ │ │ │ +
198 auto require(F&& f) -> decltype(
│ │ │ │ +
199 f.bind(std::declval<LocalContext>()),
│ │ │ │ +
200 f.unbind(),
│ │ │ │ +
201 f.localContext(),
│ │ │ │ +
202 requireConvertible<LocalContext>(f.localContext())
│ │ │ │ +
203 );
│ │ │ │ +
204};
│ │ │ │ +
│ │ │ │ +
205
│ │ │ │ +
207template<class F, class Signature, class LocalContext, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ +
│ │ │ │ +
208static constexpr bool isDifferentiableLocalFunction()
│ │ │ │ +
209{ return models<Concept::DifferentiableLocalFunction<Signature, LocalContext, DerivativeTraits>, F>(); }
│ │ │ │ +
│ │ │ │ +
210
│ │ │ │ +
211
│ │ │ │ +
212// EntitySet concept ##############################################
│ │ │ │ +
213
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
224{
│ │ │ │ +
225 template<class E>
│ │ │ │ +
226 auto require(E&& f) -> decltype(
│ │ │ │ +
227 requireType<typename E::Element>(),
│ │ │ │ +
228 requireType<typename E::LocalCoordinate>(),
│ │ │ │ +
229 requireType<typename E::GlobalCoordinate>()
│ │ │ │ +
230 );
│ │ │ │ +
231};
│ │ │ │ +
│ │ │ │ +
232
│ │ │ │ +
234template<class E>
│ │ │ │ +
│ │ │ │ +
235static constexpr bool isEntitySet()
│ │ │ │ +
236{ return models<Concept::EntitySet, E>(); }
│ │ │ │ +
│ │ │ │ +
237
│ │ │ │ +
238
│ │ │ │ +
239
│ │ │ │ +
240// GridFunction concept ##############################################
│ │ │ │ +
241template<class Signature, class EntitySet>
│ │ │ │ + │ │ │ │ +
243
│ │ │ │ +
253template<class Range, class Domain, class EntitySet>
│ │ │ │ +
│ │ │ │ +
254struct GridFunction<Range(Domain), EntitySet> :
│ │ │ │ +
255 Refines<Dune::Functions::Concept::Function<Range(Domain)> >
│ │ │ │ +
256{
│ │ │ │ +
257 using LocalSignature = Range(typename EntitySet::LocalCoordinate);
│ │ │ │ +
258 using LocalContext = typename EntitySet::Element;
│ │ │ │ +
259
│ │ │ │ +
260 template<class F>
│ │ │ │ +
261 auto require(F&& f) -> decltype(
│ │ │ │ +
262 localFunction(f),
│ │ │ │ +
263 f.entitySet(),
│ │ │ │ +
264 requireConcept<LocalFunction<LocalSignature, LocalContext>>(localFunction(f)),
│ │ │ │ +
265 requireConcept<Concept::EntitySet, EntitySet>(),
│ │ │ │ +
266 requireConvertible<EntitySet>(f.entitySet()),
│ │ │ │ +
267 requireConvertible<typename EntitySet::GlobalCoordinate, Domain>()
│ │ │ │ +
268 );
│ │ │ │ +
269};
│ │ │ │ +
│ │ │ │ +
270
│ │ │ │ +
272template<class F, class Signature, class EntitySet>
│ │ │ │ +
│ │ │ │ +
273static constexpr bool isGridFunction()
│ │ │ │ +
274{ return models<Concept::GridFunction<Signature, EntitySet>, F>(); }
│ │ │ │ +
│ │ │ │ +
275
│ │ │ │ +
276
│ │ │ │ +
277// DifferentiableGridFunction concept ##############################################
│ │ │ │ +
278template<class Signature, class EntitySet, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ + │ │ │ │ +
280
│ │ │ │ +
293template<class Range, class Domain, class EntitySet, template<class> class DerivativeTraits>
│ │ │ │ +
│ │ │ │ +
294struct DifferentiableGridFunction<Range(Domain), EntitySet, DerivativeTraits> :
│ │ │ │ +
295 Refines<
│ │ │ │ +
296 Dune::Functions::Concept::DifferentiableFunction<Range(Domain), DerivativeTraits>,
│ │ │ │ +
297 Dune::Functions::Concept::GridFunction<Range(Domain),EntitySet>
│ │ │ │ +
298 >
│ │ │ │ +
299{
│ │ │ │ +
300 using LocalSignature = Range(typename EntitySet::LocalCoordinate);
│ │ │ │ +
301 using LocalContext = typename EntitySet::Element;
│ │ │ │ +
302
│ │ │ │ +
303 template<class R>
│ │ │ │ + │ │ │ │ +
305
│ │ │ │ +
306 template<class F>
│ │ │ │ +
307 auto require(F&& f) -> decltype(
│ │ │ │ +
308 requireConcept<DifferentiableLocalFunction<LocalSignature, LocalContext, LocalDerivativeTraits>>(localFunction(f))
│ │ │ │ +
309 );
│ │ │ │ +
310};
│ │ │ │ +
│ │ │ │ +
311
│ │ │ │ +
313template<class F, class Signature, class EntitySet, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ +
│ │ │ │ +
314static constexpr bool isDifferentiableGridFunction()
│ │ │ │ +
315{ return models<Concept::DifferentiableGridFunction<Signature, EntitySet, DerivativeTraits>, F>(); }
│ │ │ │ +
│ │ │ │ +
316
│ │ │ │ +
317
│ │ │ │ +
318
│ │ │ │ +
319// GridViewFunction concept ##############################################
│ │ │ │ +
320template<class Signature, class GridView>
│ │ │ │ + │ │ │ │ +
322
│ │ │ │ +
335template<class Range, class Domain, class GridView>
│ │ │ │ +
│ │ │ │ +
336struct GridViewFunction<Range(Domain), GridView> :
│ │ │ │ +
337 Refines<Dune::Functions::Concept::GridFunction<Range(Domain), GridViewEntitySet<GridView,0>>>
│ │ │ │ +
338{
│ │ │ │ +
339 template<class F>
│ │ │ │ +
340 auto require(F&& f) -> decltype(
│ │ │ │ +
341 0 // We don't need to check any further expressions, because a GridViewFunction is just a GridFunction with a special EntitySet
│ │ │ │ +
342 );
│ │ │ │ +
343};
│ │ │ │ +
│ │ │ │ +
344
│ │ │ │ +
346template<class F, class Signature, class GridView>
│ │ │ │ +
│ │ │ │ +
347static constexpr bool isGridViewFunction()
│ │ │ │ +
348{ return models<Concept::GridViewFunction<Signature, GridView>, F>(); }
│ │ │ │ +
│ │ │ │ +
349
│ │ │ │ +
350
│ │ │ │ +
351// DifferentiableGridViewFunction concept ##############################################
│ │ │ │ +
352template<class Signature, class GridView, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ + │ │ │ │ +
354
│ │ │ │ +
368template<class Range, class Domain, class GridView, template<class> class DerivativeTraits>
│ │ │ │ +
│ │ │ │ +
369struct DifferentiableGridViewFunction<Range(Domain), GridView, DerivativeTraits> :
│ │ │ │ +
370 Refines<Dune::Functions::Concept::DifferentiableGridFunction<Range(Domain), GridViewEntitySet<GridView,0>, DerivativeTraits>>
│ │ │ │ +
371{
│ │ │ │ +
372 template<class F>
│ │ │ │ +
373 auto require(F&& f) -> decltype(
│ │ │ │ +
374 0 // We don't need to check any further expressions, because a GridViewFunction is just a GridFunction with a special EntitySet
│ │ │ │ +
375 );
│ │ │ │ +
376};
│ │ │ │ +
│ │ │ │ +
377
│ │ │ │ +
379template<class F, class Signature, class GridView, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ +
│ │ │ │ +
380static constexpr bool isDifferentiableGridViewFunction()
│ │ │ │ +
381{ return models<Concept::DifferentiableGridViewFunction<Signature, GridView, DerivativeTraits>, F>(); }
│ │ │ │ +
│ │ │ │ +
382
│ │ │ │ +
383
│ │ │ │ +
384
│ │ │ │ +
385}}} // namespace Dune::Functions::Concept
│ │ │ │ +
386
│ │ │ │ +
387#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:273
│ │ │ │ +
static constexpr bool isDifferentiableLocalFunction()
Check if F models the DifferentiableLocalFunction concept with given signature and local context.
Definition functionconcepts.hh:208
│ │ │ │ +
static constexpr bool isFunction()
Check if F models the Function concept with given signature.
Definition functionconcepts.hh:92
│ │ │ │ +
static constexpr bool isDifferentiableGridViewFunction()
Check if F models the DifferentiableGridViewFunction concept with given signature.
Definition functionconcepts.hh:380
│ │ │ │ +
static constexpr bool isDifferentiableFunction()
Check if F models the DifferentiableFunction concept with given signature.
Definition functionconcepts.hh:131
│ │ │ │ +
static constexpr bool isGridViewFunction()
Check if F models the GridViewFunction concept with given signature.
Definition functionconcepts.hh:347
│ │ │ │ +
static constexpr bool isEntitySet()
Check if F models the GridFunction concept with given signature and entity set.
Definition functionconcepts.hh:235
│ │ │ │ +
static constexpr bool isDifferentiableGridFunction()
Check if F models the DifferentiableGridFunction concept with given signature and entity set.
Definition functionconcepts.hh:314
│ │ │ │ +
static constexpr bool isLocalFunction()
Check if F models the LocalFunction concept with given signature and local context.
Definition functionconcepts.hh:170
│ │ │ │ +
TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const TrigonometricFunction< K, sinFactor, cosFactor > &f)
Obtain derivative of TrigonometricFunction function.
Definition trigonometricfunction.hh:43
│ │ │ │ +
static constexpr auto isCallable()
Check if f is callable with given argument list.
Definition functionconcepts.hh:51
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
An entity set for all entities of given codim in a grid view.
Definition gridviewentityset.hh:27
│ │ │ │ -
GridViewEntitySet(const GridView &gv)
Construct GridViewEntitySet for a GridView.
Definition gridviewentityset.hh:51
│ │ │ │ -
GV GridView
Definition gridviewentityset.hh:30
│ │ │ │ -
GridView::template Codim< codim >::Entity Element
Type of Elements contained in this EntitySet.
Definition gridviewentityset.hh:36
│ │ │ │ -
const_iterator end() const
Create an end iterator.
Definition gridviewentityset.hh:74
│ │ │ │ -
const GridView & gridView() const
Return the associated GridView.
Definition gridviewentityset.hh:80
│ │ │ │ -
Element value_type
Definition gridviewentityset.hh:42
│ │ │ │ -
const_iterator begin() const
Create a begin iterator.
Definition gridviewentityset.hh:68
│ │ │ │ -
GridView::template Codim< codim >::Iterator const_iterator
A forward iterator.
Definition gridviewentityset.hh:45
│ │ │ │ -
Element::Geometry::LocalCoordinate LocalCoordinate
Type of local coordinates with respect to the Element.
Definition gridviewentityset.hh:39
│ │ │ │ -
size_t size() const
Return number of Elements visited by an iterator.
Definition gridviewentityset.hh:62
│ │ │ │ -
Element::Geometry::GlobalCoordinate GlobalCoordinate
Definition gridviewentityset.hh:40
│ │ │ │ -
@ codim
Definition gridviewentityset.hh:32
│ │ │ │ -
bool contains(const Element &e) const
Return true if e is contained in the EntitySet.
Definition gridviewentityset.hh:56
│ │ │ │ -
const_iterator iterator
Same as const_iterator.
Definition gridviewentityset.hh:48
│ │ │ │ +
Default implementation for derivative traits.
Definition defaultderivativetraits.hh:41
│ │ │ │ +
Concept objects that can be called with given argument list.
Definition functionconcepts.hh:37
│ │ │ │ +
auto require(F &&f) -> decltype(f(std::declval< Args >()...))
│ │ │ │ +
Definition functionconcepts.hh:70
│ │ │ │ +
auto require(F &&f) -> decltype(requireConvertible< Range >(f(std::declval< Domain >())))
│ │ │ │ +
Definition functionconcepts.hh:104
│ │ │ │ +
typename SignatureTraits< Range(Domain)>::template DerivativeSignature< DerivativeTraits > DerivativeSignature
Definition functionconcepts.hh:120
│ │ │ │ +
auto require(F &&f) -> decltype(derivative(f), requireConcept< Function< DerivativeSignature > >(derivative(f)))
│ │ │ │ +
Definition functionconcepts.hh:143
│ │ │ │ +
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:224
│ │ │ │ +
auto require(E &&f) -> decltype(requireType< typename E::Element >(), requireType< typename E::LocalCoordinate >(), requireType< typename E::GlobalCoordinate >())
│ │ │ │ +
Definition functionconcepts.hh:242
│ │ │ │ +
typename EntitySet::Element LocalContext
Definition functionconcepts.hh:258
│ │ │ │ +
Range(typename EntitySet::LocalCoordinate) LocalSignature
Definition functionconcepts.hh:257
│ │ │ │ +
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 >())
│ │ │ │ + │ │ │ │ +
typename Dune::Functions::LocalDerivativeTraits< EntitySet, DerivativeTraits >::template Traits< R > LocalDerivativeTraits
Definition functionconcepts.hh:304
│ │ │ │ +
auto require(F &&f) -> decltype(requireConcept< DifferentiableLocalFunction< LocalSignature, LocalContext, LocalDerivativeTraits > >(localFunction(f)))
│ │ │ │ +
Range(typename EntitySet::LocalCoordinate) LocalSignature
Definition functionconcepts.hh:300
│ │ │ │ + │ │ │ │ +
Definition functionconcepts.hh:321
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
Helper class to deduce the signature of a callable.
Definition signature.hh:60
│ │ │ │ +
Definition signature.hh:106
│ │ │ │ +
Derivative traits for local functions.
Definition localderivativetraits.hh:32
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,146 +1,465 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ -gridviewentityset.hh │ │ │ │ │ + * _c_o_m_m_o_n │ │ │ │ │ +functionconcepts.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWENTITYSET_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWENTITYSET_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11 │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ 12 │ │ │ │ │ -13namespace _D_u_n_e { │ │ │ │ │ -14 │ │ │ │ │ -15namespace Functions { │ │ │ │ │ +13#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_s_i_g_n_a_t_u_r_e_._h_h> │ │ │ │ │ +14#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_l_o_c_a_l_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +15#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h> │ │ │ │ │ 16 │ │ │ │ │ -17 │ │ │ │ │ -25template │ │ │ │ │ -_2_6class _G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t │ │ │ │ │ -27{ │ │ │ │ │ -28public: │ │ │ │ │ -29 │ │ │ │ │ -_3_0 typedef GV _G_r_i_d_V_i_e_w; │ │ │ │ │ -31 enum { │ │ │ │ │ -32 _c_o_d_i_m = cd │ │ │ │ │ -_3_3 }; │ │ │ │ │ -34 │ │ │ │ │ -_3_6 typedef typename GridView::template Codim::Entity _E_l_e_m_e_n_t; │ │ │ │ │ -37 │ │ │ │ │ -_3_9 typedef typename Element::Geometry::LocalCoordinate _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ -_4_0 typedef typename Element::Geometry::GlobalCoordinate _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ -41 │ │ │ │ │ -_4_2 typedef _E_l_e_m_e_n_t _v_a_l_u_e___t_y_p_e; │ │ │ │ │ +17namespace _D_u_n_e { │ │ │ │ │ +18namespace Functions { │ │ │ │ │ +19namespace Concept { │ │ │ │ │ +20 │ │ │ │ │ +21using namespace Dune::Concept; │ │ │ │ │ +22 │ │ │ │ │ +23 │ │ │ │ │ +24 │ │ │ │ │ +25// Callable concept │ │ │ │ │ +############################################################ │ │ │ │ │ +26 │ │ │ │ │ +27 │ │ │ │ │ +35template │ │ │ │ │ +_3_6struct _C_a_l_l_a_b_l_e │ │ │ │ │ +37{ │ │ │ │ │ +38 template │ │ │ │ │ +_3_9 auto _r_e_q_u_i_r_e(F&& f) -> decltype( │ │ │ │ │ +40 f(std::declval()...) │ │ │ │ │ +41 ); │ │ │ │ │ +42}; │ │ │ │ │ 43 │ │ │ │ │ -_4_5 typedef typename GridView::template Codim::Iterator _c_o_n_s_t___i_t_e_r_a_t_o_r; │ │ │ │ │ -46 │ │ │ │ │ -_4_8 typedef _c_o_n_s_t___i_t_e_r_a_t_o_r _i_t_e_r_a_t_o_r; │ │ │ │ │ -49 │ │ │ │ │ -_5_1 _G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t(const _G_r_i_d_V_i_e_w& gv) : │ │ │ │ │ -52 gv_(gv) │ │ │ │ │ -53 {} │ │ │ │ │ -54 │ │ │ │ │ -_5_6 bool _c_o_n_t_a_i_n_s(const _E_l_e_m_e_n_t& e) const │ │ │ │ │ -57 { │ │ │ │ │ -58 return gv_.contains(e); │ │ │ │ │ -59 } │ │ │ │ │ -60 │ │ │ │ │ -_6_2 size_t _s_i_z_e() const │ │ │ │ │ -63 { │ │ │ │ │ -64 return gv_.size(_c_o_d_i_m); │ │ │ │ │ -65 } │ │ │ │ │ +50template │ │ │ │ │ +_5_1static constexpr auto _i_s_C_a_l_l_a_b_l_e() │ │ │ │ │ +52{ return models<_C_o_n_c_e_p_t_:_:_C_a_l_l_a_b_l_e, F>(); } │ │ │ │ │ +53 │ │ │ │ │ +60template │ │ │ │ │ +_6_1static constexpr auto _i_s_C_a_l_l_a_b_l_e(F&&, Args&&...) │ │ │ │ │ +62{ │ │ │ │ │ +63 return models<_C_o_n_c_e_p_t_:_:_C_a_l_l_a_b_l_e, F>(); │ │ │ │ │ +64} │ │ │ │ │ +65 │ │ │ │ │ 66 │ │ │ │ │ -_6_8 _c_o_n_s_t___i_t_e_r_a_t_o_r _b_e_g_i_n() const │ │ │ │ │ -69 { │ │ │ │ │ -70 return gv_.template begin(); │ │ │ │ │ -71 } │ │ │ │ │ -72 │ │ │ │ │ -_7_4 _c_o_n_s_t___i_t_e_r_a_t_o_r _e_n_d() const │ │ │ │ │ -75 { │ │ │ │ │ -76 return gv_.template end(); │ │ │ │ │ -77 } │ │ │ │ │ -78 │ │ │ │ │ -_8_0 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ -81 { │ │ │ │ │ -82 return gv_; │ │ │ │ │ -83 } │ │ │ │ │ -84 │ │ │ │ │ -85private: │ │ │ │ │ -86 _G_r_i_d_V_i_e_w gv_; │ │ │ │ │ -87}; │ │ │ │ │ -88 │ │ │ │ │ +67 │ │ │ │ │ +68// Function concept │ │ │ │ │ +############################################################ │ │ │ │ │ +69template │ │ │ │ │ +_7_0struct _F_u_n_c_t_i_o_n; │ │ │ │ │ +71 │ │ │ │ │ +80template │ │ │ │ │ +_8_1struct _F_u_n_c_t_i_o_n : Refines > │ │ │ │ │ +82{ │ │ │ │ │ +83 template │ │ │ │ │ +_8_4 auto _r_e_q_u_i_r_e(F&& f) -> decltype( │ │ │ │ │ +85 // F models Function if the result of F(Domain) is implicitly │ │ │ │ │ +convertible to Range │ │ │ │ │ +86 requireConvertible(f(std::declval())) │ │ │ │ │ +87 ); │ │ │ │ │ +88}; │ │ │ │ │ 89 │ │ │ │ │ -90} // end of namespace Dune::Functions │ │ │ │ │ -91} // end of namespace Dune │ │ │ │ │ -92 │ │ │ │ │ -93#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWENTITYSET_HH │ │ │ │ │ +91template │ │ │ │ │ +_9_2static constexpr bool _i_s_F_u_n_c_t_i_o_n() │ │ │ │ │ +93{ return models, F>(); } │ │ │ │ │ +94 │ │ │ │ │ +96template class DerivativeTraits> │ │ │ │ │ +_9_7static constexpr bool _i_s_F_u_n_c_t_i_o_n(F&& f, _S_i_g_n_a_t_u_r_e_T_a_g_<_S_i_g_n_a_t_u_r_e_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_>) │ │ │ │ │ +98{ return models, F>(); } │ │ │ │ │ +99 │ │ │ │ │ +100 │ │ │ │ │ +101 │ │ │ │ │ +102// DifferentiableFunction concept │ │ │ │ │ +############################################## │ │ │ │ │ +103template class DerivativeTraits = │ │ │ │ │ +_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s> │ │ │ │ │ +_1_0_4struct _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n; │ │ │ │ │ +105 │ │ │ │ │ +117template class DerivativeTraits> │ │ │ │ │ +_1_1_8struct _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n : │ │ │ │ │ +Refines > │ │ │ │ │ +119{ │ │ │ │ │ +_1_2_0 using _D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e = typename _S_i_g_n_a_t_u_r_e_T_r_a_i_t_s:: │ │ │ │ │ +template _D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_<_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_>; │ │ │ │ │ +121 │ │ │ │ │ +122 template │ │ │ │ │ +_1_2_3 auto _r_e_q_u_i_r_e(F&& f) -> decltype( │ │ │ │ │ +124 _d_e_r_i_v_a_t_i_v_e(f), │ │ │ │ │ +125 requireConcept>(_d_e_r_i_v_a_t_i_v_e(f)) │ │ │ │ │ +126 ); │ │ │ │ │ +127}; │ │ │ │ │ +128 │ │ │ │ │ +130template class DerivativeTraits = │ │ │ │ │ +_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s> │ │ │ │ │ +_1_3_1static constexpr bool _i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n() │ │ │ │ │ +132{ return models, F>(); } │ │ │ │ │ +133 │ │ │ │ │ +135template class DerivativeTraits> │ │ │ │ │ +_1_3_6static constexpr bool _i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n(F&& f, │ │ │ │ │ +_S_i_g_n_a_t_u_r_e_T_a_g_<_S_i_g_n_a_t_u_r_e_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_>) │ │ │ │ │ +137{ return models, F>(); } │ │ │ │ │ +138 │ │ │ │ │ +139 │ │ │ │ │ +140 │ │ │ │ │ +141// LocalFunction concept ############################################## │ │ │ │ │ +142template │ │ │ │ │ +_1_4_3struct _L_o_c_a_l_F_u_n_c_t_i_o_n; │ │ │ │ │ +144 │ │ │ │ │ +154template │ │ │ │ │ +_1_5_5struct _L_o_c_a_l_F_u_n_c_t_i_o_n : │ │ │ │ │ +156 Refines > │ │ │ │ │ +157{ │ │ │ │ │ +158 template │ │ │ │ │ +_1_5_9 auto _r_e_q_u_i_r_e(F&& f) -> decltype( │ │ │ │ │ +160 f.bind(std::declval()), │ │ │ │ │ +161 f.unbind(), │ │ │ │ │ +162 requireConvertible(f.bound()), │ │ │ │ │ +163 f.localContext(), │ │ │ │ │ +164 requireConvertible(f.localContext()) │ │ │ │ │ +165 ); │ │ │ │ │ +166}; │ │ │ │ │ +167 │ │ │ │ │ +169template │ │ │ │ │ +_1_7_0static constexpr bool _i_s_L_o_c_a_l_F_u_n_c_t_i_o_n() │ │ │ │ │ +171{ return models, F>(); } │ │ │ │ │ +172 │ │ │ │ │ +173 │ │ │ │ │ +174// DifferentiableLocalFunction concept │ │ │ │ │ +############################################## │ │ │ │ │ +175template class │ │ │ │ │ +DerivativeTraits = _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s> │ │ │ │ │ +_1_7_6struct _D_i_f_f_e_r_e_n_t_i_a_b_l_e_L_o_c_a_l_F_u_n_c_t_i_o_n; │ │ │ │ │ +177 │ │ │ │ │ +190template │ │ │ │ │ +class DerivativeTraits> │ │ │ │ │ +_1_9_1struct _D_i_f_f_e_r_e_n_t_i_a_b_l_e_L_o_c_a_l_F_u_n_c_t_i_o_n : │ │ │ │ │ +192 Refines< │ │ │ │ │ +193 Dune::Functions::Concept::DifferentiableFunction, │ │ │ │ │ +194 Dune::Functions::Concept::LocalFunction │ │ │ │ │ +195 > │ │ │ │ │ +196{ │ │ │ │ │ +197 template │ │ │ │ │ +_1_9_8 auto _r_e_q_u_i_r_e(F&& f) -> decltype( │ │ │ │ │ +199 f.bind(std::declval()), │ │ │ │ │ +200 f.unbind(), │ │ │ │ │ +201 f.localContext(), │ │ │ │ │ +202 requireConvertible(f.localContext()) │ │ │ │ │ +203 ); │ │ │ │ │ +204}; │ │ │ │ │ +205 │ │ │ │ │ +207template class │ │ │ │ │ +DerivativeTraits = _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s> │ │ │ │ │ +_2_0_8static constexpr bool _i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_L_o_c_a_l_F_u_n_c_t_i_o_n() │ │ │ │ │ +209{ return models, F>(); } │ │ │ │ │ +210 │ │ │ │ │ +211 │ │ │ │ │ +212// EntitySet concept ############################################## │ │ │ │ │ +213 │ │ │ │ │ +_2_2_3struct _E_n_t_i_t_y_S_e_t │ │ │ │ │ +224{ │ │ │ │ │ +225 template │ │ │ │ │ +_2_2_6 auto _r_e_q_u_i_r_e(E&& f) -> decltype( │ │ │ │ │ +227 requireType(), │ │ │ │ │ +228 requireType(), │ │ │ │ │ +229 requireType() │ │ │ │ │ +230 ); │ │ │ │ │ +231}; │ │ │ │ │ +232 │ │ │ │ │ +234template │ │ │ │ │ +_2_3_5static constexpr bool _i_s_E_n_t_i_t_y_S_e_t() │ │ │ │ │ +236{ return models(); } │ │ │ │ │ +237 │ │ │ │ │ +238 │ │ │ │ │ +239 │ │ │ │ │ +240// GridFunction concept ############################################## │ │ │ │ │ +241template │ │ │ │ │ +_2_4_2struct _G_r_i_d_F_u_n_c_t_i_o_n; │ │ │ │ │ +243 │ │ │ │ │ +253template │ │ │ │ │ +_2_5_4struct _G_r_i_d_F_u_n_c_t_i_o_n : │ │ │ │ │ +255 Refines > │ │ │ │ │ +256{ │ │ │ │ │ +_2_5_7 using _L_o_c_a_l_S_i_g_n_a_t_u_r_e = Range(typename EntitySet::LocalCoordinate); │ │ │ │ │ +_2_5_8 using _L_o_c_a_l_C_o_n_t_e_x_t = typename EntitySet::Element; │ │ │ │ │ +259 │ │ │ │ │ +260 template │ │ │ │ │ +_2_6_1 auto _r_e_q_u_i_r_e(F&& f) -> decltype( │ │ │ │ │ +262 localFunction(f), │ │ │ │ │ +263 f.entitySet(), │ │ │ │ │ +264 requireConcept>(localFunction │ │ │ │ │ +(f)), │ │ │ │ │ +265 requireConcept(), │ │ │ │ │ +266 requireConvertible(f.entitySet()), │ │ │ │ │ +267 requireConvertible() │ │ │ │ │ +268 ); │ │ │ │ │ +269}; │ │ │ │ │ +270 │ │ │ │ │ +272template │ │ │ │ │ +_2_7_3static constexpr bool _i_s_G_r_i_d_F_u_n_c_t_i_o_n() │ │ │ │ │ +274{ return models, F>(); } │ │ │ │ │ +275 │ │ │ │ │ +276 │ │ │ │ │ +277// DifferentiableGridFunction concept │ │ │ │ │ +############################################## │ │ │ │ │ +278template class │ │ │ │ │ +DerivativeTraits = _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s> │ │ │ │ │ +_2_7_9struct _D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_F_u_n_c_t_i_o_n; │ │ │ │ │ +280 │ │ │ │ │ +293template class │ │ │ │ │ +DerivativeTraits> │ │ │ │ │ +_2_9_4struct _D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_F_u_n_c_t_i_o_n : │ │ │ │ │ +295 Refines< │ │ │ │ │ +296 Dune::Functions::Concept::DifferentiableFunction, │ │ │ │ │ +297 Dune::Functions::Concept::GridFunction │ │ │ │ │ +298 > │ │ │ │ │ +299{ │ │ │ │ │ +_3_0_0 using _L_o_c_a_l_S_i_g_n_a_t_u_r_e = Range(typename EntitySet::LocalCoordinate); │ │ │ │ │ +_3_0_1 using _L_o_c_a_l_C_o_n_t_e_x_t = typename EntitySet::Element; │ │ │ │ │ +302 │ │ │ │ │ +303 template │ │ │ │ │ +_3_0_4 using _L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s = typename _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_: │ │ │ │ │ +_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_E_n_t_i_t_y_S_e_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_>_:_:_t_e_m_p_l_a_t_e Traits; │ │ │ │ │ +305 │ │ │ │ │ +306 template │ │ │ │ │ +_3_0_7 auto _r_e_q_u_i_r_e(F&& f) -> decltype( │ │ │ │ │ +308 requireConcept>(localFunction(f)) │ │ │ │ │ +309 ); │ │ │ │ │ +310}; │ │ │ │ │ +311 │ │ │ │ │ +313template class │ │ │ │ │ +DerivativeTraits = _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s> │ │ │ │ │ +_3_1_4static constexpr bool _i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_F_u_n_c_t_i_o_n() │ │ │ │ │ +315{ return models, F>(); } │ │ │ │ │ +316 │ │ │ │ │ +317 │ │ │ │ │ +318 │ │ │ │ │ +319// GridViewFunction concept ############################################## │ │ │ │ │ +320template │ │ │ │ │ +_3_2_1struct _G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n; │ │ │ │ │ +322 │ │ │ │ │ +335template │ │ │ │ │ +_3_3_6struct _G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n : │ │ │ │ │ +337 Refines>> │ │ │ │ │ +338{ │ │ │ │ │ +339 template │ │ │ │ │ +_3_4_0 auto _r_e_q_u_i_r_e(F&& f) -> decltype( │ │ │ │ │ +341 0 // We don't need to check any further expressions, because a │ │ │ │ │ +GridViewFunction is just a GridFunction with a special EntitySet │ │ │ │ │ +342 ); │ │ │ │ │ +343}; │ │ │ │ │ +344 │ │ │ │ │ +346template │ │ │ │ │ +_3_4_7static constexpr bool _i_s_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n() │ │ │ │ │ +348{ return models, F>(); } │ │ │ │ │ +349 │ │ │ │ │ +350 │ │ │ │ │ +351// DifferentiableGridViewFunction concept │ │ │ │ │ +############################################## │ │ │ │ │ +352template class │ │ │ │ │ +DerivativeTraits = _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s> │ │ │ │ │ +_3_5_3struct _D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n; │ │ │ │ │ +354 │ │ │ │ │ +368template class │ │ │ │ │ +DerivativeTraits> │ │ │ │ │ +_3_6_9struct _D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n : │ │ │ │ │ +370 Refines, DerivativeTraits>> │ │ │ │ │ +371{ │ │ │ │ │ +372 template │ │ │ │ │ +_3_7_3 auto _r_e_q_u_i_r_e(F&& f) -> decltype( │ │ │ │ │ +374 0 // We don't need to check any further expressions, because a │ │ │ │ │ +GridViewFunction is just a GridFunction with a special EntitySet │ │ │ │ │ +375 ); │ │ │ │ │ +376}; │ │ │ │ │ +377 │ │ │ │ │ +379template class │ │ │ │ │ +DerivativeTraits = _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s> │ │ │ │ │ +_3_8_0static constexpr bool _i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n() │ │ │ │ │ +381{ return models, F>(); } │ │ │ │ │ +382 │ │ │ │ │ +383 │ │ │ │ │ +384 │ │ │ │ │ +385}}} // namespace Dune::Functions::Concept │ │ │ │ │ +386 │ │ │ │ │ +387#endif // DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH │ │ │ │ │ +_s_i_g_n_a_t_u_r_e_._h_h │ │ │ │ │ +_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h │ │ │ │ │ +_l_o_c_a_l_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ +static constexpr bool isGridFunction() │ │ │ │ │ +Check if F models the GridFunction concept with given signature and entity set. │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:273 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ +static constexpr bool isDifferentiableLocalFunction() │ │ │ │ │ +Check if F models the DifferentiableLocalFunction concept with given signature │ │ │ │ │ +and local context. │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:208 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_F_u_n_c_t_i_o_n │ │ │ │ │ +static constexpr bool isFunction() │ │ │ │ │ +Check if F models the Function concept with given signature. │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:92 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ +static constexpr bool isDifferentiableGridViewFunction() │ │ │ │ │ +Check if F models the DifferentiableGridViewFunction concept with given │ │ │ │ │ +signature. │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:380 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n │ │ │ │ │ +static constexpr bool isDifferentiableFunction() │ │ │ │ │ +Check if F models the DifferentiableFunction concept with given signature. │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:131 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ +static constexpr bool isGridViewFunction() │ │ │ │ │ +Check if F models the GridViewFunction concept with given signature. │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:347 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_E_n_t_i_t_y_S_e_t │ │ │ │ │ +static constexpr bool isEntitySet() │ │ │ │ │ +Check if F models the GridFunction concept with given signature and entity set. │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:235 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ +static constexpr bool isDifferentiableGridFunction() │ │ │ │ │ +Check if F models the DifferentiableGridFunction concept with given signature │ │ │ │ │ +and entity set. │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:314 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ +static constexpr bool isLocalFunction() │ │ │ │ │ +Check if F models the LocalFunction concept with given signature and local │ │ │ │ │ +context. │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:170 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ +TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const │ │ │ │ │ +TrigonometricFunction< K, sinFactor, cosFactor > &f) │ │ │ │ │ +Obtain derivative of TrigonometricFunction function. │ │ │ │ │ +DDeeffiinniittiioonn trigonometricfunction.hh:43 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_C_a_l_l_a_b_l_e │ │ │ │ │ +static constexpr auto isCallable() │ │ │ │ │ +Check if f is callable with given argument list. │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:51 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t │ │ │ │ │ -An entity set for all entities of given codim in a grid view. │ │ │ │ │ -DDeeffiinniittiioonn gridviewentityset.hh:27 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t │ │ │ │ │ -GridViewEntitySet(const GridView &gv) │ │ │ │ │ -Construct GridViewEntitySet for a GridView. │ │ │ │ │ -DDeeffiinniittiioonn gridviewentityset.hh:51 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ -GV GridView │ │ │ │ │ -DDeeffiinniittiioonn gridviewentityset.hh:30 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_E_l_e_m_e_n_t │ │ │ │ │ -GridView::template Codim< codim >::Entity Element │ │ │ │ │ -Type of Elements contained in this EntitySet. │ │ │ │ │ -DDeeffiinniittiioonn gridviewentityset.hh:36 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_e_n_d │ │ │ │ │ -const_iterator end() const │ │ │ │ │ -Create an end iterator. │ │ │ │ │ -DDeeffiinniittiioonn gridviewentityset.hh:74 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ -const GridView & gridView() const │ │ │ │ │ -Return the associated GridView. │ │ │ │ │ -DDeeffiinniittiioonn gridviewentityset.hh:80 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ -Element value_type │ │ │ │ │ -DDeeffiinniittiioonn gridviewentityset.hh:42 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_b_e_g_i_n │ │ │ │ │ -const_iterator begin() const │ │ │ │ │ -Create a begin iterator. │ │ │ │ │ -DDeeffiinniittiioonn gridviewentityset.hh:68 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ -GridView::template Codim< codim >::Iterator const_iterator │ │ │ │ │ -A forward iterator. │ │ │ │ │ -DDeeffiinniittiioonn gridviewentityset.hh:45 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -Element::Geometry::LocalCoordinate LocalCoordinate │ │ │ │ │ -Type of local coordinates with respect to the Element. │ │ │ │ │ -DDeeffiinniittiioonn gridviewentityset.hh:39 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_s_i_z_e │ │ │ │ │ -size_t size() const │ │ │ │ │ -Return number of Elements visited by an iterator. │ │ │ │ │ -DDeeffiinniittiioonn gridviewentityset.hh:62 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -Element::Geometry::GlobalCoordinate GlobalCoordinate │ │ │ │ │ -DDeeffiinniittiioonn gridviewentityset.hh:40 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_c_o_d_i_m │ │ │ │ │ -@ codim │ │ │ │ │ -DDeeffiinniittiioonn gridviewentityset.hh:32 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_c_o_n_t_a_i_n_s │ │ │ │ │ -bool contains(const Element &e) const │ │ │ │ │ -Return true if e is contained in the EntitySet. │ │ │ │ │ -DDeeffiinniittiioonn gridviewentityset.hh:56 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ -const_iterator iterator │ │ │ │ │ -Same as const_iterator. │ │ │ │ │ -DDeeffiinniittiioonn gridviewentityset.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ +Default implementation for derivative traits. │ │ │ │ │ +DDeeffiinniittiioonn defaultderivativetraits.hh:41 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_C_a_l_l_a_b_l_e │ │ │ │ │ +Concept objects that can be called with given argument list. │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:37 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_C_a_l_l_a_b_l_e_:_:_r_e_q_u_i_r_e │ │ │ │ │ +auto require(F &&f) -> decltype(f(std::declval< Args >()...)) │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_F_u_n_c_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:70 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_>_:_:_r_e_q_u_i_r_e │ │ │ │ │ +auto require(F &&f) -> decltype(requireConvertible< Range >(f(std::declval< │ │ │ │ │ +Domain >()))) │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:104 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e │ │ │ │ │ +typename SignatureTraits< Range(Domain)>::template DerivativeSignature< │ │ │ │ │ +DerivativeTraits > DerivativeSignature │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:120 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_r_e_q_u_i_r_e │ │ │ │ │ +auto require(F &&f) -> decltype(derivative(f), requireConcept< Function< │ │ │ │ │ +DerivativeSignature > >(derivative(f))) │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:143 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _L_o_c_a_l_C_o_n_t_e_x_t_ _>_:_:_r_e_q_u_i_r_e │ │ │ │ │ +auto require(F &&f) -> decltype(f.bind(std::declval< LocalContext >()), │ │ │ │ │ +f.unbind(), requireConvertible< bool >(f.bound()), f.localContext(), │ │ │ │ │ +requireConvertible< LocalContext >(f.localContext())) │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:176 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ +_L_o_c_a_l_C_o_n_t_e_x_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_r_e_q_u_i_r_e │ │ │ │ │ +auto require(F &&f) -> decltype(f.bind(std::declval< LocalContext >()), │ │ │ │ │ +f.unbind(), f.localContext(), requireConvertible< LocalContext >(f.localContext │ │ │ │ │ +())) │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_E_n_t_i_t_y_S_e_t │ │ │ │ │ +Concept for an entity set for a Concept::GridFunction │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:224 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_E_n_t_i_t_y_S_e_t_:_:_r_e_q_u_i_r_e │ │ │ │ │ +auto require(E &&f) -> decltype(requireType< typename E::Element >(), │ │ │ │ │ +requireType< typename E::LocalCoordinate >(), requireType< typename E:: │ │ │ │ │ +GlobalCoordinate >()) │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:242 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_n_t_i_t_y_S_e_t_ _>_:_: │ │ │ │ │ +_L_o_c_a_l_C_o_n_t_e_x_t │ │ │ │ │ +typename EntitySet::Element LocalContext │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:258 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_n_t_i_t_y_S_e_t_ _>_:_: │ │ │ │ │ +_L_o_c_a_l_S_i_g_n_a_t_u_r_e │ │ │ │ │ +Range(typename EntitySet::LocalCoordinate) LocalSignature │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:257 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_n_t_i_t_y_S_e_t_ _>_:_:_r_e_q_u_i_r_e │ │ │ │ │ +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 >()) │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:279 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_n_t_i_t_y_S_e_t_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ +typename Dune::Functions::LocalDerivativeTraits< EntitySet, DerivativeTraits │ │ │ │ │ +>::template Traits< R > LocalDerivativeTraits │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:304 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_n_t_i_t_y_S_e_t_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_r_e_q_u_i_r_e │ │ │ │ │ +auto require(F &&f) -> decltype(requireConcept< DifferentiableLocalFunction< │ │ │ │ │ +LocalSignature, LocalContext, LocalDerivativeTraits > >(localFunction(f))) │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_n_t_i_t_y_S_e_t_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_L_o_c_a_l_S_i_g_n_a_t_u_r_e │ │ │ │ │ +Range(typename EntitySet::LocalCoordinate) LocalSignature │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:300 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_n_t_i_t_y_S_e_t_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_L_o_c_a_l_C_o_n_t_e_x_t │ │ │ │ │ +typename EntitySet::Element LocalContext │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:301 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:321 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_r_i_d_V_i_e_w_ _>_:_:_r_e_q_u_i_r_e │ │ │ │ │ +auto require(F &&f) -> decltype(0) │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:353 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ +_G_r_i_d_V_i_e_w_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_r_e_q_u_i_r_e │ │ │ │ │ +auto require(F &&f) -> decltype(0) │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_r_a_i_t_s │ │ │ │ │ +Helper class to deduce the signature of a callable. │ │ │ │ │ +DDeeffiinniittiioonn signature.hh:60 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_a_g │ │ │ │ │ +DDeeffiinniittiioonn signature.hh:106 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ +Derivative traits for local functions. │ │ │ │ │ +DDeeffiinniittiioonn localderivativetraits.hh:32 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00026.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: discreteglobalbasisfunction.hh File Reference │ │ │ │ +dune-functions: localfunction_imp.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,74 +65,34 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
discreteglobalbasisfunction.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
localfunction_imp.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <memory>
│ │ │ │ -#include <optional>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/grid/utility/hierarchicsearch.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::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::ImplDoc
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<typename R , typename B , typename V >
auto Dune::Functions::makeDiscreteGlobalBasisFunction (B &&basis, V &&vector)
 Generate a DiscreteGlobalBasisFunction.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,60 +1,19 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -discreteglobalbasisfunction.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_h_i_e_r_a_r_c_h_i_c_n_o_d_e_t_o_r_a_n_g_e_m_a_p_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_f_l_a_t_v_e_c_t_o_r_v_i_e_w_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_b_a_c_k_e_n_d_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_b_a_c_k_e_n_d_s_/_i_s_t_l_v_e_c_t_o_r_b_a_c_k_e_n_d_._h_h> │ │ │ │ │ + * _c_o_m_m_o_n │ │ │ │ │ +_N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +localfunction_imp.hh File Reference │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n___i_m_p_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -CCllaasssseess │ │ │ │ │ - class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_<_ _B_,_ _V_,_ _N_T_R_E │ │ │ │ │ - _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_<_ _B_,_ _V_,_ _N_T_R_E │ │ │ │ │ - _>_:_:_D_a_t_a │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_<_ _B_,_ _V_,_ _N_T_R_E │ │ │ │ │ - _>_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_<_ _B_,_ _V_,_ _N_T_R_E_,_ _R_ _> │ │ │ │ │ -  A grid function induced by a global basis and a coefficient vector. │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_<_ _B_,_ _V_,_ _N_T_R_E_,_ _R_ _>_:_: │ │ │ │ │ - _L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_<_ _D_G_B_F_ _> │ │ │ │ │ -  Derivative of a _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_<_ _D_G_B_F_ _>_:_: │ │ │ │ │ - _L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ -  local function evaluating the derivative in reference coordinates │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n (B &&basis, V &&vector) │ │ │ │ │ -  Generate a _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n. │ │ │ │ │ -  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00026_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: discreteglobalbasisfunction.hh Source File │ │ │ │ +dune-functions: localfunction_imp.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,695 +70,96 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
discreteglobalbasisfunction.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_COMMON_LOCALFUNCTION_FUNCTION_IMP_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_COMMON_LOCALFUNCTION_FUNCTION_IMP_HH
│ │ │ │
9
│ │ │ │ -
10#include <memory>
│ │ │ │ -
11#include <optional>
│ │ │ │ + │ │ │ │ + │ │ │ │
12
│ │ │ │ -
13#include <dune/common/typetraits.hh>
│ │ │ │ +
13
│ │ │ │
14
│ │ │ │ -
15#include <dune/grid/utility/hierarchicsearch.hh>
│ │ │ │ -
16
│ │ │ │ -
17#include <dune/typetree/treecontainer.hh>
│ │ │ │ +
15namespace Dune {
│ │ │ │ +
16namespace Functions {
│ │ │ │ +
17namespace Imp {
│ │ │ │
18
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
25
│ │ │ │ -
26namespace Dune {
│ │ │ │ -
27namespace Functions {
│ │ │ │ -
28
│ │ │ │ +
19// Interface of type erasure wrapper
│ │ │ │ +
20//
│ │ │ │ +
21// Notice that the basic interface of polymorphic classes (destructor, clone, ...)
│ │ │ │ +
22// will be added by the type erasure foundation classes.
│ │ │ │ +
23template<class Signature, class DerivativeInterface, class LocalContext>
│ │ │ │ +
24class LocalFunctionWrapperInterface :
│ │ │ │ +
25 public DifferentiableFunctionWrapperInterface<Signature, DerivativeInterface>
│ │ │ │ +
26{
│ │ │ │ +
27public:
│ │ │ │ +
28 virtual void bind(const LocalContext&) = 0;
│ │ │ │
29
│ │ │ │ -
│ │ │ │ -
30namespace ImplDoc {
│ │ │ │ +
30 virtual void unbind() = 0;
│ │ │ │
31
│ │ │ │ -
32template<typename B, typename V, typename NTRE>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
34{
│ │ │ │ -
35public:
│ │ │ │ -
36 using Basis = B;
│ │ │ │ -
37 using Vector = V;
│ │ │ │ -
38
│ │ │ │ -
39 // In order to make the cache work for proxy-references
│ │ │ │ -
40 // we have to use AutonomousValue<T> instead of std::decay_t<T>
│ │ │ │ -
41 using Coefficient = Dune::AutonomousValue<decltype(std::declval<Vector>()[std::declval<typename Basis::MultiIndex>()])>;
│ │ │ │ -
42
│ │ │ │ -
43 using GridView = typename Basis::GridView;
│ │ │ │ - │ │ │ │ -
45 using Tree = typename Basis::LocalView::Tree;
│ │ │ │ -
46 using NodeToRangeEntry = NTRE;
│ │ │ │ -
47
│ │ │ │ - │ │ │ │ -
49
│ │ │ │ - │ │ │ │ -
51 using Element = typename EntitySet::Element;
│ │ │ │ -
52
│ │ │ │ -
53protected:
│ │ │ │ -
54
│ │ │ │ -
55 // This collects all data that is shared by all related
│ │ │ │ -
56 // global and local functions. This way we don't need to
│ │ │ │ -
57 // keep track of it individually.
│ │ │ │ -
│ │ │ │ -
58 struct Data
│ │ │ │ -
59 {
│ │ │ │ - │ │ │ │ -
61 std::shared_ptr<const Basis> basis;
│ │ │ │ -
62 std::shared_ptr<const Vector> coefficients;
│ │ │ │ -
63 std::shared_ptr<const NodeToRangeEntry> nodeToRangeEntry;
│ │ │ │ -
64 };
│ │ │ │ -
│ │ │ │ -
65
│ │ │ │ -
66public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
68 {
│ │ │ │ -
69 using LocalView = typename Basis::LocalView;
│ │ │ │ -
70 using size_type = typename Tree::size_type;
│ │ │ │ +
32 virtual bool bound() const = 0;
│ │ │ │ +
33
│ │ │ │ +
34 virtual const LocalContext& localContext() const = 0;
│ │ │ │ +
35};
│ │ │ │ +
36
│ │ │ │ +
37
│ │ │ │ +
38// Implementation of type erasure wrapper
│ │ │ │ +
39template<class Signature, class DerivativeInterface, class LocalContext, class B>
│ │ │ │ +
40class LocalFunctionWrapperImplementation :
│ │ │ │ +
41 public DifferentiableFunctionWrapperImplementation<Signature, DerivativeInterface, B>
│ │ │ │ +
42{
│ │ │ │ +
43 using Base = DifferentiableFunctionWrapperImplementation<Signature, DerivativeInterface, B>;
│ │ │ │ +
44public:
│ │ │ │ +
45 using Base::Base;
│ │ │ │ +
46
│ │ │ │ +
47 virtual void bind(const LocalContext& context)
│ │ │ │ +
48 {
│ │ │ │ +
49 this->get().bind(context);
│ │ │ │ +
50 }
│ │ │ │ +
51
│ │ │ │ +
52 virtual void unbind()
│ │ │ │ +
53 {
│ │ │ │ +
54 this->get().unbind();
│ │ │ │ +
55 }
│ │ │ │ +
56
│ │ │ │ +
57 virtual bool bound() const
│ │ │ │ +
58 {
│ │ │ │ +
59 return this->get().bound();
│ │ │ │ +
60 }
│ │ │ │ +
61
│ │ │ │ +
62 virtual const LocalContext& localContext() const
│ │ │ │ +
63 {
│ │ │ │ +
64 return this->get().localContext();
│ │ │ │ +
65 }
│ │ │ │ +
66};
│ │ │ │ +
67
│ │ │ │ +
68}}} // namespace Dune::Functions::Imp
│ │ │ │ +
69
│ │ │ │ +
70
│ │ │ │
71
│ │ │ │ -
72 public:
│ │ │ │ - │ │ │ │ -
74 using Element = typename EntitySet::Element;
│ │ │ │ -
75
│ │ │ │ -
76 protected:
│ │ │ │ -
│ │ │ │ -
77 LocalFunctionBase(const std::shared_ptr<const Data>& data)
│ │ │ │ -
78 : data_(data)
│ │ │ │ -
79 , localView_(data_->basis->localView())
│ │ │ │ -
80 {
│ │ │ │ -
81 localDoFs_.reserve(localView_.maxSize());
│ │ │ │ -
82 }
│ │ │ │ -
│ │ │ │ -
83
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
91 : data_(other.data_)
│ │ │ │ -
92 , localView_(other.localView_)
│ │ │ │ -
93 {
│ │ │ │ -
94 localDoFs_.reserve(localView_.maxSize());
│ │ │ │ -
95 if (bound())
│ │ │ │ -
96 localDoFs_ = other.localDoFs_;
│ │ │ │ -
97 }
│ │ │ │ -
│ │ │ │ -
98
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
107 {
│ │ │ │ -
108 data_ = other.data_;
│ │ │ │ -
109 localView_ = other.localView_;
│ │ │ │ -
110 if (bound())
│ │ │ │ -
111 localDoFs_ = other.localDoFs_;
│ │ │ │ -
112 return *this;
│ │ │ │ -
113 }
│ │ │ │ -
│ │ │ │ -
114
│ │ │ │ -
115 public:
│ │ │ │ -
│ │ │ │ -
122 void bind(const Element& element)
│ │ │ │ -
123 {
│ │ │ │ -
124 localView_.bind(element);
│ │ │ │ -
125 // Use cache of full local view size. For a subspace basis,
│ │ │ │ -
126 // this may be larger than the number of local DOFs in the
│ │ │ │ -
127 // tree. In this case only cache entries associated to local
│ │ │ │ -
128 // DOFs in the subspace are filled. Cache entries associated
│ │ │ │ -
129 // to local DOFs which are not contained in the subspace will
│ │ │ │ -
130 // not be touched.
│ │ │ │ -
131 //
│ │ │ │ -
132 // Alternatively one could use a cache that exactly fits
│ │ │ │ -
133 // the size of the tree. However, this would require to
│ │ │ │ -
134 // subtract an offset from localIndex(i) on each cache
│ │ │ │ -
135 // access in operator().
│ │ │ │ -
136 localDoFs_.resize(localView_.size());
│ │ │ │ -
137 const auto& dofs = *data_->coefficients;
│ │ │ │ -
138 for (size_type i = 0; i < localView_.tree().size(); ++i)
│ │ │ │ -
139 {
│ │ │ │ -
140 // For a subspace basis the index-within-tree i
│ │ │ │ -
141 // is not the same as the localIndex within the
│ │ │ │ -
142 // full local view.
│ │ │ │ -
143 size_t localIndex = localView_.tree().localIndex(i);
│ │ │ │ -
144 localDoFs_[localIndex] = dofs[localView_.index(localIndex)];
│ │ │ │ -
145 }
│ │ │ │ -
146 }
│ │ │ │ -
│ │ │ │ -
147
│ │ │ │ -
│ │ │ │ -
149 void unbind()
│ │ │ │ -
150 {
│ │ │ │ -
151 localView_.unbind();
│ │ │ │ -
152 }
│ │ │ │ -
│ │ │ │ -
153
│ │ │ │ -
│ │ │ │ -
155 bool bound() const
│ │ │ │ -
156 {
│ │ │ │ -
157 return localView_.bound();
│ │ │ │ -
158 }
│ │ │ │ -
│ │ │ │ -
159
│ │ │ │ -
│ │ │ │ -
161 const Element& localContext() const
│ │ │ │ -
162 {
│ │ │ │ -
163 return localView_.element();
│ │ │ │ -
164 }
│ │ │ │ -
│ │ │ │ -
165
│ │ │ │ -
166 protected:
│ │ │ │ -
167
│ │ │ │ -
168 template<class To, class From>
│ │ │ │ -
│ │ │ │ -
169 void assignWith(To& to, const From& from) const
│ │ │ │ -
170 {
│ │ │ │ -
171 auto from_flat = flatVectorView(from);
│ │ │ │ -
172 auto to_flat = flatVectorView(to);
│ │ │ │ -
173 assert(from_flat.size() == to_flat.size());
│ │ │ │ -
174 for (size_type i = 0; i < to_flat.size(); ++i)
│ │ │ │ -
175 to_flat[i] = from_flat[i];
│ │ │ │ -
176 }
│ │ │ │ -
│ │ │ │ -
177
│ │ │ │ -
178 template<class Node, class TreePath, class Range>
│ │ │ │ -
│ │ │ │ -
179 decltype(auto) nodeToRangeEntry(const Node& node, const TreePath& treePath, Range& y) const
│ │ │ │ -
180 {
│ │ │ │ -
181 return (*data_->nodeToRangeEntry)(node, treePath, y);
│ │ │ │ -
182 }
│ │ │ │ -
│ │ │ │ -
183
│ │ │ │ -
184 std::shared_ptr<const Data> data_;
│ │ │ │ -
185 LocalView localView_;
│ │ │ │ -
186 std::vector<Coefficient> localDoFs_;
│ │ │ │ -
187 };
│ │ │ │ -
│ │ │ │ -
188
│ │ │ │ -
189protected:
│ │ │ │ -
│ │ │ │ -
190 DiscreteGlobalBasisFunctionBase(const std::shared_ptr<const Data>& data)
│ │ │ │ -
191 : data_(data)
│ │ │ │ -
192 {
│ │ │ │ -
193 /* Nothing. */
│ │ │ │ -
194 }
│ │ │ │ -
│ │ │ │ -
195
│ │ │ │ -
196public:
│ │ │ │ -
197
│ │ │ │ -
│ │ │ │ -
199 const Basis& basis() const
│ │ │ │ -
200 {
│ │ │ │ -
201 return *data_->basis;
│ │ │ │ -
202 }
│ │ │ │ -
│ │ │ │ -
203
│ │ │ │ -
│ │ │ │ -
205 const Vector& dofs() const
│ │ │ │ -
206 {
│ │ │ │ -
207 return *data_->coefficients;
│ │ │ │ -
208 }
│ │ │ │ -
│ │ │ │ -
209
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
212 {
│ │ │ │ -
213 return *data_->nodeToRangeEntry;
│ │ │ │ -
214 }
│ │ │ │ -
│ │ │ │ -
215
│ │ │ │ -
│ │ │ │ -
217 const EntitySet& entitySet() const
│ │ │ │ -
218 {
│ │ │ │ -
219 return data_->entitySet;
│ │ │ │ -
220 }
│ │ │ │ -
│ │ │ │ -
221
│ │ │ │ -
222protected:
│ │ │ │ -
223 std::shared_ptr<const Data> data_;
│ │ │ │ -
224};
│ │ │ │ -
│ │ │ │ -
225
│ │ │ │ -
226} // namespace ImplDoc
│ │ │ │ -
│ │ │ │ -
227
│ │ │ │ -
228
│ │ │ │ -
229
│ │ │ │ -
230template<typename DGBF>
│ │ │ │ - │ │ │ │ -
232
│ │ │ │ -
276template<typename B, typename V,
│ │ │ │ -
277 typename NTRE = HierarchicNodeToRangeMap,
│ │ │ │ -
278 typename R = typename V::value_type>
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
281{
│ │ │ │ - │ │ │ │ -
283 using Data = typename Base::Data;
│ │ │ │ -
284
│ │ │ │ -
285public:
│ │ │ │ -
286 using Basis = typename Base::Basis;
│ │ │ │ -
287 using Vector = typename Base::Vector;
│ │ │ │ -
288
│ │ │ │ -
289 using Domain = typename Base::Domain;
│ │ │ │ -
290 using Range = R;
│ │ │ │ -
291
│ │ │ │ -
292 using Traits = Imp::GridFunctionTraits<Range(Domain), typename Base::EntitySet, DefaultDerivativeTraits, 16>;
│ │ │ │ -
293
│ │ │ │ -
294private:
│ │ │ │ -
295
│ │ │ │ -
296 template<class Node>
│ │ │ │ -
297 using LocalBasisRange = typename Node::FiniteElement::Traits::LocalBasisType::Traits::RangeType;
│ │ │ │ -
298 template<class Node>
│ │ │ │ -
299 using NodeData = typename std::vector<LocalBasisRange<Node>>;
│ │ │ │ -
300 using PerNodeEvaluationBuffer = typename TypeTree::TreeContainer<NodeData, typename Base::Tree>;
│ │ │ │ -
301
│ │ │ │ -
302public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
305 {
│ │ │ │ -
306 using LocalBase = typename Base::LocalFunctionBase;
│ │ │ │ -
307 using size_type = typename Base::Tree::size_type;
│ │ │ │ -
308 using LocalBase::nodeToRangeEntry;
│ │ │ │ -
309
│ │ │ │ -
310 public:
│ │ │ │ -
311
│ │ │ │ - │ │ │ │ -
313 using Domain = typename LocalBase::Domain;
│ │ │ │ - │ │ │ │ -
315 using Element = typename LocalBase::Element;
│ │ │ │ -
316
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
319 : LocalBase(globalFunction.data_)
│ │ │ │ -
320 , evaluationBuffer_(this->localView_.tree())
│ │ │ │ -
321 {
│ │ │ │ -
322 /* Nothing. */
│ │ │ │ -
323 }
│ │ │ │ -
│ │ │ │ -
324
│ │ │ │ -
│ │ │ │ -
334 Range operator()(const Domain& x) const
│ │ │ │ -
335 {
│ │ │ │ -
336 Range y;
│ │ │ │ -
337 istlVectorBackend(y) = 0;
│ │ │ │ -
338
│ │ │ │ -
339 TypeTree::forEachLeafNode(this->localView_.tree(), [&](auto&& node, auto&& treePath) {
│ │ │ │ -
340 const auto& fe = node.finiteElement();
│ │ │ │ -
341 const auto& localBasis = fe.localBasis();
│ │ │ │ -
342 auto& shapeFunctionValues = evaluationBuffer_[treePath];
│ │ │ │ -
343
│ │ │ │ -
344 localBasis.evaluateFunction(x, shapeFunctionValues);
│ │ │ │ -
345
│ │ │ │ -
346 // Compute linear combinations of basis function jacobian.
│ │ │ │ -
347 // Non-scalar coefficients of dimension coeffDim are handled by
│ │ │ │ -
348 // processing the coeffDim linear combinations independently
│ │ │ │ -
349 // and storing them as entries of an array.
│ │ │ │ -
350 using Value = LocalBasisRange< std::decay_t<decltype(node)> >;
│ │ │ │ -
351 static constexpr auto coeffDim = decltype(flatVectorView(this->localDoFs_[node.localIndex(0)]).size())::value;
│ │ │ │ -
352 auto values = std::array<Value, coeffDim>{};
│ │ │ │ -
353 istlVectorBackend(values) = 0;
│ │ │ │ -
354 for (size_type i = 0; i < localBasis.size(); ++i)
│ │ │ │ -
355 {
│ │ │ │ -
356 auto c = flatVectorView(this->localDoFs_[node.localIndex(i)]);
│ │ │ │ -
357 for (std::size_t j = 0; j < coeffDim; ++j)
│ │ │ │ -
358 values[j].axpy(c[j], shapeFunctionValues[i]);
│ │ │ │ -
359 }
│ │ │ │ -
360
│ │ │ │ -
361 // Assign computed values to node entry of range.
│ │ │ │ -
362 // Types are matched using the lexicographic ordering provided by flatVectorView.
│ │ │ │ -
363 LocalBase::assignWith(nodeToRangeEntry(node, treePath, y), values);
│ │ │ │ -
364 });
│ │ │ │ -
365
│ │ │ │ -
366 return y;
│ │ │ │ -
367 }
│ │ │ │ -
│ │ │ │ -
368
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
371 {
│ │ │ │ - │ │ │ │ -
373 if (lf.bound())
│ │ │ │ -
374 dlf.bind(lf.localContext());
│ │ │ │ -
375 return dlf;
│ │ │ │ -
376 }
│ │ │ │ -
│ │ │ │ -
377
│ │ │ │ -
378 private:
│ │ │ │ -
379 mutable PerNodeEvaluationBuffer evaluationBuffer_;
│ │ │ │ -
380 };
│ │ │ │ -
│ │ │ │ -
381
│ │ │ │ -
383 template<class B_T, class V_T, class NTRE_T>
│ │ │ │ -
│ │ │ │ -
384 DiscreteGlobalBasisFunction(B_T && basis, V_T && coefficients, NTRE_T&& nodeToRangeEntry)
│ │ │ │ -
385 : 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))}))
│ │ │ │ -
386 {}
│ │ │ │ -
│ │ │ │ -
387
│ │ │ │ -
│ │ │ │ -
389 DiscreteGlobalBasisFunction(std::shared_ptr<const Basis> basis, std::shared_ptr<const V> coefficients, std::shared_ptr<const typename Base::NodeToRangeEntry> nodeToRangeEntry)
│ │ │ │ -
390 : Base(std::make_shared<Data>(Data{{basis->gridView()}, basis, coefficients, nodeToRangeEntry}))
│ │ │ │ -
391 {}
│ │ │ │ -
│ │ │ │ -
392
│ │ │ │ -
│ │ │ │ -
398 Range operator() (const Domain& x) const
│ │ │ │ -
399 {
│ │ │ │ -
400 HierarchicSearch search(this->data_->basis->gridView().grid(), this->data_->basis->gridView().indexSet());
│ │ │ │ -
401
│ │ │ │ -
402 const auto e = search.findEntity(x);
│ │ │ │ -
403 auto localThis = localFunction(*this);
│ │ │ │ -
404 localThis.bind(e);
│ │ │ │ -
405 return localThis(e.geometry().local(x));
│ │ │ │ -
406 }
│ │ │ │ -
│ │ │ │ -
407
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
410 {
│ │ │ │ - │ │ │ │ -
412 }
│ │ │ │ -
│ │ │ │ -
413
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
423 {
│ │ │ │ -
424 return LocalFunction(t);
│ │ │ │ -
425 }
│ │ │ │ -
│ │ │ │ -
426};
│ │ │ │ -
│ │ │ │ -
427
│ │ │ │ -
428
│ │ │ │ -
453template<typename R, typename B, typename V>
│ │ │ │ -
│ │ │ │ -
454auto makeDiscreteGlobalBasisFunction(B&& basis, V&& vector)
│ │ │ │ -
455{
│ │ │ │ -
456 using Basis = std::decay_t<B>;
│ │ │ │ -
457 using NTREM = HierarchicNodeToRangeMap;
│ │ │ │ -
458
│ │ │ │ -
459 // Small helper functions to wrap vectors using istlVectorBackend
│ │ │ │ -
460 // if they do not already satisfy the VectorBackend interface.
│ │ │ │ -
461 auto toConstVectorBackend = [&](auto&& v) -> decltype(auto) {
│ │ │ │ -
462 if constexpr (models<Concept::ConstVectorBackend<Basis>, decltype(v)>()) {
│ │ │ │ -
463 return std::forward<decltype(v)>(v);
│ │ │ │ -
464 } else {
│ │ │ │ -
465 return istlVectorBackend(v);
│ │ │ │ -
466 }
│ │ │ │ -
467 };
│ │ │ │ -
468
│ │ │ │ -
469 using Vector = std::decay_t<decltype(toConstVectorBackend(std::forward<V>(vector)))>;
│ │ │ │ - │ │ │ │ -
471 std::forward<B>(basis),
│ │ │ │ -
472 toConstVectorBackend(std::forward<V>(vector)),
│ │ │ │ - │ │ │ │ -
474}
│ │ │ │ -
│ │ │ │ -
475
│ │ │ │ -
476
│ │ │ │ -
491template<typename DGBF>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
493 : public ImplDoc::DiscreteGlobalBasisFunctionBase<typename DGBF::Basis, typename DGBF::Vector, typename DGBF::NodeToRangeEntry>
│ │ │ │ -
494{
│ │ │ │ - │ │ │ │ -
496 using Data = typename Base::Data;
│ │ │ │ -
497
│ │ │ │ -
498public:
│ │ │ │ - │ │ │ │ -
500
│ │ │ │ -
501 using Basis = typename Base::Basis;
│ │ │ │ -
502 using Vector = typename Base::Vector;
│ │ │ │ -
503
│ │ │ │ -
504 using Domain = typename Base::Domain;
│ │ │ │ - │ │ │ │ -
506
│ │ │ │ -
507 using Traits = Imp::GridFunctionTraits<Range(Domain), typename Base::EntitySet, DefaultDerivativeTraits, 16>;
│ │ │ │ -
508
│ │ │ │ -
509private:
│ │ │ │ -
510
│ │ │ │ -
511 template<class Node>
│ │ │ │ -
512 using LocalBasisRange = typename Node::FiniteElement::Traits::LocalBasisType::Traits::JacobianType;
│ │ │ │ -
513 template<class Node>
│ │ │ │ -
514 using NodeData = typename std::vector< LocalBasisRange<Node> >;
│ │ │ │ -
515 using PerNodeEvaluationBuffer = typename TypeTree::TreeContainer<NodeData, typename Base::Tree>;
│ │ │ │ -
516
│ │ │ │ -
517public:
│ │ │ │ -
518
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
528 {
│ │ │ │ -
529 using LocalBase = typename Base::LocalFunctionBase;
│ │ │ │ -
530 using size_type = typename Base::Tree::size_type;
│ │ │ │ -
531 using LocalBase::nodeToRangeEntry;
│ │ │ │ -
532
│ │ │ │ -
533 public:
│ │ │ │ - │ │ │ │ -
535 using Domain = typename LocalBase::Domain;
│ │ │ │ - │ │ │ │ -
537 using Element = typename LocalBase::Element;
│ │ │ │ -
538
│ │ │ │ -
│ │ │ │ -
540 LocalFunction(const GlobalFunction& globalFunction)
│ │ │ │ -
541 : LocalBase(globalFunction.data_)
│ │ │ │ -
542 , evaluationBuffer_(this->localView_.tree())
│ │ │ │ -
543 {
│ │ │ │ -
544 /* Nothing. */
│ │ │ │ -
545 }
│ │ │ │ -
│ │ │ │ -
546
│ │ │ │ -
│ │ │ │ -
553 void bind(const Element& element)
│ │ │ │ -
554 {
│ │ │ │ -
555 LocalBase::bind(element);
│ │ │ │ -
556 geometry_.emplace(element.geometry());
│ │ │ │ -
557 }
│ │ │ │ -
│ │ │ │ -
558
│ │ │ │ -
│ │ │ │ -
560 void unbind()
│ │ │ │ -
561 {
│ │ │ │ -
562 geometry_.reset();
│ │ │ │ -
563 LocalBase::unbind();
│ │ │ │ -
564 }
│ │ │ │ -
│ │ │ │ -
565
│ │ │ │ -
│ │ │ │ -
579 Range operator()(const Domain& x) const
│ │ │ │ -
580 {
│ │ │ │ -
581 Range y;
│ │ │ │ -
582 istlVectorBackend(y) = 0;
│ │ │ │ -
583
│ │ │ │ -
584 const auto& jacobianInverse = geometry_->jacobianInverse(x);
│ │ │ │ -
585
│ │ │ │ -
586 TypeTree::forEachLeafNode(this->localView_.tree(), [&](auto&& node, auto&& treePath) {
│ │ │ │ -
587 const auto& fe = node.finiteElement();
│ │ │ │ -
588 const auto& localBasis = fe.localBasis();
│ │ │ │ -
589 auto& shapeFunctionJacobians = evaluationBuffer_[treePath];
│ │ │ │ -
590
│ │ │ │ -
591 localBasis.evaluateJacobian(x, shapeFunctionJacobians);
│ │ │ │ -
592
│ │ │ │ -
593 // Compute linear combinations of basis function jacobian.
│ │ │ │ -
594 // Non-scalar coefficients of dimension coeffDim are handled by
│ │ │ │ -
595 // processing the coeffDim linear combinations independently
│ │ │ │ -
596 // and storing them as entries of an array.
│ │ │ │ -
597 using RefJacobian = LocalBasisRange< std::decay_t<decltype(node)> >;
│ │ │ │ -
598 static constexpr auto coeffDim = decltype(flatVectorView(this->localDoFs_[node.localIndex(0)]).size())::value;
│ │ │ │ -
599 auto refJacobians = std::array<RefJacobian, coeffDim>{};
│ │ │ │ -
600 istlVectorBackend(refJacobians) = 0;
│ │ │ │ -
601 for (size_type i = 0; i < localBasis.size(); ++i)
│ │ │ │ -
602 {
│ │ │ │ -
603 auto c = flatVectorView(this->localDoFs_[node.localIndex(i)]);
│ │ │ │ -
604 for (std::size_t j = 0; j < coeffDim; ++j)
│ │ │ │ -
605 refJacobians[j].axpy(c[j], shapeFunctionJacobians[i]);
│ │ │ │ -
606 }
│ │ │ │ -
607
│ │ │ │ -
608 // Transform Jacobians form local to global coordinates.
│ │ │ │ -
609 using Jacobian = decltype(refJacobians[0] * jacobianInverse);
│ │ │ │ -
610 auto jacobians = std::array<Jacobian, coeffDim>{};
│ │ │ │ -
611 std::transform(
│ │ │ │ -
612 refJacobians.begin(), refJacobians.end(), jacobians.begin(),
│ │ │ │ -
613 [&](const auto& refJacobian) { return refJacobian * jacobianInverse; });
│ │ │ │ -
614
│ │ │ │ -
615 // Assign computed Jacobians to node entry of range.
│ │ │ │ -
616 // Types are matched using the lexicographic ordering provided by flatVectorView.
│ │ │ │ -
617 LocalBase::assignWith(nodeToRangeEntry(node, treePath, y), jacobians);
│ │ │ │ -
618 });
│ │ │ │ -
619
│ │ │ │ -
620 return y;
│ │ │ │ -
621 }
│ │ │ │ -
│ │ │ │ -
622
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
625 {
│ │ │ │ -
626 DUNE_THROW(NotImplemented, "derivative of derivative is not implemented");
│ │ │ │ -
627 }
│ │ │ │ -
│ │ │ │ -
628
│ │ │ │ -
629 private:
│ │ │ │ -
630 mutable PerNodeEvaluationBuffer evaluationBuffer_;
│ │ │ │ -
631 std::optional<typename Element::Geometry> geometry_;
│ │ │ │ -
632 };
│ │ │ │ -
│ │ │ │ -
633
│ │ │ │ -
│ │ │ │ -
640 DiscreteGlobalBasisFunctionDerivative(const std::shared_ptr<const Data>& data)
│ │ │ │ -
641 : Base(data)
│ │ │ │ -
642 {
│ │ │ │ -
643 /* Nothing. */
│ │ │ │ -
644 }
│ │ │ │ -
│ │ │ │ -
645
│ │ │ │ -
│ │ │ │ -
651 Range operator()(const Domain& x) const
│ │ │ │ -
652 {
│ │ │ │ -
653 HierarchicSearch search(this->data_->basis->gridView().grid(), this->data_->basis->gridView().indexSet());
│ │ │ │ -
654
│ │ │ │ -
655 const auto e = search.findEntity(x);
│ │ │ │ -
656 auto localThis = localFunction(*this);
│ │ │ │ -
657 localThis.bind(e);
│ │ │ │ -
658 return localThis(e.geometry().local(x));
│ │ │ │ -
659 }
│ │ │ │ -
│ │ │ │ -
660
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
662 {
│ │ │ │ -
663 DUNE_THROW(NotImplemented, "derivative of derivative is not implemented");
│ │ │ │ -
664 }
│ │ │ │ -
│ │ │ │ -
665
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
668 {
│ │ │ │ -
669 return LocalFunction(f);
│ │ │ │ -
670 }
│ │ │ │ -
│ │ │ │ -
671};
│ │ │ │ -
│ │ │ │ -
672
│ │ │ │ -
673
│ │ │ │ -
674} // namespace Functions
│ │ │ │ -
675} // namespace Dune
│ │ │ │ -
676
│ │ │ │ -
677#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
auto makeDiscreteGlobalBasisFunction(B &&basis, V &&vector)
Generate a DiscreteGlobalBasisFunction.
Definition discreteglobalbasisfunction.hh:454
│ │ │ │ -
auto istlVectorBackend(Vector &v)
Return a vector backend wrapping non-const ISTL like containers.
Definition istlvectorbackend.hh:350
│ │ │ │ +
72#endif // DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_IMP_HH
│ │ │ │ + │ │ │ │ + │ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
auto flatVectorView(T &t)
Create flat vector view of passed mutable container.
Definition flatvectorview.hh:183
│ │ │ │ -
Default implementation for derivative traits.
Definition defaultderivativetraits.hh:41
│ │ │ │ -
Helper class to deduce the signature of a callable.
Definition signature.hh:60
│ │ │ │ -
A simple node to range map using the nested tree indices.
Definition hierarchicnodetorangemap.hh:34
│ │ │ │ -
Definition discreteglobalbasisfunction.hh:34
│ │ │ │ -
std::shared_ptr< const Data > data_
Definition discreteglobalbasisfunction.hh:223
│ │ │ │ -
const Vector & dofs() const
Return the coefficients of this discrete function by reference.
Definition discreteglobalbasisfunction.hh:205
│ │ │ │ -
B Basis
Definition discreteglobalbasisfunction.hh:36
│ │ │ │ -
typename Basis::LocalView::Tree Tree
Definition discreteglobalbasisfunction.hh:45
│ │ │ │ -
V Vector
Definition discreteglobalbasisfunction.hh:37
│ │ │ │ -
typename EntitySet::Element Element
Definition discreteglobalbasisfunction.hh:51
│ │ │ │ -
typename EntitySet::LocalCoordinate LocalDomain
Definition discreteglobalbasisfunction.hh:50
│ │ │ │ -
const NodeToRangeEntry & nodeToRangeEntry() const
Return the stored node-to-range map.
Definition discreteglobalbasisfunction.hh:211
│ │ │ │ -
NTRE NodeToRangeEntry
Definition discreteglobalbasisfunction.hh:46
│ │ │ │ -
DiscreteGlobalBasisFunctionBase(const std::shared_ptr< const Data > &data)
Definition discreteglobalbasisfunction.hh:190
│ │ │ │ -
typename Basis::GridView GridView
Definition discreteglobalbasisfunction.hh:43
│ │ │ │ -
const Basis & basis() const
Return a const reference to the stored basis.
Definition discreteglobalbasisfunction.hh:199
│ │ │ │ -
GridViewEntitySet< GridView, 0 > EntitySet
Definition discreteglobalbasisfunction.hh:44
│ │ │ │ -
const EntitySet & entitySet() const
Get associated set of entities the local-function can be bound to.
Definition discreteglobalbasisfunction.hh:217
│ │ │ │ -
typename EntitySet::GlobalCoordinate Domain
Definition discreteglobalbasisfunction.hh:48
│ │ │ │ -
Dune::AutonomousValue< decltype(std::declval< Vector >()[std::declval< typename Basis::MultiIndex >()])> Coefficient
Definition discreteglobalbasisfunction.hh:41
│ │ │ │ -
Definition discreteglobalbasisfunction.hh:59
│ │ │ │ -
EntitySet entitySet
Definition discreteglobalbasisfunction.hh:60
│ │ │ │ -
std::shared_ptr< const NodeToRangeEntry > nodeToRangeEntry
Definition discreteglobalbasisfunction.hh:63
│ │ │ │ -
std::shared_ptr< const Basis > basis
Definition discreteglobalbasisfunction.hh:61
│ │ │ │ -
std::shared_ptr< const Vector > coefficients
Definition discreteglobalbasisfunction.hh:62
│ │ │ │ - │ │ │ │ -
LocalFunctionBase & operator=(const LocalFunctionBase &other)
Copy-assignment of the local-function.
Definition discreteglobalbasisfunction.hh:106
│ │ │ │ -
bool bound() const
Check if LocalFunction is already bound to an element.
Definition discreteglobalbasisfunction.hh:155
│ │ │ │ -
void bind(const Element &element)
Bind LocalFunction to grid element.
Definition discreteglobalbasisfunction.hh:122
│ │ │ │ -
typename EntitySet::Element Element
Definition discreteglobalbasisfunction.hh:74
│ │ │ │ -
const Element & localContext() const
Return the element the local-function is bound to.
Definition discreteglobalbasisfunction.hh:161
│ │ │ │ -
LocalFunctionBase(const LocalFunctionBase &other)
Copy-construct the local-function.
Definition discreteglobalbasisfunction.hh:90
│ │ │ │ -
std::vector< Coefficient > localDoFs_
Definition discreteglobalbasisfunction.hh:186
│ │ │ │ -
void assignWith(To &to, const From &from) const
Definition discreteglobalbasisfunction.hh:169
│ │ │ │ -
std::shared_ptr< const Data > data_
Definition discreteglobalbasisfunction.hh:184
│ │ │ │ -
decltype(auto) nodeToRangeEntry(const Node &node, const TreePath &treePath, Range &y) const
Definition discreteglobalbasisfunction.hh:179
│ │ │ │ -
LocalView localView_
Definition discreteglobalbasisfunction.hh:185
│ │ │ │ -
void unbind()
Unbind the local-function.
Definition discreteglobalbasisfunction.hh:149
│ │ │ │ -
LocalDomain Domain
Definition discreteglobalbasisfunction.hh:73
│ │ │ │ -
LocalFunctionBase(const std::shared_ptr< const Data > &data)
Definition discreteglobalbasisfunction.hh:77
│ │ │ │ -
Derivative of a DiscreteGlobalBasisFunction
Definition discreteglobalbasisfunction.hh:494
│ │ │ │ -
typename Base::Basis Basis
Definition discreteglobalbasisfunction.hh:501
│ │ │ │ -
friend Traits::DerivativeInterface derivative(const DiscreteGlobalBasisFunctionDerivative &f)
Definition discreteglobalbasisfunction.hh:661
│ │ │ │ -
Range operator()(const Domain &x) const
Evaluate the discrete grid-function derivative in global coordinates.
Definition discreteglobalbasisfunction.hh:651
│ │ │ │ -
typename SignatureTraits< typename DiscreteGlobalBasisFunction::Traits::DerivativeInterface >::Range Range
Definition discreteglobalbasisfunction.hh:505
│ │ │ │ -
friend LocalFunction localFunction(const DiscreteGlobalBasisFunctionDerivative &f)
Construct local function from a DiscreteGlobalBasisFunctionDerivative
Definition discreteglobalbasisfunction.hh:667
│ │ │ │ -
DiscreteGlobalBasisFunctionDerivative(const std::shared_ptr< const Data > &data)
create object from DiscreateGlobalBasisFunction data
Definition discreteglobalbasisfunction.hh:640
│ │ │ │ -
DGBF DiscreteGlobalBasisFunction
Definition discreteglobalbasisfunction.hh:499
│ │ │ │ -
typename Base::Vector Vector
Definition discreteglobalbasisfunction.hh:502
│ │ │ │ -
Imp::GridFunctionTraits< Range(Domain), typename Base::EntitySet, DefaultDerivativeTraits, 16 > Traits
Definition discreteglobalbasisfunction.hh:507
│ │ │ │ -
typename Base::Domain Domain
Definition discreteglobalbasisfunction.hh:504
│ │ │ │ -
A grid function induced by a global basis and a coefficient vector.
Definition discreteglobalbasisfunction.hh:281
│ │ │ │ -
friend DiscreteGlobalBasisFunctionDerivative< DiscreteGlobalBasisFunction > derivative(const DiscreteGlobalBasisFunction &f)
Derivative of the DiscreteGlobalBasisFunction
Definition discreteglobalbasisfunction.hh:409
│ │ │ │ -
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:384
│ │ │ │ -
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:389
│ │ │ │ -
friend LocalFunction localFunction(const DiscreteGlobalBasisFunction &t)
Construct local function from a DiscreteGlobalBasisFunction.
Definition discreteglobalbasisfunction.hh:422
│ │ │ │ -
typename Base::Basis Basis
Definition discreteglobalbasisfunction.hh:286
│ │ │ │ -
Imp::GridFunctionTraits< Range(Domain), typename Base::EntitySet, DefaultDerivativeTraits, 16 > Traits
Definition discreteglobalbasisfunction.hh:292
│ │ │ │ -
R Range
Definition discreteglobalbasisfunction.hh:290
│ │ │ │ -
typename Base::Vector Vector
Definition discreteglobalbasisfunction.hh:287
│ │ │ │ -
typename Base::Domain Domain
Definition discreteglobalbasisfunction.hh:289
│ │ │ │ -
Definition discreteglobalbasisfunction.hh:305
│ │ │ │ -
GlobalFunction::Range Range
Definition discreteglobalbasisfunction.hh:314
│ │ │ │ -
typename LocalBase::Domain Domain
Definition discreteglobalbasisfunction.hh:313
│ │ │ │ -
LocalFunction(const DiscreteGlobalBasisFunction &globalFunction)
Create a local-function from the associated grid-function.
Definition discreteglobalbasisfunction.hh:318
│ │ │ │ -
friend DiscreteGlobalBasisFunctionDerivative< DiscreteGlobalBasisFunction >::LocalFunction derivative(const LocalFunction &lf)
Local function of the derivative.
Definition discreteglobalbasisfunction.hh:370
│ │ │ │ -
Range operator()(const Domain &x) const
Evaluate this local-function in coordinates x in the bound element.
Definition discreteglobalbasisfunction.hh:334
│ │ │ │ -
typename LocalBase::Element Element
Definition discreteglobalbasisfunction.hh:315
│ │ │ │ -
local function evaluating the derivative in reference coordinates
Definition discreteglobalbasisfunction.hh:528
│ │ │ │ -
Range operator()(const Domain &x) const
Evaluate this local-function in coordinates x in the bound element.
Definition discreteglobalbasisfunction.hh:579
│ │ │ │ -
typename LocalBase::Domain Domain
Definition discreteglobalbasisfunction.hh:535
│ │ │ │ -
typename LocalBase::Element Element
Definition discreteglobalbasisfunction.hh:537
│ │ │ │ -
friend Traits::LocalFunctionTraits::DerivativeInterface derivative(const LocalFunction &)
Not implemented.
Definition discreteglobalbasisfunction.hh:624
│ │ │ │ -
GlobalFunction::Range Range
Definition discreteglobalbasisfunction.hh:536
│ │ │ │ -
void unbind()
Unbind the local-function.
Definition discreteglobalbasisfunction.hh:560
│ │ │ │ -
LocalFunction(const GlobalFunction &globalFunction)
Create a local function from the associated grid function.
Definition discreteglobalbasisfunction.hh:540
│ │ │ │ -
void bind(const Element &element)
Bind LocalFunction to grid element.
Definition discreteglobalbasisfunction.hh:553
│ │ │ │ -
Definition gridfunction.hh:36
│ │ │ │ - │ │ │ │ -
GridView::template Codim< codim >::Entity Element
Type of Elements contained in this EntitySet.
Definition gridviewentityset.hh:36
│ │ │ │ -
Element::Geometry::LocalCoordinate LocalCoordinate
Type of local coordinates with respect to the Element.
Definition gridviewentityset.hh:39
│ │ │ │ -
Element::Geometry::GlobalCoordinate GlobalCoordinate
Definition gridviewentityset.hh:40
│ │ │ │ - │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,871 +1,94 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ -discreteglobalbasisfunction.hh │ │ │ │ │ + * _c_o_m_m_o_n │ │ │ │ │ +localfunction_imp.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_COMMON_LOCALFUNCTION_FUNCTION_IMP_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_COMMON_LOCALFUNCTION_FUNCTION_IMP_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ +10#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ +11#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n___i_m_p_._h_h> │ │ │ │ │ 12 │ │ │ │ │ -13#include │ │ │ │ │ +13 │ │ │ │ │ 14 │ │ │ │ │ -15#include │ │ │ │ │ -16 │ │ │ │ │ -17#include │ │ │ │ │ +15namespace _D_u_n_e { │ │ │ │ │ +16namespace Functions { │ │ │ │ │ +17namespace Imp { │ │ │ │ │ 18 │ │ │ │ │ -19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_h_i_e_r_a_r_c_h_i_c_n_o_d_e_t_o_r_a_n_g_e_m_a_p_._h_h> │ │ │ │ │ -20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_f_l_a_t_v_e_c_t_o_r_v_i_e_w_._h_h> │ │ │ │ │ -21#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h> │ │ │ │ │ -22#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ -23#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_b_a_c_k_e_n_d_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ -24#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_b_a_c_k_e_n_d_s_/_i_s_t_l_v_e_c_t_o_r_b_a_c_k_e_n_d_._h_h> │ │ │ │ │ -25 │ │ │ │ │ -26namespace _D_u_n_e { │ │ │ │ │ -27namespace Functions { │ │ │ │ │ -28 │ │ │ │ │ +19// Interface of type erasure wrapper │ │ │ │ │ +20// │ │ │ │ │ +21// Notice that the basic interface of polymorphic classes (destructor, clone, │ │ │ │ │ +...) │ │ │ │ │ +22// will be added by the type erasure foundation classes. │ │ │ │ │ +23template │ │ │ │ │ +24class LocalFunctionWrapperInterface : │ │ │ │ │ +25 public DifferentiableFunctionWrapperInterface │ │ │ │ │ +26{ │ │ │ │ │ +27public: │ │ │ │ │ +28 virtual void bind(const LocalContext&) = 0; │ │ │ │ │ 29 │ │ │ │ │ -_3_0namespace ImplDoc { │ │ │ │ │ +30 virtual void unbind() = 0; │ │ │ │ │ 31 │ │ │ │ │ -32template │ │ │ │ │ -_3_3class _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e │ │ │ │ │ -34{ │ │ │ │ │ -35public: │ │ │ │ │ -_3_6 using _B_a_s_i_s = B; │ │ │ │ │ -_3_7 using _V_e_c_t_o_r = V; │ │ │ │ │ -38 │ │ │ │ │ -39 // In order to make the cache work for proxy-references │ │ │ │ │ -40 // we have to use AutonomousValue instead of std::decay_t │ │ │ │ │ -_4_1 using _C_o_e_f_f_i_c_i_e_n_t = Dune::AutonomousValue() │ │ │ │ │ -[std::declval()])>; │ │ │ │ │ -42 │ │ │ │ │ -_4_3 using _G_r_i_d_V_i_e_w = typename Basis::GridView; │ │ │ │ │ -_4_4 using _E_n_t_i_t_y_S_e_t = _G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_G_r_i_d_V_i_e_w_,_ _0_>; │ │ │ │ │ -_4_5 using _T_r_e_e = typename Basis::LocalView::Tree; │ │ │ │ │ -_4_6 using _N_o_d_e_T_o_R_a_n_g_e_E_n_t_r_y = NTRE; │ │ │ │ │ -47 │ │ │ │ │ -_4_8 using _D_o_m_a_i_n = typename _E_n_t_i_t_y_S_e_t_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ -49 │ │ │ │ │ -_5_0 using _L_o_c_a_l_D_o_m_a_i_n = typename _E_n_t_i_t_y_S_e_t_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ -_5_1 using _E_l_e_m_e_n_t = typename _E_n_t_i_t_y_S_e_t_:_:_E_l_e_m_e_n_t; │ │ │ │ │ -52 │ │ │ │ │ -53protected: │ │ │ │ │ -54 │ │ │ │ │ -55 // This collects all data that is shared by all related │ │ │ │ │ -56 // global and local functions. This way we don't need to │ │ │ │ │ -57 // keep track of it individually. │ │ │ │ │ -_5_8 struct _D_a_t_a │ │ │ │ │ -59 { │ │ │ │ │ -_6_0 _E_n_t_i_t_y_S_e_t _e_n_t_i_t_y_S_e_t; │ │ │ │ │ -_6_1 std::shared_ptr _b_a_s_i_s; │ │ │ │ │ -_6_2 std::shared_ptr _c_o_e_f_f_i_c_i_e_n_t_s; │ │ │ │ │ -_6_3 std::shared_ptr _n_o_d_e_T_o_R_a_n_g_e_E_n_t_r_y; │ │ │ │ │ -64 }; │ │ │ │ │ -65 │ │ │ │ │ -66public: │ │ │ │ │ -_6_7 class _L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e │ │ │ │ │ -68 { │ │ │ │ │ -69 using LocalView = typename Basis::LocalView; │ │ │ │ │ -70 using size_type = typename Tree::size_type; │ │ │ │ │ +32 virtual bool bound() const = 0; │ │ │ │ │ +33 │ │ │ │ │ +34 virtual const LocalContext& localContext() const = 0; │ │ │ │ │ +35}; │ │ │ │ │ +36 │ │ │ │ │ +37 │ │ │ │ │ +38// Implementation of type erasure wrapper │ │ │ │ │ +39template │ │ │ │ │ +40class LocalFunctionWrapperImplementation : │ │ │ │ │ +41 public DifferentiableFunctionWrapperImplementation │ │ │ │ │ +42{ │ │ │ │ │ +43 using Base = DifferentiableFunctionWrapperImplementation; │ │ │ │ │ +44public: │ │ │ │ │ +45 using Base::Base; │ │ │ │ │ +46 │ │ │ │ │ +47 virtual void bind(const LocalContext& context) │ │ │ │ │ +48 { │ │ │ │ │ +49 this->get().bind(context); │ │ │ │ │ +50 } │ │ │ │ │ +51 │ │ │ │ │ +52 virtual void unbind() │ │ │ │ │ +53 { │ │ │ │ │ +54 this->get().unbind(); │ │ │ │ │ +55 } │ │ │ │ │ +56 │ │ │ │ │ +57 virtual bool bound() const │ │ │ │ │ +58 { │ │ │ │ │ +59 return this->get().bound(); │ │ │ │ │ +60 } │ │ │ │ │ +61 │ │ │ │ │ +62 virtual const LocalContext& localContext() const │ │ │ │ │ +63 { │ │ │ │ │ +64 return this->get().localContext(); │ │ │ │ │ +65 } │ │ │ │ │ +66}; │ │ │ │ │ +67 │ │ │ │ │ +68}}} // namespace Dune::Functions::Imp │ │ │ │ │ +69 │ │ │ │ │ +70 │ │ │ │ │ 71 │ │ │ │ │ -72 public: │ │ │ │ │ -_7_3 using _D_o_m_a_i_n = _L_o_c_a_l_D_o_m_a_i_n; │ │ │ │ │ -_7_4 using _E_l_e_m_e_n_t = typename _E_n_t_i_t_y_S_e_t_:_:_E_l_e_m_e_n_t; │ │ │ │ │ -75 │ │ │ │ │ -76 protected: │ │ │ │ │ -_7_7 _L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e(const std::shared_ptr& data) │ │ │ │ │ -78 : _d_a_t_a__(data) │ │ │ │ │ -79 , _l_o_c_a_l_V_i_e_w__(_d_a_t_a__->_b_a_s_i_s->localView()) │ │ │ │ │ -80 { │ │ │ │ │ -81 _l_o_c_a_l_D_o_F_s__.reserve(_l_o_c_a_l_V_i_e_w__.maxSize()); │ │ │ │ │ -82 } │ │ │ │ │ -83 │ │ │ │ │ -_9_0 _L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e(const _L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e& other) │ │ │ │ │ -91 : _d_a_t_a__(other._d_a_t_a__) │ │ │ │ │ -92 , _l_o_c_a_l_V_i_e_w__(other._l_o_c_a_l_V_i_e_w__) │ │ │ │ │ -93 { │ │ │ │ │ -94 _l_o_c_a_l_D_o_F_s__.reserve(_l_o_c_a_l_V_i_e_w__.maxSize()); │ │ │ │ │ -95 if (_b_o_u_n_d()) │ │ │ │ │ -96 _l_o_c_a_l_D_o_F_s__ = other._l_o_c_a_l_D_o_F_s__; │ │ │ │ │ -97 } │ │ │ │ │ -98 │ │ │ │ │ -_1_0_6 _L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e& _o_p_e_r_a_t_o_r_=(const _L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e& other) │ │ │ │ │ -107 { │ │ │ │ │ -108 _d_a_t_a__ = other._d_a_t_a__; │ │ │ │ │ -109 _l_o_c_a_l_V_i_e_w__ = other._l_o_c_a_l_V_i_e_w__; │ │ │ │ │ -110 if (_b_o_u_n_d()) │ │ │ │ │ -111 _l_o_c_a_l_D_o_F_s__ = other._l_o_c_a_l_D_o_F_s__; │ │ │ │ │ -112 return *this; │ │ │ │ │ -113 } │ │ │ │ │ -114 │ │ │ │ │ -115 public: │ │ │ │ │ -_1_2_2 void _b_i_n_d(const _E_l_e_m_e_n_t& element) │ │ │ │ │ -123 { │ │ │ │ │ -124 _l_o_c_a_l_V_i_e_w__.bind(element); │ │ │ │ │ -125 // Use cache of full local view size. For a subspace basis, │ │ │ │ │ -126 // this may be larger than the number of local DOFs in the │ │ │ │ │ -127 // tree. In this case only cache entries associated to local │ │ │ │ │ -128 // DOFs in the subspace are filled. Cache entries associated │ │ │ │ │ -129 // to local DOFs which are not contained in the subspace will │ │ │ │ │ -130 // not be touched. │ │ │ │ │ -131 // │ │ │ │ │ -132 // Alternatively one could use a cache that exactly fits │ │ │ │ │ -133 // the size of the tree. However, this would require to │ │ │ │ │ -134 // subtract an offset from localIndex(i) on each cache │ │ │ │ │ -135 // access in operator(). │ │ │ │ │ -136 _l_o_c_a_l_D_o_F_s__.resize(_l_o_c_a_l_V_i_e_w__.size()); │ │ │ │ │ -137 const auto& _d_o_f_s = *_d_a_t_a__->coefficients; │ │ │ │ │ -138 for (size_type i = 0; i < _l_o_c_a_l_V_i_e_w__.tree().size(); ++i) │ │ │ │ │ -139 { │ │ │ │ │ -140 // For a subspace basis the index-within-tree i │ │ │ │ │ -141 // is not the same as the localIndex within the │ │ │ │ │ -142 // full local view. │ │ │ │ │ -143 size_t localIndex = _l_o_c_a_l_V_i_e_w__.tree().localIndex(i); │ │ │ │ │ -144 _l_o_c_a_l_D_o_F_s__[localIndex] = _d_o_f_s[_l_o_c_a_l_V_i_e_w__.index(localIndex)]; │ │ │ │ │ -145 } │ │ │ │ │ -146 } │ │ │ │ │ -147 │ │ │ │ │ -_1_4_9 void _u_n_b_i_n_d() │ │ │ │ │ -150 { │ │ │ │ │ -151 _l_o_c_a_l_V_i_e_w__.unbind(); │ │ │ │ │ -152 } │ │ │ │ │ -153 │ │ │ │ │ -_1_5_5 bool _b_o_u_n_d() const │ │ │ │ │ -156 { │ │ │ │ │ -157 return _l_o_c_a_l_V_i_e_w__.bound(); │ │ │ │ │ -158 } │ │ │ │ │ -159 │ │ │ │ │ -_1_6_1 const _E_l_e_m_e_n_t& _l_o_c_a_l_C_o_n_t_e_x_t() const │ │ │ │ │ -162 { │ │ │ │ │ -163 return _l_o_c_a_l_V_i_e_w__.element(); │ │ │ │ │ -164 } │ │ │ │ │ -165 │ │ │ │ │ -166 protected: │ │ │ │ │ -167 │ │ │ │ │ -168 template │ │ │ │ │ -_1_6_9 void _a_s_s_i_g_n_W_i_t_h(To& to, const From& from) const │ │ │ │ │ -170 { │ │ │ │ │ -171 auto from_flat = _f_l_a_t_V_e_c_t_o_r_V_i_e_w(from); │ │ │ │ │ -172 auto to_flat = _f_l_a_t_V_e_c_t_o_r_V_i_e_w(to); │ │ │ │ │ -173 assert(from_flat.size() == to_flat.size()); │ │ │ │ │ -174 for (size_type i = 0; i < to_flat.size(); ++i) │ │ │ │ │ -175 to_flat[i] = from_flat[i]; │ │ │ │ │ -176 } │ │ │ │ │ -177 │ │ │ │ │ -178 template │ │ │ │ │ -_1_7_9 decltype(auto) _n_o_d_e_T_o_R_a_n_g_e_E_n_t_r_y(const Node& node, const TreePath& treePath, │ │ │ │ │ -Range& y) const │ │ │ │ │ -180 { │ │ │ │ │ -181 return (*_d_a_t_a__->nodeToRangeEntry)(node, treePath, y); │ │ │ │ │ -182 } │ │ │ │ │ -183 │ │ │ │ │ -_1_8_4 std::shared_ptr _d_a_t_a__; │ │ │ │ │ -_1_8_5 LocalView _l_o_c_a_l_V_i_e_w__; │ │ │ │ │ -_1_8_6 std::vector _l_o_c_a_l_D_o_F_s__; │ │ │ │ │ -187 }; │ │ │ │ │ -188 │ │ │ │ │ -189protected: │ │ │ │ │ -_1_9_0 _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e(const std::shared_ptr& data) │ │ │ │ │ -191 : _d_a_t_a__(data) │ │ │ │ │ -192 { │ │ │ │ │ -193 /* Nothing. */ │ │ │ │ │ -194 } │ │ │ │ │ -195 │ │ │ │ │ -196public: │ │ │ │ │ -197 │ │ │ │ │ -_1_9_9 const _B_a_s_i_s& _b_a_s_i_s() const │ │ │ │ │ -200 { │ │ │ │ │ -201 return *_d_a_t_a__->basis; │ │ │ │ │ -202 } │ │ │ │ │ -203 │ │ │ │ │ -_2_0_5 const _V_e_c_t_o_r& _d_o_f_s() const │ │ │ │ │ -206 { │ │ │ │ │ -207 return *_d_a_t_a__->coefficients; │ │ │ │ │ -208 } │ │ │ │ │ -209 │ │ │ │ │ -_2_1_1 const _N_o_d_e_T_o_R_a_n_g_e_E_n_t_r_y& _n_o_d_e_T_o_R_a_n_g_e_E_n_t_r_y() const │ │ │ │ │ -212 { │ │ │ │ │ -213 return *_d_a_t_a__->nodeToRangeEntry; │ │ │ │ │ -214 } │ │ │ │ │ -215 │ │ │ │ │ -_2_1_7 const _E_n_t_i_t_y_S_e_t& _e_n_t_i_t_y_S_e_t() const │ │ │ │ │ -218 { │ │ │ │ │ -219 return _d_a_t_a__->entitySet; │ │ │ │ │ -220 } │ │ │ │ │ -221 │ │ │ │ │ -222protected: │ │ │ │ │ -_2_2_3 std::shared_ptr _d_a_t_a__; │ │ │ │ │ -224}; │ │ │ │ │ -225 │ │ │ │ │ -226} // namespace ImplDoc │ │ │ │ │ -227 │ │ │ │ │ -228 │ │ │ │ │ -229 │ │ │ │ │ -230template │ │ │ │ │ -231class _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e; │ │ │ │ │ -232 │ │ │ │ │ -276template │ │ │ │ │ -_2_7_9class _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n │ │ │ │ │ -280 : public _I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e │ │ │ │ │ -281{ │ │ │ │ │ -282 using _B_a_s_e = _I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_<_B_,_ _V_,_ _N_T_R_E_>; │ │ │ │ │ -283 using Data = typename _B_a_s_e_:_:_D_a_t_a; │ │ │ │ │ -284 │ │ │ │ │ -285public: │ │ │ │ │ -_2_8_6 using _B_a_s_i_s = typename _B_a_s_e_:_:_B_a_s_i_s; │ │ │ │ │ -_2_8_7 using _V_e_c_t_o_r = typename _B_a_s_e_:_:_V_e_c_t_o_r; │ │ │ │ │ -288 │ │ │ │ │ -_2_8_9 using _D_o_m_a_i_n = typename _B_a_s_e_:_:_D_o_m_a_i_n; │ │ │ │ │ -_2_9_0 using _R_a_n_g_e = R; │ │ │ │ │ -291 │ │ │ │ │ -_2_9_2 using _T_r_a_i_t_s = Imp::GridFunctionTraits<_R_a_n_g_e(_D_o_m_a_i_n), typename _B_a_s_e_:_: │ │ │ │ │ -_E_n_t_i_t_y_S_e_t, _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s, 16>; │ │ │ │ │ -293 │ │ │ │ │ -294private: │ │ │ │ │ -295 │ │ │ │ │ -296 template │ │ │ │ │ -297 using LocalBasisRange = typename Node::FiniteElement::Traits:: │ │ │ │ │ -LocalBasisType::Traits::RangeType; │ │ │ │ │ -298 template │ │ │ │ │ -299 using NodeData = typename std::vector>; │ │ │ │ │ -300 using PerNodeEvaluationBuffer = typename TypeTree::TreeContainer; │ │ │ │ │ -301 │ │ │ │ │ -302public: │ │ │ │ │ -_3_0_3 class _L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ -304 : public _B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e │ │ │ │ │ -305 { │ │ │ │ │ -306 using LocalBase = typename _B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e; │ │ │ │ │ -307 using size_type = typename Base::Tree::size_type; │ │ │ │ │ -308 using LocalBase::nodeToRangeEntry; │ │ │ │ │ -309 │ │ │ │ │ -310 public: │ │ │ │ │ -311 │ │ │ │ │ -_3_1_2 using _G_l_o_b_a_l_F_u_n_c_t_i_o_n = _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n; │ │ │ │ │ -_3_1_3 using _D_o_m_a_i_n = typename LocalBase::Domain; │ │ │ │ │ -_3_1_4 using _R_a_n_g_e = _G_l_o_b_a_l_F_u_n_c_t_i_o_n_:_:_R_a_n_g_e; │ │ │ │ │ -_3_1_5 using _E_l_e_m_e_n_t = typename LocalBase::Element; │ │ │ │ │ -316 │ │ │ │ │ -_3_1_8 _L_o_c_a_l_F_u_n_c_t_i_o_n(const _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n& globalFunction) │ │ │ │ │ -319 : LocalBase(globalFunction._d_a_t_a__) │ │ │ │ │ -320 , evaluationBuffer_(this->_l_o_c_a_l_V_i_e_w__.tree()) │ │ │ │ │ -321 { │ │ │ │ │ -322 /* Nothing. */ │ │ │ │ │ -323 } │ │ │ │ │ -324 │ │ │ │ │ -_3_3_4 _R_a_n_g_e _o_p_e_r_a_t_o_r_(_)(const _D_o_m_a_i_n& x) const │ │ │ │ │ -335 { │ │ │ │ │ -336 _R_a_n_g_e y; │ │ │ │ │ -337 _i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d(y) = 0; │ │ │ │ │ -338 │ │ │ │ │ -339 TypeTree::forEachLeafNode(this->_l_o_c_a_l_V_i_e_w__.tree(), [&](auto&& node, auto&& │ │ │ │ │ -treePath) { │ │ │ │ │ -340 const auto& fe = node.finiteElement(); │ │ │ │ │ -341 const auto& localBasis = fe.localBasis(); │ │ │ │ │ -342 auto& shapeFunctionValues = evaluationBuffer_[treePath]; │ │ │ │ │ -343 │ │ │ │ │ -344 localBasis.evaluateFunction(x, shapeFunctionValues); │ │ │ │ │ -345 │ │ │ │ │ -346 // Compute linear combinations of basis function jacobian. │ │ │ │ │ -347 // Non-scalar coefficients of dimension coeffDim are handled by │ │ │ │ │ -348 // processing the coeffDim linear combinations independently │ │ │ │ │ -349 // and storing them as entries of an array. │ │ │ │ │ -350 using Value = LocalBasisRange< std::decay_t >; │ │ │ │ │ -351 static constexpr auto coeffDim = decltype(flatVectorView(this->localDoFs_ │ │ │ │ │ -[node.localIndex(0)]).size())::value; │ │ │ │ │ -352 auto values = std::array{}; │ │ │ │ │ -353 _i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d(values) = 0; │ │ │ │ │ -354 for (size_type i = 0; i < localBasis.size(); ++i) │ │ │ │ │ -355 { │ │ │ │ │ -356 auto c = _f_l_a_t_V_e_c_t_o_r_V_i_e_w(this->_l_o_c_a_l_D_o_F_s__[node.localIndex(i)]); │ │ │ │ │ -357 for (std::size_t j = 0; j < coeffDim; ++j) │ │ │ │ │ -358 values[j].axpy(c[j], shapeFunctionValues[i]); │ │ │ │ │ -359 } │ │ │ │ │ -360 │ │ │ │ │ -361 // Assign computed values to node entry of range. │ │ │ │ │ -362 // Types are matched using the lexicographic ordering provided by │ │ │ │ │ -flatVectorView. │ │ │ │ │ -363 LocalBase::assignWith(_n_o_d_e_T_o_R_a_n_g_e_E_n_t_r_y(node, treePath, y), values); │ │ │ │ │ -364 }); │ │ │ │ │ -365 │ │ │ │ │ -366 return y; │ │ │ │ │ -367 } │ │ │ │ │ -368 │ │ │ │ │ -_3_7_0 friend typename │ │ │ │ │ -_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_<_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_>_:_: │ │ │ │ │ -_L_o_c_a_l_F_u_n_c_t_i_o_n _d_e_r_i_v_a_t_i_v_e(const _L_o_c_a_l_F_u_n_c_t_i_o_n& lf) │ │ │ │ │ -371 { │ │ │ │ │ -372 auto dlf = _l_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ -(_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_<_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_>(lf._d_a_t_a__)); │ │ │ │ │ -373 if (lf._b_o_u_n_d()) │ │ │ │ │ -374 dlf.bind(lf._l_o_c_a_l_C_o_n_t_e_x_t()); │ │ │ │ │ -375 return dlf; │ │ │ │ │ -376 } │ │ │ │ │ -377 │ │ │ │ │ -378 private: │ │ │ │ │ -379 mutable PerNodeEvaluationBuffer evaluationBuffer_; │ │ │ │ │ -380 }; │ │ │ │ │ -381 │ │ │ │ │ -383 template │ │ │ │ │ -_3_8_4 _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n(B_T && basis, V_T && coefficients, NTRE_T&& │ │ │ │ │ -nodeToRangeEntry) │ │ │ │ │ -385 : _B_a_s_e(std::make_shared(Data{{basis.gridView()}, wrap_or_move(std:: │ │ │ │ │ -forward(basis)), wrap_or_move(std::forward(coefficients)), │ │ │ │ │ -wrap_or_move(std::forward(nodeToRangeEntry))})) │ │ │ │ │ -386 {} │ │ │ │ │ -387 │ │ │ │ │ -_3_8_9 _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n(std::shared_ptr basis, std:: │ │ │ │ │ -shared_ptr coefficients, std::shared_ptr nodeToRangeEntry) │ │ │ │ │ -390 : _B_a_s_e(std::make_shared(Data{{basis->gridView()}, basis, │ │ │ │ │ -coefficients, nodeToRangeEntry})) │ │ │ │ │ -391 {} │ │ │ │ │ -392 │ │ │ │ │ -_3_9_8 _R_a_n_g_e operator() (const _D_o_m_a_i_n& x) const │ │ │ │ │ -399 { │ │ │ │ │ -400 HierarchicSearch search(this->data_->basis->gridView().grid(), this->data_- │ │ │ │ │ ->basis->gridView().indexSet()); │ │ │ │ │ -401 │ │ │ │ │ -402 const auto e = search.findEntity(x); │ │ │ │ │ -403 auto localThis = localFunction(*this); │ │ │ │ │ -404 localThis.bind(e); │ │ │ │ │ -405 return localThis(e.geometry().local(x)); │ │ │ │ │ -406 } │ │ │ │ │ -407 │ │ │ │ │ -_4_0_9 friend _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_<_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_> │ │ │ │ │ -_d_e_r_i_v_a_t_i_v_e(const _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n& f) │ │ │ │ │ -410 { │ │ │ │ │ -411 return _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_<_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_> │ │ │ │ │ -(f._d_a_t_a__); │ │ │ │ │ -412 } │ │ │ │ │ -413 │ │ │ │ │ -_4_2_2 friend _L_o_c_a_l_F_u_n_c_t_i_o_n _l_o_c_a_l_F_u_n_c_t_i_o_n(const _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n& t) │ │ │ │ │ -423 { │ │ │ │ │ -424 return _L_o_c_a_l_F_u_n_c_t_i_o_n(t); │ │ │ │ │ -425 } │ │ │ │ │ -426}; │ │ │ │ │ -427 │ │ │ │ │ -428 │ │ │ │ │ -453template │ │ │ │ │ -_4_5_4auto _m_a_k_e_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n(B&& basis, V&& vector) │ │ │ │ │ -455{ │ │ │ │ │ -456 using _B_a_s_i_s = std::decay_t; │ │ │ │ │ -457 using NTREM = _H_i_e_r_a_r_c_h_i_c_N_o_d_e_T_o_R_a_n_g_e_M_a_p; │ │ │ │ │ -458 │ │ │ │ │ -459 // Small helper functions to wrap vectors using istlVectorBackend │ │ │ │ │ -460 // if they do not already satisfy the VectorBackend interface. │ │ │ │ │ -461 auto toConstVectorBackend = [&](auto&& v) -> decltype(auto) { │ │ │ │ │ -462 if constexpr (models, decltype(v)>()) { │ │ │ │ │ -463 return std::forward(v); │ │ │ │ │ -464 } else { │ │ │ │ │ -465 return _i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d(v); │ │ │ │ │ -466 } │ │ │ │ │ -467 }; │ │ │ │ │ -468 │ │ │ │ │ -469 using _V_e_c_t_o_r = std::decay_t │ │ │ │ │ -(vector)))>; │ │ │ │ │ -470 return _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_<_B_a_s_i_s_,_ _V_e_c_t_o_r_,_ _N_T_R_E_M_,_ _R_>( │ │ │ │ │ -471 std::forward(basis), │ │ │ │ │ -472 toConstVectorBackend(std::forward(vector)), │ │ │ │ │ -473 _H_i_e_r_a_r_c_h_i_c_N_o_d_e_T_o_R_a_n_g_e_M_a_p()); │ │ │ │ │ -474} │ │ │ │ │ -475 │ │ │ │ │ -476 │ │ │ │ │ -491template │ │ │ │ │ -_4_9_2class _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e │ │ │ │ │ -493 : public _I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e │ │ │ │ │ -494{ │ │ │ │ │ -495 using _B_a_s_e = _I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_<_t_y_p_e_n_a_m_e_ _D_G_B_F_:_:_B_a_s_i_s_, │ │ │ │ │ -_t_y_p_e_n_a_m_e_ _D_G_B_F_:_:_V_e_c_t_o_r_,_ _t_y_p_e_n_a_m_e_ _D_G_B_F_:_:_N_o_d_e_T_o_R_a_n_g_e_E_n_t_r_y_>; │ │ │ │ │ -496 using Data = typename _B_a_s_e_:_:_D_a_t_a; │ │ │ │ │ -497 │ │ │ │ │ -498public: │ │ │ │ │ -_4_9_9 using _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n = DGBF; │ │ │ │ │ -500 │ │ │ │ │ -_5_0_1 using _B_a_s_i_s = typename _B_a_s_e_:_:_B_a_s_i_s; │ │ │ │ │ -_5_0_2 using _V_e_c_t_o_r = typename _B_a_s_e_:_:_V_e_c_t_o_r; │ │ │ │ │ -503 │ │ │ │ │ -_5_0_4 using _D_o_m_a_i_n = typename _B_a_s_e_:_:_D_o_m_a_i_n; │ │ │ │ │ -_5_0_5 using _R_a_n_g_e = typename _S_i_g_n_a_t_u_r_e_T_r_a_i_t_s_<_t_y_p_e_n_a_m_e │ │ │ │ │ -_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_T_r_a_i_t_s_:_:_D_e_r_i_v_a_t_i_v_e_I_n_t_e_r_f_a_c_e_>_:_:_R_a_n_g_e; │ │ │ │ │ -506 │ │ │ │ │ -_5_0_7 using _T_r_a_i_t_s = Imp::GridFunctionTraits<_R_a_n_g_e(_D_o_m_a_i_n), typename _B_a_s_e_:_: │ │ │ │ │ -_E_n_t_i_t_y_S_e_t, _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s, 16>; │ │ │ │ │ -508 │ │ │ │ │ -509private: │ │ │ │ │ -510 │ │ │ │ │ -511 template │ │ │ │ │ -512 using LocalBasisRange = typename Node::FiniteElement::Traits:: │ │ │ │ │ -LocalBasisType::Traits::JacobianType; │ │ │ │ │ -513 template │ │ │ │ │ -514 using NodeData = typename std::vector< LocalBasisRange >; │ │ │ │ │ -515 using PerNodeEvaluationBuffer = typename TypeTree::TreeContainer; │ │ │ │ │ -516 │ │ │ │ │ -517public: │ │ │ │ │ -518 │ │ │ │ │ -_5_2_6 class _L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ -527 : public _B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e │ │ │ │ │ -528 { │ │ │ │ │ -529 using LocalBase = typename _B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e; │ │ │ │ │ -530 using size_type = typename Base::Tree::size_type; │ │ │ │ │ -531 using LocalBase::nodeToRangeEntry; │ │ │ │ │ -532 │ │ │ │ │ -533 public: │ │ │ │ │ -_5_3_4 using _G_l_o_b_a_l_F_u_n_c_t_i_o_n = _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e; │ │ │ │ │ -_5_3_5 using _D_o_m_a_i_n = typename LocalBase::Domain; │ │ │ │ │ -_5_3_6 using _R_a_n_g_e = _G_l_o_b_a_l_F_u_n_c_t_i_o_n_:_:_R_a_n_g_e; │ │ │ │ │ -_5_3_7 using _E_l_e_m_e_n_t = typename LocalBase::Element; │ │ │ │ │ -538 │ │ │ │ │ -_5_4_0 _L_o_c_a_l_F_u_n_c_t_i_o_n(const _G_l_o_b_a_l_F_u_n_c_t_i_o_n& globalFunction) │ │ │ │ │ -541 : LocalBase(globalFunction.data_) │ │ │ │ │ -542 , evaluationBuffer_(this->localView_.tree()) │ │ │ │ │ -543 { │ │ │ │ │ -544 /* Nothing. */ │ │ │ │ │ -545 } │ │ │ │ │ -546 │ │ │ │ │ -_5_5_3 void _b_i_n_d(const _E_l_e_m_e_n_t& element) │ │ │ │ │ -554 { │ │ │ │ │ -555 LocalBase::bind(element); │ │ │ │ │ -556 geometry_.emplace(element.geometry()); │ │ │ │ │ -557 } │ │ │ │ │ -558 │ │ │ │ │ -_5_6_0 void _u_n_b_i_n_d() │ │ │ │ │ -561 { │ │ │ │ │ -562 geometry_.reset(); │ │ │ │ │ -563 LocalBase::unbind(); │ │ │ │ │ -564 } │ │ │ │ │ -565 │ │ │ │ │ -_5_7_9 _R_a_n_g_e _o_p_e_r_a_t_o_r_(_)(const _D_o_m_a_i_n& x) const │ │ │ │ │ -580 { │ │ │ │ │ -581 _R_a_n_g_e y; │ │ │ │ │ -582 _i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d(y) = 0; │ │ │ │ │ -583 │ │ │ │ │ -584 const auto& jacobianInverse = geometry_->jacobianInverse(x); │ │ │ │ │ -585 │ │ │ │ │ -586 TypeTree::forEachLeafNode(this->localView_.tree(), [&](auto&& node, auto&& │ │ │ │ │ -treePath) { │ │ │ │ │ -587 const auto& fe = node.finiteElement(); │ │ │ │ │ -588 const auto& localBasis = fe.localBasis(); │ │ │ │ │ -589 auto& shapeFunctionJacobians = evaluationBuffer_[treePath]; │ │ │ │ │ -590 │ │ │ │ │ -591 localBasis.evaluateJacobian(x, shapeFunctionJacobians); │ │ │ │ │ -592 │ │ │ │ │ -593 // Compute linear combinations of basis function jacobian. │ │ │ │ │ -594 // Non-scalar coefficients of dimension coeffDim are handled by │ │ │ │ │ -595 // processing the coeffDim linear combinations independently │ │ │ │ │ -596 // and storing them as entries of an array. │ │ │ │ │ -597 using RefJacobian = LocalBasisRange< std::decay_t >; │ │ │ │ │ -598 static constexpr auto coeffDim = decltype(flatVectorView(this->localDoFs_ │ │ │ │ │ -[node.localIndex(0)]).size())::value; │ │ │ │ │ -599 auto refJacobians = std::array{}; │ │ │ │ │ -600 _i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d(refJacobians) = 0; │ │ │ │ │ -601 for (size_type i = 0; i < localBasis.size(); ++i) │ │ │ │ │ -602 { │ │ │ │ │ -603 auto c = _f_l_a_t_V_e_c_t_o_r_V_i_e_w(this->localDoFs_[node.localIndex(i)]); │ │ │ │ │ -604 for (std::size_t j = 0; j < coeffDim; ++j) │ │ │ │ │ -605 refJacobians[j].axpy(c[j], shapeFunctionJacobians[i]); │ │ │ │ │ -606 } │ │ │ │ │ -607 │ │ │ │ │ -608 // Transform Jacobians form local to global coordinates. │ │ │ │ │ -609 using Jacobian = decltype(refJacobians[0] * jacobianInverse); │ │ │ │ │ -610 auto jacobians = std::array{}; │ │ │ │ │ -611 std::transform( │ │ │ │ │ -612 refJacobians.begin(), refJacobians.end(), jacobians.begin(), │ │ │ │ │ -613 [&](const auto& refJacobian) { return refJacobian * jacobianInverse; }); │ │ │ │ │ -614 │ │ │ │ │ -615 // Assign computed Jacobians to node entry of range. │ │ │ │ │ -616 // Types are matched using the lexicographic ordering provided by │ │ │ │ │ -flatVectorView. │ │ │ │ │ -617 LocalBase::assignWith(nodeToRangeEntry(node, treePath, y), jacobians); │ │ │ │ │ -618 }); │ │ │ │ │ -619 │ │ │ │ │ -620 return y; │ │ │ │ │ -621 } │ │ │ │ │ -622 │ │ │ │ │ -_6_2_4 friend typename _T_r_a_i_t_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_T_r_a_i_t_s_:_:_D_e_r_i_v_a_t_i_v_e_I_n_t_e_r_f_a_c_e _d_e_r_i_v_a_t_i_v_e │ │ │ │ │ -(const _L_o_c_a_l_F_u_n_c_t_i_o_n&) │ │ │ │ │ -625 { │ │ │ │ │ -626 DUNE_THROW(NotImplemented, "derivative of derivative is not implemented"); │ │ │ │ │ -627 } │ │ │ │ │ -628 │ │ │ │ │ -629 private: │ │ │ │ │ -630 mutable PerNodeEvaluationBuffer evaluationBuffer_; │ │ │ │ │ -631 std::optional geometry_; │ │ │ │ │ -632 }; │ │ │ │ │ -633 │ │ │ │ │ -_6_4_0 _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e(const std::shared_ptr& │ │ │ │ │ -data) │ │ │ │ │ -641 : _B_a_s_e(data) │ │ │ │ │ -642 { │ │ │ │ │ -643 /* Nothing. */ │ │ │ │ │ -644 } │ │ │ │ │ -645 │ │ │ │ │ -_6_5_1 _R_a_n_g_e _o_p_e_r_a_t_o_r_(_)(const _D_o_m_a_i_n& x) const │ │ │ │ │ -652 { │ │ │ │ │ -653 HierarchicSearch search(this->data_->basis->gridView().grid(), this->data_- │ │ │ │ │ ->basis->gridView().indexSet()); │ │ │ │ │ -654 │ │ │ │ │ -655 const auto e = search.findEntity(x); │ │ │ │ │ -656 auto localThis = localFunction(*this); │ │ │ │ │ -657 localThis.bind(e); │ │ │ │ │ -658 return localThis(e.geometry().local(x)); │ │ │ │ │ -659 } │ │ │ │ │ -660 │ │ │ │ │ -_6_6_1 friend typename _T_r_a_i_t_s_:_:_D_e_r_i_v_a_t_i_v_e_I_n_t_e_r_f_a_c_e _d_e_r_i_v_a_t_i_v_e(const │ │ │ │ │ -_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e& f) │ │ │ │ │ -662 { │ │ │ │ │ -663 DUNE_THROW(NotImplemented, "derivative of derivative is not implemented"); │ │ │ │ │ -664 } │ │ │ │ │ -665 │ │ │ │ │ -_6_6_7 friend _L_o_c_a_l_F_u_n_c_t_i_o_n _l_o_c_a_l_F_u_n_c_t_i_o_n(const │ │ │ │ │ -_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e& f) │ │ │ │ │ -668 { │ │ │ │ │ -669 return _L_o_c_a_l_F_u_n_c_t_i_o_n(f); │ │ │ │ │ -670 } │ │ │ │ │ -671}; │ │ │ │ │ -672 │ │ │ │ │ -673 │ │ │ │ │ -674} // namespace Functions │ │ │ │ │ -675} // namespace Dune │ │ │ │ │ -676 │ │ │ │ │ -677#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH │ │ │ │ │ -_i_s_t_l_v_e_c_t_o_r_b_a_c_k_e_n_d_._h_h │ │ │ │ │ -_g_r_i_d_f_u_n_c_t_i_o_n_._h_h │ │ │ │ │ -_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h │ │ │ │ │ -_f_l_a_t_v_e_c_t_o_r_v_i_e_w_._h_h │ │ │ │ │ -_h_i_e_r_a_r_c_h_i_c_n_o_d_e_t_o_r_a_n_g_e_m_a_p_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_m_a_k_e_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n │ │ │ │ │ -auto makeDiscreteGlobalBasisFunction(B &&basis, V &&vector) │ │ │ │ │ -Generate a DiscreteGlobalBasisFunction. │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:454 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d │ │ │ │ │ -auto istlVectorBackend(Vector &v) │ │ │ │ │ -Return a vector backend wrapping non-const ISTL like containers. │ │ │ │ │ -DDeeffiinniittiioonn istlvectorbackend.hh:350 │ │ │ │ │ +72#endif // DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_IMP_HH │ │ │ │ │ +_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n___i_m_p_._h_h │ │ │ │ │ +_t_y_p_e___t_r_a_i_t_s_._h_h │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_l_a_t_V_e_c_t_o_r_V_i_e_w │ │ │ │ │ -auto flatVectorView(T &t) │ │ │ │ │ -Create flat vector view of passed mutable container. │ │ │ │ │ -DDeeffiinniittiioonn flatvectorview.hh:183 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ -Default implementation for derivative traits. │ │ │ │ │ -DDeeffiinniittiioonn defaultderivativetraits.hh:41 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_r_a_i_t_s │ │ │ │ │ -Helper class to deduce the signature of a callable. │ │ │ │ │ -DDeeffiinniittiioonn signature.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_N_o_d_e_T_o_R_a_n_g_e_M_a_p │ │ │ │ │ -A simple node to range map using the nested tree indices. │ │ │ │ │ -DDeeffiinniittiioonn hierarchicnodetorangemap.hh:34 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:34 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_d_a_t_a__ │ │ │ │ │ -std::shared_ptr< const Data > data_ │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:223 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_d_o_f_s │ │ │ │ │ -const Vector & dofs() const │ │ │ │ │ -Return the coefficients of this discrete function by reference. │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:205 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_B_a_s_i_s │ │ │ │ │ -B Basis │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:36 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_T_r_e_e │ │ │ │ │ -typename Basis::LocalView::Tree Tree │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:45 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_V_e_c_t_o_r │ │ │ │ │ -V Vector │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:37 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_E_l_e_m_e_n_t │ │ │ │ │ -typename EntitySet::Element Element │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:51 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_D_o_m_a_i_n │ │ │ │ │ -typename EntitySet::LocalCoordinate LocalDomain │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:50 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_n_o_d_e_T_o_R_a_n_g_e_E_n_t_r_y │ │ │ │ │ -const NodeToRangeEntry & nodeToRangeEntry() const │ │ │ │ │ -Return the stored node-to-range map. │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:211 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_N_o_d_e_T_o_R_a_n_g_e_E_n_t_r_y │ │ │ │ │ -NTRE NodeToRangeEntry │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:46 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ -_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e │ │ │ │ │ -DiscreteGlobalBasisFunctionBase(const std::shared_ptr< const Data > &data) │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:190 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ -typename Basis::GridView GridView │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:43 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_b_a_s_i_s │ │ │ │ │ -const Basis & basis() const │ │ │ │ │ -Return a const reference to the stored basis. │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:199 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_E_n_t_i_t_y_S_e_t │ │ │ │ │ -GridViewEntitySet< GridView, 0 > EntitySet │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:44 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_e_n_t_i_t_y_S_e_t │ │ │ │ │ -const EntitySet & entitySet() const │ │ │ │ │ -Get associated set of entities the local-function can be bound to. │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:217 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_D_o_m_a_i_n │ │ │ │ │ -typename EntitySet::GlobalCoordinate Domain │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:48 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_C_o_e_f_f_i_c_i_e_n_t │ │ │ │ │ -Dune::AutonomousValue< decltype(std::declval< Vector >()[std::declval< typename │ │ │ │ │ -Basis::MultiIndex >()])> Coefficient │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:41 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_D_a_t_a │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:59 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_D_a_t_a_:_:_e_n_t_i_t_y_S_e_t │ │ │ │ │ -EntitySet entitySet │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_D_a_t_a_:_: │ │ │ │ │ -_n_o_d_e_T_o_R_a_n_g_e_E_n_t_r_y │ │ │ │ │ -std::shared_ptr< const NodeToRangeEntry > nodeToRangeEntry │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:63 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_D_a_t_a_:_:_b_a_s_i_s │ │ │ │ │ -std::shared_ptr< const Basis > basis │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_D_a_t_a_:_:_c_o_e_f_f_i_c_i_e_n_t_s │ │ │ │ │ -std::shared_ptr< const Vector > coefficients │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:62 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:68 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ -_o_p_e_r_a_t_o_r_= │ │ │ │ │ -LocalFunctionBase & operator=(const LocalFunctionBase &other) │ │ │ │ │ -Copy-assignment of the local-function. │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:106 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ -_b_o_u_n_d │ │ │ │ │ -bool bound() const │ │ │ │ │ -Check if LocalFunction is already bound to an element. │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:155 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ -_b_i_n_d │ │ │ │ │ -void bind(const Element &element) │ │ │ │ │ -Bind LocalFunction to grid element. │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:122 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ -_E_l_e_m_e_n_t │ │ │ │ │ -typename EntitySet::Element Element │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:74 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ -_l_o_c_a_l_C_o_n_t_e_x_t │ │ │ │ │ -const Element & localContext() const │ │ │ │ │ -Return the element the local-function is bound to. │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:161 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ -_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e │ │ │ │ │ -LocalFunctionBase(const LocalFunctionBase &other) │ │ │ │ │ -Copy-construct the local-function. │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:90 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ -_l_o_c_a_l_D_o_F_s__ │ │ │ │ │ -std::vector< Coefficient > localDoFs_ │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:186 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ -_a_s_s_i_g_n_W_i_t_h │ │ │ │ │ -void assignWith(To &to, const From &from) const │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:169 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ -_d_a_t_a__ │ │ │ │ │ -std::shared_ptr< const Data > data_ │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:184 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ -_n_o_d_e_T_o_R_a_n_g_e_E_n_t_r_y │ │ │ │ │ -decltype(auto) nodeToRangeEntry(const Node &node, const TreePath &treePath, │ │ │ │ │ -Range &y) const │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:179 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ -_l_o_c_a_l_V_i_e_w__ │ │ │ │ │ -LocalView localView_ │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:185 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ -_u_n_b_i_n_d │ │ │ │ │ -void unbind() │ │ │ │ │ -Unbind the local-function. │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:149 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ -_D_o_m_a_i_n │ │ │ │ │ -LocalDomain Domain │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ -_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e │ │ │ │ │ -LocalFunctionBase(const std::shared_ptr< const Data > &data) │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:77 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e │ │ │ │ │ -Derivative of a DiscreteGlobalBasisFunction │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:494 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_B_a_s_i_s │ │ │ │ │ -typename Base::Basis Basis │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:501 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ -friend Traits::DerivativeInterface derivative(const │ │ │ │ │ -DiscreteGlobalBasisFunctionDerivative &f) │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:661 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -Range operator()(const Domain &x) const │ │ │ │ │ -Evaluate the discrete grid-function derivative in global coordinates. │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:651 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_R_a_n_g_e │ │ │ │ │ -typename SignatureTraits< typename DiscreteGlobalBasisFunction::Traits:: │ │ │ │ │ -DerivativeInterface >::Range Range │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:505 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_l_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ -friend LocalFunction localFunction(const DiscreteGlobalBasisFunctionDerivative │ │ │ │ │ -&f) │ │ │ │ │ -Construct local function from a DiscreteGlobalBasisFunctionDerivative │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:667 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_: │ │ │ │ │ -_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e │ │ │ │ │ -DiscreteGlobalBasisFunctionDerivative(const std::shared_ptr< const Data > │ │ │ │ │ -&data) │ │ │ │ │ -create object from DiscreateGlobalBasisFunction data │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:640 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_: │ │ │ │ │ -_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n │ │ │ │ │ -DGBF DiscreteGlobalBasisFunction │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:499 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_V_e_c_t_o_r │ │ │ │ │ -typename Base::Vector Vector │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:502 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_T_r_a_i_t_s │ │ │ │ │ -Imp::GridFunctionTraits< Range(Domain), typename Base::EntitySet, │ │ │ │ │ -DefaultDerivativeTraits, 16 > Traits │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:507 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_D_o_m_a_i_n │ │ │ │ │ -typename Base::Domain Domain │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:504 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n │ │ │ │ │ -A grid function induced by a global basis and a coefficient vector. │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:281 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ -friend DiscreteGlobalBasisFunctionDerivative< DiscreteGlobalBasisFunction > │ │ │ │ │ -derivative(const DiscreteGlobalBasisFunction &f) │ │ │ │ │ -Derivative of the DiscreteGlobalBasisFunction │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:409 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n │ │ │ │ │ -DiscreteGlobalBasisFunction(B_T &&basis, V_T &&coefficients, NTRE_T │ │ │ │ │ -&&nodeToRangeEntry) │ │ │ │ │ -Create a grid-function, by wrapping the arguments in std::shared_ptr. │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:384 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n │ │ │ │ │ -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. │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:389 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_l_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ -friend LocalFunction localFunction(const DiscreteGlobalBasisFunction &t) │ │ │ │ │ -Construct local function from a DiscreteGlobalBasisFunction. │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:422 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_B_a_s_i_s │ │ │ │ │ -typename Base::Basis Basis │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:286 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_T_r_a_i_t_s │ │ │ │ │ -Imp::GridFunctionTraits< Range(Domain), typename Base::EntitySet, │ │ │ │ │ -DefaultDerivativeTraits, 16 > Traits │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:292 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_R_a_n_g_e │ │ │ │ │ -R Range │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:290 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_V_e_c_t_o_r │ │ │ │ │ -typename Base::Vector Vector │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:287 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_D_o_m_a_i_n │ │ │ │ │ -typename Base::Domain Domain │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:289 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:305 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_:_R_a_n_g_e │ │ │ │ │ -GlobalFunction::Range Range │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:314 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_:_D_o_m_a_i_n │ │ │ │ │ -typename LocalBase::Domain Domain │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:313 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ -LocalFunction(const DiscreteGlobalBasisFunction &globalFunction) │ │ │ │ │ -Create a local-function from the associated grid-function. │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:318 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ -friend DiscreteGlobalBasisFunctionDerivative< DiscreteGlobalBasisFunction >:: │ │ │ │ │ -LocalFunction derivative(const LocalFunction &lf) │ │ │ │ │ -Local function of the derivative. │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:370 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -Range operator()(const Domain &x) const │ │ │ │ │ -Evaluate this local-function in coordinates x in the bound element. │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:334 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_:_E_l_e_m_e_n_t │ │ │ │ │ -typename LocalBase::Element Element │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:315 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ -local function evaluating the derivative in reference coordinates │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:528 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_:_o_p_e_r_a_t_o_r │ │ │ │ │ -_(_) │ │ │ │ │ -Range operator()(const Domain &x) const │ │ │ │ │ -Evaluate this local-function in coordinates x in the bound element. │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:579 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_:_D_o_m_a_i_n │ │ │ │ │ -typename LocalBase::Domain Domain │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:535 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_:_E_l_e_m_e_n_t │ │ │ │ │ -typename LocalBase::Element Element │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:537 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_: │ │ │ │ │ -_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ -friend Traits::LocalFunctionTraits::DerivativeInterface derivative(const │ │ │ │ │ -LocalFunction &) │ │ │ │ │ -Not implemented. │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:624 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_:_R_a_n_g_e │ │ │ │ │ -GlobalFunction::Range Range │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:536 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_:_u_n_b_i_n_d │ │ │ │ │ -void unbind() │ │ │ │ │ -Unbind the local-function. │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:560 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_: │ │ │ │ │ -_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ -LocalFunction(const GlobalFunction &globalFunction) │ │ │ │ │ -Create a local function from the associated grid function. │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:540 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_:_b_i_n_d │ │ │ │ │ -void bind(const Element &element) │ │ │ │ │ -Bind LocalFunction to grid element. │ │ │ │ │ -DDeeffiinniittiioonn discreteglobalbasisfunction.hh:553 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn gridfunction.hh:36 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_ _G_r_i_d_V_i_e_w_,_ _0_ _> │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_ _G_r_i_d_V_i_e_w_,_ _0_ _>_:_:_E_l_e_m_e_n_t │ │ │ │ │ -GridView::template Codim< codim >::Entity Element │ │ │ │ │ -Type of Elements contained in this EntitySet. │ │ │ │ │ -DDeeffiinniittiioonn gridviewentityset.hh:36 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_ _G_r_i_d_V_i_e_w_,_ _0_ _>_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -Element::Geometry::LocalCoordinate LocalCoordinate │ │ │ │ │ -Type of local coordinates with respect to the Element. │ │ │ │ │ -DDeeffiinniittiioonn gridviewentityset.hh:39 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_ _G_r_i_d_V_i_e_w_,_ _0_ _>_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -Element::Geometry::GlobalCoordinate GlobalCoordinate │ │ │ │ │ -DDeeffiinniittiioonn gridviewentityset.hh:40 │ │ │ │ │ -_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00029.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: localderivativetraits.hh File Reference │ │ │ │ +dune-functions: multiindex.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,44 +65,55 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
localderivativetraits.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
multiindex.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <dune/functions/common/defaultderivativetraits.hh>
│ │ │ │ +
#include <cstddef>
│ │ │ │ +#include <array>
│ │ │ │ +#include <iostream>
│ │ │ │ +#include <dune/common/hash.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::Functions::LocalDerivativeTraits< EntitySet, DerivativeTraits >
 Derivative traits for local functions. More...
class  Dune::Functions::StaticMultiIndex< size_type, n >
 A statically sized MultiIndex type. More...
 
struct  Dune::Functions::LocalDerivativeTraits< EntitySet, DerivativeTraits >::Traits< Signature >
class  Dune::Functions::StaticMultiIndex< size_type, 1 >
 A statically sized MultiIndex type. More...
 
struct  Dune::Functions::LocalDerivativeTraits< EntitySet, DerivativeTraits >::Traits< R(LocalDomain)>
struct  std::tuple_size< Dune::Functions::StaticMultiIndex< size_type, n > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ 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 {} │ │ │ │ │ @@ -1,28 +1,35 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -localderivativetraits.hh File Reference │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ + * _c_o_m_m_o_n │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +multiindex.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_ _E_n_t_i_t_y_S_e_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _> │ │ │ │ │ -  Derivative traits for local functions. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x_<_ _s_i_z_e___t_y_p_e_,_ _n_ _> │ │ │ │ │ +  A statically sized MultiIndex type. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_ _E_n_t_i_t_y_S_e_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ - _>_:_:_T_r_a_i_t_s_<_ _S_i_g_n_a_t_u_r_e_ _> │ │ │ │ │ + class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x_<_ _s_i_z_e___t_y_p_e_,_ _1_ _> │ │ │ │ │ +  A statically sized MultiIndex type. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_ _E_n_t_i_t_y_S_e_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ - _>_:_:_T_r_a_i_t_s_<_ _R_(_L_o_c_a_l_D_o_m_a_i_n_)_> │ │ │ │ │ +struct   _s_t_d_:_:_t_u_p_l_e___s_i_z_e_<_ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x_<_ _s_i_z_e___t_y_p_e_,_ _n_ _>_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +Stream &  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_o_p_e_r_a_t_o_r_<_< (Stream &stream, const _S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x< │ │ │ │ │ + size_type, n > &c) │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00029_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: localderivativetraits.hh Source File │ │ │ │ +dune-functions: multiindex.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,76 +70,127 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
localderivativetraits.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_LOCALDERIVATIVE_TRAITS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_LOCALDERIVATIVE_TRAITS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_COMMON_MULTIINDEX_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_COMMON_MULTIINDEX_HH
│ │ │ │
9
│ │ │ │ -
10
│ │ │ │ - │ │ │ │ -
12
│ │ │ │ +
10#include <cstddef>
│ │ │ │ +
11#include <array>
│ │ │ │ +
12#include <iostream>
│ │ │ │
13
│ │ │ │ -
14namespace Dune {
│ │ │ │ -
15namespace Functions {
│ │ │ │ +
14#include <dune/common/hash.hh>
│ │ │ │ +
15
│ │ │ │
16
│ │ │ │ -
17
│ │ │ │ -
30template<class EntitySet, template<class> class DerivativeTraits=DefaultDerivativeTraits>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
32{
│ │ │ │ -
33 using LocalDomain = typename EntitySet::LocalCoordinate;
│ │ │ │ -
34 using Domain = typename EntitySet::GlobalCoordinate;
│ │ │ │ -
35
│ │ │ │ -
36 template<class Signature>
│ │ │ │ -
│ │ │ │ -
37 struct Traits
│ │ │ │ -
38 {
│ │ │ │ - │ │ │ │ -
40 };
│ │ │ │ +
17namespace Dune::Functions {
│ │ │ │ +
18
│ │ │ │ +
19
│ │ │ │ +
20
│ │ │ │ +
26template<class size_type, std::size_t n>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
28 public std::array<size_type, n>
│ │ │ │ +
29{
│ │ │ │ +
30public:
│ │ │ │ +
31 static constexpr std::size_t size() { return n; }
│ │ │ │ +
32 static constexpr std::size_t max_size() { return n; }
│ │ │ │ +
33
│ │ │ │ +
│ │ │ │ +
34 inline friend std::size_t hash_value(const StaticMultiIndex& v) noexcept {
│ │ │ │ +
35 return hash_range(v.begin(), v.end());
│ │ │ │ +
36 }
│ │ │ │
│ │ │ │ +
37
│ │ │ │ +
38};
│ │ │ │ +
│ │ │ │ +
39
│ │ │ │ +
40
│ │ │ │
41
│ │ │ │ -
42 template<class R>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
44 {
│ │ │ │ -
45 using Range = typename DerivativeTraits<R(Domain)>::Range;
│ │ │ │ -
46 };
│ │ │ │ -
│ │ │ │ -
47};
│ │ │ │ -
│ │ │ │ -
48
│ │ │ │ -
49
│ │ │ │ -
50}} // namespace Dune::Functions
│ │ │ │ -
51
│ │ │ │ -
52#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_LOCALDERIVATIVE_TRAITS_HH
│ │ │ │ - │ │ │ │ +
51template<class size_type>
│ │ │ │ +
│ │ │ │ +
52class StaticMultiIndex<size_type,1> :
│ │ │ │ +
53 public std::array<size_type, 1>
│ │ │ │ +
54{
│ │ │ │ +
55public:
│ │ │ │ +
56
│ │ │ │ +
57 static constexpr std::size_t size() { return 1; }
│ │ │ │ +
58 static constexpr std::size_t max_size() { return 1; }
│ │ │ │ +
59
│ │ │ │ +
60
│ │ │ │ +
│ │ │ │ +
61 operator const size_type& () const {
│ │ │ │ +
62 return (*this)[0];
│ │ │ │ +
63 }
│ │ │ │ +
│ │ │ │ +
64
│ │ │ │ +
│ │ │ │ +
65 inline friend std::size_t hash_value(const StaticMultiIndex& v) noexcept {
│ │ │ │ +
66 return hash_range(v.begin(), v.end());
│ │ │ │ +
67 }
│ │ │ │ +
│ │ │ │ +
68
│ │ │ │ +
│ │ │ │ +
69 operator size_type& () {
│ │ │ │ +
70 return (*this)[0];
│ │ │ │ +
71 }
│ │ │ │ +
│ │ │ │ +
72
│ │ │ │ +
73};
│ │ │ │ +
│ │ │ │ +
74
│ │ │ │ +
75
│ │ │ │ +
76
│ │ │ │ +
77template<typename Stream, class size_type, std::size_t n>
│ │ │ │ +
│ │ │ │ +
78inline Stream& operator<<(Stream& stream, const StaticMultiIndex<size_type,n>& c) {
│ │ │ │ +
79 for (const auto& ci : c)
│ │ │ │ +
80 stream << ci << " ";
│ │ │ │ +
81 return stream;
│ │ │ │ +
82}
│ │ │ │ +
│ │ │ │ +
83
│ │ │ │ +
84
│ │ │ │ +
85
│ │ │ │ +
86} // namespace Dune::Functions
│ │ │ │ +
87
│ │ │ │ +
88template<class size_type, std::size_t n>
│ │ │ │ +
│ │ │ │ +
89struct std::tuple_size< Dune::Functions::StaticMultiIndex<size_type,n> >
│ │ │ │ +
90 : std::integral_constant<std::size_t, n> { };
│ │ │ │ +
│ │ │ │ +
91
│ │ │ │ +
92DUNE_DEFINE_HASH(DUNE_HASH_TEMPLATE_ARGS(typename size_type, std::size_t n),DUNE_HASH_TYPE(Dune::Functions::StaticMultiIndex<size_type,n>))
│ │ │ │ +
93
│ │ │ │ +
94#endif // DUNE_FUNCTIONS_COMMON_MULTIINDEX_HH
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
Dummy range class to be used if no proper type is available.
Definition defaultderivativetraits.hh:27
│ │ │ │ -
Derivative traits for local functions.
Definition localderivativetraits.hh:32
│ │ │ │ -
typename EntitySet::GlobalCoordinate Domain
Definition localderivativetraits.hh:34
│ │ │ │ -
typename EntitySet::LocalCoordinate LocalDomain
Definition localderivativetraits.hh:33
│ │ │ │ -
Definition localderivativetraits.hh:38
│ │ │ │ -
InvalidRange Range
Definition localderivativetraits.hh:39
│ │ │ │ -
typename DerivativeTraits< R(Domain)>::Range Range
Definition localderivativetraits.hh:45
│ │ │ │ +
Definition polynomial.hh:18
│ │ │ │ +
Stream & operator<<(Stream &stream, const StaticMultiIndex< size_type, n > &c)
Definition multiindex.hh:78
│ │ │ │ +
A statically sized MultiIndex type.
Definition multiindex.hh:29
│ │ │ │ +
static constexpr std::size_t size()
Definition multiindex.hh:31
│ │ │ │ +
friend std::size_t hash_value(const StaticMultiIndex &v) noexcept
Definition multiindex.hh:34
│ │ │ │ +
static constexpr std::size_t max_size()
Definition multiindex.hh:32
│ │ │ │ +
static constexpr std::size_t max_size()
Definition multiindex.hh:58
│ │ │ │ +
static constexpr std::size_t size()
Definition multiindex.hh:57
│ │ │ │ +
friend std::size_t hash_value(const StaticMultiIndex &v) noexcept
Definition multiindex.hh:65
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,77 +1,123 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ -localderivativetraits.hh │ │ │ │ │ + * _c_o_m_m_o_n │ │ │ │ │ +multiindex.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_LOCALDERIVATIVE_TRAITS_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_LOCALDERIVATIVE_TRAITS_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_COMMON_MULTIINDEX_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_COMMON_MULTIINDEX_HH │ │ │ │ │ 9 │ │ │ │ │ -10 │ │ │ │ │ -11#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -12 │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ 13 │ │ │ │ │ -14namespace _D_u_n_e { │ │ │ │ │ -15namespace Functions { │ │ │ │ │ +14#include │ │ │ │ │ +15 │ │ │ │ │ 16 │ │ │ │ │ -17 │ │ │ │ │ -30template class │ │ │ │ │ -DerivativeTraits=DefaultDerivativeTraits> │ │ │ │ │ -_3_1struct _L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ -32{ │ │ │ │ │ -_3_3 using _L_o_c_a_l_D_o_m_a_i_n = typename EntitySet::LocalCoordinate; │ │ │ │ │ -_3_4 using _D_o_m_a_i_n = typename EntitySet::GlobalCoordinate; │ │ │ │ │ -35 │ │ │ │ │ -36 template │ │ │ │ │ -_3_7 struct _T_r_a_i_t_s │ │ │ │ │ -38 { │ │ │ │ │ -_3_9 typedef _I_n_v_a_l_i_d_R_a_n_g_e _R_a_n_g_e; │ │ │ │ │ -40 }; │ │ │ │ │ +17namespace _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s { │ │ │ │ │ +18 │ │ │ │ │ +19 │ │ │ │ │ +20 │ │ │ │ │ +26template │ │ │ │ │ +_2_7class _S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x : │ │ │ │ │ +28 public std::array │ │ │ │ │ +29{ │ │ │ │ │ +30public: │ │ │ │ │ +_3_1 static constexpr std::size_t _s_i_z_e() { return n; } │ │ │ │ │ +_3_2 static constexpr std::size_t _m_a_x___s_i_z_e() { return n; } │ │ │ │ │ +33 │ │ │ │ │ +_3_4 inline friend std::size_t _h_a_s_h___v_a_l_u_e(const _S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x& v) noexcept { │ │ │ │ │ +35 return hash_range(v.begin(), v.end()); │ │ │ │ │ +36 } │ │ │ │ │ +37 │ │ │ │ │ +38}; │ │ │ │ │ +39 │ │ │ │ │ +40 │ │ │ │ │ 41 │ │ │ │ │ -42 template │ │ │ │ │ -_4_3 struct _T_r_a_i_t_s │ │ │ │ │ -44 { │ │ │ │ │ -_4_5 using _R_a_n_g_e = typename DerivativeTraits_:_:_R_a_n_g_e; │ │ │ │ │ -46 }; │ │ │ │ │ -47}; │ │ │ │ │ -48 │ │ │ │ │ -49 │ │ │ │ │ -50}} // namespace Dune::Functions │ │ │ │ │ -51 │ │ │ │ │ -52#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_LOCALDERIVATIVE_TRAITS_HH │ │ │ │ │ -_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h │ │ │ │ │ +51template │ │ │ │ │ +_5_2class _S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x : │ │ │ │ │ +53 public std::array │ │ │ │ │ +54{ │ │ │ │ │ +55public: │ │ │ │ │ +56 │ │ │ │ │ +_5_7 static constexpr std::size_t _s_i_z_e() { return 1; } │ │ │ │ │ +_5_8 static constexpr std::size_t _m_a_x___s_i_z_e() { return 1; } │ │ │ │ │ +59 │ │ │ │ │ +60 │ │ │ │ │ +_6_1 operator const size_type& () const { │ │ │ │ │ +62 return (*this)[0]; │ │ │ │ │ +63 } │ │ │ │ │ +64 │ │ │ │ │ +_6_5 inline friend std::size_t _h_a_s_h___v_a_l_u_e(const _S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x& v) noexcept { │ │ │ │ │ +66 return hash_range(v.begin(), v.end()); │ │ │ │ │ +67 } │ │ │ │ │ +68 │ │ │ │ │ +_6_9 operator size_type& () { │ │ │ │ │ +70 return (*this)[0]; │ │ │ │ │ +71 } │ │ │ │ │ +72 │ │ │ │ │ +73}; │ │ │ │ │ +74 │ │ │ │ │ +75 │ │ │ │ │ +76 │ │ │ │ │ +77template │ │ │ │ │ +_7_8inline Stream& _o_p_e_r_a_t_o_r_<_<(Stream& stream, const │ │ │ │ │ +_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x_<_s_i_z_e___t_y_p_e_,_n_>& c) { │ │ │ │ │ +79 for (const auto& ci : c) │ │ │ │ │ +80 stream << ci << " "; │ │ │ │ │ +81 return stream; │ │ │ │ │ +82} │ │ │ │ │ +83 │ │ │ │ │ +84 │ │ │ │ │ +85 │ │ │ │ │ +86} // namespace Dune::Functions │ │ │ │ │ +87 │ │ │ │ │ +88template │ │ │ │ │ +_8_9struct std::tuple_size< _D_u_n_e::Functions::StaticMultiIndex > │ │ │ │ │ +90 : std::integral_constant { }; │ │ │ │ │ +91 │ │ │ │ │ +92DUNE_DEFINE_HASH(DUNE_HASH_TEMPLATE_ARGS(typename size_type, std::size_t │ │ │ │ │ +n),DUNE_HASH_TYPE(_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x_<_s_i_z_e___t_y_p_e_,_n_>)) │ │ │ │ │ +93 │ │ │ │ │ +94#endif // DUNE_FUNCTIONS_COMMON_MULTIINDEX_HH │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_n_v_a_l_i_d_R_a_n_g_e │ │ │ │ │ -Dummy range class to be used if no proper type is available. │ │ │ │ │ -DDeeffiinniittiioonn defaultderivativetraits.hh:27 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ -Derivative traits for local functions. │ │ │ │ │ -DDeeffiinniittiioonn localderivativetraits.hh:32 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_:_:_D_o_m_a_i_n │ │ │ │ │ -typename EntitySet::GlobalCoordinate Domain │ │ │ │ │ -DDeeffiinniittiioonn localderivativetraits.hh:34 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_:_:_L_o_c_a_l_D_o_m_a_i_n │ │ │ │ │ -typename EntitySet::LocalCoordinate LocalDomain │ │ │ │ │ -DDeeffiinniittiioonn localderivativetraits.hh:33 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_:_:_T_r_a_i_t_s │ │ │ │ │ -DDeeffiinniittiioonn localderivativetraits.hh:38 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_:_:_T_r_a_i_t_s_:_:_R_a_n_g_e │ │ │ │ │ -InvalidRange Range │ │ │ │ │ -DDeeffiinniittiioonn localderivativetraits.hh:39 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_:_:_T_r_a_i_t_s_<_ _R_(_L_o_c_a_l_D_o_m_a_i_n_)_>_:_:_R_a_n_g_e │ │ │ │ │ -typename DerivativeTraits< R(Domain)>::Range Range │ │ │ │ │ -DDeeffiinniittiioonn localderivativetraits.hh:45 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │ +DDeeffiinniittiioonn polynomial.hh:18 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ +Stream & operator<<(Stream &stream, const StaticMultiIndex< size_type, n > &c) │ │ │ │ │ +DDeeffiinniittiioonn multiindex.hh:78 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x │ │ │ │ │ +A statically sized MultiIndex type. │ │ │ │ │ +DDeeffiinniittiioonn multiindex.hh:29 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x_:_:_s_i_z_e │ │ │ │ │ +static constexpr std::size_t size() │ │ │ │ │ +DDeeffiinniittiioonn multiindex.hh:31 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x_:_:_h_a_s_h___v_a_l_u_e │ │ │ │ │ +friend std::size_t hash_value(const StaticMultiIndex &v) noexcept │ │ │ │ │ +DDeeffiinniittiioonn multiindex.hh:34 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x_:_:_m_a_x___s_i_z_e │ │ │ │ │ +static constexpr std::size_t max_size() │ │ │ │ │ +DDeeffiinniittiioonn multiindex.hh:32 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x_<_ _s_i_z_e___t_y_p_e_,_ _1_ _>_:_:_m_a_x___s_i_z_e │ │ │ │ │ +static constexpr std::size_t max_size() │ │ │ │ │ +DDeeffiinniittiioonn multiindex.hh:58 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x_<_ _s_i_z_e___t_y_p_e_,_ _1_ _>_:_:_s_i_z_e │ │ │ │ │ +static constexpr std::size_t size() │ │ │ │ │ +DDeeffiinniittiioonn multiindex.hh:57 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x_<_ _s_i_z_e___t_y_p_e_,_ _1_ _>_:_:_h_a_s_h___v_a_l_u_e │ │ │ │ │ +friend std::size_t hash_value(const StaticMultiIndex &v) noexcept │ │ │ │ │ +DDeeffiinniittiioonn multiindex.hh:65 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00032.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: gridfunction_imp.hh File Reference │ │ │ │ +dune-functions: interfaces.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,29 +65,34 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces
│ │ │ │ -
gridfunction_imp.hh File Reference
│ │ │ │ +
interfaces.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <dune/functions/common/type_traits.hh>
│ │ │ │ -#include <dune/functions/common/interfaces.hh>
│ │ │ │ -#include <dune/functions/common/differentiablefunction_imp.hh>
│ │ │ │ +
#include <type_traits>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ +Classes

class  Dune::Functions::PolymorphicType< Interface >
 Base class with polymorphic type boiler plate code. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
 
│ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,20 +1,22 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -gridfunction_imp.hh File Reference │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_i_n_t_e_r_f_a_c_e_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n___i_m_p_._h_h> │ │ │ │ │ + * _c_o_m_m_o_n │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +interfaces.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_T_y_p_e_<_ _I_n_t_e_r_f_a_c_e_ _> │ │ │ │ │ +  Base class with polymorphic type boiler plate code. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00032_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: gridfunction_imp.hh Source File │ │ │ │ +dune-functions: interfaces.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,96 +70,68 @@ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
gridfunction_imp.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_IMP_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_IMP_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_COMMON_INTERFACES_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_COMMON_INTERFACES_HH
│ │ │ │
9
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
13
│ │ │ │ -
14
│ │ │ │ +
10#include <type_traits>
│ │ │ │ +
11
│ │ │ │ +
12
│ │ │ │ +
13namespace Dune {
│ │ │ │ +
14namespace Functions {
│ │ │ │
15
│ │ │ │ -
16namespace Dune {
│ │ │ │ -
17namespace Functions {
│ │ │ │ -
18namespace Imp {
│ │ │ │ -
19
│ │ │ │ -
23struct HasFreeLocalFunction
│ │ │ │ -
24{
│ │ │ │ -
25 template<class F>
│ │ │ │ -
26 auto require(F&& f) -> decltype(
│ │ │ │ -
27 localFunction(f)
│ │ │ │ -
28 );
│ │ │ │ -
29};
│ │ │ │ -
30
│ │ │ │ +
16
│ │ │ │ +
17
│ │ │ │ +
27template<class Interface>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
29{
│ │ │ │ +
30public:
│ │ │ │
31
│ │ │ │ -
32
│ │ │ │ -
33// Interface of type erasure wrapper
│ │ │ │ -
34//
│ │ │ │ -
35// Notice that the basic interface of polymorphic classes (destructor, clone, ...)
│ │ │ │ -
36// will be added by the type erasure foundation classes.
│ │ │ │ -
37template<class Signature, class DerivativeInterface, class LocalFunctionInterface, class EntitySet>
│ │ │ │ -
38class GridFunctionWrapperInterface :
│ │ │ │ -
39 public DifferentiableFunctionWrapperInterface<Signature, DerivativeInterface>
│ │ │ │ -
40{
│ │ │ │ -
41public:
│ │ │ │ -
42 virtual LocalFunctionInterface wrappedLocalFunction() const = 0;
│ │ │ │ -
43
│ │ │ │ -
44 virtual const EntitySet& wrappedEntitySet() const = 0;
│ │ │ │ -
45};
│ │ │ │ -
46
│ │ │ │ -
47
│ │ │ │ -
48// Implementation of type erasure wrapper
│ │ │ │ -
49template<class Signature, class DerivativeInterface, class LocalFunctionInterface, class EntitySet, class B>
│ │ │ │ -
50class GridFunctionWrapperImplementation :
│ │ │ │ -
51 public DifferentiableFunctionWrapperImplementation<Signature, DerivativeInterface, B>
│ │ │ │ -
52{
│ │ │ │ -
53 using Base = DifferentiableFunctionWrapperImplementation<Signature, DerivativeInterface, B>;
│ │ │ │ -
54public:
│ │ │ │ -
55 using Base::Base;
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
34 {}
│ │ │ │ +
│ │ │ │ +
35
│ │ │ │ +
44 virtual Interface* clone() const = 0;
│ │ │ │ +
45
│ │ │ │ +
55 virtual Interface* clone(void* buffer) const = 0;
│ │ │ │
56
│ │ │ │ -
57 virtual LocalFunctionInterface wrappedLocalFunction() const
│ │ │ │ -
58 {
│ │ │ │ -
59 return localFunction(this->get());
│ │ │ │ -
60 }
│ │ │ │ -
61
│ │ │ │ -
62 virtual const EntitySet& wrappedEntitySet() const
│ │ │ │ -
63 {
│ │ │ │ -
64 return this->get().entitySet();
│ │ │ │ -
65 }
│ │ │ │ -
66};
│ │ │ │ -
67
│ │ │ │ +
66 virtual Interface* move(void* buffer) = 0;
│ │ │ │ +
67};
│ │ │ │ +
│ │ │ │
68
│ │ │ │
69
│ │ │ │ -
70}}} // namespace Dune::Functions::Imp
│ │ │ │ -
71
│ │ │ │ +
70
│ │ │ │ +
71}} // namespace Dune::Functions
│ │ │ │
72
│ │ │ │ -
73
│ │ │ │ -
74#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_IMP_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +
73#endif // DUNE_FUNCTIONS_COMMON_EXTENDED_CLONEABLE_HH
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ +
Base class with polymorphic type boiler plate code.
Definition interfaces.hh:29
│ │ │ │ +
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:33
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,95 +1,68 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ -gridfunction_imp.hh │ │ │ │ │ + * _c_o_m_m_o_n │ │ │ │ │ +interfaces.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_IMP_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_IMP_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_COMMON_INTERFACES_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_COMMON_INTERFACES_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ -11#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_i_n_t_e_r_f_a_c_e_s_._h_h> │ │ │ │ │ -12#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n___i_m_p_._h_h> │ │ │ │ │ -13 │ │ │ │ │ -14 │ │ │ │ │ +10#include │ │ │ │ │ +11 │ │ │ │ │ +12 │ │ │ │ │ +13namespace _D_u_n_e { │ │ │ │ │ +14namespace Functions { │ │ │ │ │ 15 │ │ │ │ │ -16namespace _D_u_n_e { │ │ │ │ │ -17namespace Functions { │ │ │ │ │ -18namespace Imp { │ │ │ │ │ -19 │ │ │ │ │ -23struct HasFreeLocalFunction │ │ │ │ │ -24{ │ │ │ │ │ -25 template │ │ │ │ │ -26 auto require(F&& f) -> decltype( │ │ │ │ │ -27 localFunction(f) │ │ │ │ │ -28 ); │ │ │ │ │ -29}; │ │ │ │ │ -30 │ │ │ │ │ +16 │ │ │ │ │ +17 │ │ │ │ │ +27template │ │ │ │ │ +_2_8class _P_o_l_y_m_o_r_p_h_i_c_T_y_p_e │ │ │ │ │ +29{ │ │ │ │ │ +30public: │ │ │ │ │ 31 │ │ │ │ │ -32 │ │ │ │ │ -33// Interface of type erasure wrapper │ │ │ │ │ -34// │ │ │ │ │ -35// Notice that the basic interface of polymorphic classes (destructor, clone, │ │ │ │ │ -...) │ │ │ │ │ -36// will be added by the type erasure foundation classes. │ │ │ │ │ -37template │ │ │ │ │ -38class GridFunctionWrapperInterface : │ │ │ │ │ -39 public DifferentiableFunctionWrapperInterface │ │ │ │ │ -40{ │ │ │ │ │ -41public: │ │ │ │ │ -42 virtual LocalFunctionInterface wrappedLocalFunction() const = 0; │ │ │ │ │ -43 │ │ │ │ │ -44 virtual const EntitySet& wrappedEntitySet() const = 0; │ │ │ │ │ -45}; │ │ │ │ │ -46 │ │ │ │ │ -47 │ │ │ │ │ -48// Implementation of type erasure wrapper │ │ │ │ │ -49template │ │ │ │ │ -50class GridFunctionWrapperImplementation : │ │ │ │ │ -51 public DifferentiableFunctionWrapperImplementation │ │ │ │ │ -52{ │ │ │ │ │ -53 using Base = DifferentiableFunctionWrapperImplementation; │ │ │ │ │ -54public: │ │ │ │ │ -55 using Base::Base; │ │ │ │ │ +_3_3 virtual _~_P_o_l_y_m_o_r_p_h_i_c_T_y_p_e() │ │ │ │ │ +34 {} │ │ │ │ │ +35 │ │ │ │ │ +_4_4 virtual Interface* _c_l_o_n_e() const = 0; │ │ │ │ │ +45 │ │ │ │ │ +_5_5 virtual Interface* _c_l_o_n_e(void* buffer) const = 0; │ │ │ │ │ 56 │ │ │ │ │ -57 virtual LocalFunctionInterface wrappedLocalFunction() const │ │ │ │ │ -58 { │ │ │ │ │ -59 return localFunction(this->get()); │ │ │ │ │ -60 } │ │ │ │ │ -61 │ │ │ │ │ -62 virtual const EntitySet& wrappedEntitySet() const │ │ │ │ │ -63 { │ │ │ │ │ -64 return this->get().entitySet(); │ │ │ │ │ -65 } │ │ │ │ │ -66}; │ │ │ │ │ -67 │ │ │ │ │ +_6_6 virtual Interface* _m_o_v_e(void* buffer) = 0; │ │ │ │ │ +67}; │ │ │ │ │ 68 │ │ │ │ │ 69 │ │ │ │ │ -70}}} // namespace Dune::Functions::Imp │ │ │ │ │ -71 │ │ │ │ │ +70 │ │ │ │ │ +71}} // namespace Dune::Functions │ │ │ │ │ 72 │ │ │ │ │ -73 │ │ │ │ │ -74#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_IMP_HH │ │ │ │ │ -_t_y_p_e___t_r_a_i_t_s_._h_h │ │ │ │ │ -_i_n_t_e_r_f_a_c_e_s_._h_h │ │ │ │ │ -_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n___i_m_p_._h_h │ │ │ │ │ +73#endif // DUNE_FUNCTIONS_COMMON_EXTENDED_CLONEABLE_HH │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_T_y_p_e │ │ │ │ │ +Base class with polymorphic type boiler plate code. │ │ │ │ │ +DDeeffiinniittiioonn interfaces.hh:29 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_T_y_p_e_:_:_c_l_o_n_e │ │ │ │ │ +virtual Interface * clone(void *buffer) const =0 │ │ │ │ │ +Clones the object into buffer. │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_T_y_p_e_:_:_c_l_o_n_e │ │ │ │ │ +virtual Interface * clone() const =0 │ │ │ │ │ +Clones the object. │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_T_y_p_e_:_:_m_o_v_e │ │ │ │ │ +virtual Interface * move(void *buffer)=0 │ │ │ │ │ +Move object into buffer. │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_T_y_p_e_:_:_~_P_o_l_y_m_o_r_p_h_i_c_T_y_p_e │ │ │ │ │ +virtual ~PolymorphicType() │ │ │ │ │ +Destructor. │ │ │ │ │ +DDeeffiinniittiioonn interfaces.hh:33 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00035.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: facenormalgridfunction.hh File Reference │ │ │ │ +dune-functions: polymorphicsmallobject.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,39 +65,35 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
facenormalgridfunction.hh File Reference
│ │ │ │ +
polymorphicsmallobject.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ -#include <optional>
│ │ │ │ -#include <dune/common/exceptions.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 <cstddef>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <algorithm>
│ │ │ │
│ │ │ │

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::PolymorphicSmallObject< Base, bufferSize >
 A wrapper providing small object optimization with polymorphic types. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,28 +1,25 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ + * _c_o_m_m_o_n │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -facenormalgridfunction.hh File Reference │ │ │ │ │ +polymorphicsmallobject.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h> │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n_<_ _G_V_ _> │ │ │ │ │ -  Grid function implementing the piecewise element face normal. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t_<_ _B_a_s_e_,_ _b_u_f_f_e_r_S_i_z_e_ _> │ │ │ │ │ +  A wrapper providing small object optimization with polymorphic types. │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00035_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: facenormalgridfunction.hh Source File │ │ │ │ +dune-functions: polymorphicsmallobject.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,213 +70,207 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
facenormalgridfunction.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_FACENORMALGRIDFUNCTION_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_FACENORMALGRIDFUNCTION_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_COMMON_POLYMORPHICSMALLOBJECT_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_COMMON_POLYMORPHICSMALLOBJECT_HH
│ │ │ │
9
│ │ │ │ -
10#include <type_traits>
│ │ │ │ -
11#include <optional>
│ │ │ │ -
12
│ │ │ │ -
13#include <dune/common/exceptions.hh>
│ │ │ │ -
14#include <dune/common/typeutilities.hh>
│ │ │ │ -
15#include <dune/common/rangeutilities.hh>
│ │ │ │ -
16#include <dune/geometry/referenceelements.hh>
│ │ │ │ +
10#include <cstddef>
│ │ │ │ +
11#include <utility>
│ │ │ │ +
12#include <type_traits>
│ │ │ │ +
13#include <algorithm>
│ │ │ │ +
14
│ │ │ │ +
15namespace Dune {
│ │ │ │ +
16namespace Functions {
│ │ │ │
17
│ │ │ │ - │ │ │ │ - │ │ │ │ -
20
│ │ │ │ -
21
│ │ │ │ -
22namespace Dune::Functions {
│ │ │ │ -
23
│ │ │ │ -
24namespace Impl {
│ │ │ │ -
25
│ │ │ │ -
26// Compute closest face to point
│ │ │ │ -
27template<class ReferenceElement, class Coordinate>
│ │ │ │ -
28auto closestFaceIndex(const ReferenceElement& re, const Coordinate& x)
│ │ │ │ -
29{
│ │ │ │ -
30 auto closestFaceIndex = decltype(re.subEntity(0,1,0,1)){};
│ │ │ │ -
31 double closestFaceDistance = std::numeric_limits<double>::max();
│ │ │ │ -
32 for(auto&& faceIndex : Dune::range(re.size(1)))
│ │ │ │ -
33 {
│ │ │ │ -
34 // For a face unit outer normal consider the orthogonal projection
│ │ │ │ -
35 // Px = x + <c-x,n>*n into the face. Then the distance to the face
│ │ │ │ -
36 // is given by |x-Px| = |<c-x,n>||n| = <c-x,n>.
│ │ │ │ -
37 auto normal = re.integrationOuterNormal(faceIndex);
│ │ │ │ -
38 normal /= normal.two_norm();
│ │ │ │ -
39 auto c = re.position(faceIndex,1);
│ │ │ │ -
40 c -= x;
│ │ │ │ -
41 auto faceDistance = (c*normal);
│ │ │ │ -
42 if (faceDistance<closestFaceDistance)
│ │ │ │ -
43 {
│ │ │ │ -
44 closestFaceDistance = faceDistance;
│ │ │ │ -
45 closestFaceIndex = faceIndex;
│ │ │ │ -
46 }
│ │ │ │ -
47 }
│ │ │ │ -
48 return closestFaceIndex;
│ │ │ │ -
49}
│ │ │ │ -
50
│ │ │ │ -
51} // end namespace Impl
│ │ │ │ -
52
│ │ │ │ -
53
│ │ │ │ +
18
│ │ │ │ +
49template<class Base, size_t bufferSize>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
51{
│ │ │ │ +
52 // Actual buffer size must be > 0
│ │ │ │ +
53 static constexpr std::size_t actualBufferSize = std::max(sizeof(std::byte), bufferSize);
│ │ │ │
54
│ │ │ │ -
55
│ │ │ │ -
68template<class GV>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
70{
│ │ │ │ -
71public:
│ │ │ │ -
72 using GridView = GV;
│ │ │ │ - │ │ │ │ -
74 using Element = typename EntitySet::Element;
│ │ │ │ -
75
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +
55 // Alignment requirement for the buffer. The `Derived` type must have
│ │ │ │ +
56 // an alignment requirement that is a divisor of `bufferAlignment`
│ │ │ │ +
57 static constexpr std::size_t bufferAlignment = alignof(std::max_align_t);
│ │ │ │ +
58
│ │ │ │ +
59public:
│ │ │ │ +
60
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
63 p_(nullptr)
│ │ │ │ +
64 {}
│ │ │ │ +
│ │ │ │ +
65
│ │ │ │ +
72 template<class Derived,
│ │ │ │ +
73 std::enable_if_t<std::is_base_of_v<Base, std::remove_cv_t<
│ │ │ │ +
74 std::remove_reference_t<Derived>>>, int> = 0>
│ │ │ │ +
│ │ │ │ +
75 PolymorphicSmallObject(Derived&& derived)
│ │ │ │ +
76 {
│ │ │ │ +
77 constexpr bool useBuffer = (sizeof(Derived) <= bufferSize)
│ │ │ │ +
78 && (bufferAlignment % alignof(Derived) == 0);
│ │ │ │
79
│ │ │ │ -
80private:
│ │ │ │ -
81
│ │ │ │ -
82 using Traits = Imp::GridFunctionTraits<Range(Domain), EntitySet, DefaultDerivativeTraits, 16>;
│ │ │ │ -
83
│ │ │ │ -
84 class LocalFunction
│ │ │ │ -
85 {
│ │ │ │ -
86 using Geometry = typename Element::Geometry;
│ │ │ │ -
87 static const int dimension = GV::dimension;
│ │ │ │ -
88 public:
│ │ │ │ -
89
│ │ │ │ -
101 void bind(const Element& element)
│ │ │ │ -
102 {
│ │ │ │ -
103 element_ = element;
│ │ │ │ -
104 geometry_.emplace(element_.geometry());
│ │ │ │ -
105 }
│ │ │ │ -
106
│ │ │ │ -
107 void unbind()
│ │ │ │ -
108 {
│ │ │ │ -
109 geometry_.reset();
│ │ │ │ -
110 }
│ │ │ │ -
111
│ │ │ │ -
114 bool bound() const
│ │ │ │ -
115 {
│ │ │ │ -
116 return static_cast<bool>(geometry_);
│ │ │ │ -
117 }
│ │ │ │ -
118
│ │ │ │ -
128 Range operator()(const LocalDomain& x) const
│ │ │ │ -
129 {
│ │ │ │ -
130 auto&& re = Dune::referenceElement(*geometry_);
│ │ │ │ -
131 // Compute reference normal of closest face to given point
│ │ │ │ -
132 auto face = Impl::closestFaceIndex(re, x);
│ │ │ │ -
133 auto localNormal = re.integrationOuterNormal(face);
│ │ │ │ -
134
│ │ │ │ -
135 // Transform reference normal into global unit outer normal using
│ │ │ │ -
136 // covariant Piola transformation
│ │ │ │ -
137 auto normal = Range{};
│ │ │ │ -
138 geometry_->jacobianInverseTransposed(x).mv(localNormal, normal);
│ │ │ │ -
139 normal /= normal.two_norm();
│ │ │ │ -
140 return normal;
│ │ │ │ -
141 }
│ │ │ │ -
142
│ │ │ │ -
144 const Element& localContext() const
│ │ │ │ -
145 {
│ │ │ │ -
146 return element_;
│ │ │ │ -
147 }
│ │ │ │ -
148
│ │ │ │ -
150 friend typename Traits::LocalFunctionTraits::DerivativeInterface derivative(const LocalFunction& t)
│ │ │ │ -
151 {
│ │ │ │ -
152 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │ -
153 }
│ │ │ │ -
154
│ │ │ │ -
155 private:
│ │ │ │ -
156 std::optional<Geometry> geometry_;
│ │ │ │ -
157 Element element_;
│ │ │ │ -
158 };
│ │ │ │ -
159
│ │ │ │ -
160public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
163 entitySet_(gridView)
│ │ │ │ -
164 {}
│ │ │ │ -
│ │ │ │ -
165
│ │ │ │ -
│ │ │ │ -
167 Range operator()(const Domain& x) const
│ │ │ │ -
168 {
│ │ │ │ -
169 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │ -
170 }
│ │ │ │ -
│ │ │ │ +
80 if constexpr (useBuffer) {
│ │ │ │ +
81 p_ = new (&buffer_) Derived(std::forward<Derived>(derived));
│ │ │ │ +
82 } else {
│ │ │ │ +
83 p_ = new Derived(std::forward<Derived>(derived));
│ │ │ │ +
84 }
│ │ │ │ +
85 }
│ │ │ │ +
│ │ │ │ +
86
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
89 {
│ │ │ │ +
90 moveToWrappedObject(std::move(other));
│ │ │ │ +
91 }
│ │ │ │ +
│ │ │ │ +
92
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
95 {
│ │ │ │ +
96 copyToWrappedObject(other);
│ │ │ │ +
97 }
│ │ │ │ +
│ │ │ │ +
98
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
101 {
│ │ │ │ +
102 destroyWrappedObject();
│ │ │ │ +
103 }
│ │ │ │ +
│ │ │ │ +
104
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
107 {
│ │ │ │ +
108 if (&other!=this)
│ │ │ │ +
109 {
│ │ │ │ +
110 destroyWrappedObject();
│ │ │ │ +
111 copyToWrappedObject(other);
│ │ │ │ +
112 }
│ │ │ │ +
113 return *this;
│ │ │ │ +
114 }
│ │ │ │ +
│ │ │ │ +
115
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
118 {
│ │ │ │ +
119 destroyWrappedObject();
│ │ │ │ +
120 moveToWrappedObject(std::move(other));
│ │ │ │ +
121 return *this;
│ │ │ │ +
122 }
│ │ │ │ +
│ │ │ │ +
123
│ │ │ │ +
│ │ │ │ +
125 explicit operator bool() const
│ │ │ │ +
126 {
│ │ │ │ +
127 return p_;
│ │ │ │ +
128 }
│ │ │ │ +
│ │ │ │ +
129
│ │ │ │ +
│ │ │ │ +
131 bool bufferUsed() const
│ │ │ │ +
132 {
│ │ │ │ +
133 return ((void*) (p_) == (void*)(&buffer_));
│ │ │ │ +
134 }
│ │ │ │ +
│ │ │ │ +
135
│ │ │ │ +
│ │ │ │ +
137 const Base& get() const
│ │ │ │ +
138 {
│ │ │ │ +
139 return *p_;
│ │ │ │ +
140 }
│ │ │ │ +
│ │ │ │ +
141
│ │ │ │ +
│ │ │ │ +
143 Base& get()
│ │ │ │ +
144 {
│ │ │ │ +
145 return *p_;
│ │ │ │ +
146 }
│ │ │ │ +
│ │ │ │ +
147
│ │ │ │ +
148private:
│ │ │ │ +
149
│ │ │ │ +
150 void destroyWrappedObject() noexcept
│ │ │ │ +
151 {
│ │ │ │ +
152 if (operator bool())
│ │ │ │ +
153 {
│ │ │ │ +
154 if (bufferUsed())
│ │ │ │ +
155 p_->~Base();
│ │ │ │ +
156 else
│ │ │ │ +
157 delete p_;
│ │ │ │ +
158 }
│ │ │ │ +
159 }
│ │ │ │ +
160
│ │ │ │ +
161 void moveToWrappedObject(PolymorphicSmallObject&& other) noexcept
│ │ │ │ +
162 {
│ │ │ │ +
163 if (other.bufferUsed())
│ │ │ │ +
164 p_ = other.p_->move(&buffer_);
│ │ │ │ +
165 else
│ │ │ │ +
166 {
│ │ │ │ +
167 // We don't need to check for &other_!=this, because you can't
│ │ │ │ +
168 // have an rvalue to *this and call it's assignment/constructor
│ │ │ │ +
169 // at the same time. (Despite trying to shoot yourself in the foot
│ │ │ │ +
170 // with std::move explicitly.)
│ │ │ │
171
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
174 {
│ │ │ │ -
175 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │ -
176 }
│ │ │ │ -
│ │ │ │ -
177
│ │ │ │ -
│ │ │ │ -
179 friend LocalFunction localFunction(const FaceNormalGridFunction& t)
│ │ │ │ -
180 {
│ │ │ │ -
181 return LocalFunction{};
│ │ │ │ -
182 }
│ │ │ │ -
│ │ │ │ -
183
│ │ │ │ -
│ │ │ │ -
185 const EntitySet& entitySet() const
│ │ │ │ -
186 {
│ │ │ │ -
187 return entitySet_;
│ │ │ │ -
188 }
│ │ │ │ -
│ │ │ │ -
189
│ │ │ │ -
190private:
│ │ │ │ -
191 EntitySet entitySet_;
│ │ │ │ -
192};
│ │ │ │ -
│ │ │ │ -
193
│ │ │ │ -
194
│ │ │ │ +
172 // Take ownership of allocated object
│ │ │ │ +
173 p_ = other.p_;
│ │ │ │ +
174
│ │ │ │ +
175 // Leave pointer in a clean state to avoid double freeing it.
│ │ │ │ +
176 other.p_ = 0;
│ │ │ │ +
177 }
│ │ │ │ +
178 }
│ │ │ │ +
179
│ │ │ │ +
180 void copyToWrappedObject(const PolymorphicSmallObject& other)
│ │ │ │ +
181 {
│ │ │ │ +
182 if (other.bufferUsed())
│ │ │ │ +
183 p_ = other.p_->clone(&buffer_);
│ │ │ │ +
184 else
│ │ │ │ +
185 p_ = other.p_->clone();
│ │ │ │ +
186 }
│ │ │ │ +
187
│ │ │ │ +
188 alignas(bufferAlignment) std::byte buffer_[actualBufferSize];
│ │ │ │ +
189 Base* p_;
│ │ │ │ +
190};
│ │ │ │ +
│ │ │ │ +
191
│ │ │ │ +
192
│ │ │ │ +
193} // namespace Functions
│ │ │ │ +
194} // namespace Dune
│ │ │ │
195
│ │ │ │ -
196} // namespace Dune::Functions
│ │ │ │ -
197
│ │ │ │ -
198#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_FACENORMALGRIDFUNCTION_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ -
TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const TrigonometricFunction< K, sinFactor, cosFactor > &f)
Obtain derivative of TrigonometricFunction function.
Definition trigonometricfunction.hh:43
│ │ │ │ +
196#endif // DUNE_FUNCTIONS_COMMON_POLYMORPHICSMALLOBJECT_HH
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
Definition polynomial.hh:18
│ │ │ │ -
Default implementation for derivative traits.
Definition defaultderivativetraits.hh:41
│ │ │ │ -
Grid function implementing the piecewise element face normal.
Definition facenormalgridfunction.hh:70
│ │ │ │ -
GridViewEntitySet< GridView, 0 > EntitySet
Definition facenormalgridfunction.hh:73
│ │ │ │ -
typename EntitySet::LocalCoordinate LocalDomain
Definition facenormalgridfunction.hh:76
│ │ │ │ -
typename EntitySet::GlobalCoordinate Domain
Definition facenormalgridfunction.hh:77
│ │ │ │ -
typename EntitySet::GlobalCoordinate Range
Definition facenormalgridfunction.hh:78
│ │ │ │ -
const EntitySet & entitySet() const
Return the stored GridViewEntitySet.
Definition facenormalgridfunction.hh:185
│ │ │ │ -
friend Traits::DerivativeInterface derivative(const FaceNormalGridFunction &t)
Not implemented.
Definition facenormalgridfunction.hh:173
│ │ │ │ -
GV GridView
Definition facenormalgridfunction.hh:72
│ │ │ │ -
friend LocalFunction localFunction(const FaceNormalGridFunction &t)
Return a local-function associated to FaceNormalGridFunction.
Definition facenormalgridfunction.hh:179
│ │ │ │ -
FaceNormalGridFunction(const GridView &gridView)
Construct the FaceNormalGridFunction.
Definition facenormalgridfunction.hh:162
│ │ │ │ -
typename EntitySet::Element Element
Definition facenormalgridfunction.hh:74
│ │ │ │ -
Range operator()(const Domain &x) const
Not implemented.
Definition facenormalgridfunction.hh:167
│ │ │ │ -
Definition gridfunction.hh:36
│ │ │ │ - │ │ │ │ -
GridView::template Codim< codim >::Entity Element
Type of Elements contained in this EntitySet.
Definition gridviewentityset.hh:36
│ │ │ │ -
Element::Geometry::LocalCoordinate LocalCoordinate
Type of local coordinates with respect to the Element.
Definition gridviewentityset.hh:39
│ │ │ │ -
Element::Geometry::GlobalCoordinate GlobalCoordinate
Definition gridviewentityset.hh:40
│ │ │ │ +
A wrapper providing small object optimization with polymorphic types.
Definition polymorphicsmallobject.hh:51
│ │ │ │ +
const Base & get() const
Obtain reference to stored object.
Definition polymorphicsmallobject.hh:137
│ │ │ │ +
bool bufferUsed() const
Check if object is stored in internal stack buffer.
Definition polymorphicsmallobject.hh:131
│ │ │ │ +
PolymorphicSmallObject(Derived &&derived)
Construct from object.
Definition polymorphicsmallobject.hh:75
│ │ │ │ +
PolymorphicSmallObject(PolymorphicSmallObject &&other) noexcept
Move constructor from other PolymorphicSmallObject.
Definition polymorphicsmallobject.hh:88
│ │ │ │ +
PolymorphicSmallObject & operator=(const PolymorphicSmallObject &other)
Copy assignment from other PolymorphicSmallObject.
Definition polymorphicsmallobject.hh:106
│ │ │ │ +
PolymorphicSmallObject & operator=(PolymorphicSmallObject &&other) noexcept
Move assignment from other PolymorphicSmallObject.
Definition polymorphicsmallobject.hh:117
│ │ │ │ +
PolymorphicSmallObject(const PolymorphicSmallObject &other)
Copy constructor from other PolymorphicSmallObject.
Definition polymorphicsmallobject.hh:94
│ │ │ │ +
~PolymorphicSmallObject()
Destructor.
Definition polymorphicsmallobject.hh:100
│ │ │ │ +
PolymorphicSmallObject()
Default constructor.
Definition polymorphicsmallobject.hh:62
│ │ │ │ +
Base & get()
Obtain mutable reference to stored object.
Definition polymorphicsmallobject.hh:143
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,242 +1,209 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ -facenormalgridfunction.hh │ │ │ │ │ + * _c_o_m_m_o_n │ │ │ │ │ +polymorphicsmallobject.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_FACENORMALGRIDFUNCTION_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_FACENORMALGRIDFUNCTION_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_COMMON_POLYMORPHICSMALLOBJECT_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_COMMON_POLYMORPHICSMALLOBJECT_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12 │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14 │ │ │ │ │ +15namespace _D_u_n_e { │ │ │ │ │ +16namespace Functions { │ │ │ │ │ 17 │ │ │ │ │ -18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ -19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h> │ │ │ │ │ -20 │ │ │ │ │ -21 │ │ │ │ │ -22namespace _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s { │ │ │ │ │ -23 │ │ │ │ │ -24namespace Impl { │ │ │ │ │ -25 │ │ │ │ │ -26// Compute closest face to point │ │ │ │ │ -27template │ │ │ │ │ -28auto closestFaceIndex(const ReferenceElement& re, const Coordinate& x) │ │ │ │ │ -29{ │ │ │ │ │ -30 auto closestFaceIndex = decltype(re.subEntity(0,1,0,1)){}; │ │ │ │ │ -31 double closestFaceDistance = std::numeric_limits::max(); │ │ │ │ │ -32 for(auto&& faceIndex : _D_u_n_e::range(re.size(1))) │ │ │ │ │ -33 { │ │ │ │ │ -34 // For a face unit outer normal consider the orthogonal projection │ │ │ │ │ -35 // Px = x + *n into the face. Then the distance to the face │ │ │ │ │ -36 // is given by |x-Px| = |||n| = . │ │ │ │ │ -37 auto normal = re.integrationOuterNormal(faceIndex); │ │ │ │ │ -38 normal /= normal.two_norm(); │ │ │ │ │ -39 auto c = re.position(faceIndex,1); │ │ │ │ │ -40 c -= x; │ │ │ │ │ -41 auto faceDistance = (c*normal); │ │ │ │ │ -42 if (faceDistance │ │ │ │ │ +_5_0class _P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t │ │ │ │ │ +51{ │ │ │ │ │ +52 // Actual buffer size must be > 0 │ │ │ │ │ +53 static constexpr std::size_t actualBufferSize = std::max(sizeof(std::byte), │ │ │ │ │ +bufferSize); │ │ │ │ │ 54 │ │ │ │ │ -55 │ │ │ │ │ -68template │ │ │ │ │ -_6_9class _F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ -70{ │ │ │ │ │ -71public: │ │ │ │ │ -_7_2 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ -_7_3 using _E_n_t_i_t_y_S_e_t = _G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_G_r_i_d_V_i_e_w_,_ _0_>; │ │ │ │ │ -_7_4 using _E_l_e_m_e_n_t = typename _E_n_t_i_t_y_S_e_t_:_:_E_l_e_m_e_n_t; │ │ │ │ │ -75 │ │ │ │ │ -_7_6 using _L_o_c_a_l_D_o_m_a_i_n = typename _E_n_t_i_t_y_S_e_t_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ -_7_7 using _D_o_m_a_i_n = typename _E_n_t_i_t_y_S_e_t_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ -_7_8 using _R_a_n_g_e = typename _E_n_t_i_t_y_S_e_t_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ +55 // Alignment requirement for the buffer. The `Derived` type must have │ │ │ │ │ +56 // an alignment requirement that is a divisor of `bufferAlignment` │ │ │ │ │ +57 static constexpr std::size_t bufferAlignment = alignof(std::max_align_t); │ │ │ │ │ +58 │ │ │ │ │ +59public: │ │ │ │ │ +60 │ │ │ │ │ +_6_2 _P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t() : │ │ │ │ │ +63 p_(nullptr) │ │ │ │ │ +64 {} │ │ │ │ │ +65 │ │ │ │ │ +72 template>>, int> = 0> │ │ │ │ │ +_7_5 _P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t(Derived&& derived) │ │ │ │ │ +76 { │ │ │ │ │ +77 constexpr bool useBuffer = (sizeof(Derived) <= bufferSize) │ │ │ │ │ +78 && (bufferAlignment % alignof(Derived) == 0); │ │ │ │ │ 79 │ │ │ │ │ -80private: │ │ │ │ │ -81 │ │ │ │ │ -82 using Traits = Imp::GridFunctionTraits<_R_a_n_g_e(_D_o_m_a_i_n), _E_n_t_i_t_y_S_e_t, │ │ │ │ │ -_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s, 16>; │ │ │ │ │ -83 │ │ │ │ │ -84 class LocalFunction │ │ │ │ │ -85 { │ │ │ │ │ -86 using Geometry = typename Element::Geometry; │ │ │ │ │ -87 static const int dimension = GV::dimension; │ │ │ │ │ -88 public: │ │ │ │ │ -89 │ │ │ │ │ -101 void bind(const _E_l_e_m_e_n_t& element) │ │ │ │ │ -102 { │ │ │ │ │ -103 element_ = element; │ │ │ │ │ -104 geometry_.emplace(element_.geometry()); │ │ │ │ │ -105 } │ │ │ │ │ -106 │ │ │ │ │ -107 void unbind() │ │ │ │ │ -108 { │ │ │ │ │ -109 geometry_.reset(); │ │ │ │ │ -110 } │ │ │ │ │ -111 │ │ │ │ │ -114 bool bound() const │ │ │ │ │ -115 { │ │ │ │ │ -116 return static_cast(geometry_); │ │ │ │ │ -117 } │ │ │ │ │ -118 │ │ │ │ │ -128 _R_a_n_g_e operator()(const _L_o_c_a_l_D_o_m_a_i_n& x) const │ │ │ │ │ -129 { │ │ │ │ │ -130 auto&& re = Dune::referenceElement(*geometry_); │ │ │ │ │ -131 // Compute reference normal of closest face to given point │ │ │ │ │ -132 auto face = Impl::closestFaceIndex(re, x); │ │ │ │ │ -133 auto localNormal = re.integrationOuterNormal(face); │ │ │ │ │ -134 │ │ │ │ │ -135 // Transform reference normal into global unit outer normal using │ │ │ │ │ -136 // covariant Piola transformation │ │ │ │ │ -137 auto normal = _R_a_n_g_e{}; │ │ │ │ │ -138 geometry_->jacobianInverseTransposed(x).mv(localNormal, normal); │ │ │ │ │ -139 normal /= normal.two_norm(); │ │ │ │ │ -140 return normal; │ │ │ │ │ -141 } │ │ │ │ │ -142 │ │ │ │ │ -144 const _E_l_e_m_e_n_t& localContext() const │ │ │ │ │ -145 { │ │ │ │ │ -146 return element_; │ │ │ │ │ -147 } │ │ │ │ │ -148 │ │ │ │ │ -150 friend typename _T_r_a_i_t_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_T_r_a_i_t_s_:_:_D_e_r_i_v_a_t_i_v_e_I_n_t_e_r_f_a_c_e _d_e_r_i_v_a_t_i_v_e │ │ │ │ │ -(const LocalFunction& t) │ │ │ │ │ +80 if constexpr (useBuffer) { │ │ │ │ │ +81 p_ = new (&buffer_) Derived(std::forward(derived)); │ │ │ │ │ +82 } else { │ │ │ │ │ +83 p_ = new Derived(std::forward(derived)); │ │ │ │ │ +84 } │ │ │ │ │ +85 } │ │ │ │ │ +86 │ │ │ │ │ +_8_8 _P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t(_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t&& other) noexcept │ │ │ │ │ +89 { │ │ │ │ │ +90 moveToWrappedObject(std::move(other)); │ │ │ │ │ +91 } │ │ │ │ │ +92 │ │ │ │ │ +_9_4 _P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t(const _P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t& other) │ │ │ │ │ +95 { │ │ │ │ │ +96 copyToWrappedObject(other); │ │ │ │ │ +97 } │ │ │ │ │ +98 │ │ │ │ │ +_1_0_0 _~_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t() │ │ │ │ │ +101 { │ │ │ │ │ +102 destroyWrappedObject(); │ │ │ │ │ +103 } │ │ │ │ │ +104 │ │ │ │ │ +_1_0_6 _P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t& _o_p_e_r_a_t_o_r_=(const _P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t& other) │ │ │ │ │ +107 { │ │ │ │ │ +108 if (&other!=this) │ │ │ │ │ +109 { │ │ │ │ │ +110 destroyWrappedObject(); │ │ │ │ │ +111 copyToWrappedObject(other); │ │ │ │ │ +112 } │ │ │ │ │ +113 return *this; │ │ │ │ │ +114 } │ │ │ │ │ +115 │ │ │ │ │ +_1_1_7 _P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t& _o_p_e_r_a_t_o_r_=(_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t&& other) noexcept │ │ │ │ │ +118 { │ │ │ │ │ +119 destroyWrappedObject(); │ │ │ │ │ +120 moveToWrappedObject(std::move(other)); │ │ │ │ │ +121 return *this; │ │ │ │ │ +122 } │ │ │ │ │ +123 │ │ │ │ │ +_1_2_5 explicit operator bool() const │ │ │ │ │ +126 { │ │ │ │ │ +127 return p_; │ │ │ │ │ +128 } │ │ │ │ │ +129 │ │ │ │ │ +_1_3_1 bool _b_u_f_f_e_r_U_s_e_d() const │ │ │ │ │ +132 { │ │ │ │ │ +133 return ((void*) (p_) == (void*)(&buffer_)); │ │ │ │ │ +134 } │ │ │ │ │ +135 │ │ │ │ │ +_1_3_7 const Base& _g_e_t() const │ │ │ │ │ +138 { │ │ │ │ │ +139 return *p_; │ │ │ │ │ +140 } │ │ │ │ │ +141 │ │ │ │ │ +_1_4_3 Base& _g_e_t() │ │ │ │ │ +144 { │ │ │ │ │ +145 return *p_; │ │ │ │ │ +146 } │ │ │ │ │ +147 │ │ │ │ │ +148private: │ │ │ │ │ +149 │ │ │ │ │ +150 void destroyWrappedObject() noexcept │ │ │ │ │ 151 { │ │ │ │ │ -152 DUNE_THROW(NotImplemented,"not implemented"); │ │ │ │ │ -153 } │ │ │ │ │ -154 │ │ │ │ │ -155 private: │ │ │ │ │ -156 std::optional geometry_; │ │ │ │ │ -157 _E_l_e_m_e_n_t element_; │ │ │ │ │ -158 }; │ │ │ │ │ -159 │ │ │ │ │ -160public: │ │ │ │ │ -_1_6_2 _F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n(const _G_r_i_d_V_i_e_w& gridView) : │ │ │ │ │ -163 entitySet_(gridView) │ │ │ │ │ -164 {} │ │ │ │ │ -165 │ │ │ │ │ -_1_6_7 _R_a_n_g_e _o_p_e_r_a_t_o_r_(_)(const _D_o_m_a_i_n& x) const │ │ │ │ │ -168 { │ │ │ │ │ -169 DUNE_THROW(NotImplemented,"not implemented"); │ │ │ │ │ -170 } │ │ │ │ │ +152 if (operator bool()) │ │ │ │ │ +153 { │ │ │ │ │ +154 if (_b_u_f_f_e_r_U_s_e_d()) │ │ │ │ │ +155 p_->~Base(); │ │ │ │ │ +156 else │ │ │ │ │ +157 delete p_; │ │ │ │ │ +158 } │ │ │ │ │ +159 } │ │ │ │ │ +160 │ │ │ │ │ +161 void moveToWrappedObject(_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t&& other) noexcept │ │ │ │ │ +162 { │ │ │ │ │ +163 if (other.bufferUsed()) │ │ │ │ │ +164 p_ = other.p_->move(&buffer_); │ │ │ │ │ +165 else │ │ │ │ │ +166 { │ │ │ │ │ +167 // We don't need to check for &other_!=this, because you can't │ │ │ │ │ +168 // have an rvalue to *this and call it's assignment/constructor │ │ │ │ │ +169 // at the same time. (Despite trying to shoot yourself in the foot │ │ │ │ │ +170 // with std::move explicitly.) │ │ │ │ │ 171 │ │ │ │ │ -_1_7_3 friend typename _T_r_a_i_t_s_:_:_D_e_r_i_v_a_t_i_v_e_I_n_t_e_r_f_a_c_e _d_e_r_i_v_a_t_i_v_e(const │ │ │ │ │ -_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n& t) │ │ │ │ │ -174 { │ │ │ │ │ -175 DUNE_THROW(NotImplemented,"not implemented"); │ │ │ │ │ -176 } │ │ │ │ │ -177 │ │ │ │ │ -_1_7_9 friend LocalFunction _l_o_c_a_l_F_u_n_c_t_i_o_n(const _F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n& t) │ │ │ │ │ -180 { │ │ │ │ │ -181 return LocalFunction{}; │ │ │ │ │ -182 } │ │ │ │ │ -183 │ │ │ │ │ -_1_8_5 const _E_n_t_i_t_y_S_e_t& _e_n_t_i_t_y_S_e_t() const │ │ │ │ │ -186 { │ │ │ │ │ -187 return entitySet_; │ │ │ │ │ -188 } │ │ │ │ │ -189 │ │ │ │ │ -190private: │ │ │ │ │ -191 _E_n_t_i_t_y_S_e_t entitySet_; │ │ │ │ │ -192}; │ │ │ │ │ -193 │ │ │ │ │ -194 │ │ │ │ │ +172 // Take ownership of allocated object │ │ │ │ │ +173 p_ = other.p_; │ │ │ │ │ +174 │ │ │ │ │ +175 // Leave pointer in a clean state to avoid double freeing it. │ │ │ │ │ +176 other.p_ = 0; │ │ │ │ │ +177 } │ │ │ │ │ +178 } │ │ │ │ │ +179 │ │ │ │ │ +180 void copyToWrappedObject(const _P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t& other) │ │ │ │ │ +181 { │ │ │ │ │ +182 if (other.bufferUsed()) │ │ │ │ │ +183 p_ = other.p_->clone(&buffer_); │ │ │ │ │ +184 else │ │ │ │ │ +185 p_ = other.p_->clone(); │ │ │ │ │ +186 } │ │ │ │ │ +187 │ │ │ │ │ +188 alignas(bufferAlignment) std::byte buffer_[actualBufferSize]; │ │ │ │ │ +189 Base* p_; │ │ │ │ │ +190}; │ │ │ │ │ +191 │ │ │ │ │ +192 │ │ │ │ │ +193} // namespace Functions │ │ │ │ │ +194} // namespace Dune │ │ │ │ │ 195 │ │ │ │ │ -196} // namespace Dune::Functions │ │ │ │ │ -197 │ │ │ │ │ -198#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_FACENORMALGRIDFUNCTION_HH │ │ │ │ │ -_g_r_i_d_f_u_n_c_t_i_o_n_._h_h │ │ │ │ │ -_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ -TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const │ │ │ │ │ -TrigonometricFunction< K, sinFactor, cosFactor > &f) │ │ │ │ │ -Obtain derivative of TrigonometricFunction function. │ │ │ │ │ -DDeeffiinniittiioonn trigonometricfunction.hh:43 │ │ │ │ │ +196#endif // DUNE_FUNCTIONS_COMMON_POLYMORPHICSMALLOBJECT_HH │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │ -DDeeffiinniittiioonn polynomial.hh:18 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ -Default implementation for derivative traits. │ │ │ │ │ -DDeeffiinniittiioonn defaultderivativetraits.hh:41 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ -Grid function implementing the piecewise element face normal. │ │ │ │ │ -DDeeffiinniittiioonn facenormalgridfunction.hh:70 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n_:_:_E_n_t_i_t_y_S_e_t │ │ │ │ │ -GridViewEntitySet< GridView, 0 > EntitySet │ │ │ │ │ -DDeeffiinniittiioonn facenormalgridfunction.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n_:_:_L_o_c_a_l_D_o_m_a_i_n │ │ │ │ │ -typename EntitySet::LocalCoordinate LocalDomain │ │ │ │ │ -DDeeffiinniittiioonn facenormalgridfunction.hh:76 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n_:_:_D_o_m_a_i_n │ │ │ │ │ -typename EntitySet::GlobalCoordinate Domain │ │ │ │ │ -DDeeffiinniittiioonn facenormalgridfunction.hh:77 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n_:_:_R_a_n_g_e │ │ │ │ │ -typename EntitySet::GlobalCoordinate Range │ │ │ │ │ -DDeeffiinniittiioonn facenormalgridfunction.hh:78 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n_:_:_e_n_t_i_t_y_S_e_t │ │ │ │ │ -const EntitySet & entitySet() const │ │ │ │ │ -Return the stored GridViewEntitySet. │ │ │ │ │ -DDeeffiinniittiioonn facenormalgridfunction.hh:185 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ -friend Traits::DerivativeInterface derivative(const FaceNormalGridFunction &t) │ │ │ │ │ -Not implemented. │ │ │ │ │ -DDeeffiinniittiioonn facenormalgridfunction.hh:173 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ -GV GridView │ │ │ │ │ -DDeeffiinniittiioonn facenormalgridfunction.hh:72 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n_:_:_l_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ -friend LocalFunction localFunction(const FaceNormalGridFunction &t) │ │ │ │ │ -Return a local-function associated to FaceNormalGridFunction. │ │ │ │ │ -DDeeffiinniittiioonn facenormalgridfunction.hh:179 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ -FaceNormalGridFunction(const GridView &gridView) │ │ │ │ │ -Construct the FaceNormalGridFunction. │ │ │ │ │ -DDeeffiinniittiioonn facenormalgridfunction.hh:162 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n_:_:_E_l_e_m_e_n_t │ │ │ │ │ -typename EntitySet::Element Element │ │ │ │ │ -DDeeffiinniittiioonn facenormalgridfunction.hh:74 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -Range operator()(const Domain &x) const │ │ │ │ │ -Not implemented. │ │ │ │ │ -DDeeffiinniittiioonn facenormalgridfunction.hh:167 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn gridfunction.hh:36 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_ _G_r_i_d_V_i_e_w_,_ _0_ _> │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_ _G_r_i_d_V_i_e_w_,_ _0_ _>_:_:_E_l_e_m_e_n_t │ │ │ │ │ -GridView::template Codim< codim >::Entity Element │ │ │ │ │ -Type of Elements contained in this EntitySet. │ │ │ │ │ -DDeeffiinniittiioonn gridviewentityset.hh:36 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_ _G_r_i_d_V_i_e_w_,_ _0_ _>_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -Element::Geometry::LocalCoordinate LocalCoordinate │ │ │ │ │ -Type of local coordinates with respect to the Element. │ │ │ │ │ -DDeeffiinniittiioonn gridviewentityset.hh:39 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_ _G_r_i_d_V_i_e_w_,_ _0_ _>_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -Element::Geometry::GlobalCoordinate GlobalCoordinate │ │ │ │ │ -DDeeffiinniittiioonn gridviewentityset.hh:40 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t │ │ │ │ │ +A wrapper providing small object optimization with polymorphic types. │ │ │ │ │ +DDeeffiinniittiioonn polymorphicsmallobject.hh:51 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t_:_:_g_e_t │ │ │ │ │ +const Base & get() const │ │ │ │ │ +Obtain reference to stored object. │ │ │ │ │ +DDeeffiinniittiioonn polymorphicsmallobject.hh:137 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t_:_:_b_u_f_f_e_r_U_s_e_d │ │ │ │ │ +bool bufferUsed() const │ │ │ │ │ +Check if object is stored in internal stack buffer. │ │ │ │ │ +DDeeffiinniittiioonn polymorphicsmallobject.hh:131 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t │ │ │ │ │ +PolymorphicSmallObject(Derived &&derived) │ │ │ │ │ +Construct from object. │ │ │ │ │ +DDeeffiinniittiioonn polymorphicsmallobject.hh:75 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t │ │ │ │ │ +PolymorphicSmallObject(PolymorphicSmallObject &&other) noexcept │ │ │ │ │ +Move constructor from other PolymorphicSmallObject. │ │ │ │ │ +DDeeffiinniittiioonn polymorphicsmallobject.hh:88 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +PolymorphicSmallObject & operator=(const PolymorphicSmallObject &other) │ │ │ │ │ +Copy assignment from other PolymorphicSmallObject. │ │ │ │ │ +DDeeffiinniittiioonn polymorphicsmallobject.hh:106 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +PolymorphicSmallObject & operator=(PolymorphicSmallObject &&other) noexcept │ │ │ │ │ +Move assignment from other PolymorphicSmallObject. │ │ │ │ │ +DDeeffiinniittiioonn polymorphicsmallobject.hh:117 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t │ │ │ │ │ +PolymorphicSmallObject(const PolymorphicSmallObject &other) │ │ │ │ │ +Copy constructor from other PolymorphicSmallObject. │ │ │ │ │ +DDeeffiinniittiioonn polymorphicsmallobject.hh:94 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t_:_:_~_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t │ │ │ │ │ +~PolymorphicSmallObject() │ │ │ │ │ +Destructor. │ │ │ │ │ +DDeeffiinniittiioonn polymorphicsmallobject.hh:100 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t │ │ │ │ │ +PolymorphicSmallObject() │ │ │ │ │ +Default constructor. │ │ │ │ │ +DDeeffiinniittiioonn polymorphicsmallobject.hh:62 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t_:_:_g_e_t │ │ │ │ │ +Base & get() │ │ │ │ │ +Obtain mutable reference to stored object. │ │ │ │ │ +DDeeffiinniittiioonn polymorphicsmallobject.hh:143 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00038.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: gridviewfunction.hh File Reference │ │ │ │ +dune-functions: utility.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,58 +65,97 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ +Typedefs | │ │ │ │ Functions
│ │ │ │ -
gridviewfunction.hh File Reference
│ │ │ │ +
utility.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#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>
│ │ │ │ +
#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.

│ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ Classes

class  Dune::Functions::GridViewFunction< Signature, GridView, DerivativeTraits, bufferSize >
struct  Dune::Functions::LastType< T >
 Get last entry of type list. More...
 
class  Dune::Functions::GridViewFunction< Range(Domain), GV, DerivativeTraits, bufferSize >
 Wrapper class for functions defined on a GridView. 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.
 
template<template< class... > class F, class... Tuples>
using Dune::Functions::TransformTuple = typename Imp::TransformTupleHelper< F, Tuples... >::Type
 Transform tuple types argument using type-functor.
 
template<class IntegerSequence >
using Dune::Functions::IntegerSequenceTuple = typename Imp::IntegerSequenceTupleHelper< IntegerSequence >::Type
 Transform integer_sequence<I,k...> to tuple<integral_constant<I,k>...>
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<class F , class GridView , std::enable_if_t< models< Imp::HasFreeLocalFunction, F >(), int > = 0>
std::decay_t< F > Dune::Functions::makeGridViewFunction (F &&f, const GridView &gridView)
 Construct a function modeling GridViewFunction from function and grid view.
 
template<class F , class GridView , std::enable_if_t< not(models< Imp::HasFreeLocalFunction, F >()), int > = 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.
 
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.
 
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.
 
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.
 
template<class Expression >
auto Dune::Functions::callableCheck (Expression f)
 Create a predicate for checking validity of expressions.
 
template<class Check >
auto Dune::Functions::negatePredicate (Check check)
 Negate given predicate.
 
template<class T >
auto Dune::Functions::forwardCapture (T &&t)
 Create a capture object for perfect forwarding.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,46 +1,92 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -gridviewfunction.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_a_n_a_l_y_t_i_c_g_r_i_d_v_i_e_w_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ + * _c_o_m_m_o_n │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +utility.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _S_i_g_n_a_t_u_r_e_,_ _G_r_i_d_V_i_e_w_, │ │ │ │ │ - _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _b_u_f_f_e_r_S_i_z_e_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_s_t_T_y_p_e_<_ _T_ _> │ │ │ │ │ +  Get last entry of type list. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ - _b_u_f_f_e_r_S_i_z_e_ _> │ │ │ │ │ -  Wrapper class for functions defined on a GridView. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_o_t_a_t_e_T_u_p_l_e_<_ _T_ _> │ │ │ │ │ +  Rotate type list by one, such that last entry is moved to first │ │ │ │ │ + position. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ +TTyyppeeddeeffss │ │ │ │ │ +template class T, class ArgTuple > │ │ │ │ │ +using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_a_n_d_T_u_p_l_e = typename Imp::ExpandTupleHelper< T, │ │ │ │ │ + ArgTuple >::Type │ │ │ │ │ +  Expand tuple arguments as template arguments. │ │ │ │ │ +  │ │ │ │ │ +template class F, class... Tuples> │ │ │ │ │ +using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_r_a_n_s_f_o_r_m_T_u_p_l_e = typename Imp::TransformTupleHelper< F, │ │ │ │ │ + Tuples... >::Type │ │ │ │ │ +  Transform tuple types argument using type-functor. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_n_t_e_g_e_r_S_e_q_u_e_n_c_e_T_u_p_l_e = typename Imp:: │ │ │ │ │ + IntegerSequenceTupleHelper< IntegerSequence >::Type │ │ │ │ │ +  Transform integer_sequence to tuple...> │ │ │ │ │ +  │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template(), int > = 0> │ │ │ │ │ -std::decay_t< F >  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n (F &&f, const GridView │ │ │ │ │ - &gridView) │ │ │ │ │ -  Construct a function modeling _G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n from function │ │ │ │ │ - and grid view. │ │ │ │ │ -  │ │ │ │ │ -template()), int > = 0> │ │ │ │ │ - auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n (F &&f, const GridView │ │ │ │ │ - &gridView) -> decltype(_m_a_k_e_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n(std:: │ │ │ │ │ - forward< F >(f), gridView)) │ │ │ │ │ -  Construct a function modeling _G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n from function │ │ │ │ │ - and grid view. │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_o_r_w_a_r_d_A_s_S_t_a_t_i_c_I_n_t_e_g_e_r (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  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_o_r_w_a_r_d_A_s_S_t_a_t_i_c_I_n_t_e_g_e_r (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  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_o_r_w_a_r_d_A_s_S_t_a_t_i_c_I_n_d_e_x (const size_type &i, F &&f, Args │ │ │ │ │ + &&... args) -> decltype(f(Dune::Indices::_0, std::forward< Args > │ │ │ │ │ + (args)...)) │ │ │ │ │ +  Transform dynamic index to static index_constant. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_t_r_a_n_s_f_o_r_m_T_u_p_l_e (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. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_t_r_a_n_s_f_o_r_m_T_u_p_l_e (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. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_a_l_l_a_b_l_e_C_h_e_c_k (Expression f) │ │ │ │ │ +  Create a predicate for checking validity of expressions. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_n_e_g_a_t_e_P_r_e_d_i_c_a_t_e (Check check) │ │ │ │ │ +  Negate given predicate. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_o_r_w_a_r_d_C_a_p_t_u_r_e (T &&t) │ │ │ │ │ +  Create a capture object for perfect forwarding. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00038_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: gridviewfunction.hh Source File │ │ │ │ +dune-functions: utility.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,107 +70,312 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
gridviewfunction.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWFUNCTION_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWFUNCTION_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_COMMON_UTILITY_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_COMMON_UTILITY_HH
│ │ │ │
9
│ │ │ │ -
10#include <memory>
│ │ │ │ -
11
│ │ │ │ -
12#include <dune/common/concept.hh>
│ │ │ │ +
10
│ │ │ │ +
11#include <utility>
│ │ │ │ +
12#include <type_traits>
│ │ │ │
13
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
17
│ │ │ │ +
14#include <dune/common/overloadset.hh>
│ │ │ │ +
15#include <dune/common/indices.hh>
│ │ │ │ +
16
│ │ │ │ + │ │ │ │
18
│ │ │ │
19namespace Dune {
│ │ │ │
20namespace Functions {
│ │ │ │
21
│ │ │ │
22
│ │ │ │
23
│ │ │ │ -
24template<class Signature, class GridView, template<class> class DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
26{};
│ │ │ │ -
│ │ │ │ -
27
│ │ │ │ -
28
│ │ │ │ -
29
│ │ │ │ -
44template<class Range, class Domain, class GV, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ -
│ │ │ │ -
45class GridViewFunction<Range(Domain), GV, DerivativeTraits, bufferSize> :
│ │ │ │ -
46 public GridFunction<Range(Domain), GridViewEntitySet<GV, 0>, DerivativeTraits, bufferSize>
│ │ │ │ -
47{
│ │ │ │ -
48 using Base = GridFunction<Range(Domain), GridViewEntitySet<GV, 0>, DerivativeTraits, bufferSize>;
│ │ │ │ -
49public:
│ │ │ │ -
50 using GridView = GV;
│ │ │ │ -
51
│ │ │ │ -
52 using Base::Base;
│ │ │ │ -
53};
│ │ │ │ -
│ │ │ │ -
54
│ │ │ │ -
55
│ │ │ │ -
56
│ │ │ │ -
68template<class F, class GridView,
│ │ │ │ -
69 std::enable_if_t<
│ │ │ │ -
70 models< Imp::HasFreeLocalFunction, F>() , int> = 0>
│ │ │ │ -
71std::decay_t<F>
│ │ │ │ -
│ │ │ │ -
72 makeGridViewFunction(F&& f, const GridView& gridView)
│ │ │ │ -
73{
│ │ │ │ -
74 return std::forward<F>(f);
│ │ │ │ -
75}
│ │ │ │ -
│ │ │ │ -
76
│ │ │ │ +
24template<class F, class size_type, size_type firstValue, class... Args>
│ │ │ │ +
│ │ │ │ +
25auto forwardAsStaticInteger(std::integer_sequence<size_type, firstValue> values, const size_type& i, F&& f, Args&&... args)
│ │ │ │ +
26 ->decltype(f(std::integral_constant<size_type, firstValue>(), std::forward<Args>(args)...))
│ │ │ │ +
27{
│ │ │ │ +
28 return f(std::integral_constant<size_type, firstValue>(), std::forward<Args>(args)...);
│ │ │ │ +
29}
│ │ │ │ +
│ │ │ │ +
30
│ │ │ │ +
31template<class F, class size_type, size_type firstValue, size_type secondValue, size_type... otherValues, class... Args>
│ │ │ │ +
│ │ │ │ +
32auto forwardAsStaticInteger(std::integer_sequence<size_type, firstValue, secondValue, otherValues...> values, const size_type i, F&& f, Args&&... args)
│ │ │ │ +
33 ->decltype(f(std::integral_constant<size_type, firstValue>(), std::forward<Args>(args)...))
│ │ │ │ +
34{
│ │ │ │ +
35 if (i==firstValue)
│ │ │ │ +
36 return f(std::integral_constant<size_type, firstValue>(), std::forward<Args>(args)...);
│ │ │ │ +
37 return forwardAsStaticInteger(std::integer_sequence<size_type, secondValue, otherValues...>(), i, std::forward<F>(f), std::forward<Args>(args)...);
│ │ │ │ +
38}
│ │ │ │ +
│ │ │ │ +
39
│ │ │ │ +
40
│ │ │ │ +
41
│ │ │ │ +
63template<std::size_t end, class F, class size_type, class... Args>
│ │ │ │ +
│ │ │ │ +
64auto forwardAsStaticIndex(const size_type& i, F&& f, Args&&... args)
│ │ │ │ +
65 ->decltype(f(Dune::Indices::_0, std::forward<Args>(args)...))
│ │ │ │ +
66{
│ │ │ │ +
67 return forwardAsStaticInteger(std::make_index_sequence<end>{}, i, std::forward<F>(f), std::forward<Args>(args)...);
│ │ │ │ +
68}
│ │ │ │ +
│ │ │ │ +
69
│ │ │ │ +
70
│ │ │ │ +
71
│ │ │ │ +
72namespace Imp {
│ │ │ │ +
73
│ │ │ │ +
74 template<template<class...> class T, class List>
│ │ │ │ +
75 struct ExpandTupleHelper
│ │ │ │ +
76 {};
│ │ │ │
77
│ │ │ │ -
78
│ │ │ │ -
94template<class F, class GridView,
│ │ │ │ -
95 std::enable_if_t<
│ │ │ │ -
96 not(models< Imp::HasFreeLocalFunction, F>()) , int> = 0>
│ │ │ │ -
│ │ │ │ -
97auto makeGridViewFunction(F&& f, const GridView& gridView)
│ │ │ │ -
98 -> decltype(makeAnalyticGridViewFunction(std::forward<F>(f), gridView))
│ │ │ │ -
99{
│ │ │ │ -
100 return makeAnalyticGridViewFunction(std::forward<F>(f), gridView);
│ │ │ │ -
101}
│ │ │ │ -
│ │ │ │ -
102
│ │ │ │ +
78 template<template<class...> class T, template<class...> class ListType, class... Args>
│ │ │ │ +
79 struct ExpandTupleHelper<T, ListType<Args...>>
│ │ │ │ +
80 {
│ │ │ │ +
81 using Type = T<Args...>;
│ │ │ │ +
82 };
│ │ │ │ +
83
│ │ │ │ +
84} // end namespace Imp
│ │ │ │ +
85
│ │ │ │ +
97template<template<class...> class T, class ArgTuple>
│ │ │ │ +
98using ExpandTuple = typename Imp::ExpandTupleHelper<T, ArgTuple>::Type;
│ │ │ │ +
99
│ │ │ │ +
100
│ │ │ │ +
101
│ │ │ │ +
102namespace Imp {
│ │ │ │
103
│ │ │ │ -
104
│ │ │ │ -
105} // end of namespace Dune::Functions
│ │ │ │ -
106} // end of namespace Dune
│ │ │ │ +
104 template<template<class...> class T, class... Tuple>
│ │ │ │ +
105 struct TransformTupleHelper
│ │ │ │ +
106 {};
│ │ │ │
107
│ │ │ │ -
108#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWFUNCTION_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
auto makeAnalyticGridViewFunction(F &&f, const GridView &gridView)
Create an AnalyticGridViewFunction from a function and a grid view.
Definition analyticgridviewfunction.hh:238
│ │ │ │ +
108 template<template<class...> class T, class... Args1>
│ │ │ │ +
109 struct TransformTupleHelper<T, typename std::tuple<Args1...>>
│ │ │ │ +
110 {
│ │ │ │ +
111 using Type = std::tuple<T<Args1>...>;
│ │ │ │ +
112 };
│ │ │ │ +
113
│ │ │ │ +
114 template<template<class...> class T, class... Args1, class... Args2>
│ │ │ │ +
115 struct TransformTupleHelper<T, typename std::tuple<Args1...>, typename std::tuple<Args2...>>
│ │ │ │ +
116 {
│ │ │ │ +
117 using Type = std::tuple<T<Args1, Args2>...>;
│ │ │ │ +
118 };
│ │ │ │ +
119
│ │ │ │ +
120} // end namespace Imp
│ │ │ │ +
121
│ │ │ │ +
134template<template<class...> class F, class... Tuples>
│ │ │ │ +
135using TransformTuple = typename Imp::TransformTupleHelper<F, Tuples...>::Type;
│ │ │ │ +
136
│ │ │ │ +
137
│ │ │ │ +
138
│ │ │ │ +
139namespace Imp {
│ │ │ │ +
140
│ │ │ │ +
141 template<class F, class... T, std::size_t... k>
│ │ │ │ +
142 auto transformTupleHelper(F&& f, const std::tuple<T...>& tuple, std::index_sequence<k...>)
│ │ │ │ +
143 -> decltype(std::make_tuple(f(std::get<k>(tuple))...))
│ │ │ │ +
144 {
│ │ │ │ +
145 return std::make_tuple(f(std::get<k>(tuple))...);
│ │ │ │ +
146 }
│ │ │ │ +
147
│ │ │ │ +
148 template<class F, class... T1, class...T2, std::size_t... k>
│ │ │ │ +
149 auto transformTupleHelper(F&& f, const std::tuple<T1...>& tuple1, const std::tuple<T2...>& tuple2, std::index_sequence<k...>)
│ │ │ │ +
150 -> decltype(std::make_tuple(f(std::get<k>(tuple1), std::get<k>(tuple2))...))
│ │ │ │ +
151 {
│ │ │ │ +
152 return std::make_tuple(f(std::get<k>(tuple1), std::get<k>(tuple2))...);
│ │ │ │ +
153 }
│ │ │ │ +
154
│ │ │ │ +
155} // end namespace Imp
│ │ │ │ +
156
│ │ │ │ +
168template<class F, class... T>
│ │ │ │ +
│ │ │ │ +
169auto transformTuple(F&& f, const std::tuple<T...>& tuple)
│ │ │ │ +
170 -> decltype(Imp::transformTupleHelper(std::forward<F>(f), tuple, std::index_sequence_for<T...>{}))
│ │ │ │ +
171{
│ │ │ │ +
172 return Imp::transformTupleHelper(std::forward<F>(f), tuple, std::index_sequence_for<T...>{});
│ │ │ │ +
173}
│ │ │ │ +
│ │ │ │ +
174
│ │ │ │ +
188template<class F, class... T1, class... T2>
│ │ │ │ +
│ │ │ │ +
189auto transformTuple(F&& f, const std::tuple<T1...>& tuple1, const std::tuple<T2...>& tuple2)
│ │ │ │ +
190 -> decltype(Imp::transformTupleHelper(std::forward<F>(f), tuple1, tuple2, std::index_sequence_for<T1...>{}))
│ │ │ │ +
191{
│ │ │ │ +
192 return Imp::transformTupleHelper(std::forward<F>(f), tuple1, tuple2, std::index_sequence_for<T1...>{});
│ │ │ │ +
193}
│ │ │ │ +
│ │ │ │ +
194
│ │ │ │ +
195
│ │ │ │ +
196
│ │ │ │ +
197namespace Imp {
│ │ │ │ +
198
│ │ │ │ +
199 template<class IntegerSequence>
│ │ │ │ +
200 struct IntegerSequenceTupleHelper
│ │ │ │ +
201 {};
│ │ │ │ +
202
│ │ │ │ +
203 template<class I, I... k>
│ │ │ │ +
204 struct IntegerSequenceTupleHelper<std::integer_sequence<I, k...>>
│ │ │ │ +
205 {
│ │ │ │ +
206 using Type = std::tuple<std::integral_constant<I, k>...>;
│ │ │ │ +
207 };
│ │ │ │ +
208
│ │ │ │ +
209} // end namespace Imp
│ │ │ │ +
210
│ │ │ │ +
214template<class IntegerSequence>
│ │ │ │ +
215using IntegerSequenceTuple= typename Imp::IntegerSequenceTupleHelper<IntegerSequence>::Type;
│ │ │ │ +
216
│ │ │ │ +
217
│ │ │ │ +
218
│ │ │ │ +
224template<class... T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
226{
│ │ │ │ +
227 using type = std::tuple_element_t<sizeof...(T)-1, std::tuple<T...>>;
│ │ │ │ +
228};
│ │ │ │ +
│ │ │ │ +
229
│ │ │ │ +
230
│ │ │ │ +
231
│ │ │ │ +
232namespace Imp {
│ │ │ │ +
233
│ │ │ │ +
234template<class T, class I>
│ │ │ │ +
235struct RotateHelper;
│ │ │ │ +
236
│ │ │ │ +
237template<class... T, std::size_t... I>
│ │ │ │ +
238struct RotateHelper<std::tuple<T...>, std::index_sequence<I...> >
│ │ │ │ +
239{
│ │ │ │ +
240 using type = typename std::tuple<typename LastType<T...>::type, std::tuple_element_t<I,std::tuple<T...>>...>;
│ │ │ │ +
241};
│ │ │ │ +
242
│ │ │ │ +
243} // end namespace Imp
│ │ │ │ +
244
│ │ │ │ +
245
│ │ │ │ +
253template<class... T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
255{
│ │ │ │ +
256 using type = typename Imp::RotateHelper<std::tuple<T...>, std::make_index_sequence<sizeof...(T)-1>>::type;
│ │ │ │ +
257};
│ │ │ │ +
│ │ │ │ +
258
│ │ │ │ +
259
│ │ │ │ +
260
│ │ │ │ +
282template<class Expression>
│ │ │ │ +
│ │ │ │ +
283auto callableCheck(Expression f)
│ │ │ │ +
284{
│ │ │ │ +
285 return [f](auto&&... args){
│ │ │ │ +
286 return Functions::Concept::isCallable(f, std::forward<decltype(args)>(args)...);
│ │ │ │ +
287 };
│ │ │ │ +
288}
│ │ │ │ +
│ │ │ │ +
289
│ │ │ │ +
290
│ │ │ │ +
291
│ │ │ │ +
307template<class Check>
│ │ │ │ +
│ │ │ │ +
308auto negatePredicate(Check check)
│ │ │ │ +
309{
│ │ │ │ +
310 return [check](auto&&... args){
│ │ │ │ +
311 auto negate = overload(
│ │ │ │ +
312 [](std::true_type) { return std::false_type{};},
│ │ │ │ +
313 [](std::false_type) { return std::true_type{};},
│ │ │ │ +
314 [](bool v) { return not v;});
│ │ │ │ +
315 return negate(check(std::forward<decltype(args)>(args)...));
│ │ │ │ +
316 };
│ │ │ │ +
317}
│ │ │ │ +
│ │ │ │ +
318
│ │ │ │ +
319
│ │ │ │ +
320namespace Impl {
│ │ │ │ +
321
│ │ │ │ +
322 // Wrapper to capture values in a lambda for perfect forwarding.
│ │ │ │ +
323 // This captures value types by value and reference types by reference.
│ │ │ │ +
324 template <typename T>
│ │ │ │ +
325 struct ForwardCaptureWrapper;
│ │ │ │ +
326
│ │ │ │ +
327 template <typename T>
│ │ │ │ +
328 struct ForwardCaptureWrapper
│ │ │ │ +
329 {
│ │ │ │ +
330 template <typename TT>
│ │ │ │ +
331 ForwardCaptureWrapper(TT&& t) : t_{std::forward<TT>(t)} {}
│ │ │ │ +
332
│ │ │ │ +
333 auto forward() const { return std::move(t_); }
│ │ │ │ +
334
│ │ │ │ +
335 T t_;
│ │ │ │ +
336 };
│ │ │ │ +
337
│ │ │ │ +
338 template <typename T>
│ │ │ │ +
339 struct ForwardCaptureWrapper<T&>
│ │ │ │ +
340 {
│ │ │ │ +
341 ForwardCaptureWrapper(T& t) : t_{t} {}
│ │ │ │ +
342
│ │ │ │ +
343 T& forward() const { return t_; };
│ │ │ │ +
344
│ │ │ │ +
345 T& t_;
│ │ │ │ +
346 };
│ │ │ │ +
347
│ │ │ │ +
348 template <typename T>
│ │ │ │ +
349 struct ForwardCaptureWrapper<const T&>
│ │ │ │ +
350 {
│ │ │ │ +
351 ForwardCaptureWrapper(const T& t) : t_{t} {}
│ │ │ │ +
352
│ │ │ │ +
353 const T& forward() const { return t_; };
│ │ │ │ +
354
│ │ │ │ +
355 const T& t_;
│ │ │ │ +
356 };
│ │ │ │ +
357
│ │ │ │ +
358} // end namespace Dune::Functions::Impl
│ │ │ │ +
359
│ │ │ │ +
360
│ │ │ │ +
361
│ │ │ │ +
375template <class T>
│ │ │ │ +
│ │ │ │ +
376auto forwardCapture(T&& t)
│ │ │ │ +
377{
│ │ │ │ +
378 return Impl::ForwardCaptureWrapper<T>(std::forward<T>(t));
│ │ │ │ +
379}
│ │ │ │ +
│ │ │ │ +
380
│ │ │ │ +
381
│ │ │ │ +
382
│ │ │ │ +
383} // namespace Dune::Functions
│ │ │ │ +
384} // namespace Dune
│ │ │ │ +
385
│ │ │ │ +
386
│ │ │ │ +
387#endif // DUNE_FUNCTIONS_COMMON_UTILITY_HH
│ │ │ │ + │ │ │ │ +
typename Imp::ExpandTupleHelper< T, ArgTuple >::Type ExpandTuple
Expand tuple arguments as template arguments.
Definition utility.hh:98
│ │ │ │ +
typename Imp::TransformTupleHelper< F, Tuples... >::Type TransformTuple
Transform tuple types argument using type-functor.
Definition utility.hh:135
│ │ │ │ +
static constexpr auto isCallable()
Check if f is callable with given argument list.
Definition functionconcepts.hh:51
│ │ │ │ +
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:169
│ │ │ │ +
auto callableCheck(Expression f)
Create a predicate for checking validity of expressions.
Definition utility.hh:283
│ │ │ │ +
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:64
│ │ │ │ +
auto negatePredicate(Check check)
Negate given predicate.
Definition utility.hh:308
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
std::decay_t< F > makeGridViewFunction(F &&f, const GridView &gridView)
Construct a function modeling GridViewFunction from function and grid view.
Definition gridviewfunction.hh:72
│ │ │ │ -
Definition gridfunction.hh:36
│ │ │ │ -
An entity set for all entities of given codim in a grid view.
Definition gridviewentityset.hh:27
│ │ │ │ -
Definition gridviewfunction.hh:26
│ │ │ │ - │ │ │ │ +
auto forwardCapture(T &&t)
Create a capture object for perfect forwarding.
Definition utility.hh:376
│ │ │ │ +
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:25
│ │ │ │ +
typename Imp::IntegerSequenceTupleHelper< IntegerSequence >::Type IntegerSequenceTuple
Transform integer_sequence<I,k...> to tuple<integral_constant<I,k>...>
Definition utility.hh:215
│ │ │ │ +
Get last entry of type list.
Definition utility.hh:226
│ │ │ │ +
std::tuple_element_t< sizeof...(T) -1, std::tuple< T... > > type
Definition utility.hh:227
│ │ │ │ +
Rotate type list by one, such that last entry is moved to first position.
Definition utility.hh:255
│ │ │ │ +
typename Imp::RotateHelper< std::tuple< T... >, std::make_index_sequence< sizeof...(T) -1 > >::type type
Definition utility.hh:256
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,109 +1,353 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ -gridviewfunction.hh │ │ │ │ │ + * _c_o_m_m_o_n │ │ │ │ │ +utility.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWFUNCTION_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWFUNCTION_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_COMMON_UTILITY_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_COMMON_UTILITY_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11 │ │ │ │ │ -12#include │ │ │ │ │ +10 │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ 13 │ │ │ │ │ -14#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ -15#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h> │ │ │ │ │ -16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_a_n_a_l_y_t_i_c_g_r_i_d_v_i_e_w_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ -17 │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16 │ │ │ │ │ +17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ 18 │ │ │ │ │ 19namespace _D_u_n_e { │ │ │ │ │ 20namespace Functions { │ │ │ │ │ 21 │ │ │ │ │ 22 │ │ │ │ │ 23 │ │ │ │ │ -24template class │ │ │ │ │ -DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56> │ │ │ │ │ -_2_5class _G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ -26{}; │ │ │ │ │ -27 │ │ │ │ │ -28 │ │ │ │ │ -29 │ │ │ │ │ -44template class │ │ │ │ │ -DerivativeTraits, size_t bufferSize> │ │ │ │ │ -_4_5class _G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n : │ │ │ │ │ -46 public _G_r_i_d_F_u_n_c_t_i_o_n, │ │ │ │ │ -DerivativeTraits, bufferSize> │ │ │ │ │ -47{ │ │ │ │ │ -48 using _B_a_s_e = _G_r_i_d_F_u_n_c_t_i_o_n, │ │ │ │ │ -DerivativeTraits, bufferSize>; │ │ │ │ │ -49public: │ │ │ │ │ -_5_0 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ -51 │ │ │ │ │ -52 using Base::Base; │ │ │ │ │ -53}; │ │ │ │ │ -54 │ │ │ │ │ -55 │ │ │ │ │ -56 │ │ │ │ │ -68template() , int> = 0> │ │ │ │ │ -71std::decay_t │ │ │ │ │ -_7_2 _m_a_k_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n(F&& f, const GridView& gridView) │ │ │ │ │ -73{ │ │ │ │ │ -74 return std::forward(f); │ │ │ │ │ -75} │ │ │ │ │ -76 │ │ │ │ │ +24template │ │ │ │ │ +_2_5auto _f_o_r_w_a_r_d_A_s_S_t_a_t_i_c_I_n_t_e_g_e_r(std::integer_sequence │ │ │ │ │ +values, const size_type& i, F&& f, Args&&... args) │ │ │ │ │ +26 ->decltype(f(std::integral_constant(), std:: │ │ │ │ │ +forward(args)...)) │ │ │ │ │ +27{ │ │ │ │ │ +28 return f(std::integral_constant(), std::forward │ │ │ │ │ +(args)...); │ │ │ │ │ +29} │ │ │ │ │ +30 │ │ │ │ │ +31template │ │ │ │ │ +_3_2auto _f_o_r_w_a_r_d_A_s_S_t_a_t_i_c_I_n_t_e_g_e_r(std::integer_sequence values, const size_type i, F&& f, Args&&... args) │ │ │ │ │ +33 ->decltype(f(std::integral_constant(), std:: │ │ │ │ │ +forward(args)...)) │ │ │ │ │ +34{ │ │ │ │ │ +35 if (i==firstValue) │ │ │ │ │ +36 return f(std::integral_constant(), std::forward │ │ │ │ │ +(args)...); │ │ │ │ │ +37 return _f_o_r_w_a_r_d_A_s_S_t_a_t_i_c_I_n_t_e_g_e_r(std::integer_sequence(), i, std::forward(f), std::forward(args)...); │ │ │ │ │ +38} │ │ │ │ │ +39 │ │ │ │ │ +40 │ │ │ │ │ +41 │ │ │ │ │ +63template │ │ │ │ │ +_6_4auto _f_o_r_w_a_r_d_A_s_S_t_a_t_i_c_I_n_d_e_x(const size_type& i, F&& f, Args&&... args) │ │ │ │ │ +65 ->decltype(f(Dune::Indices::_0, std::forward(args)...)) │ │ │ │ │ +66{ │ │ │ │ │ +67 return _f_o_r_w_a_r_d_A_s_S_t_a_t_i_c_I_n_t_e_g_e_r(std::make_index_sequence{}, i, std:: │ │ │ │ │ +forward(f), std::forward(args)...); │ │ │ │ │ +68} │ │ │ │ │ +69 │ │ │ │ │ +70 │ │ │ │ │ +71 │ │ │ │ │ +72namespace Imp { │ │ │ │ │ +73 │ │ │ │ │ +74 template class T, class List> │ │ │ │ │ +75 struct ExpandTupleHelper │ │ │ │ │ +76 {}; │ │ │ │ │ 77 │ │ │ │ │ -78 │ │ │ │ │ -94template()) , int> = 0> │ │ │ │ │ -_9_7auto _m_a_k_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n(F&& f, const GridView& gridView) │ │ │ │ │ -98 -> decltype(_m_a_k_e_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n(std::forward(f), gridView)) │ │ │ │ │ -99{ │ │ │ │ │ -100 return _m_a_k_e_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n(std::forward(f), gridView); │ │ │ │ │ -101} │ │ │ │ │ -102 │ │ │ │ │ +78 template class T, template class ListType, │ │ │ │ │ +class... Args> │ │ │ │ │ +79 struct ExpandTupleHelper> │ │ │ │ │ +80 { │ │ │ │ │ +81 using Type = T; │ │ │ │ │ +82 }; │ │ │ │ │ +83 │ │ │ │ │ +84} // end namespace Imp │ │ │ │ │ +85 │ │ │ │ │ +97template class T, class ArgTuple> │ │ │ │ │ +_9_8using _E_x_p_a_n_d_T_u_p_l_e = typename Imp::ExpandTupleHelper::Type; │ │ │ │ │ +99 │ │ │ │ │ +100 │ │ │ │ │ +101 │ │ │ │ │ +102namespace Imp { │ │ │ │ │ 103 │ │ │ │ │ -104 │ │ │ │ │ -105} // end of namespace Dune::Functions │ │ │ │ │ -106} // end of namespace Dune │ │ │ │ │ +104 template class T, class... Tuple> │ │ │ │ │ +105 struct TransformTupleHelper │ │ │ │ │ +106 {}; │ │ │ │ │ 107 │ │ │ │ │ -108#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWFUNCTION_HH │ │ │ │ │ -_a_n_a_l_y_t_i_c_g_r_i_d_v_i_e_w_f_u_n_c_t_i_o_n_._h_h │ │ │ │ │ -_g_r_i_d_f_u_n_c_t_i_o_n_._h_h │ │ │ │ │ -_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ -auto makeAnalyticGridViewFunction(F &&f, const GridView &gridView) │ │ │ │ │ -Create an AnalyticGridViewFunction from a function and a grid view. │ │ │ │ │ -DDeeffiinniittiioonn analyticgridviewfunction.hh:238 │ │ │ │ │ +108 template class T, class... Args1> │ │ │ │ │ +109 struct TransformTupleHelper> │ │ │ │ │ +110 { │ │ │ │ │ +111 using Type = std::tuple...>; │ │ │ │ │ +112 }; │ │ │ │ │ +113 │ │ │ │ │ +114 template class T, class... Args1, class... Args2> │ │ │ │ │ +115 struct TransformTupleHelper, typename │ │ │ │ │ +std::tuple> │ │ │ │ │ +116 { │ │ │ │ │ +117 using Type = std::tuple...>; │ │ │ │ │ +118 }; │ │ │ │ │ +119 │ │ │ │ │ +120} // end namespace Imp │ │ │ │ │ +121 │ │ │ │ │ +134template class F, class... Tuples> │ │ │ │ │ +_1_3_5using _T_r_a_n_s_f_o_r_m_T_u_p_l_e = typename Imp::TransformTupleHelper:: │ │ │ │ │ +Type; │ │ │ │ │ +136 │ │ │ │ │ +137 │ │ │ │ │ +138 │ │ │ │ │ +139namespace Imp { │ │ │ │ │ +140 │ │ │ │ │ +141 template │ │ │ │ │ +142 auto transformTupleHelper(F&& f, const std::tuple& tuple, std:: │ │ │ │ │ +index_sequence) │ │ │ │ │ +143 -> decltype(std::make_tuple(f(std::get(tuple))...)) │ │ │ │ │ +144 { │ │ │ │ │ +145 return std::make_tuple(f(std::get(tuple))...); │ │ │ │ │ +146 } │ │ │ │ │ +147 │ │ │ │ │ +148 template │ │ │ │ │ +149 auto transformTupleHelper(F&& f, const std::tuple& tuple1, const │ │ │ │ │ +std::tuple& tuple2, std::index_sequence) │ │ │ │ │ +150 -> decltype(std::make_tuple(f(std::get(tuple1), std::get │ │ │ │ │ +(tuple2))...)) │ │ │ │ │ +151 { │ │ │ │ │ +152 return std::make_tuple(f(std::get(tuple1), std::get(tuple2))...); │ │ │ │ │ +153 } │ │ │ │ │ +154 │ │ │ │ │ +155} // end namespace Imp │ │ │ │ │ +156 │ │ │ │ │ +168template │ │ │ │ │ +_1_6_9auto _t_r_a_n_s_f_o_r_m_T_u_p_l_e(F&& f, const std::tuple& tuple) │ │ │ │ │ +170 -> decltype(Imp::transformTupleHelper(std::forward(f), tuple, std:: │ │ │ │ │ +index_sequence_for{})) │ │ │ │ │ +171{ │ │ │ │ │ +172 return Imp::transformTupleHelper(std::forward(f), tuple, std:: │ │ │ │ │ +index_sequence_for{}); │ │ │ │ │ +173} │ │ │ │ │ +174 │ │ │ │ │ +188template │ │ │ │ │ +_1_8_9auto _t_r_a_n_s_f_o_r_m_T_u_p_l_e(F&& f, const std::tuple& tuple1, const std:: │ │ │ │ │ +tuple& tuple2) │ │ │ │ │ +190 -> decltype(Imp::transformTupleHelper(std::forward(f), tuple1, tuple2, │ │ │ │ │ +std::index_sequence_for{})) │ │ │ │ │ +191{ │ │ │ │ │ +192 return Imp::transformTupleHelper(std::forward(f), tuple1, tuple2, std:: │ │ │ │ │ +index_sequence_for{}); │ │ │ │ │ +193} │ │ │ │ │ +194 │ │ │ │ │ +195 │ │ │ │ │ +196 │ │ │ │ │ +197namespace Imp { │ │ │ │ │ +198 │ │ │ │ │ +199 template │ │ │ │ │ +200 struct IntegerSequenceTupleHelper │ │ │ │ │ +201 {}; │ │ │ │ │ +202 │ │ │ │ │ +203 template │ │ │ │ │ +204 struct IntegerSequenceTupleHelper> │ │ │ │ │ +205 { │ │ │ │ │ +206 using Type = std::tuple...>; │ │ │ │ │ +207 }; │ │ │ │ │ +208 │ │ │ │ │ +209} // end namespace Imp │ │ │ │ │ +210 │ │ │ │ │ +214template │ │ │ │ │ +_2_1_5using _I_n_t_e_g_e_r_S_e_q_u_e_n_c_e_T_u_p_l_e= typename Imp:: │ │ │ │ │ +IntegerSequenceTupleHelper::Type; │ │ │ │ │ +216 │ │ │ │ │ +217 │ │ │ │ │ +218 │ │ │ │ │ +224template │ │ │ │ │ +_2_2_5struct _L_a_s_t_T_y_p_e │ │ │ │ │ +226{ │ │ │ │ │ +_2_2_7 using _t_y_p_e = std::tuple_element_t>; │ │ │ │ │ +228}; │ │ │ │ │ +229 │ │ │ │ │ +230 │ │ │ │ │ +231 │ │ │ │ │ +232namespace Imp { │ │ │ │ │ +233 │ │ │ │ │ +234template │ │ │ │ │ +235struct RotateHelper; │ │ │ │ │ +236 │ │ │ │ │ +237template │ │ │ │ │ +238struct RotateHelper, std::index_sequence > │ │ │ │ │ +239{ │ │ │ │ │ +240 using type = typename std::tuple::type, std:: │ │ │ │ │ +tuple_element_t>...>; │ │ │ │ │ +241}; │ │ │ │ │ +242 │ │ │ │ │ +243} // end namespace Imp │ │ │ │ │ +244 │ │ │ │ │ +245 │ │ │ │ │ +253template │ │ │ │ │ +_2_5_4struct _R_o_t_a_t_e_T_u_p_l_e │ │ │ │ │ +255{ │ │ │ │ │ +_2_5_6 using _t_y_p_e = typename Imp::RotateHelper, std:: │ │ │ │ │ +make_index_sequence>_:_:_t_y_p_e; │ │ │ │ │ +257}; │ │ │ │ │ +258 │ │ │ │ │ +259 │ │ │ │ │ +260 │ │ │ │ │ +282template │ │ │ │ │ +_2_8_3auto _c_a_l_l_a_b_l_e_C_h_e_c_k(Expression f) │ │ │ │ │ +284{ │ │ │ │ │ +285 return [f](auto&&... args){ │ │ │ │ │ +286 return _F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_C_a_l_l_a_b_l_e(f, std::forward │ │ │ │ │ +(args)...); │ │ │ │ │ +287 }; │ │ │ │ │ +288} │ │ │ │ │ +289 │ │ │ │ │ +290 │ │ │ │ │ +291 │ │ │ │ │ +307template │ │ │ │ │ +_3_0_8auto _n_e_g_a_t_e_P_r_e_d_i_c_a_t_e(Check check) │ │ │ │ │ +309{ │ │ │ │ │ +310 return [check](auto&&... args){ │ │ │ │ │ +311 auto negate = overload( │ │ │ │ │ +312 [](std::true_type) { return std::false_type{};}, │ │ │ │ │ +313 [](std::false_type) { return std::true_type{};}, │ │ │ │ │ +314 [](bool v) { return not v;}); │ │ │ │ │ +315 return negate(check(std::forward(args)...)); │ │ │ │ │ +316 }; │ │ │ │ │ +317} │ │ │ │ │ +318 │ │ │ │ │ +319 │ │ │ │ │ +320namespace Impl { │ │ │ │ │ +321 │ │ │ │ │ +322 // Wrapper to capture values in a lambda for perfect forwarding. │ │ │ │ │ +323 // This captures value types by value and reference types by reference. │ │ │ │ │ +324 template │ │ │ │ │ +325 struct ForwardCaptureWrapper; │ │ │ │ │ +326 │ │ │ │ │ +327 template │ │ │ │ │ +328 struct ForwardCaptureWrapper │ │ │ │ │ +329 { │ │ │ │ │ +330 template │ │ │ │ │ +331 ForwardCaptureWrapper(TT&& t) : t_{std::forward(t)} {} │ │ │ │ │ +332 │ │ │ │ │ +333 auto forward() const { return std::move(t_); } │ │ │ │ │ +334 │ │ │ │ │ +335 T t_; │ │ │ │ │ +336 }; │ │ │ │ │ +337 │ │ │ │ │ +338 template │ │ │ │ │ +339 struct ForwardCaptureWrapper │ │ │ │ │ +340 { │ │ │ │ │ +341 ForwardCaptureWrapper(T& t) : t_{t} {} │ │ │ │ │ +342 │ │ │ │ │ +343 T& forward() const { return t_; }; │ │ │ │ │ +344 │ │ │ │ │ +345 T& t_; │ │ │ │ │ +346 }; │ │ │ │ │ +347 │ │ │ │ │ +348 template │ │ │ │ │ +349 struct ForwardCaptureWrapper │ │ │ │ │ +350 { │ │ │ │ │ +351 ForwardCaptureWrapper(const T& t) : t_{t} {} │ │ │ │ │ +352 │ │ │ │ │ +353 const T& forward() const { return t_; }; │ │ │ │ │ +354 │ │ │ │ │ +355 const T& t_; │ │ │ │ │ +356 }; │ │ │ │ │ +357 │ │ │ │ │ +358} // end namespace Dune::Functions::Impl │ │ │ │ │ +359 │ │ │ │ │ +360 │ │ │ │ │ +361 │ │ │ │ │ +375template │ │ │ │ │ +_3_7_6auto _f_o_r_w_a_r_d_C_a_p_t_u_r_e(T&& t) │ │ │ │ │ +377{ │ │ │ │ │ +378 return Impl::ForwardCaptureWrapper(std::forward(t)); │ │ │ │ │ +379} │ │ │ │ │ +380 │ │ │ │ │ +381 │ │ │ │ │ +382 │ │ │ │ │ +383} // namespace Dune::Functions │ │ │ │ │ +384} // namespace Dune │ │ │ │ │ +385 │ │ │ │ │ +386 │ │ │ │ │ +387#endif // DUNE_FUNCTIONS_COMMON_UTILITY_HH │ │ │ │ │ +_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_a_n_d_T_u_p_l_e │ │ │ │ │ +typename Imp::ExpandTupleHelper< T, ArgTuple >::Type ExpandTuple │ │ │ │ │ +Expand tuple arguments as template arguments. │ │ │ │ │ +DDeeffiinniittiioonn utility.hh:98 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_r_a_n_s_f_o_r_m_T_u_p_l_e │ │ │ │ │ +typename Imp::TransformTupleHelper< F, Tuples... >::Type TransformTuple │ │ │ │ │ +Transform tuple types argument using type-functor. │ │ │ │ │ +DDeeffiinniittiioonn utility.hh:135 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_C_a_l_l_a_b_l_e │ │ │ │ │ +static constexpr auto isCallable() │ │ │ │ │ +Check if f is callable with given argument list. │ │ │ │ │ +DDeeffiinniittiioonn functionconcepts.hh:51 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_t_r_a_n_s_f_o_r_m_T_u_p_l_e │ │ │ │ │ +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. │ │ │ │ │ +DDeeffiinniittiioonn utility.hh:169 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_a_l_l_a_b_l_e_C_h_e_c_k │ │ │ │ │ +auto callableCheck(Expression f) │ │ │ │ │ +Create a predicate for checking validity of expressions. │ │ │ │ │ +DDeeffiinniittiioonn utility.hh:283 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_o_r_w_a_r_d_A_s_S_t_a_t_i_c_I_n_d_e_x │ │ │ │ │ +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. │ │ │ │ │ +DDeeffiinniittiioonn utility.hh:64 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_n_e_g_a_t_e_P_r_e_d_i_c_a_t_e │ │ │ │ │ +auto negatePredicate(Check check) │ │ │ │ │ +Negate given predicate. │ │ │ │ │ +DDeeffiinniittiioonn utility.hh:308 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ -std::decay_t< F > makeGridViewFunction(F &&f, const GridView &gridView) │ │ │ │ │ -Construct a function modeling GridViewFunction from function and grid view. │ │ │ │ │ -DDeeffiinniittiioonn gridviewfunction.hh:72 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn gridfunction.hh:36 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t │ │ │ │ │ -An entity set for all entities of given codim in a grid view. │ │ │ │ │ -DDeeffiinniittiioonn gridviewentityset.hh:27 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn gridviewfunction.hh:26 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ -_b_u_f_f_e_r_S_i_z_e_ _>_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ -GV GridView │ │ │ │ │ -DDeeffiinniittiioonn gridviewfunction.hh:50 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_o_r_w_a_r_d_C_a_p_t_u_r_e │ │ │ │ │ +auto forwardCapture(T &&t) │ │ │ │ │ +Create a capture object for perfect forwarding. │ │ │ │ │ +DDeeffiinniittiioonn utility.hh:376 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_o_r_w_a_r_d_A_s_S_t_a_t_i_c_I_n_t_e_g_e_r │ │ │ │ │ +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)...)) │ │ │ │ │ +DDeeffiinniittiioonn utility.hh:25 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_n_t_e_g_e_r_S_e_q_u_e_n_c_e_T_u_p_l_e │ │ │ │ │ +typename Imp::IntegerSequenceTupleHelper< IntegerSequence >::Type │ │ │ │ │ +IntegerSequenceTuple │ │ │ │ │ +Transform integer_sequence to tuple...> │ │ │ │ │ +DDeeffiinniittiioonn utility.hh:215 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_s_t_T_y_p_e │ │ │ │ │ +Get last entry of type list. │ │ │ │ │ +DDeeffiinniittiioonn utility.hh:226 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_s_t_T_y_p_e_:_:_t_y_p_e │ │ │ │ │ +std::tuple_element_t< sizeof...(T) -1, std::tuple< T... > > type │ │ │ │ │ +DDeeffiinniittiioonn utility.hh:227 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_o_t_a_t_e_T_u_p_l_e │ │ │ │ │ +Rotate type list by one, such that last entry is moved to first position. │ │ │ │ │ +DDeeffiinniittiioonn utility.hh:255 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_o_t_a_t_e_T_u_p_l_e_:_:_t_y_p_e │ │ │ │ │ +typename Imp::RotateHelper< std::tuple< T... >, std::make_index_sequence< │ │ │ │ │ +sizeof...(T) -1 > >::type type │ │ │ │ │ +DDeeffiinniittiioonn utility.hh:256 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00041.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: indexaccess.hh File Reference │ │ │ │ +dune-functions: differentiablefunctionfromcallables.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,61 +70,50 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
indexaccess.hh File Reference
│ │ │ │ +
differentiablefunctionfromcallables.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <utility>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/common/concept.hh>
│ │ │ │ +
#include <dune/common/typeutilities.hh>
│ │ │ │ #include <dune/common/hybridutilities.hh>
│ │ │ │ -#include <dune/functions/common/utility.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 C , class I , class F , std::enable_if_t< Dune::models< Imp::Concept::HasDynamicIndexAccess< I >, C >(), int > = 0>
auto Dune::Functions::hybridIndexAccess (C &&c, const I &i, F &&f) -> decltype(f(c[i]))
 Provide operator[] index-access for containers.
 
template<class C , class I , class F , std::enable_if_t< not Dune::models< Imp::Concept::HasDynamicIndexAccess< I >, C >(), int > = 0>
decltype(auto) Dune::Functions::hybridIndexAccess (C &&c, const I &i, F &&f)
 Provide operator[] index-access for containers.
 
template<class Result , class C , class MultiIndex >
Result Dune::Functions::hybridMultiIndexAccess (C &&c, const MultiIndex &index)
 Provide multi-index access by chaining operator[].
 
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[].
 
template<class C , class MultiIndex >
constexpr decltype(auto) Dune::Functions::resolveDynamicMultiIndex (C &&c, const MultiIndex &multiIndex)
 Provide multi-index access by chaining operator[].
 
template<class C , class MultiIndex >
constexpr decltype(auto) Dune::Functions::resolveStaticMultiIndex (C &&c, const MultiIndex &multiIndex)
 Provide multi-index access by chaining operator[].
 
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.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,56 +1,46 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -indexaccess.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +differentiablefunctionfromcallables.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_u_t_i_l_i_t_y_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_s_i_g_n_a_t_u_r_e_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ + _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _F_ _> │ │ │ │ │ + Wrap a list of callable objects as derivative sequence modelling │ │ │ │ │ +  _C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_> │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ + _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _F_,_ _D_F_,_ _D_e_r_i_v_a_t_i_v_e_s_._._._ _> │ │ │ │ │ + Wrap a list of callable objects as derivative sequence modelling │ │ │ │ │ +  _C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_> │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template, C >(), int > = 0> │ │ │ │ │ - auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_h_y_b_r_i_d_I_n_d_e_x_A_c_c_e_s_s (C &&c, const I │ │ │ │ │ - &i, F &&f) -> decltype(f(c[i])) │ │ │ │ │ -  Provide operator[] index-access for containers. │ │ │ │ │ -  │ │ │ │ │ -template, C >(), int > = 0> │ │ │ │ │ - decltype(auto)  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_h_y_b_r_i_d_I_n_d_e_x_A_c_c_e_s_s (C &&c, const I │ │ │ │ │ - &i, F &&f) │ │ │ │ │ -  Provide operator[] index-access for containers. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - Result  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_h_y_b_r_i_d_M_u_l_t_i_I_n_d_e_x_A_c_c_e_s_s (C &&c, const │ │ │ │ │ - MultiIndex &index) │ │ │ │ │ -  Provide multi-index access by chaining operator[]. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -constexpr decltype(auto)  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_r_e_s_o_l_v_e_D_y_n_a_m_i_c_M_u_l_t_i_I_n_d_e_x (C &&c, │ │ │ │ │ - const MultiIndex &multiIndex, const IsFinal &isFinal) │ │ │ │ │ -  Provide multi-index access by chaining operator[]. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -constexpr decltype(auto)  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_r_e_s_o_l_v_e_D_y_n_a_m_i_c_M_u_l_t_i_I_n_d_e_x (C &&c, │ │ │ │ │ - const MultiIndex &multiIndex) │ │ │ │ │ -  Provide multi-index access by chaining operator[]. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -constexpr decltype(auto)  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_r_e_s_o_l_v_e_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x (C &&c, │ │ │ │ │ - const MultiIndex &multiIndex) │ │ │ │ │ -  Provide multi-index access by chaining operator[]. │ │ │ │ │ +template class DerivativeTraits, class... │ │ │ │ │ +F> │ │ │ │ │ +_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s< _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_: │ │ │ │ │ +Signature, DerivativeTraits, F... >  _m_a_k_e_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s │ │ │ │ │ + (const _S_i_g_n_a_t_u_r_e_T_a_g< Signature, │ │ │ │ │ + DerivativeTraits > &signatureTag, F &&... │ │ │ │ │ + f) │ │ │ │ │ +  Create a _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n from │ │ │ │ │ + callables. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00041_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: indexaccess.hh Source File │ │ │ │ +dune-functions: differentiablefunctionfromcallables.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,339 +74,163 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
indexaccess.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_COMMON_INDEX_ACCESS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_COMMON_INDEX_ACCESS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_COMMON_DIFFEREENTIONABEFUNCTIONFROMCALLABLES_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_COMMON_DIFFEREENTIONABEFUNCTIONFROMCALLABLES_HH
│ │ │ │
9
│ │ │ │
10
│ │ │ │ -
11#include <utility>
│ │ │ │ -
12#include <type_traits>
│ │ │ │ +
11#include <dune/common/typeutilities.hh>
│ │ │ │ +
12#include <dune/common/hybridutilities.hh>
│ │ │ │
13
│ │ │ │ -
14#include <dune/common/typetraits.hh>
│ │ │ │ -
15#include <dune/common/concept.hh>
│ │ │ │ -
16#include <dune/common/hybridutilities.hh>
│ │ │ │ -
17
│ │ │ │ - │ │ │ │ + │ │ │ │ +
15
│ │ │ │ + │ │ │ │ + │ │ │ │ +
18
│ │ │ │
19
│ │ │ │
20
│ │ │ │ -
21
│ │ │ │ -
22namespace Dune {
│ │ │ │ -
23namespace Functions {
│ │ │ │ +
21namespace Dune {
│ │ │ │ +
22namespace Functions {
│ │ │ │ +
23
│ │ │ │
24
│ │ │ │
25
│ │ │ │ -
26namespace Imp {
│ │ │ │ -
27
│ │ │ │ -
28namespace Concept {
│ │ │ │ +
26template<class Signature, template<class> class DerivativeTraits, class... Callables>
│ │ │ │ + │ │ │ │ +
28
│ │ │ │
29
│ │ │ │ -
30template<class size_type>
│ │ │ │ -
31struct HasDynamicIndexAccess
│ │ │ │ -
32{
│ │ │ │ -
33 template<class C>
│ │ │ │ -
34 auto require(C&& c) -> decltype(
│ │ │ │ -
35 c[std::declval<size_type>()]
│ │ │ │ -
36 );
│ │ │ │ -
37};
│ │ │ │ -
38
│ │ │ │ -
39struct HasStaticIndexAccess
│ │ │ │ -
40{
│ │ │ │ -
41 template<class C>
│ │ │ │ -
42 auto require(C&& c) -> decltype(
│ │ │ │ -
43 c[Dune::Indices::_0]
│ │ │ │ -
44 );
│ │ │ │ -
45};
│ │ │ │ -
46
│ │ │ │ -
47} // namespace Concept
│ │ │ │ -
48
│ │ │ │ -
49} // namespace Imp
│ │ │ │ -
50
│ │ │ │ +
30
│ │ │ │ +
47template<class Range, class Domain, template<class> class DerivativeTraits, class F>
│ │ │ │ +
│ │ │ │ +
48class DifferentiableFunctionFromCallables<Range(Domain), DerivativeTraits, F>
│ │ │ │ +
49{
│ │ │ │ +
50public:
│ │ │ │
51
│ │ │ │ -
52
│ │ │ │ -
65template<class C, class I, class F,
│ │ │ │ -
66 std::enable_if_t< Dune::models<Imp::Concept::HasDynamicIndexAccess<I>, C>(), int> = 0>
│ │ │ │ -
│ │ │ │ -
67auto hybridIndexAccess(C&& c, const I& i, F&& f)
│ │ │ │ -
68 -> decltype(f(c[i]))
│ │ │ │ -
69{
│ │ │ │ -
70 return f(c[i]);
│ │ │ │ -
71}
│ │ │ │ -
│ │ │ │ -
72
│ │ │ │ -
90template<class C, class I, class F,
│ │ │ │ -
91 std::enable_if_t< not Dune::models<Imp::Concept::HasDynamicIndexAccess<I>, C>(), int> = 0>
│ │ │ │ -
│ │ │ │ -
92decltype(auto) hybridIndexAccess(C&& c, const I& i, F&& f)
│ │ │ │ -
93{
│ │ │ │ -
94 using Size = decltype(Hybrid::size(c));
│ │ │ │ -
95 return Hybrid::switchCases(std::make_index_sequence<Size::value>(), i,
│ │ │ │ -
96 [&](const auto& ii) -> decltype(auto){
│ │ │ │ -
97 return f(c[ii]);
│ │ │ │ -
98 }, [&]() -> decltype(auto){
│ │ │ │ -
99 return f(c[Dune::Indices::_0]);
│ │ │ │ -
100 });
│ │ │ │ -
101}
│ │ │ │ -
│ │ │ │ -
102
│ │ │ │ -
103
│ │ │ │ -
104namespace Imp {
│ │ │ │ -
105
│ │ │ │ -
119 template<class Index, std::size_t offset=1>
│ │ │ │ -
120 class ShiftedDynamicMultiIndex
│ │ │ │ -
121 {
│ │ │ │ -
122 public:
│ │ │ │ -
123 ShiftedDynamicMultiIndex(const Index& index) :
│ │ │ │ -
124 index_(index)
│ │ │ │ -
125 {}
│ │ │ │ -
126
│ │ │ │ -
127 std::size_t operator[](std::size_t position) const
│ │ │ │ -
128 {
│ │ │ │ -
129 if (position<size())
│ │ │ │ -
130 return index_[position+offset];
│ │ │ │ -
131 else
│ │ │ │ -
132 return 0;
│ │ │ │ -
133 }
│ │ │ │ -
134
│ │ │ │ -
138 ShiftedDynamicMultiIndex<Index, offset+1> pop() const
│ │ │ │ -
139 {
│ │ │ │ -
140 return {index_};
│ │ │ │ -
141 }
│ │ │ │ -
142
│ │ │ │ -
143 std::size_t size() const
│ │ │ │ -
144 {
│ │ │ │ -
145 if (offset < index_.size())
│ │ │ │ -
146 return index_.size() - offset;
│ │ │ │ -
147 else
│ │ │ │ -
148 return 0;
│ │ │ │ -
149 }
│ │ │ │ +
53 using Signature = Range(Domain);
│ │ │ │ +
54
│ │ │ │ + │ │ │ │ +
56
│ │ │ │ +
58 using DerivativeSignature = typename DerivativeTraits<RawSignature>::Range(Domain);
│ │ │ │ +
59
│ │ │ │ + │ │ │ │ +
62
│ │ │ │ +
64 template<class FF, disableCopyMove<DifferentiableFunctionFromCallables, FF> = 0>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
66 f_(std::forward<FF>(f))
│ │ │ │ +
67 {}
│ │ │ │ +
│ │ │ │ +
68
│ │ │ │ +
│ │ │ │ +
70 Range operator() (const Domain& x) const
│ │ │ │ +
71 {
│ │ │ │ +
72 return f_(x);
│ │ │ │ +
73 }
│ │ │ │ +
│ │ │ │ +
74
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
81 {
│ │ │ │ +
82 DUNE_THROW(Dune::NotImplemented, "Derivative not implemented");
│ │ │ │ +
83 }
│ │ │ │ +
│ │ │ │ +
84
│ │ │ │ +
85private:
│ │ │ │ +
86 F f_;
│ │ │ │ +
87};
│ │ │ │ +
│ │ │ │ +
88
│ │ │ │ +
89
│ │ │ │ +
90
│ │ │ │ +
107template<class Range, class Domain, template<class> class DerivativeTraits, class F, class DF, class... Derivatives>
│ │ │ │ +
│ │ │ │ +
108class DifferentiableFunctionFromCallables<Range(Domain), DerivativeTraits, F, DF, Derivatives...>
│ │ │ │ +
109{
│ │ │ │ +
110public:
│ │ │ │ +
111
│ │ │ │ +
112 using Signature = Range(Domain);
│ │ │ │ + │ │ │ │ +
114 using DerivativeSignature = typename DerivativeTraits<RawSignature>::Range(Domain);
│ │ │ │ +
115
│ │ │ │ +
116 using Derivative = DifferentiableFunctionFromCallables<DerivativeSignature, DerivativeTraits, DF, Derivatives...>;
│ │ │ │ +
117
│ │ │ │ +
124 template<class FF, class DFF, class... DDFF>
│ │ │ │ +
│ │ │ │ +
125 DifferentiableFunctionFromCallables(FF&& f, DFF&& df, DDFF&&... ddf) :
│ │ │ │ +
126 f_(std::forward<FF>(f)),
│ │ │ │ +
127 df_(std::forward<DFF>(df), std::forward<DDFF>(ddf)...)
│ │ │ │ +
128 {}
│ │ │ │ +
│ │ │ │ +
129
│ │ │ │ +
│ │ │ │ +
131 Range operator() (const Domain& x) const
│ │ │ │ +
132 {
│ │ │ │ +
133 return f_(x);
│ │ │ │ +
134 }
│ │ │ │ +
│ │ │ │ +
135
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
142 {
│ │ │ │ +
143 return t.df_;
│ │ │ │ +
144 }
│ │ │ │ +
│ │ │ │ +
145
│ │ │ │ +
146private:
│ │ │ │ +
147 F f_;
│ │ │ │ +
148 Derivative df_;
│ │ │ │ +
149};
│ │ │ │ +
│ │ │ │
150
│ │ │ │ -
151 const Index& originalIndex() const
│ │ │ │ -
152 {
│ │ │ │ -
153 return index_;
│ │ │ │ -
154 }
│ │ │ │ -
155
│ │ │ │ -
156 private:
│ │ │ │ -
157 const Index& index_;
│ │ │ │ -
158 };
│ │ │ │ -
159
│ │ │ │ -
160 template<class Index, std::size_t offset=1>
│ │ │ │ -
161 class ShiftedStaticMultiIndex
│ │ │ │ -
162 {
│ │ │ │ -
163 public:
│ │ │ │ -
164 ShiftedStaticMultiIndex(const Index& index) :
│ │ │ │ -
165 index_(index)
│ │ │ │ -
166 {}
│ │ │ │ -
167
│ │ │ │ -
168 template<std::size_t i>
│ │ │ │ -
169 auto operator[](Dune::index_constant<i>) const
│ │ │ │ -
170 {
│ │ │ │ -
171 if constexpr (i<size()) {
│ │ │ │ -
172 return index_[Dune::index_constant<i+offset>{}];
│ │ │ │ -
173 } else {
│ │ │ │ -
174 return Dune::index_constant<0>{};
│ │ │ │ -
175 }
│ │ │ │ -
176 }
│ │ │ │ +
151
│ │ │ │ +
166template<class Signature, template<class> class DerivativeTraits, class... F>
│ │ │ │ +
167DifferentiableFunctionFromCallables<Signature, DerivativeTraits, F...>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
169{
│ │ │ │ +
170 return DifferentiableFunctionFromCallables<Signature, DerivativeTraits, F...>(f...);
│ │ │ │ +
171}
│ │ │ │ +
│ │ │ │ +
172
│ │ │ │ +
173
│ │ │ │ +
174
│ │ │ │ +
175} // namespace Functions
│ │ │ │ +
176} // namespace Dune
│ │ │ │
177
│ │ │ │ -
181 ShiftedStaticMultiIndex<Index, offset+1> pop() const
│ │ │ │ -
182 {
│ │ │ │ -
183 return {index_};
│ │ │ │ -
184 }
│ │ │ │ -
185
│ │ │ │ -
186 static constexpr std::size_t size()
│ │ │ │ -
187 {
│ │ │ │ -
188 auto fullSize = decltype(Hybrid::size(std::declval<Index>()))::value;
│ │ │ │ -
189 if (offset < fullSize)
│ │ │ │ -
190 return fullSize - offset;
│ │ │ │ -
191 else
│ │ │ │ -
192 return 0;
│ │ │ │ -
193 }
│ │ │ │ -
194
│ │ │ │ -
195 private:
│ │ │ │ -
196 const Index& index_;
│ │ │ │ -
197 };
│ │ │ │ -
198
│ │ │ │ -
204 template<std::size_t offset, class Index>
│ │ │ │ -
205 ShiftedDynamicMultiIndex<Index, offset> shiftedDynamicMultiIndex(const Index& index)
│ │ │ │ -
206 {
│ │ │ │ -
207 return {index};
│ │ │ │ -
208 }
│ │ │ │ -
209
│ │ │ │ -
218 template<std::size_t offset, class Index, std::size_t oldOffset>
│ │ │ │ -
219 ShiftedDynamicMultiIndex<Index, offset+oldOffset> shiftedDynamicMultiIndex(const ShiftedDynamicMultiIndex<Index, oldOffset>& index)
│ │ │ │ -
220 {
│ │ │ │ -
221 return {index.originalIndex()};
│ │ │ │ -
222 }
│ │ │ │ -
223
│ │ │ │ -
224 template<std::size_t offset, class Index>
│ │ │ │ -
225 ShiftedStaticMultiIndex<Index, offset> shiftedStaticMultiIndex(const Index& index)
│ │ │ │ -
226 {
│ │ │ │ -
227 return {index};
│ │ │ │ -
228 }
│ │ │ │ -
229
│ │ │ │ -
230} // namespace Imp
│ │ │ │ -
231
│ │ │ │ -
232
│ │ │ │ -
233
│ │ │ │ -
234
│ │ │ │ -
235namespace Imp {
│ │ │ │ -
236
│ │ │ │ -
237template<class Result, class Index>
│ │ │ │ -
238struct MultiIndexResolver
│ │ │ │ -
239{
│ │ │ │ -
240 MultiIndexResolver(const Index& index) :
│ │ │ │ -
241 index_(index)
│ │ │ │ -
242 {}
│ │ │ │ -
243
│ │ │ │ -
244 template<class C,
│ │ │ │ -
245 std::enable_if_t<not std::is_convertible_v<C&, Result>, int> = 0>
│ │ │ │ -
246 Result operator()(C&& c)
│ │ │ │ -
247 {
│ │ │ │ -
248 auto&& subIndex = Imp::shiftedDynamicMultiIndex<1>(index_);
│ │ │ │ -
249 auto&& subIndexResolver = MultiIndexResolver<Result, decltype(subIndex)>(subIndex);
│ │ │ │ -
250 return (Result)(hybridIndexAccess(c, index_[Dune::Indices::_0], subIndexResolver));
│ │ │ │ -
251 }
│ │ │ │ -
252
│ │ │ │ -
253 template<class C,
│ │ │ │ -
254 std::enable_if_t<std::is_convertible_v<C&, Result>, int> = 0>
│ │ │ │ -
255 Result operator()(C&& c)
│ │ │ │ -
256 {
│ │ │ │ -
257 return (Result)(std::forward<C>(c));
│ │ │ │ -
258 }
│ │ │ │ -
259
│ │ │ │ -
260 const Index& index_;
│ │ │ │ -
261};
│ │ │ │ -
262
│ │ │ │ -
263} // namespace Imp
│ │ │ │ -
264
│ │ │ │ -
265
│ │ │ │ -
266
│ │ │ │ -
285template<class Result, class C, class MultiIndex>
│ │ │ │ -
│ │ │ │ -
286Result hybridMultiIndexAccess(C&& c, const MultiIndex& index)
│ │ │ │ -
287{
│ │ │ │ -
288
│ │ │ │ -
289 Imp::MultiIndexResolver<Result, MultiIndex> multiIndexResolver(index);
│ │ │ │ -
290 return multiIndexResolver(c);
│ │ │ │ -
291}
│ │ │ │ -
│ │ │ │ -
292
│ │ │ │ -
293
│ │ │ │ -
294
│ │ │ │ -
295
│ │ │ │ -
296
│ │ │ │ -
297
│ │ │ │ -
298namespace Imp {
│ │ │ │ -
299
│ │ │ │ -
300 template<class C, class MultiIndex, class IsFinal>
│ │ │ │ -
301 constexpr decltype(auto) resolveDynamicMultiIndex(C&& c, const MultiIndex& multiIndex, const IsFinal& isFinal)
│ │ │ │ -
302 {
│ │ │ │ -
303 // If c is already considered final simply return it,
│ │ │ │ -
304 // else resolve the next multiIndex entry.
│ │ │ │ -
305 return Hybrid::ifElse(isFinal(c), [&, c = forwardCapture(std::forward<C>(c))](auto) -> decltype(auto) {
│ │ │ │ -
306 assert(multiIndex.size() == 0);
│ │ │ │ -
307 return c.forward();
│ │ │ │ -
308 }, [&](auto) -> decltype(auto) {
│ │ │ │ -
309 auto hasDynamicAccess = callableCheck([](auto&& cc) -> std::void_t<decltype(cc[0])> {});
│ │ │ │ -
310
│ │ │ │ -
311 // Split multiIndex into first entry and remaining ones.
│ │ │ │ -
312 auto i = multiIndex[0];
│ │ │ │ -
313 auto tail = multiIndex.pop();
│ │ │ │ -
314
│ │ │ │ -
315 // Resolve first multiIndex entry by c[multiIndex[0]] and
│ │ │ │ -
316 // continue resolving with the remaining remaining ones.
│ │ │ │ -
317 // If c has a dynamic operator[] this is straight forward.
│ │ │ │ -
318 // Else the dynamic multiIndex[0] has to be translated into
│ │ │ │ -
319 // a static one using hybridIndexAccess.
│ │ │ │ -
320 return Hybrid::ifElse(hasDynamicAccess(c), [&](auto id) -> decltype(auto) {
│ │ │ │ -
321 return Imp::resolveDynamicMultiIndex(id(c)[i], tail, isFinal);
│ │ │ │ -
322 }, [&](auto id) -> decltype(auto) {
│ │ │ │ -
323 // auto indexRange = range(Hybrid::size(id(c)));
│ │ │ │ -
324 auto indexRange = typename decltype(range(Hybrid::size(id(c))))::integer_sequence();
│ │ │ │ -
325 return Hybrid::switchCases(indexRange, i, [&](auto static_i) -> decltype(auto){
│ │ │ │ -
326 // Do rescursion with static version of i
│ │ │ │ -
327 return Imp::resolveDynamicMultiIndex(id(c)[static_i], tail, isFinal);
│ │ │ │ -
328 }, [&]() -> decltype(auto){
│ │ │ │ -
329 // As fallback we use c[0] this is needed, because there must be one branch that matches.
│ │ │ │ -
330 return Imp::resolveDynamicMultiIndex(id(c)[Dune::Indices::_0], tail, isFinal);
│ │ │ │ -
331 });
│ │ │ │ -
332 });
│ │ │ │ -
333 });
│ │ │ │ -
334 }
│ │ │ │ -
335
│ │ │ │ -
336 template<class C, class MultiIndex>
│ │ │ │ -
337 constexpr decltype(auto) resolveStaticMultiIndex(C&& c, const MultiIndex& multiIndex)
│ │ │ │ -
338 {
│ │ │ │ -
339 auto isExhausted = Hybrid::equal_to(Hybrid::size(multiIndex), Dune::Indices::_0);
│ │ │ │ -
340 return Hybrid::ifElse(isExhausted, [&, c = forwardCapture(std::forward<C>(c))](auto) -> decltype(auto) {
│ │ │ │ -
341 return c.forward();
│ │ │ │ -
342 }, [&](auto id) -> decltype(auto) {
│ │ │ │ -
343 auto head = multiIndex[Dune::Indices::_0];
│ │ │ │ -
344 auto tail = multiIndex.pop();
│ │ │ │ -
345
│ │ │ │ -
346 return Imp::resolveStaticMultiIndex(id(c)[head], tail);
│ │ │ │ -
347 });
│ │ │ │ -
348 }
│ │ │ │ -
349
│ │ │ │ -
350} // namespace Imp
│ │ │ │ -
351
│ │ │ │ -
352
│ │ │ │ -
353
│ │ │ │ -
376template<class C, class MultiIndex, class IsFinal>
│ │ │ │ -
│ │ │ │ -
377constexpr decltype(auto) resolveDynamicMultiIndex(C&& c, const MultiIndex& multiIndex, const IsFinal& isFinal)
│ │ │ │ -
378{
│ │ │ │ -
379 return Imp::resolveDynamicMultiIndex(std::forward<C>(c), Imp::shiftedDynamicMultiIndex<0>(multiIndex), isFinal);
│ │ │ │ -
380}
│ │ │ │ -
│ │ │ │ -
381
│ │ │ │ -
398template<class C, class MultiIndex>
│ │ │ │ -
│ │ │ │ -
399constexpr decltype(auto) resolveDynamicMultiIndex(C&& c, const MultiIndex& multiIndex)
│ │ │ │ -
400{
│ │ │ │ -
401 auto hasNoIndexAccess = negatePredicate(callableCheck([](auto&& cc) -> std::void_t<decltype(cc[Dune::Indices::_0])> {}));
│ │ │ │ -
402 return Imp::resolveDynamicMultiIndex(std::forward<C>(c), Imp::shiftedDynamicMultiIndex<0>(multiIndex), hasNoIndexAccess);
│ │ │ │ -
403}
│ │ │ │ -
│ │ │ │ -
404
│ │ │ │ -
420template<class C, class MultiIndex>
│ │ │ │ -
│ │ │ │ -
421constexpr decltype(auto) resolveStaticMultiIndex(C&& c, const MultiIndex& multiIndex)
│ │ │ │ -
422{
│ │ │ │ -
423 return Imp::resolveStaticMultiIndex(std::forward<C>(c), Imp::shiftedStaticMultiIndex<0>(multiIndex));
│ │ │ │ -
424}
│ │ │ │ -
│ │ │ │ -
425
│ │ │ │ -
426
│ │ │ │ -
427
│ │ │ │ -
428} // namespace Dune::Functions
│ │ │ │ -
429} // namespace Dune
│ │ │ │ -
430
│ │ │ │ -
431
│ │ │ │ -
432
│ │ │ │ -
433#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:67
│ │ │ │ -
constexpr decltype(auto) resolveStaticMultiIndex(C &&c, const MultiIndex &multiIndex)
Provide multi-index access by chaining operator[].
Definition indexaccess.hh:421
│ │ │ │ -
auto callableCheck(Expression f)
Create a predicate for checking validity of expressions.
Definition utility.hh:283
│ │ │ │ -
constexpr decltype(auto) resolveDynamicMultiIndex(C &&c, const MultiIndex &multiIndex, const IsFinal &isFinal)
Provide multi-index access by chaining operator[].
Definition indexaccess.hh:377
│ │ │ │ -
Result hybridMultiIndexAccess(C &&c, const MultiIndex &index)
Provide multi-index access by chaining operator[].
Definition indexaccess.hh:286
│ │ │ │ -
auto negatePredicate(Check check)
Negate given predicate.
Definition utility.hh:308
│ │ │ │ +
178#endif //DUNE_FUNCTIONS_COMMON_DIFFEREENTIONABEFUNCTIONFROMCALLABLES_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
friend Derivative derivative(const DifferentiableFunctionFromCallables &t)
Get derivative of DifferentiableFunctionFromCallables.
Definition differentiablefunctionfromcallables.hh:80
│ │ │ │ +
DifferentiableFunctionFromCallables< Signature, DerivativeTraits, F... > makeDifferentiableFunctionFromCallables(const SignatureTag< Signature, DerivativeTraits > &signatureTag, F &&... f)
Create a DifferentiableFunction from callables.
Definition differentiablefunctionfromcallables.hh:168
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
auto forwardCapture(T &&t)
Create a capture object for perfect forwarding.
Definition utility.hh:376
│ │ │ │ +
Definition differentiablefunction.hh:33
│ │ │ │ +
Definition differentiablefunctionfromcallables.hh:27
│ │ │ │ +
DifferentiableFunctionFromCallables(FF &&f)
Constructor copying the given function.
Definition differentiablefunctionfromcallables.hh:65
│ │ │ │ +
typename SignatureTraits< Signature >::RawSignature RawSignature
Definition differentiablefunctionfromcallables.hh:55
│ │ │ │ +
Range(Domain) Signature
Signature of function.
Definition differentiablefunctionfromcallables.hh:53
│ │ │ │ +
typename DerivativeTraits< RawSignature >::Range(Domain) DerivativeSignature
Signature of derivative.
Definition differentiablefunctionfromcallables.hh:58
│ │ │ │ +
typename DerivativeTraits< RawSignature >::Range(Domain) DerivativeSignature
Definition differentiablefunctionfromcallables.hh:114
│ │ │ │ + │ │ │ │ +
typename SignatureTraits< Signature >::RawSignature RawSignature
Definition differentiablefunctionfromcallables.hh:113
│ │ │ │ +
DifferentiableFunctionFromCallables(FF &&f, DFF &&df, DDFF &&... ddf)
Constructor copying the given functions.
Definition differentiablefunctionfromcallables.hh:125
│ │ │ │ +
Helper class to deduce the signature of a callable.
Definition signature.hh:60
│ │ │ │ +
Definition signature.hh:106
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,371 +1,196 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -indexaccess.hh │ │ │ │ │ +differentiablefunctionfromcallables.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_COMMON_INDEX_ACCESS_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_COMMON_INDEX_ACCESS_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_COMMON_DIFFEREENTIONABEFUNCTIONFROMCALLABLES_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_COMMON_DIFFEREENTIONABEFUNCTIONFROMCALLABLES_HH │ │ │ │ │ 9 │ │ │ │ │ 10 │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ 13 │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17 │ │ │ │ │ -18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_u_t_i_l_i_t_y_._h_h> │ │ │ │ │ +14#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_s_i_g_n_a_t_u_r_e_._h_h> │ │ │ │ │ +15 │ │ │ │ │ +16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ +17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +18 │ │ │ │ │ 19 │ │ │ │ │ 20 │ │ │ │ │ -21 │ │ │ │ │ -22namespace _D_u_n_e { │ │ │ │ │ -23namespace Functions { │ │ │ │ │ +21namespace _D_u_n_e { │ │ │ │ │ +22namespace Functions { │ │ │ │ │ +23 │ │ │ │ │ 24 │ │ │ │ │ 25 │ │ │ │ │ -26namespace Imp { │ │ │ │ │ -27 │ │ │ │ │ -28namespace Concept { │ │ │ │ │ +26template class DerivativeTraits, class... │ │ │ │ │ +Callables> │ │ │ │ │ +_2_7class _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s; │ │ │ │ │ +28 │ │ │ │ │ 29 │ │ │ │ │ -30template │ │ │ │ │ -31struct HasDynamicIndexAccess │ │ │ │ │ -32{ │ │ │ │ │ -33 template │ │ │ │ │ -34 auto require(C&& c) -> decltype( │ │ │ │ │ -35 c[std::declval()] │ │ │ │ │ -36 ); │ │ │ │ │ -37}; │ │ │ │ │ -38 │ │ │ │ │ -39struct HasStaticIndexAccess │ │ │ │ │ -40{ │ │ │ │ │ -41 template │ │ │ │ │ -42 auto require(C&& c) -> decltype( │ │ │ │ │ -43 c[Dune::Indices::_0] │ │ │ │ │ -44 ); │ │ │ │ │ -45}; │ │ │ │ │ -46 │ │ │ │ │ -47} // namespace Concept │ │ │ │ │ -48 │ │ │ │ │ -49} // namespace Imp │ │ │ │ │ -50 │ │ │ │ │ +30 │ │ │ │ │ +47template class DerivativeTraits, │ │ │ │ │ +class F> │ │ │ │ │ +_4_8class _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s │ │ │ │ │ +49{ │ │ │ │ │ +50public: │ │ │ │ │ 51 │ │ │ │ │ -52 │ │ │ │ │ -65template, C>(), │ │ │ │ │ -int> = 0> │ │ │ │ │ -_6_7auto _h_y_b_r_i_d_I_n_d_e_x_A_c_c_e_s_s(C&& c, const I& i, F&& f) │ │ │ │ │ -68 -> decltype(f(c[i])) │ │ │ │ │ -69{ │ │ │ │ │ -70 return f(c[i]); │ │ │ │ │ -71} │ │ │ │ │ -72 │ │ │ │ │ -90template, │ │ │ │ │ -C>(), int> = 0> │ │ │ │ │ -_9_2decltype(auto) _h_y_b_r_i_d_I_n_d_e_x_A_c_c_e_s_s(C&& c, const I& i, F&& f) │ │ │ │ │ -93{ │ │ │ │ │ -94 using Size = decltype(Hybrid::size(c)); │ │ │ │ │ -95 return Hybrid::switchCases(std::make_index_sequence(), i, │ │ │ │ │ -96 [&](const auto& ii) -> decltype(auto){ │ │ │ │ │ -97 return f(c[ii]); │ │ │ │ │ -98 }, [&]() -> decltype(auto){ │ │ │ │ │ -99 return f(c[Dune::Indices::_0]); │ │ │ │ │ -100 }); │ │ │ │ │ -101} │ │ │ │ │ -102 │ │ │ │ │ -103 │ │ │ │ │ -104namespace Imp { │ │ │ │ │ -105 │ │ │ │ │ -119 template │ │ │ │ │ -120 class ShiftedDynamicMultiIndex │ │ │ │ │ -121 { │ │ │ │ │ -122 public: │ │ │ │ │ -123 ShiftedDynamicMultiIndex(const Index& index) : │ │ │ │ │ -124 index_(index) │ │ │ │ │ -125 {} │ │ │ │ │ -126 │ │ │ │ │ -127 std::size_t operator[](std::size_t position) const │ │ │ │ │ -128 { │ │ │ │ │ -129 if (position pop() const │ │ │ │ │ -139 { │ │ │ │ │ -140 return {index_}; │ │ │ │ │ -141 } │ │ │ │ │ -142 │ │ │ │ │ -143 std::size_t size() const │ │ │ │ │ -144 { │ │ │ │ │ -145 if (offset < index_.size()) │ │ │ │ │ -146 return index_.size() - offset; │ │ │ │ │ -147 else │ │ │ │ │ -148 return 0; │ │ │ │ │ -149 } │ │ │ │ │ +_5_3 using _S_i_g_n_a_t_u_r_e = Range(Domain); │ │ │ │ │ +54 │ │ │ │ │ +_5_5 using _R_a_w_S_i_g_n_a_t_u_r_e = typename _S_i_g_n_a_t_u_r_e_T_r_a_i_t_s_<_S_i_g_n_a_t_u_r_e_>_:_:_R_a_w_S_i_g_n_a_t_u_r_e; │ │ │ │ │ +56 │ │ │ │ │ +_5_8 using _D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e = typename DerivativeTraits::Range │ │ │ │ │ +(Domain); │ │ │ │ │ +59 │ │ │ │ │ +_6_1 using _D_e_r_i_v_a_t_i_v_e = _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_>; │ │ │ │ │ +62 │ │ │ │ │ +64 template │ │ │ │ │ += 0> │ │ │ │ │ +_6_5 _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s(FF&& f) : │ │ │ │ │ +66 f_(std::forward(f)) │ │ │ │ │ +67 {} │ │ │ │ │ +68 │ │ │ │ │ +_7_0 Range operator() (const Domain& x) const │ │ │ │ │ +71 { │ │ │ │ │ +72 return f_(x); │ │ │ │ │ +73 } │ │ │ │ │ +74 │ │ │ │ │ +_8_0 friend _D_e_r_i_v_a_t_i_v_e _d_e_r_i_v_a_t_i_v_e(const _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s& t) │ │ │ │ │ +81 { │ │ │ │ │ +82 DUNE_THROW(Dune::NotImplemented, "Derivative not implemented"); │ │ │ │ │ +83 } │ │ │ │ │ +84 │ │ │ │ │ +85private: │ │ │ │ │ +86 F f_; │ │ │ │ │ +87}; │ │ │ │ │ +88 │ │ │ │ │ +89 │ │ │ │ │ +90 │ │ │ │ │ +107template class DerivativeTraits, │ │ │ │ │ +class F, class DF, class... Derivatives> │ │ │ │ │ +_1_0_8class _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s │ │ │ │ │ +109{ │ │ │ │ │ +110public: │ │ │ │ │ +111 │ │ │ │ │ +_1_1_2 using _S_i_g_n_a_t_u_r_e = Range(Domain); │ │ │ │ │ +_1_1_3 using _R_a_w_S_i_g_n_a_t_u_r_e = typename _S_i_g_n_a_t_u_r_e_T_r_a_i_t_s_<_S_i_g_n_a_t_u_r_e_>_:_:_R_a_w_S_i_g_n_a_t_u_r_e; │ │ │ │ │ +_1_1_4 using _D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e = typename DerivativeTraits::Range │ │ │ │ │ +(Domain); │ │ │ │ │ +115 │ │ │ │ │ +_1_1_6 using _D_e_r_i_v_a_t_i_v_e = _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s<_D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e, │ │ │ │ │ +DerivativeTraits, DF, Derivatives...>; │ │ │ │ │ +117 │ │ │ │ │ +124 template │ │ │ │ │ +_1_2_5 _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s(FF&& f, DFF&& df, DDFF&&... ddf) : │ │ │ │ │ +126 f_(std::forward(f)), │ │ │ │ │ +127 df_(std::forward(df), std::forward(ddf)...) │ │ │ │ │ +128 {} │ │ │ │ │ +129 │ │ │ │ │ +_1_3_1 Range operator() (const Domain& x) const │ │ │ │ │ +132 { │ │ │ │ │ +133 return f_(x); │ │ │ │ │ +134 } │ │ │ │ │ +135 │ │ │ │ │ +_1_4_1 friend _D_e_r_i_v_a_t_i_v_e _d_e_r_i_v_a_t_i_v_e(const _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s& t) │ │ │ │ │ +142 { │ │ │ │ │ +143 return t.df_; │ │ │ │ │ +144 } │ │ │ │ │ +145 │ │ │ │ │ +146private: │ │ │ │ │ +147 F f_; │ │ │ │ │ +148 Derivative df_; │ │ │ │ │ +149}; │ │ │ │ │ 150 │ │ │ │ │ -151 const Index& originalIndex() const │ │ │ │ │ -152 { │ │ │ │ │ -153 return index_; │ │ │ │ │ -154 } │ │ │ │ │ -155 │ │ │ │ │ -156 private: │ │ │ │ │ -157 const Index& index_; │ │ │ │ │ -158 }; │ │ │ │ │ -159 │ │ │ │ │ -160 template │ │ │ │ │ -161 class ShiftedStaticMultiIndex │ │ │ │ │ -162 { │ │ │ │ │ -163 public: │ │ │ │ │ -164 ShiftedStaticMultiIndex(const Index& index) : │ │ │ │ │ -165 index_(index) │ │ │ │ │ -166 {} │ │ │ │ │ -167 │ │ │ │ │ -168 template │ │ │ │ │ -169 auto operator[](Dune::index_constant) const │ │ │ │ │ -170 { │ │ │ │ │ -171 if constexpr (i{}]; │ │ │ │ │ -173 } else { │ │ │ │ │ -174 return Dune::index_constant<0>{}; │ │ │ │ │ -175 } │ │ │ │ │ -176 } │ │ │ │ │ +151 │ │ │ │ │ +166template class DerivativeTraits, class... │ │ │ │ │ +F> │ │ │ │ │ +167DifferentiableFunctionFromCallables │ │ │ │ │ +_1_6_8 _m_a_k_e_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s(const _S_i_g_n_a_t_u_r_e_T_a_g_<_S_i_g_n_a_t_u_r_e_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_>& signatureTag, F&&... f) │ │ │ │ │ +169{ │ │ │ │ │ +170 return _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s(f...); │ │ │ │ │ +171} │ │ │ │ │ +172 │ │ │ │ │ +173 │ │ │ │ │ +174 │ │ │ │ │ +175} // namespace Functions │ │ │ │ │ +176} // namespace Dune │ │ │ │ │ 177 │ │ │ │ │ -181 ShiftedStaticMultiIndex pop() const │ │ │ │ │ -182 { │ │ │ │ │ -183 return {index_}; │ │ │ │ │ -184 } │ │ │ │ │ -185 │ │ │ │ │ -186 static constexpr std::size_t size() │ │ │ │ │ -187 { │ │ │ │ │ -188 auto fullSize = decltype(Hybrid::size(std::declval()))::value; │ │ │ │ │ -189 if (offset < fullSize) │ │ │ │ │ -190 return fullSize - offset; │ │ │ │ │ -191 else │ │ │ │ │ -192 return 0; │ │ │ │ │ -193 } │ │ │ │ │ -194 │ │ │ │ │ -195 private: │ │ │ │ │ -196 const Index& index_; │ │ │ │ │ -197 }; │ │ │ │ │ -198 │ │ │ │ │ -204 template │ │ │ │ │ -205 ShiftedDynamicMultiIndex shiftedDynamicMultiIndex(const │ │ │ │ │ -Index& index) │ │ │ │ │ -206 { │ │ │ │ │ -207 return {index}; │ │ │ │ │ -208 } │ │ │ │ │ -209 │ │ │ │ │ -218 template │ │ │ │ │ -219 ShiftedDynamicMultiIndex shiftedDynamicMultiIndex │ │ │ │ │ -(const ShiftedDynamicMultiIndex& index) │ │ │ │ │ -220 { │ │ │ │ │ -221 return {index.originalIndex()}; │ │ │ │ │ -222 } │ │ │ │ │ -223 │ │ │ │ │ -224 template │ │ │ │ │ -225 ShiftedStaticMultiIndex shiftedStaticMultiIndex(const Index& │ │ │ │ │ -index) │ │ │ │ │ -226 { │ │ │ │ │ -227 return {index}; │ │ │ │ │ -228 } │ │ │ │ │ -229 │ │ │ │ │ -230} // namespace Imp │ │ │ │ │ -231 │ │ │ │ │ -232 │ │ │ │ │ -233 │ │ │ │ │ -234 │ │ │ │ │ -235namespace Imp { │ │ │ │ │ -236 │ │ │ │ │ -237template │ │ │ │ │ -238struct MultiIndexResolver │ │ │ │ │ -239{ │ │ │ │ │ -240 MultiIndexResolver(const Index& index) : │ │ │ │ │ -241 index_(index) │ │ │ │ │ -242 {} │ │ │ │ │ -243 │ │ │ │ │ -244 template, int> = 0> │ │ │ │ │ -246 Result operator()(C&& c) │ │ │ │ │ -247 { │ │ │ │ │ -248 auto&& subIndex = Imp::shiftedDynamicMultiIndex<1>(index_); │ │ │ │ │ -249 auto&& subIndexResolver = MultiIndexResolver │ │ │ │ │ -(subIndex); │ │ │ │ │ -250 return (Result)(_h_y_b_r_i_d_I_n_d_e_x_A_c_c_e_s_s(c, index_[Dune::Indices::_0], │ │ │ │ │ -subIndexResolver)); │ │ │ │ │ -251 } │ │ │ │ │ -252 │ │ │ │ │ -253 template, int> = 0> │ │ │ │ │ -255 Result operator()(C&& c) │ │ │ │ │ -256 { │ │ │ │ │ -257 return (Result)(std::forward(c)); │ │ │ │ │ -258 } │ │ │ │ │ -259 │ │ │ │ │ -260 const Index& index_; │ │ │ │ │ -261}; │ │ │ │ │ -262 │ │ │ │ │ -263} // namespace Imp │ │ │ │ │ -264 │ │ │ │ │ -265 │ │ │ │ │ -266 │ │ │ │ │ -285template │ │ │ │ │ -_2_8_6Result _h_y_b_r_i_d_M_u_l_t_i_I_n_d_e_x_A_c_c_e_s_s(C&& c, const MultiIndex& index) │ │ │ │ │ -287{ │ │ │ │ │ -288 │ │ │ │ │ -289 Imp::MultiIndexResolver multiIndexResolver(index); │ │ │ │ │ -290 return multiIndexResolver(c); │ │ │ │ │ -291} │ │ │ │ │ -292 │ │ │ │ │ -293 │ │ │ │ │ -294 │ │ │ │ │ -295 │ │ │ │ │ -296 │ │ │ │ │ -297 │ │ │ │ │ -298namespace Imp { │ │ │ │ │ -299 │ │ │ │ │ -300 template │ │ │ │ │ -301 constexpr decltype(auto) resolveDynamicMultiIndex(C&& c, const MultiIndex& │ │ │ │ │ -multiIndex, const IsFinal& isFinal) │ │ │ │ │ -302 { │ │ │ │ │ -303 // If c is already considered final simply return it, │ │ │ │ │ -304 // else resolve the next multiIndex entry. │ │ │ │ │ -305 return Hybrid::ifElse(isFinal(c), [&, c = _f_o_r_w_a_r_d_C_a_p_t_u_r_e(std::forward │ │ │ │ │ -(c))](auto) -> decltype(auto) { │ │ │ │ │ -306 assert(multiIndex.size() == 0); │ │ │ │ │ -307 return c.forward(); │ │ │ │ │ -308 }, [&](auto) -> decltype(auto) { │ │ │ │ │ -309 auto hasDynamicAccess = _c_a_l_l_a_b_l_e_C_h_e_c_k([](auto&& cc) -> std::void_t {}); │ │ │ │ │ -310 │ │ │ │ │ -311 // Split multiIndex into first entry and remaining ones. │ │ │ │ │ -312 auto i = multiIndex[0]; │ │ │ │ │ -313 auto tail = multiIndex.pop(); │ │ │ │ │ -314 │ │ │ │ │ -315 // Resolve first multiIndex entry by c[multiIndex[0]] and │ │ │ │ │ -316 // continue resolving with the remaining remaining ones. │ │ │ │ │ -317 // If c has a dynamic operator[] this is straight forward. │ │ │ │ │ -318 // Else the dynamic multiIndex[0] has to be translated into │ │ │ │ │ -319 // a static one using hybridIndexAccess. │ │ │ │ │ -320 return Hybrid::ifElse(hasDynamicAccess(c), [&](auto id) -> decltype(auto) { │ │ │ │ │ -321 return Imp::resolveDynamicMultiIndex(id(c)[i], tail, isFinal); │ │ │ │ │ -322 }, [&](auto id) -> decltype(auto) { │ │ │ │ │ -323 // auto indexRange = range(Hybrid::size(id(c))); │ │ │ │ │ -324 auto indexRange = typename decltype(range(Hybrid::size(id(c)))):: │ │ │ │ │ -integer_sequence(); │ │ │ │ │ -325 return Hybrid::switchCases(indexRange, i, [&](auto static_i) -> decltype │ │ │ │ │ -(auto){ │ │ │ │ │ -326 // Do rescursion with static version of i │ │ │ │ │ -327 return Imp::resolveDynamicMultiIndex(id(c)[static_i], tail, isFinal); │ │ │ │ │ -328 }, [&]() -> decltype(auto){ │ │ │ │ │ -329 // As fallback we use c[0] this is needed, because there must be one branch │ │ │ │ │ -that matches. │ │ │ │ │ -330 return Imp::resolveDynamicMultiIndex(id(c)[Dune::Indices::_0], tail, │ │ │ │ │ -isFinal); │ │ │ │ │ -331 }); │ │ │ │ │ -332 }); │ │ │ │ │ -333 }); │ │ │ │ │ -334 } │ │ │ │ │ -335 │ │ │ │ │ -336 template │ │ │ │ │ -337 constexpr decltype(auto) resolveStaticMultiIndex(C&& c, const MultiIndex& │ │ │ │ │ -multiIndex) │ │ │ │ │ -338 { │ │ │ │ │ -339 auto isExhausted = Hybrid::equal_to(Hybrid::size(multiIndex), Dune:: │ │ │ │ │ -Indices::_0); │ │ │ │ │ -340 return Hybrid::ifElse(isExhausted, [&, c = _f_o_r_w_a_r_d_C_a_p_t_u_r_e(std::forward │ │ │ │ │ -(c))](auto) -> decltype(auto) { │ │ │ │ │ -341 return c.forward(); │ │ │ │ │ -342 }, [&](auto id) -> decltype(auto) { │ │ │ │ │ -343 auto head = multiIndex[Dune::Indices::_0]; │ │ │ │ │ -344 auto tail = multiIndex.pop(); │ │ │ │ │ -345 │ │ │ │ │ -346 return Imp::resolveStaticMultiIndex(id(c)[head], tail); │ │ │ │ │ -347 }); │ │ │ │ │ -348 } │ │ │ │ │ -349 │ │ │ │ │ -350} // namespace Imp │ │ │ │ │ -351 │ │ │ │ │ -352 │ │ │ │ │ -353 │ │ │ │ │ -376template │ │ │ │ │ -_3_7_7constexpr decltype(auto) _r_e_s_o_l_v_e_D_y_n_a_m_i_c_M_u_l_t_i_I_n_d_e_x(C&& c, const MultiIndex& │ │ │ │ │ -multiIndex, const IsFinal& isFinal) │ │ │ │ │ -378{ │ │ │ │ │ -379 return Imp::resolveDynamicMultiIndex(std::forward(c), Imp:: │ │ │ │ │ -shiftedDynamicMultiIndex<0>(multiIndex), isFinal); │ │ │ │ │ -380} │ │ │ │ │ -381 │ │ │ │ │ -398template │ │ │ │ │ -_3_9_9constexpr decltype(auto) _r_e_s_o_l_v_e_D_y_n_a_m_i_c_M_u_l_t_i_I_n_d_e_x(C&& c, const MultiIndex& │ │ │ │ │ -multiIndex) │ │ │ │ │ -400{ │ │ │ │ │ -401 auto hasNoIndexAccess = _n_e_g_a_t_e_P_r_e_d_i_c_a_t_e(_c_a_l_l_a_b_l_e_C_h_e_c_k([](auto&& cc) - │ │ │ │ │ -> std::void_t {})); │ │ │ │ │ -402 return Imp::resolveDynamicMultiIndex(std::forward(c), Imp:: │ │ │ │ │ -shiftedDynamicMultiIndex<0>(multiIndex), hasNoIndexAccess); │ │ │ │ │ -403} │ │ │ │ │ -404 │ │ │ │ │ -420template │ │ │ │ │ -_4_2_1constexpr decltype(auto) _r_e_s_o_l_v_e_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x(C&& c, const MultiIndex& │ │ │ │ │ -multiIndex) │ │ │ │ │ -422{ │ │ │ │ │ -423 return Imp::resolveStaticMultiIndex(std::forward(c), Imp:: │ │ │ │ │ -shiftedStaticMultiIndex<0>(multiIndex)); │ │ │ │ │ -424} │ │ │ │ │ -425 │ │ │ │ │ -426 │ │ │ │ │ -427 │ │ │ │ │ -428} // namespace Dune::Functions │ │ │ │ │ -429} // namespace Dune │ │ │ │ │ -430 │ │ │ │ │ -431 │ │ │ │ │ -432 │ │ │ │ │ -433#endif // DUNE_FUNCTIONS_COMMON_INDEX_ACCESS_HH │ │ │ │ │ -_u_t_i_l_i_t_y_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_h_y_b_r_i_d_I_n_d_e_x_A_c_c_e_s_s │ │ │ │ │ -auto hybridIndexAccess(C &&c, const I &i, F &&f) -> decltype(f(c[i])) │ │ │ │ │ -Provide operator[] index-access for containers. │ │ │ │ │ -DDeeffiinniittiioonn indexaccess.hh:67 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_r_e_s_o_l_v_e_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x │ │ │ │ │ -constexpr decltype(auto) resolveStaticMultiIndex(C &&c, const MultiIndex │ │ │ │ │ -&multiIndex) │ │ │ │ │ -Provide multi-index access by chaining operator[]. │ │ │ │ │ -DDeeffiinniittiioonn indexaccess.hh:421 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_a_l_l_a_b_l_e_C_h_e_c_k │ │ │ │ │ -auto callableCheck(Expression f) │ │ │ │ │ -Create a predicate for checking validity of expressions. │ │ │ │ │ -DDeeffiinniittiioonn utility.hh:283 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_r_e_s_o_l_v_e_D_y_n_a_m_i_c_M_u_l_t_i_I_n_d_e_x │ │ │ │ │ -constexpr decltype(auto) resolveDynamicMultiIndex(C &&c, const MultiIndex │ │ │ │ │ -&multiIndex, const IsFinal &isFinal) │ │ │ │ │ -Provide multi-index access by chaining operator[]. │ │ │ │ │ -DDeeffiinniittiioonn indexaccess.hh:377 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_h_y_b_r_i_d_M_u_l_t_i_I_n_d_e_x_A_c_c_e_s_s │ │ │ │ │ -Result hybridMultiIndexAccess(C &&c, const MultiIndex &index) │ │ │ │ │ -Provide multi-index access by chaining operator[]. │ │ │ │ │ -DDeeffiinniittiioonn indexaccess.hh:286 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_n_e_g_a_t_e_P_r_e_d_i_c_a_t_e │ │ │ │ │ -auto negatePredicate(Check check) │ │ │ │ │ -Negate given predicate. │ │ │ │ │ -DDeeffiinniittiioonn utility.hh:308 │ │ │ │ │ +178#endif //DUNE_FUNCTIONS_COMMON_DIFFEREENTIONABEFUNCTIONFROMCALLABLES_HH │ │ │ │ │ +_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h │ │ │ │ │ +_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ +_s_i_g_n_a_t_u_r_e_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _F_ _>_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ +friend Derivative derivative(const DifferentiableFunctionFromCallables &t) │ │ │ │ │ +Get derivative of DifferentiableFunctionFromCallables. │ │ │ │ │ +DDeeffiinniittiioonn differentiablefunctionfromcallables.hh:80 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s │ │ │ │ │ +DifferentiableFunctionFromCallables< Signature, DerivativeTraits, F... > │ │ │ │ │ +makeDifferentiableFunctionFromCallables(const SignatureTag< Signature, │ │ │ │ │ +DerivativeTraits > &signatureTag, F &&... f) │ │ │ │ │ +Create a DifferentiableFunction from callables. │ │ │ │ │ +DDeeffiinniittiioonn differentiablefunctionfromcallables.hh:168 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_o_r_w_a_r_d_C_a_p_t_u_r_e │ │ │ │ │ -auto forwardCapture(T &&t) │ │ │ │ │ -Create a capture object for perfect forwarding. │ │ │ │ │ -DDeeffiinniittiioonn utility.hh:376 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn differentiablefunction.hh:33 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s │ │ │ │ │ +DDeeffiinniittiioonn differentiablefunctionfromcallables.hh:27 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _F_ _>_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s │ │ │ │ │ +DifferentiableFunctionFromCallables(FF &&f) │ │ │ │ │ +Constructor copying the given function. │ │ │ │ │ +DDeeffiinniittiioonn differentiablefunctionfromcallables.hh:65 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _F_ _>_:_:_R_a_w_S_i_g_n_a_t_u_r_e │ │ │ │ │ +typename SignatureTraits< Signature >::RawSignature RawSignature │ │ │ │ │ +DDeeffiinniittiioonn differentiablefunctionfromcallables.hh:55 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _F_ _>_:_:_S_i_g_n_a_t_u_r_e │ │ │ │ │ +Range(Domain) Signature │ │ │ │ │ +Signature of function. │ │ │ │ │ +DDeeffiinniittiioonn differentiablefunctionfromcallables.hh:53 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _F_ _>_:_:_D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e │ │ │ │ │ +typename DerivativeTraits< RawSignature >::Range(Domain) DerivativeSignature │ │ │ │ │ +Signature of derivative. │ │ │ │ │ +DDeeffiinniittiioonn differentiablefunctionfromcallables.hh:58 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _F_,_ _D_F_,_ _D_e_r_i_v_a_t_i_v_e_s_._._._ _>_:_:_D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e │ │ │ │ │ +typename DerivativeTraits< RawSignature >::Range(Domain) DerivativeSignature │ │ │ │ │ +DDeeffiinniittiioonn differentiablefunctionfromcallables.hh:114 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _F_,_ _D_F_,_ _D_e_r_i_v_a_t_i_v_e_s_._._._ _>_:_:_S_i_g_n_a_t_u_r_e │ │ │ │ │ +Range(Domain) Signature │ │ │ │ │ +DDeeffiinniittiioonn differentiablefunctionfromcallables.hh:112 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _F_,_ _D_F_,_ _D_e_r_i_v_a_t_i_v_e_s_._._._ _>_:_:_R_a_w_S_i_g_n_a_t_u_r_e │ │ │ │ │ +typename SignatureTraits< Signature >::RawSignature RawSignature │ │ │ │ │ +DDeeffiinniittiioonn differentiablefunctionfromcallables.hh:113 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _F_,_ _D_F_,_ _D_e_r_i_v_a_t_i_v_e_s_._._._ _>_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s │ │ │ │ │ +DifferentiableFunctionFromCallables(FF &&f, DFF &&df, DDFF &&... ddf) │ │ │ │ │ +Constructor copying the given functions. │ │ │ │ │ +DDeeffiinniittiioonn differentiablefunctionfromcallables.hh:125 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_r_a_i_t_s │ │ │ │ │ +Helper class to deduce the signature of a callable. │ │ │ │ │ +DDeeffiinniittiioonn signature.hh:60 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_a_g │ │ │ │ │ +DDeeffiinniittiioonn signature.hh:106 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./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 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -73,89 +73,57 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Typedefs | │ │ │ │ -Functions
│ │ │ │ -
utility.hh File Reference
│ │ │ │ +Variables
│ │ │ │ +
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/hybridutilities.hh>
│ │ │ │ +#include <dune/common/typeutilities.hh>
│ │ │ │
│ │ │ │

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::StaticSizeOrZero< T >
 Obtain size of statically sized container, or 0 if dynamic size. 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.
 
template<template< class... > class F, class... Tuples>
using Dune::Functions::TransformTuple = typename Imp::TransformTupleHelper< F, Tuples... >::Type
 Transform tuple types argument using type-functor.
 
template<class IntegerSequence >
using Dune::Functions::IntegerSequenceTuple = typename Imp::IntegerSequenceTupleHelper< IntegerSequence >::Type
 Transform integer_sequence<I,k...> to tuple<integral_constant<I,k>...>
 
template<class T , class... Args>
using Dune::Functions::enableIfConstructible = std::enable_if_t< std::is_constructible_v< T, Args... >, int >
 Helper to constrain forwarding constructors.
 
template<class T >
using Dune::Functions::StaticSize = std::enable_if_t< HasStaticSize_v< T >, decltype(Dune::Hybrid::size(std::declval< T >()))>
 Obtain size of statically sized container as integral_constant, or fail.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -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.
 
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.
 
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.
 
template<class Expression >
auto Dune::Functions::callableCheck (Expression f)
 Create a predicate for checking validity of expressions.
 
template<class Check >
auto Dune::Functions::negatePredicate (Check check)
 Negate given predicate.
 
template<class T >
auto Dune::Functions::forwardCapture (T &&t)
 Create a capture object for perfect forwarding.
 

│ │ │ │ +Variables

template<class T >
constexpr bool Dune::Functions::HasStaticSize_v = HasStaticSize<T>::value
 A variable template representing the value of HasStaticSize.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,92 +1,44 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -utility.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _V_a_r_i_a_b_l_e_s │ │ │ │ │ +type_traits.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_s_t_T_y_p_e_<_ _T_ _> │ │ │ │ │ -  Get last entry of type list. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_a_s_S_t_a_t_i_c_S_i_z_e_<_ _T_ _> │ │ │ │ │ +  Check if type is a statically sized container. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_o_t_a_t_e_T_u_p_l_e_<_ _T_ _> │ │ │ │ │ -  Rotate type list by one, such that last entry is moved to first │ │ │ │ │ - position. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_t_a_t_i_c_S_i_z_e_O_r_Z_e_r_o_<_ _T_ _> │ │ │ │ │ +  Obtain size of statically sized container, or 0 if dynamic size. │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ TTyyppeeddeeffss │ │ │ │ │ -template class T, class ArgTuple > │ │ │ │ │ -using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_a_n_d_T_u_p_l_e = typename Imp::ExpandTupleHelper< T, │ │ │ │ │ - ArgTuple >::Type │ │ │ │ │ -  Expand tuple arguments as template arguments. │ │ │ │ │ -  │ │ │ │ │ -template class F, class... Tuples> │ │ │ │ │ -using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_r_a_n_s_f_o_r_m_T_u_p_l_e = typename Imp::TransformTupleHelper< F, │ │ │ │ │ - Tuples... >::Type │ │ │ │ │ -  Transform tuple types argument using type-functor. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_n_t_e_g_e_r_S_e_q_u_e_n_c_e_T_u_p_l_e = typename Imp:: │ │ │ │ │ - IntegerSequenceTupleHelper< IntegerSequence >::Type │ │ │ │ │ -  Transform integer_sequence to tuple...> │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_o_r_w_a_r_d_A_s_S_t_a_t_i_c_I_n_t_e_g_e_r (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  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_o_r_w_a_r_d_A_s_S_t_a_t_i_c_I_n_t_e_g_e_r (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  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_o_r_w_a_r_d_A_s_S_t_a_t_i_c_I_n_d_e_x (const size_type &i, F &&f, Args │ │ │ │ │ - &&... args) -> decltype(f(Dune::Indices::_0, std::forward< Args > │ │ │ │ │ - (args)...)) │ │ │ │ │ -  Transform dynamic index to static index_constant. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_t_r_a_n_s_f_o_r_m_T_u_p_l_e (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. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_t_r_a_n_s_f_o_r_m_T_u_p_l_e (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. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_a_l_l_a_b_l_e_C_h_e_c_k (Expression f) │ │ │ │ │ -  Create a predicate for checking validity of expressions. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_n_e_g_a_t_e_P_r_e_d_i_c_a_t_e (Check check) │ │ │ │ │ -  Negate given predicate. │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_e_n_a_b_l_e_I_f_C_o_n_s_t_r_u_c_t_i_b_l_e = std::enable_if_t< std:: │ │ │ │ │ + is_constructible_v< T, Args... >, int > │ │ │ │ │ +  Helper to constrain forwarding constructors. │ │ │ │ │   │ │ │ │ │ template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_o_r_w_a_r_d_C_a_p_t_u_r_e (T &&t) │ │ │ │ │ -  Create a capture object for perfect forwarding. │ │ │ │ │ +using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_t_a_t_i_c_S_i_z_e = std::enable_if_t< _H_a_s_S_t_a_t_i_c_S_i_z_e___v< T >, │ │ │ │ │ + decltype(Dune::Hybrid::size(std::declval< T >()))> │ │ │ │ │ +  Obtain size of statically sized container as integral_constant, or fail. │ │ │ │ │ +  │ │ │ │ │ +VVaarriiaabblleess │ │ │ │ │ +template │ │ │ │ │ +constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_a_s_S_t_a_t_i_c_S_i_z_e___v = _H_a_s_S_t_a_t_i_c_S_i_z_e::value │ │ │ │ │ +  A variable template representing the value of _H_a_s_S_t_a_t_i_c_S_i_z_e. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./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 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,308 +74,75 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_COMMON_UTILITY_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_COMMON_UTILITY_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_COMMON_TYPE_TRAITS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_COMMON_TYPE_TRAITS_HH
│ │ │ │
9
│ │ │ │ -
10
│ │ │ │ -
11#include <utility>
│ │ │ │ -
12#include <type_traits>
│ │ │ │ -
13
│ │ │ │ -
14#include <dune/common/overloadset.hh>
│ │ │ │ -
15#include <dune/common/indices.hh>
│ │ │ │ -
16
│ │ │ │ - │ │ │ │ +
10#include <type_traits>
│ │ │ │ +
11
│ │ │ │ +
12#include <dune/common/hybridutilities.hh>
│ │ │ │ +
13#include <dune/common/typeutilities.hh>
│ │ │ │ +
14
│ │ │ │ +
15namespace Dune {
│ │ │ │ +
16namespace Functions {
│ │ │ │ +
17
│ │ │ │
18
│ │ │ │ -
19namespace Dune {
│ │ │ │ -
20namespace Functions {
│ │ │ │ -
21
│ │ │ │ -
22
│ │ │ │ -
23
│ │ │ │ -
24template<class F, class size_type, size_type firstValue, class... Args>
│ │ │ │ -
│ │ │ │ -
25auto forwardAsStaticInteger(std::integer_sequence<size_type, firstValue> values, const size_type& i, F&& f, Args&&... args)
│ │ │ │ -
26 ->decltype(f(std::integral_constant<size_type, firstValue>(), std::forward<Args>(args)...))
│ │ │ │ -
27{
│ │ │ │ -
28 return f(std::integral_constant<size_type, firstValue>(), std::forward<Args>(args)...);
│ │ │ │ -
29}
│ │ │ │ -
│ │ │ │ -
30
│ │ │ │ -
31template<class F, class size_type, size_type firstValue, size_type secondValue, size_type... otherValues, class... Args>
│ │ │ │ -
│ │ │ │ -
32auto forwardAsStaticInteger(std::integer_sequence<size_type, firstValue, secondValue, otherValues...> values, const size_type i, F&& f, Args&&... args)
│ │ │ │ -
33 ->decltype(f(std::integral_constant<size_type, firstValue>(), std::forward<Args>(args)...))
│ │ │ │ -
34{
│ │ │ │ -
35 if (i==firstValue)
│ │ │ │ -
36 return f(std::integral_constant<size_type, firstValue>(), std::forward<Args>(args)...);
│ │ │ │ -
37 return forwardAsStaticInteger(std::integer_sequence<size_type, secondValue, otherValues...>(), i, std::forward<F>(f), std::forward<Args>(args)...);
│ │ │ │ -
38}
│ │ │ │ -
│ │ │ │ -
39
│ │ │ │ -
40
│ │ │ │ -
41
│ │ │ │ -
63template<std::size_t end, class F, class size_type, class... Args>
│ │ │ │ -
│ │ │ │ -
64auto forwardAsStaticIndex(const size_type& i, F&& f, Args&&... args)
│ │ │ │ -
65 ->decltype(f(Dune::Indices::_0, std::forward<Args>(args)...))
│ │ │ │ -
66{
│ │ │ │ -
67 return forwardAsStaticInteger(std::make_index_sequence<end>{}, i, std::forward<F>(f), std::forward<Args>(args)...);
│ │ │ │ -
68}
│ │ │ │ -
│ │ │ │ -
69
│ │ │ │ -
70
│ │ │ │ -
71
│ │ │ │ -
72namespace Imp {
│ │ │ │ +
29template<class T, class... Args>
│ │ │ │ +
30using enableIfConstructible = std::enable_if_t<
│ │ │ │ +
31 std::is_constructible_v<T, Args...>, int>;
│ │ │ │ +
32
│ │ │ │ +
33
│ │ │ │ +
34
│ │ │ │ +
42template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
44 public IsIntegralConstant<decltype(Dune::Hybrid::size(std::declval<T>()))>
│ │ │ │ +
45{};
│ │ │ │ +
│ │ │ │ +
46
│ │ │ │ +
48template<class T>
│ │ │ │ + │ │ │ │ +
50
│ │ │ │ +
51
│ │ │ │ +
59template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
61 public std::conditional_t<HasStaticSize_v<T>,
│ │ │ │ +
62 decltype(Dune::Hybrid::size(std::declval<T>())),
│ │ │ │ +
63 std::integral_constant<std::size_t,0>>
│ │ │ │ +
64{};
│ │ │ │ +
│ │ │ │ +
65
│ │ │ │ +
70template<class T>
│ │ │ │ +
71using StaticSize = std::enable_if_t<HasStaticSize_v<T>,
│ │ │ │ +
72 decltype(Dune::Hybrid::size(std::declval<T>()))>;
│ │ │ │
73
│ │ │ │ -
74 template<template<class...> class T, class List>
│ │ │ │ -
75 struct ExpandTupleHelper
│ │ │ │ -
76 {};
│ │ │ │ -
77
│ │ │ │ -
78 template<template<class...> class T, template<class...> class ListType, class... Args>
│ │ │ │ -
79 struct ExpandTupleHelper<T, ListType<Args...>>
│ │ │ │ -
80 {
│ │ │ │ -
81 using Type = T<Args...>;
│ │ │ │ -
82 };
│ │ │ │ -
83
│ │ │ │ -
84} // end namespace Imp
│ │ │ │ -
85
│ │ │ │ -
97template<template<class...> class T, class ArgTuple>
│ │ │ │ -
98using ExpandTuple = typename Imp::ExpandTupleHelper<T, ArgTuple>::Type;
│ │ │ │ -
99
│ │ │ │ -
100
│ │ │ │ -
101
│ │ │ │ -
102namespace Imp {
│ │ │ │ -
103
│ │ │ │ -
104 template<template<class...> class T, class... Tuple>
│ │ │ │ -
105 struct TransformTupleHelper
│ │ │ │ -
106 {};
│ │ │ │ -
107
│ │ │ │ -
108 template<template<class...> class T, class... Args1>
│ │ │ │ -
109 struct TransformTupleHelper<T, typename std::tuple<Args1...>>
│ │ │ │ -
110 {
│ │ │ │ -
111 using Type = std::tuple<T<Args1>...>;
│ │ │ │ -
112 };
│ │ │ │ -
113
│ │ │ │ -
114 template<template<class...> class T, class... Args1, class... Args2>
│ │ │ │ -
115 struct TransformTupleHelper<T, typename std::tuple<Args1...>, typename std::tuple<Args2...>>
│ │ │ │ -
116 {
│ │ │ │ -
117 using Type = std::tuple<T<Args1, Args2>...>;
│ │ │ │ -
118 };
│ │ │ │ -
119
│ │ │ │ -
120} // end namespace Imp
│ │ │ │ -
121
│ │ │ │ -
134template<template<class...> class F, class... Tuples>
│ │ │ │ -
135using TransformTuple = typename Imp::TransformTupleHelper<F, Tuples...>::Type;
│ │ │ │ -
136
│ │ │ │ -
137
│ │ │ │ -
138
│ │ │ │ -
139namespace Imp {
│ │ │ │ -
140
│ │ │ │ -
141 template<class F, class... T, std::size_t... k>
│ │ │ │ -
142 auto transformTupleHelper(F&& f, const std::tuple<T...>& tuple, std::index_sequence<k...>)
│ │ │ │ -
143 -> decltype(std::make_tuple(f(std::get<k>(tuple))...))
│ │ │ │ -
144 {
│ │ │ │ -
145 return std::make_tuple(f(std::get<k>(tuple))...);
│ │ │ │ -
146 }
│ │ │ │ -
147
│ │ │ │ -
148 template<class F, class... T1, class...T2, std::size_t... k>
│ │ │ │ -
149 auto transformTupleHelper(F&& f, const std::tuple<T1...>& tuple1, const std::tuple<T2...>& tuple2, std::index_sequence<k...>)
│ │ │ │ -
150 -> decltype(std::make_tuple(f(std::get<k>(tuple1), std::get<k>(tuple2))...))
│ │ │ │ -
151 {
│ │ │ │ -
152 return std::make_tuple(f(std::get<k>(tuple1), std::get<k>(tuple2))...);
│ │ │ │ -
153 }
│ │ │ │ -
154
│ │ │ │ -
155} // end namespace Imp
│ │ │ │ -
156
│ │ │ │ -
168template<class F, class... T>
│ │ │ │ -
│ │ │ │ -
169auto transformTuple(F&& f, const std::tuple<T...>& tuple)
│ │ │ │ -
170 -> decltype(Imp::transformTupleHelper(std::forward<F>(f), tuple, std::index_sequence_for<T...>{}))
│ │ │ │ -
171{
│ │ │ │ -
172 return Imp::transformTupleHelper(std::forward<F>(f), tuple, std::index_sequence_for<T...>{});
│ │ │ │ -
173}
│ │ │ │ -
│ │ │ │ -
174
│ │ │ │ -
188template<class F, class... T1, class... T2>
│ │ │ │ -
│ │ │ │ -
189auto transformTuple(F&& f, const std::tuple<T1...>& tuple1, const std::tuple<T2...>& tuple2)
│ │ │ │ -
190 -> decltype(Imp::transformTupleHelper(std::forward<F>(f), tuple1, tuple2, std::index_sequence_for<T1...>{}))
│ │ │ │ -
191{
│ │ │ │ -
192 return Imp::transformTupleHelper(std::forward<F>(f), tuple1, tuple2, std::index_sequence_for<T1...>{});
│ │ │ │ -
193}
│ │ │ │ -
│ │ │ │ -
194
│ │ │ │ -
195
│ │ │ │ -
196
│ │ │ │ -
197namespace Imp {
│ │ │ │ -
198
│ │ │ │ -
199 template<class IntegerSequence>
│ │ │ │ -
200 struct IntegerSequenceTupleHelper
│ │ │ │ -
201 {};
│ │ │ │ -
202
│ │ │ │ -
203 template<class I, I... k>
│ │ │ │ -
204 struct IntegerSequenceTupleHelper<std::integer_sequence<I, k...>>
│ │ │ │ -
205 {
│ │ │ │ -
206 using Type = std::tuple<std::integral_constant<I, k>...>;
│ │ │ │ -
207 };
│ │ │ │ -
208
│ │ │ │ -
209} // end namespace Imp
│ │ │ │ -
210
│ │ │ │ -
214template<class IntegerSequence>
│ │ │ │ -
215using IntegerSequenceTuple= typename Imp::IntegerSequenceTupleHelper<IntegerSequence>::Type;
│ │ │ │ -
216
│ │ │ │ -
217
│ │ │ │ -
218
│ │ │ │ -
224template<class... T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
226{
│ │ │ │ -
227 using type = std::tuple_element_t<sizeof...(T)-1, std::tuple<T...>>;
│ │ │ │ -
228};
│ │ │ │ -
│ │ │ │ -
229
│ │ │ │ -
230
│ │ │ │ -
231
│ │ │ │ -
232namespace Imp {
│ │ │ │ -
233
│ │ │ │ -
234template<class T, class I>
│ │ │ │ -
235struct RotateHelper;
│ │ │ │ -
236
│ │ │ │ -
237template<class... T, std::size_t... I>
│ │ │ │ -
238struct RotateHelper<std::tuple<T...>, std::index_sequence<I...> >
│ │ │ │ -
239{
│ │ │ │ -
240 using type = typename std::tuple<typename LastType<T...>::type, std::tuple_element_t<I,std::tuple<T...>>...>;
│ │ │ │ -
241};
│ │ │ │ -
242
│ │ │ │ -
243} // end namespace Imp
│ │ │ │ -
244
│ │ │ │ -
245
│ │ │ │ -
253template<class... T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
255{
│ │ │ │ -
256 using type = typename Imp::RotateHelper<std::tuple<T...>, std::make_index_sequence<sizeof...(T)-1>>::type;
│ │ │ │ -
257};
│ │ │ │ -
│ │ │ │ -
258
│ │ │ │ -
259
│ │ │ │ -
260
│ │ │ │ -
282template<class Expression>
│ │ │ │ -
│ │ │ │ -
283auto callableCheck(Expression f)
│ │ │ │ -
284{
│ │ │ │ -
285 return [f](auto&&... args){
│ │ │ │ -
286 return Functions::Concept::isCallable(f, std::forward<decltype(args)>(args)...);
│ │ │ │ -
287 };
│ │ │ │ -
288}
│ │ │ │ -
│ │ │ │ -
289
│ │ │ │ -
290
│ │ │ │ -
291
│ │ │ │ -
307template<class Check>
│ │ │ │ -
│ │ │ │ -
308auto negatePredicate(Check check)
│ │ │ │ -
309{
│ │ │ │ -
310 return [check](auto&&... args){
│ │ │ │ -
311 auto negate = overload(
│ │ │ │ -
312 [](std::true_type) { return std::false_type{};},
│ │ │ │ -
313 [](std::false_type) { return std::true_type{};},
│ │ │ │ -
314 [](bool v) { return not v;});
│ │ │ │ -
315 return negate(check(std::forward<decltype(args)>(args)...));
│ │ │ │ -
316 };
│ │ │ │ -
317}
│ │ │ │ -
│ │ │ │ -
318
│ │ │ │ -
319
│ │ │ │ -
320namespace Impl {
│ │ │ │ -
321
│ │ │ │ -
322 // Wrapper to capture values in a lambda for perfect forwarding.
│ │ │ │ -
323 // This captures value types by value and reference types by reference.
│ │ │ │ -
324 template <typename T>
│ │ │ │ -
325 struct ForwardCaptureWrapper;
│ │ │ │ -
326
│ │ │ │ -
327 template <typename T>
│ │ │ │ -
328 struct ForwardCaptureWrapper
│ │ │ │ -
329 {
│ │ │ │ -
330 template <typename TT>
│ │ │ │ -
331 ForwardCaptureWrapper(TT&& t) : t_{std::forward<TT>(t)} {}
│ │ │ │ -
332
│ │ │ │ -
333 auto forward() const { return std::move(t_); }
│ │ │ │ -
334
│ │ │ │ -
335 T t_;
│ │ │ │ -
336 };
│ │ │ │ -
337
│ │ │ │ -
338 template <typename T>
│ │ │ │ -
339 struct ForwardCaptureWrapper<T&>
│ │ │ │ -
340 {
│ │ │ │ -
341 ForwardCaptureWrapper(T& t) : t_{t} {}
│ │ │ │ -
342
│ │ │ │ -
343 T& forward() const { return t_; };
│ │ │ │ -
344
│ │ │ │ -
345 T& t_;
│ │ │ │ -
346 };
│ │ │ │ -
347
│ │ │ │ -
348 template <typename T>
│ │ │ │ -
349 struct ForwardCaptureWrapper<const T&>
│ │ │ │ -
350 {
│ │ │ │ -
351 ForwardCaptureWrapper(const T& t) : t_{t} {}
│ │ │ │ -
352
│ │ │ │ -
353 const T& forward() const { return t_; };
│ │ │ │ -
354
│ │ │ │ -
355 const T& t_;
│ │ │ │ -
356 };
│ │ │ │ -
357
│ │ │ │ -
358} // end namespace Dune::Functions::Impl
│ │ │ │ -
359
│ │ │ │ -
360
│ │ │ │ -
361
│ │ │ │ -
375template <class T>
│ │ │ │ -
│ │ │ │ -
376auto forwardCapture(T&& t)
│ │ │ │ -
377{
│ │ │ │ -
378 return Impl::ForwardCaptureWrapper<T>(std::forward<T>(t));
│ │ │ │ -
379}
│ │ │ │ -
│ │ │ │ -
380
│ │ │ │ -
381
│ │ │ │ -
382
│ │ │ │ -
383} // namespace Dune::Functions
│ │ │ │ -
384} // namespace Dune
│ │ │ │ -
385
│ │ │ │ -
386
│ │ │ │ -
387#endif // DUNE_FUNCTIONS_COMMON_UTILITY_HH
│ │ │ │ - │ │ │ │ -
typename Imp::ExpandTupleHelper< T, ArgTuple >::Type ExpandTuple
Expand tuple arguments as template arguments.
Definition utility.hh:98
│ │ │ │ -
typename Imp::TransformTupleHelper< F, Tuples... >::Type TransformTuple
Transform tuple types argument using type-functor.
Definition utility.hh:135
│ │ │ │ -
static constexpr auto isCallable()
Check if f is callable with given argument list.
Definition functionconcepts.hh:51
│ │ │ │ -
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:169
│ │ │ │ -
auto callableCheck(Expression f)
Create a predicate for checking validity of expressions.
Definition utility.hh:283
│ │ │ │ -
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:64
│ │ │ │ -
auto negatePredicate(Check check)
Negate given predicate.
Definition utility.hh:308
│ │ │ │ +
74
│ │ │ │ +
75}} // namespace Dune::Functions
│ │ │ │ +
76
│ │ │ │ +
77#endif // DUNE_FUNCTIONS_COMMON_TYPE_TRAITS_HH
│ │ │ │ +
std::enable_if_t< std::is_constructible_v< T, Args... >, int > enableIfConstructible
Helper to constrain forwarding constructors.
Definition type_traits.hh:31
│ │ │ │ +
std::enable_if_t< HasStaticSize_v< T >, decltype(Dune::Hybrid::size(std::declval< T >()))> StaticSize
Obtain size of statically sized container as integral_constant, or fail.
Definition type_traits.hh:72
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
auto forwardCapture(T &&t)
Create a capture object for perfect forwarding.
Definition utility.hh:376
│ │ │ │ -
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:25
│ │ │ │ -
typename Imp::IntegerSequenceTupleHelper< IntegerSequence >::Type IntegerSequenceTuple
Transform integer_sequence<I,k...> to tuple<integral_constant<I,k>...>
Definition utility.hh:215
│ │ │ │ -
Get last entry of type list.
Definition utility.hh:226
│ │ │ │ -
std::tuple_element_t< sizeof...(T) -1, std::tuple< T... > > type
Definition utility.hh:227
│ │ │ │ -
Rotate type list by one, such that last entry is moved to first position.
Definition utility.hh:255
│ │ │ │ -
typename Imp::RotateHelper< std::tuple< T... >, std::make_index_sequence< sizeof...(T) -1 > >::type type
Definition utility.hh:256
│ │ │ │ +
constexpr bool HasStaticSize_v
A variable template representing the value of HasStaticSize.
Definition type_traits.hh:49
│ │ │ │ +
Check if type is a statically sized container.
Definition type_traits.hh:45
│ │ │ │ +
Obtain size of statically sized container, or 0 if dynamic size.
Definition type_traits.hh:64
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,353 +1,83 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -utility.hh │ │ │ │ │ +type_traits.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_COMMON_UTILITY_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_COMMON_UTILITY_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_COMMON_TYPE_TRAITS_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_COMMON_TYPE_TRAITS_HH │ │ │ │ │ 9 │ │ │ │ │ -10 │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13 │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16 │ │ │ │ │ -17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +10#include │ │ │ │ │ +11 │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14 │ │ │ │ │ +15namespace _D_u_n_e { │ │ │ │ │ +16namespace Functions { │ │ │ │ │ +17 │ │ │ │ │ 18 │ │ │ │ │ -19namespace _D_u_n_e { │ │ │ │ │ -20namespace Functions { │ │ │ │ │ -21 │ │ │ │ │ -22 │ │ │ │ │ -23 │ │ │ │ │ -24template │ │ │ │ │ -_2_5auto _f_o_r_w_a_r_d_A_s_S_t_a_t_i_c_I_n_t_e_g_e_r(std::integer_sequence │ │ │ │ │ -values, const size_type& i, F&& f, Args&&... args) │ │ │ │ │ -26 ->decltype(f(std::integral_constant(), std:: │ │ │ │ │ -forward(args)...)) │ │ │ │ │ -27{ │ │ │ │ │ -28 return f(std::integral_constant(), std::forward │ │ │ │ │ -(args)...); │ │ │ │ │ -29} │ │ │ │ │ -30 │ │ │ │ │ -31template │ │ │ │ │ -_3_2auto _f_o_r_w_a_r_d_A_s_S_t_a_t_i_c_I_n_t_e_g_e_r(std::integer_sequence values, const size_type i, F&& f, Args&&... args) │ │ │ │ │ -33 ->decltype(f(std::integral_constant(), std:: │ │ │ │ │ -forward(args)...)) │ │ │ │ │ -34{ │ │ │ │ │ -35 if (i==firstValue) │ │ │ │ │ -36 return f(std::integral_constant(), std::forward │ │ │ │ │ -(args)...); │ │ │ │ │ -37 return _f_o_r_w_a_r_d_A_s_S_t_a_t_i_c_I_n_t_e_g_e_r(std::integer_sequence(), i, std::forward(f), std::forward(args)...); │ │ │ │ │ -38} │ │ │ │ │ -39 │ │ │ │ │ -40 │ │ │ │ │ -41 │ │ │ │ │ -63template │ │ │ │ │ -_6_4auto _f_o_r_w_a_r_d_A_s_S_t_a_t_i_c_I_n_d_e_x(const size_type& i, F&& f, Args&&... args) │ │ │ │ │ -65 ->decltype(f(Dune::Indices::_0, std::forward(args)...)) │ │ │ │ │ -66{ │ │ │ │ │ -67 return _f_o_r_w_a_r_d_A_s_S_t_a_t_i_c_I_n_t_e_g_e_r(std::make_index_sequence{}, i, std:: │ │ │ │ │ -forward(f), std::forward(args)...); │ │ │ │ │ -68} │ │ │ │ │ -69 │ │ │ │ │ -70 │ │ │ │ │ -71 │ │ │ │ │ -72namespace Imp { │ │ │ │ │ +29template │ │ │ │ │ +_3_0using _e_n_a_b_l_e_I_f_C_o_n_s_t_r_u_c_t_i_b_l_e = std::enable_if_t< │ │ │ │ │ +31 std::is_constructible_v, int>; │ │ │ │ │ +32 │ │ │ │ │ +33 │ │ │ │ │ +34 │ │ │ │ │ +42template │ │ │ │ │ +_4_3struct _H_a_s_S_t_a_t_i_c_S_i_z_e : │ │ │ │ │ +44 public IsIntegralConstant()))> │ │ │ │ │ +45{}; │ │ │ │ │ +46 │ │ │ │ │ +48template │ │ │ │ │ +_4_9inline constexpr bool _H_a_s_S_t_a_t_i_c_S_i_z_e___v = _H_a_s_S_t_a_t_i_c_S_i_z_e_<_T_>_:_:_v_a_l_u_e; │ │ │ │ │ +50 │ │ │ │ │ +51 │ │ │ │ │ +59template │ │ │ │ │ +_6_0struct _S_t_a_t_i_c_S_i_z_e_O_r_Z_e_r_o : │ │ │ │ │ +61 public std::conditional_t, │ │ │ │ │ +62 decltype(Dune::Hybrid::size(std::declval())), │ │ │ │ │ +63 std::integral_constant> │ │ │ │ │ +64{}; │ │ │ │ │ +65 │ │ │ │ │ +70template │ │ │ │ │ +_7_1using _S_t_a_t_i_c_S_i_z_e = std::enable_if_t, │ │ │ │ │ +72 decltype(Dune::Hybrid::size(std::declval()))>; │ │ │ │ │ 73 │ │ │ │ │ -74 template class T, class List> │ │ │ │ │ -75 struct ExpandTupleHelper │ │ │ │ │ -76 {}; │ │ │ │ │ -77 │ │ │ │ │ -78 template class T, template class ListType, │ │ │ │ │ -class... Args> │ │ │ │ │ -79 struct ExpandTupleHelper> │ │ │ │ │ -80 { │ │ │ │ │ -81 using Type = T; │ │ │ │ │ -82 }; │ │ │ │ │ -83 │ │ │ │ │ -84} // end namespace Imp │ │ │ │ │ -85 │ │ │ │ │ -97template class T, class ArgTuple> │ │ │ │ │ -_9_8using _E_x_p_a_n_d_T_u_p_l_e = typename Imp::ExpandTupleHelper::Type; │ │ │ │ │ -99 │ │ │ │ │ -100 │ │ │ │ │ -101 │ │ │ │ │ -102namespace Imp { │ │ │ │ │ -103 │ │ │ │ │ -104 template class T, class... Tuple> │ │ │ │ │ -105 struct TransformTupleHelper │ │ │ │ │ -106 {}; │ │ │ │ │ -107 │ │ │ │ │ -108 template class T, class... Args1> │ │ │ │ │ -109 struct TransformTupleHelper> │ │ │ │ │ -110 { │ │ │ │ │ -111 using Type = std::tuple...>; │ │ │ │ │ -112 }; │ │ │ │ │ -113 │ │ │ │ │ -114 template class T, class... Args1, class... Args2> │ │ │ │ │ -115 struct TransformTupleHelper, typename │ │ │ │ │ -std::tuple> │ │ │ │ │ -116 { │ │ │ │ │ -117 using Type = std::tuple...>; │ │ │ │ │ -118 }; │ │ │ │ │ -119 │ │ │ │ │ -120} // end namespace Imp │ │ │ │ │ -121 │ │ │ │ │ -134template class F, class... Tuples> │ │ │ │ │ -_1_3_5using _T_r_a_n_s_f_o_r_m_T_u_p_l_e = typename Imp::TransformTupleHelper:: │ │ │ │ │ -Type; │ │ │ │ │ -136 │ │ │ │ │ -137 │ │ │ │ │ -138 │ │ │ │ │ -139namespace Imp { │ │ │ │ │ -140 │ │ │ │ │ -141 template │ │ │ │ │ -142 auto transformTupleHelper(F&& f, const std::tuple& tuple, std:: │ │ │ │ │ -index_sequence) │ │ │ │ │ -143 -> decltype(std::make_tuple(f(std::get(tuple))...)) │ │ │ │ │ -144 { │ │ │ │ │ -145 return std::make_tuple(f(std::get(tuple))...); │ │ │ │ │ -146 } │ │ │ │ │ -147 │ │ │ │ │ -148 template │ │ │ │ │ -149 auto transformTupleHelper(F&& f, const std::tuple& tuple1, const │ │ │ │ │ -std::tuple& tuple2, std::index_sequence) │ │ │ │ │ -150 -> decltype(std::make_tuple(f(std::get(tuple1), std::get │ │ │ │ │ -(tuple2))...)) │ │ │ │ │ -151 { │ │ │ │ │ -152 return std::make_tuple(f(std::get(tuple1), std::get(tuple2))...); │ │ │ │ │ -153 } │ │ │ │ │ -154 │ │ │ │ │ -155} // end namespace Imp │ │ │ │ │ -156 │ │ │ │ │ -168template │ │ │ │ │ -_1_6_9auto _t_r_a_n_s_f_o_r_m_T_u_p_l_e(F&& f, const std::tuple& tuple) │ │ │ │ │ -170 -> decltype(Imp::transformTupleHelper(std::forward(f), tuple, std:: │ │ │ │ │ -index_sequence_for{})) │ │ │ │ │ -171{ │ │ │ │ │ -172 return Imp::transformTupleHelper(std::forward(f), tuple, std:: │ │ │ │ │ -index_sequence_for{}); │ │ │ │ │ -173} │ │ │ │ │ -174 │ │ │ │ │ -188template │ │ │ │ │ -_1_8_9auto _t_r_a_n_s_f_o_r_m_T_u_p_l_e(F&& f, const std::tuple& tuple1, const std:: │ │ │ │ │ -tuple& tuple2) │ │ │ │ │ -190 -> decltype(Imp::transformTupleHelper(std::forward(f), tuple1, tuple2, │ │ │ │ │ -std::index_sequence_for{})) │ │ │ │ │ -191{ │ │ │ │ │ -192 return Imp::transformTupleHelper(std::forward(f), tuple1, tuple2, std:: │ │ │ │ │ -index_sequence_for{}); │ │ │ │ │ -193} │ │ │ │ │ -194 │ │ │ │ │ -195 │ │ │ │ │ -196 │ │ │ │ │ -197namespace Imp { │ │ │ │ │ -198 │ │ │ │ │ -199 template │ │ │ │ │ -200 struct IntegerSequenceTupleHelper │ │ │ │ │ -201 {}; │ │ │ │ │ -202 │ │ │ │ │ -203 template │ │ │ │ │ -204 struct IntegerSequenceTupleHelper> │ │ │ │ │ -205 { │ │ │ │ │ -206 using Type = std::tuple...>; │ │ │ │ │ -207 }; │ │ │ │ │ -208 │ │ │ │ │ -209} // end namespace Imp │ │ │ │ │ -210 │ │ │ │ │ -214template │ │ │ │ │ -_2_1_5using _I_n_t_e_g_e_r_S_e_q_u_e_n_c_e_T_u_p_l_e= typename Imp:: │ │ │ │ │ -IntegerSequenceTupleHelper::Type; │ │ │ │ │ -216 │ │ │ │ │ -217 │ │ │ │ │ -218 │ │ │ │ │ -224template │ │ │ │ │ -_2_2_5struct _L_a_s_t_T_y_p_e │ │ │ │ │ -226{ │ │ │ │ │ -_2_2_7 using _t_y_p_e = std::tuple_element_t>; │ │ │ │ │ -228}; │ │ │ │ │ -229 │ │ │ │ │ -230 │ │ │ │ │ -231 │ │ │ │ │ -232namespace Imp { │ │ │ │ │ -233 │ │ │ │ │ -234template │ │ │ │ │ -235struct RotateHelper; │ │ │ │ │ -236 │ │ │ │ │ -237template │ │ │ │ │ -238struct RotateHelper, std::index_sequence > │ │ │ │ │ -239{ │ │ │ │ │ -240 using type = typename std::tuple::type, std:: │ │ │ │ │ -tuple_element_t>...>; │ │ │ │ │ -241}; │ │ │ │ │ -242 │ │ │ │ │ -243} // end namespace Imp │ │ │ │ │ -244 │ │ │ │ │ -245 │ │ │ │ │ -253template │ │ │ │ │ -_2_5_4struct _R_o_t_a_t_e_T_u_p_l_e │ │ │ │ │ -255{ │ │ │ │ │ -_2_5_6 using _t_y_p_e = typename Imp::RotateHelper, std:: │ │ │ │ │ -make_index_sequence>_:_:_t_y_p_e; │ │ │ │ │ -257}; │ │ │ │ │ -258 │ │ │ │ │ -259 │ │ │ │ │ -260 │ │ │ │ │ -282template │ │ │ │ │ -_2_8_3auto _c_a_l_l_a_b_l_e_C_h_e_c_k(Expression f) │ │ │ │ │ -284{ │ │ │ │ │ -285 return [f](auto&&... args){ │ │ │ │ │ -286 return _F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_C_a_l_l_a_b_l_e(f, std::forward │ │ │ │ │ -(args)...); │ │ │ │ │ -287 }; │ │ │ │ │ -288} │ │ │ │ │ -289 │ │ │ │ │ -290 │ │ │ │ │ -291 │ │ │ │ │ -307template │ │ │ │ │ -_3_0_8auto _n_e_g_a_t_e_P_r_e_d_i_c_a_t_e(Check check) │ │ │ │ │ -309{ │ │ │ │ │ -310 return [check](auto&&... args){ │ │ │ │ │ -311 auto negate = overload( │ │ │ │ │ -312 [](std::true_type) { return std::false_type{};}, │ │ │ │ │ -313 [](std::false_type) { return std::true_type{};}, │ │ │ │ │ -314 [](bool v) { return not v;}); │ │ │ │ │ -315 return negate(check(std::forward(args)...)); │ │ │ │ │ -316 }; │ │ │ │ │ -317} │ │ │ │ │ -318 │ │ │ │ │ -319 │ │ │ │ │ -320namespace Impl { │ │ │ │ │ -321 │ │ │ │ │ -322 // Wrapper to capture values in a lambda for perfect forwarding. │ │ │ │ │ -323 // This captures value types by value and reference types by reference. │ │ │ │ │ -324 template │ │ │ │ │ -325 struct ForwardCaptureWrapper; │ │ │ │ │ -326 │ │ │ │ │ -327 template │ │ │ │ │ -328 struct ForwardCaptureWrapper │ │ │ │ │ -329 { │ │ │ │ │ -330 template │ │ │ │ │ -331 ForwardCaptureWrapper(TT&& t) : t_{std::forward(t)} {} │ │ │ │ │ -332 │ │ │ │ │ -333 auto forward() const { return std::move(t_); } │ │ │ │ │ -334 │ │ │ │ │ -335 T t_; │ │ │ │ │ -336 }; │ │ │ │ │ -337 │ │ │ │ │ -338 template │ │ │ │ │ -339 struct ForwardCaptureWrapper │ │ │ │ │ -340 { │ │ │ │ │ -341 ForwardCaptureWrapper(T& t) : t_{t} {} │ │ │ │ │ -342 │ │ │ │ │ -343 T& forward() const { return t_; }; │ │ │ │ │ -344 │ │ │ │ │ -345 T& t_; │ │ │ │ │ -346 }; │ │ │ │ │ -347 │ │ │ │ │ -348 template │ │ │ │ │ -349 struct ForwardCaptureWrapper │ │ │ │ │ -350 { │ │ │ │ │ -351 ForwardCaptureWrapper(const T& t) : t_{t} {} │ │ │ │ │ -352 │ │ │ │ │ -353 const T& forward() const { return t_; }; │ │ │ │ │ -354 │ │ │ │ │ -355 const T& t_; │ │ │ │ │ -356 }; │ │ │ │ │ -357 │ │ │ │ │ -358} // end namespace Dune::Functions::Impl │ │ │ │ │ -359 │ │ │ │ │ -360 │ │ │ │ │ -361 │ │ │ │ │ -375template │ │ │ │ │ -_3_7_6auto _f_o_r_w_a_r_d_C_a_p_t_u_r_e(T&& t) │ │ │ │ │ -377{ │ │ │ │ │ -378 return Impl::ForwardCaptureWrapper(std::forward(t)); │ │ │ │ │ -379} │ │ │ │ │ -380 │ │ │ │ │ -381 │ │ │ │ │ -382 │ │ │ │ │ -383} // namespace Dune::Functions │ │ │ │ │ -384} // namespace Dune │ │ │ │ │ -385 │ │ │ │ │ -386 │ │ │ │ │ -387#endif // DUNE_FUNCTIONS_COMMON_UTILITY_HH │ │ │ │ │ -_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_a_n_d_T_u_p_l_e │ │ │ │ │ -typename Imp::ExpandTupleHelper< T, ArgTuple >::Type ExpandTuple │ │ │ │ │ -Expand tuple arguments as template arguments. │ │ │ │ │ -DDeeffiinniittiioonn utility.hh:98 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_r_a_n_s_f_o_r_m_T_u_p_l_e │ │ │ │ │ -typename Imp::TransformTupleHelper< F, Tuples... >::Type TransformTuple │ │ │ │ │ -Transform tuple types argument using type-functor. │ │ │ │ │ -DDeeffiinniittiioonn utility.hh:135 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_C_a_l_l_a_b_l_e │ │ │ │ │ -static constexpr auto isCallable() │ │ │ │ │ -Check if f is callable with given argument list. │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:51 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_t_r_a_n_s_f_o_r_m_T_u_p_l_e │ │ │ │ │ -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. │ │ │ │ │ -DDeeffiinniittiioonn utility.hh:169 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_a_l_l_a_b_l_e_C_h_e_c_k │ │ │ │ │ -auto callableCheck(Expression f) │ │ │ │ │ -Create a predicate for checking validity of expressions. │ │ │ │ │ -DDeeffiinniittiioonn utility.hh:283 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_o_r_w_a_r_d_A_s_S_t_a_t_i_c_I_n_d_e_x │ │ │ │ │ -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. │ │ │ │ │ -DDeeffiinniittiioonn utility.hh:64 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_n_e_g_a_t_e_P_r_e_d_i_c_a_t_e │ │ │ │ │ -auto negatePredicate(Check check) │ │ │ │ │ -Negate given predicate. │ │ │ │ │ -DDeeffiinniittiioonn utility.hh:308 │ │ │ │ │ +74 │ │ │ │ │ +75}} // namespace Dune::Functions │ │ │ │ │ +76 │ │ │ │ │ +77#endif // DUNE_FUNCTIONS_COMMON_TYPE_TRAITS_HH │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_e_n_a_b_l_e_I_f_C_o_n_s_t_r_u_c_t_i_b_l_e │ │ │ │ │ +std::enable_if_t< std::is_constructible_v< T, Args... >, int > │ │ │ │ │ +enableIfConstructible │ │ │ │ │ +Helper to constrain forwarding constructors. │ │ │ │ │ +DDeeffiinniittiioonn type_traits.hh:31 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_t_a_t_i_c_S_i_z_e │ │ │ │ │ +std::enable_if_t< HasStaticSize_v< T >, decltype(Dune::Hybrid::size(std:: │ │ │ │ │ +declval< T >()))> StaticSize │ │ │ │ │ +Obtain size of statically sized container as integral_constant, or fail. │ │ │ │ │ +DDeeffiinniittiioonn type_traits.hh:72 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_o_r_w_a_r_d_C_a_p_t_u_r_e │ │ │ │ │ -auto forwardCapture(T &&t) │ │ │ │ │ -Create a capture object for perfect forwarding. │ │ │ │ │ -DDeeffiinniittiioonn utility.hh:376 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_o_r_w_a_r_d_A_s_S_t_a_t_i_c_I_n_t_e_g_e_r │ │ │ │ │ -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)...)) │ │ │ │ │ -DDeeffiinniittiioonn utility.hh:25 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_n_t_e_g_e_r_S_e_q_u_e_n_c_e_T_u_p_l_e │ │ │ │ │ -typename Imp::IntegerSequenceTupleHelper< IntegerSequence >::Type │ │ │ │ │ -IntegerSequenceTuple │ │ │ │ │ -Transform integer_sequence to tuple...> │ │ │ │ │ -DDeeffiinniittiioonn utility.hh:215 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_s_t_T_y_p_e │ │ │ │ │ -Get last entry of type list. │ │ │ │ │ -DDeeffiinniittiioonn utility.hh:226 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_s_t_T_y_p_e_:_:_t_y_p_e │ │ │ │ │ -std::tuple_element_t< sizeof...(T) -1, std::tuple< T... > > type │ │ │ │ │ -DDeeffiinniittiioonn utility.hh:227 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_o_t_a_t_e_T_u_p_l_e │ │ │ │ │ -Rotate type list by one, such that last entry is moved to first position. │ │ │ │ │ -DDeeffiinniittiioonn utility.hh:255 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_o_t_a_t_e_T_u_p_l_e_:_:_t_y_p_e │ │ │ │ │ -typename Imp::RotateHelper< std::tuple< T... >, std::make_index_sequence< │ │ │ │ │ -sizeof...(T) -1 > >::type type │ │ │ │ │ -DDeeffiinniittiioonn utility.hh:256 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_a_s_S_t_a_t_i_c_S_i_z_e___v │ │ │ │ │ +constexpr bool HasStaticSize_v │ │ │ │ │ +A variable template representing the value of HasStaticSize. │ │ │ │ │ +DDeeffiinniittiioonn type_traits.hh:49 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_a_s_S_t_a_t_i_c_S_i_z_e │ │ │ │ │ +Check if type is a statically sized container. │ │ │ │ │ +DDeeffiinniittiioonn type_traits.hh:45 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_t_a_t_i_c_S_i_z_e_O_r_Z_e_r_o │ │ │ │ │ +Obtain size of statically sized container, or 0 if dynamic size. │ │ │ │ │ +DDeeffiinniittiioonn type_traits.hh:64 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00047.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: functionconcepts.hh File Reference │ │ │ │ +dune-functions: defaultderivativetraits.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,123 +71,52 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
functionconcepts.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
defaultderivativetraits.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>
│ │ │ │ +
#include <type_traits>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <dune/common/fvector.hh>
│ │ │ │ +#include <dune/common/fmatrix.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...
class  Dune::Functions::InvalidRange
 Dummy range class to be used if no proper type is available. More...
 
struct  Dune::Functions::Concept::Function< Range(Domain)>
 Concept for a function mapping Domain to Range. More...
struct  Dune::Functions::DefaultDerivativeTraits< Signature >
 Default implementation for derivative traits. More...
 
struct  Dune::Functions::Concept::DifferentiableFunction< Range(Domain), DerivativeTraits >
 Concept for a differentiable function mapping Domain to Range. More...
struct  Dune::Functions::DefaultDerivativeTraits< double(double) >
 Default implementation for derivative traits. More...
 
struct  Dune::Functions::Concept::LocalFunction< Range(Domain), LocalContext >
 Concept for a local function mapping Domain to Range. More...
struct  Dune::Functions::DefaultDerivativeTraits< K(FieldVector< K, n >)>
 Default implementation for derivative traits. More...
 
struct  Dune::Functions::Concept::DifferentiableLocalFunction< Range(Domain), LocalContext, DerivativeTraits >
 Concept for a differentiable local function mapping Domain to Range. More...
struct  Dune::Functions::DefaultDerivativeTraits< FieldVector< K, m >(FieldVector< K, n >)>
 Default implementation for derivative traits. 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...
struct  Dune::Functions::DefaultDerivativeTraits< FieldMatrix< K, 1, m >(FieldVector< K, n >)>
 Default implementation for derivative traits. 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.
 
template<class F , class... Args>
static constexpr auto Dune::Functions::Concept::isCallable (F &&, Args &&...)
 Check if f is callable with given argument list.
 
template<class F , class Signature >
static constexpr bool Dune::Functions::Concept::isFunction ()
 Check if F models the Function concept with given signature.
 
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.
 
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.
 
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.
 
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.
 
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.
 
template<class E >
static constexpr bool Dune::Functions::Concept::isEntitySet ()
 Check if F models the GridFunction concept with given signature and entity set.
 
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.
 
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.
 
template<class F , class Signature , class GridView >
static constexpr bool Dune::Functions::Concept::isGridViewFunction ()
 Check if F models the GridViewFunction concept with given signature.
 
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.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,136 +1,42 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -functionconcepts.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_s_i_g_n_a_t_u_r_e_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_l_o_c_a_l_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h> │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +defaultderivativetraits.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_C_a_l_l_a_b_l_e_<_ _A_r_g_s_ _> │ │ │ │ │ -  _C_o_n_c_e_p_t objects that can be called with given argument list. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_n_v_a_l_i_d_R_a_n_g_e │ │ │ │ │ +  Dummy range class to be used if no proper type is available. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_> │ │ │ │ │ -  _C_o_n_c_e_p_t for a function mapping Domain to Range. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_ _S_i_g_n_a_t_u_r_e_ _> │ │ │ │ │ +  Default implementation for derivative traits. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ - _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _> │ │ │ │ │ -  _C_o_n_c_e_p_t for a differentiable function mapping Domain to Range. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _L_o_c_a_l_C_o_n_t_e_x_t_ _> │ │ │ │ │ -  _C_o_n_c_e_p_t for a local function mapping Domain to Range. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ - _L_o_c_a_l_C_o_n_t_e_x_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _> │ │ │ │ │ -  _C_o_n_c_e_p_t for a differentiable local function mapping Domain to Range. │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_E_n_t_i_t_y_S_e_t │ │ │ │ │ -  _C_o_n_c_e_p_t for an entity set for a Concept::GridFunction _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_n_t_i_t_y_S_e_t_ _> │ │ │ │ │ -  _C_o_n_c_e_p_t for a grid function mapping Domain to Range. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ - _E_n_t_i_t_y_S_e_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _> │ │ │ │ │ -  _C_o_n_c_e_p_t for a differentiable grid function mapping Domain to Range. │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_r_i_d_V_i_e_w_ _> │ │ │ │ │ -  _C_o_n_c_e_p_t for a grid view function mapping Domain to Range. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e │ │ │ │ │ - _(_D_o_m_a_i_n_)_,_ _G_r_i_d_V_i_e_w_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _> │ │ │ │ │ -  _C_o_n_c_e_p_t for a differentiable grid view function mapping Domain to │ │ │ │ │ - Range. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_ _d_o_u_b_l_e_(_d_o_u_b_l_e_)_ _> │ │ │ │ │ +  Default implementation for derivative traits. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_ _K_(_F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _n_ _>_)_> │ │ │ │ │ +  Default implementation for derivative traits. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _m_ _> │ │ │ │ │ + _(_F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _n_ _>_)_> │ │ │ │ │ +  Default implementation for derivative traits. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _1_,_ _m_ _> │ │ │ │ │ + _(_F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _n_ _>_)_> │ │ │ │ │ +  Default implementation for derivative traits. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -static constexpr auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_C_a_l_l_a_b_l_e () │ │ │ │ │ -  Check if f is callable with given argument list. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -static constexpr auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_C_a_l_l_a_b_l_e (F &&, Args &&...) │ │ │ │ │ -  Check if f is callable with given argument list. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_F_u_n_c_t_i_o_n () │ │ │ │ │ -  Check if F models the _F_u_n_c_t_i_o_n concept with given │ │ │ │ │ - signature. │ │ │ │ │ -  │ │ │ │ │ -template class DerivativeTraits> │ │ │ │ │ -static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_F_u_n_c_t_i_o_n (F &&f, │ │ │ │ │ - _S_i_g_n_a_t_u_r_e_T_a_g< Signature, DerivativeTraits >) │ │ │ │ │ -  Check if f models the _F_u_n_c_t_i_o_n concept with given │ │ │ │ │ - signature. │ │ │ │ │ -  │ │ │ │ │ -template class DerivativeTraits = │ │ │ │ │ -DefaultDerivativeTraits> │ │ │ │ │ -static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n () │ │ │ │ │ -  Check if F models the _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n concept │ │ │ │ │ - with given signature. │ │ │ │ │ -  │ │ │ │ │ -template class DerivativeTraits> │ │ │ │ │ -static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n (F │ │ │ │ │ - &&f, _S_i_g_n_a_t_u_r_e_T_a_g< Signature, DerivativeTraits >) │ │ │ │ │ -  Check if f models the _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n concept │ │ │ │ │ - with given signature. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_L_o_c_a_l_F_u_n_c_t_i_o_n () │ │ │ │ │ -  Check if F models the _L_o_c_a_l_F_u_n_c_t_i_o_n concept with given │ │ │ │ │ - signature and local context. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -class DerivativeTraits = DefaultDerivativeTraits> │ │ │ │ │ -static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ - () │ │ │ │ │ -  Check if F models the _D_i_f_f_e_r_e_n_t_i_a_b_l_e_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ - concept with given signature and local context. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_E_n_t_i_t_y_S_e_t () │ │ │ │ │ -  Check if F models the _G_r_i_d_F_u_n_c_t_i_o_n concept with given │ │ │ │ │ - signature and entity set. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_G_r_i_d_F_u_n_c_t_i_o_n () │ │ │ │ │ -  Check if F models the _G_r_i_d_F_u_n_c_t_i_o_n concept with given │ │ │ │ │ - signature and entity set. │ │ │ │ │ -  │ │ │ │ │ -template class │ │ │ │ │ -DerivativeTraits = DefaultDerivativeTraits> │ │ │ │ │ -static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ - () │ │ │ │ │ -  Check if F models the _D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_F_u_n_c_t_i_o_n concept │ │ │ │ │ - with given signature and entity set. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n () │ │ │ │ │ -  Check if F models the _G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n concept with │ │ │ │ │ - given signature. │ │ │ │ │ -  │ │ │ │ │ -template class │ │ │ │ │ -DerivativeTraits = DefaultDerivativeTraits> │ │ │ │ │ -static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_: │ │ │ │ │ - _i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n () │ │ │ │ │ -  Check if F models the _D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ - concept with given signature. │ │ │ │ │ -  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00047_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: functionconcepts.hh Source File │ │ │ │ +dune-functions: defaultderivativetraits.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,370 +74,97 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
functionconcepts.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_COMMON_DEFAULT_DERIVATIVE_TRAITS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_COMMON_DEFAULT_DERIVATIVE_TRAITS_HH
│ │ │ │
9
│ │ │ │ -
10#include <dune/common/typelist.hh>
│ │ │ │ -
11#include <dune/common/concept.hh>
│ │ │ │ +
10#include <type_traits>
│ │ │ │ +
11#include <utility>
│ │ │ │
12
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
16
│ │ │ │ -
17namespace Dune {
│ │ │ │ -
18namespace Functions {
│ │ │ │ -
19namespace Concept {
│ │ │ │ +
13#include <dune/common/fvector.hh>
│ │ │ │ +
14#include <dune/common/fmatrix.hh>
│ │ │ │ +
15
│ │ │ │ +
16namespace Dune {
│ │ │ │ +
17namespace Functions {
│ │ │ │ +
18
│ │ │ │ +
19
│ │ │ │
20
│ │ │ │ -
21using namespace Dune::Concept;
│ │ │ │ -
22
│ │ │ │ -
23
│ │ │ │ -
24
│ │ │ │ -
25// Callable concept ############################################################
│ │ │ │ -
26
│ │ │ │ -
27
│ │ │ │ -
35template<class... Args>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
37{
│ │ │ │ -
38 template<class F>
│ │ │ │ -
39 auto require(F&& f) -> decltype(
│ │ │ │ -
40 f(std::declval<Args>()...)
│ │ │ │ -
41 );
│ │ │ │ -
42};
│ │ │ │ -
│ │ │ │ -
43
│ │ │ │ -
50template<class F, class... Args>
│ │ │ │ -
│ │ │ │ -
51static constexpr auto isCallable()
│ │ │ │ -
52{ return models<Concept::Callable<Args...>, F>(); }
│ │ │ │ -
│ │ │ │ -
53
│ │ │ │ -
60template<class F, class... Args>
│ │ │ │ -
│ │ │ │ -
61static constexpr auto isCallable(F&&, Args&&...)
│ │ │ │ -
62{
│ │ │ │ -
63 return models<Concept::Callable<Args&&...>, F>();
│ │ │ │ -
64}
│ │ │ │ -
│ │ │ │ -
65
│ │ │ │ -
66
│ │ │ │ -
67
│ │ │ │ -
68// Function concept ############################################################
│ │ │ │ -
69template<class Signature>
│ │ │ │ -
70struct Function;
│ │ │ │ -
71
│ │ │ │ -
80template<class Range, class Domain>
│ │ │ │ -
│ │ │ │ -
81struct Function<Range(Domain)> : Refines<Callable<Domain> >
│ │ │ │ -
82{
│ │ │ │ -
83 template<class F>
│ │ │ │ -
84 auto require(F&& f) -> decltype(
│ │ │ │ -
85 // F models Function<Range(Domain)> if the result of F(Domain) is implicitly convertible to Range
│ │ │ │ -
86 requireConvertible<Range>(f(std::declval<Domain>()))
│ │ │ │ -
87 );
│ │ │ │ -
88};
│ │ │ │ -
│ │ │ │ -
89
│ │ │ │ -
91template<class F, class Signature>
│ │ │ │ -
│ │ │ │ -
92static constexpr bool isFunction()
│ │ │ │ -
93{ return models<Concept::Function<Signature>, F>(); }
│ │ │ │ -
│ │ │ │ -
94
│ │ │ │ -
96template<class F, class Signature, template<class> class DerivativeTraits>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
98{ return models<Concept::Function<Signature>, F>(); }
│ │ │ │ -
│ │ │ │ -
99
│ │ │ │ -
100
│ │ │ │ -
101
│ │ │ │ -
102// DifferentiableFunction concept ##############################################
│ │ │ │ -
103template<class Signature, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ - │ │ │ │ -
105
│ │ │ │ -
117template<class Range, class Domain, template<class> class DerivativeTraits>
│ │ │ │ -
│ │ │ │ -
118struct DifferentiableFunction<Range(Domain), DerivativeTraits> : Refines<Dune::Functions::Concept::Function<Range(Domain)> >
│ │ │ │ -
119{
│ │ │ │ - │ │ │ │ -
121
│ │ │ │ -
122 template<class F>
│ │ │ │ -
123 auto require(F&& f) -> decltype(
│ │ │ │ -
124 derivative(f),
│ │ │ │ -
125 requireConcept<Function<DerivativeSignature>>(derivative(f))
│ │ │ │ -
126 );
│ │ │ │ -
127};
│ │ │ │ -
│ │ │ │ -
128
│ │ │ │ -
130template<class F, class Signature, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ -
│ │ │ │ -
131static constexpr bool isDifferentiableFunction()
│ │ │ │ -
132{ return models<Concept::DifferentiableFunction<Signature, DerivativeTraits>, F>(); }
│ │ │ │ -
│ │ │ │ -
133
│ │ │ │ -
135template<class F, class Signature, template<class> class DerivativeTraits>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
137{ return models<Concept::DifferentiableFunction<Signature, DerivativeTraits>, F>(); }
│ │ │ │ -
│ │ │ │ -
138
│ │ │ │ -
139
│ │ │ │ -
140
│ │ │ │ -
141// LocalFunction concept ##############################################
│ │ │ │ -
142template<class Signature, class LocalContext>
│ │ │ │ - │ │ │ │ -
144
│ │ │ │ -
154template<class Range, class Domain, class LocalContext>
│ │ │ │ -
│ │ │ │ -
155struct LocalFunction<Range(Domain), LocalContext> :
│ │ │ │ -
156 Refines<Dune::Functions::Concept::Function<Range(Domain)> >
│ │ │ │ -
157{
│ │ │ │ -
158 template<class F>
│ │ │ │ -
159 auto require(F&& f) -> decltype(
│ │ │ │ -
160 f.bind(std::declval<LocalContext>()),
│ │ │ │ -
161 f.unbind(),
│ │ │ │ -
162 requireConvertible<bool>(f.bound()),
│ │ │ │ -
163 f.localContext(),
│ │ │ │ -
164 requireConvertible<LocalContext>(f.localContext())
│ │ │ │ -
165 );
│ │ │ │ -
166};
│ │ │ │ -
│ │ │ │ -
167
│ │ │ │ -
169template<class F, class Signature, class LocalContext>
│ │ │ │ -
│ │ │ │ -
170static constexpr bool isLocalFunction()
│ │ │ │ -
171{ return models<Concept::LocalFunction<Signature, LocalContext>, F>(); }
│ │ │ │ -
│ │ │ │ -
172
│ │ │ │ -
173
│ │ │ │ -
174// DifferentiableLocalFunction concept ##############################################
│ │ │ │ -
175template<class Signature, class LocalContext, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ - │ │ │ │ -
177
│ │ │ │ -
190template<class Range, class Domain, class LocalContext, template<class> class DerivativeTraits>
│ │ │ │ -
│ │ │ │ -
191struct DifferentiableLocalFunction<Range(Domain), LocalContext, DerivativeTraits> :
│ │ │ │ -
192 Refines<
│ │ │ │ -
193 Dune::Functions::Concept::DifferentiableFunction<Range(Domain), DerivativeTraits>,
│ │ │ │ -
194 Dune::Functions::Concept::LocalFunction<Range(Domain),LocalContext>
│ │ │ │ -
195 >
│ │ │ │ -
196{
│ │ │ │ -
197 template<class F>
│ │ │ │ -
198 auto require(F&& f) -> decltype(
│ │ │ │ -
199 f.bind(std::declval<LocalContext>()),
│ │ │ │ -
200 f.unbind(),
│ │ │ │ -
201 f.localContext(),
│ │ │ │ -
202 requireConvertible<LocalContext>(f.localContext())
│ │ │ │ -
203 );
│ │ │ │ -
204};
│ │ │ │ -
│ │ │ │ -
205
│ │ │ │ -
207template<class F, class Signature, class LocalContext, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ -
│ │ │ │ -
208static constexpr bool isDifferentiableLocalFunction()
│ │ │ │ -
209{ return models<Concept::DifferentiableLocalFunction<Signature, LocalContext, DerivativeTraits>, F>(); }
│ │ │ │ -
│ │ │ │ -
210
│ │ │ │ -
211
│ │ │ │ -
212// EntitySet concept ##############################################
│ │ │ │ -
213
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
224{
│ │ │ │ -
225 template<class E>
│ │ │ │ -
226 auto require(E&& f) -> decltype(
│ │ │ │ -
227 requireType<typename E::Element>(),
│ │ │ │ -
228 requireType<typename E::LocalCoordinate>(),
│ │ │ │ -
229 requireType<typename E::GlobalCoordinate>()
│ │ │ │ -
230 );
│ │ │ │ -
231};
│ │ │ │ -
│ │ │ │ -
232
│ │ │ │ -
234template<class E>
│ │ │ │ -
│ │ │ │ -
235static constexpr bool isEntitySet()
│ │ │ │ -
236{ return models<Concept::EntitySet, E>(); }
│ │ │ │ -
│ │ │ │ -
237
│ │ │ │ -
238
│ │ │ │ -
239
│ │ │ │ -
240// GridFunction concept ##############################################
│ │ │ │ -
241template<class Signature, class EntitySet>
│ │ │ │ - │ │ │ │ -
243
│ │ │ │ -
253template<class Range, class Domain, class EntitySet>
│ │ │ │ -
│ │ │ │ -
254struct GridFunction<Range(Domain), EntitySet> :
│ │ │ │ -
255 Refines<Dune::Functions::Concept::Function<Range(Domain)> >
│ │ │ │ -
256{
│ │ │ │ -
257 using LocalSignature = Range(typename EntitySet::LocalCoordinate);
│ │ │ │ -
258 using LocalContext = typename EntitySet::Element;
│ │ │ │ -
259
│ │ │ │ -
260 template<class F>
│ │ │ │ -
261 auto require(F&& f) -> decltype(
│ │ │ │ -
262 localFunction(f),
│ │ │ │ -
263 f.entitySet(),
│ │ │ │ -
264 requireConcept<LocalFunction<LocalSignature, LocalContext>>(localFunction(f)),
│ │ │ │ -
265 requireConcept<Concept::EntitySet, EntitySet>(),
│ │ │ │ -
266 requireConvertible<EntitySet>(f.entitySet()),
│ │ │ │ -
267 requireConvertible<typename EntitySet::GlobalCoordinate, Domain>()
│ │ │ │ -
268 );
│ │ │ │ -
269};
│ │ │ │ -
│ │ │ │ -
270
│ │ │ │ -
272template<class F, class Signature, class EntitySet>
│ │ │ │ -
│ │ │ │ -
273static constexpr bool isGridFunction()
│ │ │ │ -
274{ return models<Concept::GridFunction<Signature, EntitySet>, F>(); }
│ │ │ │ -
│ │ │ │ -
275
│ │ │ │ -
276
│ │ │ │ -
277// DifferentiableGridFunction concept ##############################################
│ │ │ │ -
278template<class Signature, class EntitySet, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ - │ │ │ │ -
280
│ │ │ │ -
293template<class Range, class Domain, class EntitySet, template<class> class DerivativeTraits>
│ │ │ │ -
│ │ │ │ -
294struct DifferentiableGridFunction<Range(Domain), EntitySet, DerivativeTraits> :
│ │ │ │ -
295 Refines<
│ │ │ │ -
296 Dune::Functions::Concept::DifferentiableFunction<Range(Domain), DerivativeTraits>,
│ │ │ │ -
297 Dune::Functions::Concept::GridFunction<Range(Domain),EntitySet>
│ │ │ │ -
298 >
│ │ │ │ -
299{
│ │ │ │ -
300 using LocalSignature = Range(typename EntitySet::LocalCoordinate);
│ │ │ │ -
301 using LocalContext = typename EntitySet::Element;
│ │ │ │ -
302
│ │ │ │ -
303 template<class R>
│ │ │ │ - │ │ │ │ -
305
│ │ │ │ -
306 template<class F>
│ │ │ │ -
307 auto require(F&& f) -> decltype(
│ │ │ │ -
308 requireConcept<DifferentiableLocalFunction<LocalSignature, LocalContext, LocalDerivativeTraits>>(localFunction(f))
│ │ │ │ -
309 );
│ │ │ │ -
310};
│ │ │ │ -
│ │ │ │ -
311
│ │ │ │ -
313template<class F, class Signature, class EntitySet, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ -
│ │ │ │ -
314static constexpr bool isDifferentiableGridFunction()
│ │ │ │ -
315{ return models<Concept::DifferentiableGridFunction<Signature, EntitySet, DerivativeTraits>, F>(); }
│ │ │ │ -
│ │ │ │ -
316
│ │ │ │ -
317
│ │ │ │ -
318
│ │ │ │ -
319// GridViewFunction concept ##############################################
│ │ │ │ -
320template<class Signature, class GridView>
│ │ │ │ - │ │ │ │ -
322
│ │ │ │ -
335template<class Range, class Domain, class GridView>
│ │ │ │ -
│ │ │ │ -
336struct GridViewFunction<Range(Domain), GridView> :
│ │ │ │ -
337 Refines<Dune::Functions::Concept::GridFunction<Range(Domain), GridViewEntitySet<GridView,0>>>
│ │ │ │ -
338{
│ │ │ │ -
339 template<class F>
│ │ │ │ -
340 auto require(F&& f) -> decltype(
│ │ │ │ -
341 0 // We don't need to check any further expressions, because a GridViewFunction is just a GridFunction with a special EntitySet
│ │ │ │ -
342 );
│ │ │ │ -
343};
│ │ │ │ -
│ │ │ │ -
344
│ │ │ │ -
346template<class F, class Signature, class GridView>
│ │ │ │ -
│ │ │ │ -
347static constexpr bool isGridViewFunction()
│ │ │ │ -
348{ return models<Concept::GridViewFunction<Signature, GridView>, F>(); }
│ │ │ │ -
│ │ │ │ -
349
│ │ │ │ -
350
│ │ │ │ -
351// DifferentiableGridViewFunction concept ##############################################
│ │ │ │ -
352template<class Signature, class GridView, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ - │ │ │ │ -
354
│ │ │ │ -
368template<class Range, class Domain, class GridView, template<class> class DerivativeTraits>
│ │ │ │ -
│ │ │ │ -
369struct DifferentiableGridViewFunction<Range(Domain), GridView, DerivativeTraits> :
│ │ │ │ -
370 Refines<Dune::Functions::Concept::DifferentiableGridFunction<Range(Domain), GridViewEntitySet<GridView,0>, DerivativeTraits>>
│ │ │ │ -
371{
│ │ │ │ -
372 template<class F>
│ │ │ │ -
373 auto require(F&& f) -> decltype(
│ │ │ │ -
374 0 // We don't need to check any further expressions, because a GridViewFunction is just a GridFunction with a special EntitySet
│ │ │ │ -
375 );
│ │ │ │ -
376};
│ │ │ │ -
│ │ │ │ -
377
│ │ │ │ -
379template<class F, class Signature, class GridView, template<class> class DerivativeTraits = DefaultDerivativeTraits>
│ │ │ │ -
│ │ │ │ -
380static constexpr bool isDifferentiableGridViewFunction()
│ │ │ │ -
381{ return models<Concept::DifferentiableGridViewFunction<Signature, GridView, DerivativeTraits>, F>(); }
│ │ │ │ -
│ │ │ │ -
382
│ │ │ │ -
383
│ │ │ │ -
384
│ │ │ │ -
385}}} // namespace Dune::Functions::Concept
│ │ │ │ -
386
│ │ │ │ -
387#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:273
│ │ │ │ -
static constexpr bool isDifferentiableLocalFunction()
Check if F models the DifferentiableLocalFunction concept with given signature and local context.
Definition functionconcepts.hh:208
│ │ │ │ -
static constexpr bool isFunction()
Check if F models the Function concept with given signature.
Definition functionconcepts.hh:92
│ │ │ │ -
static constexpr bool isDifferentiableGridViewFunction()
Check if F models the DifferentiableGridViewFunction concept with given signature.
Definition functionconcepts.hh:380
│ │ │ │ -
static constexpr bool isDifferentiableFunction()
Check if F models the DifferentiableFunction concept with given signature.
Definition functionconcepts.hh:131
│ │ │ │ -
static constexpr bool isGridViewFunction()
Check if F models the GridViewFunction concept with given signature.
Definition functionconcepts.hh:347
│ │ │ │ -
static constexpr bool isEntitySet()
Check if F models the GridFunction concept with given signature and entity set.
Definition functionconcepts.hh:235
│ │ │ │ -
static constexpr bool isDifferentiableGridFunction()
Check if F models the DifferentiableGridFunction concept with given signature and entity set.
Definition functionconcepts.hh:314
│ │ │ │ -
static constexpr bool isLocalFunction()
Check if F models the LocalFunction concept with given signature and local context.
Definition functionconcepts.hh:170
│ │ │ │ -
TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const TrigonometricFunction< K, sinFactor, cosFactor > &f)
Obtain derivative of TrigonometricFunction function.
Definition trigonometricfunction.hh:43
│ │ │ │ -
static constexpr auto isCallable()
Check if f is callable with given argument list.
Definition functionconcepts.hh:51
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
27{};
│ │ │ │ +
│ │ │ │ +
28
│ │ │ │ +
29
│ │ │ │ +
39template<class Signature>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
41{
│ │ │ │ + │ │ │ │ +
44};
│ │ │ │ +
│ │ │ │ +
45
│ │ │ │ +
46
│ │ │ │ +
54template<>
│ │ │ │ +
│ │ │ │ +
55struct DefaultDerivativeTraits< double(double) >
│ │ │ │ +
56{
│ │ │ │ +
58 typedef double Range;
│ │ │ │ +
59};
│ │ │ │ +
│ │ │ │ +
60
│ │ │ │ +
70template<typename K, int n>
│ │ │ │ +
│ │ │ │ +
71struct DefaultDerivativeTraits<K(FieldVector<K,n>)>
│ │ │ │ +
72{
│ │ │ │ +
74 typedef FieldVector<K,n> Range;
│ │ │ │ +
75};
│ │ │ │ +
│ │ │ │ +
76
│ │ │ │ +
86template<typename K, int n, int m>
│ │ │ │ +
│ │ │ │ +
87struct DefaultDerivativeTraits<FieldVector<K,m>(FieldVector<K,n>)>
│ │ │ │ +
88{
│ │ │ │ +
90 typedef FieldMatrix<K,m,n> Range;
│ │ │ │ +
91};
│ │ │ │ +
│ │ │ │ +
92
│ │ │ │ +
102template<typename K, int n, int m>
│ │ │ │ +
│ │ │ │ +
103struct DefaultDerivativeTraits<FieldMatrix<K,1,m>(FieldVector<K,n>)>
│ │ │ │ +
104{
│ │ │ │ +
106 typedef FieldMatrix<K,m,n> Range;
│ │ │ │ +
107};
│ │ │ │ +
│ │ │ │ +
108
│ │ │ │ +
109
│ │ │ │ +
110}} // namespace Dune::Functions
│ │ │ │ +
111
│ │ │ │ +
112
│ │ │ │ +
113#endif // DUNE_FUNCTIONS_COMMON_DEFAULT_DERIVATIVE_TRAITS_HH
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ +
Dummy range class to be used if no proper type is available.
Definition defaultderivativetraits.hh:27
│ │ │ │
Default implementation for derivative traits.
Definition defaultderivativetraits.hh:41
│ │ │ │ -
Concept objects that can be called with given argument list.
Definition functionconcepts.hh:37
│ │ │ │ -
auto require(F &&f) -> decltype(f(std::declval< Args >()...))
│ │ │ │ -
Definition functionconcepts.hh:70
│ │ │ │ -
auto require(F &&f) -> decltype(requireConvertible< Range >(f(std::declval< Domain >())))
│ │ │ │ -
Definition functionconcepts.hh:104
│ │ │ │ -
typename SignatureTraits< Range(Domain)>::template DerivativeSignature< DerivativeTraits > DerivativeSignature
Definition functionconcepts.hh:120
│ │ │ │ -
auto require(F &&f) -> decltype(derivative(f), requireConcept< Function< DerivativeSignature > >(derivative(f)))
│ │ │ │ -
Definition functionconcepts.hh:143
│ │ │ │ -
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:224
│ │ │ │ -
auto require(E &&f) -> decltype(requireType< typename E::Element >(), requireType< typename E::LocalCoordinate >(), requireType< typename E::GlobalCoordinate >())
│ │ │ │ -
Definition functionconcepts.hh:242
│ │ │ │ -
typename EntitySet::Element LocalContext
Definition functionconcepts.hh:258
│ │ │ │ -
Range(typename EntitySet::LocalCoordinate) LocalSignature
Definition functionconcepts.hh:257
│ │ │ │ -
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 >())
│ │ │ │ - │ │ │ │ -
typename Dune::Functions::LocalDerivativeTraits< EntitySet, DerivativeTraits >::template Traits< R > LocalDerivativeTraits
Definition functionconcepts.hh:304
│ │ │ │ -
auto require(F &&f) -> decltype(requireConcept< DifferentiableLocalFunction< LocalSignature, LocalContext, LocalDerivativeTraits > >(localFunction(f)))
│ │ │ │ -
Range(typename EntitySet::LocalCoordinate) LocalSignature
Definition functionconcepts.hh:300
│ │ │ │ - │ │ │ │ -
Definition functionconcepts.hh:321
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
Helper class to deduce the signature of a callable.
Definition signature.hh:60
│ │ │ │ -
Definition signature.hh:106
│ │ │ │ -
Derivative traits for local functions.
Definition localderivativetraits.hh:32
│ │ │ │ +
InvalidRange Range
Range of derivative for function with given signature.
Definition defaultderivativetraits.hh:43
│ │ │ │ +
double Range
Range of derivative for function with given signature.
Definition defaultderivativetraits.hh:58
│ │ │ │ +
FieldVector< K, n > Range
Range of derivative for function with given signature.
Definition defaultderivativetraits.hh:74
│ │ │ │ +
FieldMatrix< K, m, n > Range
Range of derivative for function with given signature.
Definition defaultderivativetraits.hh:90
│ │ │ │ +
FieldMatrix< K, m, n > Range
Range of derivative for function with given signature.
Definition defaultderivativetraits.hh:106
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,465 +1,103 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -functionconcepts.hh │ │ │ │ │ +defaultderivativetraits.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_COMMON_DEFAULT_DERIVATIVE_TRAITS_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_COMMON_DEFAULT_DERIVATIVE_TRAITS_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ 12 │ │ │ │ │ -13#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_s_i_g_n_a_t_u_r_e_._h_h> │ │ │ │ │ -14#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_l_o_c_a_l_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -15#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h> │ │ │ │ │ -16 │ │ │ │ │ -17namespace _D_u_n_e { │ │ │ │ │ -18namespace Functions { │ │ │ │ │ -19namespace Concept { │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15 │ │ │ │ │ +16namespace _D_u_n_e { │ │ │ │ │ +17namespace Functions { │ │ │ │ │ +18 │ │ │ │ │ +19 │ │ │ │ │ 20 │ │ │ │ │ -21using namespace Dune::Concept; │ │ │ │ │ -22 │ │ │ │ │ -23 │ │ │ │ │ -24 │ │ │ │ │ -25// Callable concept │ │ │ │ │ -############################################################ │ │ │ │ │ -26 │ │ │ │ │ -27 │ │ │ │ │ -35template │ │ │ │ │ -_3_6struct _C_a_l_l_a_b_l_e │ │ │ │ │ -37{ │ │ │ │ │ -38 template │ │ │ │ │ -_3_9 auto _r_e_q_u_i_r_e(F&& f) -> decltype( │ │ │ │ │ -40 f(std::declval()...) │ │ │ │ │ -41 ); │ │ │ │ │ -42}; │ │ │ │ │ -43 │ │ │ │ │ -50template │ │ │ │ │ -_5_1static constexpr auto _i_s_C_a_l_l_a_b_l_e() │ │ │ │ │ -52{ return models<_C_o_n_c_e_p_t_:_:_C_a_l_l_a_b_l_e, F>(); } │ │ │ │ │ -53 │ │ │ │ │ -60template │ │ │ │ │ -_6_1static constexpr auto _i_s_C_a_l_l_a_b_l_e(F&&, Args&&...) │ │ │ │ │ -62{ │ │ │ │ │ -63 return models<_C_o_n_c_e_p_t_:_:_C_a_l_l_a_b_l_e, F>(); │ │ │ │ │ -64} │ │ │ │ │ -65 │ │ │ │ │ -66 │ │ │ │ │ -67 │ │ │ │ │ -68// Function concept │ │ │ │ │ -############################################################ │ │ │ │ │ -69template │ │ │ │ │ -_7_0struct _F_u_n_c_t_i_o_n; │ │ │ │ │ -71 │ │ │ │ │ -80template │ │ │ │ │ -_8_1struct _F_u_n_c_t_i_o_n : Refines > │ │ │ │ │ -82{ │ │ │ │ │ -83 template │ │ │ │ │ -_8_4 auto _r_e_q_u_i_r_e(F&& f) -> decltype( │ │ │ │ │ -85 // F models Function if the result of F(Domain) is implicitly │ │ │ │ │ -convertible to Range │ │ │ │ │ -86 requireConvertible(f(std::declval())) │ │ │ │ │ -87 ); │ │ │ │ │ -88}; │ │ │ │ │ -89 │ │ │ │ │ -91template │ │ │ │ │ -_9_2static constexpr bool _i_s_F_u_n_c_t_i_o_n() │ │ │ │ │ -93{ return models, F>(); } │ │ │ │ │ -94 │ │ │ │ │ -96template class DerivativeTraits> │ │ │ │ │ -_9_7static constexpr bool _i_s_F_u_n_c_t_i_o_n(F&& f, _S_i_g_n_a_t_u_r_e_T_a_g_<_S_i_g_n_a_t_u_r_e_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_>) │ │ │ │ │ -98{ return models, F>(); } │ │ │ │ │ -99 │ │ │ │ │ -100 │ │ │ │ │ -101 │ │ │ │ │ -102// DifferentiableFunction concept │ │ │ │ │ -############################################## │ │ │ │ │ -103template class DerivativeTraits = │ │ │ │ │ -_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s> │ │ │ │ │ -_1_0_4struct _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n; │ │ │ │ │ -105 │ │ │ │ │ -117template class DerivativeTraits> │ │ │ │ │ -_1_1_8struct _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n : │ │ │ │ │ -Refines > │ │ │ │ │ -119{ │ │ │ │ │ -_1_2_0 using _D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e = typename _S_i_g_n_a_t_u_r_e_T_r_a_i_t_s:: │ │ │ │ │ -template _D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_<_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_>; │ │ │ │ │ -121 │ │ │ │ │ -122 template │ │ │ │ │ -_1_2_3 auto _r_e_q_u_i_r_e(F&& f) -> decltype( │ │ │ │ │ -124 _d_e_r_i_v_a_t_i_v_e(f), │ │ │ │ │ -125 requireConcept>(_d_e_r_i_v_a_t_i_v_e(f)) │ │ │ │ │ -126 ); │ │ │ │ │ -127}; │ │ │ │ │ -128 │ │ │ │ │ -130template class DerivativeTraits = │ │ │ │ │ -_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s> │ │ │ │ │ -_1_3_1static constexpr bool _i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n() │ │ │ │ │ -132{ return models, F>(); } │ │ │ │ │ -133 │ │ │ │ │ -135template class DerivativeTraits> │ │ │ │ │ -_1_3_6static constexpr bool _i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n(F&& f, │ │ │ │ │ -_S_i_g_n_a_t_u_r_e_T_a_g_<_S_i_g_n_a_t_u_r_e_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_>) │ │ │ │ │ -137{ return models, F>(); } │ │ │ │ │ -138 │ │ │ │ │ -139 │ │ │ │ │ -140 │ │ │ │ │ -141// LocalFunction concept ############################################## │ │ │ │ │ -142template │ │ │ │ │ -_1_4_3struct _L_o_c_a_l_F_u_n_c_t_i_o_n; │ │ │ │ │ -144 │ │ │ │ │ -154template │ │ │ │ │ -_1_5_5struct _L_o_c_a_l_F_u_n_c_t_i_o_n : │ │ │ │ │ -156 Refines > │ │ │ │ │ -157{ │ │ │ │ │ -158 template │ │ │ │ │ -_1_5_9 auto _r_e_q_u_i_r_e(F&& f) -> decltype( │ │ │ │ │ -160 f.bind(std::declval()), │ │ │ │ │ -161 f.unbind(), │ │ │ │ │ -162 requireConvertible(f.bound()), │ │ │ │ │ -163 f.localContext(), │ │ │ │ │ -164 requireConvertible(f.localContext()) │ │ │ │ │ -165 ); │ │ │ │ │ -166}; │ │ │ │ │ -167 │ │ │ │ │ -169template │ │ │ │ │ -_1_7_0static constexpr bool _i_s_L_o_c_a_l_F_u_n_c_t_i_o_n() │ │ │ │ │ -171{ return models, F>(); } │ │ │ │ │ -172 │ │ │ │ │ -173 │ │ │ │ │ -174// DifferentiableLocalFunction concept │ │ │ │ │ -############################################## │ │ │ │ │ -175template class │ │ │ │ │ -DerivativeTraits = _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s> │ │ │ │ │ -_1_7_6struct _D_i_f_f_e_r_e_n_t_i_a_b_l_e_L_o_c_a_l_F_u_n_c_t_i_o_n; │ │ │ │ │ -177 │ │ │ │ │ -190template │ │ │ │ │ -class DerivativeTraits> │ │ │ │ │ -_1_9_1struct _D_i_f_f_e_r_e_n_t_i_a_b_l_e_L_o_c_a_l_F_u_n_c_t_i_o_n : │ │ │ │ │ -192 Refines< │ │ │ │ │ -193 Dune::Functions::Concept::DifferentiableFunction, │ │ │ │ │ -194 Dune::Functions::Concept::LocalFunction │ │ │ │ │ -195 > │ │ │ │ │ -196{ │ │ │ │ │ -197 template │ │ │ │ │ -_1_9_8 auto _r_e_q_u_i_r_e(F&& f) -> decltype( │ │ │ │ │ -199 f.bind(std::declval()), │ │ │ │ │ -200 f.unbind(), │ │ │ │ │ -201 f.localContext(), │ │ │ │ │ -202 requireConvertible(f.localContext()) │ │ │ │ │ -203 ); │ │ │ │ │ -204}; │ │ │ │ │ -205 │ │ │ │ │ -207template class │ │ │ │ │ -DerivativeTraits = _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s> │ │ │ │ │ -_2_0_8static constexpr bool _i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_L_o_c_a_l_F_u_n_c_t_i_o_n() │ │ │ │ │ -209{ return models, F>(); } │ │ │ │ │ -210 │ │ │ │ │ -211 │ │ │ │ │ -212// EntitySet concept ############################################## │ │ │ │ │ -213 │ │ │ │ │ -_2_2_3struct _E_n_t_i_t_y_S_e_t │ │ │ │ │ -224{ │ │ │ │ │ -225 template │ │ │ │ │ -_2_2_6 auto _r_e_q_u_i_r_e(E&& f) -> decltype( │ │ │ │ │ -227 requireType(), │ │ │ │ │ -228 requireType(), │ │ │ │ │ -229 requireType() │ │ │ │ │ -230 ); │ │ │ │ │ -231}; │ │ │ │ │ -232 │ │ │ │ │ -234template │ │ │ │ │ -_2_3_5static constexpr bool _i_s_E_n_t_i_t_y_S_e_t() │ │ │ │ │ -236{ return models(); } │ │ │ │ │ -237 │ │ │ │ │ -238 │ │ │ │ │ -239 │ │ │ │ │ -240// GridFunction concept ############################################## │ │ │ │ │ -241template │ │ │ │ │ -_2_4_2struct _G_r_i_d_F_u_n_c_t_i_o_n; │ │ │ │ │ -243 │ │ │ │ │ -253template │ │ │ │ │ -_2_5_4struct _G_r_i_d_F_u_n_c_t_i_o_n : │ │ │ │ │ -255 Refines > │ │ │ │ │ -256{ │ │ │ │ │ -_2_5_7 using _L_o_c_a_l_S_i_g_n_a_t_u_r_e = Range(typename EntitySet::LocalCoordinate); │ │ │ │ │ -_2_5_8 using _L_o_c_a_l_C_o_n_t_e_x_t = typename EntitySet::Element; │ │ │ │ │ -259 │ │ │ │ │ -260 template │ │ │ │ │ -_2_6_1 auto _r_e_q_u_i_r_e(F&& f) -> decltype( │ │ │ │ │ -262 localFunction(f), │ │ │ │ │ -263 f.entitySet(), │ │ │ │ │ -264 requireConcept>(localFunction │ │ │ │ │ -(f)), │ │ │ │ │ -265 requireConcept(), │ │ │ │ │ -266 requireConvertible(f.entitySet()), │ │ │ │ │ -267 requireConvertible() │ │ │ │ │ -268 ); │ │ │ │ │ -269}; │ │ │ │ │ -270 │ │ │ │ │ -272template │ │ │ │ │ -_2_7_3static constexpr bool _i_s_G_r_i_d_F_u_n_c_t_i_o_n() │ │ │ │ │ -274{ return models, F>(); } │ │ │ │ │ -275 │ │ │ │ │ -276 │ │ │ │ │ -277// DifferentiableGridFunction concept │ │ │ │ │ -############################################## │ │ │ │ │ -278template class │ │ │ │ │ -DerivativeTraits = _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s> │ │ │ │ │ -_2_7_9struct _D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_F_u_n_c_t_i_o_n; │ │ │ │ │ -280 │ │ │ │ │ -293template class │ │ │ │ │ -DerivativeTraits> │ │ │ │ │ -_2_9_4struct _D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_F_u_n_c_t_i_o_n : │ │ │ │ │ -295 Refines< │ │ │ │ │ -296 Dune::Functions::Concept::DifferentiableFunction, │ │ │ │ │ -297 Dune::Functions::Concept::GridFunction │ │ │ │ │ -298 > │ │ │ │ │ -299{ │ │ │ │ │ -_3_0_0 using _L_o_c_a_l_S_i_g_n_a_t_u_r_e = Range(typename EntitySet::LocalCoordinate); │ │ │ │ │ -_3_0_1 using _L_o_c_a_l_C_o_n_t_e_x_t = typename EntitySet::Element; │ │ │ │ │ -302 │ │ │ │ │ -303 template │ │ │ │ │ -_3_0_4 using _L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s = typename _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_: │ │ │ │ │ -_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_E_n_t_i_t_y_S_e_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_>_:_:_t_e_m_p_l_a_t_e Traits; │ │ │ │ │ -305 │ │ │ │ │ -306 template │ │ │ │ │ -_3_0_7 auto _r_e_q_u_i_r_e(F&& f) -> decltype( │ │ │ │ │ -308 requireConcept>(localFunction(f)) │ │ │ │ │ -309 ); │ │ │ │ │ -310}; │ │ │ │ │ -311 │ │ │ │ │ -313template class │ │ │ │ │ -DerivativeTraits = _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s> │ │ │ │ │ -_3_1_4static constexpr bool _i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_F_u_n_c_t_i_o_n() │ │ │ │ │ -315{ return models, F>(); } │ │ │ │ │ -316 │ │ │ │ │ -317 │ │ │ │ │ -318 │ │ │ │ │ -319// GridViewFunction concept ############################################## │ │ │ │ │ -320template │ │ │ │ │ -_3_2_1struct _G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n; │ │ │ │ │ -322 │ │ │ │ │ -335template │ │ │ │ │ -_3_3_6struct _G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n : │ │ │ │ │ -337 Refines>> │ │ │ │ │ -338{ │ │ │ │ │ -339 template │ │ │ │ │ -_3_4_0 auto _r_e_q_u_i_r_e(F&& f) -> decltype( │ │ │ │ │ -341 0 // We don't need to check any further expressions, because a │ │ │ │ │ -GridViewFunction is just a GridFunction with a special EntitySet │ │ │ │ │ -342 ); │ │ │ │ │ -343}; │ │ │ │ │ -344 │ │ │ │ │ -346template │ │ │ │ │ -_3_4_7static constexpr bool _i_s_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n() │ │ │ │ │ -348{ return models, F>(); } │ │ │ │ │ -349 │ │ │ │ │ -350 │ │ │ │ │ -351// DifferentiableGridViewFunction concept │ │ │ │ │ -############################################## │ │ │ │ │ -352template class │ │ │ │ │ -DerivativeTraits = _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s> │ │ │ │ │ -_3_5_3struct _D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n; │ │ │ │ │ -354 │ │ │ │ │ -368template class │ │ │ │ │ -DerivativeTraits> │ │ │ │ │ -_3_6_9struct _D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n : │ │ │ │ │ -370 Refines, DerivativeTraits>> │ │ │ │ │ -371{ │ │ │ │ │ -372 template │ │ │ │ │ -_3_7_3 auto _r_e_q_u_i_r_e(F&& f) -> decltype( │ │ │ │ │ -374 0 // We don't need to check any further expressions, because a │ │ │ │ │ -GridViewFunction is just a GridFunction with a special EntitySet │ │ │ │ │ -375 ); │ │ │ │ │ -376}; │ │ │ │ │ -377 │ │ │ │ │ -379template class │ │ │ │ │ -DerivativeTraits = _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s> │ │ │ │ │ -_3_8_0static constexpr bool _i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n() │ │ │ │ │ -381{ return models, F>(); } │ │ │ │ │ -382 │ │ │ │ │ -383 │ │ │ │ │ -384 │ │ │ │ │ -385}}} // namespace Dune::Functions::Concept │ │ │ │ │ -386 │ │ │ │ │ -387#endif // DUNE_FUNCTIONS_COMMON_FUNCTIONCONCEPT_HH │ │ │ │ │ -_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h │ │ │ │ │ -_l_o_c_a_l_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h │ │ │ │ │ -_s_i_g_n_a_t_u_r_e_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ -static constexpr bool isGridFunction() │ │ │ │ │ -Check if F models the GridFunction concept with given signature and entity set. │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:273 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ -static constexpr bool isDifferentiableLocalFunction() │ │ │ │ │ -Check if F models the DifferentiableLocalFunction concept with given signature │ │ │ │ │ -and local context. │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:208 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_F_u_n_c_t_i_o_n │ │ │ │ │ -static constexpr bool isFunction() │ │ │ │ │ -Check if F models the Function concept with given signature. │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:92 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ -static constexpr bool isDifferentiableGridViewFunction() │ │ │ │ │ -Check if F models the DifferentiableGridViewFunction concept with given │ │ │ │ │ -signature. │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:380 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n │ │ │ │ │ -static constexpr bool isDifferentiableFunction() │ │ │ │ │ -Check if F models the DifferentiableFunction concept with given signature. │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:131 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ -static constexpr bool isGridViewFunction() │ │ │ │ │ -Check if F models the GridViewFunction concept with given signature. │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:347 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_E_n_t_i_t_y_S_e_t │ │ │ │ │ -static constexpr bool isEntitySet() │ │ │ │ │ -Check if F models the GridFunction concept with given signature and entity set. │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:235 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ -static constexpr bool isDifferentiableGridFunction() │ │ │ │ │ -Check if F models the DifferentiableGridFunction concept with given signature │ │ │ │ │ -and entity set. │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:314 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ -static constexpr bool isLocalFunction() │ │ │ │ │ -Check if F models the LocalFunction concept with given signature and local │ │ │ │ │ -context. │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:170 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ -TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const │ │ │ │ │ -TrigonometricFunction< K, sinFactor, cosFactor > &f) │ │ │ │ │ -Obtain derivative of TrigonometricFunction function. │ │ │ │ │ -DDeeffiinniittiioonn trigonometricfunction.hh:43 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_C_a_l_l_a_b_l_e │ │ │ │ │ -static constexpr auto isCallable() │ │ │ │ │ -Check if f is callable with given argument list. │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:51 │ │ │ │ │ +_2_6class _I_n_v_a_l_i_d_R_a_n_g_e │ │ │ │ │ +27{}; │ │ │ │ │ +28 │ │ │ │ │ +29 │ │ │ │ │ +39template │ │ │ │ │ +_4_0struct _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ +41{ │ │ │ │ │ +_4_3 typedef _I_n_v_a_l_i_d_R_a_n_g_e _R_a_n_g_e; │ │ │ │ │ +44}; │ │ │ │ │ +45 │ │ │ │ │ +46 │ │ │ │ │ +54template<> │ │ │ │ │ +_5_5struct _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s< double(double) > │ │ │ │ │ +56{ │ │ │ │ │ +_5_8 typedef double _R_a_n_g_e; │ │ │ │ │ +59}; │ │ │ │ │ +60 │ │ │ │ │ +70template │ │ │ │ │ +_7_1struct _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s)> │ │ │ │ │ +72{ │ │ │ │ │ +_7_4 typedef FieldVector _R_a_n_g_e; │ │ │ │ │ +75}; │ │ │ │ │ +76 │ │ │ │ │ +86template │ │ │ │ │ +_8_7struct _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s(FieldVector)> │ │ │ │ │ +88{ │ │ │ │ │ +_9_0 typedef FieldMatrix _R_a_n_g_e; │ │ │ │ │ +91}; │ │ │ │ │ +92 │ │ │ │ │ +102template │ │ │ │ │ +_1_0_3struct _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s(FieldVector)> │ │ │ │ │ +104{ │ │ │ │ │ +_1_0_6 typedef FieldMatrix _R_a_n_g_e; │ │ │ │ │ +107}; │ │ │ │ │ +108 │ │ │ │ │ +109 │ │ │ │ │ +110}} // namespace Dune::Functions │ │ │ │ │ +111 │ │ │ │ │ +112 │ │ │ │ │ +113#endif // DUNE_FUNCTIONS_COMMON_DEFAULT_DERIVATIVE_TRAITS_HH │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_n_v_a_l_i_d_R_a_n_g_e │ │ │ │ │ +Dummy range class to be used if no proper type is available. │ │ │ │ │ +DDeeffiinniittiioonn defaultderivativetraits.hh:27 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ Default implementation for derivative traits. │ │ │ │ │ DDeeffiinniittiioonn defaultderivativetraits.hh:41 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_C_a_l_l_a_b_l_e │ │ │ │ │ -Concept objects that can be called with given argument list. │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:37 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_C_a_l_l_a_b_l_e_:_:_r_e_q_u_i_r_e │ │ │ │ │ -auto require(F &&f) -> decltype(f(std::declval< Args >()...)) │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_F_u_n_c_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:70 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_>_:_:_r_e_q_u_i_r_e │ │ │ │ │ -auto require(F &&f) -> decltype(requireConvertible< Range >(f(std::declval< │ │ │ │ │ -Domain >()))) │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:104 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e │ │ │ │ │ -typename SignatureTraits< Range(Domain)>::template DerivativeSignature< │ │ │ │ │ -DerivativeTraits > DerivativeSignature │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:120 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_r_e_q_u_i_r_e │ │ │ │ │ -auto require(F &&f) -> decltype(derivative(f), requireConcept< Function< │ │ │ │ │ -DerivativeSignature > >(derivative(f))) │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:143 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _L_o_c_a_l_C_o_n_t_e_x_t_ _>_:_:_r_e_q_u_i_r_e │ │ │ │ │ -auto require(F &&f) -> decltype(f.bind(std::declval< LocalContext >()), │ │ │ │ │ -f.unbind(), requireConvertible< bool >(f.bound()), f.localContext(), │ │ │ │ │ -requireConvertible< LocalContext >(f.localContext())) │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:176 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ -_L_o_c_a_l_C_o_n_t_e_x_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_r_e_q_u_i_r_e │ │ │ │ │ -auto require(F &&f) -> decltype(f.bind(std::declval< LocalContext >()), │ │ │ │ │ -f.unbind(), f.localContext(), requireConvertible< LocalContext >(f.localContext │ │ │ │ │ -())) │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_E_n_t_i_t_y_S_e_t │ │ │ │ │ -Concept for an entity set for a Concept::GridFunction │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:224 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_E_n_t_i_t_y_S_e_t_:_:_r_e_q_u_i_r_e │ │ │ │ │ -auto require(E &&f) -> decltype(requireType< typename E::Element >(), │ │ │ │ │ -requireType< typename E::LocalCoordinate >(), requireType< typename E:: │ │ │ │ │ -GlobalCoordinate >()) │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:242 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_n_t_i_t_y_S_e_t_ _>_:_: │ │ │ │ │ -_L_o_c_a_l_C_o_n_t_e_x_t │ │ │ │ │ -typename EntitySet::Element LocalContext │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:258 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_n_t_i_t_y_S_e_t_ _>_:_: │ │ │ │ │ -_L_o_c_a_l_S_i_g_n_a_t_u_r_e │ │ │ │ │ -Range(typename EntitySet::LocalCoordinate) LocalSignature │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:257 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_n_t_i_t_y_S_e_t_ _>_:_:_r_e_q_u_i_r_e │ │ │ │ │ -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 >()) │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:279 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_n_t_i_t_y_S_e_t_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ -typename Dune::Functions::LocalDerivativeTraits< EntitySet, DerivativeTraits │ │ │ │ │ ->::template Traits< R > LocalDerivativeTraits │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:304 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_n_t_i_t_y_S_e_t_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_r_e_q_u_i_r_e │ │ │ │ │ -auto require(F &&f) -> decltype(requireConcept< DifferentiableLocalFunction< │ │ │ │ │ -LocalSignature, LocalContext, LocalDerivativeTraits > >(localFunction(f))) │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_n_t_i_t_y_S_e_t_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_L_o_c_a_l_S_i_g_n_a_t_u_r_e │ │ │ │ │ -Range(typename EntitySet::LocalCoordinate) LocalSignature │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:300 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_n_t_i_t_y_S_e_t_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_L_o_c_a_l_C_o_n_t_e_x_t │ │ │ │ │ -typename EntitySet::Element LocalContext │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:301 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:321 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_r_i_d_V_i_e_w_ _>_:_:_r_e_q_u_i_r_e │ │ │ │ │ -auto require(F &&f) -> decltype(0) │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn functionconcepts.hh:353 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ -_G_r_i_d_V_i_e_w_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_r_e_q_u_i_r_e │ │ │ │ │ -auto require(F &&f) -> decltype(0) │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_r_a_i_t_s │ │ │ │ │ -Helper class to deduce the signature of a callable. │ │ │ │ │ -DDeeffiinniittiioonn signature.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_a_g │ │ │ │ │ -DDeeffiinniittiioonn signature.hh:106 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ -Derivative traits for local functions. │ │ │ │ │ -DDeeffiinniittiioonn localderivativetraits.hh:32 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_:_:_R_a_n_g_e │ │ │ │ │ +InvalidRange Range │ │ │ │ │ +Range of derivative for function with given signature. │ │ │ │ │ +DDeeffiinniittiioonn defaultderivativetraits.hh:43 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_ _d_o_u_b_l_e_(_d_o_u_b_l_e_)_ _>_:_:_R_a_n_g_e │ │ │ │ │ +double Range │ │ │ │ │ +Range of derivative for function with given signature. │ │ │ │ │ +DDeeffiinniittiioonn defaultderivativetraits.hh:58 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_ _K_(_F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _n_ _>_)_>_:_:_R_a_n_g_e │ │ │ │ │ +FieldVector< K, n > Range │ │ │ │ │ +Range of derivative for function with given signature. │ │ │ │ │ +DDeeffiinniittiioonn defaultderivativetraits.hh:74 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _m_ _>_(_F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _n │ │ │ │ │ +_>_)_>_:_:_R_a_n_g_e │ │ │ │ │ +FieldMatrix< K, m, n > Range │ │ │ │ │ +Range of derivative for function with given signature. │ │ │ │ │ +DDeeffiinniittiioonn defaultderivativetraits.hh:90 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _1_,_ _m_ _>_(_F_i_e_l_d_V_e_c_t_o_r_< │ │ │ │ │ +_K_,_ _n_ _>_)_>_:_:_R_a_n_g_e │ │ │ │ │ +FieldMatrix< K, m, n > Range │ │ │ │ │ +Range of derivative for function with given signature. │ │ │ │ │ +DDeeffiinniittiioonn defaultderivativetraits.hh:106 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00050.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: staticforloop.hh File Reference │ │ │ │ +dune-functions: overflowarray.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,38 +70,40 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
staticforloop.hh File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces
│ │ │ │ +
overflowarray.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <dune/common/concept.hh>
│ │ │ │ -#include <dune/functions/common/type_traits.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │ +
#include <algorithm>
│ │ │ │ +#include <iostream>
│ │ │ │ +#include <cstddef>
│ │ │ │ +#include <array>
│ │ │ │ +#include <initializer_list>
│ │ │ │ +#include <dune/common/genericiterator.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ +Classes

class  Dune::Functions::OverflowArray< BA, maxSize >
 A dynamically sized array-like class with overflow. 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.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,25 +1,27 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -staticforloop.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +overflowarray.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_<_ _B_A_,_ _m_a_x_S_i_z_e_ _> │ │ │ │ │ +  A dynamically sized array-like class with overflow. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_t_a_t_i_c_F_i_n_d_I_n_R_a_n_g_e (F &&f, Args &&... args) │ │ │ │ │ -  Static find loop. │ │ │ │ │ -  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00050_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: staticforloop.hh Source File │ │ │ │ +dune-functions: overflowarray.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,81 +74,282 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
staticforloop.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_COMMON_STATICFORLOOP_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_COMMON_STATICFORLOOP_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_COMMON_OVERFLOWARRAY_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_COMMON_OVERFLOWARRAY_HH
│ │ │ │
9
│ │ │ │ -
10
│ │ │ │ -
11#include <dune/common/concept.hh>
│ │ │ │ -
12
│ │ │ │ - │ │ │ │ - │ │ │ │ +
10#include <algorithm>
│ │ │ │ +
11#include <iostream>
│ │ │ │ +
12#include <cstddef>
│ │ │ │ +
13#include <array>
│ │ │ │ +
14#include <initializer_list>
│ │ │ │
15
│ │ │ │ -
16
│ │ │ │ -
17namespace Dune {
│ │ │ │ -
18namespace Functions {
│ │ │ │ +
16#include <dune/common/genericiterator.hh>
│ │ │ │ +
17
│ │ │ │ +
18
│ │ │ │
19
│ │ │ │ -
20namespace Imp {
│ │ │ │ +
20namespace Dune::Functions {
│ │ │ │
21
│ │ │ │ -
22template<class ST, ST begin, ST end>
│ │ │ │ -
23struct StaticFindInRange
│ │ │ │ -
24{
│ │ │ │ -
25 template<class F, class...Args>
│ │ │ │ -
26 static void apply(F&& f, Args&&... args)
│ │ │ │ -
27 {
│ │ │ │ -
28 if (f(std::integral_constant<ST, begin>(), std::forward<Args>(args)...))
│ │ │ │ -
29 return;
│ │ │ │ -
30 StaticFindInRange<ST, begin+1, end>::apply(std::forward<F>(f), std::forward<Args>(args)...);
│ │ │ │ -
31 }
│ │ │ │ -
32};
│ │ │ │ -
33
│ │ │ │ -
34template<class ST, ST end>
│ │ │ │ -
35struct StaticFindInRange<ST, end, end>
│ │ │ │ -
36{
│ │ │ │ -
37 template<class F, class...Args>
│ │ │ │ -
38 static void apply(F&& f, Args&&...)
│ │ │ │ -
39 {}
│ │ │ │ -
40};
│ │ │ │ -
41
│ │ │ │ -
42} //end namespace Imp
│ │ │ │ -
43
│ │ │ │ -
44
│ │ │ │ -
45
│ │ │ │ -
59template<std::size_t begin_t, std::size_t end_t, class F, class... Args>
│ │ │ │ -
│ │ │ │ -
60void staticFindInRange(F&& f, Args&&... args)
│ │ │ │ -
61{
│ │ │ │ -
62 Imp::StaticFindInRange<std::size_t, begin_t, end_t>::apply(std::forward<F>(f), std::forward<Args>(args)...);
│ │ │ │ -
63}
│ │ │ │ -
│ │ │ │ -
64
│ │ │ │ -
65
│ │ │ │ -
66} // namespace Dune::Functions
│ │ │ │ -
67} // namespace Dune
│ │ │ │ +
22
│ │ │ │ +
46template<class BA, std::size_t maxSize = std::tuple_size_v<BA>>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
48 public BA
│ │ │ │ +
49{
│ │ │ │ +
50 static constexpr std::size_t baseSize = std::tuple_size_v<BA>;
│ │ │ │ +
51
│ │ │ │ +
52public:
│ │ │ │ +
53 using BaseArray = BA;
│ │ │ │ +
54
│ │ │ │ +
55 using value_type = typename BaseArray::value_type;
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
59 using difference_type = std::ptrdiff_t;
│ │ │ │ +
60 using size_type = std::size_t;
│ │ │ │ +
61 using iterator = Dune::GenericIterator<OverflowArray, value_type>;
│ │ │ │ +
62 using const_iterator = Dune::GenericIterator<const OverflowArray, const value_type>;
│ │ │ │ +
63
│ │ │ │ +
64private:
│ │ │ │ +
65 using OverflowBuffer = std::array<value_type, maxSize-baseSize>;
│ │ │ │ +
66
│ │ │ │ +
67public:
│ │ │ │
68
│ │ │ │ -
69
│ │ │ │ +
69 OverflowArray() = default;
│ │ │ │
70
│ │ │ │ -
71#endif //DUNE_FUNCTIONS_COMMON_STATICFORLOOP_HH
│ │ │ │ - │ │ │ │ -
void staticFindInRange(F &&f, Args &&... args)
Static find loop.
Definition staticforloop.hh:60
│ │ │ │ -
Definition polynomial.hh:17
│ │ │ │ - │ │ │ │ +
│ │ │ │ +
71 OverflowArray(const std::initializer_list<value_type>& l) {
│ │ │ │ +
72 assert(l.size() <= capacity());
│ │ │ │ +
73 size_ = l.size();
│ │ │ │ +
74 std::copy_n(l.begin(), size_, begin());
│ │ │ │ +
75 }
│ │ │ │ +
│ │ │ │ +
76
│ │ │ │ +
│ │ │ │ +
77 bool operator == (const OverflowArray& other) const {
│ │ │ │ +
78 if (size() != other.size())
│ │ │ │ +
79 return false;
│ │ │ │ +
80 for (size_type i=0; i<size(); ++i)
│ │ │ │ +
81 if ((*this)[i] != other[i])
│ │ │ │ +
82 return false;
│ │ │ │ +
83 return true;
│ │ │ │ +
84 }
│ │ │ │ +
│ │ │ │ +
85
│ │ │ │ +
│ │ │ │ +
87 void clear() {
│ │ │ │ +
88 size_ = 0;
│ │ │ │ +
89 }
│ │ │ │ +
│ │ │ │ +
90
│ │ │ │ +
│ │ │ │ +
97 void resize(size_type n) {
│ │ │ │ +
98 assert(n <= capacity());
│ │ │ │ +
99 size_ = n;
│ │ │ │ +
100 }
│ │ │ │ +
│ │ │ │ +
101
│ │ │ │ +
│ │ │ │ +
108 void push_back(const value_type& t) {
│ │ │ │ +
109 assert(size() < capacity());
│ │ │ │ +
110 (*this)[size_++] = t;
│ │ │ │ +
111 }
│ │ │ │ +
│ │ │ │ +
112
│ │ │ │ +
│ │ │ │ +
114 void pop_back() {
│ │ │ │ +
115 assert(size() > 0);
│ │ │ │ +
116 if (! empty())
│ │ │ │ +
117 size_--;
│ │ │ │ +
118 }
│ │ │ │ +
│ │ │ │ +
119
│ │ │ │ +
│ │ │ │ +
126 void push_front(const value_type& t) {
│ │ │ │ +
127 assert(size() < capacity());
│ │ │ │ +
128 for (size_type i=0; i<size(); i++)
│ │ │ │ +
129 (*this)[i+1] = (*this)[i];
│ │ │ │ +
130 (*this)[0] = t;
│ │ │ │ +
131 }
│ │ │ │ +
│ │ │ │ +
132
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
135 return iterator(*this, 0);
│ │ │ │ +
136 }
│ │ │ │ +
│ │ │ │ +
137
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
140 return const_iterator(*this, 0);
│ │ │ │ +
141 }
│ │ │ │ +
│ │ │ │ +
142
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
145 return iterator(*this, size());
│ │ │ │ +
146 }
│ │ │ │ +
│ │ │ │ +
147
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
150 return const_iterator(*this, size());
│ │ │ │ +
151 }
│ │ │ │ +
│ │ │ │ +
152
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
155 assert(i < size());
│ │ │ │ +
156 // If there's no padding between the base class and the overflow_ member,
│ │ │ │ +
157 // the compiler should be able to optimize this to
│ │ │ │ +
158 // return *(&BaseArray::operator[](0) + i);
│ │ │ │ +
159 if (i<baseSize)
│ │ │ │ +
160 return BaseArray::operator[](i);
│ │ │ │ +
161 return overflow_[i-baseSize];
│ │ │ │ +
162 }
│ │ │ │ +
│ │ │ │ +
163
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
166 assert(i < size());
│ │ │ │ +
167 // If there's no padding between the base class and the overflow_ member,
│ │ │ │ +
168 // the compiler should be able to optimize this to
│ │ │ │ +
169 // return *(&BaseArray::operator[](0) + i);
│ │ │ │ +
170 if (i<baseSize)
│ │ │ │ +
171 return BaseArray::operator[](i);
│ │ │ │ +
172 return overflow_[i-baseSize];
│ │ │ │ +
173 }
│ │ │ │ +
│ │ │ │ +
174
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
177 assert(size() > 0);
│ │ │ │ +
178 return (*this)[0];
│ │ │ │ +
179 }
│ │ │ │ +
│ │ │ │ +
180
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
183 assert(size() > 0);
│ │ │ │ +
184 return (*this)[0];
│ │ │ │ +
185 }
│ │ │ │ +
│ │ │ │ +
186
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
189 assert(size() > 0);
│ │ │ │ +
190 return (*this)[size()-1];
│ │ │ │ +
191 }
│ │ │ │ +
│ │ │ │ +
192
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
195 assert(size() > 0);
│ │ │ │ +
196 return (*this)[size()-1];
│ │ │ │ +
197 }
│ │ │ │ +
│ │ │ │ +
198
│ │ │ │ +
│ │ │ │ +
200 size_type size () const {
│ │ │ │ +
201 return size_;
│ │ │ │ +
202 }
│ │ │ │ +
│ │ │ │ +
203
│ │ │ │ +
│ │ │ │ +
205 bool empty() const {
│ │ │ │ +
206 return size() == 0;
│ │ │ │ +
207 }
│ │ │ │ +
│ │ │ │ +
208
│ │ │ │ +
│ │ │ │ +
210 static constexpr size_type capacity() {
│ │ │ │ +
211 return maxSize;
│ │ │ │ +
212 }
│ │ │ │ +
│ │ │ │ +
213
│ │ │ │ +
│ │ │ │ +
215 static constexpr size_type max_size() {
│ │ │ │ +
216 return maxSize;
│ │ │ │ +
217 }
│ │ │ │ +
│ │ │ │ +
218
│ │ │ │ +
│ │ │ │ +
220 inline friend std::size_t hash_value(const OverflowArray& v) noexcept {
│ │ │ │ +
221 return hash_range(v.begin(), v.end());
│ │ │ │ +
222 }
│ │ │ │ +
│ │ │ │ +
223
│ │ │ │ +
│ │ │ │ +
225 friend std::ostream& operator<< (std::ostream& s, const OverflowArray& c) {
│ │ │ │ +
226 for (const auto& ci : c)
│ │ │ │ +
227 s << ci << " ";
│ │ │ │ +
228 return s;
│ │ │ │ +
229 }
│ │ │ │ +
│ │ │ │ +
230
│ │ │ │ +
231private:
│ │ │ │ +
232 OverflowBuffer overflow_;
│ │ │ │ +
233 size_type size_ = 0;
│ │ │ │ +
234};
│ │ │ │ +
│ │ │ │ +
235
│ │ │ │ +
236
│ │ │ │ +
237
│ │ │ │ +
238} // namespace Dune::Functions
│ │ │ │ +
239
│ │ │ │ +
240
│ │ │ │ +
241
│ │ │ │ +
242#endif // DUNE_FUNCTIONS_COMMON_OVERFLOWARRAY_HH
│ │ │ │ +
Definition polynomial.hh:18
│ │ │ │ +
A dynamically sized array-like class with overflow.
Definition overflowarray.hh:49
│ │ │ │ +
const value_type & const_reference
Definition overflowarray.hh:57
│ │ │ │ +
value_type & reference
Definition overflowarray.hh:56
│ │ │ │ +
const_iterator end() const
Returns a const_iterator pointing to the end of the OverflowArray.
Definition overflowarray.hh:149
│ │ │ │ +
bool operator==(const OverflowArray &other) const
Definition overflowarray.hh:77
│ │ │ │ +
friend std::size_t hash_value(const OverflowArray &v) noexcept
Compute hash value.
Definition overflowarray.hh:220
│ │ │ │ +
void push_back(const value_type &t)
Appends an element to the end of the OverflowArray,.
Definition overflowarray.hh:108
│ │ │ │ +
friend std::ostream & operator<<(std::ostream &s, const OverflowArray &c)
Write container to an output stream.
Definition overflowarray.hh:225
│ │ │ │ +
iterator begin()
Returns a iterator pointing to the beginning of the OverflowArray.
Definition overflowarray.hh:134
│ │ │ │ +
bool empty() const
Returns true if OverflowArray has no elements.
Definition overflowarray.hh:205
│ │ │ │ +
size_type size() const
Returns number of elements in the OverflowArray.
Definition overflowarray.hh:200
│ │ │ │ +
typename BaseArray::value_type value_type
Definition overflowarray.hh:55
│ │ │ │ +
void pop_back()
Erases the last element of the OverflowArray, O(1) time.
Definition overflowarray.hh:114
│ │ │ │ +
Dune::GenericIterator< OverflowArray, value_type > iterator
Definition overflowarray.hh:61
│ │ │ │ +
const_iterator begin() const
Returns a const_iterator pointing to the beginning of the OverflowArray.
Definition overflowarray.hh:139
│ │ │ │ +
std::ptrdiff_t difference_type
Definition overflowarray.hh:59
│ │ │ │ + │ │ │ │ +
BA BaseArray
Definition overflowarray.hh:53
│ │ │ │ +
static constexpr size_type capacity()
Returns the capacity of the OverflowArray.
Definition overflowarray.hh:210
│ │ │ │ +
static constexpr size_type max_size()
Returns the maximum length of the OverflowArray.
Definition overflowarray.hh:215
│ │ │ │ +
const_reference front() const
Returns const reference to first element of OverflowArray.
Definition overflowarray.hh:182
│ │ │ │ +
void clear()
Erases all elements.
Definition overflowarray.hh:87
│ │ │ │ +
iterator end()
Returns an iterator pointing to the end of the OverflowArray.
Definition overflowarray.hh:144
│ │ │ │ +
std::size_t size_type
Definition overflowarray.hh:60
│ │ │ │ +
void resize(size_type n)
Specifies a new size for the OverflowArray.
Definition overflowarray.hh:97
│ │ │ │ +
value_type * pointer
Definition overflowarray.hh:58
│ │ │ │ +
Dune::GenericIterator< const OverflowArray, const value_type > const_iterator
Definition overflowarray.hh:62
│ │ │ │ +
const_reference back() const
Returns const reference to last element of OverflowArray.
Definition overflowarray.hh:194
│ │ │ │ +
OverflowArray(const std::initializer_list< value_type > &l)
Definition overflowarray.hh:71
│ │ │ │ +
reference back()
Returns reference to last element of OverflowArray.
Definition overflowarray.hh:188
│ │ │ │ +
void push_front(const value_type &t)
Inserts an element to the begin of the OverflowArray,.
Definition overflowarray.hh:126
│ │ │ │ +
reference front()
Returns reference to first element of OverflowArray.
Definition overflowarray.hh:176
│ │ │ │ +
reference operator[](size_type i)
Returns reference to the i'th element.
Definition overflowarray.hh:154
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,81 +1,317 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -staticforloop.hh │ │ │ │ │ +overflowarray.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_COMMON_STATICFORLOOP_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_COMMON_STATICFORLOOP_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_COMMON_OVERFLOWARRAY_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_COMMON_OVERFLOWARRAY_HH │ │ │ │ │ 9 │ │ │ │ │ -10 │ │ │ │ │ -11#include │ │ │ │ │ -12 │ │ │ │ │ -13#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ -14#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ 15 │ │ │ │ │ -16 │ │ │ │ │ -17namespace _D_u_n_e { │ │ │ │ │ -18namespace Functions { │ │ │ │ │ +16#include │ │ │ │ │ +17 │ │ │ │ │ +18 │ │ │ │ │ 19 │ │ │ │ │ -20namespace Imp { │ │ │ │ │ +20namespace _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s { │ │ │ │ │ 21 │ │ │ │ │ -22template │ │ │ │ │ -23struct StaticFindInRange │ │ │ │ │ -24{ │ │ │ │ │ -25 template │ │ │ │ │ -26 static void apply(F&& f, Args&&... args) │ │ │ │ │ -27 { │ │ │ │ │ -28 if (f(std::integral_constant(), std::forward(args)...)) │ │ │ │ │ -29 return; │ │ │ │ │ -30 StaticFindInRange::apply(std::forward(f), std:: │ │ │ │ │ -forward(args)...); │ │ │ │ │ -31 } │ │ │ │ │ -32}; │ │ │ │ │ -33 │ │ │ │ │ -34template │ │ │ │ │ -35struct StaticFindInRange │ │ │ │ │ -36{ │ │ │ │ │ -37 template │ │ │ │ │ -38 static void apply(F&& f, Args&&...) │ │ │ │ │ -39 {} │ │ │ │ │ -40}; │ │ │ │ │ -41 │ │ │ │ │ -42} //end namespace Imp │ │ │ │ │ -43 │ │ │ │ │ -44 │ │ │ │ │ -45 │ │ │ │ │ -59template │ │ │ │ │ -_6_0void _s_t_a_t_i_c_F_i_n_d_I_n_R_a_n_g_e(F&& f, Args&&... args) │ │ │ │ │ -61{ │ │ │ │ │ -62 Imp::StaticFindInRange::apply(std::forward │ │ │ │ │ -(f), std::forward(args)...); │ │ │ │ │ -63} │ │ │ │ │ -64 │ │ │ │ │ -65 │ │ │ │ │ -66} // namespace Dune::Functions │ │ │ │ │ -67} // namespace Dune │ │ │ │ │ +22 │ │ │ │ │ +46template> │ │ │ │ │ +_4_7class _O_v_e_r_f_l_o_w_A_r_r_a_y : │ │ │ │ │ +48 public BA │ │ │ │ │ +49{ │ │ │ │ │ +50 static constexpr std::size_t baseSize = std::tuple_size_v; │ │ │ │ │ +51 │ │ │ │ │ +52public: │ │ │ │ │ +_5_3 using _B_a_s_e_A_r_r_a_y = BA; │ │ │ │ │ +54 │ │ │ │ │ +_5_5 using _v_a_l_u_e___t_y_p_e = typename BaseArray::value_type; │ │ │ │ │ +_5_6 using _r_e_f_e_r_e_n_c_e = _v_a_l_u_e___t_y_p_e&; │ │ │ │ │ +_5_7 using _c_o_n_s_t___r_e_f_e_r_e_n_c_e = const _v_a_l_u_e___t_y_p_e&; │ │ │ │ │ +_5_8 using _p_o_i_n_t_e_r = _v_a_l_u_e___t_y_p_e*; │ │ │ │ │ +_5_9 using _d_i_f_f_e_r_e_n_c_e___t_y_p_e = std::ptrdiff_t; │ │ │ │ │ +_6_0 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ +_6_1 using _i_t_e_r_a_t_o_r = Dune::GenericIterator; │ │ │ │ │ +_6_2 using _c_o_n_s_t___i_t_e_r_a_t_o_r = Dune::GenericIterator; │ │ │ │ │ +63 │ │ │ │ │ +64private: │ │ │ │ │ +65 using OverflowBuffer = std::array<_v_a_l_u_e___t_y_p_e, maxSize-baseSize>; │ │ │ │ │ +66 │ │ │ │ │ +67public: │ │ │ │ │ 68 │ │ │ │ │ -69 │ │ │ │ │ +_6_9 _O_v_e_r_f_l_o_w_A_r_r_a_y() = default; │ │ │ │ │ 70 │ │ │ │ │ -71#endif //DUNE_FUNCTIONS_COMMON_STATICFORLOOP_HH │ │ │ │ │ -_t_y_p_e___t_r_a_i_t_s_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_t_a_t_i_c_F_i_n_d_I_n_R_a_n_g_e │ │ │ │ │ -void staticFindInRange(F &&f, Args &&... args) │ │ │ │ │ -Static find loop. │ │ │ │ │ -DDeeffiinniittiioonn staticforloop.hh:60 │ │ │ │ │ -_D_u_n_e │ │ │ │ │ -DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ +_7_1 _O_v_e_r_f_l_o_w_A_r_r_a_y(const std::initializer_list& l) { │ │ │ │ │ +72 assert(l.size() <= _c_a_p_a_c_i_t_y()); │ │ │ │ │ +73 size_ = l.size(); │ │ │ │ │ +74 std::copy_n(l.begin(), size_, _b_e_g_i_n()); │ │ │ │ │ +75 } │ │ │ │ │ +76 │ │ │ │ │ +_7_7 bool _o_p_e_r_a_t_o_r_ _=_=_ (const _O_v_e_r_f_l_o_w_A_r_r_a_y& other) const { │ │ │ │ │ +78 if (_s_i_z_e() != other._s_i_z_e()) │ │ │ │ │ +79 return false; │ │ │ │ │ +80 for (_s_i_z_e___t_y_p_e i=0; i<_s_i_z_e(); ++i) │ │ │ │ │ +81 if ((*this)[i] != other[i]) │ │ │ │ │ +82 return false; │ │ │ │ │ +83 return true; │ │ │ │ │ +84 } │ │ │ │ │ +85 │ │ │ │ │ +_8_7 void _c_l_e_a_r() { │ │ │ │ │ +88 size_ = 0; │ │ │ │ │ +89 } │ │ │ │ │ +90 │ │ │ │ │ +_9_7 void _r_e_s_i_z_e(_s_i_z_e___t_y_p_e n) { │ │ │ │ │ +98 assert(n <= _c_a_p_a_c_i_t_y()); │ │ │ │ │ +99 size_ = n; │ │ │ │ │ +100 } │ │ │ │ │ +101 │ │ │ │ │ +_1_0_8 void _p_u_s_h___b_a_c_k(const _v_a_l_u_e___t_y_p_e& t) { │ │ │ │ │ +109 assert(_s_i_z_e() < _c_a_p_a_c_i_t_y()); │ │ │ │ │ +110 (*this)[size_++] = t; │ │ │ │ │ +111 } │ │ │ │ │ +112 │ │ │ │ │ +_1_1_4 void _p_o_p___b_a_c_k() { │ │ │ │ │ +115 assert(_s_i_z_e() > 0); │ │ │ │ │ +116 if (! _e_m_p_t_y()) │ │ │ │ │ +117 size_--; │ │ │ │ │ +118 } │ │ │ │ │ +119 │ │ │ │ │ +_1_2_6 void _p_u_s_h___f_r_o_n_t(const _v_a_l_u_e___t_y_p_e& t) { │ │ │ │ │ +127 assert(_s_i_z_e() < _c_a_p_a_c_i_t_y()); │ │ │ │ │ +128 for (_s_i_z_e___t_y_p_e i=0; i<_s_i_z_e(); i++) │ │ │ │ │ +129 (*this)[i+1] = (*this)[i]; │ │ │ │ │ +130 (*this)[0] = t; │ │ │ │ │ +131 } │ │ │ │ │ +132 │ │ │ │ │ +_1_3_4 _i_t_e_r_a_t_o_r _b_e_g_i_n() { │ │ │ │ │ +135 return _i_t_e_r_a_t_o_r(*this, 0); │ │ │ │ │ +136 } │ │ │ │ │ +137 │ │ │ │ │ +_1_3_9 _c_o_n_s_t___i_t_e_r_a_t_o_r _b_e_g_i_n() const { │ │ │ │ │ +140 return _c_o_n_s_t___i_t_e_r_a_t_o_r(*this, 0); │ │ │ │ │ +141 } │ │ │ │ │ +142 │ │ │ │ │ +_1_4_4 _i_t_e_r_a_t_o_r _e_n_d() { │ │ │ │ │ +145 return _i_t_e_r_a_t_o_r(*this, _s_i_z_e()); │ │ │ │ │ +146 } │ │ │ │ │ +147 │ │ │ │ │ +_1_4_9 _c_o_n_s_t___i_t_e_r_a_t_o_r _e_n_d() const { │ │ │ │ │ +150 return _c_o_n_s_t___i_t_e_r_a_t_o_r(*this, _s_i_z_e()); │ │ │ │ │ +151 } │ │ │ │ │ +152 │ │ │ │ │ +_1_5_4 _r_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_[_]_ (_s_i_z_e___t_y_p_e i) { │ │ │ │ │ +155 assert(i < _s_i_z_e()); │ │ │ │ │ +156 // If there's no padding between the base class and the overflow_ member, │ │ │ │ │ +157 // the compiler should be able to optimize this to │ │ │ │ │ +158 // return *(&BaseArray::operator[](0) + i); │ │ │ │ │ +159 if (i 0); │ │ │ │ │ +178 return (*this)[0]; │ │ │ │ │ +179 } │ │ │ │ │ +180 │ │ │ │ │ +_1_8_2 _c_o_n_s_t___r_e_f_e_r_e_n_c_e _f_r_o_n_t() const { │ │ │ │ │ +183 assert(_s_i_z_e() > 0); │ │ │ │ │ +184 return (*this)[0]; │ │ │ │ │ +185 } │ │ │ │ │ +186 │ │ │ │ │ +_1_8_8 _r_e_f_e_r_e_n_c_e _b_a_c_k() { │ │ │ │ │ +189 assert(_s_i_z_e() > 0); │ │ │ │ │ +190 return (*this)[_s_i_z_e()-1]; │ │ │ │ │ +191 } │ │ │ │ │ +192 │ │ │ │ │ +_1_9_4 _c_o_n_s_t___r_e_f_e_r_e_n_c_e _b_a_c_k() const { │ │ │ │ │ +195 assert(_s_i_z_e() > 0); │ │ │ │ │ +196 return (*this)[_s_i_z_e()-1]; │ │ │ │ │ +197 } │ │ │ │ │ +198 │ │ │ │ │ +_2_0_0 _s_i_z_e___t_y_p_e _s_i_z_e () const { │ │ │ │ │ +201 return size_; │ │ │ │ │ +202 } │ │ │ │ │ +203 │ │ │ │ │ +_2_0_5 bool _e_m_p_t_y() const { │ │ │ │ │ +206 return _s_i_z_e() == 0; │ │ │ │ │ +207 } │ │ │ │ │ +208 │ │ │ │ │ +_2_1_0 static constexpr _s_i_z_e___t_y_p_e _c_a_p_a_c_i_t_y() { │ │ │ │ │ +211 return maxSize; │ │ │ │ │ +212 } │ │ │ │ │ +213 │ │ │ │ │ +_2_1_5 static constexpr _s_i_z_e___t_y_p_e _m_a_x___s_i_z_e() { │ │ │ │ │ +216 return maxSize; │ │ │ │ │ +217 } │ │ │ │ │ +218 │ │ │ │ │ +_2_2_0 inline friend std::size_t _h_a_s_h___v_a_l_u_e(const _O_v_e_r_f_l_o_w_A_r_r_a_y& v) noexcept { │ │ │ │ │ +221 return hash_range(v.begin(), v.end()); │ │ │ │ │ +222 } │ │ │ │ │ +223 │ │ │ │ │ +_2_2_5 friend std::ostream& _o_p_e_r_a_t_o_r_<_<_ (std::ostream& s, const _O_v_e_r_f_l_o_w_A_r_r_a_y& c) { │ │ │ │ │ +226 for (const auto& ci : c) │ │ │ │ │ +227 s << ci << " "; │ │ │ │ │ +228 return s; │ │ │ │ │ +229 } │ │ │ │ │ +230 │ │ │ │ │ +231private: │ │ │ │ │ +232 OverflowBuffer overflow_; │ │ │ │ │ +233 _s_i_z_e___t_y_p_e size_ = 0; │ │ │ │ │ +234}; │ │ │ │ │ +235 │ │ │ │ │ +236 │ │ │ │ │ +237 │ │ │ │ │ +238} // namespace Dune::Functions │ │ │ │ │ +239 │ │ │ │ │ +240 │ │ │ │ │ +241 │ │ │ │ │ +242#endif // DUNE_FUNCTIONS_COMMON_OVERFLOWARRAY_HH │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │ +DDeeffiinniittiioonn polynomial.hh:18 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y │ │ │ │ │ +A dynamically sized array-like class with overflow. │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:49 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ +const value_type & const_reference │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:57 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ │ +value_type & reference │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:56 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_e_n_d │ │ │ │ │ +const_iterator end() const │ │ │ │ │ +Returns a const_iterator pointing to the end of the OverflowArray. │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:149 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ +bool operator==(const OverflowArray &other) const │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:77 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_h_a_s_h___v_a_l_u_e │ │ │ │ │ +friend std::size_t hash_value(const OverflowArray &v) noexcept │ │ │ │ │ +Compute hash value. │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:220 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_p_u_s_h___b_a_c_k │ │ │ │ │ +void push_back(const value_type &t) │ │ │ │ │ +Appends an element to the end of the OverflowArray,. │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:108 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ +friend std::ostream & operator<<(std::ostream &s, const OverflowArray &c) │ │ │ │ │ +Write container to an output stream. │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:225 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_b_e_g_i_n │ │ │ │ │ +iterator begin() │ │ │ │ │ +Returns a iterator pointing to the beginning of the OverflowArray. │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:134 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_e_m_p_t_y │ │ │ │ │ +bool empty() const │ │ │ │ │ +Returns true if OverflowArray has no elements. │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:205 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_s_i_z_e │ │ │ │ │ +size_type size() const │ │ │ │ │ +Returns number of elements in the OverflowArray. │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:200 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ +typename BaseArray::value_type value_type │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:55 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_p_o_p___b_a_c_k │ │ │ │ │ +void pop_back() │ │ │ │ │ +Erases the last element of the OverflowArray, O(1) time. │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:114 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +Dune::GenericIterator< OverflowArray, value_type > iterator │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_b_e_g_i_n │ │ │ │ │ +const_iterator begin() const │ │ │ │ │ +Returns a const_iterator pointing to the beginning of the OverflowArray. │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:139 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_d_i_f_f_e_r_e_n_c_e___t_y_p_e │ │ │ │ │ +std::ptrdiff_t difference_type │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:59 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y │ │ │ │ │ +OverflowArray()=default │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_B_a_s_e_A_r_r_a_y │ │ │ │ │ +BA BaseArray │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:53 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_c_a_p_a_c_i_t_y │ │ │ │ │ +static constexpr size_type capacity() │ │ │ │ │ +Returns the capacity of the OverflowArray. │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:210 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_m_a_x___s_i_z_e │ │ │ │ │ +static constexpr size_type max_size() │ │ │ │ │ +Returns the maximum length of the OverflowArray. │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:215 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_f_r_o_n_t │ │ │ │ │ +const_reference front() const │ │ │ │ │ +Returns const reference to first element of OverflowArray. │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:182 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_c_l_e_a_r │ │ │ │ │ +void clear() │ │ │ │ │ +Erases all elements. │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:87 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_e_n_d │ │ │ │ │ +iterator end() │ │ │ │ │ +Returns an iterator pointing to the end of the OverflowArray. │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:144 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:60 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_r_e_s_i_z_e │ │ │ │ │ +void resize(size_type n) │ │ │ │ │ +Specifies a new size for the OverflowArray. │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:97 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_p_o_i_n_t_e_r │ │ │ │ │ +value_type * pointer │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:58 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ +Dune::GenericIterator< const OverflowArray, const value_type > const_iterator │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:62 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_b_a_c_k │ │ │ │ │ +const_reference back() const │ │ │ │ │ +Returns const reference to last element of OverflowArray. │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:194 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y │ │ │ │ │ +OverflowArray(const std::initializer_list< value_type > &l) │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:71 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_b_a_c_k │ │ │ │ │ +reference back() │ │ │ │ │ +Returns reference to last element of OverflowArray. │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:188 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_p_u_s_h___f_r_o_n_t │ │ │ │ │ +void push_front(const value_type &t) │ │ │ │ │ +Inserts an element to the begin of the OverflowArray,. │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:126 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_f_r_o_n_t │ │ │ │ │ +reference front() │ │ │ │ │ +Returns reference to first element of OverflowArray. │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:176 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +reference operator[](size_type i) │ │ │ │ │ +Returns reference to the i'th element. │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:154 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00053.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: reserveddeque.hh File Reference │ │ │ │ +dune-functions: signature.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -72,68 +72,51 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Macros
│ │ │ │ -
reserveddeque.hh File Reference
│ │ │ │ +Functions
│ │ │ │ +
signature.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

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>
│ │ │ │ +
#include <type_traits>
│ │ │ │ +#include <tuple>
│ │ │ │ +#include <dune/functions/common/defaultderivativetraits.hh>
│ │ │ │
│ │ │ │

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

│ │ │ │ -Macros

#define CHECKSIZE(X)   {}
 

│ │ │ │ +Functions

template<class Range , class Domain , template< class > class DerivativeTraits>
auto Dune::Functions::derivativeSignatureTag (SignatureTag< Range(Domain), DerivativeTraits > tag)
 Construct SignatureTag for derivative.
 
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.
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

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

│ │ │ │ -

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ CHECKSIZE

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
#define CHECKSIZE( X)   {}
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,37 +1,40 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s │ │ │ │ │ -reserveddeque.hh File Reference │ │ │ │ │ -An stl-compliant double-ended queue which stores everything on the stack. │ │ │ │ │ -_M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +signature.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_<_ _T_,_ _n_ _> │ │ │ │ │ -  A double-ended queue (deque) class with statically reserved memory. │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_r_a_i_t_s_<_ _S_i_g_n_a_t_u_r_e_,_ _i_s_C_a_l_l_a_b_l_e_ _> │ │ │ │ │ +  Helper class to deduce the signature of a callable. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_a_g_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_T_ _> │ │ │ │ │ +  Tag-class to encapsulate signature information. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ -MMaaccrrooss │ │ │ │ │ -#define  _C_H_E_C_K_S_I_Z_E(X)   {} │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template class │ │ │ │ │ +DerivativeTraits> │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_d_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_T_a_g (_S_i_g_n_a_t_u_r_e_T_a_g< Range(Domain), │ │ │ │ │ + DerivativeTraits > tag) │ │ │ │ │ +  Construct _S_i_g_n_a_t_u_r_e_T_a_g for derivative. │ │ │ │ │ +  │ │ │ │ │ +template class │ │ │ │ │ +DerivativeTraits> │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_d_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_T_a_g_s (_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_a_g< │ │ │ │ │ + Signature, DerivativeTraits > tag) │ │ │ │ │ +  Construct SignatureTags for derivatives. │ │ │ │ │   │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -An stl-compliant double-ended queue which stores everything on the stack. │ │ │ │ │ -********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ -********** _?◆_? CCHHEECCKKSSIIZZEE ********** │ │ │ │ │ -#define CHECKSIZE (   X )    {} │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00053_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: reserveddeque.hh Source File │ │ │ │ +dune-functions: signature.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,281 +74,168 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
reserveddeque.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_COMMON_RESERVEDDEQUE_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_COMMON_RESERVEDDEQUE_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_COMMON_SIGNATURE_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_COMMON_SIGNATURE_HH
│ │ │ │
9
│ │ │ │ -
14#include <algorithm>
│ │ │ │ -
15#include <iostream>
│ │ │ │ -
16#include <cstddef>
│ │ │ │ -
17#include <initializer_list>
│ │ │ │ -
18
│ │ │ │ -
19#include <dune/common/genericiterator.hh>
│ │ │ │ -
20
│ │ │ │ -
21#ifdef CHECK_RESERVEDDEQUE
│ │ │ │ -
22#define CHECKSIZE(X) assert(X)
│ │ │ │ -
23#else
│ │ │ │ -
24#define CHECKSIZE(X) {}
│ │ │ │ -
25#endif
│ │ │ │ -
26
│ │ │ │ -
27namespace Dune {
│ │ │ │ -
28namespace Functions {
│ │ │ │ -
29
│ │ │ │ -
47 template<class T, int n>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
49 {
│ │ │ │ -
50 public:
│ │ │ │ -
51
│ │ │ │ -
55 typedef T value_type;
│ │ │ │ -
57 typedef T* pointer;
│ │ │ │ -
59 typedef T& reference;
│ │ │ │ -
61 typedef const T& const_reference;
│ │ │ │ -
63 typedef size_t size_type;
│ │ │ │ -
65 typedef std::ptrdiff_t difference_type;
│ │ │ │ -
67 typedef Dune::GenericIterator<ReservedDeque, value_type> iterator;
│ │ │ │ -
69 typedef Dune::GenericIterator<const ReservedDeque, const value_type> const_iterator;
│ │ │ │ -
70
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
77 size_(0),
│ │ │ │ -
78 first_(0)
│ │ │ │ -
79 {}
│ │ │ │ -
│ │ │ │ +
10#include <type_traits>
│ │ │ │ +
11#include <tuple>
│ │ │ │ +
12
│ │ │ │ + │ │ │ │ +
14
│ │ │ │ +
15namespace Dune {
│ │ │ │ +
16namespace Functions {
│ │ │ │ +
17
│ │ │ │ +
23template<typename F>
│ │ │ │ + │ │ │ │ +
25
│ │ │ │ +
26#ifndef DOXYGEN
│ │ │ │ +
27template<typename F>
│ │ │ │ +
28struct IsCallable
│ │ │ │ +
29{
│ │ │ │ +
30 struct yes { std::size_t dummy[2]; };
│ │ │ │ +
31 struct no { std::size_t dummy[1]; };
│ │ │ │ +
32
│ │ │ │ +
33 template<typename C>
│ │ │ │ +
34 static yes test(const decltype(&C::operator()) *);
│ │ │ │ +
35 template<typename C>
│ │ │ │ +
36 static no test(...);
│ │ │ │ +
37
│ │ │ │ +
38 enum { value = (sizeof(test<F>(0)) == sizeof(yes)) };
│ │ │ │ +
39};
│ │ │ │ +
40
│ │ │ │ +
41template<typename R, typename D>
│ │ │ │ +
42struct IsCallable<R(D)>
│ │ │ │ +
43{
│ │ │ │ +
44 enum { value = true };
│ │ │ │ +
45};
│ │ │ │ +
46
│ │ │ │ +
47template<typename R, typename D>
│ │ │ │ +
48struct IsCallable<R(*)(D)>
│ │ │ │ +
49{
│ │ │ │ +
50 enum { value = true };
│ │ │ │ +
51};
│ │ │ │ +
52#endif
│ │ │ │ +
53
│ │ │ │ +
59template<class Signature, bool isCallable = IsCallable<Signature>::value >
│ │ │ │ + │ │ │ │ +
61
│ │ │ │ +
62#ifndef DOXYGEN
│ │ │ │ +
64template<class T>
│ │ │ │ +
65struct SignatureTraits<T, true>
│ │ │ │ +
66 : public SignatureTraits<decltype(&T::operator()), true>
│ │ │ │ +
67{};
│ │ │ │ +
68
│ │ │ │ +
70template <typename C, typename R, typename D>
│ │ │ │ +
71struct SignatureTraits<R(C::*)(D) const, true>
│ │ │ │ +
72 : public SignatureTraits<R(D), true>
│ │ │ │ +
73{};
│ │ │ │ +
74
│ │ │ │ +
76template <typename C, typename R, typename D>
│ │ │ │ +
77struct SignatureTraits<R(C::*)(D), true>
│ │ │ │ +
78 : public SignatureTraits<R(D), true>
│ │ │ │ +
79{};
│ │ │ │
80
│ │ │ │ -
│ │ │ │ -
81 ReservedDeque(std::initializer_list<T> const &l)
│ │ │ │ -
82 {
│ │ │ │ -
83 assert(l.size() <= n);// Actually, this is not needed any more!
│ │ │ │ -
84 size_ = l.size();
│ │ │ │ -
85 std::copy_n(l.begin(), size_, data_);
│ │ │ │ -
86 }
│ │ │ │ -
│ │ │ │ -
87
│ │ │ │ -
│ │ │ │ -
93 void clear()
│ │ │ │ -
94 {
│ │ │ │ -
95 first_ = 0;
│ │ │ │ -
96 size_ = 0;
│ │ │ │ -
97 }
│ │ │ │ -
│ │ │ │ +
82template <typename R, typename D>
│ │ │ │ +
83struct SignatureTraits<R(*)(D), true>
│ │ │ │ +
84 : public SignatureTraits<R(D), true>
│ │ │ │ +
85{};
│ │ │ │ +
86
│ │ │ │ +
88template<class R, class D>
│ │ │ │ +
89struct SignatureTraits<R(D), true>
│ │ │ │ +
90{
│ │ │ │ +
91 using Range = R;
│ │ │ │ +
92 using Domain = D;
│ │ │ │ +
93
│ │ │ │ +
94 using RawRange = std::decay_t<Range>;
│ │ │ │ +
95 using RawDomain = std::decay_t<Domain>;
│ │ │ │ +
96
│ │ │ │ +
97 using RawSignature = RawRange(RawDomain);
│ │ │ │
98
│ │ │ │ -
│ │ │ │ -
100 void resize(size_t s)
│ │ │ │ -
101 {
│ │ │ │ -
102 CHECKSIZE(s<=n);
│ │ │ │ -
103 size_ = s;
│ │ │ │ -
104 }
│ │ │ │ -
│ │ │ │ -
105
│ │ │ │ -
│ │ │ │ -
107 void push_back(const T& t)
│ │ │ │ -
108 {
│ │ │ │ -
109 CHECKSIZE(size_<n);
│ │ │ │ -
110 data_[size_++ % n] = t;
│ │ │ │ -
111 }
│ │ │ │ -
│ │ │ │ -
112
│ │ │ │ -
│ │ │ │ -
114 void push_front(const T& t)
│ │ │ │ -
115 {
│ │ │ │ -
116 CHECKSIZE(size_<n);
│ │ │ │ -
117 ++size_;
│ │ │ │ -
118 first_ = (first_+(n-1)) % n;
│ │ │ │ -
119 data_[first_] = t;
│ │ │ │ -
120 }
│ │ │ │ -
│ │ │ │ +
99 template<template<class> class DerivativeTraits=DefaultDerivativeTraits>
│ │ │ │ +
100 using DerivativeSignature = typename DerivativeTraits<RawSignature>::Range(Domain);
│ │ │ │ +
101};
│ │ │ │ +
102#endif
│ │ │ │ +
103
│ │ │ │ +
104
│ │ │ │ +
105template<class Signature, template<class> class DerivativeTraits=DefaultDerivativeTraits>
│ │ │ │ + │ │ │ │ +
107
│ │ │ │ +
117template<class Range, class Domain, template<class> class DerivativeTraitsT>
│ │ │ │ +
│ │ │ │ +
118struct SignatureTag<Range(Domain), DerivativeTraitsT>
│ │ │ │ +
119{
│ │ │ │ +
120 using Signature = Range(Domain);
│ │ │ │
121
│ │ │ │ -
│ │ │ │ -
123 void pop_back()
│ │ │ │ -
124 {
│ │ │ │ -
125 if (! empty())
│ │ │ │ -
126 size_--;
│ │ │ │ -
127 }
│ │ │ │ -
│ │ │ │ -
128
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
131 {
│ │ │ │ -
132 if (! empty())
│ │ │ │ -
133 {
│ │ │ │ -
134 size_--;
│ │ │ │ -
135 first_ = (++first_) % n;
│ │ │ │ -
136 }
│ │ │ │ -
137 }
│ │ │ │ -
│ │ │ │ -
138
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
141 return iterator(*this, 0);
│ │ │ │ -
142 }
│ │ │ │ +
122 template<class T>
│ │ │ │ +
123 using DerivativeTraits = DerivativeTraitsT<T>;
│ │ │ │ +
124};
│ │ │ │ +
│ │ │ │ +
125
│ │ │ │ +
126
│ │ │ │ +
127
│ │ │ │ +
136template<class Range, class Domain, template<class> class DerivativeTraits>
│ │ │ │ +
│ │ │ │ +
137auto derivativeSignatureTag(SignatureTag<Range(Domain), DerivativeTraits> tag)
│ │ │ │ +
138{
│ │ │ │ +
139 using DerivativeRange = typename DerivativeTraits<Range(Domain)>::Range;
│ │ │ │ + │ │ │ │ +
141}
│ │ │ │
│ │ │ │ +
142
│ │ │ │
143
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
146 return const_iterator(*this, 0);
│ │ │ │ -
147 }
│ │ │ │ -
│ │ │ │ -
148
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
151 return iterator(*this, size_);
│ │ │ │ -
152 }
│ │ │ │ -
│ │ │ │ -
153
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
156 return const_iterator(*this, size_);
│ │ │ │ -
157 }
│ │ │ │ -
│ │ │ │ -
158
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
161 {
│ │ │ │ -
162 CHECKSIZE(size_>i);
│ │ │ │ -
163 return data_[(first_ + i) % n];
│ │ │ │ -
164 }
│ │ │ │ -
│ │ │ │ -
165
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
168 {
│ │ │ │ -
169 CHECKSIZE(size_>i);
│ │ │ │ -
170 return data_[(first_ + i) % n];
│ │ │ │ -
171 }
│ │ │ │ -
│ │ │ │ -
172
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
175 {
│ │ │ │ -
176 CHECKSIZE(size_>0);
│ │ │ │ -
177 return data_[first_];
│ │ │ │ -
178 }
│ │ │ │ -
│ │ │ │ -
179
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
182 {
│ │ │ │ -
183 CHECKSIZE(size_>0);
│ │ │ │ -
184 return data_[first_];
│ │ │ │ -
185 }
│ │ │ │ -
│ │ │ │ -
186
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
189 {
│ │ │ │ -
190 CHECKSIZE(size_>0);
│ │ │ │ -
191 return data_[(first_ + size_-1) % n];
│ │ │ │ -
192 }
│ │ │ │ -
│ │ │ │ -
193
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
196 {
│ │ │ │ -
197 CHECKSIZE(size_>0);
│ │ │ │ -
198 return data_[(first_ + size_-1) % n];
│ │ │ │ -
199 }
│ │ │ │ -
│ │ │ │ -
200
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
207 {
│ │ │ │ -
208 return size_;
│ │ │ │ -
209 }
│ │ │ │ -
│ │ │ │ -
210
│ │ │ │ -
│ │ │ │ -
212 bool empty() const
│ │ │ │ -
213 {
│ │ │ │ -
214 return size_==0;
│ │ │ │ -
215 }
│ │ │ │ -
│ │ │ │ -
216
│ │ │ │ -
│ │ │ │ -
218 static constexpr size_type capacity()
│ │ │ │ -
219 {
│ │ │ │ -
220 return n;
│ │ │ │ -
221 }
│ │ │ │ -
│ │ │ │ -
222
│ │ │ │ -
│ │ │ │ -
224 static constexpr size_type max_size()
│ │ │ │ -
225 {
│ │ │ │ -
226 return n;
│ │ │ │ -
227 }
│ │ │ │ -
│ │ │ │ -
228
│ │ │ │ -
│ │ │ │ -
232 friend std::ostream& operator<< (std::ostream& s, const ReservedDeque& v)
│ │ │ │ -
233 {
│ │ │ │ -
234 for (size_t i=0; i<v.size(); i++)
│ │ │ │ -
235 s << v[i] << " ";
│ │ │ │ -
236 return s;
│ │ │ │ -
237 }
│ │ │ │ -
│ │ │ │ -
238
│ │ │ │ -
239 private:
│ │ │ │ -
240 T data_[n];
│ │ │ │ -
241 size_type first_;
│ │ │ │ -
242 size_type size_;
│ │ │ │ -
243 };
│ │ │ │ -
│ │ │ │ -
244
│ │ │ │ -
245} // end namespace Functions
│ │ │ │ -
246} // end namespace Dune
│ │ │ │ -
247
│ │ │ │ -
248#undef CHECKSIZE
│ │ │ │ -
249
│ │ │ │ -
250#endif // DUNE_FUNCTIONS_COMMON_RESERVEDDEQUE_HH
│ │ │ │ -
#define CHECKSIZE(X)
Definition reserveddeque.hh:24
│ │ │ │ +
144
│ │ │ │ +
158template<std::size_t maxOrder, class Signature, template<class> class DerivativeTraits>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
160{
│ │ │ │ +
161 if constexpr (maxOrder==0) {
│ │ │ │ +
162 // If maxOrder== 0 we just need the given SignatureTag
│ │ │ │ +
163 return std::make_tuple(tag);
│ │ │ │ +
164 } else {
│ │ │ │ +
165 // else we first construct the tail tuple with SignatureTags for derivatives
│ │ │ │ +
166 // of order 1 to maxOrder
│ │ │ │ +
167 auto tailTagsTuple = derivativeSignatureTags<std::size_t(maxOrder-1)>(derivativeSignatureTag(tag));
│ │ │ │ +
168 // and prepend this with the given SignatureTag.
│ │ │ │ +
169 // This is done by unpacking the tail tuple with apply().
│ │ │ │ +
170 return std::apply([&](auto&&... tailTags){
│ │ │ │ +
171 return std::make_tuple(tag, tailTags...);
│ │ │ │ +
172 }, tailTagsTuple);
│ │ │ │ +
173 }
│ │ │ │ +
174}
│ │ │ │ +
│ │ │ │ +
175
│ │ │ │ +
176
│ │ │ │ +
177
│ │ │ │ +
178} // namespace Functions
│ │ │ │ +
179} // namespace Dune
│ │ │ │ +
180
│ │ │ │ +
181#endif // DUNE_FUNCTIONS_COMMON_SIGNATURE_HH
│ │ │ │ + │ │ │ │ +
auto derivativeSignatureTag(SignatureTag< Range(Domain), DerivativeTraits > tag)
Construct SignatureTag for derivative.
Definition signature.hh:137
│ │ │ │ +
auto derivativeSignatureTags(Dune::Functions::SignatureTag< Signature, DerivativeTraits > tag)
Construct SignatureTags for derivatives.
Definition signature.hh:159
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
A double-ended queue (deque) class with statically reserved memory.
Definition reserveddeque.hh:49
│ │ │ │ -
void pop_front()
Erases the first element of the vector, O(1) time.
Definition reserveddeque.hh:130
│ │ │ │ -
static constexpr size_type capacity()
Returns current capacity (allocated memory) of the vector.
Definition reserveddeque.hh:218
│ │ │ │ -
void clear()
Erases all elements.
Definition reserveddeque.hh:93
│ │ │ │ -
Dune::GenericIterator< ReservedDeque, value_type > iterator
Iterator used to iterate through a vector.
Definition reserveddeque.hh:67
│ │ │ │ -
T value_type
The type of object, T, stored in the vector.
Definition reserveddeque.hh:55
│ │ │ │ -
ReservedDeque()
Constructor.
Definition reserveddeque.hh:76
│ │ │ │ -
bool empty() const
Returns true if vector has no elements.
Definition reserveddeque.hh:212
│ │ │ │ -
const_reference back() const
Returns const reference to last element of vector.
Definition reserveddeque.hh:195
│ │ │ │ -
friend std::ostream & operator<<(std::ostream &s, const ReservedDeque &v)
Send ReservedDeque to an output stream.
Definition reserveddeque.hh:232
│ │ │ │ -
void push_front(const T &t)
Prepends an element to the begin of a deque if size<capacity, O(1) time.
Definition reserveddeque.hh:114
│ │ │ │ -
reference operator[](size_type i)
Returns reference to the i'th element.
Definition reserveddeque.hh:160
│ │ │ │ -
reference front()
Returns reference to first element of vector.
Definition reserveddeque.hh:174
│ │ │ │ -
T * pointer
Pointer to T.
Definition reserveddeque.hh:57
│ │ │ │ -
const_reference front() const
Returns const reference to first element of vector.
Definition reserveddeque.hh:181
│ │ │ │ -
iterator end()
Returns an iterator pointing to the end of the vector.
Definition reserveddeque.hh:150
│ │ │ │ -
reference back()
Returns reference to last element of vector.
Definition reserveddeque.hh:188
│ │ │ │ -
void pop_back()
Erases the last element of the vector, O(1) time.
Definition reserveddeque.hh:123
│ │ │ │ -
const T & const_reference
Const reference to T.
Definition reserveddeque.hh:61
│ │ │ │ -
static constexpr size_type max_size()
Returns the maximum length of the vector.
Definition reserveddeque.hh:224
│ │ │ │ -
std::ptrdiff_t difference_type
A signed integral type.
Definition reserveddeque.hh:65
│ │ │ │ -
T & reference
Reference to T.
Definition reserveddeque.hh:59
│ │ │ │ -
Dune::GenericIterator< const ReservedDeque, const value_type > const_iterator
Const iterator used to iterate through a vector.
Definition reserveddeque.hh:69
│ │ │ │ -
size_type size() const
Returns number of elements in the vector.
Definition reserveddeque.hh:206
│ │ │ │ -
const_iterator end() const
Returns a const_iterator pointing to the end of the vector.
Definition reserveddeque.hh:155
│ │ │ │ -
void resize(size_t s)
Specifies a new size for the vector.
Definition reserveddeque.hh:100
│ │ │ │ -
iterator begin()
Returns a iterator pointing to the beginning of the vector.
Definition reserveddeque.hh:140
│ │ │ │ -
const_iterator begin() const
Returns a const_iterator pointing to the beginning of the vector.
Definition reserveddeque.hh:145
│ │ │ │ -
ReservedDeque(std::initializer_list< T > const &l)
Definition reserveddeque.hh:81
│ │ │ │ -
size_t size_type
An unsigned integral type.
Definition reserveddeque.hh:63
│ │ │ │ -
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:107
│ │ │ │ +
Helper class to check that F is callable.
Definition signature.hh:24
│ │ │ │ +
Helper class to deduce the signature of a callable.
Definition signature.hh:60
│ │ │ │ +
Definition signature.hh:106
│ │ │ │ +
DerivativeTraitsT< T > DerivativeTraits
Definition signature.hh:123
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,324 +1,184 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -reserveddeque.hh │ │ │ │ │ +signature.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_COMMON_RESERVEDDEQUE_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_COMMON_RESERVEDDEQUE_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_COMMON_SIGNATURE_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_COMMON_SIGNATURE_HH │ │ │ │ │ 9 │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17#include │ │ │ │ │ -18 │ │ │ │ │ -19#include │ │ │ │ │ -20 │ │ │ │ │ -21#ifdef CHECK_RESERVEDDEQUE │ │ │ │ │ -22#define CHECKSIZE(X) assert(X) │ │ │ │ │ -23#else │ │ │ │ │ -_2_4#define CHECKSIZE(X) {} │ │ │ │ │ -25#endif │ │ │ │ │ -26 │ │ │ │ │ -27namespace _D_u_n_e { │ │ │ │ │ -28namespace Functions { │ │ │ │ │ -29 │ │ │ │ │ -47 template │ │ │ │ │ -_4_8 class _R_e_s_e_r_v_e_d_D_e_q_u_e │ │ │ │ │ -49 { │ │ │ │ │ -50 public: │ │ │ │ │ -51 │ │ │ │ │ -_5_5 typedef T _v_a_l_u_e___t_y_p_e; │ │ │ │ │ -_5_7 typedef T* _p_o_i_n_t_e_r; │ │ │ │ │ -_5_9 typedef T& _r_e_f_e_r_e_n_c_e; │ │ │ │ │ -_6_1 typedef const T& _c_o_n_s_t___r_e_f_e_r_e_n_c_e; │ │ │ │ │ -_6_3 typedef size_t _s_i_z_e___t_y_p_e; │ │ │ │ │ -_6_5 typedef std::ptrdiff_t _d_i_f_f_e_r_e_n_c_e___t_y_p_e; │ │ │ │ │ -_6_7 typedef Dune::GenericIterator _i_t_e_r_a_t_o_r; │ │ │ │ │ -_6_9 typedef Dune::GenericIterator │ │ │ │ │ -_c_o_n_s_t___i_t_e_r_a_t_o_r; │ │ │ │ │ -70 │ │ │ │ │ -_7_6 _R_e_s_e_r_v_e_d_D_e_q_u_e() : │ │ │ │ │ -77 size_(0), │ │ │ │ │ -78 first_(0) │ │ │ │ │ -79 {} │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12 │ │ │ │ │ +13#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +14 │ │ │ │ │ +15namespace _D_u_n_e { │ │ │ │ │ +16namespace Functions { │ │ │ │ │ +17 │ │ │ │ │ +23template │ │ │ │ │ +_2_4struct _I_s_C_a_l_l_a_b_l_e; │ │ │ │ │ +25 │ │ │ │ │ +26#ifndef DOXYGEN │ │ │ │ │ +27template │ │ │ │ │ +28struct _I_s_C_a_l_l_a_b_l_e │ │ │ │ │ +29{ │ │ │ │ │ +30 struct yes { std::size_t dummy[2]; }; │ │ │ │ │ +31 struct no { std::size_t dummy[1]; }; │ │ │ │ │ +32 │ │ │ │ │ +33 template │ │ │ │ │ +34 static yes test(const decltype(&C::operator()) *); │ │ │ │ │ +35 template │ │ │ │ │ +36 static no test(...); │ │ │ │ │ +37 │ │ │ │ │ +38 enum { value = (sizeof(test(0)) == sizeof(yes)) }; │ │ │ │ │ +39}; │ │ │ │ │ +40 │ │ │ │ │ +41template │ │ │ │ │ +42struct IsCallable │ │ │ │ │ +43{ │ │ │ │ │ +44 enum { value = true }; │ │ │ │ │ +45}; │ │ │ │ │ +46 │ │ │ │ │ +47template │ │ │ │ │ +48struct IsCallable │ │ │ │ │ +49{ │ │ │ │ │ +50 enum { value = true }; │ │ │ │ │ +51}; │ │ │ │ │ +52#endif │ │ │ │ │ +53 │ │ │ │ │ +59template::value > │ │ │ │ │ +_6_0struct _S_i_g_n_a_t_u_r_e_T_r_a_i_t_s {}; │ │ │ │ │ +61 │ │ │ │ │ +62#ifndef DOXYGEN │ │ │ │ │ +64template │ │ │ │ │ +65struct _S_i_g_n_a_t_u_r_e_T_r_a_i_t_s │ │ │ │ │ +66 : public _S_i_g_n_a_t_u_r_e_T_r_a_i_t_s │ │ │ │ │ +67{}; │ │ │ │ │ +68 │ │ │ │ │ +70template │ │ │ │ │ +71struct SignatureTraits │ │ │ │ │ +72 : public SignatureTraits │ │ │ │ │ +73{}; │ │ │ │ │ +74 │ │ │ │ │ +76template │ │ │ │ │ +77struct SignatureTraits │ │ │ │ │ +78 : public SignatureTraits │ │ │ │ │ +79{}; │ │ │ │ │ 80 │ │ │ │ │ -_8_1 _R_e_s_e_r_v_e_d_D_e_q_u_e(std::initializer_list const &l) │ │ │ │ │ -82 { │ │ │ │ │ -83 assert(l.size() <= n);// Actually, this is not needed any more! │ │ │ │ │ -84 size_ = l.size(); │ │ │ │ │ -85 std::copy_n(l.begin(), size_, data_); │ │ │ │ │ -86 } │ │ │ │ │ -87 │ │ │ │ │ -_9_3 void _c_l_e_a_r() │ │ │ │ │ -94 { │ │ │ │ │ -95 first_ = 0; │ │ │ │ │ -96 size_ = 0; │ │ │ │ │ -97 } │ │ │ │ │ +82template │ │ │ │ │ +83struct SignatureTraits │ │ │ │ │ +84 : public SignatureTraits │ │ │ │ │ +85{}; │ │ │ │ │ +86 │ │ │ │ │ +88template │ │ │ │ │ +89struct SignatureTraits │ │ │ │ │ +90{ │ │ │ │ │ +91 using Range = R; │ │ │ │ │ +92 using Domain = D; │ │ │ │ │ +93 │ │ │ │ │ +94 using RawRange = std::decay_t; │ │ │ │ │ +95 using RawDomain = std::decay_t; │ │ │ │ │ +96 │ │ │ │ │ +97 using RawSignature = RawRange(RawDomain); │ │ │ │ │ 98 │ │ │ │ │ -_1_0_0 void _r_e_s_i_z_e(size_t s) │ │ │ │ │ -101 { │ │ │ │ │ -102 _C_H_E_C_K_S_I_Z_E(s<=n); │ │ │ │ │ -103 size_ = s; │ │ │ │ │ -104 } │ │ │ │ │ -105 │ │ │ │ │ -_1_0_7 void _p_u_s_h___b_a_c_k(const T& t) │ │ │ │ │ -108 { │ │ │ │ │ -109 _C_H_E_C_K_S_I_Z_E(size_ class DerivativeTraits=DefaultDerivativeTraits> │ │ │ │ │ +100 using DerivativeSignature = typename DerivativeTraits::Range │ │ │ │ │ +(Domain); │ │ │ │ │ +101}; │ │ │ │ │ +102#endif │ │ │ │ │ +103 │ │ │ │ │ +104 │ │ │ │ │ +105template class │ │ │ │ │ +DerivativeTraits=DefaultDerivativeTraits> │ │ │ │ │ +_1_0_6struct _S_i_g_n_a_t_u_r_e_T_a_g; │ │ │ │ │ +107 │ │ │ │ │ +117template class DerivativeTraitsT> │ │ │ │ │ +_1_1_8struct _S_i_g_n_a_t_u_r_e_T_a_g │ │ │ │ │ +119{ │ │ │ │ │ +_1_2_0 using _S_i_g_n_a_t_u_r_e = Range(Domain); │ │ │ │ │ 121 │ │ │ │ │ -_1_2_3 void _p_o_p___b_a_c_k() │ │ │ │ │ -124 { │ │ │ │ │ -125 if (! _e_m_p_t_y()) │ │ │ │ │ -126 size_--; │ │ │ │ │ -127 } │ │ │ │ │ -128 │ │ │ │ │ -_1_3_0 void _p_o_p___f_r_o_n_t() │ │ │ │ │ -131 { │ │ │ │ │ -132 if (! _e_m_p_t_y()) │ │ │ │ │ -133 { │ │ │ │ │ -134 size_--; │ │ │ │ │ -135 first_ = (++first_) % n; │ │ │ │ │ -136 } │ │ │ │ │ -137 } │ │ │ │ │ -138 │ │ │ │ │ -_1_4_0 _i_t_e_r_a_t_o_r _b_e_g_i_n(){ │ │ │ │ │ -141 return _i_t_e_r_a_t_o_r(*this, 0); │ │ │ │ │ -142 } │ │ │ │ │ +122 template │ │ │ │ │ +_1_2_3 using _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s = DerivativeTraitsT; │ │ │ │ │ +124}; │ │ │ │ │ +125 │ │ │ │ │ +126 │ │ │ │ │ +127 │ │ │ │ │ +136template class DerivativeTraits> │ │ │ │ │ +_1_3_7auto _d_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_T_a_g(_S_i_g_n_a_t_u_r_e_T_a_g │ │ │ │ │ +tag) │ │ │ │ │ +138{ │ │ │ │ │ +139 using DerivativeRange = typename DerivativeTraits::Range; │ │ │ │ │ +140 return _S_i_g_n_a_t_u_r_e_T_a_g_<_D_e_r_i_v_a_t_i_v_e_R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_>(); │ │ │ │ │ +141} │ │ │ │ │ +142 │ │ │ │ │ 143 │ │ │ │ │ -_1_4_5 _c_o_n_s_t___i_t_e_r_a_t_o_r _b_e_g_i_n() const { │ │ │ │ │ -146 return _c_o_n_s_t___i_t_e_r_a_t_o_r(*this, 0); │ │ │ │ │ -147 } │ │ │ │ │ -148 │ │ │ │ │ -_1_5_0 _i_t_e_r_a_t_o_r _e_n_d(){ │ │ │ │ │ -151 return _i_t_e_r_a_t_o_r(*this, size_); │ │ │ │ │ -152 } │ │ │ │ │ -153 │ │ │ │ │ -_1_5_5 _c_o_n_s_t___i_t_e_r_a_t_o_r _e_n_d() const { │ │ │ │ │ -156 return _c_o_n_s_t___i_t_e_r_a_t_o_r(*this, size_); │ │ │ │ │ -157 } │ │ │ │ │ -158 │ │ │ │ │ -_1_6_0 _r_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_[_]_ (_s_i_z_e___t_y_p_e i) │ │ │ │ │ -161 { │ │ │ │ │ -162 _C_H_E_C_K_S_I_Z_E(size_>i); │ │ │ │ │ -163 return data_[(first_ + i) % n]; │ │ │ │ │ -164 } │ │ │ │ │ -165 │ │ │ │ │ -_1_6_7 _c_o_n_s_t___r_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_[_]_ (_s_i_z_e___t_y_p_e i) const │ │ │ │ │ -168 { │ │ │ │ │ -169 _C_H_E_C_K_S_I_Z_E(size_>i); │ │ │ │ │ -170 return data_[(first_ + i) % n]; │ │ │ │ │ -171 } │ │ │ │ │ -172 │ │ │ │ │ -_1_7_4 _r_e_f_e_r_e_n_c_e _f_r_o_n_t() │ │ │ │ │ -175 { │ │ │ │ │ -176 _C_H_E_C_K_S_I_Z_E(size_>0); │ │ │ │ │ -177 return data_[first_]; │ │ │ │ │ -178 } │ │ │ │ │ -179 │ │ │ │ │ -_1_8_1 _c_o_n_s_t___r_e_f_e_r_e_n_c_e _f_r_o_n_t() const │ │ │ │ │ -182 { │ │ │ │ │ -183 _C_H_E_C_K_S_I_Z_E(size_>0); │ │ │ │ │ -184 return data_[first_]; │ │ │ │ │ -185 } │ │ │ │ │ -186 │ │ │ │ │ -_1_8_8 _r_e_f_e_r_e_n_c_e _b_a_c_k() │ │ │ │ │ -189 { │ │ │ │ │ -190 _C_H_E_C_K_S_I_Z_E(size_>0); │ │ │ │ │ -191 return data_[(first_ + size_-1) % n]; │ │ │ │ │ -192 } │ │ │ │ │ -193 │ │ │ │ │ -_1_9_5 _c_o_n_s_t___r_e_f_e_r_e_n_c_e _b_a_c_k() const │ │ │ │ │ -196 { │ │ │ │ │ -197 _C_H_E_C_K_S_I_Z_E(size_>0); │ │ │ │ │ -198 return data_[(first_ + size_-1) % n]; │ │ │ │ │ -199 } │ │ │ │ │ -200 │ │ │ │ │ -_2_0_6 _s_i_z_e___t_y_p_e _s_i_z_e () const │ │ │ │ │ -207 { │ │ │ │ │ -208 return size_; │ │ │ │ │ -209 } │ │ │ │ │ -210 │ │ │ │ │ -_2_1_2 bool _e_m_p_t_y() const │ │ │ │ │ -213 { │ │ │ │ │ -214 return size_==0; │ │ │ │ │ -215 } │ │ │ │ │ -216 │ │ │ │ │ -_2_1_8 static constexpr _s_i_z_e___t_y_p_e _c_a_p_a_c_i_t_y() │ │ │ │ │ -219 { │ │ │ │ │ -220 return n; │ │ │ │ │ -221 } │ │ │ │ │ -222 │ │ │ │ │ -_2_2_4 static constexpr _s_i_z_e___t_y_p_e _m_a_x___s_i_z_e() │ │ │ │ │ -225 { │ │ │ │ │ -226 return n; │ │ │ │ │ -227 } │ │ │ │ │ -228 │ │ │ │ │ -_2_3_2 friend std::ostream& _o_p_e_r_a_t_o_r_<_<_ (std::ostream& s, const _R_e_s_e_r_v_e_d_D_e_q_u_e& v) │ │ │ │ │ -233 { │ │ │ │ │ -234 for (size_t i=0; i class │ │ │ │ │ +DerivativeTraits> │ │ │ │ │ +_1_5_9auto _d_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_T_a_g_s(_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_a_g_<_S_i_g_n_a_t_u_r_e_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_> tag) │ │ │ │ │ +160{ │ │ │ │ │ +161 if constexpr (maxOrder==0) { │ │ │ │ │ +162 // If maxOrder== 0 we just need the given SignatureTag │ │ │ │ │ +163 return std::make_tuple(tag); │ │ │ │ │ +164 } else { │ │ │ │ │ +165 // else we first construct the tail tuple with SignatureTags for │ │ │ │ │ +derivatives │ │ │ │ │ +166 // of order 1 to maxOrder │ │ │ │ │ +167 auto tailTagsTuple = _d_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_T_a_g_s │ │ │ │ │ +(_d_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_T_a_g(tag)); │ │ │ │ │ +168 // and prepend this with the given SignatureTag. │ │ │ │ │ +169 // This is done by unpacking the tail tuple with apply(). │ │ │ │ │ +170 return std::apply([&](auto&&... tailTags){ │ │ │ │ │ +171 return std::make_tuple(tag, tailTags...); │ │ │ │ │ +172 }, tailTagsTuple); │ │ │ │ │ +173 } │ │ │ │ │ +174} │ │ │ │ │ +175 │ │ │ │ │ +176 │ │ │ │ │ +177 │ │ │ │ │ +178} // namespace Functions │ │ │ │ │ +179} // namespace Dune │ │ │ │ │ +180 │ │ │ │ │ +181#endif // DUNE_FUNCTIONS_COMMON_SIGNATURE_HH │ │ │ │ │ +_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_d_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_T_a_g │ │ │ │ │ +auto derivativeSignatureTag(SignatureTag< Range(Domain), DerivativeTraits > │ │ │ │ │ +tag) │ │ │ │ │ +Construct SignatureTag for derivative. │ │ │ │ │ +DDeeffiinniittiioonn signature.hh:137 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_d_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_T_a_g_s │ │ │ │ │ +auto derivativeSignatureTags(Dune::Functions::SignatureTag< Signature, │ │ │ │ │ +DerivativeTraits > tag) │ │ │ │ │ +Construct SignatureTags for derivatives. │ │ │ │ │ +DDeeffiinniittiioonn signature.hh:159 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e │ │ │ │ │ -A double-ended queue (deque) class with statically reserved memory. │ │ │ │ │ -DDeeffiinniittiioonn reserveddeque.hh:49 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_p_o_p___f_r_o_n_t │ │ │ │ │ -void pop_front() │ │ │ │ │ -Erases the first element of the vector, O(1) time. │ │ │ │ │ -DDeeffiinniittiioonn reserveddeque.hh:130 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_c_a_p_a_c_i_t_y │ │ │ │ │ -static constexpr size_type capacity() │ │ │ │ │ -Returns current capacity (allocated memory) of the vector. │ │ │ │ │ -DDeeffiinniittiioonn reserveddeque.hh:218 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_c_l_e_a_r │ │ │ │ │ -void clear() │ │ │ │ │ -Erases all elements. │ │ │ │ │ -DDeeffiinniittiioonn reserveddeque.hh:93 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ -Dune::GenericIterator< ReservedDeque, value_type > iterator │ │ │ │ │ -Iterator used to iterate through a vector. │ │ │ │ │ -DDeeffiinniittiioonn reserveddeque.hh:67 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ -T value_type │ │ │ │ │ -The type of object, T, stored in the vector. │ │ │ │ │ -DDeeffiinniittiioonn reserveddeque.hh:55 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e │ │ │ │ │ -ReservedDeque() │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn reserveddeque.hh:76 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_e_m_p_t_y │ │ │ │ │ -bool empty() const │ │ │ │ │ -Returns true if vector has no elements. │ │ │ │ │ -DDeeffiinniittiioonn reserveddeque.hh:212 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_b_a_c_k │ │ │ │ │ -const_reference back() const │ │ │ │ │ -Returns const reference to last element of vector. │ │ │ │ │ -DDeeffiinniittiioonn reserveddeque.hh:195 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ -friend std::ostream & operator<<(std::ostream &s, const ReservedDeque &v) │ │ │ │ │ -Send ReservedDeque to an output stream. │ │ │ │ │ -DDeeffiinniittiioonn reserveddeque.hh:232 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_p_u_s_h___f_r_o_n_t │ │ │ │ │ -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. │ │ │ │ │ -DDeeffiinniittiioonn reserveddeque.hh:69 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_s_i_z_e │ │ │ │ │ -size_type size() const │ │ │ │ │ -Returns number of elements in the vector. │ │ │ │ │ -DDeeffiinniittiioonn reserveddeque.hh:206 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_e_n_d │ │ │ │ │ -const_iterator end() const │ │ │ │ │ -Returns a const_iterator pointing to the end of the vector. │ │ │ │ │ -DDeeffiinniittiioonn reserveddeque.hh:155 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_r_e_s_i_z_e │ │ │ │ │ -void resize(size_t s) │ │ │ │ │ -Specifies a new size for the vector. │ │ │ │ │ -DDeeffiinniittiioonn reserveddeque.hh:100 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_b_e_g_i_n │ │ │ │ │ -iterator begin() │ │ │ │ │ -Returns a iterator pointing to the beginning of the vector. │ │ │ │ │ -DDeeffiinniittiioonn reserveddeque.hh:140 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_b_e_g_i_n │ │ │ │ │ -const_iterator begin() const │ │ │ │ │ -Returns a const_iterator pointing to the beginning of the vector. │ │ │ │ │ -DDeeffiinniittiioonn reserveddeque.hh:145 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e │ │ │ │ │ -ReservedDeque(std::initializer_list< T > const &l) │ │ │ │ │ -DDeeffiinniittiioonn reserveddeque.hh:81 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -size_t size_type │ │ │ │ │ -An unsigned integral type. │ │ │ │ │ -DDeeffiinniittiioonn reserveddeque.hh:63 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_s_e_r_v_e_d_D_e_q_u_e_:_:_p_u_s_h___b_a_c_k │ │ │ │ │ -void push_back(const T &t) │ │ │ │ │ -Appends an element to the end of a vector, up to the maximum size n, O(1) time. │ │ │ │ │ -DDeeffiinniittiioonn reserveddeque.hh:107 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_s_C_a_l_l_a_b_l_e │ │ │ │ │ +Helper class to check that F is callable. │ │ │ │ │ +DDeeffiinniittiioonn signature.hh:24 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_r_a_i_t_s │ │ │ │ │ +Helper class to deduce the signature of a callable. │ │ │ │ │ +DDeeffiinniittiioonn signature.hh:60 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_a_g │ │ │ │ │ +DDeeffiinniittiioonn signature.hh:106 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_a_g_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_T_ _>_:_: │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ +DerivativeTraitsT< T > DerivativeTraits │ │ │ │ │ +DDeeffiinniittiioonn signature.hh:123 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_a_g_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_T_ _>_:_:_S_i_g_n_a_t_u_r_e │ │ │ │ │ +Range(Domain) Signature │ │ │ │ │ +DDeeffiinniittiioonn signature.hh:120 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00056.html │ │ │ │ @@ -77,17 +77,17 @@ │ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │
typeerasure.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │
#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>
│ │ │ │ +#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.

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00056_source.html │ │ │ │ @@ -90,17 +90,17 @@ │ │ │ │
7#ifndef DUNE_FUNCTIONS_COMMON_TYPEERASURE_HH
│ │ │ │
8#define DUNE_FUNCTIONS_COMMON_TYPEERASURE_HH
│ │ │ │
9
│ │ │ │
10#include <typeinfo>
│ │ │ │
11
│ │ │ │
12#include <dune/common/typeutilities.hh>
│ │ │ │
13
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
17
│ │ │ │
18namespace Dune {
│ │ │ │
19namespace Functions {
│ │ │ │
20namespace Imp {
│ │ │ │
21
│ │ │ │
22
│ │ │ │
23
│ │ │ │ @@ -221,17 +221,17 @@ │ │ │ │
202
│ │ │ │
203
│ │ │ │
204}} // namespace Dune::Functions
│ │ │ │
205
│ │ │ │
206
│ │ │ │
207
│ │ │ │
208#endif // DUNE_FUNCTIONS_COMMON_TYPEERASURE_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
Definition polynomial.hh:17
│ │ │ │
A wrapper providing small object optimization with polymorphic types.
Definition polymorphicsmallobject.hh:51
│ │ │ │
Base class for type-erased interface wrapper.
Definition typeerasure.hh:169
│ │ │ │
const std::type_info & target_type() const
Get type of stored object.
Definition typeerasure.hh:194
│ │ │ │
TypeErasureBase(T &&t)
Construct wrapper from object.
Definition typeerasure.hh:174
│ │ │ │
PolymorphicSmallObject< Imp::TypeErasureWrapperInterface< Interface >, bufferSize > wrapped_
Definition typeerasure.hh:200
│ │ │ │
TypeErasureBase()=default
Default constructor.
│ │ │ │ ├── html2text {} │ │ │ │ │ @@ -143,17 +143,17 @@ │ │ │ │ │ 202 │ │ │ │ │ 203 │ │ │ │ │ 204}} // namespace Dune::Functions │ │ │ │ │ 205 │ │ │ │ │ 206 │ │ │ │ │ 207 │ │ │ │ │ 208#endif // DUNE_FUNCTIONS_COMMON_TYPEERASURE_HH │ │ │ │ │ +_i_n_t_e_r_f_a_c_e_s_._h_h │ │ │ │ │ _p_o_l_y_m_o_r_p_h_i_c_s_m_a_l_l_o_b_j_e_c_t_._h_h │ │ │ │ │ _t_y_p_e___t_r_a_i_t_s_._h_h │ │ │ │ │ -_i_n_t_e_r_f_a_c_e_s_._h_h │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t │ │ │ │ │ A wrapper providing small object optimization with polymorphic types. │ │ │ │ │ DDeeffiinniittiioonn polymorphicsmallobject.hh:51 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_y_p_e_E_r_a_s_u_r_e_B_a_s_e │ │ │ │ │ Base class for type-erased interface wrapper. │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00059.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: localfunction.hh File Reference │ │ │ │ +dune-functions: staticforloop.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,43 +70,38 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces
│ │ │ │ -
localfunction.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
staticforloop.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 <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::TypeErasureBase< Interface, Implementation, bufferSize >
 Base class for type-erased interface wrapper. More...
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

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

│ │ │ │ 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.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,32 +1,25 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -localfunction.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_l_o_c_a_l_f_u_n_c_t_i_o_n___i_m_p_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e_e_r_a_s_u_r_e_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +staticforloop.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _S_i_g_n_a_t_u_r_e_,_ _L_o_c_a_l_C_o_n_t_e_x_t_, │ │ │ │ │ - _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _b_u_f_f_e_r_S_i_z_e_ _> │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _L_o_c_a_l_C_o_n_t_e_x_t_, │ │ │ │ │ - _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _b_u_f_f_e_r_S_i_z_e_ _> │ │ │ │ │ -  Class storing local functions using type erasure. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_t_a_t_i_c_F_i_n_d_I_n_R_a_n_g_e (F &&f, Args &&... args) │ │ │ │ │ +  Static find loop. │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00059_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: localfunction.hh Source File │ │ │ │ +dune-functions: staticforloop.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,174 +74,81 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
localfunction.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_COMMON_LOCAL_FUNCTION_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_COMMON_LOCAL_FUNCTION_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_COMMON_STATICFORLOOP_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_COMMON_STATICFORLOOP_HH
│ │ │ │
9
│ │ │ │ -
10#include <type_traits>
│ │ │ │ -
11
│ │ │ │ -
12#include <dune/common/typeutilities.hh>
│ │ │ │ -
13
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +
10
│ │ │ │ +
11#include <dune/common/concept.hh>
│ │ │ │ +
12
│ │ │ │ + │ │ │ │ + │ │ │ │ +
15
│ │ │ │ +
16
│ │ │ │ +
17namespace Dune {
│ │ │ │ +
18namespace Functions {
│ │ │ │
19
│ │ │ │ -
20
│ │ │ │ +
20namespace Imp {
│ │ │ │
21
│ │ │ │ -
22namespace Dune {
│ │ │ │ -
23namespace Functions {
│ │ │ │ -
24
│ │ │ │ -
25
│ │ │ │ -
26
│ │ │ │ -
27/*
│ │ │ │ -
28 * Default implementation is empty
│ │ │ │ -
29 * The actual implementation is only given if Signature is an type
│ │ │ │ -
30 * describing a function signature as Range(Domain).
│ │ │ │ -
31 */
│ │ │ │ -
32template<class Signature, class LocalContext, template<class> class DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
34{};
│ │ │ │ -
│ │ │ │ -
35
│ │ │ │ -
36
│ │ │ │ -
37
│ │ │ │ -
38namespace Imp
│ │ │ │ -
39{
│ │ │ │ -
40
│ │ │ │ -
42 template<class S, class L, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ -
43 struct LocalFunctionTraits :
│ │ │ │ -
44 DifferentiableFunctionTraits<S, DerivativeTraits, bufferSize>
│ │ │ │ -
45 {
│ │ │ │ -
46 protected:
│ │ │ │ -
47 using Base=DifferentiableFunctionTraits<S, DerivativeTraits, bufferSize>;
│ │ │ │ -
48
│ │ │ │ -
49 public:
│ │ │ │ -
51 using LocalContext = L;
│ │ │ │ -
52
│ │ │ │ -
54 using DerivativeSignature = typename Base::DerivativeSignature;
│ │ │ │ -
55
│ │ │ │ - │ │ │ │ -
58
│ │ │ │ -
60 using Concept = LocalFunctionWrapperInterface<S, DerivativeInterface, L>;
│ │ │ │ -
61
│ │ │ │ -
63 template<class B>
│ │ │ │ -
64 using Model = LocalFunctionWrapperImplementation<S, DerivativeInterface, L, B>;
│ │ │ │ -
65 };
│ │ │ │ -
66}
│ │ │ │ -
67
│ │ │ │ +
22template<class ST, ST begin, ST end>
│ │ │ │ +
23struct StaticFindInRange
│ │ │ │ +
24{
│ │ │ │ +
25 template<class F, class...Args>
│ │ │ │ +
26 static void apply(F&& f, Args&&... args)
│ │ │ │ +
27 {
│ │ │ │ +
28 if (f(std::integral_constant<ST, begin>(), std::forward<Args>(args)...))
│ │ │ │ +
29 return;
│ │ │ │ +
30 StaticFindInRange<ST, begin+1, end>::apply(std::forward<F>(f), std::forward<Args>(args)...);
│ │ │ │ +
31 }
│ │ │ │ +
32};
│ │ │ │ +
33
│ │ │ │ +
34template<class ST, ST end>
│ │ │ │ +
35struct StaticFindInRange<ST, end, end>
│ │ │ │ +
36{
│ │ │ │ +
37 template<class F, class...Args>
│ │ │ │ +
38 static void apply(F&& f, Args&&...)
│ │ │ │ +
39 {}
│ │ │ │ +
40};
│ │ │ │ +
41
│ │ │ │ +
42} //end namespace Imp
│ │ │ │ +
43
│ │ │ │ +
44
│ │ │ │ +
45
│ │ │ │ +
59template<std::size_t begin_t, std::size_t end_t, class F, class... Args>
│ │ │ │ +
│ │ │ │ +
60void staticFindInRange(F&& f, Args&&... args)
│ │ │ │ +
61{
│ │ │ │ +
62 Imp::StaticFindInRange<std::size_t, begin_t, end_t>::apply(std::forward<F>(f), std::forward<Args>(args)...);
│ │ │ │ +
63}
│ │ │ │ +
│ │ │ │ +
64
│ │ │ │ +
65
│ │ │ │ +
66} // namespace Dune::Functions
│ │ │ │ +
67} // namespace Dune
│ │ │ │
68
│ │ │ │
69
│ │ │ │ -
90template<class Range, class Domain, class LocalContext, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ -
│ │ │ │ -
91class LocalFunction< Range(Domain), LocalContext, DerivativeTraits, bufferSize> :
│ │ │ │ -
92 public TypeErasureBase<
│ │ │ │ -
93 typename Imp::LocalFunctionTraits<Range(Domain), LocalContext, DerivativeTraits, bufferSize>::Concept,
│ │ │ │ -
94 Imp::LocalFunctionTraits<Range(Domain), LocalContext, DerivativeTraits, bufferSize>::template Model>
│ │ │ │ -
95{
│ │ │ │ -
96 using Traits = Imp::LocalFunctionTraits<Range(Domain), LocalContext, DerivativeTraits, bufferSize>;
│ │ │ │ -
97
│ │ │ │ - │ │ │ │ -
99
│ │ │ │ -
100 using DerivativeInterface = typename Traits::DerivativeInterface;
│ │ │ │ -
101
│ │ │ │ -
102public:
│ │ │ │ -
103
│ │ │ │ -
115 template<class F, disableCopyMove<LocalFunction, F> = 0 >
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
117 Base(std::forward<F>(f))
│ │ │ │ -
118 {
│ │ │ │ -
119 static_assert(Dune::Functions::Concept::isLocalFunction<F, Range(Domain), LocalContext>(), "Trying to construct a LocalFunction from type that does not model the LocalFunction concept");
│ │ │ │ -
120 }
│ │ │ │ -
│ │ │ │ -
121
│ │ │ │ -
122 LocalFunction() = default;
│ │ │ │ -
123
│ │ │ │ -
│ │ │ │ -
127 Range operator() (const Domain& x) const
│ │ │ │ -
128 {
│ │ │ │ -
129 return this->asInterface().operator()(x);
│ │ │ │ -
130 }
│ │ │ │ -
│ │ │ │ -
131
│ │ │ │ -
│ │ │ │ -
139 friend DerivativeInterface derivative(const LocalFunction& t)
│ │ │ │ -
140 {
│ │ │ │ -
141 return t.asInterface().derivative();
│ │ │ │ -
142 }
│ │ │ │ -
│ │ │ │ -
143
│ │ │ │ -
│ │ │ │ -
150 void bind(const LocalContext& context)
│ │ │ │ -
151 {
│ │ │ │ -
152 this->asInterface().bind(context);
│ │ │ │ -
153 }
│ │ │ │ -
│ │ │ │ -
154
│ │ │ │ -
│ │ │ │ -
158 void unbind()
│ │ │ │ -
159 {
│ │ │ │ -
160 this->asInterface().unbind();
│ │ │ │ -
161 }
│ │ │ │ -
│ │ │ │ -
162
│ │ │ │ -
│ │ │ │ -
165 bool bound() const
│ │ │ │ -
166 {
│ │ │ │ -
167 return this->asInterface().bound();
│ │ │ │ -
168 }
│ │ │ │ -
│ │ │ │ -
169
│ │ │ │ -
│ │ │ │ -
173 const LocalContext& localContext() const
│ │ │ │ -
174 {
│ │ │ │ -
175 return this->asInterface().localContext();
│ │ │ │ -
176 }
│ │ │ │ -
│ │ │ │ -
177};
│ │ │ │ -
│ │ │ │ -
178
│ │ │ │ -
179
│ │ │ │ -
180
│ │ │ │ -
181}} // namespace Dune::Functions
│ │ │ │ -
182
│ │ │ │ -
183
│ │ │ │ -
184
│ │ │ │ -
185#endif // DUNE_FUNCTIONS_COMMON_LOCAL_FUNCTION_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
friend DerivativeInterface derivative(const LocalFunction &t)
Get derivative of wrapped function.
Definition localfunction.hh:139
│ │ │ │ +
70
│ │ │ │ +
71#endif //DUNE_FUNCTIONS_COMMON_STATICFORLOOP_HH
│ │ │ │ + │ │ │ │ +
void staticFindInRange(F &&f, Args &&... args)
Static find loop.
Definition staticforloop.hh:60
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
Definition localfunction.hh:34
│ │ │ │ -
const LocalContext & localContext() const
Obtain local context this LocalFunction is bound to.
Definition localfunction.hh:173
│ │ │ │ -
LocalFunction(F &&f)
Construct from function.
Definition localfunction.hh:116
│ │ │ │ -
void unbind()
Unbind from local context.
Definition localfunction.hh:158
│ │ │ │ -
bool bound() const
Return if the local function is bound to a grid element.
Definition localfunction.hh:165
│ │ │ │ -
void bind(const LocalContext &context)
Bind function to a local context.
Definition localfunction.hh:150
│ │ │ │ - │ │ │ │ -
Base class for type-erased interface wrapper.
Definition typeerasure.hh:169
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,194 +1,81 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _c_o_m_m_o_n │ │ │ │ │ -localfunction.hh │ │ │ │ │ +staticforloop.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_COMMON_LOCAL_FUNCTION_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_COMMON_LOCAL_FUNCTION_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_COMMON_STATICFORLOOP_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_COMMON_STATICFORLOOP_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11 │ │ │ │ │ -12#include │ │ │ │ │ -13 │ │ │ │ │ -14#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -15#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ -16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_l_o_c_a_l_f_u_n_c_t_i_o_n___i_m_p_._h_h> │ │ │ │ │ -17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e_e_r_a_s_u_r_e_._h_h> │ │ │ │ │ -18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +10 │ │ │ │ │ +11#include │ │ │ │ │ +12 │ │ │ │ │ +13#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ +14#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +15 │ │ │ │ │ +16 │ │ │ │ │ +17namespace _D_u_n_e { │ │ │ │ │ +18namespace Functions { │ │ │ │ │ 19 │ │ │ │ │ -20 │ │ │ │ │ +20namespace Imp { │ │ │ │ │ 21 │ │ │ │ │ -22namespace _D_u_n_e { │ │ │ │ │ -23namespace Functions { │ │ │ │ │ -24 │ │ │ │ │ -25 │ │ │ │ │ -26 │ │ │ │ │ -27/* │ │ │ │ │ -28 * Default implementation is empty │ │ │ │ │ -29 * The actual implementation is only given if Signature is an type │ │ │ │ │ -30 * describing a function signature as Range(Domain). │ │ │ │ │ -31 */ │ │ │ │ │ -32template class │ │ │ │ │ -DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56> │ │ │ │ │ -_3_3class _L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ -34{}; │ │ │ │ │ -35 │ │ │ │ │ -36 │ │ │ │ │ -37 │ │ │ │ │ -38namespace Imp │ │ │ │ │ -39{ │ │ │ │ │ -40 │ │ │ │ │ -42 template class DerivativeTraits, size_t │ │ │ │ │ -bufferSize> │ │ │ │ │ -43 struct LocalFunctionTraits : │ │ │ │ │ -44 DifferentiableFunctionTraits │ │ │ │ │ -45 { │ │ │ │ │ -46 protected: │ │ │ │ │ -47 using Base=DifferentiableFunctionTraits; │ │ │ │ │ -48 │ │ │ │ │ -49 public: │ │ │ │ │ -51 using LocalContext = L; │ │ │ │ │ -52 │ │ │ │ │ -54 using DerivativeSignature = typename Base::DerivativeSignature; │ │ │ │ │ -55 │ │ │ │ │ -57 using DerivativeInterface = _L_o_c_a_l_F_u_n_c_t_i_o_n_<_D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_,_ _L_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _b_u_f_f_e_r_S_i_z_e_>; │ │ │ │ │ -58 │ │ │ │ │ -60 using Concept = LocalFunctionWrapperInterface; │ │ │ │ │ -61 │ │ │ │ │ -63 template │ │ │ │ │ -64 using Model = LocalFunctionWrapperImplementation; │ │ │ │ │ -65 }; │ │ │ │ │ -66} │ │ │ │ │ -67 │ │ │ │ │ +22template │ │ │ │ │ +23struct StaticFindInRange │ │ │ │ │ +24{ │ │ │ │ │ +25 template │ │ │ │ │ +26 static void apply(F&& f, Args&&... args) │ │ │ │ │ +27 { │ │ │ │ │ +28 if (f(std::integral_constant(), std::forward(args)...)) │ │ │ │ │ +29 return; │ │ │ │ │ +30 StaticFindInRange::apply(std::forward(f), std:: │ │ │ │ │ +forward(args)...); │ │ │ │ │ +31 } │ │ │ │ │ +32}; │ │ │ │ │ +33 │ │ │ │ │ +34template │ │ │ │ │ +35struct StaticFindInRange │ │ │ │ │ +36{ │ │ │ │ │ +37 template │ │ │ │ │ +38 static void apply(F&& f, Args&&...) │ │ │ │ │ +39 {} │ │ │ │ │ +40}; │ │ │ │ │ +41 │ │ │ │ │ +42} //end namespace Imp │ │ │ │ │ +43 │ │ │ │ │ +44 │ │ │ │ │ +45 │ │ │ │ │ +59template │ │ │ │ │ +_6_0void _s_t_a_t_i_c_F_i_n_d_I_n_R_a_n_g_e(F&& f, Args&&... args) │ │ │ │ │ +61{ │ │ │ │ │ +62 Imp::StaticFindInRange::apply(std::forward │ │ │ │ │ +(f), std::forward(args)...); │ │ │ │ │ +63} │ │ │ │ │ +64 │ │ │ │ │ +65 │ │ │ │ │ +66} // namespace Dune::Functions │ │ │ │ │ +67} // namespace Dune │ │ │ │ │ 68 │ │ │ │ │ 69 │ │ │ │ │ -90template class │ │ │ │ │ -DerivativeTraits, size_t bufferSize> │ │ │ │ │ -_9_1class _L_o_c_a_l_F_u_n_c_t_i_o_n< Range(Domain), LocalContext, DerivativeTraits, │ │ │ │ │ -bufferSize> : │ │ │ │ │ -92 public _T_y_p_e_E_r_a_s_u_r_e_B_a_s_e< │ │ │ │ │ -93 typename Imp::LocalFunctionTraits::Concept, │ │ │ │ │ -94 Imp::LocalFunctionTraits::template Model> │ │ │ │ │ -95{ │ │ │ │ │ -96 using Traits = Imp::LocalFunctionTraits; │ │ │ │ │ -97 │ │ │ │ │ -98 using _B_a_s_e = _T_y_p_e_E_r_a_s_u_r_e_B_a_s_e_<_t_y_p_e_n_a_m_e_ _T_r_a_i_t_s_:_:_C_o_n_c_e_p_t_,_ _T_r_a_i_t_s_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ -_M_o_d_e_l_>; │ │ │ │ │ -99 │ │ │ │ │ -100 using DerivativeInterface = typename _T_r_a_i_t_s_:_:_D_e_r_i_v_a_t_i_v_e_I_n_t_e_r_f_a_c_e; │ │ │ │ │ -101 │ │ │ │ │ -102public: │ │ │ │ │ -103 │ │ │ │ │ -115 template = 0 > │ │ │ │ │ -_1_1_6 _L_o_c_a_l_F_u_n_c_t_i_o_n(F&& f) : │ │ │ │ │ -117 _B_a_s_e(std::forward(f)) │ │ │ │ │ -118 { │ │ │ │ │ -119 static_assert(Dune::Functions::Concept::isLocalFunction(), "Trying to construct a LocalFunction from type that does not │ │ │ │ │ -model the LocalFunction concept"); │ │ │ │ │ -120 } │ │ │ │ │ -121 │ │ │ │ │ -_1_2_2 _L_o_c_a_l_F_u_n_c_t_i_o_n() = default; │ │ │ │ │ -123 │ │ │ │ │ -_1_2_7 Range operator() (const Domain& x) const │ │ │ │ │ -128 { │ │ │ │ │ -129 return this->asInterface().operator()(x); │ │ │ │ │ -130 } │ │ │ │ │ -131 │ │ │ │ │ -_1_3_9 friend DerivativeInterface _d_e_r_i_v_a_t_i_v_e(const _L_o_c_a_l_F_u_n_c_t_i_o_n& t) │ │ │ │ │ -140 { │ │ │ │ │ -141 return t.asInterface().derivative(); │ │ │ │ │ -142 } │ │ │ │ │ -143 │ │ │ │ │ -_1_5_0 void _b_i_n_d(const LocalContext& context) │ │ │ │ │ -151 { │ │ │ │ │ -152 this->asInterface().bind(context); │ │ │ │ │ -153 } │ │ │ │ │ -154 │ │ │ │ │ -_1_5_8 void _u_n_b_i_n_d() │ │ │ │ │ -159 { │ │ │ │ │ -160 this->asInterface().unbind(); │ │ │ │ │ -161 } │ │ │ │ │ -162 │ │ │ │ │ -_1_6_5 bool _b_o_u_n_d() const │ │ │ │ │ -166 { │ │ │ │ │ -167 return this->asInterface().bound(); │ │ │ │ │ -168 } │ │ │ │ │ -169 │ │ │ │ │ -_1_7_3 const LocalContext& _l_o_c_a_l_C_o_n_t_e_x_t() const │ │ │ │ │ -174 { │ │ │ │ │ -175 return this->asInterface().localContext(); │ │ │ │ │ -176 } │ │ │ │ │ -177}; │ │ │ │ │ -178 │ │ │ │ │ -179 │ │ │ │ │ -180 │ │ │ │ │ -181}} // namespace Dune::Functions │ │ │ │ │ -182 │ │ │ │ │ -183 │ │ │ │ │ -184 │ │ │ │ │ -185#endif // DUNE_FUNCTIONS_COMMON_LOCAL_FUNCTION_HH │ │ │ │ │ -_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ -_t_y_p_e_e_r_a_s_u_r_e_._h_h │ │ │ │ │ -_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h │ │ │ │ │ -_l_o_c_a_l_f_u_n_c_t_i_o_n___i_m_p_._h_h │ │ │ │ │ -_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _L_o_c_a_l_C_o_n_t_e_x_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ -_b_u_f_f_e_r_S_i_z_e_ _>_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ -friend DerivativeInterface derivative(const LocalFunction &t) │ │ │ │ │ -Get derivative of wrapped function. │ │ │ │ │ -DDeeffiinniittiioonn localfunction.hh:139 │ │ │ │ │ +70 │ │ │ │ │ +71#endif //DUNE_FUNCTIONS_COMMON_STATICFORLOOP_HH │ │ │ │ │ +_t_y_p_e___t_r_a_i_t_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_t_a_t_i_c_F_i_n_d_I_n_R_a_n_g_e │ │ │ │ │ +void staticFindInRange(F &&f, Args &&... args) │ │ │ │ │ +Static find loop. │ │ │ │ │ +DDeeffiinniittiioonn staticforloop.hh:60 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn localfunction.hh:34 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _L_o_c_a_l_C_o_n_t_e_x_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ -_b_u_f_f_e_r_S_i_z_e_ _>_:_:_l_o_c_a_l_C_o_n_t_e_x_t │ │ │ │ │ -const LocalContext & localContext() const │ │ │ │ │ -Obtain local context this LocalFunction is bound to. │ │ │ │ │ -DDeeffiinniittiioonn localfunction.hh:173 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _L_o_c_a_l_C_o_n_t_e_x_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ -_b_u_f_f_e_r_S_i_z_e_ _>_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ -LocalFunction(F &&f) │ │ │ │ │ -Construct from function. │ │ │ │ │ -DDeeffiinniittiioonn localfunction.hh:116 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _L_o_c_a_l_C_o_n_t_e_x_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ -_b_u_f_f_e_r_S_i_z_e_ _>_:_:_u_n_b_i_n_d │ │ │ │ │ -void unbind() │ │ │ │ │ -Unbind from local context. │ │ │ │ │ -DDeeffiinniittiioonn localfunction.hh:158 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _L_o_c_a_l_C_o_n_t_e_x_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ -_b_u_f_f_e_r_S_i_z_e_ _>_:_:_b_o_u_n_d │ │ │ │ │ -bool bound() const │ │ │ │ │ -Return if the local function is bound to a grid element. │ │ │ │ │ -DDeeffiinniittiioonn localfunction.hh:165 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _L_o_c_a_l_C_o_n_t_e_x_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ -_b_u_f_f_e_r_S_i_z_e_ _>_:_:_b_i_n_d │ │ │ │ │ -void bind(const LocalContext &context) │ │ │ │ │ -Bind function to a local context. │ │ │ │ │ -DDeeffiinniittiioonn localfunction.hh:150 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _L_o_c_a_l_C_o_n_t_e_x_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ -_b_u_f_f_e_r_S_i_z_e_ _>_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ -LocalFunction()=default │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_y_p_e_E_r_a_s_u_r_e_B_a_s_e │ │ │ │ │ -Base class for type-erased interface wrapper. │ │ │ │ │ -DDeeffiinniittiioonn typeerasure.hh:169 │ │ │ │ │ +_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00062.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: differentiablefunction.hh File Reference │ │ │ │ +dune-functions: facenormalgridfunction.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,41 +65,39 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
differentiablefunction.hh File Reference
│ │ │ │ +
facenormalgridfunction.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │
#include <type_traits>
│ │ │ │ +#include <optional>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ #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/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::DifferentiableFunction< Signature, DerivativeTraits, bufferSize >
 
class  Dune::Functions::DifferentiableFunction< Range(Domain), DerivativeTraits, bufferSize >
 Class storing differentiable functions using type erasure. More...
class  Dune::Functions::FaceNormalGridFunction< GV >
 Grid function implementing the piecewise element face normal. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,32 +1,28 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _c_o_m_m_o_n │ │ │ │ │ + * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -differentiablefunction.hh File Reference │ │ │ │ │ +facenormalgridfunction.hh File Reference │ │ │ │ │ #include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n___i_m_p_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_s_i_g_n_a_t_u_r_e_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e_e_r_a_s_u_r_e_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_ _S_i_g_n_a_t_u_r_e_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ - _b_u_f_f_e_r_S_i_z_e_ _> │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ - _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _b_u_f_f_e_r_S_i_z_e_ _> │ │ │ │ │ -  Class storing differentiable functions using type erasure. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n_<_ _G_V_ _> │ │ │ │ │ +  Grid function implementing the piecewise element face normal. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00062_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: differentiablefunction.hh Source File │ │ │ │ +dune-functions: facenormalgridfunction.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,146 +70,213 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
differentiablefunction.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_FACENORMALGRIDFUNCTION_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_FACENORMALGRIDFUNCTION_HH
│ │ │ │
9
│ │ │ │
10#include <type_traits>
│ │ │ │ -
11
│ │ │ │ -
12#include <dune/common/typeutilities.hh>
│ │ │ │ -
13
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +
11#include <optional>
│ │ │ │ +
12
│ │ │ │ +
13#include <dune/common/exceptions.hh>
│ │ │ │ +
14#include <dune/common/typeutilities.hh>
│ │ │ │ +
15#include <dune/common/rangeutilities.hh>
│ │ │ │ +
16#include <dune/geometry/referenceelements.hh>
│ │ │ │ +
17
│ │ │ │ + │ │ │ │ + │ │ │ │
20
│ │ │ │ -
21namespace Dune {
│ │ │ │ -
22namespace Functions {
│ │ │ │ +
21
│ │ │ │ +
22namespace Dune::Functions {
│ │ │ │
23
│ │ │ │ -
24
│ │ │ │ +
24namespace Impl {
│ │ │ │
25
│ │ │ │ -
26/*
│ │ │ │ -
27 * Default implementation is empty
│ │ │ │ -
28 * The actual implementation is only given if Signature is an type
│ │ │ │ -
29 * describing a function signature as Range(Domain).
│ │ │ │ -
30 */
│ │ │ │ -
31template<class Signature, template<class> class DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
33{};
│ │ │ │ -
│ │ │ │ -
34
│ │ │ │ -
35
│ │ │ │ -
36
│ │ │ │ -
37namespace Imp
│ │ │ │ -
38{
│ │ │ │ -
39
│ │ │ │ -
41 template<class S, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ -
42 struct DifferentiableFunctionTraits
│ │ │ │ -
43 {
│ │ │ │ -
45 using Signature = S;
│ │ │ │ -
46
│ │ │ │ -
48 using Range = typename SignatureTraits<Signature>::Range;
│ │ │ │ -
49
│ │ │ │ -
51 using Domain = typename SignatureTraits<Signature>::Domain;
│ │ │ │ +
26// Compute closest face to point
│ │ │ │ +
27template<class ReferenceElement, class Coordinate>
│ │ │ │ +
28auto closestFaceIndex(const ReferenceElement& re, const Coordinate& x)
│ │ │ │ +
29{
│ │ │ │ +
30 auto closestFaceIndex = decltype(re.subEntity(0,1,0,1)){};
│ │ │ │ +
31 double closestFaceDistance = std::numeric_limits<double>::max();
│ │ │ │ +
32 for(auto&& faceIndex : Dune::range(re.size(1)))
│ │ │ │ +
33 {
│ │ │ │ +
34 // For a face unit outer normal consider the orthogonal projection
│ │ │ │ +
35 // Px = x + <c-x,n>*n into the face. Then the distance to the face
│ │ │ │ +
36 // is given by |x-Px| = |<c-x,n>||n| = <c-x,n>.
│ │ │ │ +
37 auto normal = re.integrationOuterNormal(faceIndex);
│ │ │ │ +
38 normal /= normal.two_norm();
│ │ │ │ +
39 auto c = re.position(faceIndex,1);
│ │ │ │ +
40 c -= x;
│ │ │ │ +
41 auto faceDistance = (c*normal);
│ │ │ │ +
42 if (faceDistance<closestFaceDistance)
│ │ │ │ +
43 {
│ │ │ │ +
44 closestFaceDistance = faceDistance;
│ │ │ │ +
45 closestFaceIndex = faceIndex;
│ │ │ │ +
46 }
│ │ │ │ +
47 }
│ │ │ │ +
48 return closestFaceIndex;
│ │ │ │ +
49}
│ │ │ │ +
50
│ │ │ │ +
51} // end namespace Impl
│ │ │ │
52
│ │ │ │ -
54 using DerivativeSignature = typename SignatureTraits<Signature>::template DerivativeSignature<DerivativeTraits>;
│ │ │ │ +
53
│ │ │ │ +
54
│ │ │ │
55
│ │ │ │ - │ │ │ │ -
58
│ │ │ │ -
60 using Concept = DifferentiableFunctionWrapperInterface<Signature, DerivativeInterface>;
│ │ │ │ -
61
│ │ │ │ -
63 template<class B>
│ │ │ │ -
64 using Model = DifferentiableFunctionWrapperImplementation<Signature, DerivativeInterface, B>;
│ │ │ │ -
65 };
│ │ │ │ -
66}
│ │ │ │ -
67
│ │ │ │ -
68
│ │ │ │ -
69
│ │ │ │ -
84template<class Range, class Domain, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ -
│ │ │ │ -
85class DifferentiableFunction< Range(Domain), DerivativeTraits, bufferSize> :
│ │ │ │ -
86 public TypeErasureBase<
│ │ │ │ -
87 typename Imp::DifferentiableFunctionTraits<Range(Domain), DerivativeTraits, bufferSize>::Concept,
│ │ │ │ -
88 Imp::DifferentiableFunctionTraits<Range(Domain), DerivativeTraits, bufferSize>::template Model>
│ │ │ │ -
89{
│ │ │ │ -
90 using Traits = Imp::DifferentiableFunctionTraits<Range(Domain), DerivativeTraits, bufferSize>;
│ │ │ │ -
91
│ │ │ │ - │ │ │ │ -
93
│ │ │ │ -
94 using DerivativeInterface = typename Traits::DerivativeInterface;
│ │ │ │ -
95
│ │ │ │ -
96public:
│ │ │ │ -
97
│ │ │ │ -
109 template<class F, disableCopyMove<DifferentiableFunction, F> = 0 >
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
111 Base(std::forward<F>(f))
│ │ │ │ -
112 {
│ │ │ │ -
113 static_assert(Dune::Functions::Concept::isFunction<F, Range(Domain)>(), "Trying to construct a DifferentiableFunction from type that does not model the Function concept");
│ │ │ │ -
114 }
│ │ │ │ -
│ │ │ │ -
115
│ │ │ │ - │ │ │ │ +
68template<class GV>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
70{
│ │ │ │ +
71public:
│ │ │ │ +
72 using GridView = GV;
│ │ │ │ + │ │ │ │ +
74 using Element = typename EntitySet::Element;
│ │ │ │ +
75
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
79
│ │ │ │ +
80private:
│ │ │ │ +
81
│ │ │ │ +
82 using Traits = Imp::GridFunctionTraits<Range(Domain), EntitySet, DefaultDerivativeTraits, 16>;
│ │ │ │ +
83
│ │ │ │ +
84 class LocalFunction
│ │ │ │ +
85 {
│ │ │ │ +
86 using Geometry = typename Element::Geometry;
│ │ │ │ +
87 static const int dimension = GV::dimension;
│ │ │ │ +
88 public:
│ │ │ │ +
89
│ │ │ │ +
101 void bind(const Element& element)
│ │ │ │ +
102 {
│ │ │ │ +
103 element_ = element;
│ │ │ │ +
104 geometry_.emplace(element_.geometry());
│ │ │ │ +
105 }
│ │ │ │ +
106
│ │ │ │ +
107 void unbind()
│ │ │ │ +
108 {
│ │ │ │ +
109 geometry_.reset();
│ │ │ │ +
110 }
│ │ │ │ +
111
│ │ │ │ +
114 bool bound() const
│ │ │ │ +
115 {
│ │ │ │ +
116 return static_cast<bool>(geometry_);
│ │ │ │ +
117 }
│ │ │ │
118
│ │ │ │ -
│ │ │ │ -
122 Range operator() (const Domain& x) const
│ │ │ │ -
123 {
│ │ │ │ -
124 return this->asInterface().operator()(x);
│ │ │ │ -
125 }
│ │ │ │ -
│ │ │ │ -
126
│ │ │ │ -
│ │ │ │ -
134 friend DerivativeInterface derivative(const DifferentiableFunction& t)
│ │ │ │ -
135 {
│ │ │ │ -
136 return t.asInterface().derivative();
│ │ │ │ -
137 }
│ │ │ │ -
│ │ │ │ -
138};
│ │ │ │ -
│ │ │ │ -
139
│ │ │ │ -
140
│ │ │ │ -
141
│ │ │ │ -
142}} // namespace Dune::Functions
│ │ │ │ -
143
│ │ │ │ -
144
│ │ │ │ -
145
│ │ │ │ -
146#endif // DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
friend DerivativeInterface derivative(const DifferentiableFunction &t)
Get derivative of wrapped function.
Definition differentiablefunction.hh:134
│ │ │ │ +
128 Range operator()(const LocalDomain& x) const
│ │ │ │ +
129 {
│ │ │ │ +
130 auto&& re = Dune::referenceElement(*geometry_);
│ │ │ │ +
131 // Compute reference normal of closest face to given point
│ │ │ │ +
132 auto face = Impl::closestFaceIndex(re, x);
│ │ │ │ +
133 auto localNormal = re.integrationOuterNormal(face);
│ │ │ │ +
134
│ │ │ │ +
135 // Transform reference normal into global unit outer normal using
│ │ │ │ +
136 // covariant Piola transformation
│ │ │ │ +
137 auto normal = Range{};
│ │ │ │ +
138 geometry_->jacobianInverseTransposed(x).mv(localNormal, normal);
│ │ │ │ +
139 normal /= normal.two_norm();
│ │ │ │ +
140 return normal;
│ │ │ │ +
141 }
│ │ │ │ +
142
│ │ │ │ +
144 const Element& localContext() const
│ │ │ │ +
145 {
│ │ │ │ +
146 return element_;
│ │ │ │ +
147 }
│ │ │ │ +
148
│ │ │ │ +
150 friend typename Traits::LocalFunctionTraits::DerivativeInterface derivative(const LocalFunction& t)
│ │ │ │ +
151 {
│ │ │ │ +
152 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │ +
153 }
│ │ │ │ +
154
│ │ │ │ +
155 private:
│ │ │ │ +
156 std::optional<Geometry> geometry_;
│ │ │ │ +
157 Element element_;
│ │ │ │ +
158 };
│ │ │ │ +
159
│ │ │ │ +
160public:
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
163 entitySet_(gridView)
│ │ │ │ +
164 {}
│ │ │ │ +
│ │ │ │ +
165
│ │ │ │ +
│ │ │ │ +
167 Range operator()(const Domain& x) const
│ │ │ │ +
168 {
│ │ │ │ +
169 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │ +
170 }
│ │ │ │ +
│ │ │ │ +
171
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
174 {
│ │ │ │ +
175 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │ +
176 }
│ │ │ │ +
│ │ │ │ +
177
│ │ │ │ +
│ │ │ │ +
179 friend LocalFunction localFunction(const FaceNormalGridFunction& t)
│ │ │ │ +
180 {
│ │ │ │ +
181 return LocalFunction{};
│ │ │ │ +
182 }
│ │ │ │ +
│ │ │ │ +
183
│ │ │ │ +
│ │ │ │ +
185 const EntitySet& entitySet() const
│ │ │ │ +
186 {
│ │ │ │ +
187 return entitySet_;
│ │ │ │ +
188 }
│ │ │ │ +
│ │ │ │ +
189
│ │ │ │ +
190private:
│ │ │ │ +
191 EntitySet entitySet_;
│ │ │ │ +
192};
│ │ │ │ +
│ │ │ │ +
193
│ │ │ │ +
194
│ │ │ │ +
195
│ │ │ │ +
196} // namespace Dune::Functions
│ │ │ │ +
197
│ │ │ │ +
198#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_FACENORMALGRIDFUNCTION_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ +
TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const TrigonometricFunction< K, sinFactor, cosFactor > &f)
Obtain derivative of TrigonometricFunction function.
Definition trigonometricfunction.hh:43
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
Definition differentiablefunction.hh:33
│ │ │ │ -
DifferentiableFunction(F &&f)
Construct from function.
Definition differentiablefunction.hh:110
│ │ │ │ - │ │ │ │ -
Helper class to deduce the signature of a callable.
Definition signature.hh:60
│ │ │ │ -
Base class for type-erased interface wrapper.
Definition typeerasure.hh:169
│ │ │ │ +
Definition polynomial.hh:18
│ │ │ │ +
Default implementation for derivative traits.
Definition defaultderivativetraits.hh:41
│ │ │ │ +
Grid function implementing the piecewise element face normal.
Definition facenormalgridfunction.hh:70
│ │ │ │ +
GridViewEntitySet< GridView, 0 > EntitySet
Definition facenormalgridfunction.hh:73
│ │ │ │ +
typename EntitySet::LocalCoordinate LocalDomain
Definition facenormalgridfunction.hh:76
│ │ │ │ +
typename EntitySet::GlobalCoordinate Domain
Definition facenormalgridfunction.hh:77
│ │ │ │ +
typename EntitySet::GlobalCoordinate Range
Definition facenormalgridfunction.hh:78
│ │ │ │ +
const EntitySet & entitySet() const
Return the stored GridViewEntitySet.
Definition facenormalgridfunction.hh:185
│ │ │ │ +
friend Traits::DerivativeInterface derivative(const FaceNormalGridFunction &t)
Not implemented.
Definition facenormalgridfunction.hh:173
│ │ │ │ +
GV GridView
Definition facenormalgridfunction.hh:72
│ │ │ │ +
friend LocalFunction localFunction(const FaceNormalGridFunction &t)
Return a local-function associated to FaceNormalGridFunction.
Definition facenormalgridfunction.hh:179
│ │ │ │ +
FaceNormalGridFunction(const GridView &gridView)
Construct the FaceNormalGridFunction.
Definition facenormalgridfunction.hh:162
│ │ │ │ +
typename EntitySet::Element Element
Definition facenormalgridfunction.hh:74
│ │ │ │ +
Range operator()(const Domain &x) const
Not implemented.
Definition facenormalgridfunction.hh:167
│ │ │ │ +
Definition gridfunction.hh:36
│ │ │ │ + │ │ │ │ +
GridView::template Codim< codim >::Entity Element
Type of Elements contained in this EntitySet.
Definition gridviewentityset.hh:36
│ │ │ │ +
Element::Geometry::LocalCoordinate LocalCoordinate
Type of local coordinates with respect to the Element.
Definition gridviewentityset.hh:39
│ │ │ │ +
Element::Geometry::GlobalCoordinate GlobalCoordinate
Definition gridviewentityset.hh:40
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,157 +1,242 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _c_o_m_m_o_n │ │ │ │ │ -differentiablefunction.hh │ │ │ │ │ + * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ +facenormalgridfunction.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_FACENORMALGRIDFUNCTION_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_FACENORMALGRIDFUNCTION_HH │ │ │ │ │ 9 │ │ │ │ │ 10#include │ │ │ │ │ -11 │ │ │ │ │ -12#include │ │ │ │ │ -13 │ │ │ │ │ -14#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ -15#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ -16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n___i_m_p_._h_h> │ │ │ │ │ -17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_s_i_g_n_a_t_u_r_e_._h_h> │ │ │ │ │ -18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e_e_r_a_s_u_r_e_._h_h> │ │ │ │ │ -19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +11#include │ │ │ │ │ +12 │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17 │ │ │ │ │ +18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ +19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h> │ │ │ │ │ 20 │ │ │ │ │ -21namespace _D_u_n_e { │ │ │ │ │ -22namespace Functions { │ │ │ │ │ +21 │ │ │ │ │ +22namespace _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s { │ │ │ │ │ 23 │ │ │ │ │ -24 │ │ │ │ │ +24namespace Impl { │ │ │ │ │ 25 │ │ │ │ │ -26/* │ │ │ │ │ -27 * Default implementation is empty │ │ │ │ │ -28 * The actual implementation is only given if Signature is an type │ │ │ │ │ -29 * describing a function signature as Range(Domain). │ │ │ │ │ -30 */ │ │ │ │ │ -31template class │ │ │ │ │ -DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56> │ │ │ │ │ -_3_2class _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n │ │ │ │ │ -33{}; │ │ │ │ │ -34 │ │ │ │ │ -35 │ │ │ │ │ -36 │ │ │ │ │ -37namespace Imp │ │ │ │ │ -38{ │ │ │ │ │ -39 │ │ │ │ │ -41 template class DerivativeTraits, size_t bufferSize> │ │ │ │ │ -42 struct DifferentiableFunctionTraits │ │ │ │ │ +26// Compute closest face to point │ │ │ │ │ +27template │ │ │ │ │ +28auto closestFaceIndex(const ReferenceElement& re, const Coordinate& x) │ │ │ │ │ +29{ │ │ │ │ │ +30 auto closestFaceIndex = decltype(re.subEntity(0,1,0,1)){}; │ │ │ │ │ +31 double closestFaceDistance = std::numeric_limits::max(); │ │ │ │ │ +32 for(auto&& faceIndex : _D_u_n_e::range(re.size(1))) │ │ │ │ │ +33 { │ │ │ │ │ +34 // For a face unit outer normal consider the orthogonal projection │ │ │ │ │ +35 // Px = x + *n into the face. Then the distance to the face │ │ │ │ │ +36 // is given by |x-Px| = |||n| = . │ │ │ │ │ +37 auto normal = re.integrationOuterNormal(faceIndex); │ │ │ │ │ +38 normal /= normal.two_norm(); │ │ │ │ │ +39 auto c = re.position(faceIndex,1); │ │ │ │ │ +40 c -= x; │ │ │ │ │ +41 auto faceDistance = (c*normal); │ │ │ │ │ +42 if (faceDistance_:_:_R_a_n_g_e; │ │ │ │ │ -49 │ │ │ │ │ -51 using Domain = typename _S_i_g_n_a_t_u_r_e_T_r_a_i_t_s_<_S_i_g_n_a_t_u_r_e_>_:_:_D_o_m_a_i_n; │ │ │ │ │ +44 closestFaceDistance = faceDistance; │ │ │ │ │ +45 closestFaceIndex = faceIndex; │ │ │ │ │ +46 } │ │ │ │ │ +47 } │ │ │ │ │ +48 return closestFaceIndex; │ │ │ │ │ +49} │ │ │ │ │ +50 │ │ │ │ │ +51} // end namespace Impl │ │ │ │ │ 52 │ │ │ │ │ -54 using DerivativeSignature = typename _S_i_g_n_a_t_u_r_e_T_r_a_i_t_s_<_S_i_g_n_a_t_u_r_e_>_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ -DerivativeSignature; │ │ │ │ │ +53 │ │ │ │ │ +54 │ │ │ │ │ 55 │ │ │ │ │ -57 using DerivativeInterface = _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _b_u_f_f_e_r_S_i_z_e_>; │ │ │ │ │ -58 │ │ │ │ │ -60 using Concept = DifferentiableFunctionWrapperInterface; │ │ │ │ │ -61 │ │ │ │ │ -63 template │ │ │ │ │ -64 using Model = DifferentiableFunctionWrapperImplementation; │ │ │ │ │ -65 }; │ │ │ │ │ -66} │ │ │ │ │ -67 │ │ │ │ │ -68 │ │ │ │ │ -69 │ │ │ │ │ -84template class DerivativeTraits, │ │ │ │ │ -size_t bufferSize> │ │ │ │ │ -_8_5class _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n< Range(Domain), DerivativeTraits, bufferSize> : │ │ │ │ │ -86 public _T_y_p_e_E_r_a_s_u_r_e_B_a_s_e< │ │ │ │ │ -87 typename Imp::DifferentiableFunctionTraits::Concept, │ │ │ │ │ -88 Imp::DifferentiableFunctionTraits::template Model> │ │ │ │ │ -89{ │ │ │ │ │ -90 using Traits = Imp::DifferentiableFunctionTraits; │ │ │ │ │ -91 │ │ │ │ │ -92 using _B_a_s_e = _T_y_p_e_E_r_a_s_u_r_e_B_a_s_e_<_t_y_p_e_n_a_m_e_ _T_r_a_i_t_s_:_:_C_o_n_c_e_p_t_,_ _T_r_a_i_t_s_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ -_M_o_d_e_l_>; │ │ │ │ │ -93 │ │ │ │ │ -94 using DerivativeInterface = typename _T_r_a_i_t_s_:_:_D_e_r_i_v_a_t_i_v_e_I_n_t_e_r_f_a_c_e; │ │ │ │ │ -95 │ │ │ │ │ -96public: │ │ │ │ │ -97 │ │ │ │ │ -109 template = 0 > │ │ │ │ │ -_1_1_0 _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n(F&& f) : │ │ │ │ │ -111 _B_a_s_e(std::forward(f)) │ │ │ │ │ -112 { │ │ │ │ │ -113 static_assert(Dune::Functions::Concept::isFunction(), │ │ │ │ │ -"Trying to construct a DifferentiableFunction from type that does not model the │ │ │ │ │ -Function concept"); │ │ │ │ │ -114 } │ │ │ │ │ -115 │ │ │ │ │ -_1_1_7 _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n() = default; │ │ │ │ │ +68template │ │ │ │ │ +_6_9class _F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ +70{ │ │ │ │ │ +71public: │ │ │ │ │ +_7_2 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ +_7_3 using _E_n_t_i_t_y_S_e_t = _G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_G_r_i_d_V_i_e_w_,_ _0_>; │ │ │ │ │ +_7_4 using _E_l_e_m_e_n_t = typename _E_n_t_i_t_y_S_e_t_:_:_E_l_e_m_e_n_t; │ │ │ │ │ +75 │ │ │ │ │ +_7_6 using _L_o_c_a_l_D_o_m_a_i_n = typename _E_n_t_i_t_y_S_e_t_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ +_7_7 using _D_o_m_a_i_n = typename _E_n_t_i_t_y_S_e_t_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ +_7_8 using _R_a_n_g_e = typename _E_n_t_i_t_y_S_e_t_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ +79 │ │ │ │ │ +80private: │ │ │ │ │ +81 │ │ │ │ │ +82 using Traits = Imp::GridFunctionTraits<_R_a_n_g_e(_D_o_m_a_i_n), _E_n_t_i_t_y_S_e_t, │ │ │ │ │ +_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s, 16>; │ │ │ │ │ +83 │ │ │ │ │ +84 class LocalFunction │ │ │ │ │ +85 { │ │ │ │ │ +86 using Geometry = typename Element::Geometry; │ │ │ │ │ +87 static const int dimension = GV::dimension; │ │ │ │ │ +88 public: │ │ │ │ │ +89 │ │ │ │ │ +101 void bind(const _E_l_e_m_e_n_t& element) │ │ │ │ │ +102 { │ │ │ │ │ +103 element_ = element; │ │ │ │ │ +104 geometry_.emplace(element_.geometry()); │ │ │ │ │ +105 } │ │ │ │ │ +106 │ │ │ │ │ +107 void unbind() │ │ │ │ │ +108 { │ │ │ │ │ +109 geometry_.reset(); │ │ │ │ │ +110 } │ │ │ │ │ +111 │ │ │ │ │ +114 bool bound() const │ │ │ │ │ +115 { │ │ │ │ │ +116 return static_cast(geometry_); │ │ │ │ │ +117 } │ │ │ │ │ 118 │ │ │ │ │ -_1_2_2 Range operator() (const Domain& x) const │ │ │ │ │ -123 { │ │ │ │ │ -124 return this->asInterface().operator()(x); │ │ │ │ │ -125 } │ │ │ │ │ -126 │ │ │ │ │ -_1_3_4 friend DerivativeInterface _d_e_r_i_v_a_t_i_v_e(const _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n& t) │ │ │ │ │ -135 { │ │ │ │ │ -136 return t.asInterface().derivative(); │ │ │ │ │ -137 } │ │ │ │ │ -138}; │ │ │ │ │ -139 │ │ │ │ │ -140 │ │ │ │ │ -141 │ │ │ │ │ -142}} // namespace Dune::Functions │ │ │ │ │ -143 │ │ │ │ │ -144 │ │ │ │ │ -145 │ │ │ │ │ -146#endif // DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_HH │ │ │ │ │ -_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ -_t_y_p_e_e_r_a_s_u_r_e_._h_h │ │ │ │ │ -_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h │ │ │ │ │ -_s_i_g_n_a_t_u_r_e_._h_h │ │ │ │ │ -_t_y_p_e___t_r_a_i_t_s_._h_h │ │ │ │ │ -_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n___i_m_p_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ -_b_u_f_f_e_r_S_i_z_e_ _>_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ -friend DerivativeInterface derivative(const DifferentiableFunction &t) │ │ │ │ │ -Get derivative of wrapped function. │ │ │ │ │ -DDeeffiinniittiioonn differentiablefunction.hh:134 │ │ │ │ │ +128 _R_a_n_g_e operator()(const _L_o_c_a_l_D_o_m_a_i_n& x) const │ │ │ │ │ +129 { │ │ │ │ │ +130 auto&& re = Dune::referenceElement(*geometry_); │ │ │ │ │ +131 // Compute reference normal of closest face to given point │ │ │ │ │ +132 auto face = Impl::closestFaceIndex(re, x); │ │ │ │ │ +133 auto localNormal = re.integrationOuterNormal(face); │ │ │ │ │ +134 │ │ │ │ │ +135 // Transform reference normal into global unit outer normal using │ │ │ │ │ +136 // covariant Piola transformation │ │ │ │ │ +137 auto normal = _R_a_n_g_e{}; │ │ │ │ │ +138 geometry_->jacobianInverseTransposed(x).mv(localNormal, normal); │ │ │ │ │ +139 normal /= normal.two_norm(); │ │ │ │ │ +140 return normal; │ │ │ │ │ +141 } │ │ │ │ │ +142 │ │ │ │ │ +144 const _E_l_e_m_e_n_t& localContext() const │ │ │ │ │ +145 { │ │ │ │ │ +146 return element_; │ │ │ │ │ +147 } │ │ │ │ │ +148 │ │ │ │ │ +150 friend typename _T_r_a_i_t_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_T_r_a_i_t_s_:_:_D_e_r_i_v_a_t_i_v_e_I_n_t_e_r_f_a_c_e _d_e_r_i_v_a_t_i_v_e │ │ │ │ │ +(const LocalFunction& t) │ │ │ │ │ +151 { │ │ │ │ │ +152 DUNE_THROW(NotImplemented,"not implemented"); │ │ │ │ │ +153 } │ │ │ │ │ +154 │ │ │ │ │ +155 private: │ │ │ │ │ +156 std::optional geometry_; │ │ │ │ │ +157 _E_l_e_m_e_n_t element_; │ │ │ │ │ +158 }; │ │ │ │ │ +159 │ │ │ │ │ +160public: │ │ │ │ │ +_1_6_2 _F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n(const _G_r_i_d_V_i_e_w& gridView) : │ │ │ │ │ +163 entitySet_(gridView) │ │ │ │ │ +164 {} │ │ │ │ │ +165 │ │ │ │ │ +_1_6_7 _R_a_n_g_e _o_p_e_r_a_t_o_r_(_)(const _D_o_m_a_i_n& x) const │ │ │ │ │ +168 { │ │ │ │ │ +169 DUNE_THROW(NotImplemented,"not implemented"); │ │ │ │ │ +170 } │ │ │ │ │ +171 │ │ │ │ │ +_1_7_3 friend typename _T_r_a_i_t_s_:_:_D_e_r_i_v_a_t_i_v_e_I_n_t_e_r_f_a_c_e _d_e_r_i_v_a_t_i_v_e(const │ │ │ │ │ +_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n& t) │ │ │ │ │ +174 { │ │ │ │ │ +175 DUNE_THROW(NotImplemented,"not implemented"); │ │ │ │ │ +176 } │ │ │ │ │ +177 │ │ │ │ │ +_1_7_9 friend LocalFunction _l_o_c_a_l_F_u_n_c_t_i_o_n(const _F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n& t) │ │ │ │ │ +180 { │ │ │ │ │ +181 return LocalFunction{}; │ │ │ │ │ +182 } │ │ │ │ │ +183 │ │ │ │ │ +_1_8_5 const _E_n_t_i_t_y_S_e_t& _e_n_t_i_t_y_S_e_t() const │ │ │ │ │ +186 { │ │ │ │ │ +187 return entitySet_; │ │ │ │ │ +188 } │ │ │ │ │ +189 │ │ │ │ │ +190private: │ │ │ │ │ +191 _E_n_t_i_t_y_S_e_t entitySet_; │ │ │ │ │ +192}; │ │ │ │ │ +193 │ │ │ │ │ +194 │ │ │ │ │ +195 │ │ │ │ │ +196} // namespace Dune::Functions │ │ │ │ │ +197 │ │ │ │ │ +198#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_FACENORMALGRIDFUNCTION_HH │ │ │ │ │ +_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h │ │ │ │ │ +_g_r_i_d_f_u_n_c_t_i_o_n_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ +TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const │ │ │ │ │ +TrigonometricFunction< K, sinFactor, cosFactor > &f) │ │ │ │ │ +Obtain derivative of TrigonometricFunction function. │ │ │ │ │ +DDeeffiinniittiioonn trigonometricfunction.hh:43 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn differentiablefunction.hh:33 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ -_b_u_f_f_e_r_S_i_z_e_ _>_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n │ │ │ │ │ -DifferentiableFunction(F &&f) │ │ │ │ │ -Construct from function. │ │ │ │ │ -DDeeffiinniittiioonn differentiablefunction.hh:110 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ -_b_u_f_f_e_r_S_i_z_e_ _>_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n │ │ │ │ │ -DifferentiableFunction()=default │ │ │ │ │ -Default constructor. │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_r_a_i_t_s │ │ │ │ │ -Helper class to deduce the signature of a callable. │ │ │ │ │ -DDeeffiinniittiioonn signature.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_y_p_e_E_r_a_s_u_r_e_B_a_s_e │ │ │ │ │ -Base class for type-erased interface wrapper. │ │ │ │ │ -DDeeffiinniittiioonn typeerasure.hh:169 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │ +DDeeffiinniittiioonn polynomial.hh:18 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ +Default implementation for derivative traits. │ │ │ │ │ +DDeeffiinniittiioonn defaultderivativetraits.hh:41 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ +Grid function implementing the piecewise element face normal. │ │ │ │ │ +DDeeffiinniittiioonn facenormalgridfunction.hh:70 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n_:_:_E_n_t_i_t_y_S_e_t │ │ │ │ │ +GridViewEntitySet< GridView, 0 > EntitySet │ │ │ │ │ +DDeeffiinniittiioonn facenormalgridfunction.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n_:_:_L_o_c_a_l_D_o_m_a_i_n │ │ │ │ │ +typename EntitySet::LocalCoordinate LocalDomain │ │ │ │ │ +DDeeffiinniittiioonn facenormalgridfunction.hh:76 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n_:_:_D_o_m_a_i_n │ │ │ │ │ +typename EntitySet::GlobalCoordinate Domain │ │ │ │ │ +DDeeffiinniittiioonn facenormalgridfunction.hh:77 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n_:_:_R_a_n_g_e │ │ │ │ │ +typename EntitySet::GlobalCoordinate Range │ │ │ │ │ +DDeeffiinniittiioonn facenormalgridfunction.hh:78 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n_:_:_e_n_t_i_t_y_S_e_t │ │ │ │ │ +const EntitySet & entitySet() const │ │ │ │ │ +Return the stored GridViewEntitySet. │ │ │ │ │ +DDeeffiinniittiioonn facenormalgridfunction.hh:185 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ +friend Traits::DerivativeInterface derivative(const FaceNormalGridFunction &t) │ │ │ │ │ +Not implemented. │ │ │ │ │ +DDeeffiinniittiioonn facenormalgridfunction.hh:173 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ +GV GridView │ │ │ │ │ +DDeeffiinniittiioonn facenormalgridfunction.hh:72 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n_:_:_l_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ +friend LocalFunction localFunction(const FaceNormalGridFunction &t) │ │ │ │ │ +Return a local-function associated to FaceNormalGridFunction. │ │ │ │ │ +DDeeffiinniittiioonn facenormalgridfunction.hh:179 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ +FaceNormalGridFunction(const GridView &gridView) │ │ │ │ │ +Construct the FaceNormalGridFunction. │ │ │ │ │ +DDeeffiinniittiioonn facenormalgridfunction.hh:162 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n_:_:_E_l_e_m_e_n_t │ │ │ │ │ +typename EntitySet::Element Element │ │ │ │ │ +DDeeffiinniittiioonn facenormalgridfunction.hh:74 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_a_c_e_N_o_r_m_a_l_G_r_i_d_F_u_n_c_t_i_o_n_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +Range operator()(const Domain &x) const │ │ │ │ │ +Not implemented. │ │ │ │ │ +DDeeffiinniittiioonn facenormalgridfunction.hh:167 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn gridfunction.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_ _G_r_i_d_V_i_e_w_,_ _0_ _> │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_ _G_r_i_d_V_i_e_w_,_ _0_ _>_:_:_E_l_e_m_e_n_t │ │ │ │ │ +GridView::template Codim< codim >::Entity Element │ │ │ │ │ +Type of Elements contained in this EntitySet. │ │ │ │ │ +DDeeffiinniittiioonn gridviewentityset.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_ _G_r_i_d_V_i_e_w_,_ _0_ _>_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +Element::Geometry::LocalCoordinate LocalCoordinate │ │ │ │ │ +Type of local coordinates with respect to the Element. │ │ │ │ │ +DDeeffiinniittiioonn gridviewentityset.hh:39 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_ _G_r_i_d_V_i_e_w_,_ _0_ _>_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +Element::Geometry::GlobalCoordinate GlobalCoordinate │ │ │ │ │ +DDeeffiinniittiioonn gridviewentityset.hh:40 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00065.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: overflowarray.hh File Reference │ │ │ │ +dune-functions: gridviewfunction.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,45 +65,58 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
overflowarray.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
gridviewfunction.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <algorithm>
│ │ │ │ -#include <iostream>
│ │ │ │ -#include <cstddef>
│ │ │ │ -#include <array>
│ │ │ │ -#include <initializer_list>
│ │ │ │ -#include <dune/common/genericiterator.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.

│ │ │ │

│ │ │ │ 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::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 , std::enable_if_t< models< Imp::HasFreeLocalFunction, F >(), int > = 0>
std::decay_t< F > Dune::Functions::makeGridViewFunction (F &&f, const GridView &gridView)
 Construct a function modeling GridViewFunction from function and grid view.
 
template<class F , class GridView , std::enable_if_t< not(models< Imp::HasFreeLocalFunction, F >()), int > = 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.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,27 +1,46 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -overflowarray.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +gridviewfunction.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_a_n_a_l_y_t_i_c_g_r_i_d_v_i_e_w_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_<_ _B_A_,_ _m_a_x_S_i_z_e_ _> │ │ │ │ │ -  A dynamically sized array-like class with overflow. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _S_i_g_n_a_t_u_r_e_,_ _G_r_i_d_V_i_e_w_, │ │ │ │ │ + _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _b_u_f_f_e_r_S_i_z_e_ _> │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ + _b_u_f_f_e_r_S_i_z_e_ _> │ │ │ │ │ +  Wrapper class for functions defined on a GridView. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template(), int > = 0> │ │ │ │ │ +std::decay_t< F >  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n (F &&f, const GridView │ │ │ │ │ + &gridView) │ │ │ │ │ +  Construct a function modeling _G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n from function │ │ │ │ │ + and grid view. │ │ │ │ │ +  │ │ │ │ │ +template()), int > = 0> │ │ │ │ │ + auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n (F &&f, const GridView │ │ │ │ │ + &gridView) -> decltype(_m_a_k_e_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n(std:: │ │ │ │ │ + forward< F >(f), gridView)) │ │ │ │ │ +  Construct a function modeling _G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n from function │ │ │ │ │ + and grid view. │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00065_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: overflowarray.hh Source File │ │ │ │ +dune-functions: gridviewfunction.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,286 +70,107 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
overflowarray.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_COMMON_OVERFLOWARRAY_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_COMMON_OVERFLOWARRAY_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWFUNCTION_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWFUNCTION_HH
│ │ │ │
9
│ │ │ │ -
10#include <algorithm>
│ │ │ │ -
11#include <iostream>
│ │ │ │ -
12#include <cstddef>
│ │ │ │ -
13#include <array>
│ │ │ │ -
14#include <initializer_list>
│ │ │ │ -
15
│ │ │ │ -
16#include <dune/common/genericiterator.hh>
│ │ │ │ +
10#include <memory>
│ │ │ │ +
11
│ │ │ │ +
12#include <dune/common/concept.hh>
│ │ │ │ +
13
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
17
│ │ │ │
18
│ │ │ │ -
19
│ │ │ │ -
20namespace Dune::Functions {
│ │ │ │ +
19namespace Dune {
│ │ │ │ +
20namespace Functions {
│ │ │ │
21
│ │ │ │
22
│ │ │ │ -
46template<class BA, std::size_t maxSize = std::tuple_size_v<BA>>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
48 public BA
│ │ │ │ -
49{
│ │ │ │ -
50 static constexpr std::size_t baseSize = std::tuple_size_v<BA>;
│ │ │ │ +
23
│ │ │ │ +
24template<class Signature, class GridView, template<class> class DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
26{};
│ │ │ │ +
│ │ │ │ +
27
│ │ │ │ +
28
│ │ │ │ +
29
│ │ │ │ +
44template<class Range, class Domain, class GV, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ +
│ │ │ │ +
45class GridViewFunction<Range(Domain), GV, DerivativeTraits, bufferSize> :
│ │ │ │ +
46 public GridFunction<Range(Domain), GridViewEntitySet<GV, 0>, DerivativeTraits, bufferSize>
│ │ │ │ +
47{
│ │ │ │ +
48 using Base = GridFunction<Range(Domain), GridViewEntitySet<GV, 0>, DerivativeTraits, bufferSize>;
│ │ │ │ +
49public:
│ │ │ │ +
50 using GridView = GV;
│ │ │ │
51
│ │ │ │ -
52public:
│ │ │ │ -
53 using BaseArray = BA;
│ │ │ │ +
52 using Base::Base;
│ │ │ │ +
53};
│ │ │ │ +
│ │ │ │
54
│ │ │ │ -
55 using value_type = typename BaseArray::value_type;
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
59 using difference_type = std::ptrdiff_t;
│ │ │ │ -
60 using size_type = std::size_t;
│ │ │ │ -
61 using iterator = Dune::GenericIterator<OverflowArray, value_type>;
│ │ │ │ -
62 using const_iterator = Dune::GenericIterator<const OverflowArray, const value_type>;
│ │ │ │ -
63
│ │ │ │ -
64private:
│ │ │ │ -
65 using OverflowBuffer = std::array<value_type, maxSize-baseSize>;
│ │ │ │ -
66
│ │ │ │ -
67public:
│ │ │ │ -
68
│ │ │ │ -
69 OverflowArray() = default;
│ │ │ │ -
70
│ │ │ │ -
│ │ │ │ -
71 OverflowArray(const std::initializer_list<value_type>& l) {
│ │ │ │ -
72 assert(l.size() <= capacity());
│ │ │ │ -
73 size_ = l.size();
│ │ │ │ -
74 std::copy_n(l.begin(), size_, begin());
│ │ │ │ -
75 }
│ │ │ │ +
55
│ │ │ │ +
56
│ │ │ │ +
68template<class F, class GridView,
│ │ │ │ +
69 std::enable_if_t<
│ │ │ │ +
70 models< Imp::HasFreeLocalFunction, F>() , int> = 0>
│ │ │ │ +
71std::decay_t<F>
│ │ │ │ +
│ │ │ │ +
72 makeGridViewFunction(F&& f, const GridView& gridView)
│ │ │ │ +
73{
│ │ │ │ +
74 return std::forward<F>(f);
│ │ │ │ +
75}
│ │ │ │
│ │ │ │
76
│ │ │ │ -
│ │ │ │ -
77 bool operator == (const OverflowArray& other) const {
│ │ │ │ -
78 if (size() != other.size())
│ │ │ │ -
79 return false;
│ │ │ │ -
80 for (size_type i=0; i<size(); ++i)
│ │ │ │ -
81 if ((*this)[i] != other[i])
│ │ │ │ -
82 return false;
│ │ │ │ -
83 return true;
│ │ │ │ -
84 }
│ │ │ │ -
│ │ │ │ -
85
│ │ │ │ -
│ │ │ │ -
87 void clear() {
│ │ │ │ -
88 size_ = 0;
│ │ │ │ -
89 }
│ │ │ │ -
│ │ │ │ -
90
│ │ │ │ +
77
│ │ │ │ +
78
│ │ │ │ +
94template<class F, class GridView,
│ │ │ │ +
95 std::enable_if_t<
│ │ │ │ +
96 not(models< Imp::HasFreeLocalFunction, F>()) , int> = 0>
│ │ │ │
│ │ │ │ -
97 void resize(size_type n) {
│ │ │ │ -
98 assert(n <= capacity());
│ │ │ │ -
99 size_ = n;
│ │ │ │ -
100 }
│ │ │ │ -
│ │ │ │ -
101
│ │ │ │ -
│ │ │ │ -
108 void push_back(const value_type& t) {
│ │ │ │ -
109 assert(size() < capacity());
│ │ │ │ -
110 (*this)[size_++] = t;
│ │ │ │ -
111 }
│ │ │ │ -
│ │ │ │ -
112
│ │ │ │ -
│ │ │ │ -
114 void pop_back() {
│ │ │ │ -
115 assert(size() > 0);
│ │ │ │ -
116 if (! empty())
│ │ │ │ -
117 size_--;
│ │ │ │ -
118 }
│ │ │ │ -
│ │ │ │ -
119
│ │ │ │ -
│ │ │ │ -
126 void push_front(const value_type& t) {
│ │ │ │ -
127 assert(size() < capacity());
│ │ │ │ -
128 for (size_type i=0; i<size(); i++)
│ │ │ │ -
129 (*this)[i+1] = (*this)[i];
│ │ │ │ -
130 (*this)[0] = t;
│ │ │ │ -
131 }
│ │ │ │ -
│ │ │ │ -
132
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
135 return iterator(*this, 0);
│ │ │ │ -
136 }
│ │ │ │ -
│ │ │ │ -
137
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
140 return const_iterator(*this, 0);
│ │ │ │ -
141 }
│ │ │ │ -
│ │ │ │ -
142
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
145 return iterator(*this, size());
│ │ │ │ -
146 }
│ │ │ │ -
│ │ │ │ -
147
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
150 return const_iterator(*this, size());
│ │ │ │ -
151 }
│ │ │ │ -
│ │ │ │ -
152
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
155 assert(i < size());
│ │ │ │ -
156 // If there's no padding between the base class and the overflow_ member,
│ │ │ │ -
157 // the compiler should be able to optimize this to
│ │ │ │ -
158 // return *(&BaseArray::operator[](0) + i);
│ │ │ │ -
159 if (i<baseSize)
│ │ │ │ -
160 return BaseArray::operator[](i);
│ │ │ │ -
161 return overflow_[i-baseSize];
│ │ │ │ -
162 }
│ │ │ │ -
│ │ │ │ -
163
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
166 assert(i < size());
│ │ │ │ -
167 // If there's no padding between the base class and the overflow_ member,
│ │ │ │ -
168 // the compiler should be able to optimize this to
│ │ │ │ -
169 // return *(&BaseArray::operator[](0) + i);
│ │ │ │ -
170 if (i<baseSize)
│ │ │ │ -
171 return BaseArray::operator[](i);
│ │ │ │ -
172 return overflow_[i-baseSize];
│ │ │ │ -
173 }
│ │ │ │ -
│ │ │ │ -
174
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
177 assert(size() > 0);
│ │ │ │ -
178 return (*this)[0];
│ │ │ │ -
179 }
│ │ │ │ -
│ │ │ │ -
180
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
183 assert(size() > 0);
│ │ │ │ -
184 return (*this)[0];
│ │ │ │ -
185 }
│ │ │ │ -
│ │ │ │ -
186
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
189 assert(size() > 0);
│ │ │ │ -
190 return (*this)[size()-1];
│ │ │ │ -
191 }
│ │ │ │ -
│ │ │ │ -
192
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
195 assert(size() > 0);
│ │ │ │ -
196 return (*this)[size()-1];
│ │ │ │ -
197 }
│ │ │ │ -
│ │ │ │ -
198
│ │ │ │ -
│ │ │ │ -
200 size_type size () const {
│ │ │ │ -
201 return size_;
│ │ │ │ -
202 }
│ │ │ │ -
│ │ │ │ -
203
│ │ │ │ -
│ │ │ │ -
205 bool empty() const {
│ │ │ │ -
206 return size() == 0;
│ │ │ │ -
207 }
│ │ │ │ -
│ │ │ │ -
208
│ │ │ │ -
│ │ │ │ -
210 static constexpr size_type capacity() {
│ │ │ │ -
211 return maxSize;
│ │ │ │ -
212 }
│ │ │ │ -
│ │ │ │ -
213
│ │ │ │ -
│ │ │ │ -
215 static constexpr size_type max_size() {
│ │ │ │ -
216 return maxSize;
│ │ │ │ -
217 }
│ │ │ │ -
│ │ │ │ -
218
│ │ │ │ -
│ │ │ │ -
220 inline friend std::size_t hash_value(const OverflowArray& v) noexcept {
│ │ │ │ -
221 return hash_range(v.begin(), v.end());
│ │ │ │ -
222 }
│ │ │ │ -
│ │ │ │ -
223
│ │ │ │ -
│ │ │ │ -
225 friend std::ostream& operator<< (std::ostream& s, const OverflowArray& c) {
│ │ │ │ -
226 for (const auto& ci : c)
│ │ │ │ -
227 s << ci << " ";
│ │ │ │ -
228 return s;
│ │ │ │ -
229 }
│ │ │ │ -
│ │ │ │ -
230
│ │ │ │ -
231private:
│ │ │ │ -
232 OverflowBuffer overflow_;
│ │ │ │ -
233 size_type size_ = 0;
│ │ │ │ -
234};
│ │ │ │ -
│ │ │ │ -
235
│ │ │ │ -
236
│ │ │ │ -
237
│ │ │ │ -
238} // namespace Dune::Functions
│ │ │ │ -
239
│ │ │ │ -
240
│ │ │ │ -
241
│ │ │ │ -
242#endif // DUNE_FUNCTIONS_COMMON_OVERFLOWARRAY_HH
│ │ │ │ -
Definition polynomial.hh:18
│ │ │ │ -
A dynamically sized array-like class with overflow.
Definition overflowarray.hh:49
│ │ │ │ -
const value_type & const_reference
Definition overflowarray.hh:57
│ │ │ │ -
value_type & reference
Definition overflowarray.hh:56
│ │ │ │ -
const_iterator end() const
Returns a const_iterator pointing to the end of the OverflowArray.
Definition overflowarray.hh:149
│ │ │ │ -
bool operator==(const OverflowArray &other) const
Definition overflowarray.hh:77
│ │ │ │ -
friend std::size_t hash_value(const OverflowArray &v) noexcept
Compute hash value.
Definition overflowarray.hh:220
│ │ │ │ -
void push_back(const value_type &t)
Appends an element to the end of the OverflowArray,.
Definition overflowarray.hh:108
│ │ │ │ -
friend std::ostream & operator<<(std::ostream &s, const OverflowArray &c)
Write container to an output stream.
Definition overflowarray.hh:225
│ │ │ │ -
iterator begin()
Returns a iterator pointing to the beginning of the OverflowArray.
Definition overflowarray.hh:134
│ │ │ │ -
bool empty() const
Returns true if OverflowArray has no elements.
Definition overflowarray.hh:205
│ │ │ │ -
size_type size() const
Returns number of elements in the OverflowArray.
Definition overflowarray.hh:200
│ │ │ │ -
typename BaseArray::value_type value_type
Definition overflowarray.hh:55
│ │ │ │ -
void pop_back()
Erases the last element of the OverflowArray, O(1) time.
Definition overflowarray.hh:114
│ │ │ │ -
Dune::GenericIterator< OverflowArray, value_type > iterator
Definition overflowarray.hh:61
│ │ │ │ -
const_iterator begin() const
Returns a const_iterator pointing to the beginning of the OverflowArray.
Definition overflowarray.hh:139
│ │ │ │ -
std::ptrdiff_t difference_type
Definition overflowarray.hh:59
│ │ │ │ - │ │ │ │ -
BA BaseArray
Definition overflowarray.hh:53
│ │ │ │ -
static constexpr size_type capacity()
Returns the capacity of the OverflowArray.
Definition overflowarray.hh:210
│ │ │ │ -
static constexpr size_type max_size()
Returns the maximum length of the OverflowArray.
Definition overflowarray.hh:215
│ │ │ │ -
const_reference front() const
Returns const reference to first element of OverflowArray.
Definition overflowarray.hh:182
│ │ │ │ -
void clear()
Erases all elements.
Definition overflowarray.hh:87
│ │ │ │ -
iterator end()
Returns an iterator pointing to the end of the OverflowArray.
Definition overflowarray.hh:144
│ │ │ │ -
std::size_t size_type
Definition overflowarray.hh:60
│ │ │ │ -
void resize(size_type n)
Specifies a new size for the OverflowArray.
Definition overflowarray.hh:97
│ │ │ │ -
value_type * pointer
Definition overflowarray.hh:58
│ │ │ │ -
Dune::GenericIterator< const OverflowArray, const value_type > const_iterator
Definition overflowarray.hh:62
│ │ │ │ -
const_reference back() const
Returns const reference to last element of OverflowArray.
Definition overflowarray.hh:194
│ │ │ │ -
OverflowArray(const std::initializer_list< value_type > &l)
Definition overflowarray.hh:71
│ │ │ │ -
reference back()
Returns reference to last element of OverflowArray.
Definition overflowarray.hh:188
│ │ │ │ -
void push_front(const value_type &t)
Inserts an element to the begin of the OverflowArray,.
Definition overflowarray.hh:126
│ │ │ │ -
reference front()
Returns reference to first element of OverflowArray.
Definition overflowarray.hh:176
│ │ │ │ -
reference operator[](size_type i)
Returns reference to the i'th element.
Definition overflowarray.hh:154
│ │ │ │ +
97auto makeGridViewFunction(F&& f, const GridView& gridView)
│ │ │ │ +
98 -> decltype(makeAnalyticGridViewFunction(std::forward<F>(f), gridView))
│ │ │ │ +
99{
│ │ │ │ +
100 return makeAnalyticGridViewFunction(std::forward<F>(f), gridView);
│ │ │ │ +
101}
│ │ │ │ +
│ │ │ │ +
102
│ │ │ │ +
103
│ │ │ │ +
104
│ │ │ │ +
105} // end of namespace Dune::Functions
│ │ │ │ +
106} // end of namespace Dune
│ │ │ │ +
107
│ │ │ │ +
108#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWFUNCTION_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
auto makeAnalyticGridViewFunction(F &&f, const GridView &gridView)
Create an AnalyticGridViewFunction from a function and a grid view.
Definition analyticgridviewfunction.hh:238
│ │ │ │ +
Definition polynomial.hh:17
│ │ │ │ +
std::decay_t< F > makeGridViewFunction(F &&f, const GridView &gridView)
Construct a function modeling GridViewFunction from function and grid view.
Definition gridviewfunction.hh:72
│ │ │ │ +
Definition gridfunction.hh:36
│ │ │ │ +
An entity set for all entities of given codim in a grid view.
Definition gridviewentityset.hh:27
│ │ │ │ +
Definition gridviewfunction.hh:26
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,317 +1,109 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _c_o_m_m_o_n │ │ │ │ │ -overflowarray.hh │ │ │ │ │ + * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ +gridviewfunction.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_COMMON_OVERFLOWARRAY_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_COMMON_OVERFLOWARRAY_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWFUNCTION_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWFUNCTION_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15 │ │ │ │ │ -16#include │ │ │ │ │ +10#include │ │ │ │ │ +11 │ │ │ │ │ +12#include │ │ │ │ │ +13 │ │ │ │ │ +14#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ +15#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h> │ │ │ │ │ +16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_a_n_a_l_y_t_i_c_g_r_i_d_v_i_e_w_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ 17 │ │ │ │ │ 18 │ │ │ │ │ -19 │ │ │ │ │ -20namespace _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s { │ │ │ │ │ +19namespace _D_u_n_e { │ │ │ │ │ +20namespace Functions { │ │ │ │ │ 21 │ │ │ │ │ 22 │ │ │ │ │ -46template> │ │ │ │ │ -_4_7class _O_v_e_r_f_l_o_w_A_r_r_a_y : │ │ │ │ │ -48 public BA │ │ │ │ │ -49{ │ │ │ │ │ -50 static constexpr std::size_t baseSize = std::tuple_size_v; │ │ │ │ │ +23 │ │ │ │ │ +24template class │ │ │ │ │ +DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56> │ │ │ │ │ +_2_5class _G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ +26{}; │ │ │ │ │ +27 │ │ │ │ │ +28 │ │ │ │ │ +29 │ │ │ │ │ +44template class │ │ │ │ │ +DerivativeTraits, size_t bufferSize> │ │ │ │ │ +_4_5class _G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n : │ │ │ │ │ +46 public _G_r_i_d_F_u_n_c_t_i_o_n, │ │ │ │ │ +DerivativeTraits, bufferSize> │ │ │ │ │ +47{ │ │ │ │ │ +48 using _B_a_s_e = _G_r_i_d_F_u_n_c_t_i_o_n, │ │ │ │ │ +DerivativeTraits, bufferSize>; │ │ │ │ │ +49public: │ │ │ │ │ +_5_0 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ 51 │ │ │ │ │ -52public: │ │ │ │ │ -_5_3 using _B_a_s_e_A_r_r_a_y = BA; │ │ │ │ │ +52 using Base::Base; │ │ │ │ │ +53}; │ │ │ │ │ 54 │ │ │ │ │ -_5_5 using _v_a_l_u_e___t_y_p_e = typename BaseArray::value_type; │ │ │ │ │ -_5_6 using _r_e_f_e_r_e_n_c_e = _v_a_l_u_e___t_y_p_e&; │ │ │ │ │ -_5_7 using _c_o_n_s_t___r_e_f_e_r_e_n_c_e = const _v_a_l_u_e___t_y_p_e&; │ │ │ │ │ -_5_8 using _p_o_i_n_t_e_r = _v_a_l_u_e___t_y_p_e*; │ │ │ │ │ -_5_9 using _d_i_f_f_e_r_e_n_c_e___t_y_p_e = std::ptrdiff_t; │ │ │ │ │ -_6_0 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ -_6_1 using _i_t_e_r_a_t_o_r = Dune::GenericIterator; │ │ │ │ │ -_6_2 using _c_o_n_s_t___i_t_e_r_a_t_o_r = Dune::GenericIterator; │ │ │ │ │ -63 │ │ │ │ │ -64private: │ │ │ │ │ -65 using OverflowBuffer = std::array<_v_a_l_u_e___t_y_p_e, maxSize-baseSize>; │ │ │ │ │ -66 │ │ │ │ │ -67public: │ │ │ │ │ -68 │ │ │ │ │ -_6_9 _O_v_e_r_f_l_o_w_A_r_r_a_y() = default; │ │ │ │ │ -70 │ │ │ │ │ -_7_1 _O_v_e_r_f_l_o_w_A_r_r_a_y(const std::initializer_list& l) { │ │ │ │ │ -72 assert(l.size() <= _c_a_p_a_c_i_t_y()); │ │ │ │ │ -73 size_ = l.size(); │ │ │ │ │ -74 std::copy_n(l.begin(), size_, _b_e_g_i_n()); │ │ │ │ │ -75 } │ │ │ │ │ +55 │ │ │ │ │ +56 │ │ │ │ │ +68template() , int> = 0> │ │ │ │ │ +71std::decay_t │ │ │ │ │ +_7_2 _m_a_k_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n(F&& f, const GridView& gridView) │ │ │ │ │ +73{ │ │ │ │ │ +74 return std::forward(f); │ │ │ │ │ +75} │ │ │ │ │ 76 │ │ │ │ │ -_7_7 bool _o_p_e_r_a_t_o_r_ _=_=_ (const _O_v_e_r_f_l_o_w_A_r_r_a_y& other) const { │ │ │ │ │ -78 if (_s_i_z_e() != other._s_i_z_e()) │ │ │ │ │ -79 return false; │ │ │ │ │ -80 for (_s_i_z_e___t_y_p_e i=0; i<_s_i_z_e(); ++i) │ │ │ │ │ -81 if ((*this)[i] != other[i]) │ │ │ │ │ -82 return false; │ │ │ │ │ -83 return true; │ │ │ │ │ -84 } │ │ │ │ │ -85 │ │ │ │ │ -_8_7 void _c_l_e_a_r() { │ │ │ │ │ -88 size_ = 0; │ │ │ │ │ -89 } │ │ │ │ │ -90 │ │ │ │ │ -_9_7 void _r_e_s_i_z_e(_s_i_z_e___t_y_p_e n) { │ │ │ │ │ -98 assert(n <= _c_a_p_a_c_i_t_y()); │ │ │ │ │ -99 size_ = n; │ │ │ │ │ -100 } │ │ │ │ │ -101 │ │ │ │ │ -_1_0_8 void _p_u_s_h___b_a_c_k(const _v_a_l_u_e___t_y_p_e& t) { │ │ │ │ │ -109 assert(_s_i_z_e() < _c_a_p_a_c_i_t_y()); │ │ │ │ │ -110 (*this)[size_++] = t; │ │ │ │ │ -111 } │ │ │ │ │ -112 │ │ │ │ │ -_1_1_4 void _p_o_p___b_a_c_k() { │ │ │ │ │ -115 assert(_s_i_z_e() > 0); │ │ │ │ │ -116 if (! _e_m_p_t_y()) │ │ │ │ │ -117 size_--; │ │ │ │ │ -118 } │ │ │ │ │ -119 │ │ │ │ │ -_1_2_6 void _p_u_s_h___f_r_o_n_t(const _v_a_l_u_e___t_y_p_e& t) { │ │ │ │ │ -127 assert(_s_i_z_e() < _c_a_p_a_c_i_t_y()); │ │ │ │ │ -128 for (_s_i_z_e___t_y_p_e i=0; i<_s_i_z_e(); i++) │ │ │ │ │ -129 (*this)[i+1] = (*this)[i]; │ │ │ │ │ -130 (*this)[0] = t; │ │ │ │ │ -131 } │ │ │ │ │ -132 │ │ │ │ │ -_1_3_4 _i_t_e_r_a_t_o_r _b_e_g_i_n() { │ │ │ │ │ -135 return _i_t_e_r_a_t_o_r(*this, 0); │ │ │ │ │ -136 } │ │ │ │ │ -137 │ │ │ │ │ -_1_3_9 _c_o_n_s_t___i_t_e_r_a_t_o_r _b_e_g_i_n() const { │ │ │ │ │ -140 return _c_o_n_s_t___i_t_e_r_a_t_o_r(*this, 0); │ │ │ │ │ -141 } │ │ │ │ │ -142 │ │ │ │ │ -_1_4_4 _i_t_e_r_a_t_o_r _e_n_d() { │ │ │ │ │ -145 return _i_t_e_r_a_t_o_r(*this, _s_i_z_e()); │ │ │ │ │ -146 } │ │ │ │ │ -147 │ │ │ │ │ -_1_4_9 _c_o_n_s_t___i_t_e_r_a_t_o_r _e_n_d() const { │ │ │ │ │ -150 return _c_o_n_s_t___i_t_e_r_a_t_o_r(*this, _s_i_z_e()); │ │ │ │ │ -151 } │ │ │ │ │ -152 │ │ │ │ │ -_1_5_4 _r_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_[_]_ (_s_i_z_e___t_y_p_e i) { │ │ │ │ │ -155 assert(i < _s_i_z_e()); │ │ │ │ │ -156 // If there's no padding between the base class and the overflow_ member, │ │ │ │ │ -157 // the compiler should be able to optimize this to │ │ │ │ │ -158 // return *(&BaseArray::operator[](0) + i); │ │ │ │ │ -159 if (i 0); │ │ │ │ │ -178 return (*this)[0]; │ │ │ │ │ -179 } │ │ │ │ │ -180 │ │ │ │ │ -_1_8_2 _c_o_n_s_t___r_e_f_e_r_e_n_c_e _f_r_o_n_t() const { │ │ │ │ │ -183 assert(_s_i_z_e() > 0); │ │ │ │ │ -184 return (*this)[0]; │ │ │ │ │ -185 } │ │ │ │ │ -186 │ │ │ │ │ -_1_8_8 _r_e_f_e_r_e_n_c_e _b_a_c_k() { │ │ │ │ │ -189 assert(_s_i_z_e() > 0); │ │ │ │ │ -190 return (*this)[_s_i_z_e()-1]; │ │ │ │ │ -191 } │ │ │ │ │ -192 │ │ │ │ │ -_1_9_4 _c_o_n_s_t___r_e_f_e_r_e_n_c_e _b_a_c_k() const { │ │ │ │ │ -195 assert(_s_i_z_e() > 0); │ │ │ │ │ -196 return (*this)[_s_i_z_e()-1]; │ │ │ │ │ -197 } │ │ │ │ │ -198 │ │ │ │ │ -_2_0_0 _s_i_z_e___t_y_p_e _s_i_z_e () const { │ │ │ │ │ -201 return size_; │ │ │ │ │ -202 } │ │ │ │ │ -203 │ │ │ │ │ -_2_0_5 bool _e_m_p_t_y() const { │ │ │ │ │ -206 return _s_i_z_e() == 0; │ │ │ │ │ -207 } │ │ │ │ │ -208 │ │ │ │ │ -_2_1_0 static constexpr _s_i_z_e___t_y_p_e _c_a_p_a_c_i_t_y() { │ │ │ │ │ -211 return maxSize; │ │ │ │ │ -212 } │ │ │ │ │ -213 │ │ │ │ │ -_2_1_5 static constexpr _s_i_z_e___t_y_p_e _m_a_x___s_i_z_e() { │ │ │ │ │ -216 return maxSize; │ │ │ │ │ -217 } │ │ │ │ │ -218 │ │ │ │ │ -_2_2_0 inline friend std::size_t _h_a_s_h___v_a_l_u_e(const _O_v_e_r_f_l_o_w_A_r_r_a_y& v) noexcept { │ │ │ │ │ -221 return hash_range(v.begin(), v.end()); │ │ │ │ │ -222 } │ │ │ │ │ -223 │ │ │ │ │ -_2_2_5 friend std::ostream& _o_p_e_r_a_t_o_r_<_<_ (std::ostream& s, const _O_v_e_r_f_l_o_w_A_r_r_a_y& c) { │ │ │ │ │ -226 for (const auto& ci : c) │ │ │ │ │ -227 s << ci << " "; │ │ │ │ │ -228 return s; │ │ │ │ │ -229 } │ │ │ │ │ -230 │ │ │ │ │ -231private: │ │ │ │ │ -232 OverflowBuffer overflow_; │ │ │ │ │ -233 _s_i_z_e___t_y_p_e size_ = 0; │ │ │ │ │ -234}; │ │ │ │ │ -235 │ │ │ │ │ -236 │ │ │ │ │ -237 │ │ │ │ │ -238} // namespace Dune::Functions │ │ │ │ │ -239 │ │ │ │ │ -240 │ │ │ │ │ -241 │ │ │ │ │ -242#endif // DUNE_FUNCTIONS_COMMON_OVERFLOWARRAY_HH │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │ -DDeeffiinniittiioonn polynomial.hh:18 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y │ │ │ │ │ -A dynamically sized array-like class with overflow. │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:49 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ │ -const value_type & const_reference │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:57 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ │ -value_type & reference │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:56 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_e_n_d │ │ │ │ │ -const_iterator end() const │ │ │ │ │ -Returns a const_iterator pointing to the end of the OverflowArray. │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:149 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ -bool operator==(const OverflowArray &other) const │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:77 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_h_a_s_h___v_a_l_u_e │ │ │ │ │ -friend std::size_t hash_value(const OverflowArray &v) noexcept │ │ │ │ │ -Compute hash value. │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:220 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_p_u_s_h___b_a_c_k │ │ │ │ │ -void push_back(const value_type &t) │ │ │ │ │ -Appends an element to the end of the OverflowArray,. │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:108 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ -friend std::ostream & operator<<(std::ostream &s, const OverflowArray &c) │ │ │ │ │ -Write container to an output stream. │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:225 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_b_e_g_i_n │ │ │ │ │ -iterator begin() │ │ │ │ │ -Returns a iterator pointing to the beginning of the OverflowArray. │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:134 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_e_m_p_t_y │ │ │ │ │ -bool empty() const │ │ │ │ │ -Returns true if OverflowArray has no elements. │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:205 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_s_i_z_e │ │ │ │ │ -size_type size() const │ │ │ │ │ -Returns number of elements in the OverflowArray. │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:200 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ -typename BaseArray::value_type value_type │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:55 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_p_o_p___b_a_c_k │ │ │ │ │ -void pop_back() │ │ │ │ │ -Erases the last element of the OverflowArray, O(1) time. │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:114 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ -Dune::GenericIterator< OverflowArray, value_type > iterator │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_b_e_g_i_n │ │ │ │ │ -const_iterator begin() const │ │ │ │ │ -Returns a const_iterator pointing to the beginning of the OverflowArray. │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:139 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_d_i_f_f_e_r_e_n_c_e___t_y_p_e │ │ │ │ │ -std::ptrdiff_t difference_type │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:59 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y │ │ │ │ │ -OverflowArray()=default │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_B_a_s_e_A_r_r_a_y │ │ │ │ │ -BA BaseArray │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:53 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_c_a_p_a_c_i_t_y │ │ │ │ │ -static constexpr size_type capacity() │ │ │ │ │ -Returns the capacity of the OverflowArray. │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:210 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_m_a_x___s_i_z_e │ │ │ │ │ -static constexpr size_type max_size() │ │ │ │ │ -Returns the maximum length of the OverflowArray. │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:215 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_f_r_o_n_t │ │ │ │ │ -const_reference front() const │ │ │ │ │ -Returns const reference to first element of OverflowArray. │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:182 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_c_l_e_a_r │ │ │ │ │ -void clear() │ │ │ │ │ -Erases all elements. │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:87 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_e_n_d │ │ │ │ │ -iterator end() │ │ │ │ │ -Returns an iterator pointing to the end of the OverflowArray. │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:144 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_r_e_s_i_z_e │ │ │ │ │ -void resize(size_type n) │ │ │ │ │ -Specifies a new size for the OverflowArray. │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:97 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_p_o_i_n_t_e_r │ │ │ │ │ -value_type * pointer │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:58 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ -Dune::GenericIterator< const OverflowArray, const value_type > const_iterator │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:62 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_b_a_c_k │ │ │ │ │ -const_reference back() const │ │ │ │ │ -Returns const reference to last element of OverflowArray. │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:194 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y │ │ │ │ │ -OverflowArray(const std::initializer_list< value_type > &l) │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:71 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_b_a_c_k │ │ │ │ │ -reference back() │ │ │ │ │ -Returns reference to last element of OverflowArray. │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:188 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_p_u_s_h___f_r_o_n_t │ │ │ │ │ -void push_front(const value_type &t) │ │ │ │ │ -Inserts an element to the begin of the OverflowArray,. │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:126 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_f_r_o_n_t │ │ │ │ │ -reference front() │ │ │ │ │ -Returns reference to first element of OverflowArray. │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:176 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -reference operator[](size_type i) │ │ │ │ │ -Returns reference to the i'th element. │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:154 │ │ │ │ │ +77 │ │ │ │ │ +78 │ │ │ │ │ +94template()) , int> = 0> │ │ │ │ │ +_9_7auto _m_a_k_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n(F&& f, const GridView& gridView) │ │ │ │ │ +98 -> decltype(_m_a_k_e_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n(std::forward(f), gridView)) │ │ │ │ │ +99{ │ │ │ │ │ +100 return _m_a_k_e_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n(std::forward(f), gridView); │ │ │ │ │ +101} │ │ │ │ │ +102 │ │ │ │ │ +103 │ │ │ │ │ +104 │ │ │ │ │ +105} // end of namespace Dune::Functions │ │ │ │ │ +106} // end of namespace Dune │ │ │ │ │ +107 │ │ │ │ │ +108#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWFUNCTION_HH │ │ │ │ │ +_a_n_a_l_y_t_i_c_g_r_i_d_v_i_e_w_f_u_n_c_t_i_o_n_._h_h │ │ │ │ │ +_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h │ │ │ │ │ +_g_r_i_d_f_u_n_c_t_i_o_n_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ +auto makeAnalyticGridViewFunction(F &&f, const GridView &gridView) │ │ │ │ │ +Create an AnalyticGridViewFunction from a function and a grid view. │ │ │ │ │ +DDeeffiinniittiioonn analyticgridviewfunction.hh:238 │ │ │ │ │ +_D_u_n_e │ │ │ │ │ +DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ +std::decay_t< F > makeGridViewFunction(F &&f, const GridView &gridView) │ │ │ │ │ +Construct a function modeling GridViewFunction from function and grid view. │ │ │ │ │ +DDeeffiinniittiioonn gridviewfunction.hh:72 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn gridfunction.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t │ │ │ │ │ +An entity set for all entities of given codim in a grid view. │ │ │ │ │ +DDeeffiinniittiioonn gridviewentityset.hh:27 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn gridviewfunction.hh:26 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ +_b_u_f_f_e_r_S_i_z_e_ _>_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ +GV GridView │ │ │ │ │ +DDeeffiinniittiioonn gridviewfunction.hh:50 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00068.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: localfunction_imp.hh File Reference │ │ │ │ +dune-functions: analyticgridviewfunction.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,34 +65,60 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Namespaces
│ │ │ │ -
localfunction_imp.hh File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
analyticgridviewfunction.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <dune/functions/common/type_traits.hh>
│ │ │ │ -#include <dune/functions/common/differentiablefunction_imp.hh>
│ │ │ │ +
#include <type_traits>
│ │ │ │ +#include <optional>
│ │ │ │ +#include <dune/common/copyableoptional.hh>
│ │ │ │ +#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

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 , class Domain = typename GridView::template Codim<0>::Geometry::GlobalCoordinate, class Range = std::invoke_result_t<F,Domain>>
 Dune::Functions::AnalyticGridViewFunction (const F &, const GridView &) -> AnalyticGridViewFunction< Range(Domain), GridView, F >
 
template<class F , class GridView >
auto Dune::Functions::makeAnalyticGridViewFunction (F &&f, const GridView &gridView)
 Create an AnalyticGridViewFunction from a function and a grid view.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,19 +1,44 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _c_o_m_m_o_n │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -localfunction_imp.hh File Reference │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ + * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +analyticgridviewfunction.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_s_i_g_n_a_t_u_r_e_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n___i_m_p_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_l_o_c_a_l_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ + _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _> │ │ │ │ │ +  Class wrapping any differentiable function as grid function. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template::Geometry::GlobalCoordinate, class Range = std:: │ │ │ │ │ +invoke_result_t> │ │ │ │ │ +   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n (const F &, const GridView &) - │ │ │ │ │ + > _A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n< Range(Domain), GridView, F > │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n (F &&f, const GridView │ │ │ │ │ + &gridView) │ │ │ │ │ +  Create an _A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n from a function and a grid view. │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00068_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: localfunction_imp.hh Source File │ │ │ │ +dune-functions: analyticgridviewfunction.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,96 +70,261 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
localfunction_imp.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_COMMON_LOCALFUNCTION_FUNCTION_IMP_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_COMMON_LOCALFUNCTION_FUNCTION_IMP_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH
│ │ │ │
9
│ │ │ │ - │ │ │ │ - │ │ │ │ +
10#include <type_traits>
│ │ │ │ +
11#include <optional>
│ │ │ │
12
│ │ │ │ -
13
│ │ │ │ -
14
│ │ │ │ -
15namespace Dune {
│ │ │ │ -
16namespace Functions {
│ │ │ │ -
17namespace Imp {
│ │ │ │ -
18
│ │ │ │ -
19// Interface of type erasure wrapper
│ │ │ │ -
20//
│ │ │ │ -
21// Notice that the basic interface of polymorphic classes (destructor, clone, ...)
│ │ │ │ -
22// will be added by the type erasure foundation classes.
│ │ │ │ -
23template<class Signature, class DerivativeInterface, class LocalContext>
│ │ │ │ -
24class LocalFunctionWrapperInterface :
│ │ │ │ -
25 public DifferentiableFunctionWrapperInterface<Signature, DerivativeInterface>
│ │ │ │ -
26{
│ │ │ │ -
27public:
│ │ │ │ -
28 virtual void bind(const LocalContext&) = 0;
│ │ │ │ -
29
│ │ │ │ -
30 virtual void unbind() = 0;
│ │ │ │ +
13#include <dune/common/copyableoptional.hh>
│ │ │ │ +
14#include <dune/common/typeutilities.hh>
│ │ │ │ +
15
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
22
│ │ │ │ +
23
│ │ │ │ +
24namespace Dune {
│ │ │ │ +
25namespace Functions {
│ │ │ │ +
26
│ │ │ │ +
27namespace Imp {
│ │ │ │ +
28
│ │ │ │ +
29template<class Signature, class GV, class FLocal, template<class> class DerivativeTraits=DefaultDerivativeTraits>
│ │ │ │ +
30class LocalAnalyticGridViewFunction;
│ │ │ │
31
│ │ │ │ -
32 virtual bool bound() const = 0;
│ │ │ │ -
33
│ │ │ │ -
34 virtual const LocalContext& localContext() const = 0;
│ │ │ │ -
35};
│ │ │ │ -
36
│ │ │ │ -
37
│ │ │ │ -
38// Implementation of type erasure wrapper
│ │ │ │ -
39template<class Signature, class DerivativeInterface, class LocalContext, class B>
│ │ │ │ -
40class LocalFunctionWrapperImplementation :
│ │ │ │ -
41 public DifferentiableFunctionWrapperImplementation<Signature, DerivativeInterface, B>
│ │ │ │ -
42{
│ │ │ │ -
43 using Base = DifferentiableFunctionWrapperImplementation<Signature, DerivativeInterface, B>;
│ │ │ │ -
44public:
│ │ │ │ -
45 using Base::Base;
│ │ │ │ -
46
│ │ │ │ -
47 virtual void bind(const LocalContext& context)
│ │ │ │ -
48 {
│ │ │ │ -
49 this->get().bind(context);
│ │ │ │ -
50 }
│ │ │ │ -
51
│ │ │ │ -
52 virtual void unbind()
│ │ │ │ -
53 {
│ │ │ │ -
54 this->get().unbind();
│ │ │ │ -
55 }
│ │ │ │ -
56
│ │ │ │ -
57 virtual bool bound() const
│ │ │ │ -
58 {
│ │ │ │ -
59 return this->get().bound();
│ │ │ │ -
60 }
│ │ │ │ -
61
│ │ │ │ -
62 virtual const LocalContext& localContext() const
│ │ │ │ -
63 {
│ │ │ │ -
64 return this->get().localContext();
│ │ │ │ -
65 }
│ │ │ │ -
66};
│ │ │ │ +
32template<class Range, class LocalDomain, class GV, class F, template<class> class DerivativeTraits>
│ │ │ │ +
33class LocalAnalyticGridViewFunction<Range(LocalDomain), GV, F, DerivativeTraits>
│ │ │ │ +
34{
│ │ │ │ +
35public:
│ │ │ │ +
36 using Signature = Range(LocalDomain);
│ │ │ │ +
37 using RawSignature = typename SignatureTraits<Signature>::RawSignature;
│ │ │ │ +
38 using DerivativeSignature = typename DerivativeTraits<RawSignature>::Range(LocalDomain);
│ │ │ │ +
39
│ │ │ │ +
40 using GridView = GV;
│ │ │ │ +
41 using EntitySet = GridViewEntitySet<GridView, 0>;
│ │ │ │ +
42 using Element = typename EntitySet::Element;
│ │ │ │ +
43// using Geometry = typename Element::Geometry;
│ │ │ │ +
44 using Geometry = std::decay_t<typename Element::Geometry>;
│ │ │ │ +
45
│ │ │ │ +
46 // Use the indirection via derivativeIfImplemented to also support
│ │ │ │ +
47 // function types F that do not implement derivative. In this case
│ │ │ │ +
48 // the interface type DifferentiableFunction is using a dummy for
│ │ │ │ +
49 // the derivative type
│ │ │ │ +
50 using DerivativeDummy = DifferentiableFunction<DerivativeSignature>;
│ │ │ │ +
51 using GlobalRawDerivative = decltype(Imp::derivativeIfImplemented<DerivativeDummy, F>(std::declval<F>()));
│ │ │ │ +
52 using LocalDerivative = LocalAnalyticGridViewFunction<DerivativeSignature, GridView, GlobalRawDerivative, DerivativeTraits>;
│ │ │ │ +
53
│ │ │ │ +
55 template<class FT, disableCopyMove<LocalAnalyticGridViewFunction, FT> = 0>
│ │ │ │ +
56 LocalAnalyticGridViewFunction(FT&& f) :
│ │ │ │ +
57 f_(std::forward<FT>(f))
│ │ │ │ +
58 {}
│ │ │ │ +
59
│ │ │ │ +
61 template<class FT>
│ │ │ │ +
62 LocalAnalyticGridViewFunction(FT&& f, const Element& element, const std::optional<Geometry>& geometry) :
│ │ │ │ +
63 f_(std::forward<FT>(f)),
│ │ │ │ +
64 element_(element),
│ │ │ │ +
65 geometry_(geometry)
│ │ │ │ +
66 {}
│ │ │ │
67
│ │ │ │ -
68}}} // namespace Dune::Functions::Imp
│ │ │ │ -
69
│ │ │ │ -
70
│ │ │ │ -
71
│ │ │ │ -
72#endif // DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_IMP_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ +
68
│ │ │ │ +
77 void bind(const Element& element)
│ │ │ │ +
78 {
│ │ │ │ +
79 element_ = element;
│ │ │ │ +
80 geometry_.emplace(element_.geometry());
│ │ │ │ +
81 }
│ │ │ │ +
82
│ │ │ │ +
84 void unbind()
│ │ │ │ +
85 {
│ │ │ │ +
86 geometry_.reset();
│ │ │ │ +
87 }
│ │ │ │ +
88
│ │ │ │ +
91 bool bound() const
│ │ │ │ +
92 {
│ │ │ │ +
93 return static_cast<bool>(geometry_);
│ │ │ │ +
94 }
│ │ │ │ +
95
│ │ │ │ +
105 Range operator()(const LocalDomain& x) const
│ │ │ │ +
106 {
│ │ │ │ +
107 assert(!!geometry_);
│ │ │ │ +
108 return (*f_)(geometry_->global(x));
│ │ │ │ +
109 }
│ │ │ │ +
110
│ │ │ │ +
112 const Element& localContext() const
│ │ │ │ +
113 {
│ │ │ │ +
114 assert(!!geometry_);
│ │ │ │ +
115 return element_;
│ │ │ │ +
116 }
│ │ │ │ +
117
│ │ │ │ +
126 friend LocalDerivative derivative(const LocalAnalyticGridViewFunction& t)
│ │ │ │ +
127 {
│ │ │ │ +
128 return LocalDerivative(Imp::derivativeIfImplemented<DerivativeDummy, F>(*t.f_), t.element_, t.geometry_);
│ │ │ │ +
129 }
│ │ │ │ +
130
│ │ │ │ +
131private:
│ │ │ │ +
132 // Wrap the function into CopyableOptional to make it copy-assignable
│ │ │ │ +
133 CopyableOptional<F> f_;
│ │ │ │ +
134 Element element_;
│ │ │ │ +
135 std::optional<Geometry> geometry_ = std::nullopt;
│ │ │ │ +
136};
│ │ │ │ +
137
│ │ │ │ +
138} // end namespace Imp
│ │ │ │ +
139
│ │ │ │ +
140
│ │ │ │ +
141
│ │ │ │ +
142
│ │ │ │ +
143template<class Signature, class GV, class F, template<class> class DerivativeTraits=DefaultDerivativeTraits>
│ │ │ │ + │ │ │ │ +
145
│ │ │ │ +
146
│ │ │ │ +
152template<class Range, class Domain, class GV, class F, template<class> class DerivativeTraits>
│ │ │ │ +
│ │ │ │ +
153class AnalyticGridViewFunction<Range(Domain), GV, F, DerivativeTraits>
│ │ │ │ +
154{
│ │ │ │ +
155public:
│ │ │ │ +
156 using Signature = Range(Domain);
│ │ │ │ + │ │ │ │ +
158 using DerivativeSignature = typename DerivativeTraits<RawSignature>::Range(Domain);
│ │ │ │ +
159
│ │ │ │ +
160 using GridView = GV;
│ │ │ │ + │ │ │ │ +
162 using Element = typename EntitySet::Element;
│ │ │ │ +
163 using Geometry = typename Element::Geometry;
│ │ │ │ +
164
│ │ │ │ +
165 // Use the indirection via derivativeIfImplemented to also support
│ │ │ │ +
166 // function types F that do not implement derivative. In this case
│ │ │ │ +
167 // the interface type DifferentiableFunction is used a dummy for
│ │ │ │ +
168 // the derivative type
│ │ │ │ + │ │ │ │ +
170 using GlobalRawDerivative = decltype(Imp::derivativeIfImplemented<DerivativeDummy, F>(std::declval<F>()));
│ │ │ │ + │ │ │ │ +
172
│ │ │ │ + │ │ │ │ +
174 using LocalFunction = typename Imp::LocalAnalyticGridViewFunction<Range(LocalDomain), GridView, F, LocalDerivativeTraits<EntitySet, DerivativeTraits>::template Traits>;
│ │ │ │ +
175
│ │ │ │ +
177 template<class FT>
│ │ │ │ +
│ │ │ │ +
178 AnalyticGridViewFunction(FT&& f, const GridView& gridView) :
│ │ │ │ +
179 f_(std::forward<FT>(f)),
│ │ │ │ +
180 entitySet_(gridView)
│ │ │ │ +
181 {}
│ │ │ │ +
│ │ │ │ +
182
│ │ │ │ +
│ │ │ │ +
184 Range operator()(const Domain& x) const
│ │ │ │ +
185 {
│ │ │ │ +
186 return (*f_)(x);
│ │ │ │ +
187 }
│ │ │ │ +
│ │ │ │ +
188
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
191 {
│ │ │ │ +
192 return Derivative(Imp::derivativeIfImplemented<DerivativeDummy, F>(*t.f_), t.entitySet_.gridView());
│ │ │ │ +
193 }
│ │ │ │ +
│ │ │ │ +
194
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
197 {
│ │ │ │ +
198 return LocalFunction(*t.f_);
│ │ │ │ +
199 }
│ │ │ │ +
│ │ │ │ +
200
│ │ │ │ +
│ │ │ │ +
202 const EntitySet& entitySet() const
│ │ │ │ +
203 {
│ │ │ │ +
204 return entitySet_;
│ │ │ │ +
205 }
│ │ │ │ +
│ │ │ │ +
206
│ │ │ │ +
207private:
│ │ │ │ +
208 // Wrap the function into CopyableOptional to make it copy-assignable
│ │ │ │ +
209 CopyableOptional<F> f_;
│ │ │ │ +
210 EntitySet entitySet_;
│ │ │ │ +
211};
│ │ │ │ +
│ │ │ │ +
212
│ │ │ │ +
213// deduction guides
│ │ │ │ +
214template<class F, class GridView,
│ │ │ │ +
215 class Domain = typename GridView::template Codim<0>::Geometry::GlobalCoordinate,
│ │ │ │ +
216 class Range = std::invoke_result_t<F,Domain>>
│ │ │ │ +
217AnalyticGridViewFunction(const F&, const GridView&)
│ │ │ │ +
218 -> AnalyticGridViewFunction<Range(Domain), GridView, F>;
│ │ │ │ +
219
│ │ │ │ +
220
│ │ │ │ +
237template<class F, class GridView>
│ │ │ │ +
│ │ │ │ +
238auto makeAnalyticGridViewFunction(F&& f, const GridView& gridView)
│ │ │ │ +
239{
│ │ │ │ +
240 using Domain = typename GridView::template Codim<0>::Geometry::GlobalCoordinate;
│ │ │ │ +
241 using Range = std::invoke_result_t<F, Domain>;
│ │ │ │ +
242 using FRaw = std::decay_t<F>;
│ │ │ │ +
243
│ │ │ │ +
244 return AnalyticGridViewFunction<Range(Domain), GridView, FRaw>(std::forward<F>(f), gridView);
│ │ │ │ +
245}
│ │ │ │ +
│ │ │ │ +
246
│ │ │ │ +
247
│ │ │ │ +
248
│ │ │ │ +
249}} // namespace Dune::Functions
│ │ │ │ +
250
│ │ │ │ +
251
│ │ │ │ +
252
│ │ │ │ +
253#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:43
│ │ │ │ +
auto makeAnalyticGridViewFunction(F &&f, const GridView &gridView)
Create an AnalyticGridViewFunction from a function and a grid view.
Definition analyticgridviewfunction.hh:238
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ +
Definition differentiablefunction.hh:33
│ │ │ │ +
Helper class to deduce the signature of a callable.
Definition signature.hh:60
│ │ │ │ +
Definition analyticgridviewfunction.hh:144
│ │ │ │ +
Range operator()(const Domain &x) const
Evaluate the wrapped function f directly in global coordinates x.
Definition analyticgridviewfunction.hh:184
│ │ │ │ +
typename EntitySet::LocalCoordinate LocalDomain
Definition analyticgridviewfunction.hh:173
│ │ │ │ +
friend Derivative derivative(const AnalyticGridViewFunction &t)
Create a derivative grid-function by wrapping the derivative of f.
Definition analyticgridviewfunction.hh:190
│ │ │ │ +
typename Element::Geometry Geometry
Definition analyticgridviewfunction.hh:163
│ │ │ │ +
typename EntitySet::Element Element
Definition analyticgridviewfunction.hh:162
│ │ │ │ + │ │ │ │ +
decltype(Imp::derivativeIfImplemented< DerivativeDummy, F >(std::declval< F >())) GlobalRawDerivative
Definition analyticgridviewfunction.hh:170
│ │ │ │ +
Range(Domain) Signature
Definition analyticgridviewfunction.hh:156
│ │ │ │ +
AnalyticGridViewFunction(FT &&f, const GridView &gridView)
Create the grid-function by wrapping a function f and create a GridViewEntitySet.
Definition analyticgridviewfunction.hh:178
│ │ │ │ +
friend LocalFunction localFunction(const AnalyticGridViewFunction &t)
Construct the associated local-function.
Definition analyticgridviewfunction.hh:196
│ │ │ │ +
typename Imp::LocalAnalyticGridViewFunction< Range(LocalDomain), GridView, F, LocalDerivativeTraits< EntitySet, DerivativeTraits >::template Traits > LocalFunction
Definition analyticgridviewfunction.hh:174
│ │ │ │ +
typename SignatureTraits< Signature >::RawSignature RawSignature
Definition analyticgridviewfunction.hh:157
│ │ │ │ +
const EntitySet & entitySet() const
Return the set of entities this local-function can be bound to.
Definition analyticgridviewfunction.hh:202
│ │ │ │ +
typename DerivativeTraits< RawSignature >::Range(Domain) DerivativeSignature
Definition analyticgridviewfunction.hh:158
│ │ │ │ + │ │ │ │ +
GridView::template Codim< codim >::Entity Element
Type of Elements contained in this EntitySet.
Definition gridviewentityset.hh:36
│ │ │ │ +
Element::Geometry::LocalCoordinate LocalCoordinate
Type of local coordinates with respect to the Element.
Definition gridviewentityset.hh:39
│ │ │ │ +
Derivative traits for local functions.
Definition localderivativetraits.hh:32
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,94 +1,329 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _c_o_m_m_o_n │ │ │ │ │ -localfunction_imp.hh │ │ │ │ │ + * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ +analyticgridviewfunction.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_COMMON_LOCALFUNCTION_FUNCTION_IMP_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_COMMON_LOCALFUNCTION_FUNCTION_IMP_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ -11#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n___i_m_p_._h_h> │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ 12 │ │ │ │ │ -13 │ │ │ │ │ -14 │ │ │ │ │ -15namespace _D_u_n_e { │ │ │ │ │ -16namespace Functions { │ │ │ │ │ -17namespace Imp { │ │ │ │ │ -18 │ │ │ │ │ -19// Interface of type erasure wrapper │ │ │ │ │ -20// │ │ │ │ │ -21// Notice that the basic interface of polymorphic classes (destructor, clone, │ │ │ │ │ -...) │ │ │ │ │ -22// will be added by the type erasure foundation classes. │ │ │ │ │ -23template │ │ │ │ │ -24class LocalFunctionWrapperInterface : │ │ │ │ │ -25 public DifferentiableFunctionWrapperInterface │ │ │ │ │ -26{ │ │ │ │ │ -27public: │ │ │ │ │ -28 virtual void bind(const LocalContext&) = 0; │ │ │ │ │ -29 │ │ │ │ │ -30 virtual void unbind() = 0; │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15 │ │ │ │ │ +16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_s_i_g_n_a_t_u_r_e_._h_h> │ │ │ │ │ +17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n___i_m_p_._h_h> │ │ │ │ │ +19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ +20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h> │ │ │ │ │ +21#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_l_o_c_a_l_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +22 │ │ │ │ │ +23 │ │ │ │ │ +24namespace _D_u_n_e { │ │ │ │ │ +25namespace Functions { │ │ │ │ │ +26 │ │ │ │ │ +27namespace Imp { │ │ │ │ │ +28 │ │ │ │ │ +29template class │ │ │ │ │ +DerivativeTraits=DefaultDerivativeTraits> │ │ │ │ │ +30class LocalAnalyticGridViewFunction; │ │ │ │ │ 31 │ │ │ │ │ -32 virtual bool bound() const = 0; │ │ │ │ │ -33 │ │ │ │ │ -34 virtual const LocalContext& localContext() const = 0; │ │ │ │ │ -35}; │ │ │ │ │ -36 │ │ │ │ │ -37 │ │ │ │ │ -38// Implementation of type erasure wrapper │ │ │ │ │ -39template │ │ │ │ │ -40class LocalFunctionWrapperImplementation : │ │ │ │ │ -41 public DifferentiableFunctionWrapperImplementation │ │ │ │ │ -42{ │ │ │ │ │ -43 using Base = DifferentiableFunctionWrapperImplementation; │ │ │ │ │ -44public: │ │ │ │ │ -45 using Base::Base; │ │ │ │ │ -46 │ │ │ │ │ -47 virtual void bind(const LocalContext& context) │ │ │ │ │ -48 { │ │ │ │ │ -49 this->get().bind(context); │ │ │ │ │ -50 } │ │ │ │ │ -51 │ │ │ │ │ -52 virtual void unbind() │ │ │ │ │ -53 { │ │ │ │ │ -54 this->get().unbind(); │ │ │ │ │ -55 } │ │ │ │ │ -56 │ │ │ │ │ -57 virtual bool bound() const │ │ │ │ │ -58 { │ │ │ │ │ -59 return this->get().bound(); │ │ │ │ │ -60 } │ │ │ │ │ -61 │ │ │ │ │ -62 virtual const LocalContext& localContext() const │ │ │ │ │ -63 { │ │ │ │ │ -64 return this->get().localContext(); │ │ │ │ │ -65 } │ │ │ │ │ -66}; │ │ │ │ │ +32template │ │ │ │ │ +class DerivativeTraits> │ │ │ │ │ +33class LocalAnalyticGridViewFunction │ │ │ │ │ +34{ │ │ │ │ │ +35public: │ │ │ │ │ +36 using Signature = Range(LocalDomain); │ │ │ │ │ +37 using RawSignature = typename SignatureTraits::RawSignature; │ │ │ │ │ +38 using DerivativeSignature = typename DerivativeTraits::Range │ │ │ │ │ +(LocalDomain); │ │ │ │ │ +39 │ │ │ │ │ +40 using GridView = GV; │ │ │ │ │ +41 using EntitySet = GridViewEntitySet; │ │ │ │ │ +42 using Element = typename EntitySet::Element; │ │ │ │ │ +43// using Geometry = typename Element::Geometry; │ │ │ │ │ +44 using Geometry = std::decay_t; │ │ │ │ │ +45 │ │ │ │ │ +46 // Use the indirection via derivativeIfImplemented to also support │ │ │ │ │ +47 // function types F that do not implement derivative. In this case │ │ │ │ │ +48 // the interface type DifferentiableFunction is using a dummy for │ │ │ │ │ +49 // the derivative type │ │ │ │ │ +50 using DerivativeDummy = DifferentiableFunction; │ │ │ │ │ +51 using GlobalRawDerivative = decltype(Imp:: │ │ │ │ │ +derivativeIfImplemented(std::declval())); │ │ │ │ │ +52 using LocalDerivative = LocalAnalyticGridViewFunction; │ │ │ │ │ +53 │ │ │ │ │ +55 template = 0> │ │ │ │ │ +56 LocalAnalyticGridViewFunction(FT&& f) : │ │ │ │ │ +57 f_(std::forward(f)) │ │ │ │ │ +58 {} │ │ │ │ │ +59 │ │ │ │ │ +61 template │ │ │ │ │ +62 LocalAnalyticGridViewFunction(FT&& f, const Element& element, const std:: │ │ │ │ │ +optional& geometry) : │ │ │ │ │ +63 f_(std::forward(f)), │ │ │ │ │ +64 element_(element), │ │ │ │ │ +65 geometry_(geometry) │ │ │ │ │ +66 {} │ │ │ │ │ 67 │ │ │ │ │ -68}}} // namespace Dune::Functions::Imp │ │ │ │ │ -69 │ │ │ │ │ -70 │ │ │ │ │ -71 │ │ │ │ │ -72#endif // DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_IMP_HH │ │ │ │ │ -_t_y_p_e___t_r_a_i_t_s_._h_h │ │ │ │ │ +68 │ │ │ │ │ +77 void bind(const Element& element) │ │ │ │ │ +78 { │ │ │ │ │ +79 element_ = element; │ │ │ │ │ +80 geometry_.emplace(element_.geometry()); │ │ │ │ │ +81 } │ │ │ │ │ +82 │ │ │ │ │ +84 void unbind() │ │ │ │ │ +85 { │ │ │ │ │ +86 geometry_.reset(); │ │ │ │ │ +87 } │ │ │ │ │ +88 │ │ │ │ │ +91 bool bound() const │ │ │ │ │ +92 { │ │ │ │ │ +93 return static_cast(geometry_); │ │ │ │ │ +94 } │ │ │ │ │ +95 │ │ │ │ │ +105 Range operator()(const LocalDomain& x) const │ │ │ │ │ +106 { │ │ │ │ │ +107 assert(!!geometry_); │ │ │ │ │ +108 return (*f_)(geometry_->global(x)); │ │ │ │ │ +109 } │ │ │ │ │ +110 │ │ │ │ │ +112 const Element& localContext() const │ │ │ │ │ +113 { │ │ │ │ │ +114 assert(!!geometry_); │ │ │ │ │ +115 return element_; │ │ │ │ │ +116 } │ │ │ │ │ +117 │ │ │ │ │ +126 friend LocalDerivative _d_e_r_i_v_a_t_i_v_e(const LocalAnalyticGridViewFunction& t) │ │ │ │ │ +127 { │ │ │ │ │ +128 return LocalDerivative(Imp::derivativeIfImplemented │ │ │ │ │ +(*t.f_), t.element_, t.geometry_); │ │ │ │ │ +129 } │ │ │ │ │ +130 │ │ │ │ │ +131private: │ │ │ │ │ +132 // Wrap the function into CopyableOptional to make it copy-assignable │ │ │ │ │ +133 CopyableOptional f_; │ │ │ │ │ +134 Element element_; │ │ │ │ │ +135 std::optional geometry_ = std::nullopt; │ │ │ │ │ +136}; │ │ │ │ │ +137 │ │ │ │ │ +138} // end namespace Imp │ │ │ │ │ +139 │ │ │ │ │ +140 │ │ │ │ │ +141 │ │ │ │ │ +142 │ │ │ │ │ +143template class │ │ │ │ │ +DerivativeTraits=DefaultDerivativeTraits> │ │ │ │ │ +_1_4_4class _A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n; │ │ │ │ │ +145 │ │ │ │ │ +146 │ │ │ │ │ +152template class │ │ │ │ │ +DerivativeTraits> │ │ │ │ │ +_1_5_3class _A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ +154{ │ │ │ │ │ +155public: │ │ │ │ │ +_1_5_6 using _S_i_g_n_a_t_u_r_e = Range(Domain); │ │ │ │ │ +_1_5_7 using _R_a_w_S_i_g_n_a_t_u_r_e = typename _S_i_g_n_a_t_u_r_e_T_r_a_i_t_s_<_S_i_g_n_a_t_u_r_e_>_:_:_R_a_w_S_i_g_n_a_t_u_r_e; │ │ │ │ │ +_1_5_8 using _D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e = typename DerivativeTraits::Range │ │ │ │ │ +(Domain); │ │ │ │ │ +159 │ │ │ │ │ +_1_6_0 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ +_1_6_1 using _E_n_t_i_t_y_S_e_t = _G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_G_r_i_d_V_i_e_w_,_ _0_>; │ │ │ │ │ +_1_6_2 using _E_l_e_m_e_n_t = typename _E_n_t_i_t_y_S_e_t_:_:_E_l_e_m_e_n_t; │ │ │ │ │ +_1_6_3 using _G_e_o_m_e_t_r_y = typename Element::Geometry; │ │ │ │ │ +164 │ │ │ │ │ +165 // Use the indirection via derivativeIfImplemented to also support │ │ │ │ │ +166 // function types F that do not implement derivative. In this case │ │ │ │ │ +167 // the interface type DifferentiableFunction is used a dummy for │ │ │ │ │ +168 // the derivative type │ │ │ │ │ +_1_6_9 using _D_e_r_i_v_a_t_i_v_e_D_u_m_m_y = _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_>; │ │ │ │ │ +_1_7_0 using _G_l_o_b_a_l_R_a_w_D_e_r_i_v_a_t_i_v_e = decltype(Imp:: │ │ │ │ │ +derivativeIfImplemented(std::declval())); │ │ │ │ │ +_1_7_1 using _D_e_r_i_v_a_t_i_v_e = _A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_,_ _G_r_i_d_V_i_e_w_, │ │ │ │ │ +_G_l_o_b_a_l_R_a_w_D_e_r_i_v_a_t_i_v_e_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_>; │ │ │ │ │ +172 │ │ │ │ │ +_1_7_3 using _L_o_c_a_l_D_o_m_a_i_n = typename _E_n_t_i_t_y_S_e_t_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ +_1_7_4 using _L_o_c_a_l_F_u_n_c_t_i_o_n = typename Imp::LocalAnalyticGridViewFunction_:_:_t_e_m_p_l_a_t_e Traits>; │ │ │ │ │ +175 │ │ │ │ │ +177 template │ │ │ │ │ +_1_7_8 _A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n(FT&& f, const _G_r_i_d_V_i_e_w& gridView) : │ │ │ │ │ +179 f_(std::forward(f)), │ │ │ │ │ +180 entitySet_(gridView) │ │ │ │ │ +181 {} │ │ │ │ │ +182 │ │ │ │ │ +_1_8_4 Range _o_p_e_r_a_t_o_r_(_)(const Domain& x) const │ │ │ │ │ +185 { │ │ │ │ │ +186 return (*f_)(x); │ │ │ │ │ +187 } │ │ │ │ │ +188 │ │ │ │ │ +_1_9_0 friend _D_e_r_i_v_a_t_i_v_e _d_e_r_i_v_a_t_i_v_e(const _A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n& t) │ │ │ │ │ +191 { │ │ │ │ │ +192 return _D_e_r_i_v_a_t_i_v_e(Imp::derivativeIfImplemented(*t.f_), │ │ │ │ │ +t.entitySet_.gridView()); │ │ │ │ │ +193 } │ │ │ │ │ +194 │ │ │ │ │ +_1_9_6 friend _L_o_c_a_l_F_u_n_c_t_i_o_n _l_o_c_a_l_F_u_n_c_t_i_o_n(const _A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n& t) │ │ │ │ │ +197 { │ │ │ │ │ +198 return _L_o_c_a_l_F_u_n_c_t_i_o_n(*t.f_); │ │ │ │ │ +199 } │ │ │ │ │ +200 │ │ │ │ │ +_2_0_2 const _E_n_t_i_t_y_S_e_t& _e_n_t_i_t_y_S_e_t() const │ │ │ │ │ +203 { │ │ │ │ │ +204 return entitySet_; │ │ │ │ │ +205 } │ │ │ │ │ +206 │ │ │ │ │ +207private: │ │ │ │ │ +208 // Wrap the function into CopyableOptional to make it copy-assignable │ │ │ │ │ +209 CopyableOptional f_; │ │ │ │ │ +210 EntitySet entitySet_; │ │ │ │ │ +211}; │ │ │ │ │ +212 │ │ │ │ │ +213// deduction guides │ │ │ │ │ +214template::Geometry:: │ │ │ │ │ +GlobalCoordinate, │ │ │ │ │ +216 class Range = std::invoke_result_t> │ │ │ │ │ +_2_1_7_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n(const F&, const GridView&) │ │ │ │ │ +218 -> _A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n; │ │ │ │ │ +219 │ │ │ │ │ +220 │ │ │ │ │ +237template │ │ │ │ │ +_2_3_8auto _m_a_k_e_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n(F&& f, const GridView& gridView) │ │ │ │ │ +239{ │ │ │ │ │ +240 using Domain = typename GridView::template Codim<0>::Geometry:: │ │ │ │ │ +GlobalCoordinate; │ │ │ │ │ +241 using Range = std::invoke_result_t; │ │ │ │ │ +242 using FRaw = std::decay_t; │ │ │ │ │ +243 │ │ │ │ │ +244 return _A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_r_i_d_V_i_e_w_,_ _F_R_a_w_>(std:: │ │ │ │ │ +forward(f), gridView); │ │ │ │ │ +245} │ │ │ │ │ +246 │ │ │ │ │ +247 │ │ │ │ │ +248 │ │ │ │ │ +249}} // namespace Dune::Functions │ │ │ │ │ +250 │ │ │ │ │ +251 │ │ │ │ │ +252 │ │ │ │ │ +253#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_ANALYTICGRIDVIEWFUNCTION_HH │ │ │ │ │ _d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n___i_m_p_._h_h │ │ │ │ │ +_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h │ │ │ │ │ +_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h │ │ │ │ │ +_s_i_g_n_a_t_u_r_e_._h_h │ │ │ │ │ +_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h │ │ │ │ │ +_l_o_c_a_l_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ +TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const │ │ │ │ │ +TrigonometricFunction< K, sinFactor, cosFactor > &f) │ │ │ │ │ +Obtain derivative of TrigonometricFunction function. │ │ │ │ │ +DDeeffiinniittiioonn trigonometricfunction.hh:43 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_:_:_m_a_k_e_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ +auto makeAnalyticGridViewFunction(F &&f, const GridView &gridView) │ │ │ │ │ +Create an AnalyticGridViewFunction from a function and a grid view. │ │ │ │ │ +DDeeffiinniittiioonn analyticgridviewfunction.hh:238 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn differentiablefunction.hh:33 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_r_a_i_t_s │ │ │ │ │ +Helper class to deduce the signature of a callable. │ │ │ │ │ +DDeeffiinniittiioonn signature.hh:60 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn analyticgridviewfunction.hh:144 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +Range operator()(const Domain &x) const │ │ │ │ │ +Evaluate the wrapped function f directly in global coordinates x. │ │ │ │ │ +DDeeffiinniittiioonn analyticgridviewfunction.hh:184 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_L_o_c_a_l_D_o_m_a_i_n │ │ │ │ │ +typename EntitySet::LocalCoordinate LocalDomain │ │ │ │ │ +DDeeffiinniittiioonn analyticgridviewfunction.hh:173 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ +friend Derivative derivative(const AnalyticGridViewFunction &t) │ │ │ │ │ +Create a derivative grid-function by wrapping the derivative of f. │ │ │ │ │ +DDeeffiinniittiioonn analyticgridviewfunction.hh:190 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ +typename Element::Geometry Geometry │ │ │ │ │ +DDeeffiinniittiioonn analyticgridviewfunction.hh:163 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_E_l_e_m_e_n_t │ │ │ │ │ +typename EntitySet::Element Element │ │ │ │ │ +DDeeffiinniittiioonn analyticgridviewfunction.hh:162 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ +GV GridView │ │ │ │ │ +DDeeffiinniittiioonn analyticgridviewfunction.hh:160 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_G_l_o_b_a_l_R_a_w_D_e_r_i_v_a_t_i_v_e │ │ │ │ │ +decltype(Imp::derivativeIfImplemented< DerivativeDummy, F >(std::declval< F > │ │ │ │ │ +())) GlobalRawDerivative │ │ │ │ │ +DDeeffiinniittiioonn analyticgridviewfunction.hh:170 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_S_i_g_n_a_t_u_r_e │ │ │ │ │ +Range(Domain) Signature │ │ │ │ │ +DDeeffiinniittiioonn analyticgridviewfunction.hh:156 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ +AnalyticGridViewFunction(FT &&f, const GridView &gridView) │ │ │ │ │ +Create the grid-function by wrapping a function f and create a │ │ │ │ │ +GridViewEntitySet. │ │ │ │ │ +DDeeffiinniittiioonn analyticgridviewfunction.hh:178 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_l_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ +friend LocalFunction localFunction(const AnalyticGridViewFunction &t) │ │ │ │ │ +Construct the associated local-function. │ │ │ │ │ +DDeeffiinniittiioonn analyticgridviewfunction.hh:196 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ +typename Imp::LocalAnalyticGridViewFunction< Range(LocalDomain), GridView, F, │ │ │ │ │ +LocalDerivativeTraits< EntitySet, DerivativeTraits >::template Traits > │ │ │ │ │ +LocalFunction │ │ │ │ │ +DDeeffiinniittiioonn analyticgridviewfunction.hh:174 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_R_a_w_S_i_g_n_a_t_u_r_e │ │ │ │ │ +typename SignatureTraits< Signature >::RawSignature RawSignature │ │ │ │ │ +DDeeffiinniittiioonn analyticgridviewfunction.hh:157 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_e_n_t_i_t_y_S_e_t │ │ │ │ │ +const EntitySet & entitySet() const │ │ │ │ │ +Return the set of entities this local-function can be bound to. │ │ │ │ │ +DDeeffiinniittiioonn analyticgridviewfunction.hh:202 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_A_n_a_l_y_t_i_c_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _G_V_,_ _F_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _>_:_:_D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e │ │ │ │ │ +typename DerivativeTraits< RawSignature >::Range(Domain) DerivativeSignature │ │ │ │ │ +DDeeffiinniittiioonn analyticgridviewfunction.hh:158 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_ _G_r_i_d_V_i_e_w_,_ _0_ _> │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_ _G_r_i_d_V_i_e_w_,_ _0_ _>_:_:_E_l_e_m_e_n_t │ │ │ │ │ +GridView::template Codim< codim >::Entity Element │ │ │ │ │ +Type of Elements contained in this EntitySet. │ │ │ │ │ +DDeeffiinniittiioonn gridviewentityset.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_ _G_r_i_d_V_i_e_w_,_ _0_ _>_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +Element::Geometry::LocalCoordinate LocalCoordinate │ │ │ │ │ +Type of local coordinates with respect to the Element. │ │ │ │ │ +DDeeffiinniittiioonn gridviewentityset.hh:39 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ +Derivative traits for local functions. │ │ │ │ │ +DDeeffiinniittiioonn localderivativetraits.hh:32 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00071.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: defaultderivativetraits.hh File Reference │ │ │ │ +dune-functions: discreteglobalbasisfunction.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,58 +65,74 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
defaultderivativetraits.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
discreteglobalbasisfunction.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <dune/common/fvector.hh>
│ │ │ │ -#include <dune/common/fmatrix.hh>
│ │ │ │ +
#include <memory>
│ │ │ │ +#include <optional>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/grid/utility/hierarchicsearch.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::InvalidRange
 Dummy range class to be used if no proper type is available. More...
class  Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase< B, V, NTRE >
 
struct  Dune::Functions::DefaultDerivativeTraits< Signature >
 Default implementation for derivative traits. More...
struct  Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase< B, V, NTRE >::Data
 
struct  Dune::Functions::DefaultDerivativeTraits< double(double) >
 Default implementation for derivative traits. More...
class  Dune::Functions::ImplDoc::DiscreteGlobalBasisFunctionBase< B, V, NTRE >::LocalFunctionBase
 
struct  Dune::Functions::DefaultDerivativeTraits< K(FieldVector< K, n >)>
 Default implementation for derivative traits. More...
class  Dune::Functions::DiscreteGlobalBasisFunction< B, V, NTRE, R >
 A grid function induced by a global basis and a coefficient vector. More...
 
struct  Dune::Functions::DefaultDerivativeTraits< FieldVector< K, m >(FieldVector< K, n >)>
 Default implementation for derivative traits. More...
class  Dune::Functions::DiscreteGlobalBasisFunction< B, V, NTRE, R >::LocalFunction
 
struct  Dune::Functions::DefaultDerivativeTraits< FieldMatrix< K, 1, m >(FieldVector< K, n >)>
 Default implementation for derivative traits. More...
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::ImplDoc
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<typename R , typename B , typename V >
auto Dune::Functions::makeDiscreteGlobalBasisFunction (B &&basis, V &&vector)
 Generate a DiscreteGlobalBasisFunction.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,42 +1,60 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -defaultderivativetraits.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +discreteglobalbasisfunction.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_h_i_e_r_a_r_c_h_i_c_n_o_d_e_t_o_r_a_n_g_e_m_a_p_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_f_l_a_t_v_e_c_t_o_r_v_i_e_w_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_b_a_c_k_e_n_d_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_b_a_c_k_e_n_d_s_/_i_s_t_l_v_e_c_t_o_r_b_a_c_k_e_n_d_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ - class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_n_v_a_l_i_d_R_a_n_g_e │ │ │ │ │ -  Dummy range class to be used if no proper type is available. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_<_ _B_,_ _V_,_ _N_T_R_E │ │ │ │ │ + _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_ _S_i_g_n_a_t_u_r_e_ _> │ │ │ │ │ -  Default implementation for derivative traits. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_<_ _B_,_ _V_,_ _N_T_R_E │ │ │ │ │ + _>_:_:_D_a_t_a │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_ _d_o_u_b_l_e_(_d_o_u_b_l_e_)_ _> │ │ │ │ │ -  Default implementation for derivative traits. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_<_ _B_,_ _V_,_ _N_T_R_E │ │ │ │ │ + _>_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_ _K_(_F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _n_ _>_)_> │ │ │ │ │ -  Default implementation for derivative traits. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_<_ _B_,_ _V_,_ _N_T_R_E_,_ _R_ _> │ │ │ │ │ +  A grid function induced by a global basis and a coefficient vector. │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _m_ _> │ │ │ │ │ - _(_F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _n_ _>_)_> │ │ │ │ │ -  Default implementation for derivative traits. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_<_ _B_,_ _V_,_ _N_T_R_E_,_ _R_ _>_:_: │ │ │ │ │ + _L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _1_,_ _m_ _> │ │ │ │ │ - _(_F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _n_ _>_)_> │ │ │ │ │ -  Default implementation for derivative traits. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_<_ _D_G_B_F_ _> │ │ │ │ │ +  Derivative of a _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_<_ _D_G_B_F_ _>_:_: │ │ │ │ │ + _L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ +  local function evaluating the derivative in reference coordinates │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ +namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c │ │ │ │ │ +  │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n (B &&basis, V &&vector) │ │ │ │ │ +  Generate a _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n. │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00071_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: defaultderivativetraits.hh Source File │ │ │ │ +dune-functions: discreteglobalbasisfunction.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,101 +70,695 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
defaultderivativetraits.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_COMMON_DEFAULT_DERIVATIVE_TRAITS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_COMMON_DEFAULT_DERIVATIVE_TRAITS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH
│ │ │ │
9
│ │ │ │ -
10#include <type_traits>
│ │ │ │ -
11#include <utility>
│ │ │ │ +
10#include <memory>
│ │ │ │ +
11#include <optional>
│ │ │ │
12
│ │ │ │ -
13#include <dune/common/fvector.hh>
│ │ │ │ -
14#include <dune/common/fmatrix.hh>
│ │ │ │ -
15
│ │ │ │ -
16namespace Dune {
│ │ │ │ -
17namespace Functions {
│ │ │ │ +
13#include <dune/common/typetraits.hh>
│ │ │ │ +
14
│ │ │ │ +
15#include <dune/grid/utility/hierarchicsearch.hh>
│ │ │ │ +
16
│ │ │ │ +
17#include <dune/typetree/treecontainer.hh>
│ │ │ │
18
│ │ │ │ -
19
│ │ │ │ -
20
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
27{};
│ │ │ │ -
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
25
│ │ │ │ +
26namespace Dune {
│ │ │ │ +
27namespace Functions {
│ │ │ │
28
│ │ │ │
29
│ │ │ │ -
39template<class Signature>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
41{
│ │ │ │ - │ │ │ │ -
44};
│ │ │ │ -
│ │ │ │ -
45
│ │ │ │ -
46
│ │ │ │ -
54template<>
│ │ │ │ -
│ │ │ │ -
55struct DefaultDerivativeTraits< double(double) >
│ │ │ │ -
56{
│ │ │ │ -
58 typedef double Range;
│ │ │ │ -
59};
│ │ │ │ -
│ │ │ │ -
60
│ │ │ │ -
70template<typename K, int n>
│ │ │ │ -
│ │ │ │ -
71struct DefaultDerivativeTraits<K(FieldVector<K,n>)>
│ │ │ │ -
72{
│ │ │ │ -
74 typedef FieldVector<K,n> Range;
│ │ │ │ -
75};
│ │ │ │ -
│ │ │ │ -
76
│ │ │ │ -
86template<typename K, int n, int m>
│ │ │ │ -
│ │ │ │ -
87struct DefaultDerivativeTraits<FieldVector<K,m>(FieldVector<K,n>)>
│ │ │ │ -
88{
│ │ │ │ -
90 typedef FieldMatrix<K,m,n> Range;
│ │ │ │ -
91};
│ │ │ │ -
│ │ │ │ -
92
│ │ │ │ -
102template<typename K, int n, int m>
│ │ │ │ -
│ │ │ │ -
103struct DefaultDerivativeTraits<FieldMatrix<K,1,m>(FieldVector<K,n>)>
│ │ │ │ -
104{
│ │ │ │ -
106 typedef FieldMatrix<K,m,n> Range;
│ │ │ │ -
107};
│ │ │ │ -
│ │ │ │ -
108
│ │ │ │ -
109
│ │ │ │ -
110}} // namespace Dune::Functions
│ │ │ │ -
111
│ │ │ │ -
112
│ │ │ │ -
113#endif // DUNE_FUNCTIONS_COMMON_DEFAULT_DERIVATIVE_TRAITS_HH
│ │ │ │ +
│ │ │ │ +
30namespace ImplDoc {
│ │ │ │ +
31
│ │ │ │ +
32template<typename B, typename V, typename NTRE>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
34{
│ │ │ │ +
35public:
│ │ │ │ +
36 using Basis = B;
│ │ │ │ +
37 using Vector = V;
│ │ │ │ +
38
│ │ │ │ +
39 // In order to make the cache work for proxy-references
│ │ │ │ +
40 // we have to use AutonomousValue<T> instead of std::decay_t<T>
│ │ │ │ +
41 using Coefficient = Dune::AutonomousValue<decltype(std::declval<Vector>()[std::declval<typename Basis::MultiIndex>()])>;
│ │ │ │ +
42
│ │ │ │ +
43 using GridView = typename Basis::GridView;
│ │ │ │ + │ │ │ │ +
45 using Tree = typename Basis::LocalView::Tree;
│ │ │ │ +
46 using NodeToRangeEntry = NTRE;
│ │ │ │ +
47
│ │ │ │ + │ │ │ │ +
49
│ │ │ │ + │ │ │ │ +
51 using Element = typename EntitySet::Element;
│ │ │ │ +
52
│ │ │ │ +
53protected:
│ │ │ │ +
54
│ │ │ │ +
55 // This collects all data that is shared by all related
│ │ │ │ +
56 // global and local functions. This way we don't need to
│ │ │ │ +
57 // keep track of it individually.
│ │ │ │ +
│ │ │ │ +
58 struct Data
│ │ │ │ +
59 {
│ │ │ │ + │ │ │ │ +
61 std::shared_ptr<const Basis> basis;
│ │ │ │ +
62 std::shared_ptr<const Vector> coefficients;
│ │ │ │ +
63 std::shared_ptr<const NodeToRangeEntry> nodeToRangeEntry;
│ │ │ │ +
64 };
│ │ │ │ +
│ │ │ │ +
65
│ │ │ │ +
66public:
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
68 {
│ │ │ │ +
69 using LocalView = typename Basis::LocalView;
│ │ │ │ +
70 using size_type = typename Tree::size_type;
│ │ │ │ +
71
│ │ │ │ +
72 public:
│ │ │ │ + │ │ │ │ +
74 using Element = typename EntitySet::Element;
│ │ │ │ +
75
│ │ │ │ +
76 protected:
│ │ │ │ +
│ │ │ │ +
77 LocalFunctionBase(const std::shared_ptr<const Data>& data)
│ │ │ │ +
78 : data_(data)
│ │ │ │ +
79 , localView_(data_->basis->localView())
│ │ │ │ +
80 {
│ │ │ │ +
81 localDoFs_.reserve(localView_.maxSize());
│ │ │ │ +
82 }
│ │ │ │ +
│ │ │ │ +
83
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
91 : data_(other.data_)
│ │ │ │ +
92 , localView_(other.localView_)
│ │ │ │ +
93 {
│ │ │ │ +
94 localDoFs_.reserve(localView_.maxSize());
│ │ │ │ +
95 if (bound())
│ │ │ │ +
96 localDoFs_ = other.localDoFs_;
│ │ │ │ +
97 }
│ │ │ │ +
│ │ │ │ +
98
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
107 {
│ │ │ │ +
108 data_ = other.data_;
│ │ │ │ +
109 localView_ = other.localView_;
│ │ │ │ +
110 if (bound())
│ │ │ │ +
111 localDoFs_ = other.localDoFs_;
│ │ │ │ +
112 return *this;
│ │ │ │ +
113 }
│ │ │ │ +
│ │ │ │ +
114
│ │ │ │ +
115 public:
│ │ │ │ +
│ │ │ │ +
122 void bind(const Element& element)
│ │ │ │ +
123 {
│ │ │ │ +
124 localView_.bind(element);
│ │ │ │ +
125 // Use cache of full local view size. For a subspace basis,
│ │ │ │ +
126 // this may be larger than the number of local DOFs in the
│ │ │ │ +
127 // tree. In this case only cache entries associated to local
│ │ │ │ +
128 // DOFs in the subspace are filled. Cache entries associated
│ │ │ │ +
129 // to local DOFs which are not contained in the subspace will
│ │ │ │ +
130 // not be touched.
│ │ │ │ +
131 //
│ │ │ │ +
132 // Alternatively one could use a cache that exactly fits
│ │ │ │ +
133 // the size of the tree. However, this would require to
│ │ │ │ +
134 // subtract an offset from localIndex(i) on each cache
│ │ │ │ +
135 // access in operator().
│ │ │ │ +
136 localDoFs_.resize(localView_.size());
│ │ │ │ +
137 const auto& dofs = *data_->coefficients;
│ │ │ │ +
138 for (size_type i = 0; i < localView_.tree().size(); ++i)
│ │ │ │ +
139 {
│ │ │ │ +
140 // For a subspace basis the index-within-tree i
│ │ │ │ +
141 // is not the same as the localIndex within the
│ │ │ │ +
142 // full local view.
│ │ │ │ +
143 size_t localIndex = localView_.tree().localIndex(i);
│ │ │ │ +
144 localDoFs_[localIndex] = dofs[localView_.index(localIndex)];
│ │ │ │ +
145 }
│ │ │ │ +
146 }
│ │ │ │ +
│ │ │ │ +
147
│ │ │ │ +
│ │ │ │ +
149 void unbind()
│ │ │ │ +
150 {
│ │ │ │ +
151 localView_.unbind();
│ │ │ │ +
152 }
│ │ │ │ +
│ │ │ │ +
153
│ │ │ │ +
│ │ │ │ +
155 bool bound() const
│ │ │ │ +
156 {
│ │ │ │ +
157 return localView_.bound();
│ │ │ │ +
158 }
│ │ │ │ +
│ │ │ │ +
159
│ │ │ │ +
│ │ │ │ +
161 const Element& localContext() const
│ │ │ │ +
162 {
│ │ │ │ +
163 return localView_.element();
│ │ │ │ +
164 }
│ │ │ │ +
│ │ │ │ +
165
│ │ │ │ +
166 protected:
│ │ │ │ +
167
│ │ │ │ +
168 template<class To, class From>
│ │ │ │ +
│ │ │ │ +
169 void assignWith(To& to, const From& from) const
│ │ │ │ +
170 {
│ │ │ │ +
171 auto from_flat = flatVectorView(from);
│ │ │ │ +
172 auto to_flat = flatVectorView(to);
│ │ │ │ +
173 assert(from_flat.size() == to_flat.size());
│ │ │ │ +
174 for (size_type i = 0; i < to_flat.size(); ++i)
│ │ │ │ +
175 to_flat[i] = from_flat[i];
│ │ │ │ +
176 }
│ │ │ │ +
│ │ │ │ +
177
│ │ │ │ +
178 template<class Node, class TreePath, class Range>
│ │ │ │ +
│ │ │ │ +
179 decltype(auto) nodeToRangeEntry(const Node& node, const TreePath& treePath, Range& y) const
│ │ │ │ +
180 {
│ │ │ │ +
181 return (*data_->nodeToRangeEntry)(node, treePath, y);
│ │ │ │ +
182 }
│ │ │ │ +
│ │ │ │ +
183
│ │ │ │ +
184 std::shared_ptr<const Data> data_;
│ │ │ │ +
185 LocalView localView_;
│ │ │ │ +
186 std::vector<Coefficient> localDoFs_;
│ │ │ │ +
187 };
│ │ │ │ +
│ │ │ │ +
188
│ │ │ │ +
189protected:
│ │ │ │ +
│ │ │ │ +
190 DiscreteGlobalBasisFunctionBase(const std::shared_ptr<const Data>& data)
│ │ │ │ +
191 : data_(data)
│ │ │ │ +
192 {
│ │ │ │ +
193 /* Nothing. */
│ │ │ │ +
194 }
│ │ │ │ +
│ │ │ │ +
195
│ │ │ │ +
196public:
│ │ │ │ +
197
│ │ │ │ +
│ │ │ │ +
199 const Basis& basis() const
│ │ │ │ +
200 {
│ │ │ │ +
201 return *data_->basis;
│ │ │ │ +
202 }
│ │ │ │ +
│ │ │ │ +
203
│ │ │ │ +
│ │ │ │ +
205 const Vector& dofs() const
│ │ │ │ +
206 {
│ │ │ │ +
207 return *data_->coefficients;
│ │ │ │ +
208 }
│ │ │ │ +
│ │ │ │ +
209
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
212 {
│ │ │ │ +
213 return *data_->nodeToRangeEntry;
│ │ │ │ +
214 }
│ │ │ │ +
│ │ │ │ +
215
│ │ │ │ +
│ │ │ │ +
217 const EntitySet& entitySet() const
│ │ │ │ +
218 {
│ │ │ │ +
219 return data_->entitySet;
│ │ │ │ +
220 }
│ │ │ │ +
│ │ │ │ +
221
│ │ │ │ +
222protected:
│ │ │ │ +
223 std::shared_ptr<const Data> data_;
│ │ │ │ +
224};
│ │ │ │ +
│ │ │ │ +
225
│ │ │ │ +
226} // namespace ImplDoc
│ │ │ │ +
│ │ │ │ +
227
│ │ │ │ +
228
│ │ │ │ +
229
│ │ │ │ +
230template<typename DGBF>
│ │ │ │ + │ │ │ │ +
232
│ │ │ │ +
276template<typename B, typename V,
│ │ │ │ +
277 typename NTRE = HierarchicNodeToRangeMap,
│ │ │ │ +
278 typename R = typename V::value_type>
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
281{
│ │ │ │ + │ │ │ │ +
283 using Data = typename Base::Data;
│ │ │ │ +
284
│ │ │ │ +
285public:
│ │ │ │ +
286 using Basis = typename Base::Basis;
│ │ │ │ +
287 using Vector = typename Base::Vector;
│ │ │ │ +
288
│ │ │ │ +
289 using Domain = typename Base::Domain;
│ │ │ │ +
290 using Range = R;
│ │ │ │ +
291
│ │ │ │ +
292 using Traits = Imp::GridFunctionTraits<Range(Domain), typename Base::EntitySet, DefaultDerivativeTraits, 16>;
│ │ │ │ +
293
│ │ │ │ +
294private:
│ │ │ │ +
295
│ │ │ │ +
296 template<class Node>
│ │ │ │ +
297 using LocalBasisRange = typename Node::FiniteElement::Traits::LocalBasisType::Traits::RangeType;
│ │ │ │ +
298 template<class Node>
│ │ │ │ +
299 using NodeData = typename std::vector<LocalBasisRange<Node>>;
│ │ │ │ +
300 using PerNodeEvaluationBuffer = typename TypeTree::TreeContainer<NodeData, typename Base::Tree>;
│ │ │ │ +
301
│ │ │ │ +
302public:
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
305 {
│ │ │ │ +
306 using LocalBase = typename Base::LocalFunctionBase;
│ │ │ │ +
307 using size_type = typename Base::Tree::size_type;
│ │ │ │ +
308 using LocalBase::nodeToRangeEntry;
│ │ │ │ +
309
│ │ │ │ +
310 public:
│ │ │ │ +
311
│ │ │ │ + │ │ │ │ +
313 using Domain = typename LocalBase::Domain;
│ │ │ │ + │ │ │ │ +
315 using Element = typename LocalBase::Element;
│ │ │ │ +
316
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
319 : LocalBase(globalFunction.data_)
│ │ │ │ +
320 , evaluationBuffer_(this->localView_.tree())
│ │ │ │ +
321 {
│ │ │ │ +
322 /* Nothing. */
│ │ │ │ +
323 }
│ │ │ │ +
│ │ │ │ +
324
│ │ │ │ +
│ │ │ │ +
334 Range operator()(const Domain& x) const
│ │ │ │ +
335 {
│ │ │ │ +
336 Range y;
│ │ │ │ +
337 istlVectorBackend(y) = 0;
│ │ │ │ +
338
│ │ │ │ +
339 TypeTree::forEachLeafNode(this->localView_.tree(), [&](auto&& node, auto&& treePath) {
│ │ │ │ +
340 const auto& fe = node.finiteElement();
│ │ │ │ +
341 const auto& localBasis = fe.localBasis();
│ │ │ │ +
342 auto& shapeFunctionValues = evaluationBuffer_[treePath];
│ │ │ │ +
343
│ │ │ │ +
344 localBasis.evaluateFunction(x, shapeFunctionValues);
│ │ │ │ +
345
│ │ │ │ +
346 // Compute linear combinations of basis function jacobian.
│ │ │ │ +
347 // Non-scalar coefficients of dimension coeffDim are handled by
│ │ │ │ +
348 // processing the coeffDim linear combinations independently
│ │ │ │ +
349 // and storing them as entries of an array.
│ │ │ │ +
350 using Value = LocalBasisRange< std::decay_t<decltype(node)> >;
│ │ │ │ +
351 static constexpr auto coeffDim = decltype(flatVectorView(this->localDoFs_[node.localIndex(0)]).size())::value;
│ │ │ │ +
352 auto values = std::array<Value, coeffDim>{};
│ │ │ │ +
353 istlVectorBackend(values) = 0;
│ │ │ │ +
354 for (size_type i = 0; i < localBasis.size(); ++i)
│ │ │ │ +
355 {
│ │ │ │ +
356 auto c = flatVectorView(this->localDoFs_[node.localIndex(i)]);
│ │ │ │ +
357 for (std::size_t j = 0; j < coeffDim; ++j)
│ │ │ │ +
358 values[j].axpy(c[j], shapeFunctionValues[i]);
│ │ │ │ +
359 }
│ │ │ │ +
360
│ │ │ │ +
361 // Assign computed values to node entry of range.
│ │ │ │ +
362 // Types are matched using the lexicographic ordering provided by flatVectorView.
│ │ │ │ +
363 LocalBase::assignWith(nodeToRangeEntry(node, treePath, y), values);
│ │ │ │ +
364 });
│ │ │ │ +
365
│ │ │ │ +
366 return y;
│ │ │ │ +
367 }
│ │ │ │ +
│ │ │ │ +
368
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
371 {
│ │ │ │ + │ │ │ │ +
373 if (lf.bound())
│ │ │ │ +
374 dlf.bind(lf.localContext());
│ │ │ │ +
375 return dlf;
│ │ │ │ +
376 }
│ │ │ │ +
│ │ │ │ +
377
│ │ │ │ +
378 private:
│ │ │ │ +
379 mutable PerNodeEvaluationBuffer evaluationBuffer_;
│ │ │ │ +
380 };
│ │ │ │ +
│ │ │ │ +
381
│ │ │ │ +
383 template<class B_T, class V_T, class NTRE_T>
│ │ │ │ +
│ │ │ │ +
384 DiscreteGlobalBasisFunction(B_T && basis, V_T && coefficients, NTRE_T&& nodeToRangeEntry)
│ │ │ │ +
385 : 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))}))
│ │ │ │ +
386 {}
│ │ │ │ +
│ │ │ │ +
387
│ │ │ │ +
│ │ │ │ +
389 DiscreteGlobalBasisFunction(std::shared_ptr<const Basis> basis, std::shared_ptr<const V> coefficients, std::shared_ptr<const typename Base::NodeToRangeEntry> nodeToRangeEntry)
│ │ │ │ +
390 : Base(std::make_shared<Data>(Data{{basis->gridView()}, basis, coefficients, nodeToRangeEntry}))
│ │ │ │ +
391 {}
│ │ │ │ +
│ │ │ │ +
392
│ │ │ │ +
│ │ │ │ +
398 Range operator() (const Domain& x) const
│ │ │ │ +
399 {
│ │ │ │ +
400 HierarchicSearch search(this->data_->basis->gridView().grid(), this->data_->basis->gridView().indexSet());
│ │ │ │ +
401
│ │ │ │ +
402 const auto e = search.findEntity(x);
│ │ │ │ +
403 auto localThis = localFunction(*this);
│ │ │ │ +
404 localThis.bind(e);
│ │ │ │ +
405 return localThis(e.geometry().local(x));
│ │ │ │ +
406 }
│ │ │ │ +
│ │ │ │ +
407
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
410 {
│ │ │ │ + │ │ │ │ +
412 }
│ │ │ │ +
│ │ │ │ +
413
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
423 {
│ │ │ │ +
424 return LocalFunction(t);
│ │ │ │ +
425 }
│ │ │ │ +
│ │ │ │ +
426};
│ │ │ │ +
│ │ │ │ +
427
│ │ │ │ +
428
│ │ │ │ +
453template<typename R, typename B, typename V>
│ │ │ │ +
│ │ │ │ +
454auto makeDiscreteGlobalBasisFunction(B&& basis, V&& vector)
│ │ │ │ +
455{
│ │ │ │ +
456 using Basis = std::decay_t<B>;
│ │ │ │ +
457 using NTREM = HierarchicNodeToRangeMap;
│ │ │ │ +
458
│ │ │ │ +
459 // Small helper functions to wrap vectors using istlVectorBackend
│ │ │ │ +
460 // if they do not already satisfy the VectorBackend interface.
│ │ │ │ +
461 auto toConstVectorBackend = [&](auto&& v) -> decltype(auto) {
│ │ │ │ +
462 if constexpr (models<Concept::ConstVectorBackend<Basis>, decltype(v)>()) {
│ │ │ │ +
463 return std::forward<decltype(v)>(v);
│ │ │ │ +
464 } else {
│ │ │ │ +
465 return istlVectorBackend(v);
│ │ │ │ +
466 }
│ │ │ │ +
467 };
│ │ │ │ +
468
│ │ │ │ +
469 using Vector = std::decay_t<decltype(toConstVectorBackend(std::forward<V>(vector)))>;
│ │ │ │ + │ │ │ │ +
471 std::forward<B>(basis),
│ │ │ │ +
472 toConstVectorBackend(std::forward<V>(vector)),
│ │ │ │ + │ │ │ │ +
474}
│ │ │ │ +
│ │ │ │ +
475
│ │ │ │ +
476
│ │ │ │ +
491template<typename DGBF>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
493 : public ImplDoc::DiscreteGlobalBasisFunctionBase<typename DGBF::Basis, typename DGBF::Vector, typename DGBF::NodeToRangeEntry>
│ │ │ │ +
494{
│ │ │ │ + │ │ │ │ +
496 using Data = typename Base::Data;
│ │ │ │ +
497
│ │ │ │ +
498public:
│ │ │ │ + │ │ │ │ +
500
│ │ │ │ +
501 using Basis = typename Base::Basis;
│ │ │ │ +
502 using Vector = typename Base::Vector;
│ │ │ │ +
503
│ │ │ │ +
504 using Domain = typename Base::Domain;
│ │ │ │ + │ │ │ │ +
506
│ │ │ │ +
507 using Traits = Imp::GridFunctionTraits<Range(Domain), typename Base::EntitySet, DefaultDerivativeTraits, 16>;
│ │ │ │ +
508
│ │ │ │ +
509private:
│ │ │ │ +
510
│ │ │ │ +
511 template<class Node>
│ │ │ │ +
512 using LocalBasisRange = typename Node::FiniteElement::Traits::LocalBasisType::Traits::JacobianType;
│ │ │ │ +
513 template<class Node>
│ │ │ │ +
514 using NodeData = typename std::vector< LocalBasisRange<Node> >;
│ │ │ │ +
515 using PerNodeEvaluationBuffer = typename TypeTree::TreeContainer<NodeData, typename Base::Tree>;
│ │ │ │ +
516
│ │ │ │ +
517public:
│ │ │ │ +
518
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
528 {
│ │ │ │ +
529 using LocalBase = typename Base::LocalFunctionBase;
│ │ │ │ +
530 using size_type = typename Base::Tree::size_type;
│ │ │ │ +
531 using LocalBase::nodeToRangeEntry;
│ │ │ │ +
532
│ │ │ │ +
533 public:
│ │ │ │ + │ │ │ │ +
535 using Domain = typename LocalBase::Domain;
│ │ │ │ + │ │ │ │ +
537 using Element = typename LocalBase::Element;
│ │ │ │ +
538
│ │ │ │ +
│ │ │ │ +
540 LocalFunction(const GlobalFunction& globalFunction)
│ │ │ │ +
541 : LocalBase(globalFunction.data_)
│ │ │ │ +
542 , evaluationBuffer_(this->localView_.tree())
│ │ │ │ +
543 {
│ │ │ │ +
544 /* Nothing. */
│ │ │ │ +
545 }
│ │ │ │ +
│ │ │ │ +
546
│ │ │ │ +
│ │ │ │ +
553 void bind(const Element& element)
│ │ │ │ +
554 {
│ │ │ │ +
555 LocalBase::bind(element);
│ │ │ │ +
556 geometry_.emplace(element.geometry());
│ │ │ │ +
557 }
│ │ │ │ +
│ │ │ │ +
558
│ │ │ │ +
│ │ │ │ +
560 void unbind()
│ │ │ │ +
561 {
│ │ │ │ +
562 geometry_.reset();
│ │ │ │ +
563 LocalBase::unbind();
│ │ │ │ +
564 }
│ │ │ │ +
│ │ │ │ +
565
│ │ │ │ +
│ │ │ │ +
579 Range operator()(const Domain& x) const
│ │ │ │ +
580 {
│ │ │ │ +
581 Range y;
│ │ │ │ +
582 istlVectorBackend(y) = 0;
│ │ │ │ +
583
│ │ │ │ +
584 const auto& jacobianInverse = geometry_->jacobianInverse(x);
│ │ │ │ +
585
│ │ │ │ +
586 TypeTree::forEachLeafNode(this->localView_.tree(), [&](auto&& node, auto&& treePath) {
│ │ │ │ +
587 const auto& fe = node.finiteElement();
│ │ │ │ +
588 const auto& localBasis = fe.localBasis();
│ │ │ │ +
589 auto& shapeFunctionJacobians = evaluationBuffer_[treePath];
│ │ │ │ +
590
│ │ │ │ +
591 localBasis.evaluateJacobian(x, shapeFunctionJacobians);
│ │ │ │ +
592
│ │ │ │ +
593 // Compute linear combinations of basis function jacobian.
│ │ │ │ +
594 // Non-scalar coefficients of dimension coeffDim are handled by
│ │ │ │ +
595 // processing the coeffDim linear combinations independently
│ │ │ │ +
596 // and storing them as entries of an array.
│ │ │ │ +
597 using RefJacobian = LocalBasisRange< std::decay_t<decltype(node)> >;
│ │ │ │ +
598 static constexpr auto coeffDim = decltype(flatVectorView(this->localDoFs_[node.localIndex(0)]).size())::value;
│ │ │ │ +
599 auto refJacobians = std::array<RefJacobian, coeffDim>{};
│ │ │ │ +
600 istlVectorBackend(refJacobians) = 0;
│ │ │ │ +
601 for (size_type i = 0; i < localBasis.size(); ++i)
│ │ │ │ +
602 {
│ │ │ │ +
603 auto c = flatVectorView(this->localDoFs_[node.localIndex(i)]);
│ │ │ │ +
604 for (std::size_t j = 0; j < coeffDim; ++j)
│ │ │ │ +
605 refJacobians[j].axpy(c[j], shapeFunctionJacobians[i]);
│ │ │ │ +
606 }
│ │ │ │ +
607
│ │ │ │ +
608 // Transform Jacobians form local to global coordinates.
│ │ │ │ +
609 using Jacobian = decltype(refJacobians[0] * jacobianInverse);
│ │ │ │ +
610 auto jacobians = std::array<Jacobian, coeffDim>{};
│ │ │ │ +
611 std::transform(
│ │ │ │ +
612 refJacobians.begin(), refJacobians.end(), jacobians.begin(),
│ │ │ │ +
613 [&](const auto& refJacobian) { return refJacobian * jacobianInverse; });
│ │ │ │ +
614
│ │ │ │ +
615 // Assign computed Jacobians to node entry of range.
│ │ │ │ +
616 // Types are matched using the lexicographic ordering provided by flatVectorView.
│ │ │ │ +
617 LocalBase::assignWith(nodeToRangeEntry(node, treePath, y), jacobians);
│ │ │ │ +
618 });
│ │ │ │ +
619
│ │ │ │ +
620 return y;
│ │ │ │ +
621 }
│ │ │ │ +
│ │ │ │ +
622
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
625 {
│ │ │ │ +
626 DUNE_THROW(NotImplemented, "derivative of derivative is not implemented");
│ │ │ │ +
627 }
│ │ │ │ +
│ │ │ │ +
628
│ │ │ │ +
629 private:
│ │ │ │ +
630 mutable PerNodeEvaluationBuffer evaluationBuffer_;
│ │ │ │ +
631 std::optional<typename Element::Geometry> geometry_;
│ │ │ │ +
632 };
│ │ │ │ +
│ │ │ │ +
633
│ │ │ │ +
│ │ │ │ +
640 DiscreteGlobalBasisFunctionDerivative(const std::shared_ptr<const Data>& data)
│ │ │ │ +
641 : Base(data)
│ │ │ │ +
642 {
│ │ │ │ +
643 /* Nothing. */
│ │ │ │ +
644 }
│ │ │ │ +
│ │ │ │ +
645
│ │ │ │ +
│ │ │ │ +
651 Range operator()(const Domain& x) const
│ │ │ │ +
652 {
│ │ │ │ +
653 HierarchicSearch search(this->data_->basis->gridView().grid(), this->data_->basis->gridView().indexSet());
│ │ │ │ +
654
│ │ │ │ +
655 const auto e = search.findEntity(x);
│ │ │ │ +
656 auto localThis = localFunction(*this);
│ │ │ │ +
657 localThis.bind(e);
│ │ │ │ +
658 return localThis(e.geometry().local(x));
│ │ │ │ +
659 }
│ │ │ │ +
│ │ │ │ +
660
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
662 {
│ │ │ │ +
663 DUNE_THROW(NotImplemented, "derivative of derivative is not implemented");
│ │ │ │ +
664 }
│ │ │ │ +
│ │ │ │ +
665
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
668 {
│ │ │ │ +
669 return LocalFunction(f);
│ │ │ │ +
670 }
│ │ │ │ +
│ │ │ │ +
671};
│ │ │ │ +
│ │ │ │ +
672
│ │ │ │ +
673
│ │ │ │ +
674} // namespace Functions
│ │ │ │ +
675} // namespace Dune
│ │ │ │ +
676
│ │ │ │ +
677#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
auto makeDiscreteGlobalBasisFunction(B &&basis, V &&vector)
Generate a DiscreteGlobalBasisFunction.
Definition discreteglobalbasisfunction.hh:454
│ │ │ │ +
auto istlVectorBackend(Vector &v)
Return a vector backend wrapping non-const ISTL like containers.
Definition istlvectorbackend.hh:350
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
Dummy range class to be used if no proper type is available.
Definition defaultderivativetraits.hh:27
│ │ │ │ +
auto flatVectorView(T &t)
Create flat vector view of passed mutable container.
Definition flatvectorview.hh:183
│ │ │ │
Default implementation for derivative traits.
Definition defaultderivativetraits.hh:41
│ │ │ │ -
InvalidRange Range
Range of derivative for function with given signature.
Definition defaultderivativetraits.hh:43
│ │ │ │ -
double Range
Range of derivative for function with given signature.
Definition defaultderivativetraits.hh:58
│ │ │ │ -
FieldVector< K, n > Range
Range of derivative for function with given signature.
Definition defaultderivativetraits.hh:74
│ │ │ │ -
FieldMatrix< K, m, n > Range
Range of derivative for function with given signature.
Definition defaultderivativetraits.hh:90
│ │ │ │ -
FieldMatrix< K, m, n > Range
Range of derivative for function with given signature.
Definition defaultderivativetraits.hh:106
│ │ │ │ +
Helper class to deduce the signature of a callable.
Definition signature.hh:60
│ │ │ │ +
A simple node to range map using the nested tree indices.
Definition hierarchicnodetorangemap.hh:34
│ │ │ │ +
Definition discreteglobalbasisfunction.hh:34
│ │ │ │ +
std::shared_ptr< const Data > data_
Definition discreteglobalbasisfunction.hh:223
│ │ │ │ +
const Vector & dofs() const
Return the coefficients of this discrete function by reference.
Definition discreteglobalbasisfunction.hh:205
│ │ │ │ +
B Basis
Definition discreteglobalbasisfunction.hh:36
│ │ │ │ +
typename Basis::LocalView::Tree Tree
Definition discreteglobalbasisfunction.hh:45
│ │ │ │ +
V Vector
Definition discreteglobalbasisfunction.hh:37
│ │ │ │ +
typename EntitySet::Element Element
Definition discreteglobalbasisfunction.hh:51
│ │ │ │ +
typename EntitySet::LocalCoordinate LocalDomain
Definition discreteglobalbasisfunction.hh:50
│ │ │ │ +
const NodeToRangeEntry & nodeToRangeEntry() const
Return the stored node-to-range map.
Definition discreteglobalbasisfunction.hh:211
│ │ │ │ +
NTRE NodeToRangeEntry
Definition discreteglobalbasisfunction.hh:46
│ │ │ │ +
DiscreteGlobalBasisFunctionBase(const std::shared_ptr< const Data > &data)
Definition discreteglobalbasisfunction.hh:190
│ │ │ │ +
typename Basis::GridView GridView
Definition discreteglobalbasisfunction.hh:43
│ │ │ │ +
const Basis & basis() const
Return a const reference to the stored basis.
Definition discreteglobalbasisfunction.hh:199
│ │ │ │ +
GridViewEntitySet< GridView, 0 > EntitySet
Definition discreteglobalbasisfunction.hh:44
│ │ │ │ +
const EntitySet & entitySet() const
Get associated set of entities the local-function can be bound to.
Definition discreteglobalbasisfunction.hh:217
│ │ │ │ +
typename EntitySet::GlobalCoordinate Domain
Definition discreteglobalbasisfunction.hh:48
│ │ │ │ +
Dune::AutonomousValue< decltype(std::declval< Vector >()[std::declval< typename Basis::MultiIndex >()])> Coefficient
Definition discreteglobalbasisfunction.hh:41
│ │ │ │ +
Definition discreteglobalbasisfunction.hh:59
│ │ │ │ +
EntitySet entitySet
Definition discreteglobalbasisfunction.hh:60
│ │ │ │ +
std::shared_ptr< const NodeToRangeEntry > nodeToRangeEntry
Definition discreteglobalbasisfunction.hh:63
│ │ │ │ +
std::shared_ptr< const Basis > basis
Definition discreteglobalbasisfunction.hh:61
│ │ │ │ +
std::shared_ptr< const Vector > coefficients
Definition discreteglobalbasisfunction.hh:62
│ │ │ │ + │ │ │ │ +
LocalFunctionBase & operator=(const LocalFunctionBase &other)
Copy-assignment of the local-function.
Definition discreteglobalbasisfunction.hh:106
│ │ │ │ +
bool bound() const
Check if LocalFunction is already bound to an element.
Definition discreteglobalbasisfunction.hh:155
│ │ │ │ +
void bind(const Element &element)
Bind LocalFunction to grid element.
Definition discreteglobalbasisfunction.hh:122
│ │ │ │ +
typename EntitySet::Element Element
Definition discreteglobalbasisfunction.hh:74
│ │ │ │ +
const Element & localContext() const
Return the element the local-function is bound to.
Definition discreteglobalbasisfunction.hh:161
│ │ │ │ +
LocalFunctionBase(const LocalFunctionBase &other)
Copy-construct the local-function.
Definition discreteglobalbasisfunction.hh:90
│ │ │ │ +
std::vector< Coefficient > localDoFs_
Definition discreteglobalbasisfunction.hh:186
│ │ │ │ +
void assignWith(To &to, const From &from) const
Definition discreteglobalbasisfunction.hh:169
│ │ │ │ +
std::shared_ptr< const Data > data_
Definition discreteglobalbasisfunction.hh:184
│ │ │ │ +
decltype(auto) nodeToRangeEntry(const Node &node, const TreePath &treePath, Range &y) const
Definition discreteglobalbasisfunction.hh:179
│ │ │ │ +
LocalView localView_
Definition discreteglobalbasisfunction.hh:185
│ │ │ │ +
void unbind()
Unbind the local-function.
Definition discreteglobalbasisfunction.hh:149
│ │ │ │ +
LocalDomain Domain
Definition discreteglobalbasisfunction.hh:73
│ │ │ │ +
LocalFunctionBase(const std::shared_ptr< const Data > &data)
Definition discreteglobalbasisfunction.hh:77
│ │ │ │ +
Derivative of a DiscreteGlobalBasisFunction
Definition discreteglobalbasisfunction.hh:494
│ │ │ │ +
typename Base::Basis Basis
Definition discreteglobalbasisfunction.hh:501
│ │ │ │ +
friend Traits::DerivativeInterface derivative(const DiscreteGlobalBasisFunctionDerivative &f)
Definition discreteglobalbasisfunction.hh:661
│ │ │ │ +
Range operator()(const Domain &x) const
Evaluate the discrete grid-function derivative in global coordinates.
Definition discreteglobalbasisfunction.hh:651
│ │ │ │ +
typename SignatureTraits< typename DiscreteGlobalBasisFunction::Traits::DerivativeInterface >::Range Range
Definition discreteglobalbasisfunction.hh:505
│ │ │ │ +
friend LocalFunction localFunction(const DiscreteGlobalBasisFunctionDerivative &f)
Construct local function from a DiscreteGlobalBasisFunctionDerivative
Definition discreteglobalbasisfunction.hh:667
│ │ │ │ +
DiscreteGlobalBasisFunctionDerivative(const std::shared_ptr< const Data > &data)
create object from DiscreateGlobalBasisFunction data
Definition discreteglobalbasisfunction.hh:640
│ │ │ │ +
DGBF DiscreteGlobalBasisFunction
Definition discreteglobalbasisfunction.hh:499
│ │ │ │ +
typename Base::Vector Vector
Definition discreteglobalbasisfunction.hh:502
│ │ │ │ +
Imp::GridFunctionTraits< Range(Domain), typename Base::EntitySet, DefaultDerivativeTraits, 16 > Traits
Definition discreteglobalbasisfunction.hh:507
│ │ │ │ +
typename Base::Domain Domain
Definition discreteglobalbasisfunction.hh:504
│ │ │ │ +
A grid function induced by a global basis and a coefficient vector.
Definition discreteglobalbasisfunction.hh:281
│ │ │ │ +
friend DiscreteGlobalBasisFunctionDerivative< DiscreteGlobalBasisFunction > derivative(const DiscreteGlobalBasisFunction &f)
Derivative of the DiscreteGlobalBasisFunction
Definition discreteglobalbasisfunction.hh:409
│ │ │ │ +
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:384
│ │ │ │ +
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:389
│ │ │ │ +
friend LocalFunction localFunction(const DiscreteGlobalBasisFunction &t)
Construct local function from a DiscreteGlobalBasisFunction.
Definition discreteglobalbasisfunction.hh:422
│ │ │ │ +
typename Base::Basis Basis
Definition discreteglobalbasisfunction.hh:286
│ │ │ │ +
Imp::GridFunctionTraits< Range(Domain), typename Base::EntitySet, DefaultDerivativeTraits, 16 > Traits
Definition discreteglobalbasisfunction.hh:292
│ │ │ │ +
R Range
Definition discreteglobalbasisfunction.hh:290
│ │ │ │ +
typename Base::Vector Vector
Definition discreteglobalbasisfunction.hh:287
│ │ │ │ +
typename Base::Domain Domain
Definition discreteglobalbasisfunction.hh:289
│ │ │ │ +
Definition discreteglobalbasisfunction.hh:305
│ │ │ │ +
GlobalFunction::Range Range
Definition discreteglobalbasisfunction.hh:314
│ │ │ │ +
typename LocalBase::Domain Domain
Definition discreteglobalbasisfunction.hh:313
│ │ │ │ +
LocalFunction(const DiscreteGlobalBasisFunction &globalFunction)
Create a local-function from the associated grid-function.
Definition discreteglobalbasisfunction.hh:318
│ │ │ │ +
friend DiscreteGlobalBasisFunctionDerivative< DiscreteGlobalBasisFunction >::LocalFunction derivative(const LocalFunction &lf)
Local function of the derivative.
Definition discreteglobalbasisfunction.hh:370
│ │ │ │ +
Range operator()(const Domain &x) const
Evaluate this local-function in coordinates x in the bound element.
Definition discreteglobalbasisfunction.hh:334
│ │ │ │ +
typename LocalBase::Element Element
Definition discreteglobalbasisfunction.hh:315
│ │ │ │ +
local function evaluating the derivative in reference coordinates
Definition discreteglobalbasisfunction.hh:528
│ │ │ │ +
Range operator()(const Domain &x) const
Evaluate this local-function in coordinates x in the bound element.
Definition discreteglobalbasisfunction.hh:579
│ │ │ │ +
typename LocalBase::Domain Domain
Definition discreteglobalbasisfunction.hh:535
│ │ │ │ +
typename LocalBase::Element Element
Definition discreteglobalbasisfunction.hh:537
│ │ │ │ +
friend Traits::LocalFunctionTraits::DerivativeInterface derivative(const LocalFunction &)
Not implemented.
Definition discreteglobalbasisfunction.hh:624
│ │ │ │ +
GlobalFunction::Range Range
Definition discreteglobalbasisfunction.hh:536
│ │ │ │ +
void unbind()
Unbind the local-function.
Definition discreteglobalbasisfunction.hh:560
│ │ │ │ +
LocalFunction(const GlobalFunction &globalFunction)
Create a local function from the associated grid function.
Definition discreteglobalbasisfunction.hh:540
│ │ │ │ +
void bind(const Element &element)
Bind LocalFunction to grid element.
Definition discreteglobalbasisfunction.hh:553
│ │ │ │ +
Definition gridfunction.hh:36
│ │ │ │ + │ │ │ │ +
GridView::template Codim< codim >::Entity Element
Type of Elements contained in this EntitySet.
Definition gridviewentityset.hh:36
│ │ │ │ +
Element::Geometry::LocalCoordinate LocalCoordinate
Type of local coordinates with respect to the Element.
Definition gridviewentityset.hh:39
│ │ │ │ +
Element::Geometry::GlobalCoordinate GlobalCoordinate
Definition gridviewentityset.hh:40
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,103 +1,871 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _c_o_m_m_o_n │ │ │ │ │ -defaultderivativetraits.hh │ │ │ │ │ + * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ +discreteglobalbasisfunction.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_COMMON_DEFAULT_DERIVATIVE_TRAITS_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_COMMON_DEFAULT_DERIVATIVE_TRAITS_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ 12 │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15 │ │ │ │ │ -16namespace _D_u_n_e { │ │ │ │ │ -17namespace Functions { │ │ │ │ │ +13#include │ │ │ │ │ +14 │ │ │ │ │ +15#include │ │ │ │ │ +16 │ │ │ │ │ +17#include │ │ │ │ │ 18 │ │ │ │ │ -19 │ │ │ │ │ -20 │ │ │ │ │ -_2_6class _I_n_v_a_l_i_d_R_a_n_g_e │ │ │ │ │ -27{}; │ │ │ │ │ +19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_h_i_e_r_a_r_c_h_i_c_n_o_d_e_t_o_r_a_n_g_e_m_a_p_._h_h> │ │ │ │ │ +20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_f_l_a_t_v_e_c_t_o_r_v_i_e_w_._h_h> │ │ │ │ │ +21#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h> │ │ │ │ │ +22#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ +23#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_b_a_c_k_e_n_d_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +24#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_b_a_c_k_e_n_d_s_/_i_s_t_l_v_e_c_t_o_r_b_a_c_k_e_n_d_._h_h> │ │ │ │ │ +25 │ │ │ │ │ +26namespace _D_u_n_e { │ │ │ │ │ +27namespace Functions { │ │ │ │ │ 28 │ │ │ │ │ 29 │ │ │ │ │ -39template │ │ │ │ │ -_4_0struct _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ -41{ │ │ │ │ │ -_4_3 typedef _I_n_v_a_l_i_d_R_a_n_g_e _R_a_n_g_e; │ │ │ │ │ -44}; │ │ │ │ │ -45 │ │ │ │ │ -46 │ │ │ │ │ -54template<> │ │ │ │ │ -_5_5struct _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s< double(double) > │ │ │ │ │ -56{ │ │ │ │ │ -_5_8 typedef double _R_a_n_g_e; │ │ │ │ │ -59}; │ │ │ │ │ -60 │ │ │ │ │ -70template │ │ │ │ │ -_7_1struct _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s)> │ │ │ │ │ -72{ │ │ │ │ │ -_7_4 typedef FieldVector _R_a_n_g_e; │ │ │ │ │ -75}; │ │ │ │ │ -76 │ │ │ │ │ -86template │ │ │ │ │ -_8_7struct _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s(FieldVector)> │ │ │ │ │ -88{ │ │ │ │ │ -_9_0 typedef FieldMatrix _R_a_n_g_e; │ │ │ │ │ -91}; │ │ │ │ │ -92 │ │ │ │ │ -102template │ │ │ │ │ -_1_0_3struct _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s(FieldVector)> │ │ │ │ │ -104{ │ │ │ │ │ -_1_0_6 typedef FieldMatrix _R_a_n_g_e; │ │ │ │ │ -107}; │ │ │ │ │ -108 │ │ │ │ │ -109 │ │ │ │ │ -110}} // namespace Dune::Functions │ │ │ │ │ -111 │ │ │ │ │ -112 │ │ │ │ │ -113#endif // DUNE_FUNCTIONS_COMMON_DEFAULT_DERIVATIVE_TRAITS_HH │ │ │ │ │ +_3_0namespace ImplDoc { │ │ │ │ │ +31 │ │ │ │ │ +32template │ │ │ │ │ +_3_3class _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e │ │ │ │ │ +34{ │ │ │ │ │ +35public: │ │ │ │ │ +_3_6 using _B_a_s_i_s = B; │ │ │ │ │ +_3_7 using _V_e_c_t_o_r = V; │ │ │ │ │ +38 │ │ │ │ │ +39 // In order to make the cache work for proxy-references │ │ │ │ │ +40 // we have to use AutonomousValue instead of std::decay_t │ │ │ │ │ +_4_1 using _C_o_e_f_f_i_c_i_e_n_t = Dune::AutonomousValue() │ │ │ │ │ +[std::declval()])>; │ │ │ │ │ +42 │ │ │ │ │ +_4_3 using _G_r_i_d_V_i_e_w = typename Basis::GridView; │ │ │ │ │ +_4_4 using _E_n_t_i_t_y_S_e_t = _G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_G_r_i_d_V_i_e_w_,_ _0_>; │ │ │ │ │ +_4_5 using _T_r_e_e = typename Basis::LocalView::Tree; │ │ │ │ │ +_4_6 using _N_o_d_e_T_o_R_a_n_g_e_E_n_t_r_y = NTRE; │ │ │ │ │ +47 │ │ │ │ │ +_4_8 using _D_o_m_a_i_n = typename _E_n_t_i_t_y_S_e_t_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ +49 │ │ │ │ │ +_5_0 using _L_o_c_a_l_D_o_m_a_i_n = typename _E_n_t_i_t_y_S_e_t_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ +_5_1 using _E_l_e_m_e_n_t = typename _E_n_t_i_t_y_S_e_t_:_:_E_l_e_m_e_n_t; │ │ │ │ │ +52 │ │ │ │ │ +53protected: │ │ │ │ │ +54 │ │ │ │ │ +55 // This collects all data that is shared by all related │ │ │ │ │ +56 // global and local functions. This way we don't need to │ │ │ │ │ +57 // keep track of it individually. │ │ │ │ │ +_5_8 struct _D_a_t_a │ │ │ │ │ +59 { │ │ │ │ │ +_6_0 _E_n_t_i_t_y_S_e_t _e_n_t_i_t_y_S_e_t; │ │ │ │ │ +_6_1 std::shared_ptr _b_a_s_i_s; │ │ │ │ │ +_6_2 std::shared_ptr _c_o_e_f_f_i_c_i_e_n_t_s; │ │ │ │ │ +_6_3 std::shared_ptr _n_o_d_e_T_o_R_a_n_g_e_E_n_t_r_y; │ │ │ │ │ +64 }; │ │ │ │ │ +65 │ │ │ │ │ +66public: │ │ │ │ │ +_6_7 class _L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e │ │ │ │ │ +68 { │ │ │ │ │ +69 using LocalView = typename Basis::LocalView; │ │ │ │ │ +70 using size_type = typename Tree::size_type; │ │ │ │ │ +71 │ │ │ │ │ +72 public: │ │ │ │ │ +_7_3 using _D_o_m_a_i_n = _L_o_c_a_l_D_o_m_a_i_n; │ │ │ │ │ +_7_4 using _E_l_e_m_e_n_t = typename _E_n_t_i_t_y_S_e_t_:_:_E_l_e_m_e_n_t; │ │ │ │ │ +75 │ │ │ │ │ +76 protected: │ │ │ │ │ +_7_7 _L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e(const std::shared_ptr& data) │ │ │ │ │ +78 : _d_a_t_a__(data) │ │ │ │ │ +79 , _l_o_c_a_l_V_i_e_w__(_d_a_t_a__->_b_a_s_i_s->localView()) │ │ │ │ │ +80 { │ │ │ │ │ +81 _l_o_c_a_l_D_o_F_s__.reserve(_l_o_c_a_l_V_i_e_w__.maxSize()); │ │ │ │ │ +82 } │ │ │ │ │ +83 │ │ │ │ │ +_9_0 _L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e(const _L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e& other) │ │ │ │ │ +91 : _d_a_t_a__(other._d_a_t_a__) │ │ │ │ │ +92 , _l_o_c_a_l_V_i_e_w__(other._l_o_c_a_l_V_i_e_w__) │ │ │ │ │ +93 { │ │ │ │ │ +94 _l_o_c_a_l_D_o_F_s__.reserve(_l_o_c_a_l_V_i_e_w__.maxSize()); │ │ │ │ │ +95 if (_b_o_u_n_d()) │ │ │ │ │ +96 _l_o_c_a_l_D_o_F_s__ = other._l_o_c_a_l_D_o_F_s__; │ │ │ │ │ +97 } │ │ │ │ │ +98 │ │ │ │ │ +_1_0_6 _L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e& _o_p_e_r_a_t_o_r_=(const _L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e& other) │ │ │ │ │ +107 { │ │ │ │ │ +108 _d_a_t_a__ = other._d_a_t_a__; │ │ │ │ │ +109 _l_o_c_a_l_V_i_e_w__ = other._l_o_c_a_l_V_i_e_w__; │ │ │ │ │ +110 if (_b_o_u_n_d()) │ │ │ │ │ +111 _l_o_c_a_l_D_o_F_s__ = other._l_o_c_a_l_D_o_F_s__; │ │ │ │ │ +112 return *this; │ │ │ │ │ +113 } │ │ │ │ │ +114 │ │ │ │ │ +115 public: │ │ │ │ │ +_1_2_2 void _b_i_n_d(const _E_l_e_m_e_n_t& element) │ │ │ │ │ +123 { │ │ │ │ │ +124 _l_o_c_a_l_V_i_e_w__.bind(element); │ │ │ │ │ +125 // Use cache of full local view size. For a subspace basis, │ │ │ │ │ +126 // this may be larger than the number of local DOFs in the │ │ │ │ │ +127 // tree. In this case only cache entries associated to local │ │ │ │ │ +128 // DOFs in the subspace are filled. Cache entries associated │ │ │ │ │ +129 // to local DOFs which are not contained in the subspace will │ │ │ │ │ +130 // not be touched. │ │ │ │ │ +131 // │ │ │ │ │ +132 // Alternatively one could use a cache that exactly fits │ │ │ │ │ +133 // the size of the tree. However, this would require to │ │ │ │ │ +134 // subtract an offset from localIndex(i) on each cache │ │ │ │ │ +135 // access in operator(). │ │ │ │ │ +136 _l_o_c_a_l_D_o_F_s__.resize(_l_o_c_a_l_V_i_e_w__.size()); │ │ │ │ │ +137 const auto& _d_o_f_s = *_d_a_t_a__->coefficients; │ │ │ │ │ +138 for (size_type i = 0; i < _l_o_c_a_l_V_i_e_w__.tree().size(); ++i) │ │ │ │ │ +139 { │ │ │ │ │ +140 // For a subspace basis the index-within-tree i │ │ │ │ │ +141 // is not the same as the localIndex within the │ │ │ │ │ +142 // full local view. │ │ │ │ │ +143 size_t localIndex = _l_o_c_a_l_V_i_e_w__.tree().localIndex(i); │ │ │ │ │ +144 _l_o_c_a_l_D_o_F_s__[localIndex] = _d_o_f_s[_l_o_c_a_l_V_i_e_w__.index(localIndex)]; │ │ │ │ │ +145 } │ │ │ │ │ +146 } │ │ │ │ │ +147 │ │ │ │ │ +_1_4_9 void _u_n_b_i_n_d() │ │ │ │ │ +150 { │ │ │ │ │ +151 _l_o_c_a_l_V_i_e_w__.unbind(); │ │ │ │ │ +152 } │ │ │ │ │ +153 │ │ │ │ │ +_1_5_5 bool _b_o_u_n_d() const │ │ │ │ │ +156 { │ │ │ │ │ +157 return _l_o_c_a_l_V_i_e_w__.bound(); │ │ │ │ │ +158 } │ │ │ │ │ +159 │ │ │ │ │ +_1_6_1 const _E_l_e_m_e_n_t& _l_o_c_a_l_C_o_n_t_e_x_t() const │ │ │ │ │ +162 { │ │ │ │ │ +163 return _l_o_c_a_l_V_i_e_w__.element(); │ │ │ │ │ +164 } │ │ │ │ │ +165 │ │ │ │ │ +166 protected: │ │ │ │ │ +167 │ │ │ │ │ +168 template │ │ │ │ │ +_1_6_9 void _a_s_s_i_g_n_W_i_t_h(To& to, const From& from) const │ │ │ │ │ +170 { │ │ │ │ │ +171 auto from_flat = _f_l_a_t_V_e_c_t_o_r_V_i_e_w(from); │ │ │ │ │ +172 auto to_flat = _f_l_a_t_V_e_c_t_o_r_V_i_e_w(to); │ │ │ │ │ +173 assert(from_flat.size() == to_flat.size()); │ │ │ │ │ +174 for (size_type i = 0; i < to_flat.size(); ++i) │ │ │ │ │ +175 to_flat[i] = from_flat[i]; │ │ │ │ │ +176 } │ │ │ │ │ +177 │ │ │ │ │ +178 template │ │ │ │ │ +_1_7_9 decltype(auto) _n_o_d_e_T_o_R_a_n_g_e_E_n_t_r_y(const Node& node, const TreePath& treePath, │ │ │ │ │ +Range& y) const │ │ │ │ │ +180 { │ │ │ │ │ +181 return (*_d_a_t_a__->nodeToRangeEntry)(node, treePath, y); │ │ │ │ │ +182 } │ │ │ │ │ +183 │ │ │ │ │ +_1_8_4 std::shared_ptr _d_a_t_a__; │ │ │ │ │ +_1_8_5 LocalView _l_o_c_a_l_V_i_e_w__; │ │ │ │ │ +_1_8_6 std::vector _l_o_c_a_l_D_o_F_s__; │ │ │ │ │ +187 }; │ │ │ │ │ +188 │ │ │ │ │ +189protected: │ │ │ │ │ +_1_9_0 _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e(const std::shared_ptr& data) │ │ │ │ │ +191 : _d_a_t_a__(data) │ │ │ │ │ +192 { │ │ │ │ │ +193 /* Nothing. */ │ │ │ │ │ +194 } │ │ │ │ │ +195 │ │ │ │ │ +196public: │ │ │ │ │ +197 │ │ │ │ │ +_1_9_9 const _B_a_s_i_s& _b_a_s_i_s() const │ │ │ │ │ +200 { │ │ │ │ │ +201 return *_d_a_t_a__->basis; │ │ │ │ │ +202 } │ │ │ │ │ +203 │ │ │ │ │ +_2_0_5 const _V_e_c_t_o_r& _d_o_f_s() const │ │ │ │ │ +206 { │ │ │ │ │ +207 return *_d_a_t_a__->coefficients; │ │ │ │ │ +208 } │ │ │ │ │ +209 │ │ │ │ │ +_2_1_1 const _N_o_d_e_T_o_R_a_n_g_e_E_n_t_r_y& _n_o_d_e_T_o_R_a_n_g_e_E_n_t_r_y() const │ │ │ │ │ +212 { │ │ │ │ │ +213 return *_d_a_t_a__->nodeToRangeEntry; │ │ │ │ │ +214 } │ │ │ │ │ +215 │ │ │ │ │ +_2_1_7 const _E_n_t_i_t_y_S_e_t& _e_n_t_i_t_y_S_e_t() const │ │ │ │ │ +218 { │ │ │ │ │ +219 return _d_a_t_a__->entitySet; │ │ │ │ │ +220 } │ │ │ │ │ +221 │ │ │ │ │ +222protected: │ │ │ │ │ +_2_2_3 std::shared_ptr _d_a_t_a__; │ │ │ │ │ +224}; │ │ │ │ │ +225 │ │ │ │ │ +226} // namespace ImplDoc │ │ │ │ │ +227 │ │ │ │ │ +228 │ │ │ │ │ +229 │ │ │ │ │ +230template │ │ │ │ │ +231class _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e; │ │ │ │ │ +232 │ │ │ │ │ +276template │ │ │ │ │ +_2_7_9class _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n │ │ │ │ │ +280 : public _I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e │ │ │ │ │ +281{ │ │ │ │ │ +282 using _B_a_s_e = _I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_<_B_,_ _V_,_ _N_T_R_E_>; │ │ │ │ │ +283 using Data = typename _B_a_s_e_:_:_D_a_t_a; │ │ │ │ │ +284 │ │ │ │ │ +285public: │ │ │ │ │ +_2_8_6 using _B_a_s_i_s = typename _B_a_s_e_:_:_B_a_s_i_s; │ │ │ │ │ +_2_8_7 using _V_e_c_t_o_r = typename _B_a_s_e_:_:_V_e_c_t_o_r; │ │ │ │ │ +288 │ │ │ │ │ +_2_8_9 using _D_o_m_a_i_n = typename _B_a_s_e_:_:_D_o_m_a_i_n; │ │ │ │ │ +_2_9_0 using _R_a_n_g_e = R; │ │ │ │ │ +291 │ │ │ │ │ +_2_9_2 using _T_r_a_i_t_s = Imp::GridFunctionTraits<_R_a_n_g_e(_D_o_m_a_i_n), typename _B_a_s_e_:_: │ │ │ │ │ +_E_n_t_i_t_y_S_e_t, _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s, 16>; │ │ │ │ │ +293 │ │ │ │ │ +294private: │ │ │ │ │ +295 │ │ │ │ │ +296 template │ │ │ │ │ +297 using LocalBasisRange = typename Node::FiniteElement::Traits:: │ │ │ │ │ +LocalBasisType::Traits::RangeType; │ │ │ │ │ +298 template │ │ │ │ │ +299 using NodeData = typename std::vector>; │ │ │ │ │ +300 using PerNodeEvaluationBuffer = typename TypeTree::TreeContainer; │ │ │ │ │ +301 │ │ │ │ │ +302public: │ │ │ │ │ +_3_0_3 class _L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ +304 : public _B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e │ │ │ │ │ +305 { │ │ │ │ │ +306 using LocalBase = typename _B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e; │ │ │ │ │ +307 using size_type = typename Base::Tree::size_type; │ │ │ │ │ +308 using LocalBase::nodeToRangeEntry; │ │ │ │ │ +309 │ │ │ │ │ +310 public: │ │ │ │ │ +311 │ │ │ │ │ +_3_1_2 using _G_l_o_b_a_l_F_u_n_c_t_i_o_n = _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n; │ │ │ │ │ +_3_1_3 using _D_o_m_a_i_n = typename LocalBase::Domain; │ │ │ │ │ +_3_1_4 using _R_a_n_g_e = _G_l_o_b_a_l_F_u_n_c_t_i_o_n_:_:_R_a_n_g_e; │ │ │ │ │ +_3_1_5 using _E_l_e_m_e_n_t = typename LocalBase::Element; │ │ │ │ │ +316 │ │ │ │ │ +_3_1_8 _L_o_c_a_l_F_u_n_c_t_i_o_n(const _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n& globalFunction) │ │ │ │ │ +319 : LocalBase(globalFunction._d_a_t_a__) │ │ │ │ │ +320 , evaluationBuffer_(this->_l_o_c_a_l_V_i_e_w__.tree()) │ │ │ │ │ +321 { │ │ │ │ │ +322 /* Nothing. */ │ │ │ │ │ +323 } │ │ │ │ │ +324 │ │ │ │ │ +_3_3_4 _R_a_n_g_e _o_p_e_r_a_t_o_r_(_)(const _D_o_m_a_i_n& x) const │ │ │ │ │ +335 { │ │ │ │ │ +336 _R_a_n_g_e y; │ │ │ │ │ +337 _i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d(y) = 0; │ │ │ │ │ +338 │ │ │ │ │ +339 TypeTree::forEachLeafNode(this->_l_o_c_a_l_V_i_e_w__.tree(), [&](auto&& node, auto&& │ │ │ │ │ +treePath) { │ │ │ │ │ +340 const auto& fe = node.finiteElement(); │ │ │ │ │ +341 const auto& localBasis = fe.localBasis(); │ │ │ │ │ +342 auto& shapeFunctionValues = evaluationBuffer_[treePath]; │ │ │ │ │ +343 │ │ │ │ │ +344 localBasis.evaluateFunction(x, shapeFunctionValues); │ │ │ │ │ +345 │ │ │ │ │ +346 // Compute linear combinations of basis function jacobian. │ │ │ │ │ +347 // Non-scalar coefficients of dimension coeffDim are handled by │ │ │ │ │ +348 // processing the coeffDim linear combinations independently │ │ │ │ │ +349 // and storing them as entries of an array. │ │ │ │ │ +350 using Value = LocalBasisRange< std::decay_t >; │ │ │ │ │ +351 static constexpr auto coeffDim = decltype(flatVectorView(this->localDoFs_ │ │ │ │ │ +[node.localIndex(0)]).size())::value; │ │ │ │ │ +352 auto values = std::array{}; │ │ │ │ │ +353 _i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d(values) = 0; │ │ │ │ │ +354 for (size_type i = 0; i < localBasis.size(); ++i) │ │ │ │ │ +355 { │ │ │ │ │ +356 auto c = _f_l_a_t_V_e_c_t_o_r_V_i_e_w(this->_l_o_c_a_l_D_o_F_s__[node.localIndex(i)]); │ │ │ │ │ +357 for (std::size_t j = 0; j < coeffDim; ++j) │ │ │ │ │ +358 values[j].axpy(c[j], shapeFunctionValues[i]); │ │ │ │ │ +359 } │ │ │ │ │ +360 │ │ │ │ │ +361 // Assign computed values to node entry of range. │ │ │ │ │ +362 // Types are matched using the lexicographic ordering provided by │ │ │ │ │ +flatVectorView. │ │ │ │ │ +363 LocalBase::assignWith(_n_o_d_e_T_o_R_a_n_g_e_E_n_t_r_y(node, treePath, y), values); │ │ │ │ │ +364 }); │ │ │ │ │ +365 │ │ │ │ │ +366 return y; │ │ │ │ │ +367 } │ │ │ │ │ +368 │ │ │ │ │ +_3_7_0 friend typename │ │ │ │ │ +_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_<_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_>_:_: │ │ │ │ │ +_L_o_c_a_l_F_u_n_c_t_i_o_n _d_e_r_i_v_a_t_i_v_e(const _L_o_c_a_l_F_u_n_c_t_i_o_n& lf) │ │ │ │ │ +371 { │ │ │ │ │ +372 auto dlf = _l_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ +(_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_<_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_>(lf._d_a_t_a__)); │ │ │ │ │ +373 if (lf._b_o_u_n_d()) │ │ │ │ │ +374 dlf.bind(lf._l_o_c_a_l_C_o_n_t_e_x_t()); │ │ │ │ │ +375 return dlf; │ │ │ │ │ +376 } │ │ │ │ │ +377 │ │ │ │ │ +378 private: │ │ │ │ │ +379 mutable PerNodeEvaluationBuffer evaluationBuffer_; │ │ │ │ │ +380 }; │ │ │ │ │ +381 │ │ │ │ │ +383 template │ │ │ │ │ +_3_8_4 _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n(B_T && basis, V_T && coefficients, NTRE_T&& │ │ │ │ │ +nodeToRangeEntry) │ │ │ │ │ +385 : _B_a_s_e(std::make_shared(Data{{basis.gridView()}, wrap_or_move(std:: │ │ │ │ │ +forward(basis)), wrap_or_move(std::forward(coefficients)), │ │ │ │ │ +wrap_or_move(std::forward(nodeToRangeEntry))})) │ │ │ │ │ +386 {} │ │ │ │ │ +387 │ │ │ │ │ +_3_8_9 _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n(std::shared_ptr basis, std:: │ │ │ │ │ +shared_ptr coefficients, std::shared_ptr nodeToRangeEntry) │ │ │ │ │ +390 : _B_a_s_e(std::make_shared(Data{{basis->gridView()}, basis, │ │ │ │ │ +coefficients, nodeToRangeEntry})) │ │ │ │ │ +391 {} │ │ │ │ │ +392 │ │ │ │ │ +_3_9_8 _R_a_n_g_e operator() (const _D_o_m_a_i_n& x) const │ │ │ │ │ +399 { │ │ │ │ │ +400 HierarchicSearch search(this->data_->basis->gridView().grid(), this->data_- │ │ │ │ │ +>basis->gridView().indexSet()); │ │ │ │ │ +401 │ │ │ │ │ +402 const auto e = search.findEntity(x); │ │ │ │ │ +403 auto localThis = localFunction(*this); │ │ │ │ │ +404 localThis.bind(e); │ │ │ │ │ +405 return localThis(e.geometry().local(x)); │ │ │ │ │ +406 } │ │ │ │ │ +407 │ │ │ │ │ +_4_0_9 friend _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_<_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_> │ │ │ │ │ +_d_e_r_i_v_a_t_i_v_e(const _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n& f) │ │ │ │ │ +410 { │ │ │ │ │ +411 return _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_<_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_> │ │ │ │ │ +(f._d_a_t_a__); │ │ │ │ │ +412 } │ │ │ │ │ +413 │ │ │ │ │ +_4_2_2 friend _L_o_c_a_l_F_u_n_c_t_i_o_n _l_o_c_a_l_F_u_n_c_t_i_o_n(const _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n& t) │ │ │ │ │ +423 { │ │ │ │ │ +424 return _L_o_c_a_l_F_u_n_c_t_i_o_n(t); │ │ │ │ │ +425 } │ │ │ │ │ +426}; │ │ │ │ │ +427 │ │ │ │ │ +428 │ │ │ │ │ +453template │ │ │ │ │ +_4_5_4auto _m_a_k_e_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n(B&& basis, V&& vector) │ │ │ │ │ +455{ │ │ │ │ │ +456 using _B_a_s_i_s = std::decay_t; │ │ │ │ │ +457 using NTREM = _H_i_e_r_a_r_c_h_i_c_N_o_d_e_T_o_R_a_n_g_e_M_a_p; │ │ │ │ │ +458 │ │ │ │ │ +459 // Small helper functions to wrap vectors using istlVectorBackend │ │ │ │ │ +460 // if they do not already satisfy the VectorBackend interface. │ │ │ │ │ +461 auto toConstVectorBackend = [&](auto&& v) -> decltype(auto) { │ │ │ │ │ +462 if constexpr (models, decltype(v)>()) { │ │ │ │ │ +463 return std::forward(v); │ │ │ │ │ +464 } else { │ │ │ │ │ +465 return _i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d(v); │ │ │ │ │ +466 } │ │ │ │ │ +467 }; │ │ │ │ │ +468 │ │ │ │ │ +469 using _V_e_c_t_o_r = std::decay_t │ │ │ │ │ +(vector)))>; │ │ │ │ │ +470 return _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_<_B_a_s_i_s_,_ _V_e_c_t_o_r_,_ _N_T_R_E_M_,_ _R_>( │ │ │ │ │ +471 std::forward(basis), │ │ │ │ │ +472 toConstVectorBackend(std::forward(vector)), │ │ │ │ │ +473 _H_i_e_r_a_r_c_h_i_c_N_o_d_e_T_o_R_a_n_g_e_M_a_p()); │ │ │ │ │ +474} │ │ │ │ │ +475 │ │ │ │ │ +476 │ │ │ │ │ +491template │ │ │ │ │ +_4_9_2class _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e │ │ │ │ │ +493 : public _I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e │ │ │ │ │ +494{ │ │ │ │ │ +495 using _B_a_s_e = _I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_<_t_y_p_e_n_a_m_e_ _D_G_B_F_:_:_B_a_s_i_s_, │ │ │ │ │ +_t_y_p_e_n_a_m_e_ _D_G_B_F_:_:_V_e_c_t_o_r_,_ _t_y_p_e_n_a_m_e_ _D_G_B_F_:_:_N_o_d_e_T_o_R_a_n_g_e_E_n_t_r_y_>; │ │ │ │ │ +496 using Data = typename _B_a_s_e_:_:_D_a_t_a; │ │ │ │ │ +497 │ │ │ │ │ +498public: │ │ │ │ │ +_4_9_9 using _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n = DGBF; │ │ │ │ │ +500 │ │ │ │ │ +_5_0_1 using _B_a_s_i_s = typename _B_a_s_e_:_:_B_a_s_i_s; │ │ │ │ │ +_5_0_2 using _V_e_c_t_o_r = typename _B_a_s_e_:_:_V_e_c_t_o_r; │ │ │ │ │ +503 │ │ │ │ │ +_5_0_4 using _D_o_m_a_i_n = typename _B_a_s_e_:_:_D_o_m_a_i_n; │ │ │ │ │ +_5_0_5 using _R_a_n_g_e = typename _S_i_g_n_a_t_u_r_e_T_r_a_i_t_s_<_t_y_p_e_n_a_m_e │ │ │ │ │ +_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_T_r_a_i_t_s_:_:_D_e_r_i_v_a_t_i_v_e_I_n_t_e_r_f_a_c_e_>_:_:_R_a_n_g_e; │ │ │ │ │ +506 │ │ │ │ │ +_5_0_7 using _T_r_a_i_t_s = Imp::GridFunctionTraits<_R_a_n_g_e(_D_o_m_a_i_n), typename _B_a_s_e_:_: │ │ │ │ │ +_E_n_t_i_t_y_S_e_t, _D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s, 16>; │ │ │ │ │ +508 │ │ │ │ │ +509private: │ │ │ │ │ +510 │ │ │ │ │ +511 template │ │ │ │ │ +512 using LocalBasisRange = typename Node::FiniteElement::Traits:: │ │ │ │ │ +LocalBasisType::Traits::JacobianType; │ │ │ │ │ +513 template │ │ │ │ │ +514 using NodeData = typename std::vector< LocalBasisRange >; │ │ │ │ │ +515 using PerNodeEvaluationBuffer = typename TypeTree::TreeContainer; │ │ │ │ │ +516 │ │ │ │ │ +517public: │ │ │ │ │ +518 │ │ │ │ │ +_5_2_6 class _L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ +527 : public _B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e │ │ │ │ │ +528 { │ │ │ │ │ +529 using LocalBase = typename _B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e; │ │ │ │ │ +530 using size_type = typename Base::Tree::size_type; │ │ │ │ │ +531 using LocalBase::nodeToRangeEntry; │ │ │ │ │ +532 │ │ │ │ │ +533 public: │ │ │ │ │ +_5_3_4 using _G_l_o_b_a_l_F_u_n_c_t_i_o_n = _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e; │ │ │ │ │ +_5_3_5 using _D_o_m_a_i_n = typename LocalBase::Domain; │ │ │ │ │ +_5_3_6 using _R_a_n_g_e = _G_l_o_b_a_l_F_u_n_c_t_i_o_n_:_:_R_a_n_g_e; │ │ │ │ │ +_5_3_7 using _E_l_e_m_e_n_t = typename LocalBase::Element; │ │ │ │ │ +538 │ │ │ │ │ +_5_4_0 _L_o_c_a_l_F_u_n_c_t_i_o_n(const _G_l_o_b_a_l_F_u_n_c_t_i_o_n& globalFunction) │ │ │ │ │ +541 : LocalBase(globalFunction.data_) │ │ │ │ │ +542 , evaluationBuffer_(this->localView_.tree()) │ │ │ │ │ +543 { │ │ │ │ │ +544 /* Nothing. */ │ │ │ │ │ +545 } │ │ │ │ │ +546 │ │ │ │ │ +_5_5_3 void _b_i_n_d(const _E_l_e_m_e_n_t& element) │ │ │ │ │ +554 { │ │ │ │ │ +555 LocalBase::bind(element); │ │ │ │ │ +556 geometry_.emplace(element.geometry()); │ │ │ │ │ +557 } │ │ │ │ │ +558 │ │ │ │ │ +_5_6_0 void _u_n_b_i_n_d() │ │ │ │ │ +561 { │ │ │ │ │ +562 geometry_.reset(); │ │ │ │ │ +563 LocalBase::unbind(); │ │ │ │ │ +564 } │ │ │ │ │ +565 │ │ │ │ │ +_5_7_9 _R_a_n_g_e _o_p_e_r_a_t_o_r_(_)(const _D_o_m_a_i_n& x) const │ │ │ │ │ +580 { │ │ │ │ │ +581 _R_a_n_g_e y; │ │ │ │ │ +582 _i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d(y) = 0; │ │ │ │ │ +583 │ │ │ │ │ +584 const auto& jacobianInverse = geometry_->jacobianInverse(x); │ │ │ │ │ +585 │ │ │ │ │ +586 TypeTree::forEachLeafNode(this->localView_.tree(), [&](auto&& node, auto&& │ │ │ │ │ +treePath) { │ │ │ │ │ +587 const auto& fe = node.finiteElement(); │ │ │ │ │ +588 const auto& localBasis = fe.localBasis(); │ │ │ │ │ +589 auto& shapeFunctionJacobians = evaluationBuffer_[treePath]; │ │ │ │ │ +590 │ │ │ │ │ +591 localBasis.evaluateJacobian(x, shapeFunctionJacobians); │ │ │ │ │ +592 │ │ │ │ │ +593 // Compute linear combinations of basis function jacobian. │ │ │ │ │ +594 // Non-scalar coefficients of dimension coeffDim are handled by │ │ │ │ │ +595 // processing the coeffDim linear combinations independently │ │ │ │ │ +596 // and storing them as entries of an array. │ │ │ │ │ +597 using RefJacobian = LocalBasisRange< std::decay_t >; │ │ │ │ │ +598 static constexpr auto coeffDim = decltype(flatVectorView(this->localDoFs_ │ │ │ │ │ +[node.localIndex(0)]).size())::value; │ │ │ │ │ +599 auto refJacobians = std::array{}; │ │ │ │ │ +600 _i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d(refJacobians) = 0; │ │ │ │ │ +601 for (size_type i = 0; i < localBasis.size(); ++i) │ │ │ │ │ +602 { │ │ │ │ │ +603 auto c = _f_l_a_t_V_e_c_t_o_r_V_i_e_w(this->localDoFs_[node.localIndex(i)]); │ │ │ │ │ +604 for (std::size_t j = 0; j < coeffDim; ++j) │ │ │ │ │ +605 refJacobians[j].axpy(c[j], shapeFunctionJacobians[i]); │ │ │ │ │ +606 } │ │ │ │ │ +607 │ │ │ │ │ +608 // Transform Jacobians form local to global coordinates. │ │ │ │ │ +609 using Jacobian = decltype(refJacobians[0] * jacobianInverse); │ │ │ │ │ +610 auto jacobians = std::array{}; │ │ │ │ │ +611 std::transform( │ │ │ │ │ +612 refJacobians.begin(), refJacobians.end(), jacobians.begin(), │ │ │ │ │ +613 [&](const auto& refJacobian) { return refJacobian * jacobianInverse; }); │ │ │ │ │ +614 │ │ │ │ │ +615 // Assign computed Jacobians to node entry of range. │ │ │ │ │ +616 // Types are matched using the lexicographic ordering provided by │ │ │ │ │ +flatVectorView. │ │ │ │ │ +617 LocalBase::assignWith(nodeToRangeEntry(node, treePath, y), jacobians); │ │ │ │ │ +618 }); │ │ │ │ │ +619 │ │ │ │ │ +620 return y; │ │ │ │ │ +621 } │ │ │ │ │ +622 │ │ │ │ │ +_6_2_4 friend typename _T_r_a_i_t_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_T_r_a_i_t_s_:_:_D_e_r_i_v_a_t_i_v_e_I_n_t_e_r_f_a_c_e _d_e_r_i_v_a_t_i_v_e │ │ │ │ │ +(const _L_o_c_a_l_F_u_n_c_t_i_o_n&) │ │ │ │ │ +625 { │ │ │ │ │ +626 DUNE_THROW(NotImplemented, "derivative of derivative is not implemented"); │ │ │ │ │ +627 } │ │ │ │ │ +628 │ │ │ │ │ +629 private: │ │ │ │ │ +630 mutable PerNodeEvaluationBuffer evaluationBuffer_; │ │ │ │ │ +631 std::optional geometry_; │ │ │ │ │ +632 }; │ │ │ │ │ +633 │ │ │ │ │ +_6_4_0 _D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e(const std::shared_ptr& │ │ │ │ │ +data) │ │ │ │ │ +641 : _B_a_s_e(data) │ │ │ │ │ +642 { │ │ │ │ │ +643 /* Nothing. */ │ │ │ │ │ +644 } │ │ │ │ │ +645 │ │ │ │ │ +_6_5_1 _R_a_n_g_e _o_p_e_r_a_t_o_r_(_)(const _D_o_m_a_i_n& x) const │ │ │ │ │ +652 { │ │ │ │ │ +653 HierarchicSearch search(this->data_->basis->gridView().grid(), this->data_- │ │ │ │ │ +>basis->gridView().indexSet()); │ │ │ │ │ +654 │ │ │ │ │ +655 const auto e = search.findEntity(x); │ │ │ │ │ +656 auto localThis = localFunction(*this); │ │ │ │ │ +657 localThis.bind(e); │ │ │ │ │ +658 return localThis(e.geometry().local(x)); │ │ │ │ │ +659 } │ │ │ │ │ +660 │ │ │ │ │ +_6_6_1 friend typename _T_r_a_i_t_s_:_:_D_e_r_i_v_a_t_i_v_e_I_n_t_e_r_f_a_c_e _d_e_r_i_v_a_t_i_v_e(const │ │ │ │ │ +_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e& f) │ │ │ │ │ +662 { │ │ │ │ │ +663 DUNE_THROW(NotImplemented, "derivative of derivative is not implemented"); │ │ │ │ │ +664 } │ │ │ │ │ +665 │ │ │ │ │ +_6_6_7 friend _L_o_c_a_l_F_u_n_c_t_i_o_n _l_o_c_a_l_F_u_n_c_t_i_o_n(const │ │ │ │ │ +_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e& f) │ │ │ │ │ +668 { │ │ │ │ │ +669 return _L_o_c_a_l_F_u_n_c_t_i_o_n(f); │ │ │ │ │ +670 } │ │ │ │ │ +671}; │ │ │ │ │ +672 │ │ │ │ │ +673 │ │ │ │ │ +674} // namespace Functions │ │ │ │ │ +675} // namespace Dune │ │ │ │ │ +676 │ │ │ │ │ +677#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_DISCRETEGLOBALBASISFUNCTIONS_HH │ │ │ │ │ +_g_r_i_d_v_i_e_w_e_n_t_i_t_y_s_e_t_._h_h │ │ │ │ │ +_g_r_i_d_f_u_n_c_t_i_o_n_._h_h │ │ │ │ │ +_i_s_t_l_v_e_c_t_o_r_b_a_c_k_e_n_d_._h_h │ │ │ │ │ +_f_l_a_t_v_e_c_t_o_r_v_i_e_w_._h_h │ │ │ │ │ +_h_i_e_r_a_r_c_h_i_c_n_o_d_e_t_o_r_a_n_g_e_m_a_p_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_m_a_k_e_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n │ │ │ │ │ +auto makeDiscreteGlobalBasisFunction(B &&basis, V &&vector) │ │ │ │ │ +Generate a DiscreteGlobalBasisFunction. │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:454 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d │ │ │ │ │ +auto istlVectorBackend(Vector &v) │ │ │ │ │ +Return a vector backend wrapping non-const ISTL like containers. │ │ │ │ │ +DDeeffiinniittiioonn istlvectorbackend.hh:350 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_n_v_a_l_i_d_R_a_n_g_e │ │ │ │ │ -Dummy range class to be used if no proper type is available. │ │ │ │ │ -DDeeffiinniittiioonn defaultderivativetraits.hh:27 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_l_a_t_V_e_c_t_o_r_V_i_e_w │ │ │ │ │ +auto flatVectorView(T &t) │ │ │ │ │ +Create flat vector view of passed mutable container. │ │ │ │ │ +DDeeffiinniittiioonn flatvectorview.hh:183 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ Default implementation for derivative traits. │ │ │ │ │ DDeeffiinniittiioonn defaultderivativetraits.hh:41 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_:_:_R_a_n_g_e │ │ │ │ │ -InvalidRange Range │ │ │ │ │ -Range of derivative for function with given signature. │ │ │ │ │ -DDeeffiinniittiioonn defaultderivativetraits.hh:43 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_ _d_o_u_b_l_e_(_d_o_u_b_l_e_)_ _>_:_:_R_a_n_g_e │ │ │ │ │ -double Range │ │ │ │ │ -Range of derivative for function with given signature. │ │ │ │ │ -DDeeffiinniittiioonn defaultderivativetraits.hh:58 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_ _K_(_F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _n_ _>_)_>_:_:_R_a_n_g_e │ │ │ │ │ -FieldVector< K, n > Range │ │ │ │ │ -Range of derivative for function with given signature. │ │ │ │ │ -DDeeffiinniittiioonn defaultderivativetraits.hh:74 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_ _F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _m_ _>_(_F_i_e_l_d_V_e_c_t_o_r_<_ _K_,_ _n │ │ │ │ │ -_>_)_>_:_:_R_a_n_g_e │ │ │ │ │ -FieldMatrix< K, m, n > Range │ │ │ │ │ -Range of derivative for function with given signature. │ │ │ │ │ -DDeeffiinniittiioonn defaultderivativetraits.hh:90 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_ _F_i_e_l_d_M_a_t_r_i_x_<_ _K_,_ _1_,_ _m_ _>_(_F_i_e_l_d_V_e_c_t_o_r_< │ │ │ │ │ -_K_,_ _n_ _>_)_>_:_:_R_a_n_g_e │ │ │ │ │ -FieldMatrix< K, m, n > Range │ │ │ │ │ -Range of derivative for function with given signature. │ │ │ │ │ -DDeeffiinniittiioonn defaultderivativetraits.hh:106 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_r_a_i_t_s │ │ │ │ │ +Helper class to deduce the signature of a callable. │ │ │ │ │ +DDeeffiinniittiioonn signature.hh:60 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_N_o_d_e_T_o_R_a_n_g_e_M_a_p │ │ │ │ │ +A simple node to range map using the nested tree indices. │ │ │ │ │ +DDeeffiinniittiioonn hierarchicnodetorangemap.hh:34 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:34 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_d_a_t_a__ │ │ │ │ │ +std::shared_ptr< const Data > data_ │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:223 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_d_o_f_s │ │ │ │ │ +const Vector & dofs() const │ │ │ │ │ +Return the coefficients of this discrete function by reference. │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:205 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_B_a_s_i_s │ │ │ │ │ +B Basis │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_T_r_e_e │ │ │ │ │ +typename Basis::LocalView::Tree Tree │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:45 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_V_e_c_t_o_r │ │ │ │ │ +V Vector │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:37 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_E_l_e_m_e_n_t │ │ │ │ │ +typename EntitySet::Element Element │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:51 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_D_o_m_a_i_n │ │ │ │ │ +typename EntitySet::LocalCoordinate LocalDomain │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:50 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_n_o_d_e_T_o_R_a_n_g_e_E_n_t_r_y │ │ │ │ │ +const NodeToRangeEntry & nodeToRangeEntry() const │ │ │ │ │ +Return the stored node-to-range map. │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:211 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_N_o_d_e_T_o_R_a_n_g_e_E_n_t_r_y │ │ │ │ │ +NTRE NodeToRangeEntry │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:46 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ +_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e │ │ │ │ │ +DiscreteGlobalBasisFunctionBase(const std::shared_ptr< const Data > &data) │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:190 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ +typename Basis::GridView GridView │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:43 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_b_a_s_i_s │ │ │ │ │ +const Basis & basis() const │ │ │ │ │ +Return a const reference to the stored basis. │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:199 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_E_n_t_i_t_y_S_e_t │ │ │ │ │ +GridViewEntitySet< GridView, 0 > EntitySet │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:44 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_e_n_t_i_t_y_S_e_t │ │ │ │ │ +const EntitySet & entitySet() const │ │ │ │ │ +Get associated set of entities the local-function can be bound to. │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:217 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_D_o_m_a_i_n │ │ │ │ │ +typename EntitySet::GlobalCoordinate Domain │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_C_o_e_f_f_i_c_i_e_n_t │ │ │ │ │ +Dune::AutonomousValue< decltype(std::declval< Vector >()[std::declval< typename │ │ │ │ │ +Basis::MultiIndex >()])> Coefficient │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:41 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_D_a_t_a │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:59 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_D_a_t_a_:_:_e_n_t_i_t_y_S_e_t │ │ │ │ │ +EntitySet entitySet │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:60 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_D_a_t_a_:_: │ │ │ │ │ +_n_o_d_e_T_o_R_a_n_g_e_E_n_t_r_y │ │ │ │ │ +std::shared_ptr< const NodeToRangeEntry > nodeToRangeEntry │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:63 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_D_a_t_a_:_:_b_a_s_i_s │ │ │ │ │ +std::shared_ptr< const Basis > basis │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_D_a_t_a_:_:_c_o_e_f_f_i_c_i_e_n_t_s │ │ │ │ │ +std::shared_ptr< const Vector > coefficients │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:62 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:68 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ +_o_p_e_r_a_t_o_r_= │ │ │ │ │ +LocalFunctionBase & operator=(const LocalFunctionBase &other) │ │ │ │ │ +Copy-assignment of the local-function. │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:106 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ +_b_o_u_n_d │ │ │ │ │ +bool bound() const │ │ │ │ │ +Check if LocalFunction is already bound to an element. │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:155 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ +_b_i_n_d │ │ │ │ │ +void bind(const Element &element) │ │ │ │ │ +Bind LocalFunction to grid element. │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:122 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ +_E_l_e_m_e_n_t │ │ │ │ │ +typename EntitySet::Element Element │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:74 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ +_l_o_c_a_l_C_o_n_t_e_x_t │ │ │ │ │ +const Element & localContext() const │ │ │ │ │ +Return the element the local-function is bound to. │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:161 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ +_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e │ │ │ │ │ +LocalFunctionBase(const LocalFunctionBase &other) │ │ │ │ │ +Copy-construct the local-function. │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:90 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ +_l_o_c_a_l_D_o_F_s__ │ │ │ │ │ +std::vector< Coefficient > localDoFs_ │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:186 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ +_a_s_s_i_g_n_W_i_t_h │ │ │ │ │ +void assignWith(To &to, const From &from) const │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:169 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ +_d_a_t_a__ │ │ │ │ │ +std::shared_ptr< const Data > data_ │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:184 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ +_n_o_d_e_T_o_R_a_n_g_e_E_n_t_r_y │ │ │ │ │ +decltype(auto) nodeToRangeEntry(const Node &node, const TreePath &treePath, │ │ │ │ │ +Range &y) const │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:179 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ +_l_o_c_a_l_V_i_e_w__ │ │ │ │ │ +LocalView localView_ │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:185 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ +_u_n_b_i_n_d │ │ │ │ │ +void unbind() │ │ │ │ │ +Unbind the local-function. │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:149 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ +_D_o_m_a_i_n │ │ │ │ │ +LocalDomain Domain │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_m_p_l_D_o_c_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_B_a_s_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e_:_: │ │ │ │ │ +_L_o_c_a_l_F_u_n_c_t_i_o_n_B_a_s_e │ │ │ │ │ +LocalFunctionBase(const std::shared_ptr< const Data > &data) │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:77 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e │ │ │ │ │ +Derivative of a DiscreteGlobalBasisFunction │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:494 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_B_a_s_i_s │ │ │ │ │ +typename Base::Basis Basis │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:501 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ +friend Traits::DerivativeInterface derivative(const │ │ │ │ │ +DiscreteGlobalBasisFunctionDerivative &f) │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:661 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +Range operator()(const Domain &x) const │ │ │ │ │ +Evaluate the discrete grid-function derivative in global coordinates. │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:651 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_R_a_n_g_e │ │ │ │ │ +typename SignatureTraits< typename DiscreteGlobalBasisFunction::Traits:: │ │ │ │ │ +DerivativeInterface >::Range Range │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:505 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_l_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ +friend LocalFunction localFunction(const DiscreteGlobalBasisFunctionDerivative │ │ │ │ │ +&f) │ │ │ │ │ +Construct local function from a DiscreteGlobalBasisFunctionDerivative │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:667 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_: │ │ │ │ │ +_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e │ │ │ │ │ +DiscreteGlobalBasisFunctionDerivative(const std::shared_ptr< const Data > │ │ │ │ │ +&data) │ │ │ │ │ +create object from DiscreateGlobalBasisFunction data │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:640 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_: │ │ │ │ │ +_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n │ │ │ │ │ +DGBF DiscreteGlobalBasisFunction │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:499 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_V_e_c_t_o_r │ │ │ │ │ +typename Base::Vector Vector │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:502 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_T_r_a_i_t_s │ │ │ │ │ +Imp::GridFunctionTraits< Range(Domain), typename Base::EntitySet, │ │ │ │ │ +DefaultDerivativeTraits, 16 > Traits │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:507 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_D_o_m_a_i_n │ │ │ │ │ +typename Base::Domain Domain │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:504 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n │ │ │ │ │ +A grid function induced by a global basis and a coefficient vector. │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:281 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ +friend DiscreteGlobalBasisFunctionDerivative< DiscreteGlobalBasisFunction > │ │ │ │ │ +derivative(const DiscreteGlobalBasisFunction &f) │ │ │ │ │ +Derivative of the DiscreteGlobalBasisFunction │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:409 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n │ │ │ │ │ +DiscreteGlobalBasisFunction(B_T &&basis, V_T &&coefficients, NTRE_T │ │ │ │ │ +&&nodeToRangeEntry) │ │ │ │ │ +Create a grid-function, by wrapping the arguments in std::shared_ptr. │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:384 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n │ │ │ │ │ +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. │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:389 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_l_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ +friend LocalFunction localFunction(const DiscreteGlobalBasisFunction &t) │ │ │ │ │ +Construct local function from a DiscreteGlobalBasisFunction. │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:422 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_B_a_s_i_s │ │ │ │ │ +typename Base::Basis Basis │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:286 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_T_r_a_i_t_s │ │ │ │ │ +Imp::GridFunctionTraits< Range(Domain), typename Base::EntitySet, │ │ │ │ │ +DefaultDerivativeTraits, 16 > Traits │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:292 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_R_a_n_g_e │ │ │ │ │ +R Range │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:290 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_V_e_c_t_o_r │ │ │ │ │ +typename Base::Vector Vector │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:287 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_D_o_m_a_i_n │ │ │ │ │ +typename Base::Domain Domain │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:289 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:305 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_:_R_a_n_g_e │ │ │ │ │ +GlobalFunction::Range Range │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:314 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_:_D_o_m_a_i_n │ │ │ │ │ +typename LocalBase::Domain Domain │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:313 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ +LocalFunction(const DiscreteGlobalBasisFunction &globalFunction) │ │ │ │ │ +Create a local-function from the associated grid-function. │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:318 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ +friend DiscreteGlobalBasisFunctionDerivative< DiscreteGlobalBasisFunction >:: │ │ │ │ │ +LocalFunction derivative(const LocalFunction &lf) │ │ │ │ │ +Local function of the derivative. │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:370 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +Range operator()(const Domain &x) const │ │ │ │ │ +Evaluate this local-function in coordinates x in the bound element. │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:334 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_:_E_l_e_m_e_n_t │ │ │ │ │ +typename LocalBase::Element Element │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:315 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ +local function evaluating the derivative in reference coordinates │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:528 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_:_o_p_e_r_a_t_o_r │ │ │ │ │ +_(_) │ │ │ │ │ +Range operator()(const Domain &x) const │ │ │ │ │ +Evaluate this local-function in coordinates x in the bound element. │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:579 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_:_D_o_m_a_i_n │ │ │ │ │ +typename LocalBase::Domain Domain │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:535 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_:_E_l_e_m_e_n_t │ │ │ │ │ +typename LocalBase::Element Element │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:537 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_: │ │ │ │ │ +_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ +friend Traits::LocalFunctionTraits::DerivativeInterface derivative(const │ │ │ │ │ +LocalFunction &) │ │ │ │ │ +Not implemented. │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:624 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_:_R_a_n_g_e │ │ │ │ │ +GlobalFunction::Range Range │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:536 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_:_u_n_b_i_n_d │ │ │ │ │ +void unbind() │ │ │ │ │ +Unbind the local-function. │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:560 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_: │ │ │ │ │ +_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ +LocalFunction(const GlobalFunction &globalFunction) │ │ │ │ │ +Create a local function from the associated grid function. │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:540 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_s_c_r_e_t_e_G_l_o_b_a_l_B_a_s_i_s_F_u_n_c_t_i_o_n_D_e_r_i_v_a_t_i_v_e_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_:_:_b_i_n_d │ │ │ │ │ +void bind(const Element &element) │ │ │ │ │ +Bind LocalFunction to grid element. │ │ │ │ │ +DDeeffiinniittiioonn discreteglobalbasisfunction.hh:553 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn gridfunction.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_ _G_r_i_d_V_i_e_w_,_ _0_ _> │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_ _G_r_i_d_V_i_e_w_,_ _0_ _>_:_:_E_l_e_m_e_n_t │ │ │ │ │ +GridView::template Codim< codim >::Entity Element │ │ │ │ │ +Type of Elements contained in this EntitySet. │ │ │ │ │ +DDeeffiinniittiioonn gridviewentityset.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_ _G_r_i_d_V_i_e_w_,_ _0_ _>_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +Element::Geometry::LocalCoordinate LocalCoordinate │ │ │ │ │ +Type of local coordinates with respect to the Element. │ │ │ │ │ +DDeeffiinniittiioonn gridviewentityset.hh:39 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_ _G_r_i_d_V_i_e_w_,_ _0_ _>_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +Element::Geometry::GlobalCoordinate GlobalCoordinate │ │ │ │ │ +DDeeffiinniittiioonn gridviewentityset.hh:40 │ │ │ │ │ +_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00074.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: signature.hh File Reference │ │ │ │ +dune-functions: gridviewentityset.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,57 +65,40 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
signature.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
gridviewentityset.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ -#include <tuple>
│ │ │ │ -#include <dune/functions/common/defaultderivativetraits.hh>
│ │ │ │ +
#include <memory>
│ │ │ │
│ │ │ │

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...
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 Range , class Domain , template< class > class DerivativeTraits>
auto Dune::Functions::derivativeSignatureTag (SignatureTag< Range(Domain), DerivativeTraits > tag)
 Construct SignatureTag for derivative.
 
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.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,40 +1,22 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -signature.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ + * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +gridviewentityset.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_r_a_i_t_s_<_ _S_i_g_n_a_t_u_r_e_,_ _i_s_C_a_l_l_a_b_l_e_ _> │ │ │ │ │ -  Helper class to deduce the signature of a callable. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_a_g_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_T_ _> │ │ │ │ │ -  Tag-class to encapsulate signature information. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_<_ _G_V_,_ _c_d_ _> │ │ │ │ │ +  An entity set for all entities of given codim in a grid view. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template class │ │ │ │ │ -DerivativeTraits> │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_d_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_T_a_g (_S_i_g_n_a_t_u_r_e_T_a_g< Range(Domain), │ │ │ │ │ - DerivativeTraits > tag) │ │ │ │ │ -  Construct _S_i_g_n_a_t_u_r_e_T_a_g for derivative. │ │ │ │ │ -  │ │ │ │ │ -template class │ │ │ │ │ -DerivativeTraits> │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_d_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_T_a_g_s (_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_a_g< │ │ │ │ │ - Signature, DerivativeTraits > tag) │ │ │ │ │ -  Construct SignatureTags for derivatives. │ │ │ │ │ -  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00074_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: signature.hh Source File │ │ │ │ +dune-functions: gridviewentityset.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,172 +70,127 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
signature.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_COMMON_SIGNATURE_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_COMMON_SIGNATURE_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWENTITYSET_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWENTITYSET_HH
│ │ │ │
9
│ │ │ │ -
10#include <type_traits>
│ │ │ │ -
11#include <tuple>
│ │ │ │ +
10#include <memory>
│ │ │ │ +
11
│ │ │ │
12
│ │ │ │ - │ │ │ │ +
13namespace Dune {
│ │ │ │
14
│ │ │ │ -
15namespace Dune {
│ │ │ │ -
16namespace Functions {
│ │ │ │ +
15namespace Functions {
│ │ │ │ +
16
│ │ │ │
17
│ │ │ │ -
23template<typename F>
│ │ │ │ - │ │ │ │ -
25
│ │ │ │ -
26#ifndef DOXYGEN
│ │ │ │ -
27template<typename F>
│ │ │ │ -
28struct IsCallable
│ │ │ │ -
29{
│ │ │ │ -
30 struct yes { std::size_t dummy[2]; };
│ │ │ │ -
31 struct no { std::size_t dummy[1]; };
│ │ │ │ -
32
│ │ │ │ -
33 template<typename C>
│ │ │ │ -
34 static yes test(const decltype(&C::operator()) *);
│ │ │ │ -
35 template<typename C>
│ │ │ │ -
36 static no test(...);
│ │ │ │ +
25template<class GV, int cd>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
27{
│ │ │ │ +
28public:
│ │ │ │ +
29
│ │ │ │ +
30 typedef GV GridView;
│ │ │ │ +
31 enum {
│ │ │ │ +
32 codim = cd
│ │ │ │ +
33 };
│ │ │ │ +
34
│ │ │ │ +
36 typedef typename GridView::template Codim<codim>::Entity Element;
│ │ │ │
37
│ │ │ │ -
38 enum { value = (sizeof(test<F>(0)) == sizeof(yes)) };
│ │ │ │ -
39};
│ │ │ │ -
40
│ │ │ │ -
41template<typename R, typename D>
│ │ │ │ -
42struct IsCallable<R(D)>
│ │ │ │ -
43{
│ │ │ │ -
44 enum { value = true };
│ │ │ │ -
45};
│ │ │ │ +
39 typedef typename Element::Geometry::LocalCoordinate LocalCoordinate;
│ │ │ │ +
40 typedef typename Element::Geometry::GlobalCoordinate GlobalCoordinate;
│ │ │ │ +
41
│ │ │ │ + │ │ │ │ +
43
│ │ │ │ +
45 typedef typename GridView::template Codim<codim>::Iterator const_iterator;
│ │ │ │
46
│ │ │ │ -
47template<typename R, typename D>
│ │ │ │ -
48struct IsCallable<R(*)(D)>
│ │ │ │ -
49{
│ │ │ │ -
50 enum { value = true };
│ │ │ │ -
51};
│ │ │ │ -
52#endif
│ │ │ │ -
53
│ │ │ │ -
59template<class Signature, bool isCallable = IsCallable<Signature>::value >
│ │ │ │ - │ │ │ │ -
61
│ │ │ │ -
62#ifndef DOXYGEN
│ │ │ │ -
64template<class T>
│ │ │ │ -
65struct SignatureTraits<T, true>
│ │ │ │ -
66 : public SignatureTraits<decltype(&T::operator()), true>
│ │ │ │ -
67{};
│ │ │ │ -
68
│ │ │ │ -
70template <typename C, typename R, typename D>
│ │ │ │ -
71struct SignatureTraits<R(C::*)(D) const, true>
│ │ │ │ -
72 : public SignatureTraits<R(D), true>
│ │ │ │ -
73{};
│ │ │ │ -
74
│ │ │ │ -
76template <typename C, typename R, typename D>
│ │ │ │ -
77struct SignatureTraits<R(C::*)(D), true>
│ │ │ │ -
78 : public SignatureTraits<R(D), true>
│ │ │ │ -
79{};
│ │ │ │ -
80
│ │ │ │ -
82template <typename R, typename D>
│ │ │ │ -
83struct SignatureTraits<R(*)(D), true>
│ │ │ │ -
84 : public SignatureTraits<R(D), true>
│ │ │ │ -
85{};
│ │ │ │ -
86
│ │ │ │ -
88template<class R, class D>
│ │ │ │ -
89struct SignatureTraits<R(D), true>
│ │ │ │ -
90{
│ │ │ │ -
91 using Range = R;
│ │ │ │ -
92 using Domain = D;
│ │ │ │ -
93
│ │ │ │ -
94 using RawRange = std::decay_t<Range>;
│ │ │ │ -
95 using RawDomain = std::decay_t<Domain>;
│ │ │ │ -
96
│ │ │ │ -
97 using RawSignature = RawRange(RawDomain);
│ │ │ │ -
98
│ │ │ │ -
99 template<template<class> class DerivativeTraits=DefaultDerivativeTraits>
│ │ │ │ -
100 using DerivativeSignature = typename DerivativeTraits<RawSignature>::Range(Domain);
│ │ │ │ -
101};
│ │ │ │ -
102#endif
│ │ │ │ -
103
│ │ │ │ -
104
│ │ │ │ -
105template<class Signature, template<class> class DerivativeTraits=DefaultDerivativeTraits>
│ │ │ │ - │ │ │ │ -
107
│ │ │ │ -
117template<class Range, class Domain, template<class> class DerivativeTraitsT>
│ │ │ │ -
│ │ │ │ -
118struct SignatureTag<Range(Domain), DerivativeTraitsT>
│ │ │ │ -
119{
│ │ │ │ -
120 using Signature = Range(Domain);
│ │ │ │ -
121
│ │ │ │ -
122 template<class T>
│ │ │ │ -
123 using DerivativeTraits = DerivativeTraitsT<T>;
│ │ │ │ -
124};
│ │ │ │ -
│ │ │ │ -
125
│ │ │ │ -
126
│ │ │ │ -
127
│ │ │ │ -
136template<class Range, class Domain, template<class> class DerivativeTraits>
│ │ │ │ -
│ │ │ │ -
137auto derivativeSignatureTag(SignatureTag<Range(Domain), DerivativeTraits> tag)
│ │ │ │ -
138{
│ │ │ │ -
139 using DerivativeRange = typename DerivativeTraits<Range(Domain)>::Range;
│ │ │ │ - │ │ │ │ -
141}
│ │ │ │ -
│ │ │ │ -
142
│ │ │ │ -
143
│ │ │ │ -
144
│ │ │ │ -
158template<std::size_t maxOrder, class Signature, template<class> class DerivativeTraits>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
160{
│ │ │ │ -
161 if constexpr (maxOrder==0) {
│ │ │ │ -
162 // If maxOrder== 0 we just need the given SignatureTag
│ │ │ │ -
163 return std::make_tuple(tag);
│ │ │ │ -
164 } else {
│ │ │ │ -
165 // else we first construct the tail tuple with SignatureTags for derivatives
│ │ │ │ -
166 // of order 1 to maxOrder
│ │ │ │ -
167 auto tailTagsTuple = derivativeSignatureTags<std::size_t(maxOrder-1)>(derivativeSignatureTag(tag));
│ │ │ │ -
168 // and prepend this with the given SignatureTag.
│ │ │ │ -
169 // This is done by unpacking the tail tuple with apply().
│ │ │ │ -
170 return std::apply([&](auto&&... tailTags){
│ │ │ │ -
171 return std::make_tuple(tag, tailTags...);
│ │ │ │ -
172 }, tailTagsTuple);
│ │ │ │ -
173 }
│ │ │ │ -
174}
│ │ │ │ -
│ │ │ │ -
175
│ │ │ │ -
176
│ │ │ │ -
177
│ │ │ │ -
178} // namespace Functions
│ │ │ │ -
179} // namespace Dune
│ │ │ │ -
180
│ │ │ │ -
181#endif // DUNE_FUNCTIONS_COMMON_SIGNATURE_HH
│ │ │ │ - │ │ │ │ -
auto derivativeSignatureTag(SignatureTag< Range(Domain), DerivativeTraits > tag)
Construct SignatureTag for derivative.
Definition signature.hh:137
│ │ │ │ -
auto derivativeSignatureTags(Dune::Functions::SignatureTag< Signature, DerivativeTraits > tag)
Construct SignatureTags for derivatives.
Definition signature.hh:159
│ │ │ │ + │ │ │ │ +
49
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
52 gv_(gv)
│ │ │ │ +
53 {}
│ │ │ │ +
│ │ │ │ +
54
│ │ │ │ +
│ │ │ │ +
56 bool contains(const Element& e) const
│ │ │ │ +
57 {
│ │ │ │ +
58 return gv_.contains(e);
│ │ │ │ +
59 }
│ │ │ │ +
│ │ │ │ +
60
│ │ │ │ +
│ │ │ │ +
62 size_t size() const
│ │ │ │ +
63 {
│ │ │ │ +
64 return gv_.size(codim);
│ │ │ │ +
65 }
│ │ │ │ +
│ │ │ │ +
66
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
69 {
│ │ │ │ +
70 return gv_.template begin<codim>();
│ │ │ │ +
71 }
│ │ │ │ +
│ │ │ │ +
72
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
75 {
│ │ │ │ +
76 return gv_.template end<codim>();
│ │ │ │ +
77 }
│ │ │ │ +
│ │ │ │ +
78
│ │ │ │ +
│ │ │ │ +
80 const GridView& gridView() const
│ │ │ │ +
81 {
│ │ │ │ +
82 return gv_;
│ │ │ │ +
83 }
│ │ │ │ +
│ │ │ │ +
84
│ │ │ │ +
85private:
│ │ │ │ +
86 GridView gv_;
│ │ │ │ +
87};
│ │ │ │ +
│ │ │ │ +
88
│ │ │ │ +
89
│ │ │ │ +
90} // end of namespace Dune::Functions
│ │ │ │ +
91} // end of namespace Dune
│ │ │ │ +
92
│ │ │ │ +
93#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWENTITYSET_HH
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
Helper class to check that F is callable.
Definition signature.hh:24
│ │ │ │ -
Helper class to deduce the signature of a callable.
Definition signature.hh:60
│ │ │ │ -
Definition signature.hh:106
│ │ │ │ -
DerivativeTraitsT< T > DerivativeTraits
Definition signature.hh:123
│ │ │ │ - │ │ │ │ +
An entity set for all entities of given codim in a grid view.
Definition gridviewentityset.hh:27
│ │ │ │ +
GridViewEntitySet(const GridView &gv)
Construct GridViewEntitySet for a GridView.
Definition gridviewentityset.hh:51
│ │ │ │ +
GV GridView
Definition gridviewentityset.hh:30
│ │ │ │ +
GridView::template Codim< codim >::Entity Element
Type of Elements contained in this EntitySet.
Definition gridviewentityset.hh:36
│ │ │ │ +
const_iterator end() const
Create an end iterator.
Definition gridviewentityset.hh:74
│ │ │ │ +
const GridView & gridView() const
Return the associated GridView.
Definition gridviewentityset.hh:80
│ │ │ │ +
Element value_type
Definition gridviewentityset.hh:42
│ │ │ │ +
const_iterator begin() const
Create a begin iterator.
Definition gridviewentityset.hh:68
│ │ │ │ +
GridView::template Codim< codim >::Iterator const_iterator
A forward iterator.
Definition gridviewentityset.hh:45
│ │ │ │ +
Element::Geometry::LocalCoordinate LocalCoordinate
Type of local coordinates with respect to the Element.
Definition gridviewentityset.hh:39
│ │ │ │ +
size_t size() const
Return number of Elements visited by an iterator.
Definition gridviewentityset.hh:62
│ │ │ │ +
Element::Geometry::GlobalCoordinate GlobalCoordinate
Definition gridviewentityset.hh:40
│ │ │ │ +
@ codim
Definition gridviewentityset.hh:32
│ │ │ │ +
bool contains(const Element &e) const
Return true if e is contained in the EntitySet.
Definition gridviewentityset.hh:56
│ │ │ │ +
const_iterator iterator
Same as const_iterator.
Definition gridviewentityset.hh:48
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,184 +1,146 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _c_o_m_m_o_n │ │ │ │ │ -signature.hh │ │ │ │ │ + * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ +gridviewentityset.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_COMMON_SIGNATURE_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_COMMON_SIGNATURE_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWENTITYSET_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWENTITYSET_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ +10#include │ │ │ │ │ +11 │ │ │ │ │ 12 │ │ │ │ │ -13#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +13namespace _D_u_n_e { │ │ │ │ │ 14 │ │ │ │ │ -15namespace _D_u_n_e { │ │ │ │ │ -16namespace Functions { │ │ │ │ │ +15namespace Functions { │ │ │ │ │ +16 │ │ │ │ │ 17 │ │ │ │ │ -23template │ │ │ │ │ -_2_4struct _I_s_C_a_l_l_a_b_l_e; │ │ │ │ │ -25 │ │ │ │ │ -26#ifndef DOXYGEN │ │ │ │ │ -27template │ │ │ │ │ -28struct _I_s_C_a_l_l_a_b_l_e │ │ │ │ │ -29{ │ │ │ │ │ -30 struct yes { std::size_t dummy[2]; }; │ │ │ │ │ -31 struct no { std::size_t dummy[1]; }; │ │ │ │ │ -32 │ │ │ │ │ -33 template │ │ │ │ │ -34 static yes test(const decltype(&C::operator()) *); │ │ │ │ │ -35 template │ │ │ │ │ -36 static no test(...); │ │ │ │ │ +25template │ │ │ │ │ +_2_6class _G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t │ │ │ │ │ +27{ │ │ │ │ │ +28public: │ │ │ │ │ +29 │ │ │ │ │ +_3_0 typedef GV _G_r_i_d_V_i_e_w; │ │ │ │ │ +31 enum { │ │ │ │ │ +32 _c_o_d_i_m = cd │ │ │ │ │ +_3_3 }; │ │ │ │ │ +34 │ │ │ │ │ +_3_6 typedef typename GridView::template Codim::Entity _E_l_e_m_e_n_t; │ │ │ │ │ 37 │ │ │ │ │ -38 enum { value = (sizeof(test(0)) == sizeof(yes)) }; │ │ │ │ │ -39}; │ │ │ │ │ -40 │ │ │ │ │ -41template │ │ │ │ │ -42struct IsCallable │ │ │ │ │ -43{ │ │ │ │ │ -44 enum { value = true }; │ │ │ │ │ -45}; │ │ │ │ │ +_3_9 typedef typename Element::Geometry::LocalCoordinate _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ +_4_0 typedef typename Element::Geometry::GlobalCoordinate _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ +41 │ │ │ │ │ +_4_2 typedef _E_l_e_m_e_n_t _v_a_l_u_e___t_y_p_e; │ │ │ │ │ +43 │ │ │ │ │ +_4_5 typedef typename GridView::template Codim::Iterator _c_o_n_s_t___i_t_e_r_a_t_o_r; │ │ │ │ │ 46 │ │ │ │ │ -47template │ │ │ │ │ -48struct IsCallable │ │ │ │ │ -49{ │ │ │ │ │ -50 enum { value = true }; │ │ │ │ │ -51}; │ │ │ │ │ -52#endif │ │ │ │ │ -53 │ │ │ │ │ -59template::value > │ │ │ │ │ -_6_0struct _S_i_g_n_a_t_u_r_e_T_r_a_i_t_s {}; │ │ │ │ │ -61 │ │ │ │ │ -62#ifndef DOXYGEN │ │ │ │ │ -64template │ │ │ │ │ -65struct _S_i_g_n_a_t_u_r_e_T_r_a_i_t_s │ │ │ │ │ -66 : public _S_i_g_n_a_t_u_r_e_T_r_a_i_t_s │ │ │ │ │ -67{}; │ │ │ │ │ -68 │ │ │ │ │ -70template │ │ │ │ │ -71struct SignatureTraits │ │ │ │ │ -72 : public SignatureTraits │ │ │ │ │ -73{}; │ │ │ │ │ -74 │ │ │ │ │ -76template │ │ │ │ │ -77struct SignatureTraits │ │ │ │ │ -78 : public SignatureTraits │ │ │ │ │ -79{}; │ │ │ │ │ -80 │ │ │ │ │ -82template │ │ │ │ │ -83struct SignatureTraits │ │ │ │ │ -84 : public SignatureTraits │ │ │ │ │ -85{}; │ │ │ │ │ -86 │ │ │ │ │ -88template │ │ │ │ │ -89struct SignatureTraits │ │ │ │ │ -90{ │ │ │ │ │ -91 using Range = R; │ │ │ │ │ -92 using Domain = D; │ │ │ │ │ -93 │ │ │ │ │ -94 using RawRange = std::decay_t; │ │ │ │ │ -95 using RawDomain = std::decay_t; │ │ │ │ │ -96 │ │ │ │ │ -97 using RawSignature = RawRange(RawDomain); │ │ │ │ │ -98 │ │ │ │ │ -99 template class DerivativeTraits=DefaultDerivativeTraits> │ │ │ │ │ -100 using DerivativeSignature = typename DerivativeTraits::Range │ │ │ │ │ -(Domain); │ │ │ │ │ -101}; │ │ │ │ │ -102#endif │ │ │ │ │ -103 │ │ │ │ │ -104 │ │ │ │ │ -105template class │ │ │ │ │ -DerivativeTraits=DefaultDerivativeTraits> │ │ │ │ │ -_1_0_6struct _S_i_g_n_a_t_u_r_e_T_a_g; │ │ │ │ │ -107 │ │ │ │ │ -117template class DerivativeTraitsT> │ │ │ │ │ -_1_1_8struct _S_i_g_n_a_t_u_r_e_T_a_g │ │ │ │ │ -119{ │ │ │ │ │ -_1_2_0 using _S_i_g_n_a_t_u_r_e = Range(Domain); │ │ │ │ │ -121 │ │ │ │ │ -122 template │ │ │ │ │ -_1_2_3 using _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s = DerivativeTraitsT; │ │ │ │ │ -124}; │ │ │ │ │ -125 │ │ │ │ │ -126 │ │ │ │ │ -127 │ │ │ │ │ -136template class DerivativeTraits> │ │ │ │ │ -_1_3_7auto _d_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_T_a_g(_S_i_g_n_a_t_u_r_e_T_a_g │ │ │ │ │ -tag) │ │ │ │ │ -138{ │ │ │ │ │ -139 using DerivativeRange = typename DerivativeTraits::Range; │ │ │ │ │ -140 return _S_i_g_n_a_t_u_r_e_T_a_g_<_D_e_r_i_v_a_t_i_v_e_R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_>(); │ │ │ │ │ -141} │ │ │ │ │ -142 │ │ │ │ │ -143 │ │ │ │ │ -144 │ │ │ │ │ -158template class │ │ │ │ │ -DerivativeTraits> │ │ │ │ │ -_1_5_9auto _d_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_T_a_g_s(_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_a_g_<_S_i_g_n_a_t_u_r_e_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_> tag) │ │ │ │ │ -160{ │ │ │ │ │ -161 if constexpr (maxOrder==0) { │ │ │ │ │ -162 // If maxOrder== 0 we just need the given SignatureTag │ │ │ │ │ -163 return std::make_tuple(tag); │ │ │ │ │ -164 } else { │ │ │ │ │ -165 // else we first construct the tail tuple with SignatureTags for │ │ │ │ │ -derivatives │ │ │ │ │ -166 // of order 1 to maxOrder │ │ │ │ │ -167 auto tailTagsTuple = _d_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_T_a_g_s │ │ │ │ │ -(_d_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_T_a_g(tag)); │ │ │ │ │ -168 // and prepend this with the given SignatureTag. │ │ │ │ │ -169 // This is done by unpacking the tail tuple with apply(). │ │ │ │ │ -170 return std::apply([&](auto&&... tailTags){ │ │ │ │ │ -171 return std::make_tuple(tag, tailTags...); │ │ │ │ │ -172 }, tailTagsTuple); │ │ │ │ │ -173 } │ │ │ │ │ -174} │ │ │ │ │ -175 │ │ │ │ │ -176 │ │ │ │ │ -177 │ │ │ │ │ -178} // namespace Functions │ │ │ │ │ -179} // namespace Dune │ │ │ │ │ -180 │ │ │ │ │ -181#endif // DUNE_FUNCTIONS_COMMON_SIGNATURE_HH │ │ │ │ │ -_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_d_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_T_a_g │ │ │ │ │ -auto derivativeSignatureTag(SignatureTag< Range(Domain), DerivativeTraits > │ │ │ │ │ -tag) │ │ │ │ │ -Construct SignatureTag for derivative. │ │ │ │ │ -DDeeffiinniittiioonn signature.hh:137 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_d_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_T_a_g_s │ │ │ │ │ -auto derivativeSignatureTags(Dune::Functions::SignatureTag< Signature, │ │ │ │ │ -DerivativeTraits > tag) │ │ │ │ │ -Construct SignatureTags for derivatives. │ │ │ │ │ -DDeeffiinniittiioonn signature.hh:159 │ │ │ │ │ +_4_8 typedef _c_o_n_s_t___i_t_e_r_a_t_o_r _i_t_e_r_a_t_o_r; │ │ │ │ │ +49 │ │ │ │ │ +_5_1 _G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t(const _G_r_i_d_V_i_e_w& gv) : │ │ │ │ │ +52 gv_(gv) │ │ │ │ │ +53 {} │ │ │ │ │ +54 │ │ │ │ │ +_5_6 bool _c_o_n_t_a_i_n_s(const _E_l_e_m_e_n_t& e) const │ │ │ │ │ +57 { │ │ │ │ │ +58 return gv_.contains(e); │ │ │ │ │ +59 } │ │ │ │ │ +60 │ │ │ │ │ +_6_2 size_t _s_i_z_e() const │ │ │ │ │ +63 { │ │ │ │ │ +64 return gv_.size(_c_o_d_i_m); │ │ │ │ │ +65 } │ │ │ │ │ +66 │ │ │ │ │ +_6_8 _c_o_n_s_t___i_t_e_r_a_t_o_r _b_e_g_i_n() const │ │ │ │ │ +69 { │ │ │ │ │ +70 return gv_.template begin(); │ │ │ │ │ +71 } │ │ │ │ │ +72 │ │ │ │ │ +_7_4 _c_o_n_s_t___i_t_e_r_a_t_o_r _e_n_d() const │ │ │ │ │ +75 { │ │ │ │ │ +76 return gv_.template end(); │ │ │ │ │ +77 } │ │ │ │ │ +78 │ │ │ │ │ +_8_0 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ +81 { │ │ │ │ │ +82 return gv_; │ │ │ │ │ +83 } │ │ │ │ │ +84 │ │ │ │ │ +85private: │ │ │ │ │ +86 _G_r_i_d_V_i_e_w gv_; │ │ │ │ │ +87}; │ │ │ │ │ +88 │ │ │ │ │ +89 │ │ │ │ │ +90} // end of namespace Dune::Functions │ │ │ │ │ +91} // end of namespace Dune │ │ │ │ │ +92 │ │ │ │ │ +93#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRIDVIEWENTITYSET_HH │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_s_C_a_l_l_a_b_l_e │ │ │ │ │ -Helper class to check that F is callable. │ │ │ │ │ -DDeeffiinniittiioonn signature.hh:24 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_r_a_i_t_s │ │ │ │ │ -Helper class to deduce the signature of a callable. │ │ │ │ │ -DDeeffiinniittiioonn signature.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_a_g │ │ │ │ │ -DDeeffiinniittiioonn signature.hh:106 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_a_g_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_T_ _>_:_: │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ -DerivativeTraitsT< T > DerivativeTraits │ │ │ │ │ -DDeeffiinniittiioonn signature.hh:123 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_a_g_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_T_ _>_:_:_S_i_g_n_a_t_u_r_e │ │ │ │ │ -Range(Domain) Signature │ │ │ │ │ -DDeeffiinniittiioonn signature.hh:120 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t │ │ │ │ │ +An entity set for all entities of given codim in a grid view. │ │ │ │ │ +DDeeffiinniittiioonn gridviewentityset.hh:27 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t │ │ │ │ │ +GridViewEntitySet(const GridView &gv) │ │ │ │ │ +Construct GridViewEntitySet for a GridView. │ │ │ │ │ +DDeeffiinniittiioonn gridviewentityset.hh:51 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ +GV GridView │ │ │ │ │ +DDeeffiinniittiioonn gridviewentityset.hh:30 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_E_l_e_m_e_n_t │ │ │ │ │ +GridView::template Codim< codim >::Entity Element │ │ │ │ │ +Type of Elements contained in this EntitySet. │ │ │ │ │ +DDeeffiinniittiioonn gridviewentityset.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_e_n_d │ │ │ │ │ +const_iterator end() const │ │ │ │ │ +Create an end iterator. │ │ │ │ │ +DDeeffiinniittiioonn gridviewentityset.hh:74 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ +const GridView & gridView() const │ │ │ │ │ +Return the associated GridView. │ │ │ │ │ +DDeeffiinniittiioonn gridviewentityset.hh:80 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ │ +Element value_type │ │ │ │ │ +DDeeffiinniittiioonn gridviewentityset.hh:42 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_b_e_g_i_n │ │ │ │ │ +const_iterator begin() const │ │ │ │ │ +Create a begin iterator. │ │ │ │ │ +DDeeffiinniittiioonn gridviewentityset.hh:68 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ │ +GridView::template Codim< codim >::Iterator const_iterator │ │ │ │ │ +A forward iterator. │ │ │ │ │ +DDeeffiinniittiioonn gridviewentityset.hh:45 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +Element::Geometry::LocalCoordinate LocalCoordinate │ │ │ │ │ +Type of local coordinates with respect to the Element. │ │ │ │ │ +DDeeffiinniittiioonn gridviewentityset.hh:39 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_s_i_z_e │ │ │ │ │ +size_t size() const │ │ │ │ │ +Return number of Elements visited by an iterator. │ │ │ │ │ +DDeeffiinniittiioonn gridviewentityset.hh:62 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +Element::Geometry::GlobalCoordinate GlobalCoordinate │ │ │ │ │ +DDeeffiinniittiioonn gridviewentityset.hh:40 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_c_o_d_i_m │ │ │ │ │ +@ codim │ │ │ │ │ +DDeeffiinniittiioonn gridviewentityset.hh:32 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_c_o_n_t_a_i_n_s │ │ │ │ │ +bool contains(const Element &e) const │ │ │ │ │ +Return true if e is contained in the EntitySet. │ │ │ │ │ +DDeeffiinniittiioonn gridviewentityset.hh:56 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_V_i_e_w_E_n_t_i_t_y_S_e_t_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +const_iterator iterator │ │ │ │ │ +Same as const_iterator. │ │ │ │ │ +DDeeffiinniittiioonn gridviewentityset.hh:48 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00077.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: polymorphicsmallobject.hh File Reference │ │ │ │ +dune-functions: composedgridfunction.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,43 +65,57 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
polymorphicsmallobject.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
composedgridfunction.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <cstddef>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <algorithm>
│ │ │ │ +
#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::PolymorphicSmallObject< Base, bufferSize >
 A wrapper providing small object optimization with polymorphic types. More...
class  Dune::Functions::ComposedGridFunction< OF, IF >
 Composition of grid functions with another function. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

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

│ │ │ │ +Functions

template<class OF , class... IF>
 Dune::Functions::ComposedGridFunction (const OF &, const IF &...) -> ComposedGridFunction< OF, IF... >
 
template<class OF , class... IF>
auto Dune::Functions::makeComposedGridFunction (OF &&outerFunction, IF &&... innerFunction)
 Create a ComposedGridFunction that composes grid-functions with another function.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,26 +1,39 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -polymorphicsmallobject.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +composedgridfunction.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t_<_ _B_a_s_e_,_ _b_u_f_f_e_r_S_i_z_e_ _> │ │ │ │ │ -  A wrapper providing small object optimization with polymorphic types. │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_<_ _O_F_,_ _I_F_ _> │ │ │ │ │ +  Composition of grid functions with another function. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n (const OF &, const IF &...) - │ │ │ │ │ + > _C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n< OF, IF... > │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n (OF &&outerFunction, IF &&... │ │ │ │ │ + innerFunction) │ │ │ │ │ +  Create a _C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n that composes grid-functions with another │ │ │ │ │ + function. │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00077_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: polymorphicsmallobject.hh Source File │ │ │ │ +dune-functions: composedgridfunction.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,207 +70,225 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
polymorphicsmallobject.hh
│ │ │ │ +
composedgridfunction.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_COMMON_POLYMORPHICSMALLOBJECT_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_COMMON_POLYMORPHICSMALLOBJECT_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH
│ │ │ │
9
│ │ │ │ -
10#include <cstddef>
│ │ │ │ -
11#include <utility>
│ │ │ │ -
12#include <type_traits>
│ │ │ │ -
13#include <algorithm>
│ │ │ │ -
14
│ │ │ │ -
15namespace Dune {
│ │ │ │ -
16namespace Functions {
│ │ │ │ -
17
│ │ │ │ -
18
│ │ │ │ -
49template<class Base, size_t bufferSize>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
51{
│ │ │ │ -
52 // Actual buffer size must be > 0
│ │ │ │ -
53 static constexpr std::size_t actualBufferSize = std::max(sizeof(std::byte), bufferSize);
│ │ │ │ +
10#include <type_traits>
│ │ │ │ +
11#include <tuple>
│ │ │ │ +
12
│ │ │ │ +
13#include <dune/common/referencehelper.hh>
│ │ │ │ +
14#include <dune/common/typeutilities.hh>
│ │ │ │ +
15
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
19
│ │ │ │ +
20
│ │ │ │ +
21namespace Dune {
│ │ │ │ +
22namespace Functions {
│ │ │ │ +
23
│ │ │ │ +
24
│ │ │ │ +
25
│ │ │ │ +
44template<class OF, class... IF>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
46{
│ │ │ │ +
47 using InnerFunctions = std::tuple<IF...>;
│ │ │ │ +
48 using InnerLocalFunctions = std::tuple<decltype(localFunction(resolveRef(std::declval<const IF&>())))...>;
│ │ │ │ +
49
│ │ │ │ +
50 template<std::size_t i>
│ │ │ │ +
51 using InnerFunction = std::decay_t<ResolveRef_t<std::tuple_element_t<i, InnerFunctions>>>;
│ │ │ │ +
52
│ │ │ │ +
53 using OuterFunction = OF;
│ │ │ │
54
│ │ │ │ -
55 // Alignment requirement for the buffer. The `Derived` type must have
│ │ │ │ -
56 // an alignment requirement that is a divisor of `bufferAlignment`
│ │ │ │ -
57 static constexpr std::size_t bufferAlignment = alignof(std::max_align_t);
│ │ │ │ -
58
│ │ │ │ -
59public:
│ │ │ │ -
60
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
63 p_(nullptr)
│ │ │ │ -
64 {}
│ │ │ │ -
│ │ │ │ -
65
│ │ │ │ -
72 template<class Derived,
│ │ │ │ -
73 std::enable_if_t<std::is_base_of_v<Base, std::remove_cv_t<
│ │ │ │ -
74 std::remove_reference_t<Derived>>>, int> = 0>
│ │ │ │ -
│ │ │ │ -
75 PolymorphicSmallObject(Derived&& derived)
│ │ │ │ -
76 {
│ │ │ │ -
77 constexpr bool useBuffer = (sizeof(Derived) <= bufferSize)
│ │ │ │ -
78 && (bufferAlignment % alignof(Derived) == 0);
│ │ │ │ -
79
│ │ │ │ -
80 if constexpr (useBuffer) {
│ │ │ │ -
81 p_ = new (&buffer_) Derived(std::forward<Derived>(derived));
│ │ │ │ -
82 } else {
│ │ │ │ -
83 p_ = new Derived(std::forward<Derived>(derived));
│ │ │ │ -
84 }
│ │ │ │ -
85 }
│ │ │ │ -
│ │ │ │ -
86
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
89 {
│ │ │ │ -
90 moveToWrappedObject(std::move(other));
│ │ │ │ -
91 }
│ │ │ │ -
│ │ │ │ -
92
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
95 {
│ │ │ │ -
96 copyToWrappedObject(other);
│ │ │ │ -
97 }
│ │ │ │ -
│ │ │ │ +
55public:
│ │ │ │ +
56
│ │ │ │ +
57 using EntitySet = typename InnerFunction<0>::EntitySet;
│ │ │ │ +
58 using Element = typename EntitySet::Element;
│ │ │ │ +
59
│ │ │ │ +
60 using Domain = typename EntitySet::GlobalCoordinate;
│ │ │ │ +
61 using LocalDomain = typename EntitySet::LocalCoordinate;
│ │ │ │ +
62
│ │ │ │ +
63 using Range = decltype(std::declval<OF>()(std::declval<IF>()(std::declval<Domain>())...));
│ │ │ │ +
64
│ │ │ │ +
65private:
│ │ │ │ +
66
│ │ │ │ +
67 using Traits = Imp::GridFunctionTraits<Range(Domain), EntitySet, DefaultDerivativeTraits, 16>;
│ │ │ │ +
68
│ │ │ │ +
69 class LocalFunction
│ │ │ │ +
70 {
│ │ │ │ +
71 public:
│ │ │ │ +
78 LocalFunction(const ComposedGridFunction& globalFunction) :
│ │ │ │ +
79 globalFunction_(globalFunction),
│ │ │ │ +
80 innerLocalFunctions_(globalFunction.innerLocalFunctions())
│ │ │ │ +
81 {}
│ │ │ │ +
82
│ │ │ │ +
92 void bind(const Element& element)
│ │ │ │ +
93 {
│ │ │ │ +
94 std::apply([&](auto&... innerFunction) {
│ │ │ │ +
95 (innerFunction.bind(element),...);
│ │ │ │ +
96 }, innerLocalFunctions_);
│ │ │ │ +
97 }
│ │ │ │
98
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
101 {
│ │ │ │ -
102 destroyWrappedObject();
│ │ │ │ -
103 }
│ │ │ │ -
│ │ │ │ -
104
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
107 {
│ │ │ │ -
108 if (&other!=this)
│ │ │ │ -
109 {
│ │ │ │ -
110 destroyWrappedObject();
│ │ │ │ -
111 copyToWrappedObject(other);
│ │ │ │ -
112 }
│ │ │ │ -
113 return *this;
│ │ │ │ -
114 }
│ │ │ │ -
│ │ │ │ +
100 void unbind()
│ │ │ │ +
101 {
│ │ │ │ +
102 std::apply([&](auto&... innerFunction) {
│ │ │ │ +
103 (innerFunction.unbind(),...);
│ │ │ │ +
104 }, innerLocalFunctions_);
│ │ │ │ +
105 }
│ │ │ │ +
106
│ │ │ │ +
109 bool bound() const
│ │ │ │ +
110 {
│ │ │ │ +
111 return std::apply([](const auto&... innerFunction) {
│ │ │ │ +
112 return (innerFunction.bound() && ...);
│ │ │ │ +
113 }, innerLocalFunctions_);
│ │ │ │ +
114 }
│ │ │ │
115
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
118 {
│ │ │ │ -
119 destroyWrappedObject();
│ │ │ │ -
120 moveToWrappedObject(std::move(other));
│ │ │ │ -
121 return *this;
│ │ │ │ -
122 }
│ │ │ │ -
│ │ │ │ -
123
│ │ │ │ -
│ │ │ │ -
125 explicit operator bool() const
│ │ │ │ -
126 {
│ │ │ │ -
127 return p_;
│ │ │ │ -
128 }
│ │ │ │ -
│ │ │ │ -
129
│ │ │ │ -
│ │ │ │ -
131 bool bufferUsed() const
│ │ │ │ -
132 {
│ │ │ │ -
133 return ((void*) (p_) == (void*)(&buffer_));
│ │ │ │ -
134 }
│ │ │ │ -
│ │ │ │ -
135
│ │ │ │ -
│ │ │ │ -
137 const Base& get() const
│ │ │ │ -
138 {
│ │ │ │ -
139 return *p_;
│ │ │ │ -
140 }
│ │ │ │ -
│ │ │ │ -
141
│ │ │ │ -
│ │ │ │ -
143 Base& get()
│ │ │ │ -
144 {
│ │ │ │ -
145 return *p_;
│ │ │ │ -
146 }
│ │ │ │ -
│ │ │ │ -
147
│ │ │ │ -
148private:
│ │ │ │ -
149
│ │ │ │ -
150 void destroyWrappedObject() noexcept
│ │ │ │ -
151 {
│ │ │ │ -
152 if (operator bool())
│ │ │ │ -
153 {
│ │ │ │ -
154 if (bufferUsed())
│ │ │ │ -
155 p_->~Base();
│ │ │ │ -
156 else
│ │ │ │ -
157 delete p_;
│ │ │ │ -
158 }
│ │ │ │ -
159 }
│ │ │ │ -
160
│ │ │ │ -
161 void moveToWrappedObject(PolymorphicSmallObject&& other) noexcept
│ │ │ │ -
162 {
│ │ │ │ -
163 if (other.bufferUsed())
│ │ │ │ -
164 p_ = other.p_->move(&buffer_);
│ │ │ │ -
165 else
│ │ │ │ -
166 {
│ │ │ │ -
167 // We don't need to check for &other_!=this, because you can't
│ │ │ │ -
168 // have an rvalue to *this and call it's assignment/constructor
│ │ │ │ -
169 // at the same time. (Despite trying to shoot yourself in the foot
│ │ │ │ -
170 // with std::move explicitly.)
│ │ │ │ -
171
│ │ │ │ -
172 // Take ownership of allocated object
│ │ │ │ -
173 p_ = other.p_;
│ │ │ │ -
174
│ │ │ │ -
175 // Leave pointer in a clean state to avoid double freeing it.
│ │ │ │ -
176 other.p_ = 0;
│ │ │ │ -
177 }
│ │ │ │ -
178 }
│ │ │ │ -
179
│ │ │ │ -
180 void copyToWrappedObject(const PolymorphicSmallObject& other)
│ │ │ │ -
181 {
│ │ │ │ -
182 if (other.bufferUsed())
│ │ │ │ -
183 p_ = other.p_->clone(&buffer_);
│ │ │ │ -
184 else
│ │ │ │ -
185 p_ = other.p_->clone();
│ │ │ │ -
186 }
│ │ │ │ -
187
│ │ │ │ -
188 alignas(bufferAlignment) std::byte buffer_[actualBufferSize];
│ │ │ │ -
189 Base* p_;
│ │ │ │ -
190};
│ │ │ │ -
│ │ │ │ -
191
│ │ │ │ -
192
│ │ │ │ -
193} // namespace Functions
│ │ │ │ -
194} // namespace Dune
│ │ │ │ -
195
│ │ │ │ -
196#endif // DUNE_FUNCTIONS_COMMON_POLYMORPHICSMALLOBJECT_HH
│ │ │ │ +
125 Range operator()(const LocalDomain& x) const
│ │ │ │ +
126 {
│ │ │ │ +
127 return std::apply([&](const auto&... innerFunction) {
│ │ │ │ +
128 return globalFunction_.outerFunction_(innerFunction(x)...);
│ │ │ │ +
129 }, innerLocalFunctions_);
│ │ │ │ +
130 }
│ │ │ │ +
131
│ │ │ │ +
141 const Element& localContext() const
│ │ │ │ +
142 {
│ │ │ │ +
143 return std::get<0>(innerLocalFunctions_).localContext();
│ │ │ │ +
144 }
│ │ │ │ +
145
│ │ │ │ +
147 friend typename Traits::LocalFunctionTraits::DerivativeInterface derivative(const LocalFunction& t)
│ │ │ │ +
148 {
│ │ │ │ +
149 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │ +
150 }
│ │ │ │ +
151
│ │ │ │ +
152 private:
│ │ │ │ +
153 const ComposedGridFunction& globalFunction_;
│ │ │ │ +
154 InnerLocalFunctions innerLocalFunctions_;
│ │ │ │ +
155 };
│ │ │ │ +
156
│ │ │ │ +
157public:
│ │ │ │ +
158
│ │ │ │ +
168 template<class OFT, class... IFT,
│ │ │ │ +
169 disableCopyMove<ComposedGridFunction, OFT> = 0,
│ │ │ │ +
170 std::enable_if_t<(sizeof...(IFT) > 0), int> = 0>
│ │ │ │ +
│ │ │ │ +
171 ComposedGridFunction(OFT&& outerFunction, IFT&&... innerFunctions) :
│ │ │ │ +
172 outerFunction_(std::forward<OFT>(outerFunction)),
│ │ │ │ +
173 innerFunctions_(std::forward<IFT>(innerFunctions)...)
│ │ │ │ +
174 {}
│ │ │ │ +
│ │ │ │ +
175
│ │ │ │ +
│ │ │ │ +
177 Range operator()(const Domain& x) const
│ │ │ │ +
178 {
│ │ │ │ +
179 return std::apply([&](const auto&... innerFunction) {
│ │ │ │ +
180 return outerFunction_(innerFunction(x)...);
│ │ │ │ +
181 }, innerFunctions_);
│ │ │ │ +
182 }
│ │ │ │ +
│ │ │ │ +
183
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
186 {
│ │ │ │ +
187 DUNE_THROW(NotImplemented,"not implemented");
│ │ │ │ +
188 }
│ │ │ │ +
│ │ │ │ +
189
│ │ │ │ +
│ │ │ │ +
196 friend LocalFunction localFunction(const ComposedGridFunction& cgf)
│ │ │ │ +
197 {
│ │ │ │ +
198 return LocalFunction(cgf);
│ │ │ │ +
199 }
│ │ │ │ +
│ │ │ │ +
200
│ │ │ │ +
│ │ │ │ +
211 const EntitySet& entitySet() const
│ │ │ │ +
212 {
│ │ │ │ +
213 return resolveRef(std::get<0>(innerFunctions_)).entitySet();
│ │ │ │ +
214 }
│ │ │ │ +
│ │ │ │ +
215
│ │ │ │ +
216protected:
│ │ │ │ +
217
│ │ │ │ +
│ │ │ │ +
218 InnerLocalFunctions innerLocalFunctions() const
│ │ │ │ +
219 {
│ │ │ │ +
220 return std::apply([&](const auto&... innerFunction) {
│ │ │ │ +
221 return std::make_tuple(localFunction(resolveRef(innerFunction))...);
│ │ │ │ +
222 }, innerFunctions_);
│ │ │ │ +
223 }
│ │ │ │ +
│ │ │ │ +
224
│ │ │ │ +
225 OuterFunction outerFunction_;
│ │ │ │ +
226 InnerFunctions innerFunctions_;
│ │ │ │ +
227};
│ │ │ │ +
│ │ │ │ +
228
│ │ │ │ +
229// deduction guides
│ │ │ │ +
230template<class OF, class... IF>
│ │ │ │ +
231ComposedGridFunction(const OF&, const IF&...)
│ │ │ │ +
232 -> ComposedGridFunction<OF,IF...>;
│ │ │ │ +
233
│ │ │ │ +
234
│ │ │ │ +
257template<class OF, class... IF>
│ │ │ │ +
│ │ │ │ +
258auto makeComposedGridFunction(OF&& outerFunction, IF&&... innerFunction)
│ │ │ │ +
259{
│ │ │ │ +
260 using ComposedGridFunctionType = ComposedGridFunction<std::decay_t<OF>, std::decay_t<IF>...>;
│ │ │ │ +
261 return ComposedGridFunctionType(std::forward<OF>(outerFunction), std::forward<IF>(innerFunction)...);
│ │ │ │ +
262}
│ │ │ │ +
│ │ │ │ +
263
│ │ │ │ +
264
│ │ │ │ +
265
│ │ │ │ +
266}} // namespace Dune::Functions
│ │ │ │ +
267
│ │ │ │ +
268
│ │ │ │ +
269
│ │ │ │ +
270#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const TrigonometricFunction< K, sinFactor, cosFactor > &f)
Obtain derivative of TrigonometricFunction function.
Definition trigonometricfunction.hh:43
│ │ │ │ +
auto makeComposedGridFunction(OF &&outerFunction, IF &&... innerFunction)
Create a ComposedGridFunction that composes grid-functions with another function.
Definition composedgridfunction.hh:258
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
A wrapper providing small object optimization with polymorphic types.
Definition polymorphicsmallobject.hh:51
│ │ │ │ -
const Base & get() const
Obtain reference to stored object.
Definition polymorphicsmallobject.hh:137
│ │ │ │ -
bool bufferUsed() const
Check if object is stored in internal stack buffer.
Definition polymorphicsmallobject.hh:131
│ │ │ │ -
PolymorphicSmallObject(Derived &&derived)
Construct from object.
Definition polymorphicsmallobject.hh:75
│ │ │ │ -
PolymorphicSmallObject(PolymorphicSmallObject &&other) noexcept
Move constructor from other PolymorphicSmallObject.
Definition polymorphicsmallobject.hh:88
│ │ │ │ -
PolymorphicSmallObject & operator=(const PolymorphicSmallObject &other)
Copy assignment from other PolymorphicSmallObject.
Definition polymorphicsmallobject.hh:106
│ │ │ │ -
PolymorphicSmallObject & operator=(PolymorphicSmallObject &&other) noexcept
Move assignment from other PolymorphicSmallObject.
Definition polymorphicsmallobject.hh:117
│ │ │ │ -
PolymorphicSmallObject(const PolymorphicSmallObject &other)
Copy constructor from other PolymorphicSmallObject.
Definition polymorphicsmallobject.hh:94
│ │ │ │ -
~PolymorphicSmallObject()
Destructor.
Definition polymorphicsmallobject.hh:100
│ │ │ │ -
PolymorphicSmallObject()
Default constructor.
Definition polymorphicsmallobject.hh:62
│ │ │ │ -
Base & get()
Obtain mutable reference to stored object.
Definition polymorphicsmallobject.hh:143
│ │ │ │ +
Default implementation for derivative traits.
Definition defaultderivativetraits.hh:41
│ │ │ │ +
Composition of grid functions with another function.
Definition composedgridfunction.hh:46
│ │ │ │ +
OuterFunction outerFunction_
Definition composedgridfunction.hh:225
│ │ │ │ +
InnerFunctions innerFunctions_
Definition composedgridfunction.hh:226
│ │ │ │ +
ComposedGridFunction(OFT &&outerFunction, IFT &&... innerFunctions)
Create ComposedGridFunction.
Definition composedgridfunction.hh:171
│ │ │ │ +
const EntitySet & entitySet() const
Return the EntitySet associated to this composed grid-function.
Definition composedgridfunction.hh:211
│ │ │ │ +
typename InnerFunction< 0 >::EntitySet EntitySet
Definition composedgridfunction.hh:57
│ │ │ │ +
typename EntitySet::LocalCoordinate LocalDomain
Definition composedgridfunction.hh:61
│ │ │ │ +
typename EntitySet::Element Element
Definition composedgridfunction.hh:58
│ │ │ │ +
InnerLocalFunctions innerLocalFunctions() const
Definition composedgridfunction.hh:218
│ │ │ │ +
friend LocalFunction localFunction(const ComposedGridFunction &cgf)
Create a local-function of this composed grid-function.
Definition composedgridfunction.hh:196
│ │ │ │ +
decltype(std::declval< OF >()(std::declval< IF >()(std::declval< Domain >())...)) Range
Definition composedgridfunction.hh:63
│ │ │ │ +
typename EntitySet::GlobalCoordinate Domain
Definition composedgridfunction.hh:60
│ │ │ │ +
Range operator()(const Domain &x) const
Evaluation of the composed grid function in coordinates x
Definition composedgridfunction.hh:177
│ │ │ │ +
friend Traits::DerivativeInterface derivative(const ComposedGridFunction &t)
Not implemented.
Definition composedgridfunction.hh:185
│ │ │ │ +
Definition gridfunction.hh:36
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,209 +1,255 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _c_o_m_m_o_n │ │ │ │ │ -polymorphicsmallobject.hh │ │ │ │ │ + * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ +composedgridfunction.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_COMMON_POLYMORPHICSMALLOBJECT_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_COMMON_POLYMORPHICSMALLOBJECT_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14 │ │ │ │ │ -15namespace _D_u_n_e { │ │ │ │ │ -16namespace Functions { │ │ │ │ │ -17 │ │ │ │ │ -18 │ │ │ │ │ -49template │ │ │ │ │ -_5_0class _P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t │ │ │ │ │ -51{ │ │ │ │ │ -52 // Actual buffer size must be > 0 │ │ │ │ │ -53 static constexpr std::size_t actualBufferSize = std::max(sizeof(std::byte), │ │ │ │ │ -bufferSize); │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12 │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15 │ │ │ │ │ +16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ +18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ +19 │ │ │ │ │ +20 │ │ │ │ │ +21namespace _D_u_n_e { │ │ │ │ │ +22namespace Functions { │ │ │ │ │ +23 │ │ │ │ │ +24 │ │ │ │ │ +25 │ │ │ │ │ +44template │ │ │ │ │ +_4_5class _C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ +46{ │ │ │ │ │ +47 using InnerFunctions = std::tuple; │ │ │ │ │ +48 using InnerLocalFunctions = std::tuple())))...>; │ │ │ │ │ +49 │ │ │ │ │ +50 template │ │ │ │ │ +51 using InnerFunction = std::decay_t>>; │ │ │ │ │ +52 │ │ │ │ │ +53 using OuterFunction = OF; │ │ │ │ │ 54 │ │ │ │ │ -55 // Alignment requirement for the buffer. The `Derived` type must have │ │ │ │ │ -56 // an alignment requirement that is a divisor of `bufferAlignment` │ │ │ │ │ -57 static constexpr std::size_t bufferAlignment = alignof(std::max_align_t); │ │ │ │ │ -58 │ │ │ │ │ -59public: │ │ │ │ │ -60 │ │ │ │ │ -_6_2 _P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t() : │ │ │ │ │ -63 p_(nullptr) │ │ │ │ │ -64 {} │ │ │ │ │ -65 │ │ │ │ │ -72 template>>, int> = 0> │ │ │ │ │ -_7_5 _P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t(Derived&& derived) │ │ │ │ │ -76 { │ │ │ │ │ -77 constexpr bool useBuffer = (sizeof(Derived) <= bufferSize) │ │ │ │ │ -78 && (bufferAlignment % alignof(Derived) == 0); │ │ │ │ │ -79 │ │ │ │ │ -80 if constexpr (useBuffer) { │ │ │ │ │ -81 p_ = new (&buffer_) Derived(std::forward(derived)); │ │ │ │ │ -82 } else { │ │ │ │ │ -83 p_ = new Derived(std::forward(derived)); │ │ │ │ │ -84 } │ │ │ │ │ -85 } │ │ │ │ │ -86 │ │ │ │ │ -_8_8 _P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t(_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t&& other) noexcept │ │ │ │ │ -89 { │ │ │ │ │ -90 moveToWrappedObject(std::move(other)); │ │ │ │ │ -91 } │ │ │ │ │ -92 │ │ │ │ │ -_9_4 _P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t(const _P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t& other) │ │ │ │ │ -95 { │ │ │ │ │ -96 copyToWrappedObject(other); │ │ │ │ │ +55public: │ │ │ │ │ +56 │ │ │ │ │ +_5_7 using _E_n_t_i_t_y_S_e_t = typename InnerFunction<0>::EntitySet; │ │ │ │ │ +_5_8 using _E_l_e_m_e_n_t = typename EntitySet::Element; │ │ │ │ │ +59 │ │ │ │ │ +_6_0 using _D_o_m_a_i_n = typename EntitySet::GlobalCoordinate; │ │ │ │ │ +_6_1 using _L_o_c_a_l_D_o_m_a_i_n = typename EntitySet::LocalCoordinate; │ │ │ │ │ +62 │ │ │ │ │ +_6_3 using _R_a_n_g_e = decltype(std::declval()(std::declval()(std:: │ │ │ │ │ +declval())...)); │ │ │ │ │ +64 │ │ │ │ │ +65private: │ │ │ │ │ +66 │ │ │ │ │ +67 using Traits = Imp::GridFunctionTraits<_R_a_n_g_e(_D_o_m_a_i_n), _E_n_t_i_t_y_S_e_t, │ │ │ │ │ +_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s, 16>; │ │ │ │ │ +68 │ │ │ │ │ +69 class LocalFunction │ │ │ │ │ +70 { │ │ │ │ │ +71 public: │ │ │ │ │ +78 LocalFunction(const _C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n& globalFunction) : │ │ │ │ │ +79 globalFunction_(globalFunction), │ │ │ │ │ +80 innerLocalFunctions_(globalFunction._i_n_n_e_r_L_o_c_a_l_F_u_n_c_t_i_o_n_s()) │ │ │ │ │ +81 {} │ │ │ │ │ +82 │ │ │ │ │ +92 void bind(const _E_l_e_m_e_n_t& element) │ │ │ │ │ +93 { │ │ │ │ │ +94 std::apply([&](auto&... innerFunction) { │ │ │ │ │ +95 (innerFunction.bind(element),...); │ │ │ │ │ +96 }, innerLocalFunctions_); │ │ │ │ │ 97 } │ │ │ │ │ 98 │ │ │ │ │ -_1_0_0 _~_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t() │ │ │ │ │ +100 void unbind() │ │ │ │ │ 101 { │ │ │ │ │ -102 destroyWrappedObject(); │ │ │ │ │ -103 } │ │ │ │ │ -104 │ │ │ │ │ -_1_0_6 _P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t& _o_p_e_r_a_t_o_r_=(const _P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t& other) │ │ │ │ │ -107 { │ │ │ │ │ -108 if (&other!=this) │ │ │ │ │ -109 { │ │ │ │ │ -110 destroyWrappedObject(); │ │ │ │ │ -111 copyToWrappedObject(other); │ │ │ │ │ -112 } │ │ │ │ │ -113 return *this; │ │ │ │ │ +102 std::apply([&](auto&... innerFunction) { │ │ │ │ │ +103 (innerFunction.unbind(),...); │ │ │ │ │ +104 }, innerLocalFunctions_); │ │ │ │ │ +105 } │ │ │ │ │ +106 │ │ │ │ │ +109 bool bound() const │ │ │ │ │ +110 { │ │ │ │ │ +111 return std::apply([](const auto&... innerFunction) { │ │ │ │ │ +112 return (innerFunction.bound() && ...); │ │ │ │ │ +113 }, innerLocalFunctions_); │ │ │ │ │ 114 } │ │ │ │ │ 115 │ │ │ │ │ -_1_1_7 _P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t& _o_p_e_r_a_t_o_r_=(_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t&& other) noexcept │ │ │ │ │ -118 { │ │ │ │ │ -119 destroyWrappedObject(); │ │ │ │ │ -120 moveToWrappedObject(std::move(other)); │ │ │ │ │ -121 return *this; │ │ │ │ │ -122 } │ │ │ │ │ -123 │ │ │ │ │ -_1_2_5 explicit operator bool() const │ │ │ │ │ +125 _R_a_n_g_e operator()(const _L_o_c_a_l_D_o_m_a_i_n& x) const │ │ │ │ │ 126 { │ │ │ │ │ -127 return p_; │ │ │ │ │ -128 } │ │ │ │ │ -129 │ │ │ │ │ -_1_3_1 bool _b_u_f_f_e_r_U_s_e_d() const │ │ │ │ │ -132 { │ │ │ │ │ -133 return ((void*) (p_) == (void*)(&buffer_)); │ │ │ │ │ -134 } │ │ │ │ │ -135 │ │ │ │ │ -_1_3_7 const Base& _g_e_t() const │ │ │ │ │ -138 { │ │ │ │ │ -139 return *p_; │ │ │ │ │ -140 } │ │ │ │ │ -141 │ │ │ │ │ -_1_4_3 Base& _g_e_t() │ │ │ │ │ -144 { │ │ │ │ │ -145 return *p_; │ │ │ │ │ -146 } │ │ │ │ │ -147 │ │ │ │ │ -148private: │ │ │ │ │ -149 │ │ │ │ │ -150 void destroyWrappedObject() noexcept │ │ │ │ │ -151 { │ │ │ │ │ -152 if (operator bool()) │ │ │ │ │ -153 { │ │ │ │ │ -154 if (_b_u_f_f_e_r_U_s_e_d()) │ │ │ │ │ -155 p_->~Base(); │ │ │ │ │ -156 else │ │ │ │ │ -157 delete p_; │ │ │ │ │ -158 } │ │ │ │ │ -159 } │ │ │ │ │ -160 │ │ │ │ │ -161 void moveToWrappedObject(_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t&& other) noexcept │ │ │ │ │ -162 { │ │ │ │ │ -163 if (other.bufferUsed()) │ │ │ │ │ -164 p_ = other.p_->move(&buffer_); │ │ │ │ │ -165 else │ │ │ │ │ -166 { │ │ │ │ │ -167 // We don't need to check for &other_!=this, because you can't │ │ │ │ │ -168 // have an rvalue to *this and call it's assignment/constructor │ │ │ │ │ -169 // at the same time. (Despite trying to shoot yourself in the foot │ │ │ │ │ -170 // with std::move explicitly.) │ │ │ │ │ -171 │ │ │ │ │ -172 // Take ownership of allocated object │ │ │ │ │ -173 p_ = other.p_; │ │ │ │ │ -174 │ │ │ │ │ -175 // Leave pointer in a clean state to avoid double freeing it. │ │ │ │ │ -176 other.p_ = 0; │ │ │ │ │ -177 } │ │ │ │ │ -178 } │ │ │ │ │ -179 │ │ │ │ │ -180 void copyToWrappedObject(const _P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t& other) │ │ │ │ │ -181 { │ │ │ │ │ -182 if (other.bufferUsed()) │ │ │ │ │ -183 p_ = other.p_->clone(&buffer_); │ │ │ │ │ -184 else │ │ │ │ │ -185 p_ = other.p_->clone(); │ │ │ │ │ -186 } │ │ │ │ │ -187 │ │ │ │ │ -188 alignas(bufferAlignment) std::byte buffer_[actualBufferSize]; │ │ │ │ │ -189 Base* p_; │ │ │ │ │ -190}; │ │ │ │ │ -191 │ │ │ │ │ -192 │ │ │ │ │ -193} // namespace Functions │ │ │ │ │ -194} // namespace Dune │ │ │ │ │ -195 │ │ │ │ │ -196#endif // DUNE_FUNCTIONS_COMMON_POLYMORPHICSMALLOBJECT_HH │ │ │ │ │ +127 return std::apply([&](const auto&... innerFunction) { │ │ │ │ │ +128 return globalFunction_.outerFunction_(innerFunction(x)...); │ │ │ │ │ +129 }, innerLocalFunctions_); │ │ │ │ │ +130 } │ │ │ │ │ +131 │ │ │ │ │ +141 const _E_l_e_m_e_n_t& localContext() const │ │ │ │ │ +142 { │ │ │ │ │ +143 return std::get<0>(innerLocalFunctions_).localContext(); │ │ │ │ │ +144 } │ │ │ │ │ +145 │ │ │ │ │ +147 friend typename _T_r_a_i_t_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_T_r_a_i_t_s_:_:_D_e_r_i_v_a_t_i_v_e_I_n_t_e_r_f_a_c_e _d_e_r_i_v_a_t_i_v_e │ │ │ │ │ +(const LocalFunction& t) │ │ │ │ │ +148 { │ │ │ │ │ +149 DUNE_THROW(NotImplemented,"not implemented"); │ │ │ │ │ +150 } │ │ │ │ │ +151 │ │ │ │ │ +152 private: │ │ │ │ │ +153 const _C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n& globalFunction_; │ │ │ │ │ +154 InnerLocalFunctions innerLocalFunctions_; │ │ │ │ │ +155 }; │ │ │ │ │ +156 │ │ │ │ │ +157public: │ │ │ │ │ +158 │ │ │ │ │ +168 template = 0, │ │ │ │ │ +170 std::enable_if_t<(sizeof...(IFT) > 0), int> = 0> │ │ │ │ │ +_1_7_1 _C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n(OFT&& outerFunction, IFT&&... innerFunctions) : │ │ │ │ │ +172 _o_u_t_e_r_F_u_n_c_t_i_o_n__(std::forward(outerFunction)), │ │ │ │ │ +173 _i_n_n_e_r_F_u_n_c_t_i_o_n_s__(std::forward(innerFunctions)...) │ │ │ │ │ +174 {} │ │ │ │ │ +175 │ │ │ │ │ +_1_7_7 _R_a_n_g_e _o_p_e_r_a_t_o_r_(_)(const _D_o_m_a_i_n& x) const │ │ │ │ │ +178 { │ │ │ │ │ +179 return std::apply([&](const auto&... innerFunction) { │ │ │ │ │ +180 return _o_u_t_e_r_F_u_n_c_t_i_o_n__(innerFunction(x)...); │ │ │ │ │ +181 }, _i_n_n_e_r_F_u_n_c_t_i_o_n_s__); │ │ │ │ │ +182 } │ │ │ │ │ +183 │ │ │ │ │ +_1_8_5 friend typename _T_r_a_i_t_s_:_:_D_e_r_i_v_a_t_i_v_e_I_n_t_e_r_f_a_c_e _d_e_r_i_v_a_t_i_v_e(const │ │ │ │ │ +_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n& t) │ │ │ │ │ +186 { │ │ │ │ │ +187 DUNE_THROW(NotImplemented,"not implemented"); │ │ │ │ │ +188 } │ │ │ │ │ +189 │ │ │ │ │ +_1_9_6 friend LocalFunction _l_o_c_a_l_F_u_n_c_t_i_o_n(const _C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n& cgf) │ │ │ │ │ +197 { │ │ │ │ │ +198 return LocalFunction(cgf); │ │ │ │ │ +199 } │ │ │ │ │ +200 │ │ │ │ │ +_2_1_1 const _E_n_t_i_t_y_S_e_t& _e_n_t_i_t_y_S_e_t() const │ │ │ │ │ +212 { │ │ │ │ │ +213 return resolveRef(std::get<0>(_i_n_n_e_r_F_u_n_c_t_i_o_n_s__)).entitySet(); │ │ │ │ │ +214 } │ │ │ │ │ +215 │ │ │ │ │ +216protected: │ │ │ │ │ +217 │ │ │ │ │ +_2_1_8 InnerLocalFunctions _i_n_n_e_r_L_o_c_a_l_F_u_n_c_t_i_o_n_s() const │ │ │ │ │ +219 { │ │ │ │ │ +220 return std::apply([&](const auto&... innerFunction) { │ │ │ │ │ +221 return std::make_tuple(_l_o_c_a_l_F_u_n_c_t_i_o_n(resolveRef(innerFunction))...); │ │ │ │ │ +222 }, _i_n_n_e_r_F_u_n_c_t_i_o_n_s__); │ │ │ │ │ +223 } │ │ │ │ │ +224 │ │ │ │ │ +_2_2_5 OuterFunction _o_u_t_e_r_F_u_n_c_t_i_o_n__; │ │ │ │ │ +_2_2_6 InnerFunctions _i_n_n_e_r_F_u_n_c_t_i_o_n_s__; │ │ │ │ │ +227}; │ │ │ │ │ +228 │ │ │ │ │ +229// deduction guides │ │ │ │ │ +230template │ │ │ │ │ +_2_3_1_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n(const OF&, const IF&...) │ │ │ │ │ +232 -> _C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n; │ │ │ │ │ +233 │ │ │ │ │ +234 │ │ │ │ │ +257template │ │ │ │ │ +_2_5_8auto _m_a_k_e_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n(OF&& outerFunction, IF&&... innerFunction) │ │ │ │ │ +259{ │ │ │ │ │ +260 using ComposedGridFunctionType = _C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_<_s_t_d_:_:_d_e_c_a_y___t_<_O_F_>, │ │ │ │ │ +std::decay_t...>; │ │ │ │ │ +261 return ComposedGridFunctionType(std::forward(outerFunction), std:: │ │ │ │ │ +forward(innerFunction)...); │ │ │ │ │ +262} │ │ │ │ │ +263 │ │ │ │ │ +264 │ │ │ │ │ +265 │ │ │ │ │ +266}} // namespace Dune::Functions │ │ │ │ │ +267 │ │ │ │ │ +268 │ │ │ │ │ +269 │ │ │ │ │ +270#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_COMPOSEDGRIDFUNCTION_HH │ │ │ │ │ +_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h │ │ │ │ │ +_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h │ │ │ │ │ +_g_r_i_d_f_u_n_c_t_i_o_n_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ +TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const │ │ │ │ │ +TrigonometricFunction< K, sinFactor, cosFactor > &f) │ │ │ │ │ +Obtain derivative of TrigonometricFunction function. │ │ │ │ │ +DDeeffiinniittiioonn trigonometricfunction.hh:43 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_m_a_k_e_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ +auto makeComposedGridFunction(OF &&outerFunction, IF &&... innerFunction) │ │ │ │ │ +Create a ComposedGridFunction that composes grid-functions with another │ │ │ │ │ +function. │ │ │ │ │ +DDeeffiinniittiioonn composedgridfunction.hh:258 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t │ │ │ │ │ -A wrapper providing small object optimization with polymorphic types. │ │ │ │ │ -DDeeffiinniittiioonn polymorphicsmallobject.hh:51 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t_:_:_g_e_t │ │ │ │ │ -const Base & get() const │ │ │ │ │ -Obtain reference to stored object. │ │ │ │ │ -DDeeffiinniittiioonn polymorphicsmallobject.hh:137 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t_:_:_b_u_f_f_e_r_U_s_e_d │ │ │ │ │ -bool bufferUsed() const │ │ │ │ │ -Check if object is stored in internal stack buffer. │ │ │ │ │ -DDeeffiinniittiioonn polymorphicsmallobject.hh:131 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t │ │ │ │ │ -PolymorphicSmallObject(Derived &&derived) │ │ │ │ │ -Construct from object. │ │ │ │ │ -DDeeffiinniittiioonn polymorphicsmallobject.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t │ │ │ │ │ -PolymorphicSmallObject(PolymorphicSmallObject &&other) noexcept │ │ │ │ │ -Move constructor from other PolymorphicSmallObject. │ │ │ │ │ -DDeeffiinniittiioonn polymorphicsmallobject.hh:88 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -PolymorphicSmallObject & operator=(const PolymorphicSmallObject &other) │ │ │ │ │ -Copy assignment from other PolymorphicSmallObject. │ │ │ │ │ -DDeeffiinniittiioonn polymorphicsmallobject.hh:106 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -PolymorphicSmallObject & operator=(PolymorphicSmallObject &&other) noexcept │ │ │ │ │ -Move assignment from other PolymorphicSmallObject. │ │ │ │ │ -DDeeffiinniittiioonn polymorphicsmallobject.hh:117 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t │ │ │ │ │ -PolymorphicSmallObject(const PolymorphicSmallObject &other) │ │ │ │ │ -Copy constructor from other PolymorphicSmallObject. │ │ │ │ │ -DDeeffiinniittiioonn polymorphicsmallobject.hh:94 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t_:_:_~_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t │ │ │ │ │ -~PolymorphicSmallObject() │ │ │ │ │ -Destructor. │ │ │ │ │ -DDeeffiinniittiioonn polymorphicsmallobject.hh:100 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t │ │ │ │ │ -PolymorphicSmallObject() │ │ │ │ │ -Default constructor. │ │ │ │ │ -DDeeffiinniittiioonn polymorphicsmallobject.hh:62 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_S_m_a_l_l_O_b_j_e_c_t_:_:_g_e_t │ │ │ │ │ -Base & get() │ │ │ │ │ -Obtain mutable reference to stored object. │ │ │ │ │ -DDeeffiinniittiioonn polymorphicsmallobject.hh:143 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ +Default implementation for derivative traits. │ │ │ │ │ +DDeeffiinniittiioonn defaultderivativetraits.hh:41 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ +Composition of grid functions with another function. │ │ │ │ │ +DDeeffiinniittiioonn composedgridfunction.hh:46 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_o_u_t_e_r_F_u_n_c_t_i_o_n__ │ │ │ │ │ +OuterFunction outerFunction_ │ │ │ │ │ +DDeeffiinniittiioonn composedgridfunction.hh:225 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_i_n_n_e_r_F_u_n_c_t_i_o_n_s__ │ │ │ │ │ +InnerFunctions innerFunctions_ │ │ │ │ │ +DDeeffiinniittiioonn composedgridfunction.hh:226 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ +ComposedGridFunction(OFT &&outerFunction, IFT &&... innerFunctions) │ │ │ │ │ +Create ComposedGridFunction. │ │ │ │ │ +DDeeffiinniittiioonn composedgridfunction.hh:171 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_e_n_t_i_t_y_S_e_t │ │ │ │ │ +const EntitySet & entitySet() const │ │ │ │ │ +Return the EntitySet associated to this composed grid-function. │ │ │ │ │ +DDeeffiinniittiioonn composedgridfunction.hh:211 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_E_n_t_i_t_y_S_e_t │ │ │ │ │ +typename InnerFunction< 0 >::EntitySet EntitySet │ │ │ │ │ +DDeeffiinniittiioonn composedgridfunction.hh:57 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_L_o_c_a_l_D_o_m_a_i_n │ │ │ │ │ +typename EntitySet::LocalCoordinate LocalDomain │ │ │ │ │ +DDeeffiinniittiioonn composedgridfunction.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_E_l_e_m_e_n_t │ │ │ │ │ +typename EntitySet::Element Element │ │ │ │ │ +DDeeffiinniittiioonn composedgridfunction.hh:58 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_i_n_n_e_r_L_o_c_a_l_F_u_n_c_t_i_o_n_s │ │ │ │ │ +InnerLocalFunctions innerLocalFunctions() const │ │ │ │ │ +DDeeffiinniittiioonn composedgridfunction.hh:218 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_l_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ +friend LocalFunction localFunction(const ComposedGridFunction &cgf) │ │ │ │ │ +Create a local-function of this composed grid-function. │ │ │ │ │ +DDeeffiinniittiioonn composedgridfunction.hh:196 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_R_a_n_g_e │ │ │ │ │ +decltype(std::declval< OF >()(std::declval< IF >()(std::declval< Domain > │ │ │ │ │ +())...)) Range │ │ │ │ │ +DDeeffiinniittiioonn composedgridfunction.hh:63 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_D_o_m_a_i_n │ │ │ │ │ +typename EntitySet::GlobalCoordinate Domain │ │ │ │ │ +DDeeffiinniittiioonn composedgridfunction.hh:60 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +Range operator()(const Domain &x) const │ │ │ │ │ +Evaluation of the composed grid function in coordinates x │ │ │ │ │ +DDeeffiinniittiioonn composedgridfunction.hh:177 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_e_d_G_r_i_d_F_u_n_c_t_i_o_n_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ +friend Traits::DerivativeInterface derivative(const ComposedGridFunction &t) │ │ │ │ │ +Not implemented. │ │ │ │ │ +DDeeffiinniittiioonn composedgridfunction.hh:185 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn gridfunction.hh:36 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00080.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: type_traits.hh File Reference │ │ │ │ +dune-functions: gridfunction.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,65 +65,50 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Typedefs | │ │ │ │ -Variables
│ │ │ │ -
type_traits.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
gridfunction.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │
#include <type_traits>
│ │ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ │ #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::HasStaticSize< T >
 Check if type is a statically sized container. More...
class  Dune::Functions::GridFunction< Signature, EntitySet, DerivativeTraits, bufferSize >
 
struct  Dune::Functions::StaticSizeOrZero< T >
 Obtain size of statically sized container, or 0 if dynamic size. More...
class  Dune::Functions::GridFunction< Range(Domain), ES, DerivativeTraits, bufferSize >
 Wrapper class for functions defined on a Grid. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

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

│ │ │ │ -Typedefs

template<class T , class... Args>
using Dune::Functions::enableIfConstructible = std::enable_if_t< std::is_constructible_v< T, Args... >, int >
 Helper to constrain forwarding constructors.
 
template<class T >
using Dune::Functions::StaticSize = std::enable_if_t< HasStaticSize_v< T >, decltype(Dune::Hybrid::size(std::declval< T >()))>
 Obtain size of statically sized container as integral_constant, or fail.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Variables

template<class T >
constexpr bool Dune::Functions::HasStaticSize_v = HasStaticSize<T>::value
 A variable template representing the value of HasStaticSize.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,44 +1,34 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _V_a_r_i_a_b_l_e_s │ │ │ │ │ -type_traits.hh File Reference │ │ │ │ │ + * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +gridfunction.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ #include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e_e_r_a_s_u_r_e_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_l_o_c_a_l_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_l_o_c_a_l_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n___i_m_p_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_a_s_S_t_a_t_i_c_S_i_z_e_<_ _T_ _> │ │ │ │ │ -  Check if type is a statically sized container. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_F_u_n_c_t_i_o_n_<_ _S_i_g_n_a_t_u_r_e_,_ _E_n_t_i_t_y_S_e_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ + _b_u_f_f_e_r_S_i_z_e_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_t_a_t_i_c_S_i_z_e_O_r_Z_e_r_o_<_ _T_ _> │ │ │ │ │ -  Obtain size of statically sized container, or 0 if dynamic size. │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_S_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_, │ │ │ │ │ + _b_u_f_f_e_r_S_i_z_e_ _> │ │ │ │ │ +  Wrapper class for functions defined on a Grid. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ -TTyyppeeddeeffss │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_e_n_a_b_l_e_I_f_C_o_n_s_t_r_u_c_t_i_b_l_e = std::enable_if_t< std:: │ │ │ │ │ - is_constructible_v< T, Args... >, int > │ │ │ │ │ -  Helper to constrain forwarding constructors. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_t_a_t_i_c_S_i_z_e = std::enable_if_t< _H_a_s_S_t_a_t_i_c_S_i_z_e___v< T >, │ │ │ │ │ - decltype(Dune::Hybrid::size(std::declval< T >()))> │ │ │ │ │ -  Obtain size of statically sized container as integral_constant, or fail. │ │ │ │ │ -  │ │ │ │ │ -VVaarriiaabblleess │ │ │ │ │ -template │ │ │ │ │ -constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_a_s_S_t_a_t_i_c_S_i_z_e___v = _H_a_s_S_t_a_t_i_c_S_i_z_e::value │ │ │ │ │ -  A variable template representing the value of _H_a_s_S_t_a_t_i_c_S_i_z_e. │ │ │ │ │ -  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00080_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: type_traits.hh Source File │ │ │ │ +dune-functions: gridfunction.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,79 +70,183 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
type_traits.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_COMMON_TYPE_TRAITS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_COMMON_TYPE_TRAITS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_HH
│ │ │ │
9
│ │ │ │
10#include <type_traits>
│ │ │ │
11
│ │ │ │ -
12#include <dune/common/hybridutilities.hh>
│ │ │ │ -
13#include <dune/common/typeutilities.hh>
│ │ │ │ -
14
│ │ │ │ -
15namespace Dune {
│ │ │ │ -
16namespace Functions {
│ │ │ │ -
17
│ │ │ │ -
18
│ │ │ │ -
29template<class T, class... Args>
│ │ │ │ -
30using enableIfConstructible = std::enable_if_t<
│ │ │ │ -
31 std::is_constructible_v<T, Args...>, int>;
│ │ │ │ -
32
│ │ │ │ -
33
│ │ │ │ -
34
│ │ │ │ -
42template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
44 public IsIntegralConstant<decltype(Dune::Hybrid::size(std::declval<T>()))>
│ │ │ │ -
45{};
│ │ │ │ -
│ │ │ │ -
46
│ │ │ │ -
48template<class T>
│ │ │ │ - │ │ │ │ +
12#include <dune/common/typeutilities.hh>
│ │ │ │ +
13
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
21
│ │ │ │ +
22
│ │ │ │ +
23
│ │ │ │ +
24namespace Dune {
│ │ │ │ +
25namespace Functions {
│ │ │ │ +
26
│ │ │ │ +
27
│ │ │ │ +
28
│ │ │ │ +
29/*
│ │ │ │ +
30 * Default implementation is empty
│ │ │ │ +
31 * The actual implementation is only given if Signature is an type
│ │ │ │ +
32 * describing a function signature as Range(Domain).
│ │ │ │ +
33 */
│ │ │ │ +
34template<class Signature, class EntitySet, template<class> class DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
36{};
│ │ │ │ +
│ │ │ │ +
37
│ │ │ │ +
38
│ │ │ │ +
39
│ │ │ │ +
40namespace Imp
│ │ │ │ +
41{
│ │ │ │ +
42
│ │ │ │ +
44 template<class S, class ES, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ +
45 struct GridFunctionTraits :
│ │ │ │ +
46 DifferentiableFunctionTraits<S, DerivativeTraits, bufferSize>
│ │ │ │ +
47 {
│ │ │ │ +
48 protected:
│ │ │ │ +
49 using Base=DifferentiableFunctionTraits<S, DerivativeTraits, bufferSize>;
│ │ │ │
50
│ │ │ │ -
51
│ │ │ │ -
59template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
61 public std::conditional_t<HasStaticSize_v<T>,
│ │ │ │ -
62 decltype(Dune::Hybrid::size(std::declval<T>())),
│ │ │ │ -
63 std::integral_constant<std::size_t,0>>
│ │ │ │ -
64{};
│ │ │ │ -
│ │ │ │ -
65
│ │ │ │ -
70template<class T>
│ │ │ │ -
71using StaticSize = std::enable_if_t<HasStaticSize_v<T>,
│ │ │ │ -
72 decltype(Dune::Hybrid::size(std::declval<T>()))>;
│ │ │ │ +
51 public:
│ │ │ │ +
53 using EntitySet = ES;
│ │ │ │ +
54
│ │ │ │ +
56 using Element = typename EntitySet::Element;
│ │ │ │ +
57
│ │ │ │ +
59 using DerivativeSignature = typename Base::DerivativeSignature;
│ │ │ │ +
60
│ │ │ │ + │ │ │ │ +
63
│ │ │ │ +
65 using LocalSignature = typename Base::Range(typename EntitySet::LocalCoordinate);
│ │ │ │ +
66
│ │ │ │ +
68 template<class R>
│ │ │ │ + │ │ │ │ +
70
│ │ │ │ +
72 using LocalFunctionTraits = typename Dune::Functions::Imp::LocalFunctionTraits<LocalSignature, Element, LocalDerivativeTraits, bufferSize>;
│ │ │ │
73
│ │ │ │ -
74
│ │ │ │ -
75}} // namespace Dune::Functions
│ │ │ │ + │ │ │ │
76
│ │ │ │ -
77#endif // DUNE_FUNCTIONS_COMMON_TYPE_TRAITS_HH
│ │ │ │ -
std::enable_if_t< std::is_constructible_v< T, Args... >, int > enableIfConstructible
Helper to constrain forwarding constructors.
Definition type_traits.hh:31
│ │ │ │ -
std::enable_if_t< HasStaticSize_v< T >, decltype(Dune::Hybrid::size(std::declval< T >()))> StaticSize
Obtain size of statically sized container as integral_constant, or fail.
Definition type_traits.hh:72
│ │ │ │ +
78 using Concept = GridFunctionWrapperInterface<S, DerivativeInterface, LocalFunctionInterface, ES>;
│ │ │ │ +
79
│ │ │ │ +
81 template<class B>
│ │ │ │ +
82 using Model = GridFunctionWrapperImplementation<S, DerivativeInterface, LocalFunctionInterface, ES, B>;
│ │ │ │ +
83 };
│ │ │ │ +
84}
│ │ │ │ +
85
│ │ │ │ +
86
│ │ │ │ +
87
│ │ │ │ +
99template<class Range, class Domain, class ES, template<class> class DerivativeTraits, size_t bufferSize>
│ │ │ │ +
│ │ │ │ +
100class GridFunction<Range(Domain), ES, DerivativeTraits, bufferSize> :
│ │ │ │ +
101 public TypeErasureBase<
│ │ │ │ +
102 typename Imp::GridFunctionTraits<Range(Domain), ES, DerivativeTraits, bufferSize>::Concept,
│ │ │ │ +
103 Imp::GridFunctionTraits<Range(Domain), ES, DerivativeTraits, bufferSize>::template Model>
│ │ │ │ +
104{
│ │ │ │ +
105 using Traits = Imp::GridFunctionTraits<Range(Domain), ES, DerivativeTraits, bufferSize>;
│ │ │ │ +
106
│ │ │ │ + │ │ │ │ +
108
│ │ │ │ +
109 using DerivativeInterface = typename Traits::DerivativeInterface;
│ │ │ │ +
110
│ │ │ │ +
111 using LocalFunctionInterface = typename Traits::LocalFunctionInterface;
│ │ │ │ +
112
│ │ │ │ +
113 using EntitySet = typename Traits::EntitySet;
│ │ │ │ +
114
│ │ │ │ +
115public:
│ │ │ │ +
116
│ │ │ │ +
128 template<class F, disableCopyMove<GridFunction, F> = 0 >
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
130 Base(std::forward<F>(f))
│ │ │ │ +
131 {
│ │ │ │ +
132 static_assert(Dune::Functions::Concept::isGridFunction<F, Range(Domain), EntitySet>(), "Trying to construct a GridFunction from type that does not model the GridFunction concept");
│ │ │ │ +
133 }
│ │ │ │ +
│ │ │ │ +
134
│ │ │ │ +
135 GridFunction() = default;
│ │ │ │ +
136
│ │ │ │ +
│ │ │ │ +
142 Range operator() (const Domain& x) const
│ │ │ │ +
143 {
│ │ │ │ +
144 return this->asInterface().operator()(x);
│ │ │ │ +
145 }
│ │ │ │ +
│ │ │ │ +
146
│ │ │ │ +
│ │ │ │ +
155 friend DerivativeInterface derivative(const GridFunction& t)
│ │ │ │ +
156 {
│ │ │ │ +
157 return t.asInterface().derivative();
│ │ │ │ +
158 }
│ │ │ │ +
│ │ │ │ +
159
│ │ │ │ +
│ │ │ │ +
169 friend LocalFunctionInterface localFunction(const GridFunction& t)
│ │ │ │ +
170 {
│ │ │ │ +
171 return t.asInterface().wrappedLocalFunction();
│ │ │ │ +
172 }
│ │ │ │ +
│ │ │ │ +
173
│ │ │ │ +
│ │ │ │ +
180 const EntitySet& entitySet() const
│ │ │ │ +
181 {
│ │ │ │ +
182 return this->asInterface().wrappedEntitySet();
│ │ │ │ +
183 }
│ │ │ │ +
│ │ │ │ +
184};
│ │ │ │ +
│ │ │ │ +
185
│ │ │ │ +
186
│ │ │ │ +
187
│ │ │ │ +
188}} // namespace Dune::Functions
│ │ │ │ +
189
│ │ │ │ +
190
│ │ │ │ +
191
│ │ │ │ +
192#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
constexpr bool HasStaticSize_v
A variable template representing the value of HasStaticSize.
Definition type_traits.hh:49
│ │ │ │ -
Check if type is a statically sized container.
Definition type_traits.hh:45
│ │ │ │ -
Obtain size of statically sized container, or 0 if dynamic size.
Definition type_traits.hh:64
│ │ │ │ +
Definition localfunction.hh:34
│ │ │ │ +
Base class for type-erased interface wrapper.
Definition typeerasure.hh:169
│ │ │ │ +
Definition gridfunction.hh:36
│ │ │ │ +
friend DerivativeInterface derivative(const GridFunction &t)
Get derivative of wrapped function.
Definition gridfunction.hh:155
│ │ │ │ + │ │ │ │ +
const EntitySet & entitySet() const
Get associated EntitySet.
Definition gridfunction.hh:180
│ │ │ │ +
GridFunction(F &&f)
Construct from function.
Definition gridfunction.hh:129
│ │ │ │ +
friend LocalFunctionInterface localFunction(const GridFunction &t)
Get local function of wrapped function.
Definition gridfunction.hh:169
│ │ │ │ +
Derivative traits for local functions.
Definition localderivativetraits.hh:32
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,83 +1,203 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _c_o_m_m_o_n │ │ │ │ │ -type_traits.hh │ │ │ │ │ + * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ +gridfunction.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_COMMON_TYPE_TRAITS_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_COMMON_TYPE_TRAITS_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_HH │ │ │ │ │ 9 │ │ │ │ │ 10#include │ │ │ │ │ 11 │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14 │ │ │ │ │ -15namespace _D_u_n_e { │ │ │ │ │ -16namespace Functions { │ │ │ │ │ -17 │ │ │ │ │ -18 │ │ │ │ │ -29template │ │ │ │ │ -_3_0using _e_n_a_b_l_e_I_f_C_o_n_s_t_r_u_c_t_i_b_l_e = std::enable_if_t< │ │ │ │ │ -31 std::is_constructible_v, int>; │ │ │ │ │ -32 │ │ │ │ │ -33 │ │ │ │ │ -34 │ │ │ │ │ -42template │ │ │ │ │ -_4_3struct _H_a_s_S_t_a_t_i_c_S_i_z_e : │ │ │ │ │ -44 public IsIntegralConstant()))> │ │ │ │ │ -45{}; │ │ │ │ │ -46 │ │ │ │ │ -48template │ │ │ │ │ -_4_9inline constexpr bool _H_a_s_S_t_a_t_i_c_S_i_z_e___v = _H_a_s_S_t_a_t_i_c_S_i_z_e_<_T_>_:_:_v_a_l_u_e; │ │ │ │ │ +12#include │ │ │ │ │ +13 │ │ │ │ │ +14#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e_e_r_a_s_u_r_e_._h_h> │ │ │ │ │ +15#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ +17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_l_o_c_a_l_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ +18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_l_o_c_a_l_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ +20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n___i_m_p_._h_h> │ │ │ │ │ +21 │ │ │ │ │ +22 │ │ │ │ │ +23 │ │ │ │ │ +24namespace _D_u_n_e { │ │ │ │ │ +25namespace Functions { │ │ │ │ │ +26 │ │ │ │ │ +27 │ │ │ │ │ +28 │ │ │ │ │ +29/* │ │ │ │ │ +30 * Default implementation is empty │ │ │ │ │ +31 * The actual implementation is only given if Signature is an type │ │ │ │ │ +32 * describing a function signature as Range(Domain). │ │ │ │ │ +33 */ │ │ │ │ │ +34template class │ │ │ │ │ +DerivativeTraits=DefaultDerivativeTraits, size_t bufferSize=56> │ │ │ │ │ +_3_5class _G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ +36{}; │ │ │ │ │ +37 │ │ │ │ │ +38 │ │ │ │ │ +39 │ │ │ │ │ +40namespace Imp │ │ │ │ │ +41{ │ │ │ │ │ +42 │ │ │ │ │ +44 template class DerivativeTraits, size_t │ │ │ │ │ +bufferSize> │ │ │ │ │ +45 struct GridFunctionTraits : │ │ │ │ │ +46 DifferentiableFunctionTraits │ │ │ │ │ +47 { │ │ │ │ │ +48 protected: │ │ │ │ │ +49 using Base=DifferentiableFunctionTraits; │ │ │ │ │ 50 │ │ │ │ │ -51 │ │ │ │ │ -59template │ │ │ │ │ -_6_0struct _S_t_a_t_i_c_S_i_z_e_O_r_Z_e_r_o : │ │ │ │ │ -61 public std::conditional_t, │ │ │ │ │ -62 decltype(Dune::Hybrid::size(std::declval())), │ │ │ │ │ -63 std::integral_constant> │ │ │ │ │ -64{}; │ │ │ │ │ -65 │ │ │ │ │ -70template │ │ │ │ │ -_7_1using _S_t_a_t_i_c_S_i_z_e = std::enable_if_t, │ │ │ │ │ -72 decltype(Dune::Hybrid::size(std::declval()))>; │ │ │ │ │ +51 public: │ │ │ │ │ +53 using EntitySet = ES; │ │ │ │ │ +54 │ │ │ │ │ +56 using Element = typename EntitySet::Element; │ │ │ │ │ +57 │ │ │ │ │ +59 using DerivativeSignature = typename Base::DerivativeSignature; │ │ │ │ │ +60 │ │ │ │ │ +62 using DerivativeInterface = _G_r_i_d_F_u_n_c_t_i_o_n_<_D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_,_ _E_S_, │ │ │ │ │ +_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _b_u_f_f_e_r_S_i_z_e_>; │ │ │ │ │ +63 │ │ │ │ │ +65 using LocalSignature = typename Base::Range(typename EntitySet:: │ │ │ │ │ +LocalCoordinate); │ │ │ │ │ +66 │ │ │ │ │ +68 template │ │ │ │ │ +69 using _L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s = typename _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_: │ │ │ │ │ +_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_E_n_t_i_t_y_S_e_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_>_:_:_t_e_m_p_l_a_t_e Traits; │ │ │ │ │ +70 │ │ │ │ │ +72 using LocalFunctionTraits = typename Dune::Functions::Imp:: │ │ │ │ │ +LocalFunctionTraits; │ │ │ │ │ 73 │ │ │ │ │ -74 │ │ │ │ │ -75}} // namespace Dune::Functions │ │ │ │ │ +75 using LocalFunctionInterface = _L_o_c_a_l_F_u_n_c_t_i_o_n_<_L_o_c_a_l_S_i_g_n_a_t_u_r_e_,_ _E_l_e_m_e_n_t_, │ │ │ │ │ +_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _b_u_f_f_e_r_S_i_z_e_>; │ │ │ │ │ 76 │ │ │ │ │ -77#endif // DUNE_FUNCTIONS_COMMON_TYPE_TRAITS_HH │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_e_n_a_b_l_e_I_f_C_o_n_s_t_r_u_c_t_i_b_l_e │ │ │ │ │ -std::enable_if_t< std::is_constructible_v< T, Args... >, int > │ │ │ │ │ -enableIfConstructible │ │ │ │ │ -Helper to constrain forwarding constructors. │ │ │ │ │ -DDeeffiinniittiioonn type_traits.hh:31 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_t_a_t_i_c_S_i_z_e │ │ │ │ │ -std::enable_if_t< HasStaticSize_v< T >, decltype(Dune::Hybrid::size(std:: │ │ │ │ │ -declval< T >()))> StaticSize │ │ │ │ │ -Obtain size of statically sized container as integral_constant, or fail. │ │ │ │ │ -DDeeffiinniittiioonn type_traits.hh:72 │ │ │ │ │ +78 using Concept = GridFunctionWrapperInterface; │ │ │ │ │ +79 │ │ │ │ │ +81 template │ │ │ │ │ +82 using Model = GridFunctionWrapperImplementation; │ │ │ │ │ +83 }; │ │ │ │ │ +84} │ │ │ │ │ +85 │ │ │ │ │ +86 │ │ │ │ │ +87 │ │ │ │ │ +99template class │ │ │ │ │ +DerivativeTraits, size_t bufferSize> │ │ │ │ │ +_1_0_0class _G_r_i_d_F_u_n_c_t_i_o_n : │ │ │ │ │ +101 public _T_y_p_e_E_r_a_s_u_r_e_B_a_s_e< │ │ │ │ │ +102 typename Imp::GridFunctionTraits::Concept, │ │ │ │ │ +103 Imp::GridFunctionTraits:: │ │ │ │ │ +template Model> │ │ │ │ │ +104{ │ │ │ │ │ +105 using Traits = Imp::GridFunctionTraits; │ │ │ │ │ +106 │ │ │ │ │ +107 using _B_a_s_e = _T_y_p_e_E_r_a_s_u_r_e_B_a_s_e_<_t_y_p_e_n_a_m_e_ _T_r_a_i_t_s_:_:_C_o_n_c_e_p_t_,_ _T_r_a_i_t_s_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ +_M_o_d_e_l_>; │ │ │ │ │ +108 │ │ │ │ │ +109 using DerivativeInterface = typename _T_r_a_i_t_s_:_:_D_e_r_i_v_a_t_i_v_e_I_n_t_e_r_f_a_c_e; │ │ │ │ │ +110 │ │ │ │ │ +111 using LocalFunctionInterface = typename _T_r_a_i_t_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n_I_n_t_e_r_f_a_c_e; │ │ │ │ │ +112 │ │ │ │ │ +113 using EntitySet = typename Traits::EntitySet; │ │ │ │ │ +114 │ │ │ │ │ +115public: │ │ │ │ │ +116 │ │ │ │ │ +128 template = 0 > │ │ │ │ │ +_1_2_9 _G_r_i_d_F_u_n_c_t_i_o_n(F&& f) : │ │ │ │ │ +130 _B_a_s_e(std::forward(f)) │ │ │ │ │ +131 { │ │ │ │ │ +132 static_assert(Dune::Functions::Concept::isGridFunction(), "Trying to construct a GridFunction from type that does not model │ │ │ │ │ +the GridFunction concept"); │ │ │ │ │ +133 } │ │ │ │ │ +134 │ │ │ │ │ +_1_3_5 _G_r_i_d_F_u_n_c_t_i_o_n() = default; │ │ │ │ │ +136 │ │ │ │ │ +_1_4_2 Range operator() (const Domain& x) const │ │ │ │ │ +143 { │ │ │ │ │ +144 return this->asInterface().operator()(x); │ │ │ │ │ +145 } │ │ │ │ │ +146 │ │ │ │ │ +_1_5_5 friend DerivativeInterface _d_e_r_i_v_a_t_i_v_e(const _G_r_i_d_F_u_n_c_t_i_o_n& t) │ │ │ │ │ +156 { │ │ │ │ │ +157 return t.asInterface().derivative(); │ │ │ │ │ +158 } │ │ │ │ │ +159 │ │ │ │ │ +_1_6_9 friend LocalFunctionInterface _l_o_c_a_l_F_u_n_c_t_i_o_n(const _G_r_i_d_F_u_n_c_t_i_o_n& t) │ │ │ │ │ +170 { │ │ │ │ │ +171 return t.asInterface().wrappedLocalFunction(); │ │ │ │ │ +172 } │ │ │ │ │ +173 │ │ │ │ │ +_1_8_0 const EntitySet& _e_n_t_i_t_y_S_e_t() const │ │ │ │ │ +181 { │ │ │ │ │ +182 return this->asInterface().wrappedEntitySet(); │ │ │ │ │ +183 } │ │ │ │ │ +184}; │ │ │ │ │ +185 │ │ │ │ │ +186 │ │ │ │ │ +187 │ │ │ │ │ +188}} // namespace Dune::Functions │ │ │ │ │ +189 │ │ │ │ │ +190 │ │ │ │ │ +191 │ │ │ │ │ +192#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_HH │ │ │ │ │ +_l_o_c_a_l_f_u_n_c_t_i_o_n_._h_h │ │ │ │ │ +_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h │ │ │ │ │ +_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ +_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h │ │ │ │ │ +_t_y_p_e_e_r_a_s_u_r_e_._h_h │ │ │ │ │ +_l_o_c_a_l_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h │ │ │ │ │ +_g_r_i_d_f_u_n_c_t_i_o_n___i_m_p_._h_h │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_a_s_S_t_a_t_i_c_S_i_z_e___v │ │ │ │ │ -constexpr bool HasStaticSize_v │ │ │ │ │ -A variable template representing the value of HasStaticSize. │ │ │ │ │ -DDeeffiinniittiioonn type_traits.hh:49 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_a_s_S_t_a_t_i_c_S_i_z_e │ │ │ │ │ -Check if type is a statically sized container. │ │ │ │ │ -DDeeffiinniittiioonn type_traits.hh:45 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_t_a_t_i_c_S_i_z_e_O_r_Z_e_r_o │ │ │ │ │ -Obtain size of statically sized container, or 0 if dynamic size. │ │ │ │ │ -DDeeffiinniittiioonn type_traits.hh:64 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn localfunction.hh:34 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_y_p_e_E_r_a_s_u_r_e_B_a_s_e │ │ │ │ │ +Base class for type-erased interface wrapper. │ │ │ │ │ +DDeeffiinniittiioonn typeerasure.hh:169 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn gridfunction.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_S_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _b_u_f_f_e_r_S_i_z_e │ │ │ │ │ +_>_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ +friend DerivativeInterface derivative(const GridFunction &t) │ │ │ │ │ +Get derivative of wrapped function. │ │ │ │ │ +DDeeffiinniittiioonn gridfunction.hh:155 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_S_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _b_u_f_f_e_r_S_i_z_e │ │ │ │ │ +_>_:_:_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ +GridFunction()=default │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_S_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _b_u_f_f_e_r_S_i_z_e │ │ │ │ │ +_>_:_:_e_n_t_i_t_y_S_e_t │ │ │ │ │ +const EntitySet & entitySet() const │ │ │ │ │ +Get associated EntitySet. │ │ │ │ │ +DDeeffiinniittiioonn gridfunction.hh:180 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_S_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _b_u_f_f_e_r_S_i_z_e │ │ │ │ │ +_>_:_:_G_r_i_d_F_u_n_c_t_i_o_n │ │ │ │ │ +GridFunction(F &&f) │ │ │ │ │ +Construct from function. │ │ │ │ │ +DDeeffiinniittiioonn gridfunction.hh:129 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_G_r_i_d_F_u_n_c_t_i_o_n_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _E_S_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _b_u_f_f_e_r_S_i_z_e │ │ │ │ │ +_>_:_:_l_o_c_a_l_F_u_n_c_t_i_o_n │ │ │ │ │ +friend LocalFunctionInterface localFunction(const GridFunction &t) │ │ │ │ │ +Get local function of wrapped function. │ │ │ │ │ +DDeeffiinniittiioonn gridfunction.hh:169 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ +Derivative traits for local functions. │ │ │ │ │ +DDeeffiinniittiioonn localderivativetraits.hh:32 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00083.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: interfaces.hh File Reference │ │ │ │ +dune-functions: localderivativetraits.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,32 +65,36 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
interfaces.hh File Reference
│ │ │ │ +
localderivativetraits.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ + │ │ │ │

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::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)>
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,21 +1,27 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _c_o_m_m_o_n │ │ │ │ │ + * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -interfaces.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +localderivativetraits.hh File Reference │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_T_y_p_e_<_ _I_n_t_e_r_f_a_c_e_ _> │ │ │ │ │ -  Base class with polymorphic type boiler plate code. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_ _E_n_t_i_t_y_S_e_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_ _> │ │ │ │ │ +  Derivative traits for local functions. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_ _E_n_t_i_t_y_S_e_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ + _>_:_:_T_r_a_i_t_s_<_ _S_i_g_n_a_t_u_r_e_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_<_ _E_n_t_i_t_y_S_e_t_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ + _>_:_:_T_r_a_i_t_s_<_ _R_(_L_o_c_a_l_D_o_m_a_i_n_)_> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00083_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: interfaces.hh Source File │ │ │ │ +dune-functions: localderivativetraits.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,68 +70,76 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
interfaces.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_COMMON_INTERFACES_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_COMMON_INTERFACES_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_LOCALDERIVATIVE_TRAITS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_LOCALDERIVATIVE_TRAITS_HH
│ │ │ │
9
│ │ │ │ -
10#include <type_traits>
│ │ │ │ -
11
│ │ │ │ +
10
│ │ │ │ + │ │ │ │
12
│ │ │ │ -
13namespace Dune {
│ │ │ │ -
14namespace Functions {
│ │ │ │ -
15
│ │ │ │ +
13
│ │ │ │ +
14namespace Dune {
│ │ │ │ +
15namespace Functions {
│ │ │ │
16
│ │ │ │
17
│ │ │ │ -
27template<class Interface>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
29{
│ │ │ │ -
30public:
│ │ │ │ -
31
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
34 {}
│ │ │ │ -
│ │ │ │ +
30template<class EntitySet, template<class> class DerivativeTraits=DefaultDerivativeTraits>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
32{
│ │ │ │ +
33 using LocalDomain = typename EntitySet::LocalCoordinate;
│ │ │ │ +
34 using Domain = typename EntitySet::GlobalCoordinate;
│ │ │ │
35
│ │ │ │ -
44 virtual Interface* clone() const = 0;
│ │ │ │ -
45
│ │ │ │ -
55 virtual Interface* clone(void* buffer) const = 0;
│ │ │ │ -
56
│ │ │ │ -
66 virtual Interface* move(void* buffer) = 0;
│ │ │ │ -
67};
│ │ │ │ -
│ │ │ │ -
68
│ │ │ │ -
69
│ │ │ │ -
70
│ │ │ │ -
71}} // namespace Dune::Functions
│ │ │ │ -
72
│ │ │ │ -
73#endif // DUNE_FUNCTIONS_COMMON_EXTENDED_CLONEABLE_HH
│ │ │ │ +
36 template<class Signature>
│ │ │ │ +
│ │ │ │ +
37 struct Traits
│ │ │ │ +
38 {
│ │ │ │ + │ │ │ │ +
40 };
│ │ │ │ +
│ │ │ │ +
41
│ │ │ │ +
42 template<class R>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
44 {
│ │ │ │ +
45 using Range = typename DerivativeTraits<R(Domain)>::Range;
│ │ │ │ +
46 };
│ │ │ │ +
│ │ │ │ +
47};
│ │ │ │ +
│ │ │ │ +
48
│ │ │ │ +
49
│ │ │ │ +
50}} // namespace Dune::Functions
│ │ │ │ +
51
│ │ │ │ +
52#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_LOCALDERIVATIVE_TRAITS_HH
│ │ │ │ + │ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
Base class with polymorphic type boiler plate code.
Definition interfaces.hh:29
│ │ │ │ -
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:33
│ │ │ │ +
Dummy range class to be used if no proper type is available.
Definition defaultderivativetraits.hh:27
│ │ │ │ +
Derivative traits for local functions.
Definition localderivativetraits.hh:32
│ │ │ │ +
typename EntitySet::GlobalCoordinate Domain
Definition localderivativetraits.hh:34
│ │ │ │ +
typename EntitySet::LocalCoordinate LocalDomain
Definition localderivativetraits.hh:33
│ │ │ │ +
Definition localderivativetraits.hh:38
│ │ │ │ +
InvalidRange Range
Definition localderivativetraits.hh:39
│ │ │ │ +
typename DerivativeTraits< R(Domain)>::Range Range
Definition localderivativetraits.hh:45
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,68 +1,77 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _c_o_m_m_o_n │ │ │ │ │ -interfaces.hh │ │ │ │ │ + * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ +localderivativetraits.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_COMMON_INTERFACES_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_COMMON_INTERFACES_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_LOCALDERIVATIVE_TRAITS_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_LOCALDERIVATIVE_TRAITS_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11 │ │ │ │ │ +10 │ │ │ │ │ +11#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h> │ │ │ │ │ 12 │ │ │ │ │ -13namespace _D_u_n_e { │ │ │ │ │ -14namespace Functions { │ │ │ │ │ -15 │ │ │ │ │ +13 │ │ │ │ │ +14namespace _D_u_n_e { │ │ │ │ │ +15namespace Functions { │ │ │ │ │ 16 │ │ │ │ │ 17 │ │ │ │ │ -27template │ │ │ │ │ -_2_8class _P_o_l_y_m_o_r_p_h_i_c_T_y_p_e │ │ │ │ │ -29{ │ │ │ │ │ -30public: │ │ │ │ │ -31 │ │ │ │ │ -_3_3 virtual _~_P_o_l_y_m_o_r_p_h_i_c_T_y_p_e() │ │ │ │ │ -34 {} │ │ │ │ │ +30template class │ │ │ │ │ +DerivativeTraits=DefaultDerivativeTraits> │ │ │ │ │ +_3_1struct _L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ +32{ │ │ │ │ │ +_3_3 using _L_o_c_a_l_D_o_m_a_i_n = typename EntitySet::LocalCoordinate; │ │ │ │ │ +_3_4 using _D_o_m_a_i_n = typename EntitySet::GlobalCoordinate; │ │ │ │ │ 35 │ │ │ │ │ -_4_4 virtual Interface* _c_l_o_n_e() const = 0; │ │ │ │ │ -45 │ │ │ │ │ -_5_5 virtual Interface* _c_l_o_n_e(void* buffer) const = 0; │ │ │ │ │ -56 │ │ │ │ │ -_6_6 virtual Interface* _m_o_v_e(void* buffer) = 0; │ │ │ │ │ -67}; │ │ │ │ │ -68 │ │ │ │ │ -69 │ │ │ │ │ -70 │ │ │ │ │ -71}} // namespace Dune::Functions │ │ │ │ │ -72 │ │ │ │ │ -73#endif // DUNE_FUNCTIONS_COMMON_EXTENDED_CLONEABLE_HH │ │ │ │ │ +36 template │ │ │ │ │ +_3_7 struct _T_r_a_i_t_s │ │ │ │ │ +38 { │ │ │ │ │ +_3_9 typedef _I_n_v_a_l_i_d_R_a_n_g_e _R_a_n_g_e; │ │ │ │ │ +40 }; │ │ │ │ │ +41 │ │ │ │ │ +42 template │ │ │ │ │ +_4_3 struct _T_r_a_i_t_s │ │ │ │ │ +44 { │ │ │ │ │ +_4_5 using _R_a_n_g_e = typename DerivativeTraits_:_:_R_a_n_g_e; │ │ │ │ │ +46 }; │ │ │ │ │ +47}; │ │ │ │ │ +48 │ │ │ │ │ +49 │ │ │ │ │ +50}} // namespace Dune::Functions │ │ │ │ │ +51 │ │ │ │ │ +52#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_LOCALDERIVATIVE_TRAITS_HH │ │ │ │ │ +_d_e_f_a_u_l_t_d_e_r_i_v_a_t_i_v_e_t_r_a_i_t_s_._h_h │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_T_y_p_e │ │ │ │ │ -Base class with polymorphic type boiler plate code. │ │ │ │ │ -DDeeffiinniittiioonn interfaces.hh:29 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_T_y_p_e_:_:_c_l_o_n_e │ │ │ │ │ -virtual Interface * clone(void *buffer) const =0 │ │ │ │ │ -Clones the object into buffer. │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_T_y_p_e_:_:_c_l_o_n_e │ │ │ │ │ -virtual Interface * clone() const =0 │ │ │ │ │ -Clones the object. │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_T_y_p_e_:_:_m_o_v_e │ │ │ │ │ -virtual Interface * move(void *buffer)=0 │ │ │ │ │ -Move object into buffer. │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_l_y_m_o_r_p_h_i_c_T_y_p_e_:_:_~_P_o_l_y_m_o_r_p_h_i_c_T_y_p_e │ │ │ │ │ -virtual ~PolymorphicType() │ │ │ │ │ -Destructor. │ │ │ │ │ -DDeeffiinniittiioonn interfaces.hh:33 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_I_n_v_a_l_i_d_R_a_n_g_e │ │ │ │ │ +Dummy range class to be used if no proper type is available. │ │ │ │ │ +DDeeffiinniittiioonn defaultderivativetraits.hh:27 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s │ │ │ │ │ +Derivative traits for local functions. │ │ │ │ │ +DDeeffiinniittiioonn localderivativetraits.hh:32 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_:_:_D_o_m_a_i_n │ │ │ │ │ +typename EntitySet::GlobalCoordinate Domain │ │ │ │ │ +DDeeffiinniittiioonn localderivativetraits.hh:34 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_:_:_L_o_c_a_l_D_o_m_a_i_n │ │ │ │ │ +typename EntitySet::LocalCoordinate LocalDomain │ │ │ │ │ +DDeeffiinniittiioonn localderivativetraits.hh:33 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_:_:_T_r_a_i_t_s │ │ │ │ │ +DDeeffiinniittiioonn localderivativetraits.hh:38 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_:_:_T_r_a_i_t_s_:_:_R_a_n_g_e │ │ │ │ │ +InvalidRange Range │ │ │ │ │ +DDeeffiinniittiioonn localderivativetraits.hh:39 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_o_c_a_l_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_:_:_T_r_a_i_t_s_<_ _R_(_L_o_c_a_l_D_o_m_a_i_n_)_>_:_:_R_a_n_g_e │ │ │ │ │ +typename DerivativeTraits< R(Domain)>::Range Range │ │ │ │ │ +DDeeffiinniittiioonn localderivativetraits.hh:45 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00086.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: differentiablefunction_imp.hh File Reference │ │ │ │ +dune-functions: gridfunction_imp.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,26 +65,26 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Namespaces
│ │ │ │ -
differentiablefunction_imp.hh File Reference
│ │ │ │ +
gridfunction_imp.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/common/concept.hh>
│ │ │ │ -#include <dune/functions/common/type_traits.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.

│ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Functions
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,19 +1,19 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _c_o_m_m_o_n │ │ │ │ │ + * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -differentiablefunction_imp.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +gridfunction_imp.hh File Reference │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_i_n_t_e_r_f_a_c_e_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n___i_m_p_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00086_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: differentiablefunction_imp.hh Source File │ │ │ │ +dune-functions: gridfunction_imp.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,123 +70,95 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
differentiablefunction_imp.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_IMP_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_IMP_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_IMP_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_IMP_HH
│ │ │ │
9
│ │ │ │ -
10#include <dune/common/exceptions.hh>
│ │ │ │ -
11#include <dune/common/concept.hh>
│ │ │ │ -
12
│ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
13
│ │ │ │
14
│ │ │ │
15
│ │ │ │
16namespace Dune {
│ │ │ │
17namespace Functions {
│ │ │ │
18namespace Imp {
│ │ │ │
19
│ │ │ │ -
23struct HasFreeDerivative
│ │ │ │ +
23struct HasFreeLocalFunction
│ │ │ │
24{
│ │ │ │
25 template<class F>
│ │ │ │
26 auto require(F&& f) -> decltype(
│ │ │ │ -
27 derivative(f)
│ │ │ │ +
27 localFunction(f)
│ │ │ │
28 );
│ │ │ │
29};
│ │ │ │
30
│ │ │ │
31
│ │ │ │
32
│ │ │ │ -
33template<class Dummy, class F,
│ │ │ │ -
34 std::enable_if_t<
│ │ │ │ -
35 models< HasFreeDerivative, F>() , int> = 0>
│ │ │ │ -
36auto derivativeIfImplemented(const F& f) -> decltype(derivative(f))
│ │ │ │ -
37{
│ │ │ │ -
38 return derivative(f);
│ │ │ │ -
39}
│ │ │ │ -
40
│ │ │ │ -
41
│ │ │ │ -
42
│ │ │ │ -
43template<class Dummy, class F,
│ │ │ │ -
44 std::enable_if_t<
│ │ │ │ -
45 not(models< HasFreeDerivative, F>()) , int> = 0>
│ │ │ │ -
46Dummy derivativeIfImplemented(const F& f)
│ │ │ │ -
47{
│ │ │ │ -
48 DUNE_THROW(Dune::NotImplemented, "Derivative not implemented");
│ │ │ │ -
49}
│ │ │ │ -
50
│ │ │ │ -
51
│ │ │ │ -
52
│ │ │ │ -
53template<class Signature, class DerivativeInterface>
│ │ │ │ -
54class DifferentiableFunctionWrapperInterface
│ │ │ │ -
55{};
│ │ │ │ +
33// Interface of type erasure wrapper
│ │ │ │ +
34//
│ │ │ │ +
35// Notice that the basic interface of polymorphic classes (destructor, clone, ...)
│ │ │ │ +
36// will be added by the type erasure foundation classes.
│ │ │ │ +
37template<class Signature, class DerivativeInterface, class LocalFunctionInterface, class EntitySet>
│ │ │ │ +
38class GridFunctionWrapperInterface :
│ │ │ │ +
39 public DifferentiableFunctionWrapperInterface<Signature, DerivativeInterface>
│ │ │ │ +
40{
│ │ │ │ +
41public:
│ │ │ │ +
42 virtual LocalFunctionInterface wrappedLocalFunction() const = 0;
│ │ │ │ +
43
│ │ │ │ +
44 virtual const EntitySet& wrappedEntitySet() const = 0;
│ │ │ │ +
45};
│ │ │ │ +
46
│ │ │ │ +
47
│ │ │ │ +
48// Implementation of type erasure wrapper
│ │ │ │ +
49template<class Signature, class DerivativeInterface, class LocalFunctionInterface, class EntitySet, class B>
│ │ │ │ +
50class GridFunctionWrapperImplementation :
│ │ │ │ +
51 public DifferentiableFunctionWrapperImplementation<Signature, DerivativeInterface, B>
│ │ │ │ +
52{
│ │ │ │ +
53 using Base = DifferentiableFunctionWrapperImplementation<Signature, DerivativeInterface, B>;
│ │ │ │ +
54public:
│ │ │ │ +
55 using Base::Base;
│ │ │ │
56
│ │ │ │ -
57// Interface of type erasure wrapper
│ │ │ │ -
58//
│ │ │ │ -
59// Notice that the basic interface of polymorphic classes (destructor, clone, ...)
│ │ │ │ -
60// will be added by the type erasure foundation classes.
│ │ │ │ -
61template<class Range, class Domain, class DerivativeInterface>
│ │ │ │ -
62class DifferentiableFunctionWrapperInterface<Range(Domain), DerivativeInterface>
│ │ │ │ -
63{
│ │ │ │ -
64public:
│ │ │ │ -
65 virtual Range operator() (const Domain& x) const = 0;
│ │ │ │ -
66
│ │ │ │ -
67 virtual DerivativeInterface derivative() const = 0;
│ │ │ │ -
68};
│ │ │ │ +
57 virtual LocalFunctionInterface wrappedLocalFunction() const
│ │ │ │ +
58 {
│ │ │ │ +
59 return localFunction(this->get());
│ │ │ │ +
60 }
│ │ │ │ +
61
│ │ │ │ +
62 virtual const EntitySet& wrappedEntitySet() const
│ │ │ │ +
63 {
│ │ │ │ +
64 return this->get().entitySet();
│ │ │ │ +
65 }
│ │ │ │ +
66};
│ │ │ │ +
67
│ │ │ │ +
68
│ │ │ │
69
│ │ │ │ -
70
│ │ │ │ +
70}}} // namespace Dune::Functions::Imp
│ │ │ │
71
│ │ │ │ -
72template<class Signature, class DerivativeInterface, class B>
│ │ │ │ -
73class DifferentiableFunctionWrapperImplementation
│ │ │ │ -
74{};
│ │ │ │ -
75
│ │ │ │ -
76// Implementation of type erasure wrapper
│ │ │ │ -
77template<class Range, class Domain, class DerivativeInterface, class B>
│ │ │ │ -
78class DifferentiableFunctionWrapperImplementation< Range(Domain), DerivativeInterface, B> :
│ │ │ │ -
79 public B
│ │ │ │ -
80{
│ │ │ │ -
81public:
│ │ │ │ -
82
│ │ │ │ -
83 using B::B;
│ │ │ │ -
84 using Wrapped = typename B::Wrapped;
│ │ │ │ -
85
│ │ │ │ -
86 virtual Range operator() (const Domain& x) const
│ │ │ │ -
87 {
│ │ │ │ -
88 return this->get()(x);
│ │ │ │ -
89 }
│ │ │ │ -
90
│ │ │ │ -
91 virtual DerivativeInterface derivative() const
│ │ │ │ -
92 {
│ │ │ │ -
93 return derivativeIfImplemented<DerivativeInterface, Wrapped>(this->get());
│ │ │ │ -
94 }
│ │ │ │ -
95};
│ │ │ │ -
96
│ │ │ │ -
97
│ │ │ │ -
98
│ │ │ │ -
99}}} // namespace Dune::Functions::Imp
│ │ │ │ -
100
│ │ │ │ -
101
│ │ │ │ -
102
│ │ │ │ -
103#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:43
│ │ │ │ +
72
│ │ │ │ +
73
│ │ │ │ +
74#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_IMP_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
Definition polynomial.hh:17
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,124 +1,95 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _c_o_m_m_o_n │ │ │ │ │ -differentiablefunction_imp.hh │ │ │ │ │ + * _g_r_i_d_f_u_n_c_t_i_o_n_s │ │ │ │ │ +gridfunction_imp.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_IMP_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_IMP_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_IMP_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_IMP_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12 │ │ │ │ │ -13#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ +10#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ +11#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_i_n_t_e_r_f_a_c_e_s_._h_h> │ │ │ │ │ +12#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n___i_m_p_._h_h> │ │ │ │ │ +13 │ │ │ │ │ 14 │ │ │ │ │ 15 │ │ │ │ │ 16namespace _D_u_n_e { │ │ │ │ │ 17namespace Functions { │ │ │ │ │ 18namespace Imp { │ │ │ │ │ 19 │ │ │ │ │ -23struct HasFreeDerivative │ │ │ │ │ +23struct HasFreeLocalFunction │ │ │ │ │ 24{ │ │ │ │ │ 25 template │ │ │ │ │ 26 auto require(F&& f) -> decltype( │ │ │ │ │ -27 _d_e_r_i_v_a_t_i_v_e(f) │ │ │ │ │ +27 localFunction(f) │ │ │ │ │ 28 ); │ │ │ │ │ 29}; │ │ │ │ │ 30 │ │ │ │ │ 31 │ │ │ │ │ 32 │ │ │ │ │ -33template() , int> = 0> │ │ │ │ │ -36auto derivativeIfImplemented(const F& f) -> decltype(_d_e_r_i_v_a_t_i_v_e(f)) │ │ │ │ │ -37{ │ │ │ │ │ -38 return _d_e_r_i_v_a_t_i_v_e(f); │ │ │ │ │ -39} │ │ │ │ │ -40 │ │ │ │ │ -41 │ │ │ │ │ -42 │ │ │ │ │ -43template()) , int> = 0> │ │ │ │ │ -46Dummy derivativeIfImplemented(const F& f) │ │ │ │ │ -47{ │ │ │ │ │ -48 DUNE_THROW(Dune::NotImplemented, "Derivative not implemented"); │ │ │ │ │ -49} │ │ │ │ │ -50 │ │ │ │ │ -51 │ │ │ │ │ -52 │ │ │ │ │ -53template │ │ │ │ │ -54class DifferentiableFunctionWrapperInterface │ │ │ │ │ -55{}; │ │ │ │ │ -56 │ │ │ │ │ -57// Interface of type erasure wrapper │ │ │ │ │ -58// │ │ │ │ │ -59// Notice that the basic interface of polymorphic classes (destructor, clone, │ │ │ │ │ +33// Interface of type erasure wrapper │ │ │ │ │ +34// │ │ │ │ │ +35// Notice that the basic interface of polymorphic classes (destructor, clone, │ │ │ │ │ ...) │ │ │ │ │ -60// will be added by the type erasure foundation classes. │ │ │ │ │ -61template │ │ │ │ │ -62class DifferentiableFunctionWrapperInterface │ │ │ │ │ +38class GridFunctionWrapperInterface : │ │ │ │ │ +39 public DifferentiableFunctionWrapperInterface │ │ │ │ │ -63{ │ │ │ │ │ -64public: │ │ │ │ │ -65 virtual Range operator() (const Domain& x) const = 0; │ │ │ │ │ -66 │ │ │ │ │ -67 virtual DerivativeInterface _d_e_r_i_v_a_t_i_v_e() const = 0; │ │ │ │ │ -68}; │ │ │ │ │ +40{ │ │ │ │ │ +41public: │ │ │ │ │ +42 virtual LocalFunctionInterface wrappedLocalFunction() const = 0; │ │ │ │ │ +43 │ │ │ │ │ +44 virtual const EntitySet& wrappedEntitySet() const = 0; │ │ │ │ │ +45}; │ │ │ │ │ +46 │ │ │ │ │ +47 │ │ │ │ │ +48// Implementation of type erasure wrapper │ │ │ │ │ +49template │ │ │ │ │ +50class GridFunctionWrapperImplementation : │ │ │ │ │ +51 public DifferentiableFunctionWrapperImplementation │ │ │ │ │ +52{ │ │ │ │ │ +53 using Base = DifferentiableFunctionWrapperImplementation; │ │ │ │ │ +54public: │ │ │ │ │ +55 using Base::Base; │ │ │ │ │ +56 │ │ │ │ │ +57 virtual LocalFunctionInterface wrappedLocalFunction() const │ │ │ │ │ +58 { │ │ │ │ │ +59 return localFunction(this->get()); │ │ │ │ │ +60 } │ │ │ │ │ +61 │ │ │ │ │ +62 virtual const EntitySet& wrappedEntitySet() const │ │ │ │ │ +63 { │ │ │ │ │ +64 return this->get().entitySet(); │ │ │ │ │ +65 } │ │ │ │ │ +66}; │ │ │ │ │ +67 │ │ │ │ │ +68 │ │ │ │ │ 69 │ │ │ │ │ -70 │ │ │ │ │ +70}}} // namespace Dune::Functions::Imp │ │ │ │ │ 71 │ │ │ │ │ -72template │ │ │ │ │ -73class DifferentiableFunctionWrapperImplementation │ │ │ │ │ -74{}; │ │ │ │ │ -75 │ │ │ │ │ -76// Implementation of type erasure wrapper │ │ │ │ │ -77template │ │ │ │ │ -78class DifferentiableFunctionWrapperImplementation< Range(Domain), │ │ │ │ │ -DerivativeInterface, B> : │ │ │ │ │ -79 public B │ │ │ │ │ -80{ │ │ │ │ │ -81public: │ │ │ │ │ -82 │ │ │ │ │ -83 using B::B; │ │ │ │ │ -84 using Wrapped = typename B::Wrapped; │ │ │ │ │ -85 │ │ │ │ │ -86 virtual Range operator() (const Domain& x) const │ │ │ │ │ -87 { │ │ │ │ │ -88 return this->get()(x); │ │ │ │ │ -89 } │ │ │ │ │ -90 │ │ │ │ │ -91 virtual DerivativeInterface _d_e_r_i_v_a_t_i_v_e() const │ │ │ │ │ -92 { │ │ │ │ │ -93 return derivativeIfImplemented(this->get()); │ │ │ │ │ -94 } │ │ │ │ │ -95}; │ │ │ │ │ -96 │ │ │ │ │ -97 │ │ │ │ │ -98 │ │ │ │ │ -99}}} // namespace Dune::Functions::Imp │ │ │ │ │ -100 │ │ │ │ │ -101 │ │ │ │ │ -102 │ │ │ │ │ -103#endif // DUNE_FUNCTIONS_COMMON_DIFFERENTIABLE_FUNCTION_IMP_HH │ │ │ │ │ +72 │ │ │ │ │ +73 │ │ │ │ │ +74#endif // DUNE_FUNCTIONS_GRIDFUNCTIONS_GRID_FUNCTION_IMP_HH │ │ │ │ │ +_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n___i_m_p_._h_h │ │ │ │ │ +_i_n_t_e_r_f_a_c_e_s_._h_h │ │ │ │ │ _t_y_p_e___t_r_a_i_t_s_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ -TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const │ │ │ │ │ -TrigonometricFunction< K, sinFactor, cosFactor > &f) │ │ │ │ │ -Obtain derivative of TrigonometricFunction function. │ │ │ │ │ -DDeeffiinniittiioonn trigonometricfunction.hh:43 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00092.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: differentiablefunctionfromcallables.hh File Reference │ │ │ │ +dune-functions: istlvectorbackend.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,55 +65,61 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
differentiablefunctionfromcallables.hh File Reference
│ │ │ │ +
istlvectorbackend.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#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/functions/common/signature.hh>
│ │ │ │ -#include <dune/functions/common/differentiablefunction.hh>
│ │ │ │ -#include <dune/functions/common/functionconcepts.hh>
│ │ │ │ +#include <dune/common/concept.hh>
│ │ │ │ +#include <dune/functions/common/indexaccess.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ -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.
 
template<class V >
constexpr auto Dune::Functions::fieldTypes ()
 Generate list of field types in container.
 
template<class V >
constexpr bool Dune::Functions::hasUniqueFieldType ()
 Check if container has a unique field type.
 
template<class Vector >
auto Dune::Functions::istlVectorBackend (Vector &v)
 Return a vector backend wrapping non-const ISTL like containers.
 
template<class Vector >
auto Dune::Functions::istlVectorBackend (const Vector &v)
 Return a vector backend wrapping const ISTL like containers.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,46 +1,44 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _c_o_m_m_o_n │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -differentiablefunctionfromcallables.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ + * _b_a_c_k_e_n_d_s │ │ │ │ │ +_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +istlvectorbackend.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_s_i_g_n_a_t_u_r_e_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_i_n_d_e_x_a_c_c_e_s_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ - _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _F_ _> │ │ │ │ │ - Wrap a list of callable objects as derivative sequence modelling │ │ │ │ │ -  _C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_> │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ - _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _F_,_ _D_F_,_ _D_e_r_i_v_a_t_i_v_e_s_._._._ _> │ │ │ │ │ - Wrap a list of callable objects as derivative sequence modelling │ │ │ │ │ -  _C_o_n_c_e_p_t_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_R_a_n_g_e_(_D_o_m_a_i_n_)_,_ _D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_> │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template class DerivativeTraits, class... │ │ │ │ │ -F> │ │ │ │ │ -_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s< _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_: │ │ │ │ │ -Signature, DerivativeTraits, F... >  _m_a_k_e_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s │ │ │ │ │ - (const _S_i_g_n_a_t_u_r_e_T_a_g< Signature, │ │ │ │ │ - DerivativeTraits > &signatureTag, F &&... │ │ │ │ │ - f) │ │ │ │ │ -  Create a _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n from │ │ │ │ │ - callables. │ │ │ │ │ +template │ │ │ │ │ +constexpr auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_i_e_l_d_T_y_p_e_s () │ │ │ │ │ +  Generate list of field types in container. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_h_a_s_U_n_i_q_u_e_F_i_e_l_d_T_y_p_e () │ │ │ │ │ +  Check if container has a unique field type. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d (Vector &v) │ │ │ │ │ +  Return a vector backend wrapping non-const ISTL like │ │ │ │ │ + containers. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d (const Vector &v) │ │ │ │ │ +  Return a vector backend wrapping const ISTL like containers. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00092_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: differentiablefunctionfromcallables.hh Source File │ │ │ │ +dune-functions: istlvectorbackend.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,167 +70,352 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
differentiablefunctionfromcallables.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_COMMON_DIFFEREENTIONABEFUNCTIONFROMCALLABLES_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_COMMON_DIFFEREENTIONABEFUNCTIONFROMCALLABLES_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_ISTLVECTORBACKEND_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_ISTLVECTORBACKEND_HH
│ │ │ │
9
│ │ │ │ -
10
│ │ │ │ -
11#include <dune/common/typeutilities.hh>
│ │ │ │ -
12#include <dune/common/hybridutilities.hh>
│ │ │ │ +
10#include <cstddef>
│ │ │ │ +
11#include <utility>
│ │ │ │ +
12#include <type_traits>
│ │ │ │
13
│ │ │ │ - │ │ │ │ -
15
│ │ │ │ - │ │ │ │ - │ │ │ │ +
14#include <dune/common/std/type_traits.hh>
│ │ │ │ +
15#include <dune/common/indices.hh>
│ │ │ │ +
16#include <dune/common/hybridutilities.hh>
│ │ │ │ +
17#include <dune/common/concept.hh>
│ │ │ │
18
│ │ │ │ -
19
│ │ │ │ -
20
│ │ │ │ -
21namespace Dune {
│ │ │ │ -
22namespace Functions {
│ │ │ │ -
23
│ │ │ │ -
24
│ │ │ │ + │ │ │ │ + │ │ │ │ +
21
│ │ │ │ +
22
│ │ │ │ +
23namespace Dune {
│ │ │ │ +
24namespace Functions {
│ │ │ │
25
│ │ │ │ -
26template<class Signature, template<class> class DerivativeTraits, class... Callables>
│ │ │ │ - │ │ │ │ -
28
│ │ │ │ -
29
│ │ │ │ -
30
│ │ │ │ -
47template<class Range, class Domain, template<class> class DerivativeTraits, class F>
│ │ │ │ -
│ │ │ │ -
48class DifferentiableFunctionFromCallables<Range(Domain), DerivativeTraits, F>
│ │ │ │ -
49{
│ │ │ │ -
50public:
│ │ │ │ +
26namespace Impl {
│ │ │ │ +
27
│ │ │ │ +
28template<class V,
│ │ │ │ +
29 std::enable_if_t<not Dune::models<Imp::Concept::HasStaticIndexAccess, V>() , int> = 0>
│ │ │ │ +
30auto fieldTypes(V&& /*v*/)
│ │ │ │ +
31{
│ │ │ │ +
32 return TypeList<V>{};
│ │ │ │ +
33}
│ │ │ │ +
34
│ │ │ │ +
35template<class V,
│ │ │ │ +
36 std::enable_if_t<Dune::models<Imp::Concept::HasStaticIndexAccess, V>(), int> = 0>
│ │ │ │ +
37auto fieldTypes(V&& v)
│ │ │ │ +
38{
│ │ │ │ +
39 if constexpr (Dune::models<Imp::Concept::HasDynamicIndexAccess<std::size_t>, V>())
│ │ │ │ +
40 return fieldTypes(v[std::size_t{0}]);
│ │ │ │ +
41 else
│ │ │ │ +
42 {
│ │ │ │ +
43 auto indexRange = typename decltype(range(Hybrid::size(v)))::integer_sequence();
│ │ │ │ +
44 return unpackIntegerSequence([&](auto... i) {
│ │ │ │ +
45 return uniqueTypeList(std::tuple_cat(fieldTypes(v[i])...));
│ │ │ │ +
46 }, indexRange);
│ │ │ │ +
47 }
│ │ │ │ +
48}
│ │ │ │ +
49
│ │ │ │ +
50} // namespace Impl
│ │ │ │
51
│ │ │ │ -
53 using Signature = Range(Domain);
│ │ │ │ -
54
│ │ │ │ - │ │ │ │ -
56
│ │ │ │ -
58 using DerivativeSignature = typename DerivativeTraits<RawSignature>::Range(Domain);
│ │ │ │ -
59
│ │ │ │ - │ │ │ │ -
62
│ │ │ │ -
64 template<class FF, disableCopyMove<DifferentiableFunctionFromCallables, FF> = 0>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
66 f_(std::forward<FF>(f))
│ │ │ │ -
67 {}
│ │ │ │ -
│ │ │ │ -
68
│ │ │ │ -
│ │ │ │ -
70 Range operator() (const Domain& x) const
│ │ │ │ -
71 {
│ │ │ │ -
72 return f_(x);
│ │ │ │ -
73 }
│ │ │ │ -
│ │ │ │ -
74
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
81 {
│ │ │ │ -
82 DUNE_THROW(Dune::NotImplemented, "Derivative not implemented");
│ │ │ │ -
83 }
│ │ │ │ +
52
│ │ │ │ +
53
│ │ │ │ +
66template<class V>
│ │ │ │ +
│ │ │ │ +
67constexpr auto fieldTypes()
│ │ │ │ +
68{
│ │ │ │ +
69 return decltype(Impl::fieldTypes(std::declval<V>())){};
│ │ │ │ +
70}
│ │ │ │ +
│ │ │ │ +
71
│ │ │ │ +
77template<class V>
│ │ │ │ +
│ │ │ │ +
78constexpr bool hasUniqueFieldType()
│ │ │ │ +
79{
│ │ │ │ +
80 return std::tuple_size_v<std::decay_t<decltype(fieldTypes<V>())>> ==1;
│ │ │ │ +
81}
│ │ │ │
│ │ │ │ +
82
│ │ │ │ +
83
│ │ │ │
84
│ │ │ │ -
85private:
│ │ │ │ -
86 F f_;
│ │ │ │ -
87};
│ │ │ │ -
│ │ │ │ -
88
│ │ │ │ -
89
│ │ │ │ -
90
│ │ │ │ -
107template<class Range, class Domain, template<class> class DerivativeTraits, class F, class DF, class... Derivatives>
│ │ │ │ -
│ │ │ │ -
108class DifferentiableFunctionFromCallables<Range(Domain), DerivativeTraits, F, DF, Derivatives...>
│ │ │ │ -
109{
│ │ │ │ -
110public:
│ │ │ │ +
85namespace Impl {
│ │ │ │ +
86
│ │ │ │ +
87/*
│ │ │ │ +
88 * \brief A wrapper providing multi-index access to vector entries
│ │ │ │ +
89 *
│ │ │ │ +
90 * The wrapped vector type should be an istl like random
│ │ │ │ +
91 * access container providing operator[] and size() methods.
│ │ │ │ +
92 * For classical containers this should support indices
│ │ │ │ +
93 * of type std::size_t. For multi-type containers indices
│ │ │ │ +
94 * of the form Dune::index_constant<i> should be supported
│ │ │ │ +
95 * while size() should be a static constexpr method.
│ │ │ │ +
96 *
│ │ │ │ +
97 * When resolving multi-indices the backend appends indices
│ │ │ │ +
98 * using operator[] as long as the result is not a scalar.
│ │ │ │ +
99 * If this exhausts the digits of the multi-index, additional
│ │ │ │ +
100 * zero`s are appended.
│ │ │ │ +
101 *
│ │ │ │ +
102 * \tparam V Type of the raw wrapper vector
│ │ │ │ +
103 */
│ │ │ │ +
104template<class V>
│ │ │ │ +
105class ISTLVectorBackend
│ │ │ │ +
106{
│ │ │ │ +
107
│ │ │ │ +
108 // Template aliases for using detection idiom.
│ │ │ │ +
109 template<class C>
│ │ │ │ +
110 using dynamicIndexAccess_t = decltype(std::declval<C>()[0]);
│ │ │ │
111
│ │ │ │ -
112 using Signature = Range(Domain);
│ │ │ │ - │ │ │ │ -
114 using DerivativeSignature = typename DerivativeTraits<RawSignature>::Range(Domain);
│ │ │ │ -
115
│ │ │ │ -
116 using Derivative = DifferentiableFunctionFromCallables<DerivativeSignature, DerivativeTraits, DF, Derivatives...>;
│ │ │ │ +
112 template<class C>
│ │ │ │ +
113 using staticIndexAccess_t = decltype(std::declval<C>()[Dune::Indices::_0]);
│ │ │ │ +
114
│ │ │ │ +
115 template<class C>
│ │ │ │ +
116 using resizeMethod_t = decltype(std::declval<C>().resize(0));
│ │ │ │
117
│ │ │ │ -
124 template<class FF, class DFF, class... DDFF>
│ │ │ │ -
│ │ │ │ -
125 DifferentiableFunctionFromCallables(FF&& f, DFF&& df, DDFF&&... ddf) :
│ │ │ │ -
126 f_(std::forward<FF>(f)),
│ │ │ │ -
127 df_(std::forward<DFF>(df), std::forward<DDFF>(ddf)...)
│ │ │ │ -
128 {}
│ │ │ │ -
│ │ │ │ +
118
│ │ │ │ +
119
│ │ │ │ +
120 // Short cuts for feature detection
│ │ │ │ +
121 template<class C>
│ │ │ │ +
122 using hasDynamicIndexAccess = Dune::Std::is_detected<dynamicIndexAccess_t, std::remove_reference_t<C>>;
│ │ │ │ +
123
│ │ │ │ +
124 template<class C>
│ │ │ │ +
125 using hasStaticIndexAccess = Dune::Std::is_detected<staticIndexAccess_t, std::remove_reference_t<C>>;
│ │ │ │ +
126
│ │ │ │ +
127 template<class C>
│ │ │ │ +
128 using hasResizeMethod = Dune::Std::is_detected<resizeMethod_t, std::remove_reference_t<C>>;
│ │ │ │
129
│ │ │ │ -
│ │ │ │ -
131 Range operator() (const Domain& x) const
│ │ │ │ -
132 {
│ │ │ │ -
133 return f_(x);
│ │ │ │ -
134 }
│ │ │ │ -
│ │ │ │ -
135
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
142 {
│ │ │ │ -
143 return t.df_;
│ │ │ │ -
144 }
│ │ │ │ -
│ │ │ │ +
130 template<class C>
│ │ │ │ +
131 using isDynamicVector = Dune::Std::is_detected<dynamicIndexAccess_t, std::remove_reference_t<C>>;
│ │ │ │ +
132
│ │ │ │ +
133 template<class C>
│ │ │ │ +
134 using isStaticVector = Dune::Std::bool_constant<
│ │ │ │ +
135 Dune::Std::is_detected_v<staticIndexAccess_t, std::remove_reference_t<C>>
│ │ │ │ +
136 and not Dune::Std::is_detected_v<dynamicIndexAccess_t, std::remove_reference_t<C>>>;
│ │ │ │ +
137
│ │ │ │ +
138 template<class C>
│ │ │ │ +
139 using isScalar = Dune::Std::bool_constant<not Dune::Std::is_detected_v<staticIndexAccess_t, std::remove_reference_t<C>>>;
│ │ │ │ +
140
│ │ │ │ +
141 template<class C>
│ │ │ │ +
142 using isVector = Dune::Std::bool_constant<Dune::Std::is_detected_v<staticIndexAccess_t, std::remove_reference_t<C>>>;
│ │ │ │ +
143
│ │ │ │ +
144
│ │ │ │
145
│ │ │ │ -
146private:
│ │ │ │ -
147 F f_;
│ │ │ │ -
148 Derivative df_;
│ │ │ │ -
149};
│ │ │ │ -
│ │ │ │ -
150
│ │ │ │ +
146 template<class... Args>
│ │ │ │ +
147 static void forwardToResize(Args&&... args)
│ │ │ │ +
148 {
│ │ │ │ +
149 resize(std::forward<Args>(args)...);
│ │ │ │ +
150 }
│ │ │ │
151
│ │ │ │ -
166template<class Signature, template<class> class DerivativeTraits, class... F>
│ │ │ │ -
167DifferentiableFunctionFromCallables<Signature, DerivativeTraits, F...>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
169{
│ │ │ │ -
170 return DifferentiableFunctionFromCallables<Signature, DerivativeTraits, F...>(f...);
│ │ │ │ -
171}
│ │ │ │ -
│ │ │ │ -
172
│ │ │ │ -
173
│ │ │ │ -
174
│ │ │ │ -
175} // namespace Functions
│ │ │ │ -
176} // namespace Dune
│ │ │ │ -
177
│ │ │ │ -
178#endif //DUNE_FUNCTIONS_COMMON_DIFFEREENTIONABEFUNCTIONFROMCALLABLES_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
friend Derivative derivative(const DifferentiableFunctionFromCallables &t)
Get derivative of DifferentiableFunctionFromCallables.
Definition differentiablefunctionfromcallables.hh:80
│ │ │ │ -
DifferentiableFunctionFromCallables< Signature, DerivativeTraits, F... > makeDifferentiableFunctionFromCallables(const SignatureTag< Signature, DerivativeTraits > &signatureTag, F &&... f)
Create a DifferentiableFunction from callables.
Definition differentiablefunctionfromcallables.hh:168
│ │ │ │ +
152
│ │ │ │ +
153 template<class C, class SizeProvider,
│ │ │ │ +
154 std::enable_if_t<hasResizeMethod<C>::value, int> = 0>
│ │ │ │ +
155 static void resize(C&& c, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ +
156 {
│ │ │ │ +
157 auto size = sizeProvider.size(prefix);
│ │ │ │ +
158 if (size==0)
│ │ │ │ +
159 {
│ │ │ │ +
160 // If size==0 this prefix refers to a single coefficient c.
│ │ │ │ +
161 // But being in this overload means that c is not a scalar
│ │ │ │ +
162 // because is has a resize() method. Since operator[] deliberately
│ │ │ │ +
163 // supports implicit padding of multi-indices by as many
│ │ │ │ +
164 // [0]'s as needed to resolve a scalar entry, we should also
│ │ │ │ +
165 // except a non-scalar c here. However, this requires that
│ │ │ │ +
166 // we silently believe that whatever size c already has is
│ │ │ │ +
167 // intended by the user. The only exception is c.size()==0
│ │ │ │ +
168 // which is not acceptable but we also cannot know the desired size.
│ │ │ │ +
169 if (c.size()==0)
│ │ │ │ +
170 DUNE_THROW(RangeError, "The vector entry v[" << prefix << "] should refer to a "
│ │ │ │ +
171 << "scalar coefficient, but is a dynamically sized vector of size==0");
│ │ │ │ +
172 else
│ │ │ │ +
173 // Accept non-zero sized coefficients to avoid that resize(basis)
│ │ │ │ +
174 // fails for a vector that works with operator[] and already
│ │ │ │ +
175 // has the appropriate size.
│ │ │ │ +
176 return;
│ │ │ │ +
177 }
│ │ │ │ +
178 c.resize(size);
│ │ │ │ +
179 prefix.push_back(0);
│ │ │ │ +
180 for(std::size_t i=0; i<size; ++i)
│ │ │ │ +
181 {
│ │ │ │ +
182 prefix.back() = i;
│ │ │ │ +
183 resize(c[i], sizeProvider, prefix);
│ │ │ │ +
184 }
│ │ │ │ +
185 }
│ │ │ │ +
186
│ │ │ │ +
187 template<class C, class SizeProvider,
│ │ │ │ +
188 std::enable_if_t<not hasResizeMethod<C>::value, int> = 0,
│ │ │ │ +
189 std::enable_if_t<isVector<C>::value, int> = 0>
│ │ │ │ +
190 static void resize(C&& c, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ +
191 {
│ │ │ │ +
192 auto size = sizeProvider.size(prefix);
│ │ │ │ +
193 // If size == 0 there's nothing to do:
│ │ │ │ +
194 // We can't resize c and it's already
│ │ │ │ +
195 // large enough anyway.
│ │ │ │ +
196 if (size == 0)
│ │ │ │ +
197 return;
│ │ │ │ +
198
│ │ │ │ +
199 // If size>0 but c does not have the appropriate
│ │ │ │ +
200 // size we throw an exception.
│ │ │ │ +
201 //
│ │ │ │ +
202 // We could perhaps also allow c.size()>size.
│ │ │ │ +
203 // But then looping the loop below gets complicated:
│ │ │ │ +
204 // We're not allowed to loop until c.size(). But
│ │ │ │ +
205 // we also cannot use size for termination,
│ │ │ │ +
206 // because this fails if c is a static vector.
│ │ │ │ +
207 if (c.size() != size)
│ │ │ │ +
208 DUNE_THROW(RangeError, "Can't resize non-resizable entry v[" << prefix << "] of size " << c.size() << " to size(" << prefix << ")=" << size);
│ │ │ │ +
209
│ │ │ │ +
210 // Recursively resize all entries of c now.
│ │ │ │ +
211 using namespace Dune::Hybrid;
│ │ │ │ +
212 prefix.push_back(0);
│ │ │ │ +
213 forEach(integralRange(Hybrid::size(c)), [&](auto&& i) {
│ │ │ │ +
214 prefix.back() = i;
│ │ │ │ +
215 // Here we'd simply like to call resize(c[i], sizeProvider, prefix);
│ │ │ │ +
216 // but even gcc-7 does not except this bus reports
│ │ │ │ +
217 // "error: ‘this’ was not captured for this lambda function"
│ │ │ │ +
218 // although there's no 'this' because we're in a static method.
│ │ │ │ +
219 // Bypassing this by and additional method that does perfect
│ │ │ │ +
220 // forwarding allows to workaround this.
│ │ │ │ +
221 ISTLVectorBackend<V>::forwardToResize(c[i], sizeProvider, prefix);
│ │ │ │ +
222 });
│ │ │ │ +
223 }
│ │ │ │ +
224
│ │ │ │ +
225 template<class C, class SizeProvider,
│ │ │ │ +
226 std::enable_if_t<not hasResizeMethod<C>::value, int> = 0,
│ │ │ │ +
227 std::enable_if_t<isScalar<C>::value, int> = 0>
│ │ │ │ +
228 static void resize(C&&, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ +
229 {
│ │ │ │ +
230 auto size = sizeProvider.size(prefix);
│ │ │ │ +
231 if (size != 0)
│ │ │ │ +
232 DUNE_THROW(RangeError, "Can't resize scalar vector entry v[" << prefix << "] to size(" << prefix << ")=" << size);
│ │ │ │ +
233 }
│ │ │ │ +
234
│ │ │ │ +
235 template<class C, class T,
│ │ │ │ +
236 std::enable_if_t<std::is_assignable_v<C&,T>, int> = 0>
│ │ │ │ +
237 void recursiveAssign(C& c, const T& t)
│ │ │ │ +
238 {
│ │ │ │ +
239 c = t;
│ │ │ │ +
240 }
│ │ │ │ +
241
│ │ │ │ +
242 template<class C, class T,
│ │ │ │ +
243 std::enable_if_t<not std::is_assignable_v<C&,T>, int> = 0>
│ │ │ │ +
244 void recursiveAssign(C& c, const T& t)
│ │ │ │ +
245 {
│ │ │ │ +
246 Dune::Hybrid::forEach(c, [&](auto&& ci) {
│ │ │ │ +
247 recursiveAssign(ci, t);
│ │ │ │ +
248 });
│ │ │ │ +
249 }
│ │ │ │ +
250
│ │ │ │ +
251public:
│ │ │ │ +
252
│ │ │ │ +
253 using Vector = V;
│ │ │ │ +
254
│ │ │ │ +
255 ISTLVectorBackend(Vector& vector) :
│ │ │ │ +
256 vector_(&vector)
│ │ │ │ +
257 {}
│ │ │ │ +
258
│ │ │ │ +
259 template<class SizeProvider>
│ │ │ │ +
260 void resize(const SizeProvider& sizeProvider)
│ │ │ │ +
261 {
│ │ │ │ +
262 auto prefix = typename SizeProvider::SizePrefix();
│ │ │ │ +
263 prefix.resize(0);
│ │ │ │ +
264 resize(*vector_, sizeProvider, prefix);
│ │ │ │ +
265 }
│ │ │ │ +
266
│ │ │ │ +
267 template<class MultiIndex>
│ │ │ │ +
268 decltype(auto) operator[](const MultiIndex& index) const
│ │ │ │ +
269 {
│ │ │ │ +
270 return resolveDynamicMultiIndex(*vector_, index);
│ │ │ │ +
271 }
│ │ │ │ +
272
│ │ │ │ +
273 template<class MultiIndex>
│ │ │ │ +
274 decltype(auto) operator[](const MultiIndex& index)
│ │ │ │ +
275 {
│ │ │ │ +
276 return resolveDynamicMultiIndex(*vector_, index);
│ │ │ │ +
277 }
│ │ │ │ +
278
│ │ │ │ +
287 template<typename T>
│ │ │ │ +
288 void operator= (const T& other)
│ │ │ │ +
289 {
│ │ │ │ +
290 recursiveAssign(vector(), other);
│ │ │ │ +
291 }
│ │ │ │ +
292
│ │ │ │ +
293 template<typename T>
│ │ │ │ +
294 void operator= (const ISTLVectorBackend<T>& other)
│ │ │ │ +
295 {
│ │ │ │ +
296 vector() = other.vector();
│ │ │ │ +
297 }
│ │ │ │ +
298
│ │ │ │ +
299 const Vector& vector() const
│ │ │ │ +
300 {
│ │ │ │ +
301 return *vector_;
│ │ │ │ +
302 }
│ │ │ │ +
303
│ │ │ │ +
304 Vector& vector()
│ │ │ │ +
305 {
│ │ │ │ +
306 return *vector_;
│ │ │ │ +
307 }
│ │ │ │ +
308
│ │ │ │ +
309private:
│ │ │ │ +
310
│ │ │ │ +
311 Vector* vector_;
│ │ │ │ +
312};
│ │ │ │ +
313
│ │ │ │ +
314} // end namespace Impl
│ │ │ │ +
315
│ │ │ │ +
316
│ │ │ │ +
317
│ │ │ │ +
349template<class Vector>
│ │ │ │ +
│ │ │ │ +
350auto istlVectorBackend(Vector& v)
│ │ │ │ +
351{
│ │ │ │ +
352 static_assert(hasUniqueFieldType<Vector&>(), "Vector type passed to istlVectorBackend() does not have a unique field type.");
│ │ │ │ +
353 return Impl::ISTLVectorBackend<Vector>(v);
│ │ │ │ +
354}
│ │ │ │ +
│ │ │ │ +
355
│ │ │ │ +
356
│ │ │ │ +
357
│ │ │ │ +
387template<class Vector>
│ │ │ │ +
│ │ │ │ +
388auto istlVectorBackend(const Vector& v)
│ │ │ │ +
389{
│ │ │ │ +
390 static_assert(hasUniqueFieldType<const Vector&>(), "Vector type passed to istlVectorBackend() does not have a unique field type.");
│ │ │ │ +
391 return Impl::ISTLVectorBackend<const Vector>(v);
│ │ │ │ +
392}
│ │ │ │ +
│ │ │ │ +
393
│ │ │ │ +
394
│ │ │ │ +
395
│ │ │ │ +
396} // namespace Functions
│ │ │ │ +
397} // namespace Dune
│ │ │ │ +
398
│ │ │ │ +
399
│ │ │ │ +
400#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_ISTLVECTORBACKEND_HH
│ │ │ │ + │ │ │ │ +
auto istlVectorBackend(Vector &v)
Return a vector backend wrapping non-const ISTL like containers.
Definition istlvectorbackend.hh:350
│ │ │ │ +
constexpr decltype(auto) resolveDynamicMultiIndex(C &&c, const MultiIndex &multiIndex, const IsFinal &isFinal)
Provide multi-index access by chaining operator[].
Definition indexaccess.hh:377
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
Definition differentiablefunction.hh:33
│ │ │ │ -
Definition differentiablefunctionfromcallables.hh:27
│ │ │ │ -
DifferentiableFunctionFromCallables(FF &&f)
Constructor copying the given function.
Definition differentiablefunctionfromcallables.hh:65
│ │ │ │ -
typename SignatureTraits< Signature >::RawSignature RawSignature
Definition differentiablefunctionfromcallables.hh:55
│ │ │ │ -
Range(Domain) Signature
Signature of function.
Definition differentiablefunctionfromcallables.hh:53
│ │ │ │ -
typename DerivativeTraits< RawSignature >::Range(Domain) DerivativeSignature
Signature of derivative.
Definition differentiablefunctionfromcallables.hh:58
│ │ │ │ -
typename DerivativeTraits< RawSignature >::Range(Domain) DerivativeSignature
Definition differentiablefunctionfromcallables.hh:114
│ │ │ │ - │ │ │ │ -
typename SignatureTraits< Signature >::RawSignature RawSignature
Definition differentiablefunctionfromcallables.hh:113
│ │ │ │ -
DifferentiableFunctionFromCallables(FF &&f, DFF &&df, DDFF &&... ddf)
Constructor copying the given functions.
Definition differentiablefunctionfromcallables.hh:125
│ │ │ │ -
Helper class to deduce the signature of a callable.
Definition signature.hh:60
│ │ │ │ -
Definition signature.hh:106
│ │ │ │ +
constexpr auto fieldTypes()
Generate list of field types in container.
Definition istlvectorbackend.hh:67
│ │ │ │ +
constexpr bool hasUniqueFieldType()
Check if container has a unique field type.
Definition istlvectorbackend.hh:78
│ │ │ │ +
std::vector< Child > Vector
Descriptor for vectors with all children of the same type and dynamic size.
Definition containerdescriptors.hh:124
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,196 +1,372 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ - * _c_o_m_m_o_n │ │ │ │ │ -differentiablefunctionfromcallables.hh │ │ │ │ │ + * _b_a_c_k_e_n_d_s │ │ │ │ │ +istlvectorbackend.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_COMMON_DIFFEREENTIONABEFUNCTIONFROMCALLABLES_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_COMMON_DIFFEREENTIONABEFUNCTIONFROMCALLABLES_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_ISTLVECTORBACKEND_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_ISTLVECTORBACKEND_HH │ │ │ │ │ 9 │ │ │ │ │ -10 │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ 13 │ │ │ │ │ -14#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_s_i_g_n_a_t_u_r_e_._h_h> │ │ │ │ │ -15 │ │ │ │ │ -16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ -17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17#include │ │ │ │ │ 18 │ │ │ │ │ -19 │ │ │ │ │ -20 │ │ │ │ │ -21namespace _D_u_n_e { │ │ │ │ │ -22namespace Functions { │ │ │ │ │ -23 │ │ │ │ │ -24 │ │ │ │ │ +19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_i_n_d_e_x_a_c_c_e_s_s_._h_h> │ │ │ │ │ +20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +21 │ │ │ │ │ +22 │ │ │ │ │ +23namespace _D_u_n_e { │ │ │ │ │ +24namespace Functions { │ │ │ │ │ 25 │ │ │ │ │ -26template class DerivativeTraits, class... │ │ │ │ │ -Callables> │ │ │ │ │ -_2_7class _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s; │ │ │ │ │ -28 │ │ │ │ │ -29 │ │ │ │ │ -30 │ │ │ │ │ -47template class DerivativeTraits, │ │ │ │ │ -class F> │ │ │ │ │ -_4_8class _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s │ │ │ │ │ -49{ │ │ │ │ │ -50public: │ │ │ │ │ -51 │ │ │ │ │ -_5_3 using _S_i_g_n_a_t_u_r_e = Range(Domain); │ │ │ │ │ -54 │ │ │ │ │ -_5_5 using _R_a_w_S_i_g_n_a_t_u_r_e = typename _S_i_g_n_a_t_u_r_e_T_r_a_i_t_s_<_S_i_g_n_a_t_u_r_e_>_:_:_R_a_w_S_i_g_n_a_t_u_r_e; │ │ │ │ │ -56 │ │ │ │ │ -_5_8 using _D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e = typename DerivativeTraits::Range │ │ │ │ │ -(Domain); │ │ │ │ │ -59 │ │ │ │ │ -_6_1 using _D_e_r_i_v_a_t_i_v_e = _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_<_D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_>; │ │ │ │ │ -62 │ │ │ │ │ -64 template │ │ │ │ │ +26namespace Impl { │ │ │ │ │ +27 │ │ │ │ │ +28template() , │ │ │ │ │ +int> = 0> │ │ │ │ │ +30auto _f_i_e_l_d_T_y_p_e_s(V&& /*v*/) │ │ │ │ │ +31{ │ │ │ │ │ +32 return TypeList{}; │ │ │ │ │ +33} │ │ │ │ │ +34 │ │ │ │ │ +35template(), int> │ │ │ │ │ = 0> │ │ │ │ │ -_6_5 _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s(FF&& f) : │ │ │ │ │ -66 f_(std::forward(f)) │ │ │ │ │ -67 {} │ │ │ │ │ -68 │ │ │ │ │ -_7_0 Range operator() (const Domain& x) const │ │ │ │ │ -71 { │ │ │ │ │ -72 return f_(x); │ │ │ │ │ -73 } │ │ │ │ │ -74 │ │ │ │ │ -_8_0 friend _D_e_r_i_v_a_t_i_v_e _d_e_r_i_v_a_t_i_v_e(const _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s& t) │ │ │ │ │ -81 { │ │ │ │ │ -82 DUNE_THROW(Dune::NotImplemented, "Derivative not implemented"); │ │ │ │ │ -83 } │ │ │ │ │ +37auto _f_i_e_l_d_T_y_p_e_s(V&& v) │ │ │ │ │ +38{ │ │ │ │ │ +39 if constexpr (Dune::models, │ │ │ │ │ +V>()) │ │ │ │ │ +40 return _f_i_e_l_d_T_y_p_e_s(v[std::size_t{0}]); │ │ │ │ │ +41 else │ │ │ │ │ +42 { │ │ │ │ │ +43 auto indexRange = typename decltype(range(Hybrid::size(v))):: │ │ │ │ │ +integer_sequence(); │ │ │ │ │ +44 return unpackIntegerSequence([&](auto... i) { │ │ │ │ │ +45 return uniqueTypeList(std::tuple_cat(_f_i_e_l_d_T_y_p_e_s(v[i])...)); │ │ │ │ │ +46 }, indexRange); │ │ │ │ │ +47 } │ │ │ │ │ +48} │ │ │ │ │ +49 │ │ │ │ │ +50} // namespace Impl │ │ │ │ │ +51 │ │ │ │ │ +52 │ │ │ │ │ +53 │ │ │ │ │ +66template │ │ │ │ │ +_6_7constexpr auto _f_i_e_l_d_T_y_p_e_s() │ │ │ │ │ +68{ │ │ │ │ │ +69 return decltype(Impl::fieldTypes(std::declval())){}; │ │ │ │ │ +70} │ │ │ │ │ +71 │ │ │ │ │ +77template │ │ │ │ │ +_7_8constexpr bool _h_a_s_U_n_i_q_u_e_F_i_e_l_d_T_y_p_e() │ │ │ │ │ +79{ │ │ │ │ │ +80 return std::tuple_size_v())>> ==1; │ │ │ │ │ +81} │ │ │ │ │ +82 │ │ │ │ │ +83 │ │ │ │ │ 84 │ │ │ │ │ -85private: │ │ │ │ │ -86 F f_; │ │ │ │ │ -87}; │ │ │ │ │ -88 │ │ │ │ │ -89 │ │ │ │ │ -90 │ │ │ │ │ -107template class DerivativeTraits, │ │ │ │ │ -class F, class DF, class... Derivatives> │ │ │ │ │ -_1_0_8class _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s │ │ │ │ │ -109{ │ │ │ │ │ -110public: │ │ │ │ │ +85namespace Impl { │ │ │ │ │ +86 │ │ │ │ │ +87/* │ │ │ │ │ +88 * \brief A wrapper providing multi-index access to vector entries │ │ │ │ │ +89 * │ │ │ │ │ +90 * The wrapped vector type should be an istl like random │ │ │ │ │ +91 * access container providing operator[] and size() methods. │ │ │ │ │ +92 * For classical containers this should support indices │ │ │ │ │ +93 * of type std::size_t. For multi-type containers indices │ │ │ │ │ +94 * of the form Dune::index_constant should be supported │ │ │ │ │ +95 * while size() should be a static constexpr method. │ │ │ │ │ +96 * │ │ │ │ │ +97 * When resolving multi-indices the backend appends indices │ │ │ │ │ +98 * using operator[] as long as the result is not a scalar. │ │ │ │ │ +99 * If this exhausts the digits of the multi-index, additional │ │ │ │ │ +100 * zero`s are appended. │ │ │ │ │ +101 * │ │ │ │ │ +102 * \tparam V Type of the raw wrapper vector │ │ │ │ │ +103 */ │ │ │ │ │ +104template │ │ │ │ │ +105class ISTLVectorBackend │ │ │ │ │ +106{ │ │ │ │ │ +107 │ │ │ │ │ +108 // Template aliases for using detection idiom. │ │ │ │ │ +109 template │ │ │ │ │ +110 using dynamicIndexAccess_t = decltype(std::declval()[0]); │ │ │ │ │ 111 │ │ │ │ │ -_1_1_2 using _S_i_g_n_a_t_u_r_e = Range(Domain); │ │ │ │ │ -_1_1_3 using _R_a_w_S_i_g_n_a_t_u_r_e = typename _S_i_g_n_a_t_u_r_e_T_r_a_i_t_s_<_S_i_g_n_a_t_u_r_e_>_:_:_R_a_w_S_i_g_n_a_t_u_r_e; │ │ │ │ │ -_1_1_4 using _D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e = typename DerivativeTraits::Range │ │ │ │ │ -(Domain); │ │ │ │ │ -115 │ │ │ │ │ -_1_1_6 using _D_e_r_i_v_a_t_i_v_e = _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s<_D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e, │ │ │ │ │ -DerivativeTraits, DF, Derivatives...>; │ │ │ │ │ +112 template │ │ │ │ │ +113 using staticIndexAccess_t = decltype(std::declval()[Dune::Indices::_0]); │ │ │ │ │ +114 │ │ │ │ │ +115 template │ │ │ │ │ +116 using resizeMethod_t = decltype(std::declval().resize(0)); │ │ │ │ │ 117 │ │ │ │ │ -124 template │ │ │ │ │ -_1_2_5 _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s(FF&& f, DFF&& df, DDFF&&... ddf) : │ │ │ │ │ -126 f_(std::forward(f)), │ │ │ │ │ -127 df_(std::forward(df), std::forward(ddf)...) │ │ │ │ │ -128 {} │ │ │ │ │ +118 │ │ │ │ │ +119 │ │ │ │ │ +120 // Short cuts for feature detection │ │ │ │ │ +121 template │ │ │ │ │ +122 using hasDynamicIndexAccess = Dune::Std::is_detected>; │ │ │ │ │ +123 │ │ │ │ │ +124 template │ │ │ │ │ +125 using hasStaticIndexAccess = Dune::Std::is_detected>; │ │ │ │ │ +126 │ │ │ │ │ +127 template │ │ │ │ │ +128 using hasResizeMethod = Dune::Std::is_detected>; │ │ │ │ │ 129 │ │ │ │ │ -_1_3_1 Range operator() (const Domain& x) const │ │ │ │ │ -132 { │ │ │ │ │ -133 return f_(x); │ │ │ │ │ -134 } │ │ │ │ │ -135 │ │ │ │ │ -_1_4_1 friend _D_e_r_i_v_a_t_i_v_e _d_e_r_i_v_a_t_i_v_e(const _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s& t) │ │ │ │ │ -142 { │ │ │ │ │ -143 return t.df_; │ │ │ │ │ -144 } │ │ │ │ │ +130 template │ │ │ │ │ +131 using isDynamicVector = Dune::Std::is_detected>; │ │ │ │ │ +132 │ │ │ │ │ +133 template │ │ │ │ │ +134 using isStaticVector = Dune::Std::bool_constant< │ │ │ │ │ +135 Dune::Std::is_detected_v> │ │ │ │ │ +136 and not Dune::Std::is_detected_v>>; │ │ │ │ │ +137 │ │ │ │ │ +138 template │ │ │ │ │ +139 using isScalar = Dune::Std::bool_constant>>; │ │ │ │ │ +140 │ │ │ │ │ +141 template │ │ │ │ │ +142 using isVector = Dune::Std::bool_constant>>; │ │ │ │ │ +143 │ │ │ │ │ +144 │ │ │ │ │ 145 │ │ │ │ │ -146private: │ │ │ │ │ -147 F f_; │ │ │ │ │ -148 Derivative df_; │ │ │ │ │ -149}; │ │ │ │ │ -150 │ │ │ │ │ +146 template │ │ │ │ │ +147 static void forwardToResize(Args&&... args) │ │ │ │ │ +148 { │ │ │ │ │ +149 resize(std::forward(args)...); │ │ │ │ │ +150 } │ │ │ │ │ 151 │ │ │ │ │ -166template class DerivativeTraits, class... │ │ │ │ │ -F> │ │ │ │ │ -167DifferentiableFunctionFromCallables │ │ │ │ │ -_1_6_8 _m_a_k_e_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s(const _S_i_g_n_a_t_u_r_e_T_a_g_<_S_i_g_n_a_t_u_r_e_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_>& signatureTag, F&&... f) │ │ │ │ │ -169{ │ │ │ │ │ -170 return _D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s(f...); │ │ │ │ │ -171} │ │ │ │ │ -172 │ │ │ │ │ -173 │ │ │ │ │ -174 │ │ │ │ │ -175} // namespace Functions │ │ │ │ │ -176} // namespace Dune │ │ │ │ │ -177 │ │ │ │ │ -178#endif //DUNE_FUNCTIONS_COMMON_DIFFEREENTIONABEFUNCTIONFROMCALLABLES_HH │ │ │ │ │ -_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ -_d_i_f_f_e_r_e_n_t_i_a_b_l_e_f_u_n_c_t_i_o_n_._h_h │ │ │ │ │ -_s_i_g_n_a_t_u_r_e_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _F_ _>_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ -friend Derivative derivative(const DifferentiableFunctionFromCallables &t) │ │ │ │ │ -Get derivative of DifferentiableFunctionFromCallables. │ │ │ │ │ -DDeeffiinniittiioonn differentiablefunctionfromcallables.hh:80 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s │ │ │ │ │ -DifferentiableFunctionFromCallables< Signature, DerivativeTraits, F... > │ │ │ │ │ -makeDifferentiableFunctionFromCallables(const SignatureTag< Signature, │ │ │ │ │ -DerivativeTraits > &signatureTag, F &&... f) │ │ │ │ │ -Create a DifferentiableFunction from callables. │ │ │ │ │ -DDeeffiinniittiioonn differentiablefunctionfromcallables.hh:168 │ │ │ │ │ +152 │ │ │ │ │ +153 template::value, int> = 0> │ │ │ │ │ +155 static void resize(C&& c, const SizeProvider& sizeProvider, typename │ │ │ │ │ +SizeProvider::SizePrefix prefix) │ │ │ │ │ +156 { │ │ │ │ │ +157 auto size = sizeProvider.size(prefix); │ │ │ │ │ +158 if (size==0) │ │ │ │ │ +159 { │ │ │ │ │ +160 // If size==0 this prefix refers to a single coefficient c. │ │ │ │ │ +161 // But being in this overload means that c is not a scalar │ │ │ │ │ +162 // because is has a resize() method. Since operator[] deliberately │ │ │ │ │ +163 // supports implicit padding of multi-indices by as many │ │ │ │ │ +164 // [0]'s as needed to resolve a scalar entry, we should also │ │ │ │ │ +165 // except a non-scalar c here. However, this requires that │ │ │ │ │ +166 // we silently believe that whatever size c already has is │ │ │ │ │ +167 // intended by the user. The only exception is c.size()==0 │ │ │ │ │ +168 // which is not acceptable but we also cannot know the desired size. │ │ │ │ │ +169 if (c.size()==0) │ │ │ │ │ +170 DUNE_THROW(RangeError, "The vector entry v[" << prefix << "] should refer │ │ │ │ │ +to a " │ │ │ │ │ +171 << "scalar coefficient, but is a dynamically sized vector of size==0"); │ │ │ │ │ +172 else │ │ │ │ │ +173 // Accept non-zero sized coefficients to avoid that resize(basis) │ │ │ │ │ +174 // fails for a vector that works with operator[] and already │ │ │ │ │ +175 // has the appropriate size. │ │ │ │ │ +176 return; │ │ │ │ │ +177 } │ │ │ │ │ +178 c.resize(size); │ │ │ │ │ +179 prefix.push_back(0); │ │ │ │ │ +180 for(std::size_t i=0; i::value, int> = 0, │ │ │ │ │ +189 std::enable_if_t::value, int> = 0> │ │ │ │ │ +190 static void resize(C&& c, const SizeProvider& sizeProvider, typename │ │ │ │ │ +SizeProvider::SizePrefix prefix) │ │ │ │ │ +191 { │ │ │ │ │ +192 auto size = sizeProvider.size(prefix); │ │ │ │ │ +193 // If size == 0 there's nothing to do: │ │ │ │ │ +194 // We can't resize c and it's already │ │ │ │ │ +195 // large enough anyway. │ │ │ │ │ +196 if (size == 0) │ │ │ │ │ +197 return; │ │ │ │ │ +198 │ │ │ │ │ +199 // If size>0 but c does not have the appropriate │ │ │ │ │ +200 // size we throw an exception. │ │ │ │ │ +201 // │ │ │ │ │ +202 // We could perhaps also allow c.size()>size. │ │ │ │ │ +203 // But then looping the loop below gets complicated: │ │ │ │ │ +204 // We're not allowed to loop until c.size(). But │ │ │ │ │ +205 // we also cannot use size for termination, │ │ │ │ │ +206 // because this fails if c is a static vector. │ │ │ │ │ +207 if (c.size() != size) │ │ │ │ │ +208 DUNE_THROW(RangeError, "Can't resize non-resizable entry v[" << prefix << │ │ │ │ │ +"] of size " << c.size() << " to size(" << prefix << ")=" << size); │ │ │ │ │ +209 │ │ │ │ │ +210 // Recursively resize all entries of c now. │ │ │ │ │ +211 using namespace Dune::Hybrid; │ │ │ │ │ +212 prefix.push_back(0); │ │ │ │ │ +213 forEach(integralRange(Hybrid::size(c)), [&](auto&& i) { │ │ │ │ │ +214 prefix.back() = i; │ │ │ │ │ +215 // Here we'd simply like to call resize(c[i], sizeProvider, prefix); │ │ │ │ │ +216 // but even gcc-7 does not except this bus reports │ │ │ │ │ +217 // "error: ‘this’ was not captured for this lambda function" │ │ │ │ │ +218 // although there's no 'this' because we're in a static method. │ │ │ │ │ +219 // Bypassing this by and additional method that does perfect │ │ │ │ │ +220 // forwarding allows to workaround this. │ │ │ │ │ +221 ISTLVectorBackend::forwardToResize(c[i], sizeProvider, prefix); │ │ │ │ │ +222 }); │ │ │ │ │ +223 } │ │ │ │ │ +224 │ │ │ │ │ +225 template::value, int> = 0, │ │ │ │ │ +227 std::enable_if_t::value, int> = 0> │ │ │ │ │ +228 static void resize(C&&, const SizeProvider& sizeProvider, typename │ │ │ │ │ +SizeProvider::SizePrefix prefix) │ │ │ │ │ +229 { │ │ │ │ │ +230 auto size = sizeProvider.size(prefix); │ │ │ │ │ +231 if (size != 0) │ │ │ │ │ +232 DUNE_THROW(RangeError, "Can't resize scalar vector entry v[" << prefix << │ │ │ │ │ +"] to size(" << prefix << ")=" << size); │ │ │ │ │ +233 } │ │ │ │ │ +234 │ │ │ │ │ +235 template, int> = 0> │ │ │ │ │ +237 void recursiveAssign(C& c, const T& t) │ │ │ │ │ +238 { │ │ │ │ │ +239 c = t; │ │ │ │ │ +240 } │ │ │ │ │ +241 │ │ │ │ │ +242 template, int> = 0> │ │ │ │ │ +244 void recursiveAssign(C& c, const T& t) │ │ │ │ │ +245 { │ │ │ │ │ +246 Dune::Hybrid::forEach(c, [&](auto&& ci) { │ │ │ │ │ +247 recursiveAssign(ci, t); │ │ │ │ │ +248 }); │ │ │ │ │ +249 } │ │ │ │ │ +250 │ │ │ │ │ +251public: │ │ │ │ │ +252 │ │ │ │ │ +253 using _V_e_c_t_o_r = V; │ │ │ │ │ +254 │ │ │ │ │ +255 ISTLVectorBackend(Vector& vector) : │ │ │ │ │ +256 vector_(&vector) │ │ │ │ │ +257 {} │ │ │ │ │ +258 │ │ │ │ │ +259 template │ │ │ │ │ +260 void resize(const SizeProvider& sizeProvider) │ │ │ │ │ +261 { │ │ │ │ │ +262 auto prefix = typename SizeProvider::SizePrefix(); │ │ │ │ │ +263 prefix.resize(0); │ │ │ │ │ +264 resize(*vector_, sizeProvider, prefix); │ │ │ │ │ +265 } │ │ │ │ │ +266 │ │ │ │ │ +267 template │ │ │ │ │ +268 decltype(auto) operator[](const MultiIndex& index) const │ │ │ │ │ +269 { │ │ │ │ │ +270 return _r_e_s_o_l_v_e_D_y_n_a_m_i_c_M_u_l_t_i_I_n_d_e_x(*vector_, index); │ │ │ │ │ +271 } │ │ │ │ │ +272 │ │ │ │ │ +273 template │ │ │ │ │ +274 decltype(auto) operator[](const MultiIndex& index) │ │ │ │ │ +275 { │ │ │ │ │ +276 return _r_e_s_o_l_v_e_D_y_n_a_m_i_c_M_u_l_t_i_I_n_d_e_x(*vector_, index); │ │ │ │ │ +277 } │ │ │ │ │ +278 │ │ │ │ │ +287 template │ │ │ │ │ +288 void operator= (const T& other) │ │ │ │ │ +289 { │ │ │ │ │ +290 recursiveAssign(vector(), other); │ │ │ │ │ +291 } │ │ │ │ │ +292 │ │ │ │ │ +293 template │ │ │ │ │ +294 void operator= (const ISTLVectorBackend& other) │ │ │ │ │ +295 { │ │ │ │ │ +296 vector() = other.vector(); │ │ │ │ │ +297 } │ │ │ │ │ +298 │ │ │ │ │ +299 const _V_e_c_t_o_r& vector() const │ │ │ │ │ +300 { │ │ │ │ │ +301 return *vector_; │ │ │ │ │ +302 } │ │ │ │ │ +303 │ │ │ │ │ +304 _V_e_c_t_o_r& vector() │ │ │ │ │ +305 { │ │ │ │ │ +306 return *vector_; │ │ │ │ │ +307 } │ │ │ │ │ +308 │ │ │ │ │ +309private: │ │ │ │ │ +310 │ │ │ │ │ +311 _V_e_c_t_o_r* vector_; │ │ │ │ │ +312}; │ │ │ │ │ +313 │ │ │ │ │ +314} // end namespace Impl │ │ │ │ │ +315 │ │ │ │ │ +316 │ │ │ │ │ +317 │ │ │ │ │ +349template │ │ │ │ │ +_3_5_0auto _i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d(Vector& v) │ │ │ │ │ +351{ │ │ │ │ │ +352 static_assert(hasUniqueFieldType(), "Vector type passed to │ │ │ │ │ +istlVectorBackend() does not have a unique field type."); │ │ │ │ │ +353 return Impl::ISTLVectorBackend(v); │ │ │ │ │ +354} │ │ │ │ │ +355 │ │ │ │ │ +356 │ │ │ │ │ +357 │ │ │ │ │ +387template │ │ │ │ │ +_3_8_8auto _i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d(const Vector& v) │ │ │ │ │ +389{ │ │ │ │ │ +390 static_assert(hasUniqueFieldType(), "Vector type passed to │ │ │ │ │ +istlVectorBackend() does not have a unique field type."); │ │ │ │ │ +391 return Impl::ISTLVectorBackend(v); │ │ │ │ │ +392} │ │ │ │ │ +393 │ │ │ │ │ +394 │ │ │ │ │ +395 │ │ │ │ │ +396} // namespace Functions │ │ │ │ │ +397} // namespace Dune │ │ │ │ │ +398 │ │ │ │ │ +399 │ │ │ │ │ +400#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_ISTLVECTORBACKEND_HH │ │ │ │ │ +_i_n_d_e_x_a_c_c_e_s_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d │ │ │ │ │ +auto istlVectorBackend(Vector &v) │ │ │ │ │ +Return a vector backend wrapping non-const ISTL like containers. │ │ │ │ │ +DDeeffiinniittiioonn istlvectorbackend.hh:350 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_r_e_s_o_l_v_e_D_y_n_a_m_i_c_M_u_l_t_i_I_n_d_e_x │ │ │ │ │ +constexpr decltype(auto) resolveDynamicMultiIndex(C &&c, const MultiIndex │ │ │ │ │ +&multiIndex, const IsFinal &isFinal) │ │ │ │ │ +Provide multi-index access by chaining operator[]. │ │ │ │ │ +DDeeffiinniittiioonn indexaccess.hh:377 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn differentiablefunction.hh:33 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s │ │ │ │ │ -DDeeffiinniittiioonn differentiablefunctionfromcallables.hh:27 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _F_ _>_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s │ │ │ │ │ -DifferentiableFunctionFromCallables(FF &&f) │ │ │ │ │ -Constructor copying the given function. │ │ │ │ │ -DDeeffiinniittiioonn differentiablefunctionfromcallables.hh:65 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _F_ _>_:_:_R_a_w_S_i_g_n_a_t_u_r_e │ │ │ │ │ -typename SignatureTraits< Signature >::RawSignature RawSignature │ │ │ │ │ -DDeeffiinniittiioonn differentiablefunctionfromcallables.hh:55 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _F_ _>_:_:_S_i_g_n_a_t_u_r_e │ │ │ │ │ -Range(Domain) Signature │ │ │ │ │ -Signature of function. │ │ │ │ │ -DDeeffiinniittiioonn differentiablefunctionfromcallables.hh:53 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _F_ _>_:_:_D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e │ │ │ │ │ -typename DerivativeTraits< RawSignature >::Range(Domain) DerivativeSignature │ │ │ │ │ -Signature of derivative. │ │ │ │ │ -DDeeffiinniittiioonn differentiablefunctionfromcallables.hh:58 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _F_,_ _D_F_,_ _D_e_r_i_v_a_t_i_v_e_s_._._._ _>_:_:_D_e_r_i_v_a_t_i_v_e_S_i_g_n_a_t_u_r_e │ │ │ │ │ -typename DerivativeTraits< RawSignature >::Range(Domain) DerivativeSignature │ │ │ │ │ -DDeeffiinniittiioonn differentiablefunctionfromcallables.hh:114 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _F_,_ _D_F_,_ _D_e_r_i_v_a_t_i_v_e_s_._._._ _>_:_:_S_i_g_n_a_t_u_r_e │ │ │ │ │ -Range(Domain) Signature │ │ │ │ │ -DDeeffiinniittiioonn differentiablefunctionfromcallables.hh:112 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _F_,_ _D_F_,_ _D_e_r_i_v_a_t_i_v_e_s_._._._ _>_:_:_R_a_w_S_i_g_n_a_t_u_r_e │ │ │ │ │ -typename SignatureTraits< Signature >::RawSignature RawSignature │ │ │ │ │ -DDeeffiinniittiioonn differentiablefunctionfromcallables.hh:113 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s_<_ _R_a_n_g_e_(_D_o_m_a_i_n_)_, │ │ │ │ │ -_D_e_r_i_v_a_t_i_v_e_T_r_a_i_t_s_,_ _F_,_ _D_F_,_ _D_e_r_i_v_a_t_i_v_e_s_._._._ _>_:_:_D_i_f_f_e_r_e_n_t_i_a_b_l_e_F_u_n_c_t_i_o_n_F_r_o_m_C_a_l_l_a_b_l_e_s │ │ │ │ │ -DifferentiableFunctionFromCallables(FF &&f, DFF &&df, DDFF &&... ddf) │ │ │ │ │ -Constructor copying the given functions. │ │ │ │ │ -DDeeffiinniittiioonn differentiablefunctionfromcallables.hh:125 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_r_a_i_t_s │ │ │ │ │ -Helper class to deduce the signature of a callable. │ │ │ │ │ -DDeeffiinniittiioonn signature.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_g_n_a_t_u_r_e_T_a_g │ │ │ │ │ -DDeeffiinniittiioonn signature.hh:106 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_i_e_l_d_T_y_p_e_s │ │ │ │ │ +constexpr auto fieldTypes() │ │ │ │ │ +Generate list of field types in container. │ │ │ │ │ +DDeeffiinniittiioonn istlvectorbackend.hh:67 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_h_a_s_U_n_i_q_u_e_F_i_e_l_d_T_y_p_e │ │ │ │ │ +constexpr bool hasUniqueFieldType() │ │ │ │ │ +Check if container has a unique field type. │ │ │ │ │ +DDeeffiinniittiioonn istlvectorbackend.hh:78 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_V_e_c_t_o_r │ │ │ │ │ +std::vector< Child > Vector │ │ │ │ │ +Descriptor for vectors with all children of the same type and dynamic size. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:124 │ │ │ │ │ +_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00095.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: bsplinebasis.hh File Reference │ │ │ │ +dune-functions: defaultlocalview.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,81 +71,42 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Typedefs | │ │ │ │ -Functions
│ │ │ │ -
bsplinebasis.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
defaultlocalview.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 <dune/functions/functionspacebases/leafprebasismixin.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::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::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 >
using Dune::Functions::BSplineBasis = DefaultGlobalBasis< BSplinePreBasis< GV > >
 A global B-spline basis.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

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

Detailed Description

│ │ │ │ -

The B-spline global function space basis.

│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,65 +1,29 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -bsplinebasis.hh File Reference │ │ │ │ │ -The B-spline global function space basis. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +defaultlocalview.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_o_v_e_r_f_l_o_w_a_r_r_a_y_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_m_u_l_t_i_i_n_d_e_x_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_B_a_s_i_s_<_ _G_V_,_ _R_ _> │ │ │ │ │ -  LocalBasis class in the sense of dune-localfunctions, presenting the │ │ │ │ │ - restriction of a B-spline patch to a knot span. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_C_o_e_f_f_i_c_i_e_n_t_s_<_ _d_i_m_ _> │ │ │ │ │ -  Attaches a shape function to an entity. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_I_n_t_e_r_p_o_l_a_t_i_o_n_<_ _d_i_m_,_ _L_B_ _> │ │ │ │ │ -  Local interpolation in the sense of dune-localfunctions, for the B- │ │ │ │ │ - spline basis on tensor-product grids. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_<_ _G_V_,_ _R_ _> │ │ │ │ │ -  LocalFiniteElement in the sense of dune-localfunctions, for the B- │ │ │ │ │ - spline basis on tensor-product grids. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_<_ _G_V_ _> │ │ │ │ │ -  Pre-basis for B-spline basis. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_N_o_d_e_<_ _G_V_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_<_ _G_B_ _> │ │ │ │ │ +  The restriction of a finite element basis to a single element. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y │ │ │ │ │ -  │ │ │ │ │ -TTyyppeeddeeffss │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s< _B_S_p_l_i_n_e_P_r_e_B_a_s_i_s< GV │ │ │ │ │ - > > │ │ │ │ │ -  A global B-spline basis. │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_b_S_p_l_i_n_e (const std::vector< double > │ │ │ │ │ - &knotVector, unsigned int order, bool makeOpen=true) │ │ │ │ │ -  Create a pre-basis factory that can create a B-spline pre-basis. │ │ │ │ │ -  │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -The B-spline global function space basis. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00095_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: bsplinebasis.hh Source File │ │ │ │ +dune-functions: defaultlocalview.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,1284 +74,212 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
bsplinebasis.hh
│ │ │ │ +
defaultlocalview.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BSPLINEBASIS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BSPLINEBASIS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALVIEW_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALVIEW_HH
│ │ │ │
9
│ │ │ │ -
14#include <array>
│ │ │ │ -
15#include <numeric>
│ │ │ │ -
16
│ │ │ │ -
18#include <dune/common/dynmatrix.hh>
│ │ │ │ -
19
│ │ │ │ -
20#include <dune/localfunctions/common/localbasis.hh>
│ │ │ │ -
21#include <dune/common/diagonalmatrix.hh>
│ │ │ │ -
22#include <dune/localfunctions/common/localkey.hh>
│ │ │ │ -
23#include <dune/localfunctions/common/localfiniteelementtraits.hh>
│ │ │ │ -
24#include <dune/geometry/type.hh>
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +
10
│ │ │ │ +
11#include <tuple>
│ │ │ │ +
12#include <optional>
│ │ │ │ +
13
│ │ │ │ +
14#include <dune/common/concept.hh>
│ │ │ │ +
15#include <dune/common/hybridutilities.hh>
│ │ │ │ +
16#include <dune/common/reservedvector.hh>
│ │ │ │ +
17
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
21
│ │ │ │ +
22
│ │ │ │ +
23
│ │ │ │ +
24namespace Dune {
│ │ │ │ +
25namespace Functions {
│ │ │ │ +
26
│ │ │ │ +
27
│ │ │ │
28
│ │ │ │ -
29namespace Dune
│ │ │ │ -
30{
│ │ │ │ -
31namespace Functions {
│ │ │ │ -
32
│ │ │ │ -
33// A maze of dependencies between the different parts of this. We need a few forward declarations
│ │ │ │ -
34template<typename GV, typename R>
│ │ │ │ - │ │ │ │ -
36
│ │ │ │ -
37template<typename GV>
│ │ │ │ -
38class BSplinePreBasis;
│ │ │ │ -
39
│ │ │ │ +
30template<class GB>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
32{
│ │ │ │ +
33public:
│ │ │ │ +
34
│ │ │ │ +
36 using GlobalBasis = GB;
│ │ │ │ +
37
│ │ │ │ +
39 using GridView = typename GlobalBasis::GridView;
│ │ │ │
40
│ │ │ │ -
49template<class GV, class R>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
51{
│ │ │ │ -
52 friend class BSplineLocalFiniteElement<GV,R>;
│ │ │ │ +
42 using Element = typename GridView::template Codim<0>::Entity;
│ │ │ │ +
43
│ │ │ │ +
45 using size_type = std::size_t;
│ │ │ │ +
46
│ │ │ │ +
48 using Tree = typename GlobalBasis::PreBasis::Node;
│ │ │ │ +
49
│ │ │ │ +
50protected:
│ │ │ │ +
51
│ │ │ │ +
52 using PreBasis = typename GlobalBasis::PreBasis;
│ │ │ │
53
│ │ │ │ -
54 typedef typename GV::ctype D;
│ │ │ │ -
55 enum {dim = GV::dimension};
│ │ │ │ -
56public:
│ │ │ │ -
57
│ │ │ │ -
59 typedef LocalBasisTraits<D,dim,FieldVector<D,dim>,R,1,FieldVector<R,1>,
│ │ │ │ -
60 FieldMatrix<R,1,dim> > Traits;
│ │ │ │ +
54 // Type used to store the multi indices of the basis vectors.
│ │ │ │ +
55 // In contrast to MultiIndex this always has dynamic size.
│ │ │ │ +
56 // It's guaranteed, that you can always cast it to MultiIndex
│ │ │ │ + │ │ │ │ +
58 std::conditional_t<(PreBasis::minMultiIndexSize == PreBasis::maxMultiIndexSize),
│ │ │ │ + │ │ │ │ +
60 Dune::ReservedVector<size_type, PreBasis::multiIndexBufferSize>>;
│ │ │ │
61
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
68 : preBasis_(preBasis),
│ │ │ │ -
69 lFE_(lFE)
│ │ │ │ -
70 {}
│ │ │ │ +
62public:
│ │ │ │ +
63
│ │ │ │ +
65 using MultiIndex =
│ │ │ │ +
66 std::conditional_t<(PreBasis::minMultiIndexSize == PreBasis::maxMultiIndexSize),
│ │ │ │ + │ │ │ │ +
68 Dune::ReservedVector<size_type, PreBasis::multiIndexBufferSize>>;
│ │ │ │ +
69
│ │ │ │ +
70
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
74 tree_(globalBasis_->preBasis().makeNode())
│ │ │ │ +
75 {
│ │ │ │ +
76 static_assert(models<Concept::BasisTree<GridView>, Tree>(), "Tree type passed to DefaultLocalView does not model the BasisNode concept.");
│ │ │ │ + │ │ │ │ +
78 }
│ │ │ │ +
│ │ │ │ +
79
│ │ │ │ +
│ │ │ │ +
85 void bind(const Element& e)
│ │ │ │ +
86 {
│ │ │ │ +
87 element_ = e;
│ │ │ │ + │ │ │ │ +
89 indices_.resize(size());
│ │ │ │ +
90 globalBasis_->preBasis().indices(tree_, indices_.begin());
│ │ │ │ +
91 }
│ │ │ │
│ │ │ │ -
71
│ │ │ │ -
│ │ │ │ -
75 void evaluateFunction (const FieldVector<D,dim>& in,
│ │ │ │ -
76 std::vector<FieldVector<R,1> >& out) const
│ │ │ │ -
77 {
│ │ │ │ -
78 FieldVector<D,dim> globalIn = offset_;
│ │ │ │ -
79 scaling_.umv(in,globalIn);
│ │ │ │ -
80
│ │ │ │ -
81 preBasis_.evaluateFunction(globalIn, out, lFE_.currentKnotSpan_);
│ │ │ │ -
82 }
│ │ │ │ -
│ │ │ │ -
83
│ │ │ │ -
│ │ │ │ -
87 void evaluateJacobian (const FieldVector<D,dim>& in,
│ │ │ │ -
88 std::vector<FieldMatrix<D,1,dim> >& out) const
│ │ │ │ -
89 {
│ │ │ │ -
90 FieldVector<D,dim> globalIn = offset_;
│ │ │ │ -
91 scaling_.umv(in,globalIn);
│ │ │ │
92
│ │ │ │ -
93 preBasis_.evaluateJacobian(globalIn, out, lFE_.currentKnotSpan_);
│ │ │ │ -
94
│ │ │ │ -
95 for (size_t i=0; i<out.size(); i++)
│ │ │ │ -
96 for (int j=0; j<dim; j++)
│ │ │ │ -
97 out[i][0][j] *= scaling_[j][j];
│ │ │ │ +
│ │ │ │ +
95 bool bound() const
│ │ │ │ +
96 {
│ │ │ │ +
97 return static_cast<bool>(element_);
│ │ │ │
98 }
│ │ │ │
│ │ │ │
99
│ │ │ │ -
101 template<size_t k>
│ │ │ │ -
│ │ │ │ -
102 inline void evaluate (const typename std::array<int,k>& directions,
│ │ │ │ -
103 const typename Traits::DomainType& in,
│ │ │ │ -
104 std::vector<typename Traits::RangeType>& out) const
│ │ │ │ +
│ │ │ │ +
104 const Element& element() const
│ │ │ │
105 {
│ │ │ │ -
106 switch(k)
│ │ │ │ -
107 {
│ │ │ │ -
108 case 0:
│ │ │ │ -
109 evaluateFunction(in, out);
│ │ │ │ -
110 break;
│ │ │ │ -
111 case 1:
│ │ │ │ -
112 {
│ │ │ │ -
113 FieldVector<D,dim> globalIn = offset_;
│ │ │ │ -
114 scaling_.umv(in,globalIn);
│ │ │ │ -
115
│ │ │ │ -
116 preBasis_.evaluate(directions, globalIn, out, lFE_.currentKnotSpan_);
│ │ │ │ -
117
│ │ │ │ -
118 for (size_t i=0; i<out.size(); i++)
│ │ │ │ -
119 out[i][0] *= scaling_[directions[0]][directions[0]];
│ │ │ │ -
120 break;
│ │ │ │ -
121 }
│ │ │ │ -
122 case 2:
│ │ │ │ -
123 {
│ │ │ │ -
124 FieldVector<D,dim> globalIn = offset_;
│ │ │ │ -
125 scaling_.umv(in,globalIn);
│ │ │ │ -
126
│ │ │ │ -
127 preBasis_.evaluate(directions, globalIn, out, lFE_.currentKnotSpan_);
│ │ │ │ -
128
│ │ │ │ -
129 for (size_t i=0; i<out.size(); i++)
│ │ │ │ -
130 out[i][0] *= scaling_[directions[0]][directions[0]]*scaling_[directions[1]][directions[1]];
│ │ │ │ -
131 break;
│ │ │ │ -
132 }
│ │ │ │ -
133 default:
│ │ │ │ -
134 DUNE_THROW(NotImplemented, "B-Spline derivatives of order " << k << " not implemented yet!");
│ │ │ │ -
135 }
│ │ │ │ -
136 }
│ │ │ │ -
│ │ │ │ -
137
│ │ │ │ -
│ │ │ │ -
145 unsigned int order () const
│ │ │ │ -
146 {
│ │ │ │ -
147 return *std::max_element(preBasis_.order_.begin(), preBasis_.order_.end());
│ │ │ │ -
148 }
│ │ │ │ -
│ │ │ │ -
149
│ │ │ │ -
│ │ │ │ -
152 std::size_t size() const
│ │ │ │ -
153 {
│ │ │ │ -
154 return lFE_.size();
│ │ │ │ -
155 }
│ │ │ │ -
│ │ │ │ -
156
│ │ │ │ -
157private:
│ │ │ │ -
158 const BSplinePreBasis<GV>& preBasis_;
│ │ │ │ -
159
│ │ │ │ - │ │ │ │ -
161
│ │ │ │ -
162 // Coordinates in a single knot span differ from coordinates on the B-spline patch
│ │ │ │ -
163 // by an affine transformation. This transformation is stored in offset_ and scaling_.
│ │ │ │ -
164 FieldVector<D,dim> offset_;
│ │ │ │ -
165 DiagonalMatrix<D,dim> scaling_;
│ │ │ │ -
166};
│ │ │ │ -
│ │ │ │ -
167
│ │ │ │ -
181template<int dim>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
183{
│ │ │ │ -
184 // Return i as a d-digit number in the (k+1)-nary system
│ │ │ │ -
185 std::array<unsigned int,dim> multiindex (unsigned int i) const
│ │ │ │ -
186 {
│ │ │ │ -
187 std::array<unsigned int,dim> alpha;
│ │ │ │ -
188 for (int j=0; j<dim; j++)
│ │ │ │ -
189 {
│ │ │ │ -
190 alpha[j] = i % sizes_[j];
│ │ │ │ -
191 i = i/sizes_[j];
│ │ │ │ -
192 }
│ │ │ │ -
193 return alpha;
│ │ │ │ -
194 }
│ │ │ │ -
195
│ │ │ │ -
197 void setup1d(std::vector<unsigned int>& subEntity)
│ │ │ │ -
198 {
│ │ │ │ -
199 if (sizes_[0]==1)
│ │ │ │ -
200 {
│ │ │ │ -
201 subEntity[0] = 0;
│ │ │ │ -
202 return;
│ │ │ │ -
203 }
│ │ │ │ -
204
│ │ │ │ -
205 /* edge and vertex numbering
│ │ │ │ -
206 0----0----1
│ │ │ │ -
207 */
│ │ │ │ -
208 unsigned lastIndex=0;
│ │ │ │ -
209 subEntity[lastIndex++] = 0; // corner 0
│ │ │ │ -
210 for (unsigned i = 0; i < sizes_[0] - 2; ++i)
│ │ │ │ -
211 subEntity[lastIndex++] = 0; // inner dofs of element (0)
│ │ │ │ -
212
│ │ │ │ -
213 subEntity[lastIndex++] = 1; // corner 1
│ │ │ │ -
214
│ │ │ │ -
215 assert(size()==lastIndex);
│ │ │ │ -
216 }
│ │ │ │ -
217
│ │ │ │ -
218 void setup2d(std::vector<unsigned int>& subEntity)
│ │ │ │ -
219 {
│ │ │ │ -
220 unsigned lastIndex=0;
│ │ │ │ -
221
│ │ │ │ -
222 // LocalKey: entity number , entity codim, dof indices within each entity
│ │ │ │ -
223 /* edge and vertex numbering
│ │ │ │ -
224 2----3----3
│ │ │ │ -
225 | |
│ │ │ │ -
226 | |
│ │ │ │ -
227 0 1
│ │ │ │ -
228 | |
│ │ │ │ -
229 | |
│ │ │ │ -
230 0----2----1
│ │ │ │ -
231 */
│ │ │ │ -
232
│ │ │ │ -
233 // lower edge (2)
│ │ │ │ -
234 subEntity[lastIndex++] = 0; // corner 0
│ │ │ │ -
235 for (unsigned i = 0; i < sizes_[0]-2; ++i)
│ │ │ │ -
236 subEntity[lastIndex++] = 2; // inner dofs of lower edge (2)
│ │ │ │ -
237
│ │ │ │ -
238 subEntity[lastIndex++] = 1; // corner 1
│ │ │ │ -
239
│ │ │ │ -
240 // iterate from bottom to top over inner edge dofs
│ │ │ │ -
241 for (unsigned e = 0; e < sizes_[1]-2; ++e)
│ │ │ │ -
242 {
│ │ │ │ -
243 subEntity[lastIndex++] = 0; // left edge (0)
│ │ │ │ -
244 for (unsigned i = 0; i < sizes_[0]-2; ++i)
│ │ │ │ -
245 subEntity[lastIndex++] = 0; // face dofs
│ │ │ │ -
246 subEntity[lastIndex++] = 1; // right edge (1)
│ │ │ │ -
247 }
│ │ │ │ -
248
│ │ │ │ -
249 // upper edge (3)
│ │ │ │ -
250 subEntity[lastIndex++] = 2; // corner 2
│ │ │ │ -
251 for (unsigned i = 0; i < sizes_[0]-2; ++i)
│ │ │ │ -
252 subEntity[lastIndex++] = 3; // inner dofs of upper edge (3)
│ │ │ │ -
253
│ │ │ │ -
254 subEntity[lastIndex++] = 3; // corner 3
│ │ │ │ -
255
│ │ │ │ -
256 assert(size()==lastIndex);
│ │ │ │ -
257 }
│ │ │ │ -
258
│ │ │ │ -
259
│ │ │ │ -
260public:
│ │ │ │ -
│ │ │ │ -
261 void init(const std::array<unsigned,dim>& sizes)
│ │ │ │ -
262 {
│ │ │ │ -
263 sizes_ = sizes;
│ │ │ │ -
264
│ │ │ │ -
265 li_.resize(size());
│ │ │ │ -
266
│ │ │ │ -
267 // Set up array of codimension-per-dof-number
│ │ │ │ -
268 std::vector<unsigned int> codim(li_.size());
│ │ │ │ -
269
│ │ │ │ -
270 for (std::size_t i=0; i<codim.size(); i++)
│ │ │ │ -
271 {
│ │ │ │ -
272 codim[i] = 0;
│ │ │ │ -
273 // Codimension gets increased by 1 for each coordinate direction
│ │ │ │ -
274 // where dof is on boundary
│ │ │ │ -
275 std::array<unsigned int,dim> mIdx = multiindex(i);
│ │ │ │ -
276 for (int j=0; j<dim; j++)
│ │ │ │ -
277 if (mIdx[j]==0 or mIdx[j]==sizes[j]-1)
│ │ │ │ -
278 codim[i]++;
│ │ │ │ -
279 }
│ │ │ │ -
280
│ │ │ │ -
281 // Set up index vector (the index of the dof in the set of dofs of a given subentity)
│ │ │ │ -
282 // Algorithm: the 'index' has the same ordering as the dof number 'i'.
│ │ │ │ -
283 // To make it consecutive we interpret 'i' in the (k+1)-adic system, omit all digits
│ │ │ │ -
284 // that correspond to axes where the dof is on the element boundary, and transform the
│ │ │ │ -
285 // rest to the (k-1)-adic system.
│ │ │ │ -
286 std::vector<unsigned int> index(size());
│ │ │ │ -
287
│ │ │ │ -
288 for (std::size_t i=0; i<index.size(); i++)
│ │ │ │ -
289 {
│ │ │ │ -
290 index[i] = 0;
│ │ │ │ -
291
│ │ │ │ -
292 std::array<unsigned int,dim> mIdx = multiindex(i);
│ │ │ │ -
293
│ │ │ │ -
294 for (int j=dim-1; j>=0; j--)
│ │ │ │ -
295 if (mIdx[j]>0 and mIdx[j]<sizes[j]-1)
│ │ │ │ -
296 index[i] = (sizes[j]-1)*index[i] + (mIdx[j]-1);
│ │ │ │ -
297 }
│ │ │ │ -
298
│ │ │ │ -
299 // Set up entity and dof numbers for each (supported) dimension separately
│ │ │ │ -
300 std::vector<unsigned int> subEntity(li_.size());
│ │ │ │ -
301
│ │ │ │ -
302 if (subEntity.size() > 0)
│ │ │ │ -
303 {
│ │ │ │ -
304 if (dim==1) {
│ │ │ │ -
305
│ │ │ │ -
306 setup1d(subEntity);
│ │ │ │ -
307
│ │ │ │ -
308 } else if (dim==2 and sizes_[0]>1 and sizes_[1]>1) {
│ │ │ │ -
309
│ │ │ │ -
310 setup2d(subEntity);
│ │ │ │ -
311
│ │ │ │ -
312 }
│ │ │ │ -
313 }
│ │ │ │ -
314
│ │ │ │ -
315 for (size_t i=0; i<li_.size(); i++)
│ │ │ │ -
316 li_[i] = LocalKey(subEntity[i], codim[i], index[i]);
│ │ │ │ -
317 }
│ │ │ │ -
│ │ │ │ -
318
│ │ │ │ -
│ │ │ │ -
320 std::size_t size () const
│ │ │ │ -
321 {
│ │ │ │ -
322 return std::accumulate(sizes_.begin(), sizes_.end(), 1, std::multiplies<unsigned int>());
│ │ │ │ -
323 }
│ │ │ │ -
│ │ │ │ -
324
│ │ │ │ -
│ │ │ │ -
326 const LocalKey& localKey (std::size_t i) const
│ │ │ │ -
327 {
│ │ │ │ -
328 return li_[i];
│ │ │ │ -
329 }
│ │ │ │ -
│ │ │ │ -
330
│ │ │ │ -
331private:
│ │ │ │ -
332
│ │ │ │ -
333 // Number of shape functions on this element per coordinate direction
│ │ │ │ -
334 std::array<unsigned, dim> sizes_;
│ │ │ │ -
335
│ │ │ │ -
336 std::vector<LocalKey> li_;
│ │ │ │ -
337};
│ │ │ │ -
│ │ │ │ -
338
│ │ │ │ -
343template<int dim, class LB>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
345{
│ │ │ │ -
346public:
│ │ │ │ -
348 template<typename F, typename C>
│ │ │ │ -
│ │ │ │ -
349 void interpolate (const F& f, std::vector<C>& out) const
│ │ │ │ -
350 {
│ │ │ │ -
351 DUNE_THROW(NotImplemented, "BSplineLocalInterpolation::interpolate");
│ │ │ │ -
352 }
│ │ │ │ -
│ │ │ │ -
353
│ │ │ │ -
354};
│ │ │ │ -
│ │ │ │ -
355
│ │ │ │ -
365template<class GV, class R>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
367{
│ │ │ │ -
368 typedef typename GV::ctype D;
│ │ │ │ -
369 enum {dim = GV::dimension};
│ │ │ │ -
370 friend class BSplineLocalBasis<GV,R>;
│ │ │ │ -
371public:
│ │ │ │ -
372
│ │ │ │ -
375 typedef LocalFiniteElementTraits<BSplineLocalBasis<GV,R>,
│ │ │ │ - │ │ │ │ - │ │ │ │ -
378
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
382 : preBasis_(preBasis),
│ │ │ │ -
383 localBasis_(preBasis,*this)
│ │ │ │ -
384 {}
│ │ │ │ -
│ │ │ │ -
385
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
389 : preBasis_(other.preBasis_),
│ │ │ │ - │ │ │ │ -
391 {}
│ │ │ │ -
│ │ │ │ -
392
│ │ │ │ -
│ │ │ │ -
399 void bind(const std::array<unsigned,dim>& elementIdx)
│ │ │ │ -
400 {
│ │ │ │ -
401 /* \todo In the long run we need to precompute a table for this */
│ │ │ │ -
402 for (size_t i=0; i<elementIdx.size(); i++)
│ │ │ │ -
403 {
│ │ │ │ -
404 currentKnotSpan_[i] = 0;
│ │ │ │ -
405
│ │ │ │ -
406 // Skip over degenerate knot spans
│ │ │ │ -
407 while (preBasis_.knotVectors_[i][currentKnotSpan_[i]+1] < preBasis_.knotVectors_[i][currentKnotSpan_[i]]+1e-8)
│ │ │ │ -
408 currentKnotSpan_[i]++;
│ │ │ │ -
409
│ │ │ │ -
410 for (size_t j=0; j<elementIdx[i]; j++)
│ │ │ │ -
411 {
│ │ │ │ -
412 currentKnotSpan_[i]++;
│ │ │ │ -
413
│ │ │ │ -
414 // Skip over degenerate knot spans
│ │ │ │ -
415 while (preBasis_.knotVectors_[i][currentKnotSpan_[i]+1] < preBasis_.knotVectors_[i][currentKnotSpan_[i]]+1e-8)
│ │ │ │ -
416 currentKnotSpan_[i]++;
│ │ │ │ -
417 }
│ │ │ │ -
418
│ │ │ │ -
419 // Compute the geometric transformation from knotspan-local to global coordinates
│ │ │ │ -
420 localBasis_.offset_[i] = preBasis_.knotVectors_[i][currentKnotSpan_[i]];
│ │ │ │ -
421 localBasis_.scaling_[i][i] = preBasis_.knotVectors_[i][currentKnotSpan_[i]+1] - preBasis_.knotVectors_[i][currentKnotSpan_[i]];
│ │ │ │ -
422 }
│ │ │ │ -
423
│ │ │ │ -
424 // Set up the LocalCoefficients object
│ │ │ │ -
425 std::array<unsigned int, dim> sizes;
│ │ │ │ -
426 for (size_t i=0; i<dim; i++)
│ │ │ │ -
427 sizes[i] = size(i);
│ │ │ │ -
428 localCoefficients_.init(sizes);
│ │ │ │ -
429 }
│ │ │ │ -
│ │ │ │ -
430
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
433 {
│ │ │ │ -
434 return localBasis_;
│ │ │ │ -
435 }
│ │ │ │ -
│ │ │ │ -
436
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
439 {
│ │ │ │ -
440 return localCoefficients_;
│ │ │ │ -
441 }
│ │ │ │ -
│ │ │ │ -
442
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
445 {
│ │ │ │ -
446 return localInterpolation_;
│ │ │ │ -
447 }
│ │ │ │ -
│ │ │ │ -
448
│ │ │ │ -
│ │ │ │ -
450 unsigned size () const
│ │ │ │ -
451 {
│ │ │ │ -
452 std::size_t r = 1;
│ │ │ │ -
453 for (int i=0; i<dim; i++)
│ │ │ │ -
454 r *= size(i);
│ │ │ │ -
455 return r;
│ │ │ │ -
456 }
│ │ │ │ -
│ │ │ │ -
457
│ │ │ │ -
│ │ │ │ -
460 GeometryType type () const
│ │ │ │ -
461 {
│ │ │ │ -
462 return GeometryTypes::cube(dim);
│ │ │ │ -
463 }
│ │ │ │ -
│ │ │ │ -
464
│ │ │ │ -
465//private:
│ │ │ │ -
466
│ │ │ │ -
│ │ │ │ -
468 unsigned int size(int i) const
│ │ │ │ -
469 {
│ │ │ │ -
470 const auto& order = preBasis_.order_;
│ │ │ │ -
471 unsigned int r = order[i]+1; // The 'normal' value
│ │ │ │ -
472 if (currentKnotSpan_[i]<order[i]) // Less near the left end of the knot vector
│ │ │ │ -
473 r -= (order[i] - currentKnotSpan_[i]);
│ │ │ │ -
474 if ( order[i] > (preBasis_.knotVectors_[i].size() - currentKnotSpan_[i] - 2) )
│ │ │ │ -
475 r -= order[i] - (preBasis_.knotVectors_[i].size() - currentKnotSpan_[i] - 2);
│ │ │ │ -
476 return r;
│ │ │ │ -
477 }
│ │ │ │ -
│ │ │ │ -
478
│ │ │ │ - │ │ │ │ -
480
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
484
│ │ │ │ -
485 // The knot span we are bound to
│ │ │ │ -
486 std::array<unsigned,dim> currentKnotSpan_;
│ │ │ │ -
487};
│ │ │ │ -
│ │ │ │ -
488
│ │ │ │ -
489
│ │ │ │ -
490template<typename GV>
│ │ │ │ -
491class BSplineNode;
│ │ │ │ -
492
│ │ │ │ -
502template<typename GV>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
504 public LeafPreBasisMixin< BSplinePreBasis<GV> >
│ │ │ │ -
505{
│ │ │ │ - │ │ │ │ -
507
│ │ │ │ -
508 static const int dim = GV::dimension;
│ │ │ │ -
509
│ │ │ │ -
511 class MultiDigitCounter
│ │ │ │ -
512 {
│ │ │ │ -
513 public:
│ │ │ │ -
514
│ │ │ │ -
518 MultiDigitCounter(const std::array<unsigned int,dim>& limits)
│ │ │ │ -
519 : limits_(limits)
│ │ │ │ -
520 {
│ │ │ │ -
521 std::fill(counter_.begin(), counter_.end(), 0);
│ │ │ │ -
522 }
│ │ │ │ -
523
│ │ │ │ -
525 MultiDigitCounter& operator++()
│ │ │ │ -
526 {
│ │ │ │ -
527 for (int i=0; i<dim; i++)
│ │ │ │ -
528 {
│ │ │ │ -
529 ++counter_[i];
│ │ │ │ -
530
│ │ │ │ -
531 // no overflow?
│ │ │ │ -
532 if (counter_[i] < limits_[i])
│ │ │ │ -
533 break;
│ │ │ │ -
534
│ │ │ │ -
535 counter_[i] = 0;
│ │ │ │ -
536 }
│ │ │ │ -
537 return *this;
│ │ │ │ -
538 }
│ │ │ │ -
539
│ │ │ │ -
541 const unsigned int& operator[](int i) const
│ │ │ │ -
542 {
│ │ │ │ -
543 return counter_[i];
│ │ │ │ -
544 }
│ │ │ │ -
545
│ │ │ │ -
547 unsigned int cycle() const
│ │ │ │ -
548 {
│ │ │ │ -
549 unsigned int r = 1;
│ │ │ │ -
550 for (int i=0; i<dim; i++)
│ │ │ │ -
551 r *= limits_[i];
│ │ │ │ -
552 return r;
│ │ │ │ -
553 }
│ │ │ │ -
554
│ │ │ │ -
555 private:
│ │ │ │ -
556
│ │ │ │ -
558 const std::array<unsigned int,dim> limits_;
│ │ │ │ -
559
│ │ │ │ -
561 std::array<unsigned int,dim> counter_;
│ │ │ │ -
562
│ │ │ │ -
563 };
│ │ │ │ -
564
│ │ │ │ -
565public:
│ │ │ │ -
566
│ │ │ │ -
568 using GridView = GV;
│ │ │ │ -
569 using size_type = std::size_t;
│ │ │ │ -
570
│ │ │ │ - │ │ │ │ -
572
│ │ │ │ -
573 // Type used for function values
│ │ │ │ -
574 using R = double;
│ │ │ │ -
575
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
595 const std::vector<double>& knotVector,
│ │ │ │ -
596 unsigned int order,
│ │ │ │ -
597 bool makeOpen = true)
│ │ │ │ - │ │ │ │ -
599 {
│ │ │ │ -
600 // \todo Detection of duplicate knots
│ │ │ │ -
601 std::fill(elements_.begin(), elements_.end(), knotVector.size()-1);
│ │ │ │ -
602
│ │ │ │ -
603 // Mediocre sanity check: we don't know the number of grid elements in each direction.
│ │ │ │ -
604 // but at least we know the total number of elements.
│ │ │ │ -
605 assert( std::accumulate(elements_.begin(), elements_.end(), 1, std::multiplies<unsigned>()) == gridView_.size(0) );
│ │ │ │ -
606
│ │ │ │ -
607 for (int i=0; i<dim; i++)
│ │ │ │ -
608 {
│ │ │ │ -
609 // Prepend the correct number of additional knots to open the knot vector
│ │ │ │ -
611 if (makeOpen)
│ │ │ │ -
612 for (unsigned int j=0; j<order; j++)
│ │ │ │ -
613 knotVectors_[i].push_back(knotVector[0]);
│ │ │ │ -
614
│ │ │ │ -
615 knotVectors_[i].insert(knotVectors_[i].end(), knotVector.begin(), knotVector.end());
│ │ │ │ -
616
│ │ │ │ -
617 if (makeOpen)
│ │ │ │ -
618 for (unsigned int j=0; j<order; j++)
│ │ │ │ -
619 knotVectors_[i].push_back(knotVector.back());
│ │ │ │ -
620 }
│ │ │ │ -
621
│ │ │ │ -
622 std::fill(order_.begin(), order_.end(), order);
│ │ │ │ -
623 }
│ │ │ │ +
106 return *element_;
│ │ │ │ +
107 }
│ │ │ │
│ │ │ │ -
624
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
647 const FieldVector<double,dim>& lowerLeft,
│ │ │ │ -
648 const FieldVector<double,dim>& upperRight,
│ │ │ │ -
649 const std::array<unsigned int,dim>& elements,
│ │ │ │ -
650 unsigned int order,
│ │ │ │ -
651 bool makeOpen = true)
│ │ │ │ -
652 : elements_(elements),
│ │ │ │ - │ │ │ │ -
654 {
│ │ │ │ -
655 // Mediocre sanity check: we don't know the number of grid elements in each direction.
│ │ │ │ -
656 // but at least we know the total number of elements.
│ │ │ │ -
657 assert( std::accumulate(elements_.begin(), elements_.end(), 1, std::multiplies<unsigned>()) == gridView_.size(0) );
│ │ │ │ -
658
│ │ │ │ -
659 for (int i=0; i<dim; i++)
│ │ │ │ -
660 {
│ │ │ │ -
661 // Prepend the correct number of additional knots to open the knot vector
│ │ │ │ -
663 if (makeOpen)
│ │ │ │ -
664 for (unsigned int j=0; j<order; j++)
│ │ │ │ -
665 knotVectors_[i].push_back(lowerLeft[i]);
│ │ │ │ -
666
│ │ │ │ -
667 // Construct the actual knot vector
│ │ │ │ -
668 for (size_t j=0; j<elements[i]+1; j++)
│ │ │ │ -
669 knotVectors_[i].push_back(lowerLeft[i] + j*(upperRight[i]-lowerLeft[i]) / elements[i]);
│ │ │ │ -
670
│ │ │ │ -
671 if (makeOpen)
│ │ │ │ -
672 for (unsigned int j=0; j<order; j++)
│ │ │ │ -
673 knotVectors_[i].push_back(upperRight[i]);
│ │ │ │ -
674 }
│ │ │ │ -
675
│ │ │ │ -
676 std::fill(order_.begin(), order_.end(), order);
│ │ │ │ -
677 }
│ │ │ │ +
108
│ │ │ │ +
│ │ │ │ +
113 void unbind()
│ │ │ │ +
114 {
│ │ │ │ +
115 element_.reset();
│ │ │ │ +
116 }
│ │ │ │
│ │ │ │ -
678
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
681 {}
│ │ │ │ -
│ │ │ │ -
682
│ │ │ │ -
│ │ │ │ -
684 const GridView& gridView() const
│ │ │ │ -
685 {
│ │ │ │ -
686 return gridView_;
│ │ │ │ -
687 }
│ │ │ │ -
│ │ │ │ -
688
│ │ │ │ -
│ │ │ │ -
690 void update(const GridView& gv)
│ │ │ │ -
691 {
│ │ │ │ -
692 gridView_ = gv;
│ │ │ │ -
693 }
│ │ │ │ -
│ │ │ │ -
694
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
699 {
│ │ │ │ -
700 return Node{this};
│ │ │ │ -
701 }
│ │ │ │ -
│ │ │ │ -
702
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
705 {
│ │ │ │ -
706 size_type result = 1;
│ │ │ │ -
707 for (int i=0; i<dim; i++)
│ │ │ │ -
708 result *= order_[i]+1;
│ │ │ │ -
709 return result;
│ │ │ │ -
710 }
│ │ │ │ -
│ │ │ │ -
711
│ │ │ │ -
713 template<typename It>
│ │ │ │ -
│ │ │ │ -
714 It indices(const Node& node, It it) const
│ │ │ │ -
715 {
│ │ │ │ -
716 // Local degrees of freedom are arranged in a lattice.
│ │ │ │ -
717 // We need the lattice dimensions to be able to compute lattice coordinates from a local index
│ │ │ │ -
718 std::array<unsigned int, dim> localSizes;
│ │ │ │ -
719 for (int i=0; i<dim; i++)
│ │ │ │ -
720 localSizes[i] = node.finiteElement().size(i);
│ │ │ │ -
721 for (size_type i = 0, end = node.size() ; i < end ; ++i, ++it)
│ │ │ │ -
722 {
│ │ │ │ -
723 std::array<unsigned int,dim> localIJK = getIJK(i, localSizes);
│ │ │ │ -
724
│ │ │ │ -
725 const auto currentKnotSpan = node.finiteElement().currentKnotSpan_;
│ │ │ │ -
726 const auto order = order_;
│ │ │ │ -
727
│ │ │ │ -
728 std::array<unsigned int,dim> globalIJK;
│ │ │ │ -
729 for (int i=0; i<dim; i++)
│ │ │ │ -
730 globalIJK[i] = std::max((int)currentKnotSpan[i] - (int)order[i], 0) + localIJK[i]; // needs to be a signed type!
│ │ │ │ -
731
│ │ │ │ -
732 // Make one global flat index from the globalIJK tuple
│ │ │ │ -
733 size_type globalIdx = globalIJK[dim-1];
│ │ │ │ -
734
│ │ │ │ -
735 for (int i=dim-2; i>=0; i--)
│ │ │ │ -
736 globalIdx = globalIdx * size(i) + globalIJK[i];
│ │ │ │ -
737
│ │ │ │ -
738 *it = {{globalIdx}};
│ │ │ │ -
739 }
│ │ │ │ -
740 return it;
│ │ │ │ -
741 }
│ │ │ │ -
│ │ │ │ -
742
│ │ │ │ -
│ │ │ │ -
744 unsigned int dimension () const
│ │ │ │ -
745 {
│ │ │ │ -
746 unsigned int result = 1;
│ │ │ │ -
747 for (size_t i=0; i<dim; i++)
│ │ │ │ -
748 result *= size(i);
│ │ │ │ -
749 return result;
│ │ │ │ -
750 }
│ │ │ │ -
│ │ │ │ -
751
│ │ │ │ -
│ │ │ │ -
753 unsigned int size (size_t d) const
│ │ │ │ -
754 {
│ │ │ │ -
755 return knotVectors_[d].size() - order_[d] - 1;
│ │ │ │ -
756 }
│ │ │ │ -
│ │ │ │ -
757
│ │ │ │ -
758 using Base::size;
│ │ │ │ -
759
│ │ │ │ -
│ │ │ │ -
762 void evaluateFunction (const FieldVector<typename GV::ctype,dim>& in,
│ │ │ │ -
763 std::vector<FieldVector<R,1> >& out,
│ │ │ │ -
764 const std::array<unsigned,dim>& currentKnotSpan) const
│ │ │ │ -
765 {
│ │ │ │ -
766 // Evaluate
│ │ │ │ -
767 std::array<std::vector<R>, dim> oneDValues;
│ │ │ │ -
768
│ │ │ │ -
769 for (size_t i=0; i<dim; i++)
│ │ │ │ -
770 evaluateFunction(in[i], oneDValues[i], knotVectors_[i], order_[i], currentKnotSpan[i]);
│ │ │ │ -
771
│ │ │ │ -
772 std::array<unsigned int, dim> limits;
│ │ │ │ -
773 for (int i=0; i<dim; i++)
│ │ │ │ -
774 limits[i] = oneDValues[i].size();
│ │ │ │ -
775
│ │ │ │ -
776 MultiDigitCounter ijkCounter(limits);
│ │ │ │ -
777
│ │ │ │ -
778 out.resize(ijkCounter.cycle());
│ │ │ │ -
779
│ │ │ │ -
780 for (size_t i=0; i<out.size(); i++, ++ijkCounter)
│ │ │ │ -
781 {
│ │ │ │ -
782 out[i] = R(1.0);
│ │ │ │ -
783 for (size_t j=0; j<dim; j++)
│ │ │ │ -
784 out[i] *= oneDValues[j][ijkCounter[j]];
│ │ │ │ -
785 }
│ │ │ │ -
786 }
│ │ │ │ -
│ │ │ │ -
787
│ │ │ │ -
│ │ │ │ -
793 void evaluateJacobian (const FieldVector<typename GV::ctype,dim>& in,
│ │ │ │ -
794 std::vector<FieldMatrix<R,1,dim> >& out,
│ │ │ │ -
795 const std::array<unsigned,dim>& currentKnotSpan) const
│ │ │ │ -
796 {
│ │ │ │ -
797 // How many shape functions to we have in each coordinate direction?
│ │ │ │ -
798 std::array<unsigned int, dim> limits;
│ │ │ │ -
799 for (int i=0; i<dim; i++)
│ │ │ │ -
800 {
│ │ │ │ -
801 limits[i] = order_[i]+1; // The 'standard' value away from the boundaries of the knot vector
│ │ │ │ -
802 if (currentKnotSpan[i]<order_[i])
│ │ │ │ -
803 limits[i] -= (order_[i] - currentKnotSpan[i]);
│ │ │ │ -
804 if ( order_[i] > (knotVectors_[i].size() - currentKnotSpan[i] - 2) )
│ │ │ │ -
805 limits[i] -= order_[i] - (knotVectors_[i].size() - currentKnotSpan[i] - 2);
│ │ │ │ -
806 }
│ │ │ │ -
807
│ │ │ │ -
808 // The lowest knot spans that we need values from
│ │ │ │ -
809 std::array<unsigned int, dim> offset;
│ │ │ │ -
810 for (int i=0; i<dim; i++)
│ │ │ │ -
811 offset[i] = std::max((int)(currentKnotSpan[i] - order_[i]),0);
│ │ │ │ -
812
│ │ │ │ -
813 // Evaluate 1d function values (needed for the product rule)
│ │ │ │ -
814 std::array<std::vector<R>, dim> oneDValues;
│ │ │ │ -
815
│ │ │ │ -
816 // Evaluate 1d function values of one order lower (needed for the derivative formula)
│ │ │ │ -
817 std::array<std::vector<R>, dim> lowOrderOneDValues;
│ │ │ │ -
818
│ │ │ │ -
819 std::array<DynamicMatrix<R>, dim> values;
│ │ │ │ -
820
│ │ │ │ -
821 for (size_t i=0; i<dim; i++)
│ │ │ │ -
822 {
│ │ │ │ -
823 evaluateFunctionFull(in[i], values[i], knotVectors_[i], order_[i], currentKnotSpan[i]);
│ │ │ │ -
824 oneDValues[i].resize(knotVectors_[i].size()-order_[i]-1);
│ │ │ │ -
825 for (size_t j=0; j<oneDValues[i].size(); j++)
│ │ │ │ -
826 oneDValues[i][j] = values[i][order_[i]][j];
│ │ │ │ -
827
│ │ │ │ -
828 if (order_[i]!=0)
│ │ │ │ -
829 {
│ │ │ │ -
830 lowOrderOneDValues[i].resize(knotVectors_[i].size()-(order_[i]-1)-1);
│ │ │ │ -
831 for (size_t j=0; j<lowOrderOneDValues[i].size(); j++)
│ │ │ │ -
832 lowOrderOneDValues[i][j] = values[i][order_[i]-1][j];
│ │ │ │ -
833 }
│ │ │ │ -
834 }
│ │ │ │ -
835
│ │ │ │ -
836
│ │ │ │ -
837 // Evaluate 1d function derivatives
│ │ │ │ -
838 std::array<std::vector<R>, dim> oneDDerivatives;
│ │ │ │ -
839 for (size_t i=0; i<dim; i++)
│ │ │ │ -
840 {
│ │ │ │ -
841 oneDDerivatives[i].resize(limits[i]);
│ │ │ │ -
842
│ │ │ │ -
843 if (order_[i]==0) // order-zero functions are piecewise constant, hence all derivatives are zero
│ │ │ │ -
844 std::fill(oneDDerivatives[i].begin(), oneDDerivatives[i].end(), R(0.0));
│ │ │ │ -
845 else
│ │ │ │ -
846 {
│ │ │ │ -
847 for (size_t j=offset[i]; j<offset[i]+limits[i]; j++)
│ │ │ │ -
848 {
│ │ │ │ -
849 R derivativeAddend1 = lowOrderOneDValues[i][j] / (knotVectors_[i][j+order_[i]]-knotVectors_[i][j]);
│ │ │ │ -
850 R derivativeAddend2 = lowOrderOneDValues[i][j+1] / (knotVectors_[i][j+order_[i]+1]-knotVectors_[i][j+1]);
│ │ │ │ -
851 // The two previous terms may evaluate as 0/0. This is to be interpreted as 0.
│ │ │ │ -
852 if (std::isnan(derivativeAddend1))
│ │ │ │ -
853 derivativeAddend1 = 0;
│ │ │ │ -
854 if (std::isnan(derivativeAddend2))
│ │ │ │ -
855 derivativeAddend2 = 0;
│ │ │ │ -
856 oneDDerivatives[i][j-offset[i]] = order_[i] * ( derivativeAddend1 - derivativeAddend2 );
│ │ │ │ -
857 }
│ │ │ │ -
858 }
│ │ │ │ -
859 }
│ │ │ │ -
860
│ │ │ │ -
861 // Working towards computing only the parts that we really need:
│ │ │ │ -
862 // Let's copy them out into a separate array
│ │ │ │ -
863 std::array<std::vector<R>, dim> oneDValuesShort;
│ │ │ │ -
864
│ │ │ │ -
865 for (int i=0; i<dim; i++)
│ │ │ │ -
866 {
│ │ │ │ -
867 oneDValuesShort[i].resize(limits[i]);
│ │ │ │ -
868
│ │ │ │ -
869 for (size_t j=0; j<limits[i]; j++)
│ │ │ │ -
870 oneDValuesShort[i][j] = oneDValues[i][offset[i] + j];
│ │ │ │ -
871 }
│ │ │ │ -
872
│ │ │ │ -
873
│ │ │ │ -
874
│ │ │ │ -
875 // Set up a multi-index to go from consecutive indices to integer coordinates
│ │ │ │ -
876 MultiDigitCounter ijkCounter(limits);
│ │ │ │ -
877
│ │ │ │ -
878 out.resize(ijkCounter.cycle());
│ │ │ │ -
879
│ │ │ │ -
880 // Complete Jacobian is given by the product rule
│ │ │ │ -
881 for (size_t i=0; i<out.size(); i++, ++ijkCounter)
│ │ │ │ -
882 for (int j=0; j<dim; j++)
│ │ │ │ -
883 {
│ │ │ │ -
884 out[i][0][j] = 1.0;
│ │ │ │ -
885 for (int k=0; k<dim; k++)
│ │ │ │ -
886 out[i][0][j] *= (j==k) ? oneDDerivatives[k][ijkCounter[k]]
│ │ │ │ -
887 : oneDValuesShort[k][ijkCounter[k]];
│ │ │ │ -
888 }
│ │ │ │ -
889
│ │ │ │ -
890 }
│ │ │ │ -
│ │ │ │ -
891
│ │ │ │ -
893 template <size_type k>
│ │ │ │ -
│ │ │ │ -
894 void evaluate(const typename std::array<int,k>& directions,
│ │ │ │ -
895 const FieldVector<typename GV::ctype,dim>& in,
│ │ │ │ -
896 std::vector<FieldVector<R,1> >& out,
│ │ │ │ -
897 const std::array<unsigned,dim>& currentKnotSpan) const
│ │ │ │ -
898 {
│ │ │ │ -
899 if (k != 1 && k != 2)
│ │ │ │ -
900 DUNE_THROW(RangeError, "Differentiation order greater than 2 is not supported!");
│ │ │ │ -
901
│ │ │ │ -
902 // Evaluate 1d function values (needed for the product rule)
│ │ │ │ -
903 std::array<std::vector<R>, dim> oneDValues;
│ │ │ │ -
904 std::array<std::vector<R>, dim> oneDDerivatives;
│ │ │ │ -
905 std::array<std::vector<R>, dim> oneDSecondDerivatives;
│ │ │ │ -
906
│ │ │ │ -
907 // Evaluate 1d function derivatives
│ │ │ │ -
908 if (k==1)
│ │ │ │ -
909 for (size_t i=0; i<dim; i++)
│ │ │ │ -
910 evaluateAll(in[i], oneDValues[i], true, oneDDerivatives[i], false, oneDSecondDerivatives[i], knotVectors_[i], order_[i], currentKnotSpan[i]);
│ │ │ │ -
911 else
│ │ │ │ -
912 for (size_t i=0; i<dim; i++)
│ │ │ │ -
913 evaluateAll(in[i], oneDValues[i], true, oneDDerivatives[i], true, oneDSecondDerivatives[i], knotVectors_[i], order_[i], currentKnotSpan[i]);
│ │ │ │ -
914
│ │ │ │ -
915 // The lowest knot spans that we need values from
│ │ │ │ -
916 std::array<unsigned int, dim> offset;
│ │ │ │ -
917 for (int i=0; i<dim; i++)
│ │ │ │ -
918 offset[i] = std::max((int)(currentKnotSpan[i] - order_[i]),0);
│ │ │ │ -
919
│ │ │ │ -
920 // Set up a multi-index to go from consecutive indices to integer coordinates
│ │ │ │ -
921 std::array<unsigned int, dim> limits;
│ │ │ │ -
922 for (int i=0; i<dim; i++)
│ │ │ │ -
923 {
│ │ │ │ -
924 // In a proper implementation, the following line would do
│ │ │ │ -
925 //limits[i] = oneDValues[i].size();
│ │ │ │ -
926 limits[i] = order_[i]+1; // The 'standard' value away from the boundaries of the knot vector
│ │ │ │ -
927 if (currentKnotSpan[i]<order_[i])
│ │ │ │ -
928 limits[i] -= (order_[i] - currentKnotSpan[i]);
│ │ │ │ -
929 if ( order_[i] > (knotVectors_[i].size() - currentKnotSpan[i] - 2) )
│ │ │ │ -
930 limits[i] -= order_[i] - (knotVectors_[i].size() - currentKnotSpan[i] - 2);
│ │ │ │ -
931 }
│ │ │ │ -
932
│ │ │ │ -
933 // Working towards computing only the parts that we really need:
│ │ │ │ -
934 // Let's copy them out into a separate array
│ │ │ │ -
935 std::array<std::vector<R>, dim> oneDValuesShort;
│ │ │ │ -
936
│ │ │ │ -
937 for (int i=0; i<dim; i++)
│ │ │ │ -
938 {
│ │ │ │ -
939 oneDValuesShort[i].resize(limits[i]);
│ │ │ │ -
940
│ │ │ │ -
941 for (size_t j=0; j<limits[i]; j++)
│ │ │ │ -
942 oneDValuesShort[i][j] = oneDValues[i][offset[i] + j];
│ │ │ │ -
943 }
│ │ │ │ -
944
│ │ │ │ -
945
│ │ │ │ -
946 MultiDigitCounter ijkCounter(limits);
│ │ │ │ -
947
│ │ │ │ -
948 out.resize(ijkCounter.cycle());
│ │ │ │ -
949
│ │ │ │ -
950 if (k == 1)
│ │ │ │ -
951 {
│ │ │ │ -
952 // Complete Jacobian is given by the product rule
│ │ │ │ -
953 for (size_t i=0; i<out.size(); i++, ++ijkCounter)
│ │ │ │ -
954 {
│ │ │ │ -
955 out[i][0] = 1.0;
│ │ │ │ -
956 for (int l=0; l<dim; l++)
│ │ │ │ -
957 out[i][0] *= (directions[0]==l) ? oneDDerivatives[l][ijkCounter[l]]
│ │ │ │ -
958 : oneDValuesShort[l][ijkCounter[l]];
│ │ │ │ -
959 }
│ │ │ │ -
960 }
│ │ │ │ -
961
│ │ │ │ -
962 if (k == 2)
│ │ │ │ -
963 {
│ │ │ │ -
964 // Complete derivation by deriving the tensor product
│ │ │ │ -
965 for (size_t i=0; i<out.size(); i++, ++ijkCounter)
│ │ │ │ -
966 {
│ │ │ │ -
967 out[i][0] = 1.0;
│ │ │ │ -
968 for (int j=0; j<dim; j++)
│ │ │ │ -
969 {
│ │ │ │ -
970 if (directions[0] != directions[1]) //derivation in two different variables
│ │ │ │ -
971 if (directions[0] == j || directions[1] == j) //the spline has to be derived (once) in this direction
│ │ │ │ -
972 out[i][0] *= oneDDerivatives[j][ijkCounter[j]];
│ │ │ │ -
973 else //no derivation in this direction
│ │ │ │ -
974 out[i][0] *= oneDValuesShort[j][ijkCounter[j]];
│ │ │ │ -
975 else //spline is derived two times in the same direction
│ │ │ │ -
976 if (directions[0] == j) //the spline is derived two times in this direction
│ │ │ │ -
977 out[i][0] *= oneDSecondDerivatives[j][ijkCounter[j]];
│ │ │ │ -
978 else //no derivation in this direction
│ │ │ │ -
979 out[i][0] *= oneDValuesShort[j][ijkCounter[j]];
│ │ │ │ -
980 }
│ │ │ │ -
981 }
│ │ │ │ -
982 }
│ │ │ │ -
983 }
│ │ │ │ -
│ │ │ │ -
984
│ │ │ │ -
985
│ │ │ │ -
│ │ │ │ -
990 static std::array<unsigned int,dim> getIJK(typename GridView::IndexSet::IndexType idx, std::array<unsigned int,dim> elements)
│ │ │ │ -
991 {
│ │ │ │ -
992 std::array<unsigned,dim> result;
│ │ │ │ -
993 for (int i=0; i<dim; i++)
│ │ │ │ -
994 {
│ │ │ │ -
995 result[i] = idx%elements[i];
│ │ │ │ -
996 idx /= elements[i];
│ │ │ │ -
997 }
│ │ │ │ -
998 return result;
│ │ │ │ -
999 }
│ │ │ │ -
│ │ │ │ -
1000
│ │ │ │ -
│ │ │ │ -
1009 static void evaluateFunction (const typename GV::ctype& in, std::vector<R>& out,
│ │ │ │ -
1010 const std::vector<R>& knotVector,
│ │ │ │ -
1011 unsigned int order,
│ │ │ │ -
1012 unsigned int currentKnotSpan)
│ │ │ │ -
1013 {
│ │ │ │ -
1014 std::size_t outSize = order+1; // The 'standard' value away from the boundaries of the knot vector
│ │ │ │ -
1015 if (currentKnotSpan<order) // Less near the left end of the knot vector
│ │ │ │ -
1016 outSize -= (order - currentKnotSpan);
│ │ │ │ -
1017 if ( order > (knotVector.size() - currentKnotSpan - 2) )
│ │ │ │ -
1018 outSize -= order - (knotVector.size() - currentKnotSpan - 2);
│ │ │ │ -
1019 out.resize(outSize);
│ │ │ │ -
1020
│ │ │ │ -
1021 // It's not really a matrix that is needed here, a plain 2d array would do
│ │ │ │ -
1022 DynamicMatrix<R> N(order+1, knotVector.size()-1);
│ │ │ │ -
1023
│ │ │ │ -
1024 // The text books on splines use the following geometric condition here to fill the array N
│ │ │ │ -
1025 // (see for example Cottrell, Hughes, Bazilevs, Formula (2.1). However, this condition
│ │ │ │ -
1026 // only works if splines are never evaluated exactly on the knots.
│ │ │ │ -
1027 //
│ │ │ │ -
1028 // for (size_t i=0; i<knotVector.size()-1; i++)
│ │ │ │ -
1029 // N[0][i] = (knotVector[i] <= in) and (in < knotVector[i+1]);
│ │ │ │ -
1030 for (size_t i=0; i<knotVector.size()-1; i++)
│ │ │ │ -
1031 N[0][i] = (i == currentKnotSpan);
│ │ │ │ -
1032
│ │ │ │ -
1033 for (size_t r=1; r<=order; r++)
│ │ │ │ -
1034 for (size_t i=0; i<knotVector.size()-r-1; i++)
│ │ │ │ -
1035 {
│ │ │ │ -
1036 R factor1 = ((knotVector[i+r] - knotVector[i]) > 1e-10)
│ │ │ │ -
1037 ? (in - knotVector[i]) / (knotVector[i+r] - knotVector[i])
│ │ │ │ -
1038 : 0;
│ │ │ │ -
1039 R factor2 = ((knotVector[i+r+1] - knotVector[i+1]) > 1e-10)
│ │ │ │ -
1040 ? (knotVector[i+r+1] - in) / (knotVector[i+r+1] - knotVector[i+1])
│ │ │ │ -
1041 : 0;
│ │ │ │ -
1042 N[r][i] = factor1 * N[r-1][i] + factor2 * N[r-1][i+1];
│ │ │ │ -
1043 }
│ │ │ │ -
1044
│ │ │ │ -
1049 for (size_t i=0; i<out.size(); i++) {
│ │ │ │ -
1050 out[i] = N[order][std::max((int)(currentKnotSpan - order),0) + i];
│ │ │ │ -
1051 }
│ │ │ │ -
1052 }
│ │ │ │ -
│ │ │ │ -
1053
│ │ │ │ -
│ │ │ │ -
1066 static void evaluateFunctionFull(const typename GV::ctype& in,
│ │ │ │ -
1067 DynamicMatrix<R>& out,
│ │ │ │ -
1068 const std::vector<R>& knotVector,
│ │ │ │ -
1069 unsigned int order,
│ │ │ │ -
1070 unsigned int currentKnotSpan)
│ │ │ │ -
1071 {
│ │ │ │ -
1072 // It's not really a matrix that is needed here, a plain 2d array would do
│ │ │ │ -
1073 DynamicMatrix<R>& N = out;
│ │ │ │ -
1074
│ │ │ │ -
1075 N.resize(order+1, knotVector.size()-1);
│ │ │ │ -
1076
│ │ │ │ -
1077 // The text books on splines use the following geometric condition here to fill the array N
│ │ │ │ -
1078 // (see for example Cottrell, Hughes, Bazilevs, Formula (2.1). However, this condition
│ │ │ │ -
1079 // only works if splines are never evaluated exactly on the knots.
│ │ │ │ -
1080 //
│ │ │ │ -
1081 // for (size_t i=0; i<knotVector.size()-1; i++)
│ │ │ │ -
1082 // N[0][i] = (knotVector[i] <= in) and (in < knotVector[i+1]);
│ │ │ │ -
1083 for (size_t i=0; i<knotVector.size()-1; i++)
│ │ │ │ -
1084 N[0][i] = (i == currentKnotSpan);
│ │ │ │ -
1085
│ │ │ │ -
1086 for (size_t r=1; r<=order; r++)
│ │ │ │ -
1087 for (size_t i=0; i<knotVector.size()-r-1; i++)
│ │ │ │ -
1088 {
│ │ │ │ -
1089 R factor1 = ((knotVector[i+r] - knotVector[i]) > 1e-10)
│ │ │ │ -
1090 ? (in - knotVector[i]) / (knotVector[i+r] - knotVector[i])
│ │ │ │ -
1091 : 0;
│ │ │ │ -
1092 R factor2 = ((knotVector[i+r+1] - knotVector[i+1]) > 1e-10)
│ │ │ │ -
1093 ? (knotVector[i+r+1] - in) / (knotVector[i+r+1] - knotVector[i+1])
│ │ │ │ -
1094 : 0;
│ │ │ │ -
1095 N[r][i] = factor1 * N[r-1][i] + factor2 * N[r-1][i+1];
│ │ │ │ -
1096 }
│ │ │ │ -
1097 }
│ │ │ │ -
│ │ │ │ -
1098
│ │ │ │ -
1099
│ │ │ │ -
│ │ │ │ -
1109 static void evaluateAll(const typename GV::ctype& in,
│ │ │ │ -
1110 std::vector<R>& out,
│ │ │ │ -
1111 bool evaluateJacobian, std::vector<R>& outJac,
│ │ │ │ -
1112 bool evaluateHessian, std::vector<R>& outHess,
│ │ │ │ -
1113 const std::vector<R>& knotVector,
│ │ │ │ -
1114 unsigned int order,
│ │ │ │ -
1115 unsigned int currentKnotSpan)
│ │ │ │ -
1116 {
│ │ │ │ -
1117 // How many shape functions to we have in each coordinate direction?
│ │ │ │ -
1118 unsigned int limit;
│ │ │ │ -
1119 limit = order+1; // The 'standard' value away from the boundaries of the knot vector
│ │ │ │ -
1120 if (currentKnotSpan<order)
│ │ │ │ -
1121 limit -= (order - currentKnotSpan);
│ │ │ │ -
1122 if ( order > (knotVector.size() - currentKnotSpan - 2) )
│ │ │ │ -
1123 limit -= order - (knotVector.size() - currentKnotSpan - 2);
│ │ │ │ -
1124
│ │ │ │ -
1125 // The lowest knot spans that we need values from
│ │ │ │ -
1126 unsigned int offset;
│ │ │ │ -
1127 offset = std::max((int)(currentKnotSpan - order),0);
│ │ │ │ -
1128
│ │ │ │ -
1129 // Evaluate 1d function values (needed for the product rule)
│ │ │ │ -
1130 DynamicMatrix<R> values;
│ │ │ │ -
1131
│ │ │ │ -
1132 evaluateFunctionFull(in, values, knotVector, order, currentKnotSpan);
│ │ │ │ -
1133
│ │ │ │ -
1134 out.resize(knotVector.size()-order-1);
│ │ │ │ -
1135 for (size_t j=0; j<out.size(); j++)
│ │ │ │ -
1136 out[j] = values[order][j];
│ │ │ │ -
1137
│ │ │ │ -
1138 // Evaluate 1d function values of one order lower (needed for the derivative formula)
│ │ │ │ -
1139 std::vector<R> lowOrderOneDValues;
│ │ │ │ -
1140
│ │ │ │ -
1141 if (order!=0)
│ │ │ │ -
1142 {
│ │ │ │ -
1143 lowOrderOneDValues.resize(knotVector.size()-(order-1)-1);
│ │ │ │ -
1144 for (size_t j=0; j<lowOrderOneDValues.size(); j++)
│ │ │ │ -
1145 lowOrderOneDValues[j] = values[order-1][j];
│ │ │ │ -
1146 }
│ │ │ │ -
1147
│ │ │ │ -
1148 // Evaluate 1d function values of two order lower (needed for the (second) derivative formula)
│ │ │ │ -
1149 std::vector<R> lowOrderTwoDValues;
│ │ │ │ -
1150
│ │ │ │ -
1151 if (order>1 && evaluateHessian)
│ │ │ │ -
1152 {
│ │ │ │ -
1153 lowOrderTwoDValues.resize(knotVector.size()-(order-2)-1);
│ │ │ │ -
1154 for (size_t j=0; j<lowOrderTwoDValues.size(); j++)
│ │ │ │ -
1155 lowOrderTwoDValues[j] = values[order-2][j];
│ │ │ │ -
1156 }
│ │ │ │ -
1157
│ │ │ │ -
1158 // Evaluate 1d function derivatives
│ │ │ │ -
1159 if (evaluateJacobian)
│ │ │ │ -
1160 {
│ │ │ │ -
1161 outJac.resize(limit);
│ │ │ │ -
1162
│ │ │ │ -
1163 if (order==0) // order-zero functions are piecewise constant, hence all derivatives are zero
│ │ │ │ -
1164 std::fill(outJac.begin(), outJac.end(), R(0.0));
│ │ │ │ -
1165 else
│ │ │ │ -
1166 {
│ │ │ │ -
1167 for (size_t j=offset; j<offset+limit; j++)
│ │ │ │ -
1168 {
│ │ │ │ -
1169 R derivativeAddend1 = lowOrderOneDValues[j] / (knotVector[j+order]-knotVector[j]);
│ │ │ │ -
1170 R derivativeAddend2 = lowOrderOneDValues[j+1] / (knotVector[j+order+1]-knotVector[j+1]);
│ │ │ │ -
1171 // The two previous terms may evaluate as 0/0. This is to be interpreted as 0.
│ │ │ │ -
1172 if (std::isnan(derivativeAddend1))
│ │ │ │ -
1173 derivativeAddend1 = 0;
│ │ │ │ -
1174 if (std::isnan(derivativeAddend2))
│ │ │ │ -
1175 derivativeAddend2 = 0;
│ │ │ │ -
1176 outJac[j-offset] = order * ( derivativeAddend1 - derivativeAddend2 );
│ │ │ │ -
1177 }
│ │ │ │ -
1178 }
│ │ │ │ -
1179 }
│ │ │ │ -
1180
│ │ │ │ -
1181 // Evaluate 1d function second derivatives
│ │ │ │ -
1182 if (evaluateHessian)
│ │ │ │ -
1183 {
│ │ │ │ -
1184 outHess.resize(limit);
│ │ │ │ -
1185
│ │ │ │ -
1186 if (order<2) // order-zero functions are piecewise constant, hence all derivatives are zero
│ │ │ │ -
1187 std::fill(outHess.begin(), outHess.end(), R(0.0));
│ │ │ │ -
1188 else
│ │ │ │ -
1189 {
│ │ │ │ -
1190 for (size_t j=offset; j<offset+limit; j++)
│ │ │ │ -
1191 {
│ │ │ │ -
1192 assert(j+2 < lowOrderTwoDValues.size());
│ │ │ │ -
1193 R derivativeAddend1 = lowOrderTwoDValues[j] / (knotVector[j+order]-knotVector[j]) / (knotVector[j+order-1]-knotVector[j]);
│ │ │ │ -
1194 R derivativeAddend2 = lowOrderTwoDValues[j+1] / (knotVector[j+order]-knotVector[j]) / (knotVector[j+order]-knotVector[j+1]);
│ │ │ │ -
1195 R derivativeAddend3 = lowOrderTwoDValues[j+1] / (knotVector[j+order+1]-knotVector[j+1]) / (knotVector[j+order]-knotVector[j+1]);
│ │ │ │ -
1196 R derivativeAddend4 = lowOrderTwoDValues[j+2] / (knotVector[j+order+1]-knotVector[j+1]) / (knotVector[j+1+order]-knotVector[j+2]);
│ │ │ │ -
1197 // The two previous terms may evaluate as 0/0. This is to be interpreted as 0.
│ │ │ │ -
1198
│ │ │ │ -
1199 if (std::isnan(derivativeAddend1))
│ │ │ │ -
1200 derivativeAddend1 = 0;
│ │ │ │ -
1201 if (std::isnan(derivativeAddend2))
│ │ │ │ -
1202 derivativeAddend2 = 0;
│ │ │ │ -
1203 if (std::isnan(derivativeAddend3))
│ │ │ │ -
1204 derivativeAddend3 = 0;
│ │ │ │ -
1205 if (std::isnan(derivativeAddend4))
│ │ │ │ -
1206 derivativeAddend4 = 0;
│ │ │ │ -
1207 outHess[j-offset] = order * (order-1) * ( derivativeAddend1 - derivativeAddend2 -derivativeAddend3 + derivativeAddend4 );
│ │ │ │ -
1208 }
│ │ │ │ -
1209 }
│ │ │ │ -
1210 }
│ │ │ │ -
1211 }
│ │ │ │ -
│ │ │ │ -
1212
│ │ │ │ -
1213
│ │ │ │ -
1215 std::array<unsigned int, dim> order_;
│ │ │ │ -
1216
│ │ │ │ -
1218 std::array<std::vector<double>, dim> knotVectors_;
│ │ │ │ -
1219
│ │ │ │ -
1221 std::array<unsigned,dim> elements_;
│ │ │ │ -
1222
│ │ │ │ - │ │ │ │ -
1224};
│ │ │ │ -
│ │ │ │ -
1225
│ │ │ │ -
1226
│ │ │ │ -
1227
│ │ │ │ -
1228template<typename GV>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1230 public LeafBasisNode
│ │ │ │ -
1231{
│ │ │ │ -
1232 static const int dim = GV::dimension;
│ │ │ │ -
1233
│ │ │ │ -
1234public:
│ │ │ │ -
1235
│ │ │ │ -
1236 using size_type = std::size_t;
│ │ │ │ -
1237 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ - │ │ │ │ -
1239
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1241 preBasis_(preBasis),
│ │ │ │ -
1242 finiteElement_(*preBasis)
│ │ │ │ -
1243 {}
│ │ │ │ -
│ │ │ │ -
1244
│ │ │ │ -
│ │ │ │ -
1246 const Element& element() const
│ │ │ │ -
1247 {
│ │ │ │ -
1248 return element_;
│ │ │ │ -
1249 }
│ │ │ │ -
│ │ │ │ -
1250
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
1256 {
│ │ │ │ -
1257 return finiteElement_;
│ │ │ │ -
1258 }
│ │ │ │ -
│ │ │ │ -
1259
│ │ │ │ -
│ │ │ │ -
1261 void bind(const Element& e)
│ │ │ │ -
1262 {
│ │ │ │ -
1263 element_ = e;
│ │ │ │ -
1264 auto elementIndex = preBasis_->gridView().indexSet().index(e);
│ │ │ │ -
1265 finiteElement_.bind(preBasis_->getIJK(elementIndex,preBasis_->elements_));
│ │ │ │ -
1266 this->setSize(finiteElement_.size());
│ │ │ │ -
1267 }
│ │ │ │ -
│ │ │ │ -
1268
│ │ │ │ -
1269protected:
│ │ │ │ -
1270
│ │ │ │ - │ │ │ │ -
1272
│ │ │ │ - │ │ │ │ - │ │ │ │ -
1275};
│ │ │ │ -
│ │ │ │ -
1276
│ │ │ │ -
1277
│ │ │ │ -
1278
│ │ │ │ -
1279namespace BasisFactory {
│ │ │ │ -
1280
│ │ │ │ -
│ │ │ │ -
1287inline auto bSpline(const std::vector<double>& knotVector,
│ │ │ │ -
1288 unsigned int order,
│ │ │ │ -
1289 bool makeOpen = true)
│ │ │ │ -
1290{
│ │ │ │ -
1291 return [&knotVector, order, makeOpen](const auto& gridView) {
│ │ │ │ -
1292 return BSplinePreBasis<std::decay_t<decltype(gridView)>>(gridView, knotVector, order, makeOpen);
│ │ │ │ -
1293 };
│ │ │ │ -
1294}
│ │ │ │ +
117
│ │ │ │ +
│ │ │ │ +
122 const Tree& tree() const
│ │ │ │ +
123 {
│ │ │ │ +
124 return tree_;
│ │ │ │ +
125 }
│ │ │ │
│ │ │ │ -
1295
│ │ │ │ -
1296} // end namespace BasisFactory
│ │ │ │ -
1297
│ │ │ │ -
1298// *****************************************************************************
│ │ │ │ -
1299// This is the actual global basis implementation based on the reusable parts.
│ │ │ │ -
1300// *****************************************************************************
│ │ │ │ -
1301
│ │ │ │ -
1308template<typename GV>
│ │ │ │ - │ │ │ │ -
1310
│ │ │ │ -
1311
│ │ │ │ -
1312} // namespace Functions
│ │ │ │ -
1313
│ │ │ │ -
1314} // namespace Dune
│ │ │ │ -
1315
│ │ │ │ -
1316#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:1287
│ │ │ │ +
126
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
130 {
│ │ │ │ +
131 return tree_.size();
│ │ │ │ +
132 }
│ │ │ │ +
│ │ │ │ +
133
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
141 {
│ │ │ │ +
142 return globalBasis_->preBasis().maxNodeSize();
│ │ │ │ +
143 }
│ │ │ │ +
│ │ │ │ +
144
│ │ │ │ +
│ │ │ │ +
146 const MultiIndex& index(size_type i) const
│ │ │ │ +
147 {
│ │ │ │ +
148 return indices_[i];
│ │ │ │ +
149 }
│ │ │ │ +
│ │ │ │ +
150
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
154 {
│ │ │ │ +
155 return *globalBasis_;
│ │ │ │ +
156 }
│ │ │ │ +
│ │ │ │ +
157
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
159 {
│ │ │ │ +
160 return *this;
│ │ │ │ +
161 }
│ │ │ │ +
│ │ │ │ +
162
│ │ │ │ +
163protected:
│ │ │ │ + │ │ │ │ +
165 std::optional<Element> element_;
│ │ │ │ + │ │ │ │ +
167 std::vector<MultiIndexStorage> indices_;
│ │ │ │ +
168};
│ │ │ │ +
│ │ │ │ +
169
│ │ │ │ +
170
│ │ │ │ +
171
│ │ │ │ +
172} // end namespace Functions
│ │ │ │ +
173} // end namespace Dune
│ │ │ │ +
174
│ │ │ │ +
175
│ │ │ │ +
176
│ │ │ │ +
177#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALVIEW_HH
│ │ │ │ + │ │ │ │ + │ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
LocalFiniteElement in the sense of dune-localfunctions, for the B-spline basis on tensor-product grid...
Definition bsplinebasis.hh:367
│ │ │ │ -
BSplineLocalFiniteElement(const BSplineLocalFiniteElement &other)
Copy constructor.
Definition bsplinebasis.hh:388
│ │ │ │ -
const BSplinePreBasis< GV > & preBasis_
Definition bsplinebasis.hh:479
│ │ │ │ -
const BSplineLocalInterpolation< dim, BSplineLocalBasis< GV, R > > & localInterpolation() const
Hand out a LocalInterpolation object.
Definition bsplinebasis.hh:444
│ │ │ │ -
LocalFiniteElementTraits< BSplineLocalBasis< GV, R >, BSplineLocalCoefficients< dim >, BSplineLocalInterpolation< dim, BSplineLocalBasis< GV, R > > > Traits
Export various types related to this LocalFiniteElement.
Definition bsplinebasis.hh:377
│ │ │ │ -
std::array< unsigned, dim > currentKnotSpan_
Definition bsplinebasis.hh:486
│ │ │ │ -
BSplineLocalFiniteElement(const BSplinePreBasis< GV > &preBasis)
Constructor with a given B-spline basis.
Definition bsplinebasis.hh:381
│ │ │ │ -
const BSplineLocalCoefficients< dim > & localCoefficients() const
Hand out a LocalCoefficients object.
Definition bsplinebasis.hh:438
│ │ │ │ -
void bind(const std::array< unsigned, dim > &elementIdx)
Bind LocalFiniteElement to a specific knot span of the spline patch.
Definition bsplinebasis.hh:399
│ │ │ │ -
BSplineLocalInterpolation< dim, BSplineLocalBasis< GV, R > > localInterpolation_
Definition bsplinebasis.hh:483
│ │ │ │ -
GeometryType type() const
Return the reference element that the local finite element is defined on (here, a hypercube)
Definition bsplinebasis.hh:460
│ │ │ │ -
unsigned size() const
Number of shape functions in this finite element.
Definition bsplinebasis.hh:450
│ │ │ │ -
BSplineLocalCoefficients< dim > localCoefficients_
Definition bsplinebasis.hh:482
│ │ │ │ -
unsigned int size(int i) const
Number of degrees of freedom for one coordinate direction.
Definition bsplinebasis.hh:468
│ │ │ │ -
BSplineLocalBasis< GV, R > localBasis_
Definition bsplinebasis.hh:481
│ │ │ │ -
const BSplineLocalBasis< GV, R > & localBasis() const
Hand out a LocalBasis object.
Definition bsplinebasis.hh:432
│ │ │ │ -
Pre-basis for B-spline basis.
Definition bsplinebasis.hh:505
│ │ │ │ -
std::array< unsigned, dim > elements_
Number of grid elements in the different coordinate directions.
Definition bsplinebasis.hh:1221
│ │ │ │ -
GridView gridView_
Definition bsplinebasis.hh:1223
│ │ │ │ -
double R
Definition bsplinebasis.hh:574
│ │ │ │ -
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:1066
│ │ │ │ -
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:762
│ │ │ │ -
std::array< unsigned int, dim > order_
Order of the B-spline for each space dimension.
Definition bsplinebasis.hh:1215
│ │ │ │ -
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:1109
│ │ │ │ -
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:1009
│ │ │ │ -
unsigned int size(size_t d) const
Number of shape functions in one direction.
Definition bsplinebasis.hh:753
│ │ │ │ -
GV GridView
The grid view that the FE space is defined on.
Definition bsplinebasis.hh:568
│ │ │ │ -
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:714
│ │ │ │ -
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:894
│ │ │ │ -
std::size_t size_type
Definition bsplinebasis.hh:569
│ │ │ │ -
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition bsplinebasis.hh:690
│ │ │ │ -
unsigned int dimension() const
Total number of B-spline basis functions.
Definition bsplinebasis.hh:744
│ │ │ │ -
void initializeIndices()
Initialize the global indices.
Definition bsplinebasis.hh:680
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition bsplinebasis.hh:684
│ │ │ │ -
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:990
│ │ │ │ -
Node makeNode() const
Create tree node.
Definition bsplinebasis.hh:698
│ │ │ │ -
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:594
│ │ │ │ -
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:793
│ │ │ │ -
std::array< std::vector< double >, dim > knotVectors_
The knot vectors, one for each space dimension.
Definition bsplinebasis.hh:1218
│ │ │ │ -
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition bsplinebasis.hh:704
│ │ │ │ -
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:646
│ │ │ │ -
LocalBasis class in the sense of dune-localfunctions, presenting the restriction of a B-spline patch ...
Definition bsplinebasis.hh:51
│ │ │ │ -
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:60
│ │ │ │ -
unsigned int order() const
Polynomial order of the shape functions.
Definition bsplinebasis.hh:145
│ │ │ │ -
std::size_t size() const
Return the number of basis functions on the current knot span.
Definition bsplinebasis.hh:152
│ │ │ │ -
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:102
│ │ │ │ -
void evaluateFunction(const FieldVector< D, dim > &in, std::vector< FieldVector< R, 1 > > &out) const
Evaluate all shape functions.
Definition bsplinebasis.hh:75
│ │ │ │ -
void evaluateJacobian(const FieldVector< D, dim > &in, std::vector< FieldMatrix< D, 1, dim > > &out) const
Evaluate Jacobian of all shape functions.
Definition bsplinebasis.hh:87
│ │ │ │ -
BSplineLocalBasis(const BSplinePreBasis< GV > &preBasis, const BSplineLocalFiniteElement< GV, R > &lFE)
Constructor with a given B-spline patch.
Definition bsplinebasis.hh:66
│ │ │ │ -
Attaches a shape function to an entity.
Definition bsplinebasis.hh:183
│ │ │ │ -
const LocalKey & localKey(std::size_t i) const
get i'th index
Definition bsplinebasis.hh:326
│ │ │ │ -
void init(const std::array< unsigned, dim > &sizes)
Definition bsplinebasis.hh:261
│ │ │ │ -
std::size_t size() const
number of coefficients
Definition bsplinebasis.hh:320
│ │ │ │ -
Local interpolation in the sense of dune-localfunctions, for the B-spline basis on tensor-product gri...
Definition bsplinebasis.hh:345
│ │ │ │ -
void interpolate(const F &f, std::vector< C > &out) const
Local interpolation of a function.
Definition bsplinebasis.hh:349
│ │ │ │ -
Definition bsplinebasis.hh:1231
│ │ │ │ -
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition bsplinebasis.hh:1255
│ │ │ │ -
typename GV::template Codim< 0 >::Entity Element
Definition bsplinebasis.hh:1237
│ │ │ │ -
const BSplinePreBasis< GV > * preBasis_
Definition bsplinebasis.hh:1271
│ │ │ │ -
Element element_
Definition bsplinebasis.hh:1274
│ │ │ │ -
void bind(const Element &e)
Bind to element.
Definition bsplinebasis.hh:1261
│ │ │ │ -
BSplineNode(const BSplinePreBasis< GV > *preBasis)
Definition bsplinebasis.hh:1240
│ │ │ │ -
const Element & element() const
Return current element, throw if unbound.
Definition bsplinebasis.hh:1246
│ │ │ │ -
FiniteElement finiteElement_
Definition bsplinebasis.hh:1273
│ │ │ │ -
std::size_t size_type
Definition bsplinebasis.hh:1236
│ │ │ │ -
Global basis for given pre-basis.
Definition defaultglobalbasis.hh:50
│ │ │ │ -
A generic MixIn class for PreBasis.
Definition leafprebasismixin.hh:36
│ │ │ │ -
size_type size() const
Get the total dimension of the space spanned by this basis.
Definition leafprebasismixin.hh:60
│ │ │ │ -
size_type size() const
Definition nodes.hh:147
│ │ │ │ -
void setSize(const size_type size)
Definition nodes.hh:169
│ │ │ │ -
Definition nodes.hh:191
│ │ │ │ +
void bindTree(Tree &tree, const Entity &entity, std::size_t offset=0)
Definition nodes.hh:286
│ │ │ │ +
void initializeTree(Tree &tree, std::size_t treeIndexOffset=0)
Definition nodes.hh:293
│ │ │ │ +
A statically sized MultiIndex type.
Definition multiindex.hh:29
│ │ │ │ +
A dynamically sized array-like class with overflow.
Definition overflowarray.hh:49
│ │ │ │ +
The restriction of a finite element basis to a single element.
Definition defaultlocalview.hh:32
│ │ │ │ +
typename GlobalBasis::PreBasis PreBasis
Definition defaultlocalview.hh:52
│ │ │ │ +
void unbind()
Unbind from the current element.
Definition defaultlocalview.hh:113
│ │ │ │ +
bool bound() const
Return if the view is bound to a grid element.
Definition defaultlocalview.hh:95
│ │ │ │ +
typename GlobalBasis::GridView GridView
The grid view the global FE basis lives on.
Definition defaultlocalview.hh:39
│ │ │ │ +
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:146
│ │ │ │ +
std::optional< Element > element_
Definition defaultlocalview.hh:165
│ │ │ │ +
typename GridView::template Codim< 0 >::Entity Element
Type of the grid element we are bound to.
Definition defaultlocalview.hh:42
│ │ │ │ +
const Tree & tree() const
Return the local ansatz tree associated to the bound entity.
Definition defaultlocalview.hh:122
│ │ │ │ +
void bind(const Element &e)
Bind the view to a grid element.
Definition defaultlocalview.hh:85
│ │ │ │ +
const Element & element() const
Return the grid element that the view is bound to.
Definition defaultlocalview.hh:104
│ │ │ │ +
size_type size() const
Total number of degrees of freedom on this element.
Definition defaultlocalview.hh:129
│ │ │ │ +
GB GlobalBasis
The global FE basis that this is a view on.
Definition defaultlocalview.hh:36
│ │ │ │ +
Tree tree_
Definition defaultlocalview.hh:166
│ │ │ │ +
size_type maxSize() const
Maximum local size for any element on the GridView.
Definition defaultlocalview.hh:140
│ │ │ │ +
std::size_t size_type
The type used for sizes.
Definition defaultlocalview.hh:45
│ │ │ │ +
const DefaultLocalView & rootLocalView() const
Definition defaultlocalview.hh:158
│ │ │ │ +
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:60
│ │ │ │ +
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:68
│ │ │ │ +
std::vector< MultiIndexStorage > indices_
Definition defaultlocalview.hh:167
│ │ │ │ +
typename GlobalBasis::PreBasis::Node Tree
Tree of local finite elements / local shape function sets.
Definition defaultlocalview.hh:48
│ │ │ │ +
DefaultLocalView(const GlobalBasis &globalBasis)
Construct local view for a given global finite element basis.
Definition defaultlocalview.hh:72
│ │ │ │ +
const GlobalBasis * globalBasis_
Definition defaultlocalview.hh:164
│ │ │ │ +
const GlobalBasis & globalBasis() const
Return the global basis that we are a view on.
Definition defaultlocalview.hh:153
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,1476 +1,267 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -bsplinebasis.hh │ │ │ │ │ +defaultlocalview.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -_1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ +1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BSPLINEBASIS_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BSPLINEBASIS_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALVIEW_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALVIEW_HH │ │ │ │ │ 9 │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16 │ │ │ │ │ -18#include │ │ │ │ │ -19 │ │ │ │ │ -20#include │ │ │ │ │ -21#include │ │ │ │ │ -22#include │ │ │ │ │ -23#include │ │ │ │ │ -24#include │ │ │ │ │ -25#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ -26#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ -27#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ +10 │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13 │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17 │ │ │ │ │ +18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_o_v_e_r_f_l_o_w_a_r_r_a_y_._h_h> │ │ │ │ │ +19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_m_u_l_t_i_i_n_d_e_x_._h_h> │ │ │ │ │ +20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +21 │ │ │ │ │ +22 │ │ │ │ │ +23 │ │ │ │ │ +24namespace _D_u_n_e { │ │ │ │ │ +25namespace Functions { │ │ │ │ │ +26 │ │ │ │ │ +27 │ │ │ │ │ 28 │ │ │ │ │ -29namespace _D_u_n_e │ │ │ │ │ -30{ │ │ │ │ │ -31namespace Functions { │ │ │ │ │ -32 │ │ │ │ │ -33// A maze of dependencies between the different parts of this. We need a few │ │ │ │ │ -forward declarations │ │ │ │ │ -34template │ │ │ │ │ -35class _B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t; │ │ │ │ │ -36 │ │ │ │ │ -37template │ │ │ │ │ -38class _B_S_p_l_i_n_e_P_r_e_B_a_s_i_s; │ │ │ │ │ -39 │ │ │ │ │ +30template │ │ │ │ │ +_3_1class _D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w │ │ │ │ │ +32{ │ │ │ │ │ +33public: │ │ │ │ │ +34 │ │ │ │ │ +_3_6 using _G_l_o_b_a_l_B_a_s_i_s = GB; │ │ │ │ │ +37 │ │ │ │ │ +_3_9 using _G_r_i_d_V_i_e_w = typename GlobalBasis::GridView; │ │ │ │ │ 40 │ │ │ │ │ -49template │ │ │ │ │ -_5_0class _B_S_p_l_i_n_e_L_o_c_a_l_B_a_s_i_s │ │ │ │ │ -51{ │ │ │ │ │ -52 friend class _B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t; │ │ │ │ │ +_4_2 using _E_l_e_m_e_n_t = typename GridView::template Codim<0>::Entity; │ │ │ │ │ +43 │ │ │ │ │ +_4_5 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ +46 │ │ │ │ │ +_4_8 using _T_r_e_e = typename GlobalBasis::PreBasis::Node; │ │ │ │ │ +49 │ │ │ │ │ +50protected: │ │ │ │ │ +51 │ │ │ │ │ +_5_2 using _P_r_e_B_a_s_i_s = typename GlobalBasis::PreBasis; │ │ │ │ │ 53 │ │ │ │ │ -54 typedef typename GV::ctype D; │ │ │ │ │ -55 enum {dim = GV::dimension}; │ │ │ │ │ -56public: │ │ │ │ │ -57 │ │ │ │ │ -59 typedef LocalBasisTraits,R,1,FieldVector, │ │ │ │ │ -_6_0 FieldMatrix > _T_r_a_i_t_s; │ │ │ │ │ +54 // Type used to store the multi indices of the basis vectors. │ │ │ │ │ +55 // In contrast to MultiIndex this always has dynamic size. │ │ │ │ │ +56 // It's guaranteed, that you can always cast it to MultiIndex │ │ │ │ │ +_5_7 using _M_u_l_t_i_I_n_d_e_x_S_t_o_r_a_g_e = │ │ │ │ │ +58 std::conditional_t<(PreBasis::minMultiIndexSize == PreBasis:: │ │ │ │ │ +maxMultiIndexSize), │ │ │ │ │ +59 _O_v_e_r_f_l_o_w_A_r_r_a_y<_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x_<_s_i_z_e___t_y_p_e_,_ _P_r_e_B_a_s_i_s_:_:_m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e_>, │ │ │ │ │ +PreBasis::multiIndexBufferSize>, │ │ │ │ │ +60 Dune::ReservedVector>; │ │ │ │ │ 61 │ │ │ │ │ -_6_6 _B_S_p_l_i_n_e_L_o_c_a_l_B_a_s_i_s(const _B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_<_G_V_>& preBasis, │ │ │ │ │ -67 const _B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_<_G_V_,_R_>& lFE) │ │ │ │ │ -68 : preBasis_(preBasis), │ │ │ │ │ -69 lFE_(lFE) │ │ │ │ │ -70 {} │ │ │ │ │ -71 │ │ │ │ │ -_7_5 void _e_v_a_l_u_a_t_e_F_u_n_c_t_i_o_n (const FieldVector& in, │ │ │ │ │ -76 std::vector >& out) const │ │ │ │ │ -77 { │ │ │ │ │ -78 FieldVector globalIn = offset_; │ │ │ │ │ -79 scaling_.umv(in,globalIn); │ │ │ │ │ -80 │ │ │ │ │ -81 preBasis_.evaluateFunction(globalIn, out, lFE_.currentKnotSpan_); │ │ │ │ │ -82 } │ │ │ │ │ -83 │ │ │ │ │ -_8_7 void _e_v_a_l_u_a_t_e_J_a_c_o_b_i_a_n (const FieldVector& in, │ │ │ │ │ -88 std::vector >& out) const │ │ │ │ │ -89 { │ │ │ │ │ -90 FieldVector globalIn = offset_; │ │ │ │ │ -91 scaling_.umv(in,globalIn); │ │ │ │ │ +62public: │ │ │ │ │ +63 │ │ │ │ │ +_6_5 using _M_u_l_t_i_I_n_d_e_x = │ │ │ │ │ +66 std::conditional_t<(PreBasis::minMultiIndexSize == PreBasis:: │ │ │ │ │ +maxMultiIndexSize), │ │ │ │ │ +67 _S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x_<_s_i_z_e___t_y_p_e_,_ _P_r_e_B_a_s_i_s_:_:_m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e_>, │ │ │ │ │ +68 Dune::ReservedVector>; │ │ │ │ │ +69 │ │ │ │ │ +70 │ │ │ │ │ +_7_2 _D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w(const _G_l_o_b_a_l_B_a_s_i_s& _g_l_o_b_a_l_B_a_s_i_s) : │ │ │ │ │ +73 _g_l_o_b_a_l_B_a_s_i_s__(&_g_l_o_b_a_l_B_a_s_i_s), │ │ │ │ │ +74 _t_r_e_e__(_g_l_o_b_a_l_B_a_s_i_s__->preBasis().makeNode()) │ │ │ │ │ +75 { │ │ │ │ │ +76 static_assert(models, _T_r_e_e>(), "Tree type │ │ │ │ │ +passed to DefaultLocalView does not model the BasisNode concept."); │ │ │ │ │ +77 _i_n_i_t_i_a_l_i_z_e_T_r_e_e(_t_r_e_e__); │ │ │ │ │ +78 } │ │ │ │ │ +79 │ │ │ │ │ +_8_5 void _b_i_n_d(const _E_l_e_m_e_n_t& e) │ │ │ │ │ +86 { │ │ │ │ │ +87 _e_l_e_m_e_n_t__ = e; │ │ │ │ │ +88 _b_i_n_d_T_r_e_e(_t_r_e_e__, *_e_l_e_m_e_n_t__); │ │ │ │ │ +89 _i_n_d_i_c_e_s__.resize(_s_i_z_e()); │ │ │ │ │ +90 _g_l_o_b_a_l_B_a_s_i_s__->preBasis().indices(_t_r_e_e__, _i_n_d_i_c_e_s__.begin()); │ │ │ │ │ +91 } │ │ │ │ │ 92 │ │ │ │ │ -93 preBasis_.evaluateJacobian(globalIn, out, lFE_.currentKnotSpan_); │ │ │ │ │ -94 │ │ │ │ │ -95 for (size_t i=0; i(_e_l_e_m_e_n_t__); │ │ │ │ │ 98 } │ │ │ │ │ 99 │ │ │ │ │ -101 template │ │ │ │ │ -_1_0_2 inline void _e_v_a_l_u_a_t_e (const typename std::array& directions, │ │ │ │ │ -103 const typename Traits::DomainType& in, │ │ │ │ │ -104 std::vector& out) const │ │ │ │ │ +_1_0_4 const _E_l_e_m_e_n_t& _e_l_e_m_e_n_t() const │ │ │ │ │ 105 { │ │ │ │ │ -106 switch(k) │ │ │ │ │ -107 { │ │ │ │ │ -108 case 0: │ │ │ │ │ -109 _e_v_a_l_u_a_t_e_F_u_n_c_t_i_o_n(in, out); │ │ │ │ │ -110 break; │ │ │ │ │ -111 case 1: │ │ │ │ │ -112 { │ │ │ │ │ -113 FieldVector globalIn = offset_; │ │ │ │ │ -114 scaling_.umv(in,globalIn); │ │ │ │ │ -115 │ │ │ │ │ -116 preBasis_.evaluate(directions, globalIn, out, lFE_.currentKnotSpan_); │ │ │ │ │ +106 return *_e_l_e_m_e_n_t__; │ │ │ │ │ +107 } │ │ │ │ │ +108 │ │ │ │ │ +_1_1_3 void _u_n_b_i_n_d() │ │ │ │ │ +114 { │ │ │ │ │ +115 _e_l_e_m_e_n_t__.reset(); │ │ │ │ │ +116 } │ │ │ │ │ 117 │ │ │ │ │ -118 for (size_t i=0; i globalIn = offset_; │ │ │ │ │ -125 scaling_.umv(in,globalIn); │ │ │ │ │ +124 return _t_r_e_e__; │ │ │ │ │ +125 } │ │ │ │ │ 126 │ │ │ │ │ -127 preBasis_.evaluate(directions, globalIn, out, lFE_.currentKnotSpan_); │ │ │ │ │ -128 │ │ │ │ │ -129 for (size_t i=0; i& preBasis_; │ │ │ │ │ -159 │ │ │ │ │ -160 const _B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_<_G_V_,_R_>& lFE_; │ │ │ │ │ -161 │ │ │ │ │ -162 // Coordinates in a single knot span differ from coordinates on the B- │ │ │ │ │ -spline patch │ │ │ │ │ -163 // by an affine transformation. This transformation is stored in offset_ │ │ │ │ │ -and scaling_. │ │ │ │ │ -164 FieldVector offset_; │ │ │ │ │ -165 DiagonalMatrix scaling_; │ │ │ │ │ -166}; │ │ │ │ │ -167 │ │ │ │ │ -181template │ │ │ │ │ -_1_8_2class _B_S_p_l_i_n_e_L_o_c_a_l_C_o_e_f_f_i_c_i_e_n_t_s │ │ │ │ │ -183{ │ │ │ │ │ -184 // Return i as a d-digit number in the (k+1)-nary system │ │ │ │ │ -185 std::array multiindex (unsigned int i) const │ │ │ │ │ -186 { │ │ │ │ │ -187 std::array alpha; │ │ │ │ │ -188 for (int j=0; j& subEntity) │ │ │ │ │ -198 { │ │ │ │ │ -199 if (sizes_[0]==1) │ │ │ │ │ -200 { │ │ │ │ │ -201 subEntity[0] = 0; │ │ │ │ │ -202 return; │ │ │ │ │ -203 } │ │ │ │ │ -204 │ │ │ │ │ -205 /* edge and vertex numbering │ │ │ │ │ -206 0----0----1 │ │ │ │ │ -207 */ │ │ │ │ │ -208 unsigned lastIndex=0; │ │ │ │ │ -209 subEntity[lastIndex++] = 0; // corner 0 │ │ │ │ │ -210 for (unsigned i = 0; i < sizes_[0] - 2; ++i) │ │ │ │ │ -211 subEntity[lastIndex++] = 0; // inner dofs of element (0) │ │ │ │ │ -212 │ │ │ │ │ -213 subEntity[lastIndex++] = 1; // corner 1 │ │ │ │ │ -214 │ │ │ │ │ -215 assert(_s_i_z_e()==lastIndex); │ │ │ │ │ -216 } │ │ │ │ │ -217 │ │ │ │ │ -218 void setup2d(std::vector& subEntity) │ │ │ │ │ -219 { │ │ │ │ │ -220 unsigned lastIndex=0; │ │ │ │ │ -221 │ │ │ │ │ -222 // LocalKey: entity number , entity codim, dof indices within each entity │ │ │ │ │ -223 /* edge and vertex numbering │ │ │ │ │ -224 2----3----3 │ │ │ │ │ -225 | | │ │ │ │ │ -226 | | │ │ │ │ │ -227 0 1 │ │ │ │ │ -228 | | │ │ │ │ │ -229 | | │ │ │ │ │ -230 0----2----1 │ │ │ │ │ -231 */ │ │ │ │ │ -232 │ │ │ │ │ -233 // lower edge (2) │ │ │ │ │ -234 subEntity[lastIndex++] = 0; // corner 0 │ │ │ │ │ -235 for (unsigned i = 0; i < sizes_[0]-2; ++i) │ │ │ │ │ -236 subEntity[lastIndex++] = 2; // inner dofs of lower edge (2) │ │ │ │ │ -237 │ │ │ │ │ -238 subEntity[lastIndex++] = 1; // corner 1 │ │ │ │ │ -239 │ │ │ │ │ -240 // iterate from bottom to top over inner edge dofs │ │ │ │ │ -241 for (unsigned e = 0; e < sizes_[1]-2; ++e) │ │ │ │ │ -242 { │ │ │ │ │ -243 subEntity[lastIndex++] = 0; // left edge (0) │ │ │ │ │ -244 for (unsigned i = 0; i < sizes_[0]-2; ++i) │ │ │ │ │ -245 subEntity[lastIndex++] = 0; // face dofs │ │ │ │ │ -246 subEntity[lastIndex++] = 1; // right edge (1) │ │ │ │ │ -247 } │ │ │ │ │ -248 │ │ │ │ │ -249 // upper edge (3) │ │ │ │ │ -250 subEntity[lastIndex++] = 2; // corner 2 │ │ │ │ │ -251 for (unsigned i = 0; i < sizes_[0]-2; ++i) │ │ │ │ │ -252 subEntity[lastIndex++] = 3; // inner dofs of upper edge (3) │ │ │ │ │ -253 │ │ │ │ │ -254 subEntity[lastIndex++] = 3; // corner 3 │ │ │ │ │ -255 │ │ │ │ │ -256 assert(_s_i_z_e()==lastIndex); │ │ │ │ │ -257 } │ │ │ │ │ -258 │ │ │ │ │ -259 │ │ │ │ │ -260public: │ │ │ │ │ -_2_6_1 void _i_n_i_t(const std::array& sizes) │ │ │ │ │ -262 { │ │ │ │ │ -263 sizes_ = sizes; │ │ │ │ │ -264 │ │ │ │ │ -265 li_.resize(_s_i_z_e()); │ │ │ │ │ -266 │ │ │ │ │ -267 // Set up array of codimension-per-dof-number │ │ │ │ │ -268 std::vector codim(li_.size()); │ │ │ │ │ -269 │ │ │ │ │ -270 for (std::size_t i=0; i mIdx = multiindex(i); │ │ │ │ │ -276 for (int j=0; j index(_s_i_z_e()); │ │ │ │ │ -287 │ │ │ │ │ -288 for (std::size_t i=0; i mIdx = multiindex(i); │ │ │ │ │ -293 │ │ │ │ │ -294 for (int j=dim-1; j>=0; j--) │ │ │ │ │ -295 if (mIdx[j]>0 and mIdx[j] subEntity(li_.size()); │ │ │ │ │ -301 │ │ │ │ │ -302 if (subEntity.size() > 0) │ │ │ │ │ -303 { │ │ │ │ │ -304 if (dim==1) { │ │ │ │ │ -305 │ │ │ │ │ -306 setup1d(subEntity); │ │ │ │ │ -307 │ │ │ │ │ -308 } else if (dim==2 and sizes_[0]>1 and sizes_[1]>1) { │ │ │ │ │ -309 │ │ │ │ │ -310 setup2d(subEntity); │ │ │ │ │ -311 │ │ │ │ │ -312 } │ │ │ │ │ -313 } │ │ │ │ │ -314 │ │ │ │ │ -315 for (size_t i=0; i()); │ │ │ │ │ -323 } │ │ │ │ │ -324 │ │ │ │ │ -_3_2_6 const LocalKey& _l_o_c_a_l_K_e_y (std::size_t i) const │ │ │ │ │ -327 { │ │ │ │ │ -328 return li_[i]; │ │ │ │ │ -329 } │ │ │ │ │ -330 │ │ │ │ │ -331private: │ │ │ │ │ -332 │ │ │ │ │ -333 // Number of shape functions on this element per coordinate direction │ │ │ │ │ -334 std::array sizes_; │ │ │ │ │ -335 │ │ │ │ │ -336 std::vector li_; │ │ │ │ │ -337}; │ │ │ │ │ -338 │ │ │ │ │ -343template │ │ │ │ │ -_3_4_4class _B_S_p_l_i_n_e_L_o_c_a_l_I_n_t_e_r_p_o_l_a_t_i_o_n │ │ │ │ │ -345{ │ │ │ │ │ -346public: │ │ │ │ │ -348 template │ │ │ │ │ -_3_4_9 void _i_n_t_e_r_p_o_l_a_t_e (const F& f, std::vector& out) const │ │ │ │ │ -350 { │ │ │ │ │ -351 DUNE_THROW(NotImplemented, "BSplineLocalInterpolation::interpolate"); │ │ │ │ │ -352 } │ │ │ │ │ -353 │ │ │ │ │ -354}; │ │ │ │ │ -355 │ │ │ │ │ -365template │ │ │ │ │ -_3_6_6class _B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ -367{ │ │ │ │ │ -_3_6_8 typedef typename GV::ctype D; │ │ │ │ │ -369 enum {dim = GV::dimension}; │ │ │ │ │ -370 friend class _B_S_p_l_i_n_e_L_o_c_a_l_B_a_s_i_s; │ │ │ │ │ -371public: │ │ │ │ │ -372 │ │ │ │ │ -375 typedef LocalFiniteElementTraits, │ │ │ │ │ -376 _B_S_p_l_i_n_e_L_o_c_a_l_C_o_e_f_f_i_c_i_e_n_t_s_<_d_i_m_>, │ │ │ │ │ -_3_7_7 _B_S_p_l_i_n_e_L_o_c_a_l_I_n_t_e_r_p_o_l_a_t_i_o_n_<_d_i_m_,_B_S_p_l_i_n_e_L_o_c_a_l_B_a_s_i_s_<_G_V_,_R_> > > _T_r_a_i_t_s; │ │ │ │ │ -378 │ │ │ │ │ -_3_8_1 _B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t(const _B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_<_G_V_>& preBasis) │ │ │ │ │ -382 : _p_r_e_B_a_s_i_s__(preBasis), │ │ │ │ │ -383 _l_o_c_a_l_B_a_s_i_s__(preBasis,*this) │ │ │ │ │ -384 {} │ │ │ │ │ -385 │ │ │ │ │ -_3_8_8 _B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t(const _B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t& other) │ │ │ │ │ -389 : _p_r_e_B_a_s_i_s__(other._p_r_e_B_a_s_i_s__), │ │ │ │ │ -390 _l_o_c_a_l_B_a_s_i_s__(_p_r_e_B_a_s_i_s__,*this) │ │ │ │ │ -391 {} │ │ │ │ │ -392 │ │ │ │ │ -_3_9_9 void _b_i_n_d(const std::array& elementIdx) │ │ │ │ │ -400 { │ │ │ │ │ -401 /* \todo In the long run we need to precompute a table for this */ │ │ │ │ │ -402 for (size_t i=0; i sizes; │ │ │ │ │ -426 for (size_t i=0; i& _l_o_c_a_l_B_a_s_i_s() const │ │ │ │ │ -433 { │ │ │ │ │ -434 return _l_o_c_a_l_B_a_s_i_s__; │ │ │ │ │ -435 } │ │ │ │ │ -436 │ │ │ │ │ -_4_3_8 const _B_S_p_l_i_n_e_L_o_c_a_l_C_o_e_f_f_i_c_i_e_n_t_s_<_d_i_m_>& _l_o_c_a_l_C_o_e_f_f_i_c_i_e_n_t_s() const │ │ │ │ │ -439 { │ │ │ │ │ -440 return _l_o_c_a_l_C_o_e_f_f_i_c_i_e_n_t_s__; │ │ │ │ │ -441 } │ │ │ │ │ -442 │ │ │ │ │ -_4_4_4 const _B_S_p_l_i_n_e_L_o_c_a_l_I_n_t_e_r_p_o_l_a_t_i_o_n_<_d_i_m_,_B_S_p_l_i_n_e_L_o_c_a_l_B_a_s_i_s_<_G_V_,_R_> >& │ │ │ │ │ -_l_o_c_a_l_I_n_t_e_r_p_o_l_a_t_i_o_n() const │ │ │ │ │ -445 { │ │ │ │ │ -446 return _l_o_c_a_l_I_n_t_e_r_p_o_l_a_t_i_o_n__; │ │ │ │ │ -447 } │ │ │ │ │ -448 │ │ │ │ │ -_4_5_0 unsigned _s_i_z_e () const │ │ │ │ │ -451 { │ │ │ │ │ -452 std::size_t r = 1; │ │ │ │ │ -453 for (int i=0; i (_p_r_e_B_a_s_i_s__.knotVectors_[i].size() - _c_u_r_r_e_n_t_K_n_o_t_S_p_a_n__[i] - │ │ │ │ │ -2) ) │ │ │ │ │ -475 r -= order[i] - (_p_r_e_B_a_s_i_s__.knotVectors_[i].size() - _c_u_r_r_e_n_t_K_n_o_t_S_p_a_n__[i] - │ │ │ │ │ -2); │ │ │ │ │ -476 return r; │ │ │ │ │ -477 } │ │ │ │ │ -478 │ │ │ │ │ -_4_7_9 const _B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_<_G_V_>& _p_r_e_B_a_s_i_s__; │ │ │ │ │ -480 │ │ │ │ │ -_4_8_1 _B_S_p_l_i_n_e_L_o_c_a_l_B_a_s_i_s_<_G_V_,_R_> _l_o_c_a_l_B_a_s_i_s__; │ │ │ │ │ -_4_8_2 _B_S_p_l_i_n_e_L_o_c_a_l_C_o_e_f_f_i_c_i_e_n_t_s_<_d_i_m_> _l_o_c_a_l_C_o_e_f_f_i_c_i_e_n_t_s__; │ │ │ │ │ -_4_8_3 _B_S_p_l_i_n_e_L_o_c_a_l_I_n_t_e_r_p_o_l_a_t_i_o_n_<_d_i_m_,_B_S_p_l_i_n_e_L_o_c_a_l_B_a_s_i_s_<_G_V_,_R_> > │ │ │ │ │ -_l_o_c_a_l_I_n_t_e_r_p_o_l_a_t_i_o_n__; │ │ │ │ │ -484 │ │ │ │ │ -485 // The knot span we are bound to │ │ │ │ │ -_4_8_6 std::array _c_u_r_r_e_n_t_K_n_o_t_S_p_a_n__; │ │ │ │ │ -487}; │ │ │ │ │ -488 │ │ │ │ │ -489 │ │ │ │ │ -490template │ │ │ │ │ -491class _B_S_p_l_i_n_e_N_o_d_e; │ │ │ │ │ -492 │ │ │ │ │ -502template │ │ │ │ │ -_5_0_3class _B_S_p_l_i_n_e_P_r_e_B_a_s_i_s : │ │ │ │ │ -504 public _L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n< BSplinePreBasis > │ │ │ │ │ -505{ │ │ │ │ │ -506 using _B_a_s_e = _L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n_<_ _B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_<_G_V_> >; │ │ │ │ │ -507 │ │ │ │ │ -508 static const int dim = GV::dimension; │ │ │ │ │ -509 │ │ │ │ │ -511 class MultiDigitCounter │ │ │ │ │ -512 { │ │ │ │ │ -513 public: │ │ │ │ │ -514 │ │ │ │ │ -518 MultiDigitCounter(const std::array& limits) │ │ │ │ │ -519 : limits_(limits) │ │ │ │ │ -520 { │ │ │ │ │ -521 std::fill(counter_.begin(), counter_.end(), 0); │ │ │ │ │ -522 } │ │ │ │ │ -523 │ │ │ │ │ -525 MultiDigitCounter& operator++() │ │ │ │ │ -526 { │ │ │ │ │ -527 for (int i=0; i limits_; │ │ │ │ │ -559 │ │ │ │ │ -561 std::array counter_; │ │ │ │ │ -562 │ │ │ │ │ -563 }; │ │ │ │ │ -564 │ │ │ │ │ -565public: │ │ │ │ │ -566 │ │ │ │ │ -_5_6_8 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ -_5_6_9 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ -570 │ │ │ │ │ -_5_7_1 using _N_o_d_e = _B_S_p_l_i_n_e_N_o_d_e_<_G_V_>; │ │ │ │ │ -572 │ │ │ │ │ -573 // Type used for function values │ │ │ │ │ -_5_7_4 using _R = double; │ │ │ │ │ -575 │ │ │ │ │ -_5_9_4 _B_S_p_l_i_n_e_P_r_e_B_a_s_i_s(const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w, │ │ │ │ │ -595 const std::vector& knotVector, │ │ │ │ │ -596 unsigned int order, │ │ │ │ │ -597 bool makeOpen = true) │ │ │ │ │ -598 : _g_r_i_d_V_i_e_w__(_g_r_i_d_V_i_e_w) │ │ │ │ │ -599 { │ │ │ │ │ -600 // \todo Detection of duplicate knots │ │ │ │ │ -601 std::fill(_e_l_e_m_e_n_t_s__.begin(), _e_l_e_m_e_n_t_s__.end(), knotVector.size()-1); │ │ │ │ │ -602 │ │ │ │ │ -603 // Mediocre sanity check: we don't know the number of grid elements in each │ │ │ │ │ -direction. │ │ │ │ │ -604 // but at least we know the total number of elements. │ │ │ │ │ -605 assert( std::accumulate(_e_l_e_m_e_n_t_s__.begin(), _e_l_e_m_e_n_t_s__.end(), 1, std:: │ │ │ │ │ -multiplies()) == _g_r_i_d_V_i_e_w__.size(0) ); │ │ │ │ │ -606 │ │ │ │ │ -607 for (int i=0; i& lowerLeft, │ │ │ │ │ -648 const FieldVector& upperRight, │ │ │ │ │ -649 const std::array& elements, │ │ │ │ │ -650 unsigned int order, │ │ │ │ │ -651 bool makeOpen = true) │ │ │ │ │ -652 : _e_l_e_m_e_n_t_s__(elements), │ │ │ │ │ -653 _g_r_i_d_V_i_e_w__(_g_r_i_d_V_i_e_w) │ │ │ │ │ -654 { │ │ │ │ │ -655 // Mediocre sanity check: we don't know the number of grid elements in each │ │ │ │ │ -direction. │ │ │ │ │ -656 // but at least we know the total number of elements. │ │ │ │ │ -657 assert( std::accumulate(_e_l_e_m_e_n_t_s__.begin(), _e_l_e_m_e_n_t_s__.end(), 1, std:: │ │ │ │ │ -multiplies()) == _g_r_i_d_V_i_e_w__.size(0) ); │ │ │ │ │ -658 │ │ │ │ │ -659 for (int i=0; i │ │ │ │ │ -_7_1_4 It _i_n_d_i_c_e_s(const _N_o_d_e& node, It it) const │ │ │ │ │ -715 { │ │ │ │ │ -716 // Local degrees of freedom are arranged in a lattice. │ │ │ │ │ -717 // We need the lattice dimensions to be able to compute lattice coordinates │ │ │ │ │ -from a local index │ │ │ │ │ -718 std::array localSizes; │ │ │ │ │ -719 for (int i=0; i localIJK = _g_e_t_I_J_K(i, localSizes); │ │ │ │ │ -724 │ │ │ │ │ -725 const auto currentKnotSpan = node._f_i_n_i_t_e_E_l_e_m_e_n_t()._c_u_r_r_e_n_t_K_n_o_t_S_p_a_n__; │ │ │ │ │ -726 const auto order = _o_r_d_e_r__; │ │ │ │ │ -727 │ │ │ │ │ -728 std::array globalIJK; │ │ │ │ │ -729 for (int i=0; i=0; i--) │ │ │ │ │ -736 globalIdx = globalIdx * _s_i_z_e(i) + globalIJK[i]; │ │ │ │ │ -737 │ │ │ │ │ -738 *it = {{globalIdx}}; │ │ │ │ │ -739 } │ │ │ │ │ -740 return it; │ │ │ │ │ -741 } │ │ │ │ │ -742 │ │ │ │ │ -_7_4_4 unsigned int _d_i_m_e_n_s_i_o_n () const │ │ │ │ │ -745 { │ │ │ │ │ -746 unsigned int result = 1; │ │ │ │ │ -747 for (size_t i=0; i& in, │ │ │ │ │ -763 std::vector >& out, │ │ │ │ │ -764 const std::array& currentKnotSpan) const │ │ │ │ │ -765 { │ │ │ │ │ -766 // Evaluate │ │ │ │ │ -767 std::array, dim> oneDValues; │ │ │ │ │ -768 │ │ │ │ │ -769 for (size_t i=0; i limits; │ │ │ │ │ -773 for (int i=0; i& in, │ │ │ │ │ -794 std::vector >& out, │ │ │ │ │ -795 const std::array& currentKnotSpan) const │ │ │ │ │ -796 { │ │ │ │ │ -797 // How many shape functions to we have in each coordinate direction? │ │ │ │ │ -798 std::array limits; │ │ │ │ │ -799 for (int i=0; i (_k_n_o_t_V_e_c_t_o_r_s__[i]._s_i_z_e() - currentKnotSpan[i] - 2) ) │ │ │ │ │ -805 limits[i] -= _o_r_d_e_r__[i] - (_k_n_o_t_V_e_c_t_o_r_s__[i]._s_i_z_e() - currentKnotSpan[i] - 2); │ │ │ │ │ -806 } │ │ │ │ │ -807 │ │ │ │ │ -808 // The lowest knot spans that we need values from │ │ │ │ │ -809 std::array offset; │ │ │ │ │ -810 for (int i=0; i, dim> oneDValues; │ │ │ │ │ -815 │ │ │ │ │ -816 // Evaluate 1d function values of one order lower (needed for the │ │ │ │ │ -derivative formula) │ │ │ │ │ -817 std::array, dim> lowOrderOneDValues; │ │ │ │ │ -818 │ │ │ │ │ -819 std::array, dim> values; │ │ │ │ │ -820 │ │ │ │ │ -821 for (size_t i=0; i, dim> oneDDerivatives; │ │ │ │ │ -839 for (size_t i=0; i, dim> oneDValuesShort; │ │ │ │ │ -864 │ │ │ │ │ -865 for (int i=0; i │ │ │ │ │ -_8_9_4 void _e_v_a_l_u_a_t_e(const typename std::array& directions, │ │ │ │ │ -895 const FieldVector& in, │ │ │ │ │ -896 std::vector >& out, │ │ │ │ │ -897 const std::array& currentKnotSpan) const │ │ │ │ │ -898 { │ │ │ │ │ -899 if (k != 1 && k != 2) │ │ │ │ │ -900 DUNE_THROW(RangeError, "Differentiation order greater than 2 is not │ │ │ │ │ -supported!"); │ │ │ │ │ -901 │ │ │ │ │ -902 // Evaluate 1d function values (needed for the product rule) │ │ │ │ │ -903 std::array, dim> oneDValues; │ │ │ │ │ -904 std::array, dim> oneDDerivatives; │ │ │ │ │ -905 std::array, dim> oneDSecondDerivatives; │ │ │ │ │ -906 │ │ │ │ │ -907 // Evaluate 1d function derivatives │ │ │ │ │ -908 if (k==1) │ │ │ │ │ -909 for (size_t i=0; i offset; │ │ │ │ │ -917 for (int i=0; i limits; │ │ │ │ │ -922 for (int i=0; i (_k_n_o_t_V_e_c_t_o_r_s__[i]._s_i_z_e() - currentKnotSpan[i] - 2) ) │ │ │ │ │ -930 limits[i] -= _o_r_d_e_r__[i] - (_k_n_o_t_V_e_c_t_o_r_s__[i]._s_i_z_e() - currentKnotSpan[i] - 2); │ │ │ │ │ -931 } │ │ │ │ │ -932 │ │ │ │ │ -933 // Working towards computing only the parts that we really need: │ │ │ │ │ -934 // Let's copy them out into a separate array │ │ │ │ │ -935 std::array, dim> oneDValuesShort; │ │ │ │ │ -936 │ │ │ │ │ -937 for (int i=0; i _g_e_t_I_J_K(typename GridView::IndexSet:: │ │ │ │ │ -IndexType idx, std::array elements) │ │ │ │ │ -991 { │ │ │ │ │ -992 std::array result; │ │ │ │ │ -993 for (int i=0; i& out, │ │ │ │ │ -1010 const std::vector& knotVector, │ │ │ │ │ -1011 unsigned int order, │ │ │ │ │ -1012 unsigned int currentKnotSpan) │ │ │ │ │ -1013 { │ │ │ │ │ -1014 std::size_t outSize = order+1; // The 'standard' value away from the │ │ │ │ │ -boundaries of the knot vector │ │ │ │ │ -1015 if (currentKnotSpan (knotVector.size() - currentKnotSpan - 2) ) │ │ │ │ │ -1018 outSize -= order - (knotVector.size() - currentKnotSpan - 2); │ │ │ │ │ -1019 out.resize(outSize); │ │ │ │ │ -1020 │ │ │ │ │ -1021 // It's not really a matrix that is needed here, a plain 2d array would do │ │ │ │ │ -1022 DynamicMatrix N(order+1, knotVector.size()-1); │ │ │ │ │ -1023 │ │ │ │ │ -1024 // The text books on splines use the following geometric condition here to │ │ │ │ │ -fill the array N │ │ │ │ │ -1025 // (see for example Cottrell, Hughes, Bazilevs, Formula (2.1). However, │ │ │ │ │ -this condition │ │ │ │ │ -1026 // only works if splines are never evaluated exactly on the knots. │ │ │ │ │ -1027 // │ │ │ │ │ -1028 // for (size_t i=0; i 1e-10) │ │ │ │ │ -1037 ? (in - knotVector[i]) / (knotVector[i+r] - knotVector[i]) │ │ │ │ │ -1038 : 0; │ │ │ │ │ -1039 _R factor2 = ((knotVector[i+r+1] - knotVector[i+1]) > 1e-10) │ │ │ │ │ -1040 ? (knotVector[i+r+1] - in) / (knotVector[i+r+1] - knotVector[i+1]) │ │ │ │ │ -1041 : 0; │ │ │ │ │ -1042 N[r][i] = factor1 * N[r-1][i] + factor2 * N[r-1][i+1]; │ │ │ │ │ -1043 } │ │ │ │ │ -1044 │ │ │ │ │ -1049 for (size_t i=0; i& out, │ │ │ │ │ -1068 const std::vector& knotVector, │ │ │ │ │ -1069 unsigned int order, │ │ │ │ │ -1070 unsigned int currentKnotSpan) │ │ │ │ │ -1071 { │ │ │ │ │ -1072 // It's not really a matrix that is needed here, a plain 2d array would do │ │ │ │ │ -1073 DynamicMatrix& N = out; │ │ │ │ │ -1074 │ │ │ │ │ -1075 N.resize(order+1, knotVector.size()-1); │ │ │ │ │ -1076 │ │ │ │ │ -1077 // The text books on splines use the following geometric condition here to │ │ │ │ │ -fill the array N │ │ │ │ │ -1078 // (see for example Cottrell, Hughes, Bazilevs, Formula (2.1). However, │ │ │ │ │ -this condition │ │ │ │ │ -1079 // only works if splines are never evaluated exactly on the knots. │ │ │ │ │ -1080 // │ │ │ │ │ -1081 // for (size_t i=0; i 1e-10) │ │ │ │ │ -1090 ? (in - knotVector[i]) / (knotVector[i+r] - knotVector[i]) │ │ │ │ │ -1091 : 0; │ │ │ │ │ -1092 _R factor2 = ((knotVector[i+r+1] - knotVector[i+1]) > 1e-10) │ │ │ │ │ -1093 ? (knotVector[i+r+1] - in) / (knotVector[i+r+1] - knotVector[i+1]) │ │ │ │ │ -1094 : 0; │ │ │ │ │ -1095 N[r][i] = factor1 * N[r-1][i] + factor2 * N[r-1][i+1]; │ │ │ │ │ -1096 } │ │ │ │ │ -1097 } │ │ │ │ │ -1098 │ │ │ │ │ -1099 │ │ │ │ │ -_1_1_0_9 static void _e_v_a_l_u_a_t_e_A_l_l(const typename GV::ctype& in, │ │ │ │ │ -1110 std::vector& out, │ │ │ │ │ -1111 bool _e_v_a_l_u_a_t_e_J_a_c_o_b_i_a_n, std::vector& outJac, │ │ │ │ │ -1112 bool evaluateHessian, std::vector& outHess, │ │ │ │ │ -1113 const std::vector& knotVector, │ │ │ │ │ -1114 unsigned int order, │ │ │ │ │ -1115 unsigned int currentKnotSpan) │ │ │ │ │ -1116 { │ │ │ │ │ -1117 // How many shape functions to we have in each coordinate direction? │ │ │ │ │ -1118 unsigned int limit; │ │ │ │ │ -1119 limit = order+1; // The 'standard' value away from the boundaries of the │ │ │ │ │ -knot vector │ │ │ │ │ -1120 if (currentKnotSpan (knotVector.size() - currentKnotSpan - 2) ) │ │ │ │ │ -1123 limit -= order - (knotVector.size() - currentKnotSpan - 2); │ │ │ │ │ -1124 │ │ │ │ │ -1125 // The lowest knot spans that we need values from │ │ │ │ │ -1126 unsigned int offset; │ │ │ │ │ -1127 offset = std::max((int)(currentKnotSpan - order),0); │ │ │ │ │ -1128 │ │ │ │ │ -1129 // Evaluate 1d function values (needed for the product rule) │ │ │ │ │ -1130 DynamicMatrix values; │ │ │ │ │ -1131 │ │ │ │ │ -1132 _e_v_a_l_u_a_t_e_F_u_n_c_t_i_o_n_F_u_l_l(in, values, knotVector, order, currentKnotSpan); │ │ │ │ │ -1133 │ │ │ │ │ -1134 out.resize(knotVector.size()-order-1); │ │ │ │ │ -1135 for (size_t j=0; j lowOrderOneDValues; │ │ │ │ │ -1140 │ │ │ │ │ -1141 if (order!=0) │ │ │ │ │ -1142 { │ │ │ │ │ -1143 lowOrderOneDValues.resize(knotVector.size()-(order-1)-1); │ │ │ │ │ -1144 for (size_t j=0; j lowOrderTwoDValues; │ │ │ │ │ -1150 │ │ │ │ │ -1151 if (order>1 && evaluateHessian) │ │ │ │ │ -1152 { │ │ │ │ │ -1153 lowOrderTwoDValues.resize(knotVector.size()-(order-2)-1); │ │ │ │ │ -1154 for (size_t j=0; j _o_r_d_e_r__; │ │ │ │ │ -1216 │ │ │ │ │ -_1_2_1_8 std::array, dim> _k_n_o_t_V_e_c_t_o_r_s__; │ │ │ │ │ -1219 │ │ │ │ │ -_1_2_2_1 std::array _e_l_e_m_e_n_t_s__; │ │ │ │ │ -1222 │ │ │ │ │ -_1_2_2_3 _G_r_i_d_V_i_e_w _g_r_i_d_V_i_e_w__; │ │ │ │ │ -1224}; │ │ │ │ │ -1225 │ │ │ │ │ -1226 │ │ │ │ │ -1227 │ │ │ │ │ -1228template │ │ │ │ │ -_1_2_2_9class _B_S_p_l_i_n_e_N_o_d_e : │ │ │ │ │ -1230 public _L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ -1231{ │ │ │ │ │ -1232 static const int dim = GV::dimension; │ │ │ │ │ -1233 │ │ │ │ │ -1234public: │ │ │ │ │ -1235 │ │ │ │ │ -_1_2_3_6 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ -_1_2_3_7 using _E_l_e_m_e_n_t = typename GV::template Codim<0>::Entity; │ │ │ │ │ -_1_2_3_8 using _F_i_n_i_t_e_E_l_e_m_e_n_t = _B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_<_G_V_,_d_o_u_b_l_e_>; │ │ │ │ │ -1239 │ │ │ │ │ -_1_2_4_0 _B_S_p_l_i_n_e_N_o_d_e(const _B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_<_G_V_>* preBasis) : │ │ │ │ │ -1241 _p_r_e_B_a_s_i_s__(preBasis), │ │ │ │ │ -1242 _f_i_n_i_t_e_E_l_e_m_e_n_t__(*preBasis) │ │ │ │ │ -1243 {} │ │ │ │ │ -1244 │ │ │ │ │ -_1_2_4_6 const _E_l_e_m_e_n_t& _e_l_e_m_e_n_t() const │ │ │ │ │ -1247 { │ │ │ │ │ -1248 return _e_l_e_m_e_n_t__; │ │ │ │ │ -1249 } │ │ │ │ │ -1250 │ │ │ │ │ -_1_2_5_5 const _F_i_n_i_t_e_E_l_e_m_e_n_t& _f_i_n_i_t_e_E_l_e_m_e_n_t() const │ │ │ │ │ -1256 { │ │ │ │ │ -1257 return _f_i_n_i_t_e_E_l_e_m_e_n_t__; │ │ │ │ │ -1258 } │ │ │ │ │ -1259 │ │ │ │ │ -_1_2_6_1 void _b_i_n_d(const _E_l_e_m_e_n_t& e) │ │ │ │ │ -1262 { │ │ │ │ │ -1263 _e_l_e_m_e_n_t__ = e; │ │ │ │ │ -1264 auto elementIndex = _p_r_e_B_a_s_i_s__->gridView().indexSet().index(e); │ │ │ │ │ -1265 _f_i_n_i_t_e_E_l_e_m_e_n_t__._b_i_n_d(_p_r_e_B_a_s_i_s__->getIJK(elementIndex,_p_r_e_B_a_s_i_s__->elements_)); │ │ │ │ │ -1266 this->_s_e_t_S_i_z_e(_f_i_n_i_t_e_E_l_e_m_e_n_t__._s_i_z_e()); │ │ │ │ │ -1267 } │ │ │ │ │ -1268 │ │ │ │ │ -1269protected: │ │ │ │ │ -1270 │ │ │ │ │ -_1_2_7_1 const _B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_<_G_V_>* _p_r_e_B_a_s_i_s__; │ │ │ │ │ -1272 │ │ │ │ │ -_1_2_7_3 _F_i_n_i_t_e_E_l_e_m_e_n_t _f_i_n_i_t_e_E_l_e_m_e_n_t__; │ │ │ │ │ -_1_2_7_4 _E_l_e_m_e_n_t _e_l_e_m_e_n_t__; │ │ │ │ │ -1275}; │ │ │ │ │ -1276 │ │ │ │ │ -1277 │ │ │ │ │ -1278 │ │ │ │ │ -1279namespace BasisFactory { │ │ │ │ │ -1280 │ │ │ │ │ -_1_2_8_7inline auto _b_S_p_l_i_n_e(const std::vector& knotVector, │ │ │ │ │ -1288 unsigned int order, │ │ │ │ │ -1289 bool makeOpen = true) │ │ │ │ │ -1290{ │ │ │ │ │ -1291 return [&knotVector, order, makeOpen](const auto& gridView) { │ │ │ │ │ -1292 return _B_S_p_l_i_n_e_P_r_e_B_a_s_i_s>(gridView, │ │ │ │ │ -knotVector, order, makeOpen); │ │ │ │ │ -1293 }; │ │ │ │ │ -1294} │ │ │ │ │ -1295 │ │ │ │ │ -1296} // end namespace BasisFactory │ │ │ │ │ -1297 │ │ │ │ │ -1298/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ -1299// This is the actual global basis implementation based on the reusable │ │ │ │ │ -parts. │ │ │ │ │ -1300/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ -1301 │ │ │ │ │ -1308template │ │ │ │ │ -_1_3_0_9using _B_S_p_l_i_n_e_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_<_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_<_G_V_> >; │ │ │ │ │ -1310 │ │ │ │ │ -1311 │ │ │ │ │ -1312} // namespace Functions │ │ │ │ │ -1313 │ │ │ │ │ -1314} // namespace Dune │ │ │ │ │ -1315 │ │ │ │ │ -1316#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BSPLINEBASIS_HH │ │ │ │ │ -_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h │ │ │ │ │ -_n_o_d_e_s_._h_h │ │ │ │ │ -_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_b_S_p_l_i_n_e │ │ │ │ │ -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. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:1287 │ │ │ │ │ +133 │ │ │ │ │ +_1_4_0 _s_i_z_e___t_y_p_e _m_a_x_S_i_z_e() const │ │ │ │ │ +141 { │ │ │ │ │ +142 return _g_l_o_b_a_l_B_a_s_i_s__->preBasis().maxNodeSize(); │ │ │ │ │ +143 } │ │ │ │ │ +144 │ │ │ │ │ +_1_4_6 const _M_u_l_t_i_I_n_d_e_x& _i_n_d_e_x(_s_i_z_e___t_y_p_e i) const │ │ │ │ │ +147 { │ │ │ │ │ +148 return _i_n_d_i_c_e_s__[i]; │ │ │ │ │ +149 } │ │ │ │ │ +150 │ │ │ │ │ +_1_5_3 const _G_l_o_b_a_l_B_a_s_i_s& _g_l_o_b_a_l_B_a_s_i_s() const │ │ │ │ │ +154 { │ │ │ │ │ +155 return *_g_l_o_b_a_l_B_a_s_i_s__; │ │ │ │ │ +156 } │ │ │ │ │ +157 │ │ │ │ │ +_1_5_8 const _D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w& _r_o_o_t_L_o_c_a_l_V_i_e_w() const │ │ │ │ │ +159 { │ │ │ │ │ +160 return *this; │ │ │ │ │ +161 } │ │ │ │ │ +162 │ │ │ │ │ +163protected: │ │ │ │ │ +_1_6_4 const _G_l_o_b_a_l_B_a_s_i_s* _g_l_o_b_a_l_B_a_s_i_s__; │ │ │ │ │ +_1_6_5 std::optional _e_l_e_m_e_n_t__; │ │ │ │ │ +_1_6_6 _T_r_e_e _t_r_e_e__; │ │ │ │ │ +_1_6_7 std::vector _i_n_d_i_c_e_s__; │ │ │ │ │ +168}; │ │ │ │ │ +169 │ │ │ │ │ +170 │ │ │ │ │ +171 │ │ │ │ │ +172} // end namespace Functions │ │ │ │ │ +173} // end namespace Dune │ │ │ │ │ +174 │ │ │ │ │ +175 │ │ │ │ │ +176 │ │ │ │ │ +177#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALVIEW_HH │ │ │ │ │ +_m_u_l_t_i_i_n_d_e_x_._h_h │ │ │ │ │ +_o_v_e_r_f_l_o_w_a_r_r_a_y_._h_h │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ -LocalFiniteElement in the sense of dune-localfunctions, for the B-spline basis │ │ │ │ │ -on tensor-product grid... │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:367 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_:_:_B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ -BSplineLocalFiniteElement(const BSplineLocalFiniteElement &other) │ │ │ │ │ -Copy constructor. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:388 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_:_:_p_r_e_B_a_s_i_s__ │ │ │ │ │ -const BSplinePreBasis< GV > & preBasis_ │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:479 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_:_:_l_o_c_a_l_I_n_t_e_r_p_o_l_a_t_i_o_n │ │ │ │ │ -const BSplineLocalInterpolation< dim, BSplineLocalBasis< GV, R > > & │ │ │ │ │ -localInterpolation() const │ │ │ │ │ -Hand out a LocalInterpolation object. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:444 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_:_:_T_r_a_i_t_s │ │ │ │ │ -LocalFiniteElementTraits< BSplineLocalBasis< GV, R >, BSplineLocalCoefficients< │ │ │ │ │ -dim >, BSplineLocalInterpolation< dim, BSplineLocalBasis< GV, R > > > Traits │ │ │ │ │ -Export various types related to this LocalFiniteElement. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:377 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_:_:_c_u_r_r_e_n_t_K_n_o_t_S_p_a_n__ │ │ │ │ │ -std::array< unsigned, dim > currentKnotSpan_ │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:486 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_:_:_B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ -BSplineLocalFiniteElement(const BSplinePreBasis< GV > &preBasis) │ │ │ │ │ -Constructor with a given B-spline basis. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:381 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_:_:_l_o_c_a_l_C_o_e_f_f_i_c_i_e_n_t_s │ │ │ │ │ -const BSplineLocalCoefficients< dim > & localCoefficients() const │ │ │ │ │ -Hand out a LocalCoefficients object. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:438 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_:_:_b_i_n_d │ │ │ │ │ -void bind(const std::array< unsigned, dim > &elementIdx) │ │ │ │ │ -Bind LocalFiniteElement to a specific knot span of the spline patch. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:399 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_:_:_l_o_c_a_l_I_n_t_e_r_p_o_l_a_t_i_o_n__ │ │ │ │ │ -BSplineLocalInterpolation< dim, BSplineLocalBasis< GV, R > > │ │ │ │ │ -localInterpolation_ │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:483 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_:_:_t_y_p_e │ │ │ │ │ -GeometryType type() const │ │ │ │ │ -Return the reference element that the local finite element is defined on (here, │ │ │ │ │ -a hypercube) │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:460 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_:_:_s_i_z_e │ │ │ │ │ -unsigned size() const │ │ │ │ │ -Number of shape functions in this finite element. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:450 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_:_:_l_o_c_a_l_C_o_e_f_f_i_c_i_e_n_t_s__ │ │ │ │ │ -BSplineLocalCoefficients< dim > localCoefficients_ │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:482 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_:_:_s_i_z_e │ │ │ │ │ -unsigned int size(int i) const │ │ │ │ │ -Number of degrees of freedom for one coordinate direction. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:468 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_:_:_l_o_c_a_l_B_a_s_i_s__ │ │ │ │ │ -BSplineLocalBasis< GV, R > localBasis_ │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:481 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_:_:_l_o_c_a_l_B_a_s_i_s │ │ │ │ │ -const BSplineLocalBasis< GV, R > & localBasis() const │ │ │ │ │ -Hand out a LocalBasis object. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:432 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s │ │ │ │ │ -Pre-basis for B-spline basis. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:505 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_:_:_e_l_e_m_e_n_t_s__ │ │ │ │ │ -std::array< unsigned, dim > elements_ │ │ │ │ │ -Number of grid elements in the different coordinate directions. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:1221 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w__ │ │ │ │ │ -GridView gridView_ │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:1223 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_:_:_R │ │ │ │ │ -double R │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:574 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_:_:_e_v_a_l_u_a_t_e_F_u_n_c_t_i_o_n_F_u_l_l │ │ │ │ │ -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. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:1066 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_:_:_e_v_a_l_u_a_t_e_F_u_n_c_t_i_o_n │ │ │ │ │ -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. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:762 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_:_:_o_r_d_e_r__ │ │ │ │ │ -std::array< unsigned int, dim > order_ │ │ │ │ │ -Order of the B-spline for each space dimension. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:1215 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_:_:_e_v_a_l_u_a_t_e_A_l_l │ │ │ │ │ -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... │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:1109 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_:_:_e_v_a_l_u_a_t_e_F_u_n_c_t_i_o_n │ │ │ │ │ -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. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:1009 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ -unsigned int size(size_t d) const │ │ │ │ │ -Number of shape functions in one direction. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:753 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ -GV GridView │ │ │ │ │ -The grid view that the FE space is defined on. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:568 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s │ │ │ │ │ -It indices(const Node &node, It it) const │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_b_i_n_d_T_r_e_e │ │ │ │ │ +void bindTree(Tree &tree, const Entity &entity, std::size_t offset=0) │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:286 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_n_i_t_i_a_l_i_z_e_T_r_e_e │ │ │ │ │ +void initializeTree(Tree &tree, std::size_t treeIndexOffset=0) │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:293 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x │ │ │ │ │ +A statically sized MultiIndex type. │ │ │ │ │ +DDeeffiinniittiioonn multiindex.hh:29 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y │ │ │ │ │ +A dynamically sized array-like class with overflow. │ │ │ │ │ +DDeeffiinniittiioonn overflowarray.hh:49 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w │ │ │ │ │ +The restriction of a finite element basis to a single element. │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:32 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_P_r_e_B_a_s_i_s │ │ │ │ │ +typename GlobalBasis::PreBasis PreBasis │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_u_n_b_i_n_d │ │ │ │ │ +void unbind() │ │ │ │ │ +Unbind from the current element. │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:113 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_b_o_u_n_d │ │ │ │ │ +bool bound() const │ │ │ │ │ +Return if the view is bound to a grid element. │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:95 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ +typename GlobalBasis::GridView GridView │ │ │ │ │ +The grid view the global FE basis lives on. │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:39 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_i_n_d_e_x │ │ │ │ │ +const MultiIndex & index(size_type i) const │ │ │ │ │ Maps from subtree index set [0..size-1] to a globally unique multi index in │ │ │ │ │ global basis. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:714 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_:_:_e_v_a_l_u_a_t_e │ │ │ │ │ -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. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:894 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:569 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_:_:_u_p_d_a_t_e │ │ │ │ │ -void update(const GridView &gv) │ │ │ │ │ -Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:690 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ -unsigned int dimension() const │ │ │ │ │ -Total number of B-spline basis functions. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:744 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_:_:_i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s │ │ │ │ │ -void initializeIndices() │ │ │ │ │ -Initialize the global indices. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:680 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ -const GridView & gridView() const │ │ │ │ │ -Obtain the grid view that the basis is defined on. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:684 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_:_:_g_e_t_I_J_K │ │ │ │ │ -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. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:990 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ -Node makeNode() const │ │ │ │ │ -Create tree node. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:698 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s │ │ │ │ │ -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. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:594 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_:_:_e_v_a_l_u_a_t_e_J_a_c_o_b_i_a_n │ │ │ │ │ -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. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:793 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_:_:_k_n_o_t_V_e_c_t_o_r_s__ │ │ │ │ │ -std::array< std::vector< double >, dim > knotVectors_ │ │ │ │ │ -The knot vectors, one for each space dimension. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:1218 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_:_:_m_a_x_N_o_d_e_S_i_z_e │ │ │ │ │ -size_type maxNodeSize() const │ │ │ │ │ -Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:704 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s │ │ │ │ │ -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. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:646 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_B_a_s_i_s │ │ │ │ │ -LocalBasis class in the sense of dune-localfunctions, presenting the │ │ │ │ │ -restriction of a B-spline patch ... │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:51 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_B_a_s_i_s_:_:_T_r_a_i_t_s │ │ │ │ │ -LocalBasisTraits< D, dim, FieldVector< D, dim >, R, 1, FieldVector< R, 1 >, │ │ │ │ │ -FieldMatrix< R, 1, dim > > Traits │ │ │ │ │ -export type traits for function signature │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_B_a_s_i_s_:_:_o_r_d_e_r │ │ │ │ │ -unsigned int order() const │ │ │ │ │ -Polynomial order of the shape functions. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:145 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ -std::size_t size() const │ │ │ │ │ -Return the number of basis functions on the current knot span. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:152 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_B_a_s_i_s_:_:_e_v_a_l_u_a_t_e │ │ │ │ │ -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. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:102 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_B_a_s_i_s_:_:_e_v_a_l_u_a_t_e_F_u_n_c_t_i_o_n │ │ │ │ │ -void evaluateFunction(const FieldVector< D, dim > &in, std::vector< │ │ │ │ │ -FieldVector< R, 1 > > &out) const │ │ │ │ │ -Evaluate all shape functions. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_B_a_s_i_s_:_:_e_v_a_l_u_a_t_e_J_a_c_o_b_i_a_n │ │ │ │ │ -void evaluateJacobian(const FieldVector< D, dim > &in, std::vector< │ │ │ │ │ -FieldMatrix< D, 1, dim > > &out) const │ │ │ │ │ -Evaluate Jacobian of all shape functions. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:87 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_B_a_s_i_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_B_a_s_i_s │ │ │ │ │ -BSplineLocalBasis(const BSplinePreBasis< GV > &preBasis, const │ │ │ │ │ -BSplineLocalFiniteElement< GV, R > &lFE) │ │ │ │ │ -Constructor with a given B-spline patch. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:66 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_C_o_e_f_f_i_c_i_e_n_t_s │ │ │ │ │ -Attaches a shape function to an entity. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:183 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_C_o_e_f_f_i_c_i_e_n_t_s_:_:_l_o_c_a_l_K_e_y │ │ │ │ │ -const LocalKey & localKey(std::size_t i) const │ │ │ │ │ -get i'th index │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:326 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_C_o_e_f_f_i_c_i_e_n_t_s_:_:_i_n_i_t │ │ │ │ │ -void init(const std::array< unsigned, dim > &sizes) │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:261 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_C_o_e_f_f_i_c_i_e_n_t_s_:_:_s_i_z_e │ │ │ │ │ -std::size_t size() const │ │ │ │ │ -number of coefficients │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:320 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_I_n_t_e_r_p_o_l_a_t_i_o_n │ │ │ │ │ -Local interpolation in the sense of dune-localfunctions, for the B-spline basis │ │ │ │ │ -on tensor-product gri... │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:345 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_I_n_t_e_r_p_o_l_a_t_i_o_n_:_:_i_n_t_e_r_p_o_l_a_t_e │ │ │ │ │ -void interpolate(const F &f, std::vector< C > &out) const │ │ │ │ │ -Local interpolation of a function. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:349 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_N_o_d_e │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:1231 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ -const FiniteElement & finiteElement() const │ │ │ │ │ -Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:1255 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_N_o_d_e_:_:_E_l_e_m_e_n_t │ │ │ │ │ -typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:1237 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_N_o_d_e_:_:_p_r_e_B_a_s_i_s__ │ │ │ │ │ -const BSplinePreBasis< GV > * preBasis_ │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:1271 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_N_o_d_e_:_:_e_l_e_m_e_n_t__ │ │ │ │ │ -Element element_ │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:1274 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_N_o_d_e_:_:_b_i_n_d │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:146 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_e_l_e_m_e_n_t__ │ │ │ │ │ +std::optional< Element > element_ │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:165 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_E_l_e_m_e_n_t │ │ │ │ │ +typename GridView::template Codim< 0 >::Entity Element │ │ │ │ │ +Type of the grid element we are bound to. │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:42 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_t_r_e_e │ │ │ │ │ +const Tree & tree() const │ │ │ │ │ +Return the local ansatz tree associated to the bound entity. │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:122 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_b_i_n_d │ │ │ │ │ void bind(const Element &e) │ │ │ │ │ -Bind to element. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:1261 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_N_o_d_e_:_:_B_S_p_l_i_n_e_N_o_d_e │ │ │ │ │ -BSplineNode(const BSplinePreBasis< GV > *preBasis) │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:1240 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_N_o_d_e_:_:_e_l_e_m_e_n_t │ │ │ │ │ +Bind the view to a grid element. │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:85 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_e_l_e_m_e_n_t │ │ │ │ │ const Element & element() const │ │ │ │ │ -Return current element, throw if unbound. │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:1246 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t__ │ │ │ │ │ -FiniteElement finiteElement_ │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:1273 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_N_o_d_e_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -DDeeffiinniittiioonn bsplinebasis.hh:1236 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ -Global basis for given pre-basis. │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:50 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n │ │ │ │ │ -A generic MixIn class for PreBasis. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismixin.hh:36 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n_<_ _B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_<_ _G_V_ _>_ _>_:_:_s_i_z_e │ │ │ │ │ +Return the grid element that the view is bound to. │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:104 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_s_i_z_e │ │ │ │ │ size_type size() const │ │ │ │ │ -Get the total dimension of the space spanned by this basis. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismixin.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_i_z_e │ │ │ │ │ -size_type size() const │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:147 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_e_t_S_i_z_e │ │ │ │ │ -void setSize(const size_type size) │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:169 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:191 │ │ │ │ │ +Total number of degrees of freedom on this element. │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:129 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_G_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ +GB GlobalBasis │ │ │ │ │ +The global FE basis that this is a view on. │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_t_r_e_e__ │ │ │ │ │ +Tree tree_ │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:166 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_m_a_x_S_i_z_e │ │ │ │ │ +size_type maxSize() const │ │ │ │ │ +Maximum local size for any element on the GridView. │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:140 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +The type used for sizes. │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:45 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_r_o_o_t_L_o_c_a_l_V_i_e_w │ │ │ │ │ +const DefaultLocalView & rootLocalView() const │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:158 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_M_u_l_t_i_I_n_d_e_x_S_t_o_r_a_g_e │ │ │ │ │ +std::conditional_t<(PreBasis::minMultiIndexSize==PreBasis::maxMultiIndexSize), │ │ │ │ │ +OverflowArray< StaticMultiIndex< size_type, PreBasis::maxMultiIndexSize >, │ │ │ │ │ +PreBasis::multiIndexBufferSize >, Dune::ReservedVector< size_type, PreBasis:: │ │ │ │ │ +multiIndexBufferSize > > MultiIndexStorage │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:60 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_M_u_l_t_i_I_n_d_e_x │ │ │ │ │ +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. │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:68 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_i_n_d_i_c_e_s__ │ │ │ │ │ +std::vector< MultiIndexStorage > indices_ │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:167 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_T_r_e_e │ │ │ │ │ +typename GlobalBasis::PreBasis::Node Tree │ │ │ │ │ +Tree of local finite elements / local shape function sets. │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w │ │ │ │ │ +DefaultLocalView(const GlobalBasis &globalBasis) │ │ │ │ │ +Construct local view for a given global finite element basis. │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:72 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_g_l_o_b_a_l_B_a_s_i_s__ │ │ │ │ │ +const GlobalBasis * globalBasis_ │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:164 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_g_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ +const GlobalBasis & globalBasis() const │ │ │ │ │ +Return the global basis that we are a view on. │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:153 │ │ │ │ │ +_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00098.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: taylorhoodbasis.hh File Reference │ │ │ │ +dune-functions: brezzidouglasmarinibasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,59 +74,63 @@ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Typedefs | │ │ │ │ Functions
│ │ │ │ -
taylorhoodbasis.hh File Reference
│ │ │ │ +
brezzidouglasmarinibasis.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <dune/common/exceptions.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 <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/functions/functionspacebases/leafprebasismixin.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::BrezziDouglasMariniPreBasis< GV, k >
 
class  Dune::Functions::TaylorHoodVelocityTree< GV >
 
class  Dune::Functions::TaylorHoodBasisTree< GV >
class  Dune::Functions::BrezziDouglasMariniNode< GV, k >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

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

│ │ │ │ Functions

auto Dune::Functions::BasisFactory::taylorHood ()
 Create a pre-basis factory that can create a Taylor-Hood pre-basis.
 
template<std::size_t k>
auto Dune::Functions::BasisFactory::brezziDouglasMarini ()
 Create a pre-basis factory that can create a Brezzi-Douglas-Marini pre-basis.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -2,45 +2,55 @@ │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -taylorhoodbasis.hh File Reference │ │ │ │ │ +brezzidouglasmarinibasis.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_g_l_o_b_a_l_v_a_l_u_e_d_l_o_c_a_l_f_i_n_i_t_e_e_l_e_m_e_n_t_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_a_g_r_a_n_g_e_b_a_s_i_s_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_<_ _G_V_,_ _H_I_ _> │ │ │ │ │ -  Pre-basis for lowest order Taylor-Hood basis. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_P_r_e_B_a_s_i_s_<_ _G_V_,_ _k_ _> │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_V_e_l_o_c_i_t_y_T_r_e_e_<_ _G_V_ _> │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_B_a_s_i_s_T_r_e_e_<_ _G_V_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_N_o_d_e_<_ _G_V_,_ _k_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y │ │ │ │ │   │ │ │ │ │ TTyyppeeddeeffss │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s< │ │ │ │ │ - _T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s< GV > > │ │ │ │ │ -  Nodal basis for a lowest order Taylor-Hood Lagrangean finite element │ │ │ │ │ - space. │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s< │ │ │ │ │ + _B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_P_r_e_B_a_s_i_s< GV, k > > │ │ │ │ │ +  Basis of a scalar k-th-order BDM finite element space on simplex and │ │ │ │ │ + cube grids. │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_t_a_y_l_o_r_H_o_o_d () │ │ │ │ │ -  Create a pre-basis factory that can create a Taylor-Hood pre-basis. │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_b_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i () │ │ │ │ │ +  Create a pre-basis factory that can create a Brezzi-Douglas-Marini pre- │ │ │ │ │ + basis. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00098_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: taylorhoodbasis.hh Source File │ │ │ │ +dune-functions: brezzidouglasmarinibasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,412 +74,406 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
taylorhoodbasis.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TAYLORHOODBASIS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TAYLORHOODBASIS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BREZZIDOUGLASMARINIBASIS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BREZZIDOUGLASMARINIBASIS_HH
│ │ │ │
9
│ │ │ │ -
10#include <dune/common/exceptions.hh>
│ │ │ │ -
11#include <dune/common/reservedvector.hh>
│ │ │ │ -
12#include <dune/common/indices.hh>
│ │ │ │ +
10#include <array>
│ │ │ │ +
11#include <dune/common/exceptions.hh>
│ │ │ │ +
12#include <dune/geometry/referenceelements.hh>
│ │ │ │
13
│ │ │ │ -
14#include <dune/typetree/powernode.hh>
│ │ │ │ -
15#include <dune/typetree/compositenode.hh>
│ │ │ │ +
14#include <dune/localfunctions/common/virtualinterface.hh>
│ │ │ │ +
15#include <dune/localfunctions/common/virtualwrappers.hh>
│ │ │ │
16
│ │ │ │ - │ │ │ │ -
18
│ │ │ │ - │ │ │ │ - │ │ │ │ -
21
│ │ │ │ -
22namespace Dune {
│ │ │ │ -
23namespace Functions {
│ │ │ │ -
24
│ │ │ │ -
25
│ │ │ │ -
26// *****************************************************************************
│ │ │ │ -
27// This is the reusable part of the basis. It contains
│ │ │ │ -
28//
│ │ │ │ -
29// TaylorHoodPreBasis
│ │ │ │ -
30// TaylorHoodBasisTree
│ │ │ │ -
31// TaylorHoodVelocityTree
│ │ │ │ -
32//
│ │ │ │ -
33// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ -
34// state. These components do _not_ depend on the global basis and local view
│ │ │ │ -
35// and can be used without a global basis.
│ │ │ │ -
36// *****************************************************************************
│ │ │ │ -
37
│ │ │ │ -
38template<typename GV>
│ │ │ │ -
39class TaylorHoodVelocityTree;
│ │ │ │ -
40
│ │ │ │ -
41template<typename GV>
│ │ │ │ -
42class TaylorHoodBasisTree;
│ │ │ │ -
43
│ │ │ │ -
63template<typename GV, bool HI=false>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
65{
│ │ │ │ -
66 static const bool useHybridIndices = HI;
│ │ │ │ -
67
│ │ │ │ -
68 static const int dim = GV::dimension;
│ │ │ │ -
69
│ │ │ │ -
70public:
│ │ │ │ -
71
│ │ │ │ -
73 using GridView = GV;
│ │ │ │ -
74
│ │ │ │ -
76 using size_type = std::size_t;
│ │ │ │ -
77
│ │ │ │ - │ │ │ │ -
80
│ │ │ │ -
81 static constexpr size_type maxMultiIndexSize = useHybridIndices ? 3 : 2;
│ │ │ │ -
82 static constexpr size_type minMultiIndexSize = 2;
│ │ │ │ - │ │ │ │ -
84
│ │ │ │ -
85private:
│ │ │ │ +
17#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini1cube2d.hh>
│ │ │ │ +
18#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini1cube3d.hh>
│ │ │ │ +
19#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini1simplex2d.hh>
│ │ │ │ +
20#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini2cube2d.hh>
│ │ │ │ +
21#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini2simplex2d.hh>
│ │ │ │ +
22
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
27
│ │ │ │ +
28namespace Dune {
│ │ │ │ +
29namespace Functions {
│ │ │ │ +
30
│ │ │ │ +
31namespace Impl {
│ │ │ │ +
32
│ │ │ │ +
33 template<int dim, typename D, typename R, std::size_t k>
│ │ │ │ +
34 struct BDMSimplexLocalInfo
│ │ │ │ +
35 {
│ │ │ │ +
36 static_assert((AlwaysFalse<D>::value),"The requested type of BDM element is not implemented, sorry!");
│ │ │ │ +
37 };
│ │ │ │ +
38
│ │ │ │ +
39 template<typename D, typename R>
│ │ │ │ +
40 struct BDMSimplexLocalInfo<2,D,R,1>
│ │ │ │ +
41 {
│ │ │ │ +
42 using FiniteElement = BDM1Simplex2DLocalFiniteElement<D,R>;
│ │ │ │ +
43 static const std::size_t Variants = 8;
│ │ │ │ +
44 };
│ │ │ │ +
45
│ │ │ │ +
46 template<typename D, typename R>
│ │ │ │ +
47 struct BDMSimplexLocalInfo<2,D,R,2>
│ │ │ │ +
48 {
│ │ │ │ +
49 using FiniteElement = BDM2Simplex2DLocalFiniteElement<D,R>;
│ │ │ │ +
50 static const std::size_t Variants = 8;
│ │ │ │ +
51 };
│ │ │ │ +
52
│ │ │ │ +
53 template<int dim, typename D, typename R, std::size_t k>
│ │ │ │ +
54 struct BDMCubeLocalInfo
│ │ │ │ +
55 {
│ │ │ │ +
56 static_assert((AlwaysFalse<D>::value),"The requested type of BDM element is not implemented, sorry!");
│ │ │ │ +
57 };
│ │ │ │ +
58
│ │ │ │ +
59 template<typename D, typename R>
│ │ │ │ +
60 struct BDMCubeLocalInfo<2,D,R,1>
│ │ │ │ +
61 {
│ │ │ │ +
62 using FiniteElement = BDM1Cube2DLocalFiniteElement<D,R>;
│ │ │ │ +
63 static const std::size_t Variants = 16;
│ │ │ │ +
64 };
│ │ │ │ +
65
│ │ │ │ +
66 template<typename D, typename R>
│ │ │ │ +
67 struct BDMCubeLocalInfo<2,D,R,2>
│ │ │ │ +
68 {
│ │ │ │ +
69 using FiniteElement = BDM2Cube2DLocalFiniteElement<D,R>;
│ │ │ │ +
70 static const std::size_t Variants = 16;
│ │ │ │ +
71 };
│ │ │ │ +
72
│ │ │ │ +
73 template<typename D, typename R>
│ │ │ │ +
74 struct BDMCubeLocalInfo<3,D,R,1>
│ │ │ │ +
75 {
│ │ │ │ +
76 using FiniteElement = BDM1Cube3DLocalFiniteElement<D,R>;
│ │ │ │ +
77 static const std::size_t Variants = 64;
│ │ │ │ +
78 };
│ │ │ │ +
79
│ │ │ │ +
80 template<typename GV, int dim, typename R, std::size_t k>
│ │ │ │ +
81 class BDMLocalFiniteElementMap
│ │ │ │ +
82 {
│ │ │ │ +
83 using D = typename GV::ctype;
│ │ │ │ +
84 using CubeFiniteElement = typename BDMCubeLocalInfo<dim, D, R, k>::FiniteElement;
│ │ │ │ +
85 using SimplexFiniteElement = typename BDMSimplexLocalInfo<dim, D, R, k>::FiniteElement;
│ │ │ │
86
│ │ │ │ - │ │ │ │ - │ │ │ │ -
89
│ │ │ │ -
90public:
│ │ │ │ +
87 public:
│ │ │ │ +
88
│ │ │ │ +
89 using T = LocalBasisTraits<D, dim, FieldVector<D,dim>, R, dim, FieldVector<R,dim>, FieldMatrix<D,dim,dim> >;
│ │ │ │ +
90 using FiniteElement = LocalFiniteElementVirtualInterface<T>;
│ │ │ │
91
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
94 gridView_(gv),
│ │ │ │ -
95 pq1PreBasis_(gv),
│ │ │ │ -
96 pq2PreBasis_(gv)
│ │ │ │ -
97 {}
│ │ │ │ -
│ │ │ │ -
98
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
101 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
104 }
│ │ │ │ -
│ │ │ │ -
105
│ │ │ │ -
│ │ │ │ -
107 const GridView& gridView() const
│ │ │ │ -
108 {
│ │ │ │ -
109 return gridView_;
│ │ │ │ -
110 }
│ │ │ │ -
│ │ │ │ +
92 BDMLocalFiniteElementMap(const GV& gv)
│ │ │ │ +
93 : is_(&(gv.indexSet())), orient_(gv.size(0))
│ │ │ │ +
94 {
│ │ │ │ +
95 cubeVariant_.resize(BDMCubeLocalInfo<dim, D, R, k>::Variants);
│ │ │ │ +
96 simplexVariant_.resize(BDMSimplexLocalInfo<dim, D, R, k>::Variants);
│ │ │ │ +
97
│ │ │ │ +
98 // create all variants
│ │ │ │ +
99 for (size_t i = 0; i < cubeVariant_.size(); i++)
│ │ │ │ +
100 cubeVariant_[i] = std::make_shared<LocalFiniteElementVirtualImp<CubeFiniteElement> >(CubeFiniteElement(i));
│ │ │ │ +
101
│ │ │ │ +
102 for (size_t i = 0; i < simplexVariant_.size(); i++)
│ │ │ │ +
103 simplexVariant_[i] = std::make_shared<LocalFiniteElementVirtualImp<SimplexFiniteElement> >(SimplexFiniteElement(i));
│ │ │ │ +
104
│ │ │ │ +
105 // compute orientation for all elements
│ │ │ │ +
106 // loop once over the grid
│ │ │ │ +
107 for(const auto& cell : elements(gv))
│ │ │ │ +
108 {
│ │ │ │ +
109 unsigned int myId = is_->index(cell);
│ │ │ │ +
110 orient_[myId] = 0;
│ │ │ │
111
│ │ │ │ -
│ │ │ │ -
113 void update (const GridView& gv)
│ │ │ │ -
114 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
117 }
│ │ │ │ -
│ │ │ │ -
118
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
123 {
│ │ │ │ -
124 return Node{};
│ │ │ │ -
125 }
│ │ │ │ -
│ │ │ │ -
126
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
129 {
│ │ │ │ -
130 return 2;
│ │ │ │ -
131 }
│ │ │ │ -
│ │ │ │ -
132
│ │ │ │ -
134 template<class SizePrefix>
│ │ │ │ -
│ │ │ │ -
135 size_type size(const SizePrefix& prefix) const
│ │ │ │ -
136 {
│ │ │ │ -
137 return sizeImp<useHybridIndices>(prefix);
│ │ │ │ -
138 }
│ │ │ │ -
│ │ │ │ +
112 for (const auto& intersection : intersections(gv,cell))
│ │ │ │ +
113 {
│ │ │ │ +
114 if (intersection.neighbor() && (is_->index(intersection.outside()) > myId))
│ │ │ │ +
115 orient_[myId] |= (1 << intersection.indexInInside());
│ │ │ │ +
116 }
│ │ │ │ +
117 }
│ │ │ │ +
118 }
│ │ │ │ +
119
│ │ │ │ +
121 template<class EntityType>
│ │ │ │ +
122 const FiniteElement& find(const EntityType& e) const
│ │ │ │ +
123 {
│ │ │ │ +
124 if (e.type().isCube())
│ │ │ │ +
125 return *cubeVariant_[orient_[is_->index(e)]];
│ │ │ │ +
126 else
│ │ │ │ +
127 return *simplexVariant_[orient_[is_->index(e)]];
│ │ │ │ +
128 }
│ │ │ │ +
129
│ │ │ │ +
130 private:
│ │ │ │ +
131 std::vector<std::shared_ptr<LocalFiniteElementVirtualImp<CubeFiniteElement> > > cubeVariant_;
│ │ │ │ +
132 std::vector<std::shared_ptr<LocalFiniteElementVirtualImp<SimplexFiniteElement> > > simplexVariant_;
│ │ │ │ +
133 const typename GV::IndexSet* is_;
│ │ │ │ +
134 std::vector<unsigned char> orient_;
│ │ │ │ +
135 };
│ │ │ │ +
136
│ │ │ │ +
137
│ │ │ │ +
138} // namespace Impl
│ │ │ │
139
│ │ │ │ -
140private:
│ │ │ │ -
141
│ │ │ │ -
142 template<bool hi, class SizePrefix,
│ │ │ │ -
143 std::enable_if_t<not hi,int> = 0>
│ │ │ │ -
144 size_type sizeImp(const SizePrefix& prefix) const
│ │ │ │ -
145 {
│ │ │ │ -
146 if (prefix.size() == 0)
│ │ │ │ -
147 return 2;
│ │ │ │ -
148 if (prefix.size() == 1)
│ │ │ │ -
149 {
│ │ │ │ -
150 if (prefix[0] == 0)
│ │ │ │ -
151 return dim * pq2PreBasis_.size();
│ │ │ │ -
152 if (prefix[0] == 1)
│ │ │ │ -
153 return pq1PreBasis_.size();
│ │ │ │ -
154 }
│ │ │ │ -
155 assert(prefix.size() == 2);
│ │ │ │ -
156 return 0;
│ │ │ │ -
157 }
│ │ │ │ -
158
│ │ │ │ -
159 template<bool hi, class SizePrefix,
│ │ │ │ -
160 std::enable_if_t<hi,int> = 0>
│ │ │ │ -
161 size_type sizeImp(const SizePrefix& prefix) const
│ │ │ │ -
162 {
│ │ │ │ -
163 if (prefix.size() == 0)
│ │ │ │ -
164 return 2;
│ │ │ │ -
165 if (prefix.size() == 1)
│ │ │ │ -
166 {
│ │ │ │ -
167 if (prefix[0] == 0)
│ │ │ │ -
168 return pq2PreBasis_.size();
│ │ │ │ -
169 if (prefix[0] == 1)
│ │ │ │ -
170 return pq1PreBasis_.size();
│ │ │ │ -
171 }
│ │ │ │ -
172 if (prefix.size() == 2)
│ │ │ │ -
173 {
│ │ │ │ -
174 if (prefix[0] == 0)
│ │ │ │ -
175 return dim;
│ │ │ │ -
176 if (prefix[0] == 1)
│ │ │ │ -
177 return 0;
│ │ │ │ -
178 }
│ │ │ │ -
179 assert(prefix.size() == 3);
│ │ │ │ -
180 return 0;
│ │ │ │ -
181 }
│ │ │ │ -
182
│ │ │ │ -
183public:
│ │ │ │ -
184
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
187 {
│ │ │ │ -
188 return dim * pq2PreBasis_.size() + pq1PreBasis_.size();
│ │ │ │ -
189 }
│ │ │ │ -
│ │ │ │ -
190
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
193 {
│ │ │ │ - │ │ │ │ -
195 }
│ │ │ │ -
│ │ │ │ -
196
│ │ │ │ -
197 template<typename It>
│ │ │ │ -
│ │ │ │ -
198 It indices(const Node& node, It it) const
│ │ │ │ -
199 {
│ │ │ │ -
200 return indicesImp<useHybridIndices>(node, it);
│ │ │ │ -
201 }
│ │ │ │ -
│ │ │ │ -
202
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
209 {
│ │ │ │ - │ │ │ │ -
211 if constexpr(HI)
│ │ │ │ -
212 return CD::makeDescriptor(
│ │ │ │ -
213 CD::makeUniformDescriptor(pq2PreBasis_.size(),
│ │ │ │ -
214 CD::FlatArray<GV::dimension>{}),
│ │ │ │ -
215 CD::FlatVector{pq1PreBasis_.size()});
│ │ │ │ -
216 else
│ │ │ │ -
217 return CD::Array<CD::FlatVector,2>{
│ │ │ │ -
218 CD::FlatVector{GV::dimension * pq2PreBasis_.size()},
│ │ │ │ -
219 CD::FlatVector{pq1PreBasis_.size()} };
│ │ │ │ -
220 }
│ │ │ │ -
│ │ │ │ -
221
│ │ │ │ -
222protected:
│ │ │ │ -
223
│ │ │ │ -
224 template<class MultiIndex>
│ │ │ │ -
│ │ │ │ -
225 static const void multiIndexPushFront(MultiIndex& M, size_type M0)
│ │ │ │ -
226 {
│ │ │ │ -
227 M.resize(M.size()+1);
│ │ │ │ -
228 for(std::size_t i=M.size()-1; i>0; --i)
│ │ │ │ -
229 M[i] = M[i-1];
│ │ │ │ -
230 M[0] = M0;
│ │ │ │ -
231 }
│ │ │ │ -
│ │ │ │ -
232
│ │ │ │ -
233 template<bool hi, class It,
│ │ │ │ -
234 std::enable_if_t<not hi,int> = 0>
│ │ │ │ -
│ │ │ │ -
235 It indicesImp(const Node& node, It multiIndices) const
│ │ │ │ -
236 {
│ │ │ │ -
237 using namespace Dune::Indices;
│ │ │ │ -
238 for(std::size_t child=0; child<dim; ++child)
│ │ │ │ +
140
│ │ │ │ +
141// *****************************************************************************
│ │ │ │ +
142// This is the reusable part of the basis. It contains
│ │ │ │ +
143//
│ │ │ │ +
144// BrezziDouglasMariniPreBasis
│ │ │ │ +
145// BrezziDouglasMariniNode
│ │ │ │ +
146//
│ │ │ │ +
147// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ +
148// state. These components do _not_ depend on the global basis and local view
│ │ │ │ +
149// and can be used without a global basis.
│ │ │ │ +
150// *****************************************************************************
│ │ │ │ +
151
│ │ │ │ +
152template<typename GV, int k>
│ │ │ │ +
153class BrezziDouglasMariniNode;
│ │ │ │ +
154
│ │ │ │ +
155template<typename GV, int k>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
157 public LeafPreBasisMixin< BrezziDouglasMariniPreBasis<GV,k> >
│ │ │ │ +
158{
│ │ │ │ +
159 static const int dim = GV::dimension;
│ │ │ │ +
160 using FiniteElementMap = typename Impl::BDMLocalFiniteElementMap<GV, dim, double, k>;
│ │ │ │ +
161
│ │ │ │ +
162public:
│ │ │ │ +
163
│ │ │ │ +
165 using GridView = GV;
│ │ │ │ +
166 using size_type = std::size_t;
│ │ │ │ +
167
│ │ │ │ + │ │ │ │ +
169
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
172 gridView_(gv),
│ │ │ │ + │ │ │ │ +
174 {
│ │ │ │ +
175 // There is no inherent reason why the basis shouldn't work for grids with more than one
│ │ │ │ +
176 // element types. Somebody simply has to sit down and implement the missing bits.
│ │ │ │ +
177 if (gv.indexSet().types(0).size() > 1)
│ │ │ │ +
178 DUNE_THROW(Dune::NotImplemented, "Brezzi-Douglas-Marini basis is only implemented for grids with a single element type");
│ │ │ │ +
179 }
│ │ │ │ +
│ │ │ │ +
180
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
182 {
│ │ │ │ +
183 codimOffset_[0] = 0;
│ │ │ │ +
184 codimOffset_[1] = codimOffset_[0] + dofsPerCodim_[0] * gridView_.size(0);
│ │ │ │ +
185 //if (dim==3) codimOffset_[2] = codimOffset_[1] + dofsPerCodim[1] * gridView_.size(1);
│ │ │ │ +
186 }
│ │ │ │ +
│ │ │ │ +
187
│ │ │ │ +
│ │ │ │ +
190 const GridView& gridView() const
│ │ │ │ +
191 {
│ │ │ │ +
192 return gridView_;
│ │ │ │ +
193 }
│ │ │ │ +
│ │ │ │ +
194
│ │ │ │ +
195 /* \brief Update the stored grid view, to be called if the grid has changed */
│ │ │ │ +
│ │ │ │ +
196 void update (const GridView& gv)
│ │ │ │ +
197 {
│ │ │ │ +
198 gridView_ = gv;
│ │ │ │ +
199 }
│ │ │ │ +
│ │ │ │ +
200
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
205 {
│ │ │ │ +
206 return Node{&finiteElementMap_};
│ │ │ │ +
207 }
│ │ │ │ +
│ │ │ │ +
208
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
210 {
│ │ │ │ +
211 return dofsPerCodim_[0] * gridView_.size(0) + dofsPerCodim_[1] * gridView_.size(1); // only 2d
│ │ │ │ +
212 }
│ │ │ │ +
│ │ │ │ +
213
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
215 {
│ │ │ │ +
216 // The implementation currently only supports grids with a single element type.
│ │ │ │ +
217 // We can therefore return the actual number of dofs here.
│ │ │ │ +
218 GeometryType elementType = *(gridView_.indexSet().types(0).begin());
│ │ │ │ +
219 size_t numFaces = ReferenceElements<double,dim>::general(elementType).size(1);
│ │ │ │ +
220 return dofsPerCodim_[0] + dofsPerCodim_[1] * numFaces;
│ │ │ │ +
221 }
│ │ │ │ +
│ │ │ │ +
222
│ │ │ │ +
228 template<typename It>
│ │ │ │ +
│ │ │ │ +
229 It indices(const Node& node, It it) const
│ │ │ │ +
230 {
│ │ │ │ +
231 const auto& gridIndexSet = gridView().indexSet();
│ │ │ │ +
232 const auto& element = node.element();
│ │ │ │ +
233
│ │ │ │ +
234 // throw if element is not of predefined type
│ │ │ │ +
235 if (not(element.type().isCube()) and not(element.type().isSimplex()))
│ │ │ │ +
236 DUNE_THROW(Dune::NotImplemented, "BrezziDouglasMariniBasis only implemented for cube and simplex elements.");
│ │ │ │ +
237
│ │ │ │ +
238 for(std::size_t i=0, end=node.size(); i<end; ++i, ++it)
│ │ │ │
239 {
│ │ │ │ -
240 size_type subTreeSize = node.child(_0, 0).size();
│ │ │ │ -
241 pq2PreBasis_.indices(node.child(_0, 0), multiIndices);
│ │ │ │ -
242 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
243 {
│ │ │ │ -
244 multiIndexPushFront(multiIndices[i], 0);
│ │ │ │ -
245 multiIndices[i][1] = multiIndices[i][1]*dim + child;
│ │ │ │ -
246 }
│ │ │ │ -
247 multiIndices += subTreeSize;
│ │ │ │ +
240 Dune::LocalKey localKey = node.finiteElement().localCoefficients().localKey(i);
│ │ │ │ +
241
│ │ │ │ +
242 // The dimension of the entity that the current dof is related to
│ │ │ │ +
243 size_t subentity = localKey.subEntity();
│ │ │ │ +
244 size_t codim = localKey.codim();
│ │ │ │ +
245
│ │ │ │ +
246 *it = { codimOffset_[codim] +
│ │ │ │ +
247 dofsPerCodim_[codim] * gridIndexSet.subIndex(element, subentity, codim) + localKey.index() };
│ │ │ │
248 }
│ │ │ │ -
249 size_type subTreeSize = node.child(_1).size();
│ │ │ │ -
250 pq1PreBasis_.indices(node.child(_1), multiIndices);
│ │ │ │ -
251 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
252 multiIndexPushFront(multiIndices[i], 1);
│ │ │ │ -
253 multiIndices += subTreeSize;
│ │ │ │ -
254 return multiIndices;
│ │ │ │ -
255 }
│ │ │ │ -
│ │ │ │ -
256
│ │ │ │ -
257 template<bool hi, class It,
│ │ │ │ -
258 std::enable_if_t<hi,int> = 0>
│ │ │ │ -
│ │ │ │ -
259 It indicesImp(const Node& node, It multiIndices) const
│ │ │ │ -
260 {
│ │ │ │ -
261 using namespace Dune::Indices;
│ │ │ │ -
262 for(std::size_t child=0; child<dim; ++child)
│ │ │ │ -
263 {
│ │ │ │ -
264 size_type subTreeSize = node.child(_0, 0).size();
│ │ │ │ -
265 pq2PreBasis_.indices(node.child(_0, 0), multiIndices);
│ │ │ │ -
266 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
267 {
│ │ │ │ -
268 multiIndexPushFront(multiIndices[i], 0);
│ │ │ │ -
269 multiIndices[i].push_back(i);
│ │ │ │ -
270 }
│ │ │ │ -
271 multiIndices += subTreeSize;
│ │ │ │ -
272 }
│ │ │ │ -
273 size_type subTreeSize = node.child(_1).size();
│ │ │ │ -
274 pq1PreBasis_.indices(node.child(_1), multiIndices);
│ │ │ │ -
275 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
276 multiIndexPushFront(multiIndices[i], 1);
│ │ │ │ -
277 multiIndices += subTreeSize;
│ │ │ │ -
278 return multiIndices;
│ │ │ │ -
279 }
│ │ │ │ +
249
│ │ │ │ +
250 return it;
│ │ │ │ +
251 }
│ │ │ │ +
│ │ │ │ +
252
│ │ │ │ +
253protected:
│ │ │ │ + │ │ │ │ +
255 std::array<size_t,dim+1> codimOffset_;
│ │ │ │ +
256 FiniteElementMap finiteElementMap_;
│ │ │ │ +
257 // Number of dofs per entity type depending on the entity's codimension and type
│ │ │ │ +
258 std::array<int,2> dofsPerCodim_ {{dim*(k-1)*3, dim+(k-1)}};
│ │ │ │ +
259};
│ │ │ │ +
│ │ │ │ +
260
│ │ │ │ +
261
│ │ │ │ +
262
│ │ │ │ +
263template<typename GV, int k>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
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 using FiniteElementMap = typename Impl::BDMLocalFiniteElementMap<GV, dim, double, k>;
│ │ │ │ +
274 using FiniteElement = Impl::GlobalValuedLocalFiniteElement<Impl::ContravariantPiolaTransformator,
│ │ │ │ +
275 typename FiniteElementMap::FiniteElement,
│ │ │ │ +
276 Element>;
│ │ │ │ +
277
│ │ │ │ +
│ │ │ │ +
278 BrezziDouglasMariniNode(const FiniteElementMap* finiteElementMap) :
│ │ │ │ +
279 element_(nullptr),
│ │ │ │ +
280 finiteElementMap_(finiteElementMap)
│ │ │ │ +
281 {}
│ │ │ │
│ │ │ │ -
280
│ │ │ │ - │ │ │ │
282
│ │ │ │ - │ │ │ │ - │ │ │ │ -
285};
│ │ │ │ +
│ │ │ │ +
284 const Element& element() const
│ │ │ │ +
285 {
│ │ │ │ +
286 return *element_;
│ │ │ │ +
287 }
│ │ │ │
│ │ │ │ -
286
│ │ │ │ -
287
│ │ │ │
288
│ │ │ │ -
289template<typename GV>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
291 public PowerBasisNode<LagrangeNode<GV,2>, GV::dimension>
│ │ │ │ -
292{
│ │ │ │ - │ │ │ │ - │ │ │ │ -
295
│ │ │ │ -
296public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
298 {
│ │ │ │ -
299 for(int i=0; i<GV::dimension; ++i)
│ │ │ │ -
300 this->setChild(i, std::make_shared<PQ2Node>());
│ │ │ │ -
301 }
│ │ │ │ -
│ │ │ │ -
302};
│ │ │ │ -
│ │ │ │ -
303
│ │ │ │ -
304template<typename GV>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
306 public CompositeBasisNode<
│ │ │ │ -
307 TaylorHoodVelocityTree<GV>,
│ │ │ │ -
308 LagrangeNode<GV,1>
│ │ │ │ -
309 >
│ │ │ │ -
310{
│ │ │ │ - │ │ │ │ - │ │ │ │ +
│ │ │ │ + │ │ │ │ +
294 {
│ │ │ │ +
295 return finiteElement_;
│ │ │ │ +
296 }
│ │ │ │ +
│ │ │ │ +
297
│ │ │ │ +
│ │ │ │ +
299 void bind(const Element& e)
│ │ │ │ +
300 {
│ │ │ │ +
301 element_ = &e;
│ │ │ │ +
302 finiteElement_.bind((finiteElementMap_->find(*element_)), e);
│ │ │ │ +
303 this->setSize(finiteElement_.size());
│ │ │ │ +
304 }
│ │ │ │ +
│ │ │ │ +
305
│ │ │ │ +
306protected:
│ │ │ │ +
307
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
311};
│ │ │ │ +
│ │ │ │ +
312
│ │ │ │
313
│ │ │ │ - │ │ │ │ -
315
│ │ │ │ -
316public:
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
318 {
│ │ │ │ -
319 this->template setChild<0>(std::make_shared<VelocityNode>());
│ │ │ │ -
320 this->template setChild<1>(std::make_shared<PressureNode>());
│ │ │ │ -
321 }
│ │ │ │ -
│ │ │ │ -
322};
│ │ │ │ -
│ │ │ │ -
323
│ │ │ │ -
324
│ │ │ │ -
325
│ │ │ │ -
326namespace BasisFactory {
│ │ │ │ -
327
│ │ │ │ -
│ │ │ │ -
334inline auto taylorHood()
│ │ │ │ -
335{
│ │ │ │ -
336 return [](const auto& gridView) {
│ │ │ │ -
337 return TaylorHoodPreBasis<std::decay_t<decltype(gridView)>>(gridView);
│ │ │ │ -
338 };
│ │ │ │ -
339}
│ │ │ │ -
│ │ │ │ -
340
│ │ │ │ -
341} // end namespace BasisFactory
│ │ │ │ -
342
│ │ │ │ -
343// *****************************************************************************
│ │ │ │ -
344// This is the actual global basis implementation based on the reusable parts.
│ │ │ │ -
345// *****************************************************************************
│ │ │ │ -
346
│ │ │ │ -
368template<typename GV>
│ │ │ │ - │ │ │ │ -
370
│ │ │ │ -
371
│ │ │ │ -
372
│ │ │ │ -
373} // end namespace Functions
│ │ │ │ -
374} // end namespace Dune
│ │ │ │ -
375
│ │ │ │ -
376
│ │ │ │ -
377#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TAYLORHOODBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
auto taylorHood()
Create a pre-basis factory that can create a Taylor-Hood pre-basis.
Definition taylorhoodbasis.hh:334
│ │ │ │ +
314
│ │ │ │ +
315namespace BasisFactory {
│ │ │ │ +
316
│ │ │ │ +
324template<std::size_t k>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
326{
│ │ │ │ +
327 return [](const auto& gridView) {
│ │ │ │ +
328 return BrezziDouglasMariniPreBasis<std::decay_t<decltype(gridView)>, k>(gridView);
│ │ │ │ +
329 };
│ │ │ │ +
330}
│ │ │ │ +
│ │ │ │ +
331
│ │ │ │ +
332} // end namespace BasisFactory
│ │ │ │ +
333
│ │ │ │ +
334
│ │ │ │ +
335
│ │ │ │ +
336// *****************************************************************************
│ │ │ │ +
337// This is the actual global basis implementation based on the reusable parts.
│ │ │ │ +
338// *****************************************************************************
│ │ │ │ +
339
│ │ │ │ +
347template<typename GV, int k>
│ │ │ │ + │ │ │ │ +
349
│ │ │ │ +
350} // end namespace Functions
│ │ │ │ +
351} // end namespace Dune
│ │ │ │ +
352
│ │ │ │ +
353
│ │ │ │ +
354#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:325
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
Definition containerdescriptors.hh:47
│ │ │ │ +
Definition brezzidouglasmarinibasis.hh:266
│ │ │ │ +
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition brezzidouglasmarinibasis.hh:293
│ │ │ │ +
typename GV::template Codim< 0 >::Entity Element
Definition brezzidouglasmarinibasis.hh:272
│ │ │ │ +
const FiniteElementMap * finiteElementMap_
Definition brezzidouglasmarinibasis.hh:310
│ │ │ │ +
std::size_t size_type
Definition brezzidouglasmarinibasis.hh:271
│ │ │ │ +
FiniteElement finiteElement_
Definition brezzidouglasmarinibasis.hh:308
│ │ │ │ +
typename Impl::BDMLocalFiniteElementMap< GV, dim, double, k > FiniteElementMap
Definition brezzidouglasmarinibasis.hh:273
│ │ │ │ +
const Element * element_
Definition brezzidouglasmarinibasis.hh:309
│ │ │ │ +
Impl::GlobalValuedLocalFiniteElement< Impl::ContravariantPiolaTransformator, typename FiniteElementMap::FiniteElement, Element > FiniteElement
Definition brezzidouglasmarinibasis.hh:276
│ │ │ │ +
void bind(const Element &e)
Bind to element.
Definition brezzidouglasmarinibasis.hh:299
│ │ │ │ +
BrezziDouglasMariniNode(const FiniteElementMap *finiteElementMap)
Definition brezzidouglasmarinibasis.hh:278
│ │ │ │ +
const Element & element() const
Return current element, throw if unbound.
Definition brezzidouglasmarinibasis.hh:284
│ │ │ │ +
Definition brezzidouglasmarinibasis.hh:158
│ │ │ │ +
std::size_t size_type
Definition brezzidouglasmarinibasis.hh:166
│ │ │ │ +
std::array< int, 2 > dofsPerCodim_
Definition brezzidouglasmarinibasis.hh:258
│ │ │ │ +
size_type dimension() const
Definition brezzidouglasmarinibasis.hh:209
│ │ │ │ +
std::array< size_t, dim+1 > codimOffset_
Definition brezzidouglasmarinibasis.hh:255
│ │ │ │ +
Node makeNode() const
Create tree node.
Definition brezzidouglasmarinibasis.hh:204
│ │ │ │ +
GV GridView
The grid view that the FE space is defined on.
Definition brezzidouglasmarinibasis.hh:165
│ │ │ │ +
BrezziDouglasMariniPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition brezzidouglasmarinibasis.hh:171
│ │ │ │ +
FiniteElementMap finiteElementMap_
Definition brezzidouglasmarinibasis.hh:256
│ │ │ │ +
void update(const GridView &gv)
Definition brezzidouglasmarinibasis.hh:196
│ │ │ │ +
void initializeIndices()
Definition brezzidouglasmarinibasis.hh:181
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition brezzidouglasmarinibasis.hh:190
│ │ │ │ +
size_type maxNodeSize() const
Definition brezzidouglasmarinibasis.hh:214
│ │ │ │ +
GridView gridView_
Definition brezzidouglasmarinibasis.hh:254
│ │ │ │ +
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:229
│ │ │ │
Global basis for given pre-basis.
Definition defaultglobalbasis.hh:50
│ │ │ │ -
Definition lagrangebasis.hh:375
│ │ │ │ - │ │ │ │ -
It indices(const Node &node, It it) const
Definition lagrangebasis.hh:180
│ │ │ │ -
void initializeIndices()
Initialize the global indices.
Definition lagrangebasis.hh:98
│ │ │ │ -
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition lagrangebasis.hh:128
│ │ │ │ -
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition lagrangebasis.hh:172
│ │ │ │ -
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition leafprebasismixin.hh:53
│ │ │ │ +
A generic MixIn class for PreBasis.
Definition leafprebasismixin.hh:36
│ │ │ │
size_type size() const
Definition nodes.hh:147
│ │ │ │ -
Definition nodes.hh:198
│ │ │ │ - │ │ │ │ -
Definition taylorhoodbasis.hh:292
│ │ │ │ -
TaylorHoodVelocityTree()
Definition taylorhoodbasis.hh:297
│ │ │ │ -
Definition taylorhoodbasis.hh:310
│ │ │ │ -
TaylorHoodBasisTree()
Definition taylorhoodbasis.hh:317
│ │ │ │ -
Pre-basis for lowest order Taylor-Hood basis.
Definition taylorhoodbasis.hh:65
│ │ │ │ -
TaylorHoodPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition taylorhoodbasis.hh:93
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition taylorhoodbasis.hh:107
│ │ │ │ -
static constexpr size_type minMultiIndexSize
Definition taylorhoodbasis.hh:82
│ │ │ │ -
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition taylorhoodbasis.hh:135
│ │ │ │ -
GridView gridView_
Definition taylorhoodbasis.hh:281
│ │ │ │ -
GV GridView
The grid view that the FE basis is defined on.
Definition taylorhoodbasis.hh:73
│ │ │ │ -
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition taylorhoodbasis.hh:113
│ │ │ │ -
auto containerDescriptor() const
Return an container descriptor depending on the flag HI. Either return a Tuple if hybrid indices shou...
Definition taylorhoodbasis.hh:208
│ │ │ │ -
PQ2PreBasis pq2PreBasis_
Definition taylorhoodbasis.hh:284
│ │ │ │ -
size_type size() const
Same as size(prefix) with empty prefix.
Definition taylorhoodbasis.hh:128
│ │ │ │ -
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition taylorhoodbasis.hh:186
│ │ │ │ -
PQ1PreBasis pq1PreBasis_
Definition taylorhoodbasis.hh:283
│ │ │ │ -
static const void multiIndexPushFront(MultiIndex &M, size_type M0)
Definition taylorhoodbasis.hh:225
│ │ │ │ -
static constexpr size_type maxMultiIndexSize
Definition taylorhoodbasis.hh:81
│ │ │ │ -
Node makeNode() const
Create tree node.
Definition taylorhoodbasis.hh:122
│ │ │ │ -
It indices(const Node &node, It it) const
Definition taylorhoodbasis.hh:198
│ │ │ │ -
static constexpr size_type multiIndexBufferSize
Definition taylorhoodbasis.hh:83
│ │ │ │ -
void initializeIndices()
Initialize the global indices.
Definition taylorhoodbasis.hh:100
│ │ │ │ -
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition taylorhoodbasis.hh:192
│ │ │ │ -
std::size_t size_type
Type used for indices and size information.
Definition taylorhoodbasis.hh:76
│ │ │ │ -
It indicesImp(const Node &node, It multiIndices) const
Definition taylorhoodbasis.hh:235
│ │ │ │ +
void setSize(const size_type size)
Definition nodes.hh:169
│ │ │ │ +
Definition nodes.hh:191
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,463 +1,489 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -taylorhoodbasis.hh │ │ │ │ │ +brezzidouglasmarinibasis.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TAYLORHOODBASIS_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TAYLORHOODBASIS_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BREZZIDOUGLASMARINIBASIS_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BREZZIDOUGLASMARINIBASIS_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ 13 │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ 16 │ │ │ │ │ -17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ -18 │ │ │ │ │ -19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_a_g_r_a_n_g_e_b_a_s_i_s_._h_h> │ │ │ │ │ -20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ -21 │ │ │ │ │ -22namespace _D_u_n_e { │ │ │ │ │ -23namespace Functions { │ │ │ │ │ -24 │ │ │ │ │ -25 │ │ │ │ │ -26/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ -27// This is the reusable part of the basis. It contains │ │ │ │ │ -28// │ │ │ │ │ -29// TaylorHoodPreBasis │ │ │ │ │ -30// TaylorHoodBasisTree │ │ │ │ │ -31// TaylorHoodVelocityTree │ │ │ │ │ -32// │ │ │ │ │ -33// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ -shared │ │ │ │ │ -34// state. These components do _not_ depend on the global basis and local view │ │ │ │ │ -35// and can be used without a global basis. │ │ │ │ │ -36/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ -37 │ │ │ │ │ -38template │ │ │ │ │ -39class TaylorHoodVelocityTree; │ │ │ │ │ -40 │ │ │ │ │ -41template │ │ │ │ │ -42class TaylorHoodBasisTree; │ │ │ │ │ -43 │ │ │ │ │ -63template │ │ │ │ │ -_6_4class _T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s │ │ │ │ │ -65{ │ │ │ │ │ -66 static const bool useHybridIndices = HI; │ │ │ │ │ -67 │ │ │ │ │ -68 static const int dim = GV::dimension; │ │ │ │ │ -69 │ │ │ │ │ -70public: │ │ │ │ │ -71 │ │ │ │ │ -_7_3 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ -74 │ │ │ │ │ -_7_6 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ -77 │ │ │ │ │ -_7_9 using _N_o_d_e = _T_a_y_l_o_r_H_o_o_d_B_a_s_i_s_T_r_e_e_<_G_V_>; │ │ │ │ │ -80 │ │ │ │ │ -_8_1 static constexpr _s_i_z_e___t_y_p_e _m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e = useHybridIndices ? 3 : 2; │ │ │ │ │ -_8_2 static constexpr _s_i_z_e___t_y_p_e _m_i_n_M_u_l_t_i_I_n_d_e_x_S_i_z_e = 2; │ │ │ │ │ -_8_3 static constexpr _s_i_z_e___t_y_p_e _m_u_l_t_i_I_n_d_e_x_B_u_f_f_e_r_S_i_z_e = _m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e; │ │ │ │ │ -84 │ │ │ │ │ -85private: │ │ │ │ │ +17#include │ │ │ │ │ +18#include │ │ │ │ │ +19#include │ │ │ │ │ +20#include │ │ │ │ │ +21#include │ │ │ │ │ +22 │ │ │ │ │ +23#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/ │ │ │ │ │ +_g_l_o_b_a_l_v_a_l_u_e_d_l_o_c_a_l_f_i_n_i_t_e_e_l_e_m_e_n_t_._h_h> │ │ │ │ │ +24#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ +25#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ +26#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ +27 │ │ │ │ │ +28namespace _D_u_n_e { │ │ │ │ │ +29namespace Functions { │ │ │ │ │ +30 │ │ │ │ │ +31namespace Impl { │ │ │ │ │ +32 │ │ │ │ │ +33 template │ │ │ │ │ +34 struct BDMSimplexLocalInfo │ │ │ │ │ +35 { │ │ │ │ │ +36 static_assert((AlwaysFalse::value),"The requested type of BDM element is │ │ │ │ │ +not implemented, sorry!"); │ │ │ │ │ +37 }; │ │ │ │ │ +38 │ │ │ │ │ +39 template │ │ │ │ │ +40 struct BDMSimplexLocalInfo<2,D,R,1> │ │ │ │ │ +41 { │ │ │ │ │ +42 using FiniteElement = BDM1Simplex2DLocalFiniteElement; │ │ │ │ │ +43 static const std::size_t Variants = 8; │ │ │ │ │ +44 }; │ │ │ │ │ +45 │ │ │ │ │ +46 template │ │ │ │ │ +47 struct BDMSimplexLocalInfo<2,D,R,2> │ │ │ │ │ +48 { │ │ │ │ │ +49 using FiniteElement = BDM2Simplex2DLocalFiniteElement; │ │ │ │ │ +50 static const std::size_t Variants = 8; │ │ │ │ │ +51 }; │ │ │ │ │ +52 │ │ │ │ │ +53 template │ │ │ │ │ +54 struct BDMCubeLocalInfo │ │ │ │ │ +55 { │ │ │ │ │ +56 static_assert((AlwaysFalse::value),"The requested type of BDM element is │ │ │ │ │ +not implemented, sorry!"); │ │ │ │ │ +57 }; │ │ │ │ │ +58 │ │ │ │ │ +59 template │ │ │ │ │ +60 struct BDMCubeLocalInfo<2,D,R,1> │ │ │ │ │ +61 { │ │ │ │ │ +62 using FiniteElement = BDM1Cube2DLocalFiniteElement; │ │ │ │ │ +63 static const std::size_t Variants = 16; │ │ │ │ │ +64 }; │ │ │ │ │ +65 │ │ │ │ │ +66 template │ │ │ │ │ +67 struct BDMCubeLocalInfo<2,D,R,2> │ │ │ │ │ +68 { │ │ │ │ │ +69 using FiniteElement = BDM2Cube2DLocalFiniteElement; │ │ │ │ │ +70 static const std::size_t Variants = 16; │ │ │ │ │ +71 }; │ │ │ │ │ +72 │ │ │ │ │ +73 template │ │ │ │ │ +74 struct BDMCubeLocalInfo<3,D,R,1> │ │ │ │ │ +75 { │ │ │ │ │ +76 using FiniteElement = BDM1Cube3DLocalFiniteElement; │ │ │ │ │ +77 static const std::size_t Variants = 64; │ │ │ │ │ +78 }; │ │ │ │ │ +79 │ │ │ │ │ +80 template │ │ │ │ │ +81 class BDMLocalFiniteElementMap │ │ │ │ │ +82 { │ │ │ │ │ +83 using D = typename GV::ctype; │ │ │ │ │ +84 using CubeFiniteElement = typename BDMCubeLocalInfo:: │ │ │ │ │ +FiniteElement; │ │ │ │ │ +85 using SimplexFiniteElement = typename BDMSimplexLocalInfo:: │ │ │ │ │ +FiniteElement; │ │ │ │ │ 86 │ │ │ │ │ -87 using _P_Q_1_P_r_e_B_a_s_i_s = _L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_<_G_V_,_1_>; │ │ │ │ │ -88 using _P_Q_2_P_r_e_B_a_s_i_s = _L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_<_G_V_,_2_>; │ │ │ │ │ -89 │ │ │ │ │ -90public: │ │ │ │ │ +87 public: │ │ │ │ │ +88 │ │ │ │ │ +89 using T = LocalBasisTraits, R, dim, │ │ │ │ │ +FieldVector, FieldMatrix >; │ │ │ │ │ +90 using FiniteElement = LocalFiniteElementVirtualInterface; │ │ │ │ │ 91 │ │ │ │ │ -_9_3 _T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s(const _G_r_i_d_V_i_e_w& gv) : │ │ │ │ │ -94 _g_r_i_d_V_i_e_w__(gv), │ │ │ │ │ -95 _p_q_1_P_r_e_B_a_s_i_s__(gv), │ │ │ │ │ -96 _p_q_2_P_r_e_B_a_s_i_s__(gv) │ │ │ │ │ -97 {} │ │ │ │ │ -98 │ │ │ │ │ -_1_0_0 void _i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s() │ │ │ │ │ -101 { │ │ │ │ │ -102 _p_q_1_P_r_e_B_a_s_i_s__._i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s(); │ │ │ │ │ -103 _p_q_2_P_r_e_B_a_s_i_s__._i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s(); │ │ │ │ │ -104 } │ │ │ │ │ -105 │ │ │ │ │ -_1_0_7 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ +92 BDMLocalFiniteElementMap(const GV& gv) │ │ │ │ │ +93 : is_(&(gv.indexSet())), orient_(gv.size(0)) │ │ │ │ │ +94 { │ │ │ │ │ +95 cubeVariant_.resize(BDMCubeLocalInfo::Variants); │ │ │ │ │ +96 simplexVariant_.resize(BDMSimplexLocalInfo::Variants); │ │ │ │ │ +97 │ │ │ │ │ +98 // create all variants │ │ │ │ │ +99 for (size_t i = 0; i < cubeVariant_.size(); i++) │ │ │ │ │ +100 cubeVariant_[i] = std:: │ │ │ │ │ +make_shared >(CubeFiniteElement │ │ │ │ │ +(i)); │ │ │ │ │ +101 │ │ │ │ │ +102 for (size_t i = 0; i < simplexVariant_.size(); i++) │ │ │ │ │ +103 simplexVariant_[i] = std:: │ │ │ │ │ +make_shared > │ │ │ │ │ +(SimplexFiniteElement(i)); │ │ │ │ │ +104 │ │ │ │ │ +105 // compute orientation for all elements │ │ │ │ │ +106 // loop once over the grid │ │ │ │ │ +107 for(const auto& cell : elements(gv)) │ │ │ │ │ 108 { │ │ │ │ │ -109 return _g_r_i_d_V_i_e_w__; │ │ │ │ │ -110 } │ │ │ │ │ +109 unsigned int myId = is_->index(cell); │ │ │ │ │ +110 orient_[myId] = 0; │ │ │ │ │ 111 │ │ │ │ │ -_1_1_3 void _u_p_d_a_t_e (const _G_r_i_d_V_i_e_w& gv) │ │ │ │ │ -114 { │ │ │ │ │ -115 _p_q_1_P_r_e_B_a_s_i_s__._u_p_d_a_t_e(gv); │ │ │ │ │ -116 _p_q_2_P_r_e_B_a_s_i_s__._u_p_d_a_t_e(gv); │ │ │ │ │ +112 for (const auto& intersection : intersections(gv,cell)) │ │ │ │ │ +113 { │ │ │ │ │ +114 if (intersection.neighbor() && (is_->index(intersection.outside()) > myId)) │ │ │ │ │ +115 orient_[myId] |= (1 << intersection.indexInInside()); │ │ │ │ │ +116 } │ │ │ │ │ 117 } │ │ │ │ │ -118 │ │ │ │ │ -_1_2_2 _N_o_d_e _m_a_k_e_N_o_d_e() const │ │ │ │ │ +118 } │ │ │ │ │ +119 │ │ │ │ │ +121 template │ │ │ │ │ +122 const FiniteElement& find(const EntityType& e) const │ │ │ │ │ 123 { │ │ │ │ │ -124 return _N_o_d_e{}; │ │ │ │ │ -125 } │ │ │ │ │ -126 │ │ │ │ │ -_1_2_8 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ -129 { │ │ │ │ │ -130 return 2; │ │ │ │ │ -131 } │ │ │ │ │ -132 │ │ │ │ │ -134 template │ │ │ │ │ -_1_3_5 _s_i_z_e___t_y_p_e _s_i_z_e(const SizePrefix& prefix) const │ │ │ │ │ -136 { │ │ │ │ │ -137 return sizeImp(prefix); │ │ │ │ │ -138 } │ │ │ │ │ +124 if (e.type().isCube()) │ │ │ │ │ +125 return *cubeVariant_[orient_[is_->index(e)]]; │ │ │ │ │ +126 else │ │ │ │ │ +127 return *simplexVariant_[orient_[is_->index(e)]]; │ │ │ │ │ +128 } │ │ │ │ │ +129 │ │ │ │ │ +130 private: │ │ │ │ │ +131 std::vector │ │ │ │ │ +> > cubeVariant_; │ │ │ │ │ +132 std::vector > > │ │ │ │ │ +simplexVariant_; │ │ │ │ │ +133 const typename GV::IndexSet* is_; │ │ │ │ │ +134 std::vector orient_; │ │ │ │ │ +135 }; │ │ │ │ │ +136 │ │ │ │ │ +137 │ │ │ │ │ +138} // namespace Impl │ │ │ │ │ 139 │ │ │ │ │ -140private: │ │ │ │ │ -141 │ │ │ │ │ -142 template = 0> │ │ │ │ │ -144 _s_i_z_e___t_y_p_e sizeImp(const SizePrefix& prefix) const │ │ │ │ │ -145 { │ │ │ │ │ -146 if (prefix.size() == 0) │ │ │ │ │ -147 return 2; │ │ │ │ │ -148 if (prefix.size() == 1) │ │ │ │ │ -149 { │ │ │ │ │ -150 if (prefix[0] == 0) │ │ │ │ │ -151 return dim * _p_q_2_P_r_e_B_a_s_i_s__._s_i_z_e(); │ │ │ │ │ -152 if (prefix[0] == 1) │ │ │ │ │ -153 return _p_q_1_P_r_e_B_a_s_i_s__._s_i_z_e(); │ │ │ │ │ -154 } │ │ │ │ │ -155 assert(prefix.size() == 2); │ │ │ │ │ -156 return 0; │ │ │ │ │ -157 } │ │ │ │ │ -158 │ │ │ │ │ -159 template = 0> │ │ │ │ │ -161 _s_i_z_e___t_y_p_e sizeImp(const SizePrefix& prefix) const │ │ │ │ │ -162 { │ │ │ │ │ -163 if (prefix.size() == 0) │ │ │ │ │ -164 return 2; │ │ │ │ │ -165 if (prefix.size() == 1) │ │ │ │ │ -166 { │ │ │ │ │ -167 if (prefix[0] == 0) │ │ │ │ │ -168 return _p_q_2_P_r_e_B_a_s_i_s__._s_i_z_e(); │ │ │ │ │ -169 if (prefix[0] == 1) │ │ │ │ │ -170 return _p_q_1_P_r_e_B_a_s_i_s__._s_i_z_e(); │ │ │ │ │ -171 } │ │ │ │ │ -172 if (prefix.size() == 2) │ │ │ │ │ -173 { │ │ │ │ │ -174 if (prefix[0] == 0) │ │ │ │ │ -175 return dim; │ │ │ │ │ -176 if (prefix[0] == 1) │ │ │ │ │ -177 return 0; │ │ │ │ │ -178 } │ │ │ │ │ -179 assert(prefix.size() == 3); │ │ │ │ │ -180 return 0; │ │ │ │ │ -181 } │ │ │ │ │ -182 │ │ │ │ │ -183public: │ │ │ │ │ -184 │ │ │ │ │ -_1_8_6 _s_i_z_e___t_y_p_e _d_i_m_e_n_s_i_o_n() const │ │ │ │ │ -187 { │ │ │ │ │ -188 return dim * _p_q_2_P_r_e_B_a_s_i_s__._s_i_z_e() + _p_q_1_P_r_e_B_a_s_i_s__._s_i_z_e(); │ │ │ │ │ -189 } │ │ │ │ │ -190 │ │ │ │ │ -_1_9_2 _s_i_z_e___t_y_p_e _m_a_x_N_o_d_e_S_i_z_e() const │ │ │ │ │ -193 { │ │ │ │ │ -194 return dim * _p_q_2_P_r_e_B_a_s_i_s__._m_a_x_N_o_d_e_S_i_z_e() + _p_q_1_P_r_e_B_a_s_i_s__._m_a_x_N_o_d_e_S_i_z_e(); │ │ │ │ │ -195 } │ │ │ │ │ -196 │ │ │ │ │ -197 template │ │ │ │ │ -_1_9_8 It _i_n_d_i_c_e_s(const _N_o_d_e& node, It it) const │ │ │ │ │ -199 { │ │ │ │ │ -200 return indicesImp(node, it); │ │ │ │ │ -201 } │ │ │ │ │ -202 │ │ │ │ │ -_2_0_8 auto _c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r() const │ │ │ │ │ -209 { │ │ │ │ │ -210 namespace CD = _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s; │ │ │ │ │ -211 if constexpr(HI) │ │ │ │ │ -212 return CD::makeDescriptor( │ │ │ │ │ -213 CD::makeUniformDescriptor(_p_q_2_P_r_e_B_a_s_i_s__._s_i_z_e(), │ │ │ │ │ -214 CD::FlatArray{}), │ │ │ │ │ -215 CD::FlatVector{_p_q_1_P_r_e_B_a_s_i_s__._s_i_z_e()}); │ │ │ │ │ -216 else │ │ │ │ │ -217 return CD::Array{ │ │ │ │ │ -218 CD::FlatVector{GV::dimension * _p_q_2_P_r_e_B_a_s_i_s__._s_i_z_e()}, │ │ │ │ │ -219 CD::FlatVector{_p_q_1_P_r_e_B_a_s_i_s__._s_i_z_e()} }; │ │ │ │ │ -220 } │ │ │ │ │ -221 │ │ │ │ │ -222protected: │ │ │ │ │ -223 │ │ │ │ │ -224 template │ │ │ │ │ -_2_2_5 static const void _m_u_l_t_i_I_n_d_e_x_P_u_s_h_F_r_o_n_t(MultiIndex& M, _s_i_z_e___t_y_p_e M0) │ │ │ │ │ -226 { │ │ │ │ │ -227 M.resize(M.size()+1); │ │ │ │ │ -228 for(std::size_t i=M.size()-1; i>0; --i) │ │ │ │ │ -229 M[i] = M[i-1]; │ │ │ │ │ -230 M[0] = M0; │ │ │ │ │ -231 } │ │ │ │ │ -232 │ │ │ │ │ -233 template = 0> │ │ │ │ │ -_2_3_5 It _i_n_d_i_c_e_s_I_m_p(const _N_o_d_e& node, It multiIndices) const │ │ │ │ │ -236 { │ │ │ │ │ -237 using namespace Dune::Indices; │ │ │ │ │ -238 for(std::size_t child=0; child │ │ │ │ │ +153class BrezziDouglasMariniNode; │ │ │ │ │ +154 │ │ │ │ │ +155template │ │ │ │ │ +_1_5_6class _B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_P_r_e_B_a_s_i_s : │ │ │ │ │ +157 public _L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n< BrezziDouglasMariniPreBasis > │ │ │ │ │ +158{ │ │ │ │ │ +159 static const int dim = GV::dimension; │ │ │ │ │ +160 using FiniteElementMap = typename Impl::BDMLocalFiniteElementMap; │ │ │ │ │ +161 │ │ │ │ │ +162public: │ │ │ │ │ +163 │ │ │ │ │ +_1_6_5 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ +_1_6_6 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ +167 │ │ │ │ │ +_1_6_8 using _N_o_d_e = _B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_N_o_d_e_<_G_V_,_ _k_>; │ │ │ │ │ +169 │ │ │ │ │ +_1_7_1 _B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_P_r_e_B_a_s_i_s(const _G_r_i_d_V_i_e_w& gv) : │ │ │ │ │ +172 _g_r_i_d_V_i_e_w__(gv), │ │ │ │ │ +173 _f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__(gv) │ │ │ │ │ +174 { │ │ │ │ │ +175 // There is no inherent reason why the basis shouldn't work for grids with │ │ │ │ │ +more than one │ │ │ │ │ +176 // element types. Somebody simply has to sit down and implement the missing │ │ │ │ │ +bits. │ │ │ │ │ +177 if (gv.indexSet().types(0).size() > 1) │ │ │ │ │ +178 DUNE_THROW(Dune::NotImplemented, "Brezzi-Douglas-Marini basis is only │ │ │ │ │ +implemented for grids with a single element type"); │ │ │ │ │ +179 } │ │ │ │ │ +180 │ │ │ │ │ +_1_8_1 void _i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s() │ │ │ │ │ +182 { │ │ │ │ │ +183 _c_o_d_i_m_O_f_f_s_e_t__[0] = 0; │ │ │ │ │ +184 _c_o_d_i_m_O_f_f_s_e_t__[1] = _c_o_d_i_m_O_f_f_s_e_t__[0] + _d_o_f_s_P_e_r_C_o_d_i_m__[0] * _g_r_i_d_V_i_e_w__.size(0); │ │ │ │ │ +185 //if (dim==3) codimOffset_[2] = codimOffset_[1] + dofsPerCodim[1] * │ │ │ │ │ +gridView_.size(1); │ │ │ │ │ +186 } │ │ │ │ │ +187 │ │ │ │ │ +_1_9_0 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ +191 { │ │ │ │ │ +192 return _g_r_i_d_V_i_e_w__; │ │ │ │ │ +193 } │ │ │ │ │ +194 │ │ │ │ │ +195 /* \brief Update the stored grid view, to be called if the grid has changed │ │ │ │ │ +*/ │ │ │ │ │ +_1_9_6 void _u_p_d_a_t_e (const _G_r_i_d_V_i_e_w& gv) │ │ │ │ │ +197 { │ │ │ │ │ +198 _g_r_i_d_V_i_e_w__ = gv; │ │ │ │ │ +199 } │ │ │ │ │ +200 │ │ │ │ │ +_2_0_4 _N_o_d_e _m_a_k_e_N_o_d_e() const │ │ │ │ │ +205 { │ │ │ │ │ +206 return _N_o_d_e{&_f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__}; │ │ │ │ │ +207 } │ │ │ │ │ +208 │ │ │ │ │ +_2_0_9 _s_i_z_e___t_y_p_e _d_i_m_e_n_s_i_o_n() const │ │ │ │ │ +210 { │ │ │ │ │ +211 return _d_o_f_s_P_e_r_C_o_d_i_m__[0] * _g_r_i_d_V_i_e_w__.size(0) + _d_o_f_s_P_e_r_C_o_d_i_m__[1] * │ │ │ │ │ +_g_r_i_d_V_i_e_w__.size(1); // only 2d │ │ │ │ │ +212 } │ │ │ │ │ +213 │ │ │ │ │ +_2_1_4 _s_i_z_e___t_y_p_e _m_a_x_N_o_d_e_S_i_z_e() const │ │ │ │ │ +215 { │ │ │ │ │ +216 // The implementation currently only supports grids with a single element │ │ │ │ │ +type. │ │ │ │ │ +217 // We can therefore return the actual number of dofs here. │ │ │ │ │ +218 GeometryType elementType = *(_g_r_i_d_V_i_e_w__.indexSet().types(0).begin()); │ │ │ │ │ +219 size_t numFaces = ReferenceElements::general(elementType).size │ │ │ │ │ +(1); │ │ │ │ │ +220 return _d_o_f_s_P_e_r_C_o_d_i_m__[0] + _d_o_f_s_P_e_r_C_o_d_i_m__[1] * numFaces; │ │ │ │ │ +221 } │ │ │ │ │ +222 │ │ │ │ │ +228 template │ │ │ │ │ +_2_2_9 It _i_n_d_i_c_e_s(const _N_o_d_e& node, It it) const │ │ │ │ │ +230 { │ │ │ │ │ +231 const auto& gridIndexSet = _g_r_i_d_V_i_e_w().indexSet(); │ │ │ │ │ +232 const auto& element = node._e_l_e_m_e_n_t(); │ │ │ │ │ +233 │ │ │ │ │ +234 // throw if element is not of predefined type │ │ │ │ │ +235 if (not(element.type().isCube()) and not(element.type().isSimplex())) │ │ │ │ │ +236 DUNE_THROW(Dune::NotImplemented, "BrezziDouglasMariniBasis only implemented │ │ │ │ │ +for cube and simplex elements."); │ │ │ │ │ +237 │ │ │ │ │ +238 for(std::size_t i=0, end=node._s_i_z_e(); i = 0> │ │ │ │ │ -_2_5_9 It _i_n_d_i_c_e_s_I_m_p(const _N_o_d_e& node, It multiIndices) const │ │ │ │ │ -260 { │ │ │ │ │ -261 using namespace Dune::Indices; │ │ │ │ │ -262 for(std::size_t child=0; child _c_o_d_i_m_O_f_f_s_e_t__; │ │ │ │ │ +_2_5_6 FiniteElementMap _f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__; │ │ │ │ │ +257 // Number of dofs per entity type depending on the entity's codimension and │ │ │ │ │ +type │ │ │ │ │ +_2_5_8 std::array _d_o_f_s_P_e_r_C_o_d_i_m__ {{dim*(k-1)*3, dim+(k-1)}}; │ │ │ │ │ +259}; │ │ │ │ │ +260 │ │ │ │ │ +261 │ │ │ │ │ +262 │ │ │ │ │ +263template │ │ │ │ │ +_2_6_4class _B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_N_o_d_e : │ │ │ │ │ +265 public _L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ +266{ │ │ │ │ │ +267 static const int dim = GV::dimension; │ │ │ │ │ +268 │ │ │ │ │ +269public: │ │ │ │ │ +270 │ │ │ │ │ +_2_7_1 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ +_2_7_2 using _E_l_e_m_e_n_t = typename GV::template Codim<0>::Entity; │ │ │ │ │ +_2_7_3 using _F_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p = typename Impl::BDMLocalFiniteElementMap; │ │ │ │ │ +_2_7_4 using _F_i_n_i_t_e_E_l_e_m_e_n_t = Impl::GlobalValuedLocalFiniteElement; │ │ │ │ │ +277 │ │ │ │ │ +_2_7_8 _B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_N_o_d_e(const _F_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p* finiteElementMap) : │ │ │ │ │ +279 _e_l_e_m_e_n_t__(nullptr), │ │ │ │ │ +280 _f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__(finiteElementMap) │ │ │ │ │ +281 {} │ │ │ │ │ 282 │ │ │ │ │ -_2_8_3 _P_Q_1_P_r_e_B_a_s_i_s _p_q_1_P_r_e_B_a_s_i_s__; │ │ │ │ │ -_2_8_4 _P_Q_2_P_r_e_B_a_s_i_s _p_q_2_P_r_e_B_a_s_i_s__; │ │ │ │ │ -285}; │ │ │ │ │ -286 │ │ │ │ │ -287 │ │ │ │ │ +_2_8_4 const _E_l_e_m_e_n_t& _e_l_e_m_e_n_t() const │ │ │ │ │ +285 { │ │ │ │ │ +286 return *_e_l_e_m_e_n_t__; │ │ │ │ │ +287 } │ │ │ │ │ 288 │ │ │ │ │ -289template │ │ │ │ │ -_2_9_0class _T_a_y_l_o_r_H_o_o_d_V_e_l_o_c_i_t_y_T_r_e_e : │ │ │ │ │ -291 public _P_o_w_e_r_B_a_s_i_s_N_o_d_e, GV::dimension> │ │ │ │ │ -292{ │ │ │ │ │ -293 using _P_Q_2_N_o_d_e = _L_a_g_r_a_n_g_e_N_o_d_e_<_G_V_,_2_>; │ │ │ │ │ -294 using _B_a_s_e = _P_o_w_e_r_B_a_s_i_s_N_o_d_e_<_P_Q_2_N_o_d_e_,_ _G_V_:_:_d_i_m_e_n_s_i_o_n_>; │ │ │ │ │ -295 │ │ │ │ │ -296public: │ │ │ │ │ -_2_9_7 _T_a_y_l_o_r_H_o_o_d_V_e_l_o_c_i_t_y_T_r_e_e() │ │ │ │ │ -298 { │ │ │ │ │ -299 for(int i=0; isetChild(i, std::make_shared()); │ │ │ │ │ -301 } │ │ │ │ │ -302}; │ │ │ │ │ -303 │ │ │ │ │ -304template │ │ │ │ │ -_3_0_5class _T_a_y_l_o_r_H_o_o_d_B_a_s_i_s_T_r_e_e : │ │ │ │ │ -306 public _C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e< │ │ │ │ │ -307 TaylorHoodVelocityTree, │ │ │ │ │ -308 LagrangeNode │ │ │ │ │ -309 > │ │ │ │ │ -310{ │ │ │ │ │ -311 using _V_e_l_o_c_i_t_y_N_o_d_e=_T_a_y_l_o_r_H_o_o_d_V_e_l_o_c_i_t_y_T_r_e_e_<_G_V_>; │ │ │ │ │ -312 using _P_r_e_s_s_u_r_e_N_o_d_e=_L_a_g_r_a_n_g_e_N_o_d_e_<_G_V_,_1_>; │ │ │ │ │ +_2_9_3 const _F_i_n_i_t_e_E_l_e_m_e_n_t& _f_i_n_i_t_e_E_l_e_m_e_n_t() const │ │ │ │ │ +294 { │ │ │ │ │ +295 return _f_i_n_i_t_e_E_l_e_m_e_n_t__; │ │ │ │ │ +296 } │ │ │ │ │ +297 │ │ │ │ │ +_2_9_9 void _b_i_n_d(const _E_l_e_m_e_n_t& e) │ │ │ │ │ +300 { │ │ │ │ │ +301 _e_l_e_m_e_n_t__ = &e; │ │ │ │ │ +302 _f_i_n_i_t_e_E_l_e_m_e_n_t__.bind((_f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__->find(*_e_l_e_m_e_n_t__)), e); │ │ │ │ │ +303 this->_s_e_t_S_i_z_e(_f_i_n_i_t_e_E_l_e_m_e_n_t__.size()); │ │ │ │ │ +304 } │ │ │ │ │ +305 │ │ │ │ │ +306protected: │ │ │ │ │ +307 │ │ │ │ │ +_3_0_8 _F_i_n_i_t_e_E_l_e_m_e_n_t _f_i_n_i_t_e_E_l_e_m_e_n_t__; │ │ │ │ │ +_3_0_9 const _E_l_e_m_e_n_t* _e_l_e_m_e_n_t__; │ │ │ │ │ +_3_1_0 const _F_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p* _f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__; │ │ │ │ │ +311}; │ │ │ │ │ +312 │ │ │ │ │ 313 │ │ │ │ │ -314 using _B_a_s_e=_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e_<_V_e_l_o_c_i_t_y_N_o_d_e_,_ _P_r_e_s_s_u_r_e_N_o_d_e_>; │ │ │ │ │ -315 │ │ │ │ │ -316public: │ │ │ │ │ -_3_1_7 _T_a_y_l_o_r_H_o_o_d_B_a_s_i_s_T_r_e_e() │ │ │ │ │ -318 { │ │ │ │ │ -319 this->template setChild<0>(std::make_shared()); │ │ │ │ │ -320 this->template setChild<1>(std::make_shared()); │ │ │ │ │ -321 } │ │ │ │ │ -322}; │ │ │ │ │ -323 │ │ │ │ │ -324 │ │ │ │ │ -325 │ │ │ │ │ -326namespace BasisFactory { │ │ │ │ │ -327 │ │ │ │ │ -_3_3_4inline auto _t_a_y_l_o_r_H_o_o_d() │ │ │ │ │ -335{ │ │ │ │ │ -336 return [](const auto& gridView) { │ │ │ │ │ -337 return _T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s>(gridView); │ │ │ │ │ -338 }; │ │ │ │ │ -339} │ │ │ │ │ -340 │ │ │ │ │ -341} // end namespace BasisFactory │ │ │ │ │ -342 │ │ │ │ │ -343/ │ │ │ │ │ +314 │ │ │ │ │ +315namespace BasisFactory { │ │ │ │ │ +316 │ │ │ │ │ +324template │ │ │ │ │ +_3_2_5auto _b_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i() │ │ │ │ │ +326{ │ │ │ │ │ +327 return [](const auto& gridView) { │ │ │ │ │ +328 return _B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_P_r_e_B_a_s_i_s, k> │ │ │ │ │ +(gridView); │ │ │ │ │ +329 }; │ │ │ │ │ +330} │ │ │ │ │ +331 │ │ │ │ │ +332} // end namespace BasisFactory │ │ │ │ │ +333 │ │ │ │ │ +334 │ │ │ │ │ +335 │ │ │ │ │ +336/ │ │ │ │ │ / ***************************************************************************** │ │ │ │ │ -344// This is the actual global basis implementation based on the reusable │ │ │ │ │ +337// This is the actual global basis implementation based on the reusable │ │ │ │ │ parts. │ │ │ │ │ -345/ │ │ │ │ │ +338/ │ │ │ │ │ / ***************************************************************************** │ │ │ │ │ -346 │ │ │ │ │ -368template │ │ │ │ │ -_3_6_9using _T_a_y_l_o_r_H_o_o_d_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_<_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_<_G_V_> >; │ │ │ │ │ -370 │ │ │ │ │ -371 │ │ │ │ │ -372 │ │ │ │ │ -373} // end namespace Functions │ │ │ │ │ -374} // end namespace Dune │ │ │ │ │ -375 │ │ │ │ │ -376 │ │ │ │ │ -377#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TAYLORHOODBASIS_HH │ │ │ │ │ -_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h │ │ │ │ │ -_l_a_g_r_a_n_g_e_b_a_s_i_s_._h_h │ │ │ │ │ +339 │ │ │ │ │ +347template │ │ │ │ │ +_3_4_8using _B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_B_a_s_i_s = │ │ │ │ │ +_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_<_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_P_r_e_B_a_s_i_s_<_G_V_,_ _k_> >; │ │ │ │ │ +349 │ │ │ │ │ +350} // end namespace Functions │ │ │ │ │ +351} // end namespace Dune │ │ │ │ │ +352 │ │ │ │ │ +353 │ │ │ │ │ +354#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BREZZIDOUGLASMARINIBASIS_HH │ │ │ │ │ +_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h │ │ │ │ │ _n_o_d_e_s_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_t_a_y_l_o_r_H_o_o_d │ │ │ │ │ -auto taylorHood() │ │ │ │ │ -Create a pre-basis factory that can create a Taylor-Hood pre-basis. │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:334 │ │ │ │ │ +_g_l_o_b_a_l_v_a_l_u_e_d_l_o_c_a_l_f_i_n_i_t_e_e_l_e_m_e_n_t_._h_h │ │ │ │ │ +_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_b_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i │ │ │ │ │ +auto brezziDouglasMarini() │ │ │ │ │ +Create a pre-basis factory that can create a Brezzi-Douglas-Marini pre-basis. │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:325 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:47 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_N_o_d_e │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:266 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ +const FiniteElement & finiteElement() const │ │ │ │ │ +Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:293 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_N_o_d_e_:_:_E_l_e_m_e_n_t │ │ │ │ │ +typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:272 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__ │ │ │ │ │ +const FiniteElementMap * finiteElementMap_ │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:310 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_N_o_d_e_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:271 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t__ │ │ │ │ │ +FiniteElement finiteElement_ │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:308 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_N_o_d_e_:_:_F_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p │ │ │ │ │ +typename Impl::BDMLocalFiniteElementMap< GV, dim, double, k > FiniteElementMap │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:273 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_N_o_d_e_:_:_e_l_e_m_e_n_t__ │ │ │ │ │ +const Element * element_ │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:309 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_N_o_d_e_:_:_F_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ +Impl::GlobalValuedLocalFiniteElement< Impl::ContravariantPiolaTransformator, │ │ │ │ │ +typename FiniteElementMap::FiniteElement, Element > FiniteElement │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:276 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_N_o_d_e_:_:_b_i_n_d │ │ │ │ │ +void bind(const Element &e) │ │ │ │ │ +Bind to element. │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:299 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_N_o_d_e_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_N_o_d_e │ │ │ │ │ +BrezziDouglasMariniNode(const FiniteElementMap *finiteElementMap) │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:278 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_N_o_d_e_:_:_e_l_e_m_e_n_t │ │ │ │ │ +const Element & element() const │ │ │ │ │ +Return current element, throw if unbound. │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:284 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_P_r_e_B_a_s_i_s │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:158 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_P_r_e_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:166 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_C_o_d_i_m__ │ │ │ │ │ +std::array< int, 2 > dofsPerCodim_ │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:258 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_P_r_e_B_a_s_i_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ +size_type dimension() const │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:209 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_P_r_e_B_a_s_i_s_:_:_c_o_d_i_m_O_f_f_s_e_t__ │ │ │ │ │ +std::array< size_t, dim+1 > codimOffset_ │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:255 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_P_r_e_B_a_s_i_s_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ +Node makeNode() const │ │ │ │ │ +Create tree node. │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:204 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_P_r_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ +GV GridView │ │ │ │ │ +The grid view that the FE space is defined on. │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:165 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_P_r_e_B_a_s_i_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_P_r_e_B_a_s_i_s │ │ │ │ │ +BrezziDouglasMariniPreBasis(const GridView &gv) │ │ │ │ │ +Constructor for a given grid view object. │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:171 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_P_r_e_B_a_s_i_s_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__ │ │ │ │ │ +FiniteElementMap finiteElementMap_ │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:256 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_P_r_e_B_a_s_i_s_:_:_u_p_d_a_t_e │ │ │ │ │ +void update(const GridView &gv) │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:196 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_P_r_e_B_a_s_i_s_:_:_i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s │ │ │ │ │ +void initializeIndices() │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:181 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ +const GridView & gridView() const │ │ │ │ │ +Obtain the grid view that the basis is defined on. │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:190 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_P_r_e_B_a_s_i_s_:_:_m_a_x_N_o_d_e_S_i_z_e │ │ │ │ │ +size_type maxNodeSize() const │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:214 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w__ │ │ │ │ │ +GridView gridView_ │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:254 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s │ │ │ │ │ +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. │ │ │ │ │ +DDeeffiinniittiioonn brezzidouglasmarinibasis.hh:229 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ Global basis for given pre-basis. │ │ │ │ │ DDeeffiinniittiioonn defaultglobalbasis.hh:50 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:375 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_<_ _G_V_,_ _1_ _> │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s │ │ │ │ │ -It indices(const Node &node, It it) const │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:180 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s │ │ │ │ │ -void initializeIndices() │ │ │ │ │ -Initialize the global indices. │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:98 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_u_p_d_a_t_e │ │ │ │ │ -void update(const GridView &gv) │ │ │ │ │ -Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:128 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_m_a_x_N_o_d_e_S_i_z_e │ │ │ │ │ -size_type maxNodeSize() const │ │ │ │ │ -Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:172 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_s_i_z_e │ │ │ │ │ -size_type size(const SizePrefix &prefix) const │ │ │ │ │ -Return number of possible values for next position in multi index. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismixin.hh:53 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n │ │ │ │ │ +A generic MixIn class for PreBasis. │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismixin.hh:36 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_i_z_e │ │ │ │ │ size_type size() const │ │ │ │ │ DDeeffiinniittiioonn nodes.hh:147 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_B_a_s_i_s_N_o_d_e │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:198 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:252 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_V_e_l_o_c_i_t_y_T_r_e_e │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:292 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_V_e_l_o_c_i_t_y_T_r_e_e_:_:_T_a_y_l_o_r_H_o_o_d_V_e_l_o_c_i_t_y_T_r_e_e │ │ │ │ │ -TaylorHoodVelocityTree() │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:297 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_B_a_s_i_s_T_r_e_e │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:310 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_B_a_s_i_s_T_r_e_e_:_:_T_a_y_l_o_r_H_o_o_d_B_a_s_i_s_T_r_e_e │ │ │ │ │ -TaylorHoodBasisTree() │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:317 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s │ │ │ │ │ -Pre-basis for lowest order Taylor-Hood basis. │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:65 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s │ │ │ │ │ -TaylorHoodPreBasis(const GridView &gv) │ │ │ │ │ -Constructor for a given grid view object. │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:93 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ -const GridView & gridView() const │ │ │ │ │ -Obtain the grid view that the basis is defined on. │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:107 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_m_i_n_M_u_l_t_i_I_n_d_e_x_S_i_z_e │ │ │ │ │ -static constexpr size_type minMultiIndexSize │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:82 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ -size_type size(const SizePrefix &prefix) const │ │ │ │ │ -Return number of possible values for next position in multi index. │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:135 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w__ │ │ │ │ │ -GridView gridView_ │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:281 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ -GV GridView │ │ │ │ │ -The grid view that the FE basis is defined on. │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_u_p_d_a_t_e │ │ │ │ │ -void update(const GridView &gv) │ │ │ │ │ -Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:113 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -auto containerDescriptor() const │ │ │ │ │ -Return an container descriptor depending on the flag HI. Either return a Tuple │ │ │ │ │ -if hybrid indices shou... │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:208 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_p_q_2_P_r_e_B_a_s_i_s__ │ │ │ │ │ -PQ2PreBasis pq2PreBasis_ │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:284 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ -size_type size() const │ │ │ │ │ -Same as size(prefix) with empty prefix. │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:128 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ -size_type dimension() const │ │ │ │ │ -Get the total dimension of the space spanned by this basis. │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:186 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_p_q_1_P_r_e_B_a_s_i_s__ │ │ │ │ │ -PQ1PreBasis pq1PreBasis_ │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:283 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_m_u_l_t_i_I_n_d_e_x_P_u_s_h_F_r_o_n_t │ │ │ │ │ -static const void multiIndexPushFront(MultiIndex &M, size_type M0) │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:225 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e │ │ │ │ │ -static constexpr size_type maxMultiIndexSize │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:81 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ -Node makeNode() const │ │ │ │ │ -Create tree node. │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:122 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s │ │ │ │ │ -It indices(const Node &node, It it) const │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:198 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_m_u_l_t_i_I_n_d_e_x_B_u_f_f_e_r_S_i_z_e │ │ │ │ │ -static constexpr size_type multiIndexBufferSize │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:83 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s │ │ │ │ │ -void initializeIndices() │ │ │ │ │ -Initialize the global indices. │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:100 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_m_a_x_N_o_d_e_S_i_z_e │ │ │ │ │ -size_type maxNodeSize() const │ │ │ │ │ -Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:192 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Type used for indices and size information. │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:76 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s_I_m_p │ │ │ │ │ -It indicesImp(const Node &node, It multiIndices) const │ │ │ │ │ -DDeeffiinniittiioonn taylorhoodbasis.hh:235 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_e_t_S_i_z_e │ │ │ │ │ +void setSize(const size_type size) │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:169 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:191 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00101.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: powerbasis.hh File Reference │ │ │ │ +dune-functions: periodicbasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -73,58 +73,51 @@ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
powerbasis.hh File Reference
│ │ │ │ +
periodicbasis.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/dynamicpowerbasis.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/containerdescriptors.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/containerdescriptors.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/transformedindexbasis.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::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<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.
 
template<std::size_t k, class ChildPreBasisFactory >
auto Dune::Functions::BasisFactory::power (ChildPreBasisFactory &&childPreBasisFactory)
 Create a factory builder that can build a PowerPreBasis.
 
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.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -2,47 +2,38 @@ │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -powerbasis.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_u_t_i_l_i_t_y_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_b_a_s_i_s_t_a_g_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_y_n_a_m_i_c_p_o_w_e_r_b_a_s_i_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ +periodicbasis.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_t_r_a_n_s_f_o_r_m_e_d_i_n_d_e_x_b_a_s_i_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s_<_ _I_M_S_,_ _S_P_B_,_ _C_ _> │ │ │ │ │ -  A pre-basis for power bases. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_P_e_r_i_o_d_i_c_I_n_d_e_x_S_e_t │ │ │ │ │ +  Container storing identified indices for a periodic basis. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_B_u_i_l_d_e_r │ │ │ │ │ +namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_p_o_w_e_r (ChildPreBasisFactory │ │ │ │ │ - &&childPreBasisFactory, const _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y &) │ │ │ │ │ -  Create a pre-basis factory that can build a _P_o_w_e_r_P_r_e_B_a_s_i_s. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_p_o_w_e_r (ChildPreBasisFactory │ │ │ │ │ - &&childPreBasisFactory) │ │ │ │ │ -  Create a factory builder that can build a _P_o_w_e_r_P_r_e_B_a_s_i_s. │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_p_e_r_i_o_d_i_c │ │ │ │ │ + (RawPreBasisIndicator &&rawPreBasisIndicator, PIS &&periodicIndexSet) │ │ │ │ │ +  Create a pre-basis factory that can create a periodic pre-basis. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00101_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: powerbasis.hh Source File │ │ │ │ +dune-functions: periodicbasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,196 +74,226 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
powerbasis.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_POWERBASIS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_POWERBASIS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_PERIODICBASIS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_PERIODICBASIS_HH
│ │ │ │
9
│ │ │ │ -
10#include <dune/common/reservedvector.hh>
│ │ │ │ -
11#include <dune/common/typeutilities.hh>
│ │ │ │ -
12#include <dune/common/indices.hh>
│ │ │ │ -
13
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +
10#include <utility>
│ │ │ │ +
11#include <type_traits>
│ │ │ │ +
12#include <limits>
│ │ │ │ +
13#include <set>
│ │ │ │ +
14#include <vector>
│ │ │ │ +
15
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
19
│ │ │ │ +
20
│ │ │ │ +
21namespace Dune::Functions {
│ │ │ │
22
│ │ │ │ -
23
│ │ │ │ +
23namespace BasisFactory {
│ │ │ │
24
│ │ │ │ -
25namespace Dune {
│ │ │ │ -
26namespace Functions {
│ │ │ │ -
27
│ │ │ │ +
25// The PeriodicBasis class is in the Experimental namespace because we are
│ │ │ │ +
26// not completely sure yet whether we like it. We reserve the right to
│ │ │ │ +
27// modify it without advance warning. Use at your own risk!
│ │ │ │
28
│ │ │ │ -
29// *****************************************************************************
│ │ │ │ -
30// This is the reusable part of the power bases. It contains
│ │ │ │ -
31//
│ │ │ │ -
32// PowerPreBasis
│ │ │ │ -
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
│ │ │ │ -
49template<class IMS, class SPB, std::size_t C>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
51 public DynamicPowerPreBasis<IMS,SPB>
│ │ │ │ -
52{
│ │ │ │ - │ │ │ │ -
54
│ │ │ │ -
55public:
│ │ │ │ -
56
│ │ │ │ -
58 using SubPreBasis = SPB;
│ │ │ │ -
59
│ │ │ │ - │ │ │ │ -
62
│ │ │ │ -
64 using size_type = typename Base::size_type;
│ │ │ │ +
│ │ │ │ +
29namespace Experimental {
│ │ │ │ +
30
│ │ │ │ +
31
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
41{
│ │ │ │ +
42 using IndexPairSet = std::set<std::pair<std::size_t,std::size_t>>;
│ │ │ │ +
43public:
│ │ │ │ +
44
│ │ │ │ +
│ │ │ │ +
52 void unifyIndexPair(std::size_t a, std::size_t b)
│ │ │ │ +
53 {
│ │ │ │ +
54 if (a>b)
│ │ │ │ +
55 std::swap(a,b);
│ │ │ │ +
56 if (a==b)
│ │ │ │ +
57 return;
│ │ │ │ +
58 indexPairSet_.insert(std::make_pair(a,b));
│ │ │ │ +
59 }
│ │ │ │ +
│ │ │ │ +
60
│ │ │ │ +
│ │ │ │ +
61 const auto& indexPairSet() const
│ │ │ │ +
62 {
│ │ │ │ +
63 return indexPairSet_;
│ │ │ │ +
64 }
│ │ │ │ +
│ │ │ │
65
│ │ │ │ - │ │ │ │ -
68
│ │ │ │ -
70 inline static constexpr std::integral_constant<std::size_t,C> children = {};
│ │ │ │ -
71
│ │ │ │ -
77 template<class... SFArgs,
│ │ │ │ -
78 disableCopyMove<PowerPreBasis, SFArgs...> = 0,
│ │ │ │ -
79 enableIfConstructible<SubPreBasis, SFArgs...> = 0>
│ │ │ │ -
│ │ │ │ -
80 explicit PowerPreBasis(SFArgs&&... sfArgs) :
│ │ │ │ -
81 Base(std::size_t(C), std::forward<SFArgs>(sfArgs)...)
│ │ │ │ -
82 {}
│ │ │ │ +
66private:
│ │ │ │ +
67 IndexPairSet indexPairSet_;
│ │ │ │ +
68};
│ │ │ │
│ │ │ │ +
69
│ │ │ │ +
70
│ │ │ │ +
71
│ │ │ │ +
72namespace Impl {
│ │ │ │ +
73
│ │ │ │ +
74// An index transformation for a TransformedIndexPreBasis
│ │ │ │ +
75// implementing periodic functions by merging indices.
│ │ │ │ +
76// Currently only flat indices are supported.
│ │ │ │ +
77class PeriodicIndexingTransformation
│ │ │ │ +
78{
│ │ │ │ +
79public:
│ │ │ │ +
80
│ │ │ │ +
81 static constexpr std::size_t minIndexSize = 1;
│ │ │ │ +
82 static constexpr std::size_t maxIndexSize = 1;
│ │ │ │
83
│ │ │ │ -
│ │ │ │ -
87 Node makeNode() const
│ │ │ │ -
88 {
│ │ │ │ -
89 Node node{};
│ │ │ │ -
90 for (std::size_t i=0; i<children(); ++i)
│ │ │ │ -
91 node.setChild(i, Base::subPreBasis_.makeNode());
│ │ │ │ -
92 return node;
│ │ │ │ -
93 }
│ │ │ │ -
│ │ │ │ -
94
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
97 {
│ │ │ │ -
98 return size(Dune::ReservedVector<size_type, Base::multiIndexBufferSize>{});
│ │ │ │ -
99 }
│ │ │ │ -
│ │ │ │ -
100
│ │ │ │ -
102 template<class SizePrefix>
│ │ │ │ -
│ │ │ │ -
103 size_type size(const SizePrefix& prefix) const
│ │ │ │ -
104 {
│ │ │ │ - │ │ │ │ -
106 }
│ │ │ │ -
│ │ │ │ -
107
│ │ │ │ -
109 template<class NodeType, typename It,
│ │ │ │ -
110 std::enable_if_t<NodeType::isPower, int> = 0>
│ │ │ │ -
│ │ │ │ -
111 It indices(const NodeType& node, It it) const
│ │ │ │ +
84 template<class RawPreBasis, class IndexPairSet>
│ │ │ │ +
85 PeriodicIndexingTransformation(const RawPreBasis& rawPreBasis, const IndexPairSet& indexPairSet)
│ │ │ │ +
86 {
│ │ │ │ +
87 static_assert(RawPreBasis::maxMultiIndexSize==1, "PeriodicIndexingTransformation is only implemented for flat multi-indices");
│ │ │ │ +
88 std::size_t invalid = {std::numeric_limits<std::size_t>::max()};
│ │ │ │ +
89 mappedIdx_.resize(rawPreBasis.size(), invalid);
│ │ │ │ +
90 numIndices_ = 0;
│ │ │ │ +
91 std::size_t i = 0;
│ │ │ │ +
92 for(const auto& [a, b] : indexPairSet)
│ │ │ │ +
93 {
│ │ │ │ +
94 for(; i<=a; ++i)
│ │ │ │ +
95 if (mappedIdx_[i] == invalid)
│ │ │ │ +
96 mappedIdx_[i] = numIndices_++;
│ │ │ │ +
97 mappedIdx_[b] = mappedIdx_[a];
│ │ │ │ +
98 }
│ │ │ │ +
99 for(; i<rawPreBasis.size(); ++i)
│ │ │ │ +
100 if (mappedIdx_[i] == invalid)
│ │ │ │ +
101 mappedIdx_[i] = numIndices_++;
│ │ │ │ +
102 }
│ │ │ │ +
103
│ │ │ │ +
104 template<class MultiIndex, class PreBasis>
│ │ │ │ +
105 void transformIndex(MultiIndex& multiIndex, const PreBasis& preBasis) const
│ │ │ │ +
106 {
│ │ │ │ +
107 multiIndex = {{ mappedIdx_[multiIndex[0]] }};
│ │ │ │ +
108 }
│ │ │ │ +
109
│ │ │ │ +
110 template<class Prefix, class PreBasis>
│ │ │ │ +
111 std::size_t size(const Prefix& prefix, const PreBasis& preBasis) const
│ │ │ │
112 {
│ │ │ │ - │ │ │ │ -
114 }
│ │ │ │ -
│ │ │ │ -
115
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
118 {
│ │ │ │ - │ │ │ │ -
120 }
│ │ │ │ -
│ │ │ │ -
121};
│ │ │ │ -
│ │ │ │ -
122
│ │ │ │ +
113 if (prefix.size() == 1)
│ │ │ │ +
114 return 0;
│ │ │ │ +
115 return numIndices_;
│ │ │ │ +
116 }
│ │ │ │ +
117
│ │ │ │ +
118 template<class PreBasis>
│ │ │ │ +
119 auto dimension(const PreBasis& preBasis) const
│ │ │ │ +
120 {
│ │ │ │ +
121 return numIndices_;
│ │ │ │ +
122 }
│ │ │ │
123
│ │ │ │ -
124
│ │ │ │ -
125namespace BasisFactory {
│ │ │ │ -
126
│ │ │ │ -
139template<std::size_t k, class ChildPreBasisFactory, class IndexMergingStrategy>
│ │ │ │ -
│ │ │ │ -
140auto power(ChildPreBasisFactory&& childPreBasisFactory, const IndexMergingStrategy&)
│ │ │ │ -
141{
│ │ │ │ -
142 return [childPreBasisFactory](const auto& gridView) {
│ │ │ │ -
143 auto childPreBasis = childPreBasisFactory(gridView);
│ │ │ │ - │ │ │ │ -
145 };
│ │ │ │ -
146}
│ │ │ │ -
│ │ │ │ -
147
│ │ │ │ -
158template<std::size_t k, class ChildPreBasisFactory>
│ │ │ │ -
│ │ │ │ -
159auto power(ChildPreBasisFactory&& childPreBasisFactory)
│ │ │ │ -
160{
│ │ │ │ -
161 return [childPreBasisFactory](const auto& gridView) {
│ │ │ │ -
162 auto childPreBasis = childPreBasisFactory(gridView);
│ │ │ │ - │ │ │ │ -
164 };
│ │ │ │ -
165}
│ │ │ │ -
│ │ │ │ -
166
│ │ │ │ -
167} // end namespace BasisFactory
│ │ │ │ +
125 template<class PreBasis>
│ │ │ │ +
126 auto containerDescriptor(const PreBasis& preBasis) const
│ │ │ │ +
127 {
│ │ │ │ + │ │ │ │ +
129 }
│ │ │ │ +
130
│ │ │ │ +
131private:
│ │ │ │ +
132 std::vector<std::size_t> mappedIdx_;
│ │ │ │ +
133 std::size_t numIndices_;
│ │ │ │ +
134};
│ │ │ │ +
135
│ │ │ │ +
136
│ │ │ │ +
137
│ │ │ │ +
138template<class RawPreBasisIndicator>
│ │ │ │ +
139class PeriodicPreBasisFactory
│ │ │ │ +
140{
│ │ │ │ +
141public:
│ │ │ │ +
142 PeriodicPreBasisFactory()
│ │ │ │ +
143 {}
│ │ │ │ +
144
│ │ │ │ +
145 template<class RPBI, class PIS>
│ │ │ │ +
146 PeriodicPreBasisFactory(RPBI&& rawPreBasisIndicator, PIS&& periodicIndexSet) :
│ │ │ │ +
147 rawPreBasisIndicator_(std::forward<RPBI>(rawPreBasisIndicator)),
│ │ │ │ +
148 periodicIndexSet_(std::forward<PIS>(periodicIndexSet))
│ │ │ │ +
149 {}
│ │ │ │ +
150
│ │ │ │ +
151 template<class GridView,
│ │ │ │ +
152 std::enable_if_t<models<Concept::GlobalBasis<GridView>,RawPreBasisIndicator>(), int> = 0>
│ │ │ │ +
153 auto operator()(const GridView& gridView) const
│ │ │ │ +
154 {
│ │ │ │ +
155 const auto& rawPreBasis = rawPreBasisIndicator_.preBasis();
│ │ │ │ +
156 auto transformation = PeriodicIndexingTransformation(rawPreBasis, periodicIndexSet_.indexPairSet());
│ │ │ │ +
157 return Dune::Functions::Experimental::TransformedIndexPreBasis(std::move(rawPreBasis), std::move(transformation));
│ │ │ │ +
158 }
│ │ │ │ +
159
│ │ │ │ +
160 template<class GridView,
│ │ │ │ +
161 std::enable_if_t<models<Concept::PreBasis<GridView>,RawPreBasisIndicator>(), int> = 0>
│ │ │ │ +
162 auto operator()(const GridView& gridView) const
│ │ │ │ +
163 {
│ │ │ │ +
164 const auto& rawPreBasis = rawPreBasisIndicator_;
│ │ │ │ +
165 auto transformation = PeriodicIndexingTransformation(rawPreBasis, periodicIndexSet_.indexPairSet());
│ │ │ │ +
166 return Dune::Functions::Experimental::TransformedIndexPreBasis(std::move(rawPreBasis), std::move(transformation));
│ │ │ │ +
167 }
│ │ │ │
168
│ │ │ │ -
169// Backward compatibility
│ │ │ │ -
170namespace [[deprecated("Will be removed after Dune 2.10")]] BasisBuilder {
│ │ │ │ -
171
│ │ │ │ -
172 using namespace BasisFactory;
│ │ │ │ -
173
│ │ │ │ -
174}
│ │ │ │ -
175
│ │ │ │ -
176
│ │ │ │ -
177} // end namespace Functions
│ │ │ │ -
178} // end namespace Dune
│ │ │ │ +
169 template<class GridView,
│ │ │ │ +
170 std::enable_if_t<not models<Concept::GlobalBasis<GridView>,RawPreBasisIndicator>(), int> = 0,
│ │ │ │ +
171 std::enable_if_t<not models<Concept::PreBasis<GridView>,RawPreBasisIndicator>(), int> = 0>
│ │ │ │ +
172 auto operator()(const GridView& gridView) const
│ │ │ │ +
173 {
│ │ │ │ +
174 auto rawPreBasis = rawPreBasisIndicator_(gridView);
│ │ │ │ +
175 rawPreBasis.initializeIndices();
│ │ │ │ +
176 auto transformation = PeriodicIndexingTransformation(rawPreBasis, periodicIndexSet_.indexPairSet());
│ │ │ │ +
177 return Dune::Functions::Experimental::TransformedIndexPreBasis(std::move(rawPreBasis), std::move(transformation));
│ │ │ │ +
178 }
│ │ │ │
179
│ │ │ │ -
180
│ │ │ │ -
181#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_POWERBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
auto power(ChildPreBasisFactory &&childPreBasisFactory, std::size_t k, const IndexMergingStrategy &)
Create a pre-basis factory that can build a PowerPreBasis.
Definition dynamicpowerbasis.hh:409
│ │ │ │ -
std::enable_if_t< std::is_constructible_v< T, Args... >, int > enableIfConstructible
Helper to constrain forwarding constructors.
Definition type_traits.hh:31
│ │ │ │ -
Definition polynomial.hh:17
│ │ │ │ -
Base class for index merging strategies to simplify detection.
Definition basistags.hh:48
│ │ │ │ -
A pre-basis for dynamic power bases.
Definition dynamicpowerbasis.hh:48
│ │ │ │ -
std::size_t size_type
Type used for indices and size information.
Definition dynamicpowerbasis.hh:60
│ │ │ │ -
auto containerDescriptorImpl(Children children) const
Definition dynamicpowerbasis.hh:372
│ │ │ │ -
size_type sizeImpl(SizePrefix prefix, Children children, BasisFactory::FlatInterleaved) const
Definition dynamicpowerbasis.hh:137
│ │ │ │ -
SubPreBasis subPreBasis_
Definition dynamicpowerbasis.hh:389
│ │ │ │ -
It indicesImpl(const NodeType &node, It multiIndices, Children children, BasisFactory::FlatInterleaved) const
Definition dynamicpowerbasis.hh:262
│ │ │ │ -
Definition nodes.hh:198
│ │ │ │ -
A pre-basis for power bases.
Definition powerbasis.hh:52
│ │ │ │ -
IMS IndexMergingStrategy
Strategy used to merge the global indices of the child factories.
Definition powerbasis.hh:67
│ │ │ │ -
typename Base::size_type size_type
Type used for indices and size information.
Definition powerbasis.hh:64
│ │ │ │ -
SPB SubPreBasis
The child pre-basis.
Definition powerbasis.hh:58
│ │ │ │ -
auto containerDescriptor() const
Return the associated container descriptor.
Definition powerbasis.hh:117
│ │ │ │ -
It indices(const NodeType &node, It it) const
Maps from subtree index set [0..size-1] to a globally unique multi index in global basis.
Definition powerbasis.hh:111
│ │ │ │ -
PowerPreBasis(SFArgs &&... sfArgs)
Constructor for given child pre-basis objects for static size of the power-basis.
Definition powerbasis.hh:80
│ │ │ │ -
size_type size() const
Same as size(prefix) with empty prefix.
Definition powerbasis.hh:96
│ │ │ │ -
Node makeNode() const
Create tree node.
Definition powerbasis.hh:87
│ │ │ │ -
static constexpr std::integral_constant< std::size_t, C > children
Number of children provided as an integral constant.
Definition powerbasis.hh:70
│ │ │ │ -
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition powerbasis.hh:103
│ │ │ │ +
180private:
│ │ │ │ +
181 RawPreBasisIndicator rawPreBasisIndicator_;
│ │ │ │ +
182 PeriodicIndexSet periodicIndexSet_;
│ │ │ │ +
183};
│ │ │ │ +
184
│ │ │ │ +
185} // end namespace BasisFactory::Impl
│ │ │ │ +
186
│ │ │ │ +
187
│ │ │ │ +
188
│ │ │ │ +
202template<class RawPreBasisIndicator, class PIS>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
204 RawPreBasisIndicator&& rawPreBasisIndicator,
│ │ │ │ +
205 PIS&& periodicIndexSet
│ │ │ │ +
206 )
│ │ │ │ +
207{
│ │ │ │ +
208 return Impl::PeriodicPreBasisFactory<std::decay_t<RawPreBasisIndicator>>(
│ │ │ │ +
209 std::forward<RawPreBasisIndicator>(rawPreBasisIndicator),
│ │ │ │ +
210 std::forward<PIS>(periodicIndexSet));
│ │ │ │ +
211}
│ │ │ │ +
│ │ │ │ +
212
│ │ │ │ +
213} // end namespace Experimental
│ │ │ │ +
│ │ │ │ +
214
│ │ │ │ +
215} // end namespace BasisFactory
│ │ │ │ +
216
│ │ │ │ +
217} // end namespace Dune::Functions
│ │ │ │ +
218
│ │ │ │ +
219#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:203
│ │ │ │ +
Definition polynomial.hh:18
│ │ │ │ +
auto containerDescriptor(const PreBasis &preBasis)
Return the container descriptor of the pre-basis, if defined, otherwise ContainerDescriptor::Unknown.
Definition containerdescriptors.hh:73
│ │ │ │ +
Container storing identified indices for a periodic basis.
Definition periodicbasis.hh:41
│ │ │ │ +
void unifyIndexPair(std::size_t a, std::size_t b)
Insert a pair of indices.
Definition periodicbasis.hh:52
│ │ │ │ +
const auto & indexPairSet() const
Definition periodicbasis.hh:61
│ │ │ │ +
A pre-basis transforming multi-indices.
Definition transformedindexbasis.hh:55
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,243 +1,244 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -powerbasis.hh │ │ │ │ │ +periodicbasis.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_POWERBASIS_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_POWERBASIS_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_PERIODICBASIS_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_PERIODICBASIS_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13 │ │ │ │ │ -14#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_u_t_i_l_i_t_y_._h_h> │ │ │ │ │ -15#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ -16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_b_a_s_i_s_t_a_g_s_._h_h> │ │ │ │ │ -17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_y_n_a_m_i_c_p_o_w_e_r_b_a_s_i_s_._h_h> │ │ │ │ │ -18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ -19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ -20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h> │ │ │ │ │ -21#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15 │ │ │ │ │ +16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h> │ │ │ │ │ +18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_t_r_a_n_s_f_o_r_m_e_d_i_n_d_e_x_b_a_s_i_s_._h_h> │ │ │ │ │ +19 │ │ │ │ │ +20 │ │ │ │ │ +21namespace _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s { │ │ │ │ │ 22 │ │ │ │ │ -23 │ │ │ │ │ +23namespace BasisFactory { │ │ │ │ │ 24 │ │ │ │ │ -25namespace _D_u_n_e { │ │ │ │ │ -26namespace Functions { │ │ │ │ │ -27 │ │ │ │ │ +25// The PeriodicBasis class is in the Experimental namespace because we are │ │ │ │ │ +26// not completely sure yet whether we like it. We reserve the right to │ │ │ │ │ +27// modify it without advance warning. Use at your own risk! │ │ │ │ │ 28 │ │ │ │ │ -29/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ -30// This is the reusable part of the power bases. It contains │ │ │ │ │ -31// │ │ │ │ │ -32// PowerPreBasis │ │ │ │ │ -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 │ │ │ │ │ -49template │ │ │ │ │ -_5_0class _P_o_w_e_r_P_r_e_B_a_s_i_s : │ │ │ │ │ -51 public _D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s │ │ │ │ │ -52{ │ │ │ │ │ -53 using _B_a_s_e = _D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_<_I_M_S_,_S_P_B_>; │ │ │ │ │ -54 │ │ │ │ │ -55public: │ │ │ │ │ -56 │ │ │ │ │ -_5_8 using _S_u_b_P_r_e_B_a_s_i_s = SPB; │ │ │ │ │ -59 │ │ │ │ │ -_6_1 using _N_o_d_e = _P_o_w_e_r_B_a_s_i_s_N_o_d_e_<_t_y_p_e_n_a_m_e_ _S_u_b_P_r_e_B_a_s_i_s_:_:_N_o_d_e_,_ _C_>; │ │ │ │ │ -62 │ │ │ │ │ -_6_4 using _s_i_z_e___t_y_p_e = typename _B_a_s_e_:_:_s_i_z_e___t_y_p_e; │ │ │ │ │ +_2_9namespace Experimental { │ │ │ │ │ +30 │ │ │ │ │ +31 │ │ │ │ │ +_4_0class _P_e_r_i_o_d_i_c_I_n_d_e_x_S_e_t │ │ │ │ │ +41{ │ │ │ │ │ +42 using IndexPairSet = std::set>; │ │ │ │ │ +43public: │ │ │ │ │ +44 │ │ │ │ │ +_5_2 void _u_n_i_f_y_I_n_d_e_x_P_a_i_r(std::size_t a, std::size_t b) │ │ │ │ │ +53 { │ │ │ │ │ +54 if (a>b) │ │ │ │ │ +55 std::swap(a,b); │ │ │ │ │ +56 if (a==b) │ │ │ │ │ +57 return; │ │ │ │ │ +58 indexPairSet_.insert(std::make_pair(a,b)); │ │ │ │ │ +59 } │ │ │ │ │ +60 │ │ │ │ │ +_6_1 const auto& _i_n_d_e_x_P_a_i_r_S_e_t() const │ │ │ │ │ +62 { │ │ │ │ │ +63 return indexPairSet_; │ │ │ │ │ +64 } │ │ │ │ │ 65 │ │ │ │ │ -_6_7 using _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y = IMS; │ │ │ │ │ -68 │ │ │ │ │ -_7_0 inline static constexpr std::integral_constant _c_h_i_l_d_r_e_n = {}; │ │ │ │ │ +66private: │ │ │ │ │ +67 IndexPairSet indexPairSet_; │ │ │ │ │ +68}; │ │ │ │ │ +69 │ │ │ │ │ +70 │ │ │ │ │ 71 │ │ │ │ │ -77 template = 0, │ │ │ │ │ -79 _e_n_a_b_l_e_I_f_C_o_n_s_t_r_u_c_t_i_b_l_e<_S_u_b_P_r_e_B_a_s_i_s, SFArgs...> = 0> │ │ │ │ │ -_8_0 explicit _P_o_w_e_r_P_r_e_B_a_s_i_s(SFArgs&&... sfArgs) : │ │ │ │ │ -81 _B_a_s_e(std::size_t(C), std::forward(sfArgs)...) │ │ │ │ │ -82 {} │ │ │ │ │ +72namespace Impl { │ │ │ │ │ +73 │ │ │ │ │ +74// An index transformation for a TransformedIndexPreBasis │ │ │ │ │ +75// implementing periodic functions by merging indices. │ │ │ │ │ +76// Currently only flat indices are supported. │ │ │ │ │ +77class PeriodicIndexingTransformation │ │ │ │ │ +78{ │ │ │ │ │ +79public: │ │ │ │ │ +80 │ │ │ │ │ +81 static constexpr std::size_t minIndexSize = 1; │ │ │ │ │ +82 static constexpr std::size_t maxIndexSize = 1; │ │ │ │ │ 83 │ │ │ │ │ -_8_7 _N_o_d_e _m_a_k_e_N_o_d_e() const │ │ │ │ │ -88 { │ │ │ │ │ -89 _N_o_d_e node{}; │ │ │ │ │ -90 for (std::size_t i=0; i<_c_h_i_l_d_r_e_n(); ++i) │ │ │ │ │ -91 node.setChild(i, _B_a_s_e_:_:_s_u_b_P_r_e_B_a_s_i_s__.makeNode()); │ │ │ │ │ -92 return node; │ │ │ │ │ -93 } │ │ │ │ │ -94 │ │ │ │ │ -_9_6 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ -97 { │ │ │ │ │ -98 return _s_i_z_e(Dune::ReservedVector{}); │ │ │ │ │ -99 } │ │ │ │ │ -100 │ │ │ │ │ -102 template │ │ │ │ │ -_1_0_3 _s_i_z_e___t_y_p_e _s_i_z_e(const SizePrefix& prefix) const │ │ │ │ │ -104 { │ │ │ │ │ -105 return _B_a_s_e_:_:_s_i_z_e_I_m_p_l(prefix, _c_h_i_l_d_r_e_n, _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y{}); │ │ │ │ │ -106 } │ │ │ │ │ -107 │ │ │ │ │ -109 template = 0> │ │ │ │ │ -_1_1_1 It _i_n_d_i_c_e_s(const NodeType& node, It it) const │ │ │ │ │ +84 template │ │ │ │ │ +85 PeriodicIndexingTransformation(const RawPreBasis& rawPreBasis, const │ │ │ │ │ +IndexPairSet& indexPairSet) │ │ │ │ │ +86 { │ │ │ │ │ +87 static_assert(RawPreBasis::maxMultiIndexSize==1, │ │ │ │ │ +"PeriodicIndexingTransformation is only implemented for flat multi-indices"); │ │ │ │ │ +88 std::size_t invalid = {std::numeric_limits::max()}; │ │ │ │ │ +89 mappedIdx_.resize(rawPreBasis.size(), invalid); │ │ │ │ │ +90 numIndices_ = 0; │ │ │ │ │ +91 std::size_t i = 0; │ │ │ │ │ +92 for(const auto& [a, b] : indexPairSet) │ │ │ │ │ +93 { │ │ │ │ │ +94 for(; i<=a; ++i) │ │ │ │ │ +95 if (mappedIdx_[i] == invalid) │ │ │ │ │ +96 mappedIdx_[i] = numIndices_++; │ │ │ │ │ +97 mappedIdx_[b] = mappedIdx_[a]; │ │ │ │ │ +98 } │ │ │ │ │ +99 for(; i │ │ │ │ │ +105 void transformIndex(MultiIndex& multiIndex, const PreBasis& preBasis) const │ │ │ │ │ +106 { │ │ │ │ │ +107 multiIndex = {{ mappedIdx_[multiIndex[0]] }}; │ │ │ │ │ +108 } │ │ │ │ │ +109 │ │ │ │ │ +110 template │ │ │ │ │ +111 std::size_t size(const Prefix& prefix, const PreBasis& preBasis) const │ │ │ │ │ 112 { │ │ │ │ │ -113 return _B_a_s_e_:_:_i_n_d_i_c_e_s_I_m_p_l(node, it, _c_h_i_l_d_r_e_n, _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y{}); │ │ │ │ │ -114 } │ │ │ │ │ -115 │ │ │ │ │ -_1_1_7 auto _c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r() const │ │ │ │ │ -118 { │ │ │ │ │ -119 return _B_a_s_e_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_I_m_p_l(_c_h_i_l_d_r_e_n); │ │ │ │ │ -120 } │ │ │ │ │ -121}; │ │ │ │ │ -122 │ │ │ │ │ +113 if (prefix.size() == 1) │ │ │ │ │ +114 return 0; │ │ │ │ │ +115 return numIndices_; │ │ │ │ │ +116 } │ │ │ │ │ +117 │ │ │ │ │ +118 template │ │ │ │ │ +119 auto dimension(const PreBasis& preBasis) const │ │ │ │ │ +120 { │ │ │ │ │ +121 return numIndices_; │ │ │ │ │ +122 } │ │ │ │ │ 123 │ │ │ │ │ -124 │ │ │ │ │ -125namespace BasisFactory { │ │ │ │ │ -126 │ │ │ │ │ -139template │ │ │ │ │ -_1_4_0auto _p_o_w_e_r(ChildPreBasisFactory&& childPreBasisFactory, const │ │ │ │ │ -_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y&) │ │ │ │ │ -141{ │ │ │ │ │ -142 return [childPreBasisFactory](const auto& gridView) { │ │ │ │ │ -143 auto childPreBasis = childPreBasisFactory(gridView); │ │ │ │ │ -144 return _P_o_w_e_r_P_r_e_B_a_s_i_s_<_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y_,_ _d_e_c_l_t_y_p_e_(_c_h_i_l_d_P_r_e_B_a_s_i_s_)_,_ _k_> │ │ │ │ │ -(std::move(childPreBasis)); │ │ │ │ │ -145 }; │ │ │ │ │ -146} │ │ │ │ │ -147 │ │ │ │ │ -158template │ │ │ │ │ -_1_5_9auto _p_o_w_e_r(ChildPreBasisFactory&& childPreBasisFactory) │ │ │ │ │ -160{ │ │ │ │ │ -161 return [childPreBasisFactory](const auto& gridView) { │ │ │ │ │ -162 auto childPreBasis = childPreBasisFactory(gridView); │ │ │ │ │ -163 return _P_o_w_e_r_P_r_e_B_a_s_i_s_<_B_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d_,_ _d_e_c_l_t_y_p_e_(_c_h_i_l_d_P_r_e_B_a_s_i_s_)_,_ _k_>(std:: │ │ │ │ │ -move(childPreBasis)); │ │ │ │ │ -164 }; │ │ │ │ │ -165} │ │ │ │ │ -166 │ │ │ │ │ -167} // end namespace BasisFactory │ │ │ │ │ +125 template │ │ │ │ │ +126 auto _c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r(const PreBasis& preBasis) const │ │ │ │ │ +127 { │ │ │ │ │ +128 return _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r(preBasis); │ │ │ │ │ +129 } │ │ │ │ │ +130 │ │ │ │ │ +131private: │ │ │ │ │ +132 std::vector mappedIdx_; │ │ │ │ │ +133 std::size_t numIndices_; │ │ │ │ │ +134}; │ │ │ │ │ +135 │ │ │ │ │ +136 │ │ │ │ │ +137 │ │ │ │ │ +138template │ │ │ │ │ +139class PeriodicPreBasisFactory │ │ │ │ │ +140{ │ │ │ │ │ +141public: │ │ │ │ │ +142 PeriodicPreBasisFactory() │ │ │ │ │ +143 {} │ │ │ │ │ +144 │ │ │ │ │ +145 template │ │ │ │ │ +146 PeriodicPreBasisFactory(RPBI&& rawPreBasisIndicator, PIS&& │ │ │ │ │ +periodicIndexSet) : │ │ │ │ │ +147 rawPreBasisIndicator_(std::forward(rawPreBasisIndicator)), │ │ │ │ │ +148 periodicIndexSet_(std::forward(periodicIndexSet)) │ │ │ │ │ +149 {} │ │ │ │ │ +150 │ │ │ │ │ +151 template,RawPreBasisIndicator>(), int> = 0> │ │ │ │ │ +153 auto operator()(const GridView& gridView) const │ │ │ │ │ +154 { │ │ │ │ │ +155 const auto& rawPreBasis = rawPreBasisIndicator_.preBasis(); │ │ │ │ │ +156 auto transformation = PeriodicIndexingTransformation(rawPreBasis, │ │ │ │ │ +periodicIndexSet_.indexPairSet()); │ │ │ │ │ +157 return _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s(std::move │ │ │ │ │ +(rawPreBasis), std::move(transformation)); │ │ │ │ │ +158 } │ │ │ │ │ +159 │ │ │ │ │ +160 template,RawPreBasisIndicator> │ │ │ │ │ +(), int> = 0> │ │ │ │ │ +162 auto operator()(const GridView& gridView) const │ │ │ │ │ +163 { │ │ │ │ │ +164 const auto& rawPreBasis = rawPreBasisIndicator_; │ │ │ │ │ +165 auto transformation = PeriodicIndexingTransformation(rawPreBasis, │ │ │ │ │ +periodicIndexSet_.indexPairSet()); │ │ │ │ │ +166 return _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s(std::move │ │ │ │ │ +(rawPreBasis), std::move(transformation)); │ │ │ │ │ +167 } │ │ │ │ │ 168 │ │ │ │ │ -169// Backward compatibility │ │ │ │ │ -170namespace [[deprecated("Will be removed after Dune 2.10")]] BasisBuilder { │ │ │ │ │ -171 │ │ │ │ │ -172 using namespace BasisFactory; │ │ │ │ │ -173 │ │ │ │ │ -174} │ │ │ │ │ -175 │ │ │ │ │ -176 │ │ │ │ │ -177} // end namespace Functions │ │ │ │ │ -178} // end namespace Dune │ │ │ │ │ +169 template,RawPreBasisIndicator>(), int> = 0, │ │ │ │ │ +171 std::enable_if_t,RawPreBasisIndicator>(), int> = 0> │ │ │ │ │ +172 auto operator()(const GridView& gridView) const │ │ │ │ │ +173 { │ │ │ │ │ +174 auto rawPreBasis = rawPreBasisIndicator_(gridView); │ │ │ │ │ +175 rawPreBasis.initializeIndices(); │ │ │ │ │ +176 auto transformation = PeriodicIndexingTransformation(rawPreBasis, │ │ │ │ │ +periodicIndexSet_.indexPairSet()); │ │ │ │ │ +177 return _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s(std::move │ │ │ │ │ +(rawPreBasis), std::move(transformation)); │ │ │ │ │ +178 } │ │ │ │ │ 179 │ │ │ │ │ -180 │ │ │ │ │ -181#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_POWERBASIS_HH │ │ │ │ │ -_u_t_i_l_i_t_y_._h_h │ │ │ │ │ -_t_y_p_e___t_r_a_i_t_s_._h_h │ │ │ │ │ -_d_y_n_a_m_i_c_p_o_w_e_r_b_a_s_i_s_._h_h │ │ │ │ │ -_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h │ │ │ │ │ +180private: │ │ │ │ │ +181 RawPreBasisIndicator rawPreBasisIndicator_; │ │ │ │ │ +182 PeriodicIndexSet periodicIndexSet_; │ │ │ │ │ +183}; │ │ │ │ │ +184 │ │ │ │ │ +185} // end namespace BasisFactory::Impl │ │ │ │ │ +186 │ │ │ │ │ +187 │ │ │ │ │ +188 │ │ │ │ │ +202template │ │ │ │ │ +_2_0_3auto _p_e_r_i_o_d_i_c( │ │ │ │ │ +204 RawPreBasisIndicator&& rawPreBasisIndicator, │ │ │ │ │ +205 PIS&& periodicIndexSet │ │ │ │ │ +206 ) │ │ │ │ │ +207{ │ │ │ │ │ +208 return Impl::PeriodicPreBasisFactory>( │ │ │ │ │ +209 std::forward(rawPreBasisIndicator), │ │ │ │ │ +210 std::forward(periodicIndexSet)); │ │ │ │ │ +211} │ │ │ │ │ +212 │ │ │ │ │ +213} // end namespace Experimental │ │ │ │ │ +214 │ │ │ │ │ +215} // end namespace BasisFactory │ │ │ │ │ +216 │ │ │ │ │ +217} // end namespace Dune::Functions │ │ │ │ │ +218 │ │ │ │ │ +219#endif // DUNE_FUFEM_PERIODICBASIS_HH │ │ │ │ │ _c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h │ │ │ │ │ -_b_a_s_i_s_t_a_g_s_._h_h │ │ │ │ │ -_n_o_d_e_s_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_p_o_w_e_r │ │ │ │ │ -auto power(ChildPreBasisFactory &&childPreBasisFactory, std::size_t k, const │ │ │ │ │ -IndexMergingStrategy &) │ │ │ │ │ -Create a pre-basis factory that can build a PowerPreBasis. │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:409 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_e_n_a_b_l_e_I_f_C_o_n_s_t_r_u_c_t_i_b_l_e │ │ │ │ │ -std::enable_if_t< std::is_constructible_v< T, Args... >, int > │ │ │ │ │ -enableIfConstructible │ │ │ │ │ -Helper to constrain forwarding constructors. │ │ │ │ │ -DDeeffiinniittiioonn type_traits.hh:31 │ │ │ │ │ -_D_u_n_e │ │ │ │ │ -DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ -Base class for index merging strategies to simplify detection. │ │ │ │ │ -DDeeffiinniittiioonn basistags.hh:48 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s │ │ │ │ │ -A pre-basis for dynamic power bases. │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:48 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Type used for indices and size information. │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_I_m_p_l │ │ │ │ │ -auto containerDescriptorImpl(Children children) const │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:372 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_i_z_e_I_m_p_l │ │ │ │ │ -size_type sizeImpl(SizePrefix prefix, Children children, BasisFactory:: │ │ │ │ │ -FlatInterleaved) const │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:137 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_u_b_P_r_e_B_a_s_i_s__ │ │ │ │ │ -SubPreBasis subPreBasis_ │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:389 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s_I_m_p_l │ │ │ │ │ -It indicesImpl(const NodeType &node, It multiIndices, Children children, │ │ │ │ │ -BasisFactory::FlatInterleaved) const │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:262 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_B_a_s_i_s_N_o_d_e │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:198 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s │ │ │ │ │ -A pre-basis for power bases. │ │ │ │ │ -DDeeffiinniittiioonn powerbasis.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ -IMS IndexMergingStrategy │ │ │ │ │ -Strategy used to merge the global indices of the child factories. │ │ │ │ │ -DDeeffiinniittiioonn powerbasis.hh:67 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -typename Base::size_type size_type │ │ │ │ │ -Type used for indices and size information. │ │ │ │ │ -DDeeffiinniittiioonn powerbasis.hh:64 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_S_u_b_P_r_e_B_a_s_i_s │ │ │ │ │ -SPB SubPreBasis │ │ │ │ │ -The child pre-basis. │ │ │ │ │ -DDeeffiinniittiioonn powerbasis.hh:58 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -auto containerDescriptor() const │ │ │ │ │ -Return the associated container descriptor. │ │ │ │ │ -DDeeffiinniittiioonn powerbasis.hh:117 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s │ │ │ │ │ -It indices(const NodeType &node, It it) const │ │ │ │ │ -Maps from subtree index set [0..size-1] to a globally unique multi index in │ │ │ │ │ -global basis. │ │ │ │ │ -DDeeffiinniittiioonn powerbasis.hh:111 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s │ │ │ │ │ -PowerPreBasis(SFArgs &&... sfArgs) │ │ │ │ │ -Constructor for given child pre-basis objects for static size of the power- │ │ │ │ │ -basis. │ │ │ │ │ -DDeeffiinniittiioonn powerbasis.hh:80 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ -size_type size() const │ │ │ │ │ -Same as size(prefix) with empty prefix. │ │ │ │ │ -DDeeffiinniittiioonn powerbasis.hh:96 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ -Node makeNode() const │ │ │ │ │ -Create tree node. │ │ │ │ │ -DDeeffiinniittiioonn powerbasis.hh:87 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_c_h_i_l_d_r_e_n │ │ │ │ │ -static constexpr std::integral_constant< std::size_t, C > children │ │ │ │ │ -Number of children provided as an integral constant. │ │ │ │ │ -DDeeffiinniittiioonn powerbasis.hh:70 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ -size_type size(const SizePrefix &prefix) const │ │ │ │ │ -Return number of possible values for next position in multi index. │ │ │ │ │ -DDeeffiinniittiioonn powerbasis.hh:103 │ │ │ │ │ +_t_r_a_n_s_f_o_r_m_e_d_i_n_d_e_x_b_a_s_i_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_p_e_r_i_o_d_i_c │ │ │ │ │ +auto periodic(RawPreBasisIndicator &&rawPreBasisIndicator, PIS │ │ │ │ │ +&&periodicIndexSet) │ │ │ │ │ +Create a pre-basis factory that can create a periodic pre-basis. │ │ │ │ │ +DDeeffiinniittiioonn periodicbasis.hh:203 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │ +DDeeffiinniittiioonn polynomial.hh:18 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +auto containerDescriptor(const PreBasis &preBasis) │ │ │ │ │ +Return the container descriptor of the pre-basis, if defined, otherwise │ │ │ │ │ +ContainerDescriptor::Unknown. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_P_e_r_i_o_d_i_c_I_n_d_e_x_S_e_t │ │ │ │ │ +Container storing identified indices for a periodic basis. │ │ │ │ │ +DDeeffiinniittiioonn periodicbasis.hh:41 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_P_e_r_i_o_d_i_c_I_n_d_e_x_S_e_t_:_:_u_n_i_f_y_I_n_d_e_x_P_a_i_r │ │ │ │ │ +void unifyIndexPair(std::size_t a, std::size_t b) │ │ │ │ │ +Insert a pair of indices. │ │ │ │ │ +DDeeffiinniittiioonn periodicbasis.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_P_e_r_i_o_d_i_c_I_n_d_e_x_S_e_t_:_:_i_n_d_e_x_P_a_i_r_S_e_t │ │ │ │ │ +const auto & indexPairSet() const │ │ │ │ │ +DDeeffiinniittiioonn periodicbasis.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s │ │ │ │ │ +A pre-basis transforming multi-indices. │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:55 │ │ │ │ │ _c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00104.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: periodicbasis.hh File Reference │ │ │ │ +dune-functions: leafprebasismappermixin.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -73,51 +73,42 @@ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
periodicbasis.hh File Reference
│ │ │ │ +
leafprebasismappermixin.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <utility>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <limits>
│ │ │ │ -#include <set>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/containerdescriptors.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/transformedindexbasis.hh>
│ │ │ │ +
#include <dune/common/rangeutilities.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/leafprebasismixin.hh>
│ │ │ │ +#include <dune/geometry/referenceelements.hh>
│ │ │ │ +#include <dune/grid/common/mcmgmapper.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::LeafPreBasisMapperMixin< GV >
 A generic MixIn class for PreBasis with flat indices computed from a mapper. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ 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.
 
template<class GridView , class LocalCoefficients >
auto Dune::Functions::subIndexRange (const Dune::MultipleCodimMultipleGeomTypeMapper< GridView > &mapper, const typename GridView::template Codim< 0 >::Entity &element, const LocalCoefficients &localCoefficients)
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -2,38 +2,32 @@ │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -periodicbasis.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_t_r_a_n_s_f_o_r_m_e_d_i_n_d_e_x_b_a_s_i_s_._h_h> │ │ │ │ │ +leafprebasismappermixin.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_P_e_r_i_o_d_i_c_I_n_d_e_x_S_e_t │ │ │ │ │ -  Container storing identified indices for a periodic basis. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_<_ _G_V_ _> │ │ │ │ │ +  A generic MixIn class for PreBasis with flat indices computed from a │ │ │ │ │ + mapper. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y │ │ │ │ │ -  │ │ │ │ │ -namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l │ │ │ │ │ -  │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_p_e_r_i_o_d_i_c │ │ │ │ │ - (RawPreBasisIndicator &&rawPreBasisIndicator, PIS &&periodicIndexSet) │ │ │ │ │ -  Create a pre-basis factory that can create a periodic pre-basis. │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_u_b_I_n_d_e_x_R_a_n_g_e (const Dune:: │ │ │ │ │ + MultipleCodimMultipleGeomTypeMapper< GridView > &mapper, const typename │ │ │ │ │ + GridView::template Codim< 0 >::Entity &element, const LocalCoefficients │ │ │ │ │ + &localCoefficients) │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00104_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: periodicbasis.hh Source File │ │ │ │ +dune-functions: leafprebasismappermixin.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,227 +74,168 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
periodicbasis.hh
│ │ │ │ +
leafprebasismappermixin.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_PERIODICBASIS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_PERIODICBASIS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LEAFPREBASISMAPPERMIXIN_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LEAFPREBASISMAPPERMIXIN_HH
│ │ │ │
9
│ │ │ │ -
10#include <utility>
│ │ │ │ -
11#include <type_traits>
│ │ │ │ -
12#include <limits>
│ │ │ │ -
13#include <set>
│ │ │ │ -
14#include <vector>
│ │ │ │ +
10#include <dune/common/rangeutilities.hh>
│ │ │ │ +
11
│ │ │ │ + │ │ │ │ +
13
│ │ │ │ +
14#include <dune/geometry/referenceelements.hh>
│ │ │ │
15
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +
16#include <dune/grid/common/mcmgmapper.hh>
│ │ │ │ +
17
│ │ │ │ +
18
│ │ │ │
19
│ │ │ │ -
20
│ │ │ │ -
21namespace Dune::Functions {
│ │ │ │ +
20namespace Dune::Functions {
│ │ │ │ +
21
│ │ │ │
22
│ │ │ │ -
23namespace BasisFactory {
│ │ │ │ -
24
│ │ │ │ -
25// The PeriodicBasis class is in the Experimental namespace because we are
│ │ │ │ -
26// not completely sure yet whether we like it. We reserve the right to
│ │ │ │ -
27// modify it without advance warning. Use at your own risk!
│ │ │ │ -
28
│ │ │ │ -
│ │ │ │ -
29namespace Experimental {
│ │ │ │ -
30
│ │ │ │ -
31
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
41{
│ │ │ │ -
42 using IndexPairSet = std::set<std::pair<std::size_t,std::size_t>>;
│ │ │ │ -
43public:
│ │ │ │ -
44
│ │ │ │ -
│ │ │ │ -
52 void unifyIndexPair(std::size_t a, std::size_t b)
│ │ │ │ -
53 {
│ │ │ │ -
54 if (a>b)
│ │ │ │ -
55 std::swap(a,b);
│ │ │ │ -
56 if (a==b)
│ │ │ │ -
57 return;
│ │ │ │ -
58 indexPairSet_.insert(std::make_pair(a,b));
│ │ │ │ -
59 }
│ │ │ │ -
│ │ │ │ -
60
│ │ │ │ -
│ │ │ │ -
61 const auto& indexPairSet() const
│ │ │ │ -
62 {
│ │ │ │ -
63 return indexPairSet_;
│ │ │ │ -
64 }
│ │ │ │ -
│ │ │ │ -
65
│ │ │ │ -
66private:
│ │ │ │ -
67 IndexPairSet indexPairSet_;
│ │ │ │ -
68};
│ │ │ │ -
│ │ │ │ +
23
│ │ │ │ +
24// Helper function returning a random access range
│ │ │ │ +
25// of global indices associated to the element. The ordering
│ │ │ │ +
26// is derived from the LocalCoefficients object.
│ │ │ │ +
27// Having this as a member of MCMGMapper would be nice.
│ │ │ │ +
28// But this would introduce the LocalCoefficient in dune-grid.
│ │ │ │ +
29// This would introduce at least a weak 'conceptual' dependency problem.
│ │ │ │ +
30template<class GridView, class LocalCoefficients>
│ │ │ │ +
│ │ │ │ +
31auto subIndexRange(const Dune::MultipleCodimMultipleGeomTypeMapper<GridView>& mapper, const typename GridView::template Codim<0>::Entity& element, const LocalCoefficients& localCoefficients)
│ │ │ │ +
32{
│ │ │ │ +
33 // Here we make use of the 'hidden' (poorly documented) MCMGMapper feature to support
│ │ │ │ +
34 // multiple DOFs per subentity. However, we do not take care for any reordering.
│ │ │ │ +
35 return Dune::transformedRangeView(Dune::range(localCoefficients.size()), [&](auto localIndex) {
│ │ │ │ +
36 auto localKey = localCoefficients.localKey(localIndex);
│ │ │ │ +
37 return mapper.subIndex(element, localKey.subEntity(), localKey.codim()) + localKey.index();
│ │ │ │ +
38 });
│ │ │ │ +
39}
│ │ │ │ +
│ │ │ │ +
40
│ │ │ │ +
41
│ │ │ │ +
42
│ │ │ │ +
59template<typename GV>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
61 : public LeafPreBasisMixin<LeafPreBasisMapperMixin<GV>>
│ │ │ │ +
62{
│ │ │ │ +
63 static const int gridDim = GV::dimension;
│ │ │ │ +
64
│ │ │ │ +
65public:
│ │ │ │ +
66
│ │ │ │ +
68 using GridView = GV;
│ │ │ │
69
│ │ │ │ -
70
│ │ │ │ -
71
│ │ │ │ -
72namespace Impl {
│ │ │ │ -
73
│ │ │ │ -
74// An index transformation for a TransformedIndexPreBasis
│ │ │ │ -
75// implementing periodic functions by merging indices.
│ │ │ │ -
76// Currently only flat indices are supported.
│ │ │ │ -
77class PeriodicIndexingTransformation
│ │ │ │ -
78{
│ │ │ │ -
79public:
│ │ │ │ -
80
│ │ │ │ -
81 static constexpr std::size_t minIndexSize = 1;
│ │ │ │ -
82 static constexpr std::size_t maxIndexSize = 1;
│ │ │ │ -
83
│ │ │ │ -
84 template<class RawPreBasis, class IndexPairSet>
│ │ │ │ -
85 PeriodicIndexingTransformation(const RawPreBasis& rawPreBasis, const IndexPairSet& indexPairSet)
│ │ │ │ -
86 {
│ │ │ │ -
87 static_assert(RawPreBasis::maxMultiIndexSize==1, "PeriodicIndexingTransformation is only implemented for flat multi-indices");
│ │ │ │ -
88 std::size_t invalid = {std::numeric_limits<std::size_t>::max()};
│ │ │ │ -
89 mappedIdx_.resize(rawPreBasis.size(), invalid);
│ │ │ │ -
90 numIndices_ = 0;
│ │ │ │ -
91 std::size_t i = 0;
│ │ │ │ -
92 for(const auto& [a, b] : indexPairSet)
│ │ │ │ -
93 {
│ │ │ │ -
94 for(; i<=a; ++i)
│ │ │ │ -
95 if (mappedIdx_[i] == invalid)
│ │ │ │ -
96 mappedIdx_[i] = numIndices_++;
│ │ │ │ -
97 mappedIdx_[b] = mappedIdx_[a];
│ │ │ │ -
98 }
│ │ │ │ -
99 for(; i<rawPreBasis.size(); ++i)
│ │ │ │ -
100 if (mappedIdx_[i] == invalid)
│ │ │ │ -
101 mappedIdx_[i] = numIndices_++;
│ │ │ │ -
102 }
│ │ │ │ -
103
│ │ │ │ -
104 template<class MultiIndex, class PreBasis>
│ │ │ │ -
105 void transformIndex(MultiIndex& multiIndex, const PreBasis& preBasis) const
│ │ │ │ -
106 {
│ │ │ │ -
107 multiIndex = {{ mappedIdx_[multiIndex[0]] }};
│ │ │ │ -
108 }
│ │ │ │ -
109
│ │ │ │ -
110 template<class Prefix, class PreBasis>
│ │ │ │ -
111 std::size_t size(const Prefix& prefix, const PreBasis& preBasis) const
│ │ │ │ -
112 {
│ │ │ │ -
113 if (prefix.size() == 1)
│ │ │ │ -
114 return 0;
│ │ │ │ -
115 return numIndices_;
│ │ │ │ -
116 }
│ │ │ │ -
117
│ │ │ │ -
118 template<class PreBasis>
│ │ │ │ -
119 auto dimension(const PreBasis& preBasis) const
│ │ │ │ -
120 {
│ │ │ │ -
121 return numIndices_;
│ │ │ │ -
122 }
│ │ │ │ -
123
│ │ │ │ -
125 template<class PreBasis>
│ │ │ │ -
126 auto containerDescriptor(const PreBasis& preBasis) const
│ │ │ │ -
127 {
│ │ │ │ - │ │ │ │ +
71 using size_type = std::size_t;
│ │ │ │ +
72
│ │ │ │ +
│ │ │ │ +
74 LeafPreBasisMapperMixin(const GridView& gv, Dune::MCMGLayout layout) :
│ │ │ │ +
75 gridView_(gv),
│ │ │ │ +
76 mapper_(gridView_, std::move(layout))
│ │ │ │ +
77 {}
│ │ │ │ +
│ │ │ │ +
78
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
81 {
│ │ │ │ +
82 // Determine upper bound for node size by traversing
│ │ │ │ +
83 // the layout for all element types in the grid
│ │ │ │ +
84 maxNodeSize_ = 0;
│ │ │ │ +
85 for(const GeometryType& elementType : gridView_.indexSet().types(0))
│ │ │ │ +
86 {
│ │ │ │ +
87 auto referenceElement = Dune::referenceElement<double, gridDim>(elementType);
│ │ │ │ +
88 for(auto codim : Dune::range(gridDim+1))
│ │ │ │ +
89 for(auto i : Dune::range(referenceElement.size(codim)))
│ │ │ │ +
90 maxNodeSize_ += mapper_.layout()(referenceElement.type(i, codim), gridDim);
│ │ │ │ +
91 }
│ │ │ │ +
92 }
│ │ │ │ +
│ │ │ │ +
93
│ │ │ │ +
│ │ │ │ +
95 const GridView& gridView() const
│ │ │ │ +
96 {
│ │ │ │ +
97 return gridView_;
│ │ │ │ +
98 }
│ │ │ │ +
│ │ │ │ +
99
│ │ │ │ +
│ │ │ │ +
101 void update(const GridView& gv)
│ │ │ │ +
102 {
│ │ │ │ +
103 gridView_ = gv;
│ │ │ │ +
104 mapper_.update(gridView_);
│ │ │ │ +
105 }
│ │ │ │ +
│ │ │ │ +
106
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
109 {
│ │ │ │ +
110 return mapper_.size();
│ │ │ │ +
111 }
│ │ │ │ +
│ │ │ │ +
112
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
115 {
│ │ │ │ +
116 return maxNodeSize_;
│ │ │ │ +
117 }
│ │ │ │ +
│ │ │ │ +
118
│ │ │ │ +
120 template<class Node, class It>
│ │ │ │ +
│ │ │ │ +
121 It indices(const Node& node, It it) const
│ │ │ │ +
122 {
│ │ │ │ +
123 for(const auto& globalIndex : subIndexRange(mapper_, node.element(), node.finiteElement().localCoefficients()))
│ │ │ │ +
124 {
│ │ │ │ +
125 *it = {{ (size_type)globalIndex }};
│ │ │ │ +
126 ++it;
│ │ │ │ +
127 }
│ │ │ │ +
128 return it;
│ │ │ │
129 }
│ │ │ │ +
│ │ │ │
130
│ │ │ │ -
131private:
│ │ │ │ -
132 std::vector<std::size_t> mappedIdx_;
│ │ │ │ -
133 std::size_t numIndices_;
│ │ │ │ -
134};
│ │ │ │ -
135
│ │ │ │ +
131protected:
│ │ │ │ + │ │ │ │ +
133 Dune::MultipleCodimMultipleGeomTypeMapper<GridView> mapper_;
│ │ │ │ +
134 std::size_t maxNodeSize_;
│ │ │ │ +
135};
│ │ │ │ +
│ │ │ │
136
│ │ │ │
137
│ │ │ │ -
138template<class RawPreBasisIndicator>
│ │ │ │ -
139class PeriodicPreBasisFactory
│ │ │ │ -
140{
│ │ │ │ -
141public:
│ │ │ │ -
142 PeriodicPreBasisFactory()
│ │ │ │ -
143 {}
│ │ │ │ -
144
│ │ │ │ -
145 template<class RPBI, class PIS>
│ │ │ │ -
146 PeriodicPreBasisFactory(RPBI&& rawPreBasisIndicator, PIS&& periodicIndexSet) :
│ │ │ │ -
147 rawPreBasisIndicator_(std::forward<RPBI>(rawPreBasisIndicator)),
│ │ │ │ -
148 periodicIndexSet_(std::forward<PIS>(periodicIndexSet))
│ │ │ │ -
149 {}
│ │ │ │ -
150
│ │ │ │ -
151 template<class GridView,
│ │ │ │ -
152 std::enable_if_t<models<Concept::GlobalBasis<GridView>,RawPreBasisIndicator>(), int> = 0>
│ │ │ │ -
153 auto operator()(const GridView& gridView) const
│ │ │ │ -
154 {
│ │ │ │ -
155 const auto& rawPreBasis = rawPreBasisIndicator_.preBasis();
│ │ │ │ -
156 auto transformation = PeriodicIndexingTransformation(rawPreBasis, periodicIndexSet_.indexPairSet());
│ │ │ │ -
157 return Dune::Functions::Experimental::TransformedIndexPreBasis(std::move(rawPreBasis), std::move(transformation));
│ │ │ │ -
158 }
│ │ │ │ -
159
│ │ │ │ -
160 template<class GridView,
│ │ │ │ -
161 std::enable_if_t<models<Concept::PreBasis<GridView>,RawPreBasisIndicator>(), int> = 0>
│ │ │ │ -
162 auto operator()(const GridView& gridView) const
│ │ │ │ -
163 {
│ │ │ │ -
164 const auto& rawPreBasis = rawPreBasisIndicator_;
│ │ │ │ -
165 auto transformation = PeriodicIndexingTransformation(rawPreBasis, periodicIndexSet_.indexPairSet());
│ │ │ │ -
166 return Dune::Functions::Experimental::TransformedIndexPreBasis(std::move(rawPreBasis), std::move(transformation));
│ │ │ │ -
167 }
│ │ │ │ -
168
│ │ │ │ -
169 template<class GridView,
│ │ │ │ -
170 std::enable_if_t<not models<Concept::GlobalBasis<GridView>,RawPreBasisIndicator>(), int> = 0,
│ │ │ │ -
171 std::enable_if_t<not models<Concept::PreBasis<GridView>,RawPreBasisIndicator>(), int> = 0>
│ │ │ │ -
172 auto operator()(const GridView& gridView) const
│ │ │ │ -
173 {
│ │ │ │ -
174 auto rawPreBasis = rawPreBasisIndicator_(gridView);
│ │ │ │ -
175 rawPreBasis.initializeIndices();
│ │ │ │ -
176 auto transformation = PeriodicIndexingTransformation(rawPreBasis, periodicIndexSet_.indexPairSet());
│ │ │ │ -
177 return Dune::Functions::Experimental::TransformedIndexPreBasis(std::move(rawPreBasis), std::move(transformation));
│ │ │ │ -
178 }
│ │ │ │ -
179
│ │ │ │ -
180private:
│ │ │ │ -
181 RawPreBasisIndicator rawPreBasisIndicator_;
│ │ │ │ -
182 PeriodicIndexSet periodicIndexSet_;
│ │ │ │ -
183};
│ │ │ │ -
184
│ │ │ │ -
185} // end namespace BasisFactory::Impl
│ │ │ │ -
186
│ │ │ │ -
187
│ │ │ │ -
188
│ │ │ │ -
202template<class RawPreBasisIndicator, class PIS>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
204 RawPreBasisIndicator&& rawPreBasisIndicator,
│ │ │ │ -
205 PIS&& periodicIndexSet
│ │ │ │ -
206 )
│ │ │ │ -
207{
│ │ │ │ -
208 return Impl::PeriodicPreBasisFactory<std::decay_t<RawPreBasisIndicator>>(
│ │ │ │ -
209 std::forward<RawPreBasisIndicator>(rawPreBasisIndicator),
│ │ │ │ -
210 std::forward<PIS>(periodicIndexSet));
│ │ │ │ -
211}
│ │ │ │ -
│ │ │ │ -
212
│ │ │ │ -
213} // end namespace Experimental
│ │ │ │ -
│ │ │ │ -
214
│ │ │ │ -
215} // end namespace BasisFactory
│ │ │ │ -
216
│ │ │ │ -
217} // end namespace Dune::Functions
│ │ │ │ -
218
│ │ │ │ -
219#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:203
│ │ │ │ +
138
│ │ │ │ +
139} // end namespace Dune::Functions
│ │ │ │ +
140
│ │ │ │ +
141#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LEAFPREBASISMAPPERMIXIN_HH
│ │ │ │ + │ │ │ │
Definition polynomial.hh:18
│ │ │ │ -
auto containerDescriptor(const PreBasis &preBasis)
Return the container descriptor of the pre-basis, if defined, otherwise ContainerDescriptor::Unknown.
Definition containerdescriptors.hh:73
│ │ │ │ -
Container storing identified indices for a periodic basis.
Definition periodicbasis.hh:41
│ │ │ │ -
void unifyIndexPair(std::size_t a, std::size_t b)
Insert a pair of indices.
Definition periodicbasis.hh:52
│ │ │ │ -
const auto & indexPairSet() const
Definition periodicbasis.hh:61
│ │ │ │ -
A pre-basis transforming multi-indices.
Definition transformedindexbasis.hh:55
│ │ │ │ - │ │ │ │ +
auto subIndexRange(const Dune::MultipleCodimMultipleGeomTypeMapper< GridView > &mapper, const typename GridView::template Codim< 0 >::Entity &element, const LocalCoefficients &localCoefficients)
Definition leafprebasismappermixin.hh:31
│ │ │ │ +
A generic MixIn class for PreBasis with flat indices computed from a mapper.
Definition leafprebasismappermixin.hh:62
│ │ │ │ +
const GridView & gridView() const
Export the stored GridView.
Definition leafprebasismappermixin.hh:95
│ │ │ │ +
size_type dimension() const
Return total number of basis functions.
Definition leafprebasismappermixin.hh:108
│ │ │ │ +
std::size_t maxNodeSize_
Definition leafprebasismappermixin.hh:134
│ │ │ │ +
Dune::MultipleCodimMultipleGeomTypeMapper< GridView > mapper_
Definition leafprebasismappermixin.hh:133
│ │ │ │ +
std::size_t size_type
Type used for index digits.
Definition leafprebasismappermixin.hh:71
│ │ │ │ +
void update(const GridView &gv)
Update the stored GridView.
Definition leafprebasismappermixin.hh:101
│ │ │ │ +
LeafPreBasisMapperMixin(const GridView &gv, Dune::MCMGLayout layout)
Construct from GridView and local DOF layout.
Definition leafprebasismappermixin.hh:74
│ │ │ │ +
GV GridView
Type of the associated GridView.
Definition leafprebasismappermixin.hh:68
│ │ │ │ +
size_type maxNodeSize() const
Return maximal number of basis functions per element.
Definition leafprebasismappermixin.hh:114
│ │ │ │ +
GridView gridView_
Definition leafprebasismappermixin.hh:132
│ │ │ │ +
void initializeIndices()
Initialize the global index information.
Definition leafprebasismappermixin.hh:80
│ │ │ │ +
It indices(const Node &node, It it) const
Fill cache with global indices of DOFs associated to the given bound node.
Definition leafprebasismappermixin.hh:121
│ │ │ │ +
A generic MixIn class for PreBasis.
Definition leafprebasismixin.hh:36
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,244 +1,196 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -periodicbasis.hh │ │ │ │ │ +leafprebasismappermixin.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_PERIODICBASIS_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_PERIODICBASIS_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LEAFPREBASISMAPPERMIXIN_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LEAFPREBASISMAPPERMIXIN_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ +10#include │ │ │ │ │ +11 │ │ │ │ │ +12#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ +13 │ │ │ │ │ +14#include │ │ │ │ │ 15 │ │ │ │ │ -16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ -17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h> │ │ │ │ │ -18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_t_r_a_n_s_f_o_r_m_e_d_i_n_d_e_x_b_a_s_i_s_._h_h> │ │ │ │ │ +16#include │ │ │ │ │ +17 │ │ │ │ │ +18 │ │ │ │ │ 19 │ │ │ │ │ -20 │ │ │ │ │ -21namespace _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s { │ │ │ │ │ +20namespace _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s { │ │ │ │ │ +21 │ │ │ │ │ 22 │ │ │ │ │ -23namespace BasisFactory { │ │ │ │ │ -24 │ │ │ │ │ -25// The PeriodicBasis class is in the Experimental namespace because we are │ │ │ │ │ -26// not completely sure yet whether we like it. We reserve the right to │ │ │ │ │ -27// modify it without advance warning. Use at your own risk! │ │ │ │ │ -28 │ │ │ │ │ -_2_9namespace Experimental { │ │ │ │ │ -30 │ │ │ │ │ -31 │ │ │ │ │ -_4_0class _P_e_r_i_o_d_i_c_I_n_d_e_x_S_e_t │ │ │ │ │ -41{ │ │ │ │ │ -42 using IndexPairSet = std::set>; │ │ │ │ │ -43public: │ │ │ │ │ -44 │ │ │ │ │ -_5_2 void _u_n_i_f_y_I_n_d_e_x_P_a_i_r(std::size_t a, std::size_t b) │ │ │ │ │ -53 { │ │ │ │ │ -54 if (a>b) │ │ │ │ │ -55 std::swap(a,b); │ │ │ │ │ -56 if (a==b) │ │ │ │ │ -57 return; │ │ │ │ │ -58 indexPairSet_.insert(std::make_pair(a,b)); │ │ │ │ │ -59 } │ │ │ │ │ -60 │ │ │ │ │ -_6_1 const auto& _i_n_d_e_x_P_a_i_r_S_e_t() const │ │ │ │ │ -62 { │ │ │ │ │ -63 return indexPairSet_; │ │ │ │ │ -64 } │ │ │ │ │ -65 │ │ │ │ │ -66private: │ │ │ │ │ -67 IndexPairSet indexPairSet_; │ │ │ │ │ -68}; │ │ │ │ │ +23 │ │ │ │ │ +24// Helper function returning a random access range │ │ │ │ │ +25// of global indices associated to the element. The ordering │ │ │ │ │ +26// is derived from the LocalCoefficients object. │ │ │ │ │ +27// Having this as a member of MCMGMapper would be nice. │ │ │ │ │ +28// But this would introduce the LocalCoefficient in dune-grid. │ │ │ │ │ +29// This would introduce at least a weak 'conceptual' dependency problem. │ │ │ │ │ +30template │ │ │ │ │ +_3_1auto _s_u_b_I_n_d_e_x_R_a_n_g_e(const Dune::MultipleCodimMultipleGeomTypeMapper& │ │ │ │ │ +mapper, const typename GridView::template Codim<0>::Entity& element, const │ │ │ │ │ +LocalCoefficients& localCoefficients) │ │ │ │ │ +32{ │ │ │ │ │ +33 // Here we make use of the 'hidden' (poorly documented) MCMGMapper feature │ │ │ │ │ +to support │ │ │ │ │ +34 // multiple DOFs per subentity. However, we do not take care for any │ │ │ │ │ +reordering. │ │ │ │ │ +35 return Dune::transformedRangeView(Dune::range(localCoefficients.size()), [&] │ │ │ │ │ +(auto localIndex) { │ │ │ │ │ +36 auto localKey = localCoefficients.localKey(localIndex); │ │ │ │ │ +37 return mapper.subIndex(element, localKey.subEntity(), localKey.codim()) + │ │ │ │ │ +localKey.index(); │ │ │ │ │ +38 }); │ │ │ │ │ +39} │ │ │ │ │ +40 │ │ │ │ │ +41 │ │ │ │ │ +42 │ │ │ │ │ +59template │ │ │ │ │ +_6_0class _L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n │ │ │ │ │ +61 : public _L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n> │ │ │ │ │ +62{ │ │ │ │ │ +63 static const int gridDim = GV::dimension; │ │ │ │ │ +64 │ │ │ │ │ +65public: │ │ │ │ │ +66 │ │ │ │ │ +_6_8 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ 69 │ │ │ │ │ -70 │ │ │ │ │ -71 │ │ │ │ │ -72namespace Impl { │ │ │ │ │ -73 │ │ │ │ │ -74// An index transformation for a TransformedIndexPreBasis │ │ │ │ │ -75// implementing periodic functions by merging indices. │ │ │ │ │ -76// Currently only flat indices are supported. │ │ │ │ │ -77class PeriodicIndexingTransformation │ │ │ │ │ -78{ │ │ │ │ │ -79public: │ │ │ │ │ -80 │ │ │ │ │ -81 static constexpr std::size_t minIndexSize = 1; │ │ │ │ │ -82 static constexpr std::size_t maxIndexSize = 1; │ │ │ │ │ -83 │ │ │ │ │ -84 template │ │ │ │ │ -85 PeriodicIndexingTransformation(const RawPreBasis& rawPreBasis, const │ │ │ │ │ -IndexPairSet& indexPairSet) │ │ │ │ │ +_7_1 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ +72 │ │ │ │ │ +_7_4 _L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n(const _G_r_i_d_V_i_e_w& gv, Dune::MCMGLayout layout) : │ │ │ │ │ +75 _g_r_i_d_V_i_e_w__(gv), │ │ │ │ │ +76 _m_a_p_p_e_r__(_g_r_i_d_V_i_e_w__, std::move(layout)) │ │ │ │ │ +77 {} │ │ │ │ │ +78 │ │ │ │ │ +_8_0 void _i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s() │ │ │ │ │ +81 { │ │ │ │ │ +82 // Determine upper bound for node size by traversing │ │ │ │ │ +83 // the layout for all element types in the grid │ │ │ │ │ +84 _m_a_x_N_o_d_e_S_i_z_e__ = 0; │ │ │ │ │ +85 for(const GeometryType& elementType : _g_r_i_d_V_i_e_w__.indexSet().types(0)) │ │ │ │ │ 86 { │ │ │ │ │ -87 static_assert(RawPreBasis::maxMultiIndexSize==1, │ │ │ │ │ -"PeriodicIndexingTransformation is only implemented for flat multi-indices"); │ │ │ │ │ -88 std::size_t invalid = {std::numeric_limits::max()}; │ │ │ │ │ -89 mappedIdx_.resize(rawPreBasis.size(), invalid); │ │ │ │ │ -90 numIndices_ = 0; │ │ │ │ │ -91 std::size_t i = 0; │ │ │ │ │ -92 for(const auto& [a, b] : indexPairSet) │ │ │ │ │ -93 { │ │ │ │ │ -94 for(; i<=a; ++i) │ │ │ │ │ -95 if (mappedIdx_[i] == invalid) │ │ │ │ │ -96 mappedIdx_[i] = numIndices_++; │ │ │ │ │ -97 mappedIdx_[b] = mappedIdx_[a]; │ │ │ │ │ +87 auto referenceElement = Dune::referenceElement │ │ │ │ │ +(elementType); │ │ │ │ │ +88 for(auto codim : Dune::range(gridDim+1)) │ │ │ │ │ +89 for(auto i : Dune::range(referenceElement.size(codim))) │ │ │ │ │ +90 _m_a_x_N_o_d_e_S_i_z_e__ += _m_a_p_p_e_r__.layout()(referenceElement.type(i, codim), gridDim); │ │ │ │ │ +91 } │ │ │ │ │ +92 } │ │ │ │ │ +93 │ │ │ │ │ +_9_5 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ +96 { │ │ │ │ │ +97 return _g_r_i_d_V_i_e_w__; │ │ │ │ │ 98 } │ │ │ │ │ -99 for(; i │ │ │ │ │ -105 void transformIndex(MultiIndex& multiIndex, const PreBasis& preBasis) const │ │ │ │ │ -106 { │ │ │ │ │ -107 multiIndex = {{ mappedIdx_[multiIndex[0]] }}; │ │ │ │ │ -108 } │ │ │ │ │ -109 │ │ │ │ │ -110 template │ │ │ │ │ -111 std::size_t size(const Prefix& prefix, const PreBasis& preBasis) const │ │ │ │ │ -112 { │ │ │ │ │ -113 if (prefix.size() == 1) │ │ │ │ │ -114 return 0; │ │ │ │ │ -115 return numIndices_; │ │ │ │ │ -116 } │ │ │ │ │ -117 │ │ │ │ │ -118 template │ │ │ │ │ -119 auto dimension(const PreBasis& preBasis) const │ │ │ │ │ -120 { │ │ │ │ │ -121 return numIndices_; │ │ │ │ │ -122 } │ │ │ │ │ -123 │ │ │ │ │ -125 template │ │ │ │ │ -126 auto _c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r(const PreBasis& preBasis) const │ │ │ │ │ -127 { │ │ │ │ │ -128 return _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r(preBasis); │ │ │ │ │ +99 │ │ │ │ │ +_1_0_1 void _u_p_d_a_t_e(const _G_r_i_d_V_i_e_w& gv) │ │ │ │ │ +102 { │ │ │ │ │ +103 _g_r_i_d_V_i_e_w__ = gv; │ │ │ │ │ +104 _m_a_p_p_e_r__.update(_g_r_i_d_V_i_e_w__); │ │ │ │ │ +105 } │ │ │ │ │ +106 │ │ │ │ │ +_1_0_8 _s_i_z_e___t_y_p_e _d_i_m_e_n_s_i_o_n() const │ │ │ │ │ +109 { │ │ │ │ │ +110 return _m_a_p_p_e_r__.size(); │ │ │ │ │ +111 } │ │ │ │ │ +112 │ │ │ │ │ +_1_1_4 _s_i_z_e___t_y_p_e _m_a_x_N_o_d_e_S_i_z_e() const │ │ │ │ │ +115 { │ │ │ │ │ +116 return _m_a_x_N_o_d_e_S_i_z_e__; │ │ │ │ │ +117 } │ │ │ │ │ +118 │ │ │ │ │ +120 template │ │ │ │ │ +_1_2_1 It _i_n_d_i_c_e_s(const Node& node, It it) const │ │ │ │ │ +122 { │ │ │ │ │ +123 for(const auto& globalIndex : _s_u_b_I_n_d_e_x_R_a_n_g_e(_m_a_p_p_e_r__, node.element(), │ │ │ │ │ +node.finiteElement().localCoefficients())) │ │ │ │ │ +124 { │ │ │ │ │ +125 *it = {{ (_s_i_z_e___t_y_p_e)globalIndex }}; │ │ │ │ │ +126 ++it; │ │ │ │ │ +127 } │ │ │ │ │ +128 return it; │ │ │ │ │ 129 } │ │ │ │ │ 130 │ │ │ │ │ -131private: │ │ │ │ │ -132 std::vector mappedIdx_; │ │ │ │ │ -133 std::size_t numIndices_; │ │ │ │ │ -134}; │ │ │ │ │ -135 │ │ │ │ │ +131protected: │ │ │ │ │ +_1_3_2 _G_r_i_d_V_i_e_w _g_r_i_d_V_i_e_w__; │ │ │ │ │ +_1_3_3 Dune::MultipleCodimMultipleGeomTypeMapper _m_a_p_p_e_r__; │ │ │ │ │ +_1_3_4 std::size_t _m_a_x_N_o_d_e_S_i_z_e__; │ │ │ │ │ +135}; │ │ │ │ │ 136 │ │ │ │ │ 137 │ │ │ │ │ -138template │ │ │ │ │ -139class PeriodicPreBasisFactory │ │ │ │ │ -140{ │ │ │ │ │ -141public: │ │ │ │ │ -142 PeriodicPreBasisFactory() │ │ │ │ │ -143 {} │ │ │ │ │ -144 │ │ │ │ │ -145 template │ │ │ │ │ -146 PeriodicPreBasisFactory(RPBI&& rawPreBasisIndicator, PIS&& │ │ │ │ │ -periodicIndexSet) : │ │ │ │ │ -147 rawPreBasisIndicator_(std::forward(rawPreBasisIndicator)), │ │ │ │ │ -148 periodicIndexSet_(std::forward(periodicIndexSet)) │ │ │ │ │ -149 {} │ │ │ │ │ -150 │ │ │ │ │ -151 template,RawPreBasisIndicator>(), int> = 0> │ │ │ │ │ -153 auto operator()(const GridView& gridView) const │ │ │ │ │ -154 { │ │ │ │ │ -155 const auto& rawPreBasis = rawPreBasisIndicator_.preBasis(); │ │ │ │ │ -156 auto transformation = PeriodicIndexingTransformation(rawPreBasis, │ │ │ │ │ -periodicIndexSet_.indexPairSet()); │ │ │ │ │ -157 return _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s(std::move │ │ │ │ │ -(rawPreBasis), std::move(transformation)); │ │ │ │ │ -158 } │ │ │ │ │ -159 │ │ │ │ │ -160 template,RawPreBasisIndicator> │ │ │ │ │ -(), int> = 0> │ │ │ │ │ -162 auto operator()(const GridView& gridView) const │ │ │ │ │ -163 { │ │ │ │ │ -164 const auto& rawPreBasis = rawPreBasisIndicator_; │ │ │ │ │ -165 auto transformation = PeriodicIndexingTransformation(rawPreBasis, │ │ │ │ │ -periodicIndexSet_.indexPairSet()); │ │ │ │ │ -166 return _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s(std::move │ │ │ │ │ -(rawPreBasis), std::move(transformation)); │ │ │ │ │ -167 } │ │ │ │ │ -168 │ │ │ │ │ -169 template,RawPreBasisIndicator>(), int> = 0, │ │ │ │ │ -171 std::enable_if_t,RawPreBasisIndicator>(), int> = 0> │ │ │ │ │ -172 auto operator()(const GridView& gridView) const │ │ │ │ │ -173 { │ │ │ │ │ -174 auto rawPreBasis = rawPreBasisIndicator_(gridView); │ │ │ │ │ -175 rawPreBasis.initializeIndices(); │ │ │ │ │ -176 auto transformation = PeriodicIndexingTransformation(rawPreBasis, │ │ │ │ │ -periodicIndexSet_.indexPairSet()); │ │ │ │ │ -177 return _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s(std::move │ │ │ │ │ -(rawPreBasis), std::move(transformation)); │ │ │ │ │ -178 } │ │ │ │ │ -179 │ │ │ │ │ -180private: │ │ │ │ │ -181 RawPreBasisIndicator rawPreBasisIndicator_; │ │ │ │ │ -182 PeriodicIndexSet periodicIndexSet_; │ │ │ │ │ -183}; │ │ │ │ │ -184 │ │ │ │ │ -185} // end namespace BasisFactory::Impl │ │ │ │ │ -186 │ │ │ │ │ -187 │ │ │ │ │ -188 │ │ │ │ │ -202template │ │ │ │ │ -_2_0_3auto _p_e_r_i_o_d_i_c( │ │ │ │ │ -204 RawPreBasisIndicator&& rawPreBasisIndicator, │ │ │ │ │ -205 PIS&& periodicIndexSet │ │ │ │ │ -206 ) │ │ │ │ │ -207{ │ │ │ │ │ -208 return Impl::PeriodicPreBasisFactory>( │ │ │ │ │ -209 std::forward(rawPreBasisIndicator), │ │ │ │ │ -210 std::forward(periodicIndexSet)); │ │ │ │ │ -211} │ │ │ │ │ -212 │ │ │ │ │ -213} // end namespace Experimental │ │ │ │ │ -214 │ │ │ │ │ -215} // end namespace BasisFactory │ │ │ │ │ -216 │ │ │ │ │ -217} // end namespace Dune::Functions │ │ │ │ │ -218 │ │ │ │ │ -219#endif // DUNE_FUFEM_PERIODICBASIS_HH │ │ │ │ │ -_t_r_a_n_s_f_o_r_m_e_d_i_n_d_e_x_b_a_s_i_s_._h_h │ │ │ │ │ -_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_p_e_r_i_o_d_i_c │ │ │ │ │ -auto periodic(RawPreBasisIndicator &&rawPreBasisIndicator, PIS │ │ │ │ │ -&&periodicIndexSet) │ │ │ │ │ -Create a pre-basis factory that can create a periodic pre-basis. │ │ │ │ │ -DDeeffiinniittiioonn periodicbasis.hh:203 │ │ │ │ │ +138 │ │ │ │ │ +139} // end namespace Dune::Functions │ │ │ │ │ +140 │ │ │ │ │ +141#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LEAFPREBASISMAPPERMIXIN_HH │ │ │ │ │ +_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:18 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -auto containerDescriptor(const PreBasis &preBasis) │ │ │ │ │ -Return the container descriptor of the pre-basis, if defined, otherwise │ │ │ │ │ -ContainerDescriptor::Unknown. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_P_e_r_i_o_d_i_c_I_n_d_e_x_S_e_t │ │ │ │ │ -Container storing identified indices for a periodic basis. │ │ │ │ │ -DDeeffiinniittiioonn periodicbasis.hh:41 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_P_e_r_i_o_d_i_c_I_n_d_e_x_S_e_t_:_:_u_n_i_f_y_I_n_d_e_x_P_a_i_r │ │ │ │ │ -void unifyIndexPair(std::size_t a, std::size_t b) │ │ │ │ │ -Insert a pair of indices. │ │ │ │ │ -DDeeffiinniittiioonn periodicbasis.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_P_e_r_i_o_d_i_c_I_n_d_e_x_S_e_t_:_:_i_n_d_e_x_P_a_i_r_S_e_t │ │ │ │ │ -const auto & indexPairSet() const │ │ │ │ │ -DDeeffiinniittiioonn periodicbasis.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s │ │ │ │ │ -A pre-basis transforming multi-indices. │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:55 │ │ │ │ │ -_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_u_b_I_n_d_e_x_R_a_n_g_e │ │ │ │ │ +auto subIndexRange(const Dune::MultipleCodimMultipleGeomTypeMapper< GridView > │ │ │ │ │ +&mapper, const typename GridView::template Codim< 0 >::Entity &element, const │ │ │ │ │ +LocalCoefficients &localCoefficients) │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismappermixin.hh:31 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n │ │ │ │ │ +A generic MixIn class for PreBasis with flat indices computed from a mapper. │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismappermixin.hh:62 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ +const GridView & gridView() const │ │ │ │ │ +Export the stored GridView. │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismappermixin.hh:95 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ +size_type dimension() const │ │ │ │ │ +Return total number of basis functions. │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismappermixin.hh:108 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_:_:_m_a_x_N_o_d_e_S_i_z_e__ │ │ │ │ │ +std::size_t maxNodeSize_ │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismappermixin.hh:134 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_:_:_m_a_p_p_e_r__ │ │ │ │ │ +Dune::MultipleCodimMultipleGeomTypeMapper< GridView > mapper_ │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismappermixin.hh:133 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +Type used for index digits. │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismappermixin.hh:71 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_:_:_u_p_d_a_t_e │ │ │ │ │ +void update(const GridView &gv) │ │ │ │ │ +Update the stored GridView. │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismappermixin.hh:101 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n │ │ │ │ │ +LeafPreBasisMapperMixin(const GridView &gv, Dune::MCMGLayout layout) │ │ │ │ │ +Construct from GridView and local DOF layout. │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismappermixin.hh:74 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ +GV GridView │ │ │ │ │ +Type of the associated GridView. │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismappermixin.hh:68 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_:_:_m_a_x_N_o_d_e_S_i_z_e │ │ │ │ │ +size_type maxNodeSize() const │ │ │ │ │ +Return maximal number of basis functions per element. │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismappermixin.hh:114 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_:_:_g_r_i_d_V_i_e_w__ │ │ │ │ │ +GridView gridView_ │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismappermixin.hh:132 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_:_:_i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s │ │ │ │ │ +void initializeIndices() │ │ │ │ │ +Initialize the global index information. │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismappermixin.hh:80 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_:_:_i_n_d_i_c_e_s │ │ │ │ │ +It indices(const Node &node, It it) const │ │ │ │ │ +Fill cache with global indices of DOFs associated to the given bound node. │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismappermixin.hh:121 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n │ │ │ │ │ +A generic MixIn class for PreBasis. │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismixin.hh:36 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00107.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: dynamicpowerbasis.hh File Reference │ │ │ │ +dune-functions: powerbasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -73,54 +73,58 @@ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
dynamicpowerbasis.hh File Reference
│ │ │ │ +
powerbasis.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/containerdescriptors.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ +#include <dune/functions/common/utility.hh>
│ │ │ │ +#include <dune/functions/common/type_traits.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/basistags.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/dynamicpowerbasis.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ #include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/containerdescriptors.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::DynamicPowerPreBasis< IMS, SPB >
 A pre-basis for dynamic power bases. 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<class ChildPreBasisFactory , class IndexMergingStrategy >
auto Dune::Functions::BasisFactory::power (ChildPreBasisFactory &&childPreBasisFactory, std::size_t k, const IndexMergingStrategy &)
 Create a pre-basis factory that can build a PowerPreBasis.
 
template<class ChildPreBasisFactory >
auto Dune::Functions::BasisFactory::power (ChildPreBasisFactory &&childPreBasisFactory, std::size_t k)
 Create a factory builder that can build a PowerPreBasis.
 
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.
 
template<std::size_t k, class ChildPreBasisFactory >
auto Dune::Functions::BasisFactory::power (ChildPreBasisFactory &&childPreBasisFactory)
 Create a factory builder that can build a PowerPreBasis.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -2,42 +2,47 @@ │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -dynamicpowerbasis.hh File Reference │ │ │ │ │ +powerbasis.hh File Reference │ │ │ │ │ #include │ │ │ │ │ #include │ │ │ │ │ #include │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_u_t_i_l_i_t_y_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_b_a_s_i_s_t_a_g_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_y_n_a_m_i_c_p_o_w_e_r_b_a_s_i_s_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_<_ _I_M_S_,_ _S_P_B_ _> │ │ │ │ │ -  A pre-basis for dynamic power bases. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s_<_ _I_M_S_,_ _S_P_B_,_ _C_ _> │ │ │ │ │ +  A pre-basis for power bases. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y │ │ │ │ │   │ │ │ │ │ +namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_B_u_i_l_d_e_r │ │ │ │ │ +  │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ +template │ │ │ │ │ auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_p_o_w_e_r (ChildPreBasisFactory │ │ │ │ │ - &&childPreBasisFactory, std::size_t k, const _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y &) │ │ │ │ │ + &&childPreBasisFactory, const _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y &) │ │ │ │ │   Create a pre-basis factory that can build a _P_o_w_e_r_P_r_e_B_a_s_i_s. │ │ │ │ │   │ │ │ │ │ -template │ │ │ │ │ +template │ │ │ │ │ auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_p_o_w_e_r (ChildPreBasisFactory │ │ │ │ │ - &&childPreBasisFactory, std::size_t k) │ │ │ │ │ + &&childPreBasisFactory) │ │ │ │ │   Create a factory builder that can build a _P_o_w_e_r_P_r_e_B_a_s_i_s. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00107_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: dynamicpowerbasis.hh Source File │ │ │ │ +dune-functions: powerbasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,512 +74,196 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
dynamicpowerbasis.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DYNAMICPOWERBASIS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DYNAMICPOWERBASIS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_POWERBASIS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_POWERBASIS_HH
│ │ │ │
9
│ │ │ │
10#include <dune/common/reservedvector.hh>
│ │ │ │
11#include <dune/common/typeutilities.hh>
│ │ │ │
12#include <dune/common/indices.hh>
│ │ │ │
13
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ -
20
│ │ │ │ -
21
│ │ │ │ + │ │ │ │ + │ │ │ │
22
│ │ │ │ -
23namespace Dune {
│ │ │ │ -
24namespace Functions {
│ │ │ │ -
25
│ │ │ │ -
26
│ │ │ │ -
27// *****************************************************************************
│ │ │ │ -
28// This is the reusable part of the dynamic power bases. It contains
│ │ │ │ -
29//
│ │ │ │ -
30// DynamicPowerPreBasis
│ │ │ │ +
23
│ │ │ │ +
24
│ │ │ │ +
25namespace Dune {
│ │ │ │ +
26namespace Functions {
│ │ │ │ +
27
│ │ │ │ +
28
│ │ │ │ +
29// *****************************************************************************
│ │ │ │ +
30// This is the reusable part of the power bases. It contains
│ │ │ │
31//
│ │ │ │ -
32// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ -
33// state. These components do _not_ depend on the global basis and local view
│ │ │ │ -
34// and can be used without a global basis.
│ │ │ │ -
35// *****************************************************************************
│ │ │ │ -
36
│ │ │ │ -
46template<class IMS, class SPB>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
48{
│ │ │ │ -
49 static const bool isBlocked = std::is_same_v<IMS,BasisFactory::BlockedLexicographic> or std::is_same_v<IMS,BasisFactory::BlockedInterleaved>;
│ │ │ │ -
50
│ │ │ │ -
51public:
│ │ │ │ -
52
│ │ │ │ -
54 using SubPreBasis = SPB;
│ │ │ │ -
55
│ │ │ │ -
57 using GridView = typename SPB::GridView;
│ │ │ │ -
58
│ │ │ │ -
60 using size_type = std::size_t;
│ │ │ │ -
61
│ │ │ │ - │ │ │ │ -
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;
│ │ │ │ +
32// PowerPreBasis
│ │ │ │ +
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
│ │ │ │ +
49template<class IMS, class SPB, std::size_t C>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
51 public DynamicPowerPreBasis<IMS,SPB>
│ │ │ │ +
52{
│ │ │ │ + │ │ │ │ +
54
│ │ │ │ +
55public:
│ │ │ │ +
56
│ │ │ │ +
58 using SubPreBasis = SPB;
│ │ │ │ +
59
│ │ │ │ + │ │ │ │ +
62
│ │ │ │ +
64 using size_type = typename Base::size_type;
│ │ │ │ +
65
│ │ │ │ + │ │ │ │ +
68
│ │ │ │ +
70 inline static constexpr std::integral_constant<std::size_t,C> children = {};
│ │ │ │
71
│ │ │ │
77 template<class... SFArgs,
│ │ │ │ -
78 disableCopyMove<DynamicPowerPreBasis, SFArgs...> = 0,
│ │ │ │ -
79 enableIfConstructible<SubPreBasis, SFArgs...> = 0>
│ │ │ │ +
78 disableCopyMove<PowerPreBasis, SFArgs...> = 0,
│ │ │ │ +
79 enableIfConstructible<SubPreBasis, SFArgs...> = 0>
│ │ │ │
│ │ │ │ -
80 explicit DynamicPowerPreBasis(std::size_t c, SFArgs&&... sfArgs) :
│ │ │ │ -
81 children_(c),
│ │ │ │ -
82 subPreBasis_(std::forward<SFArgs>(sfArgs)...)
│ │ │ │ -
83 {
│ │ │ │ -
84 static_assert(models<Concept::PreBasis<GridView>, SubPreBasis>(), "Subprebasis passed to DynamicPowerPreBasis does not model the PreBasis concept.");
│ │ │ │ -
85 }
│ │ │ │ -
│ │ │ │ -
86
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
89 {
│ │ │ │ -
90 subPreBasis_.initializeIndices();
│ │ │ │ -
91 }
│ │ │ │ -
│ │ │ │ -
92
│ │ │ │ -
│ │ │ │ -
94 const GridView& gridView() const
│ │ │ │ -
95 {
│ │ │ │ -
96 return subPreBasis_.gridView();
│ │ │ │ -
97 }
│ │ │ │ -
│ │ │ │ -
98
│ │ │ │ -
│ │ │ │ -
100 void update(const GridView& gv)
│ │ │ │ -
101 {
│ │ │ │ -
102 subPreBasis_.update(gv);
│ │ │ │ -
103 }
│ │ │ │ -
│ │ │ │ -
104
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
109 {
│ │ │ │ -
110 auto node = Node{children_};
│ │ │ │ -
111 for (std::size_t i=0; i<children_; ++i)
│ │ │ │ -
112 node.setChild(i, subPreBasis_.makeNode());
│ │ │ │ -
113 return node;
│ │ │ │ +
80 explicit PowerPreBasis(SFArgs&&... sfArgs) :
│ │ │ │ +
81 Base(std::size_t(C), std::forward<SFArgs>(sfArgs)...)
│ │ │ │ +
82 {}
│ │ │ │ +
│ │ │ │ +
83
│ │ │ │ +
│ │ │ │ +
87 Node makeNode() const
│ │ │ │ +
88 {
│ │ │ │ +
89 Node node{};
│ │ │ │ +
90 for (std::size_t i=0; i<children(); ++i)
│ │ │ │ +
91 node.setChild(i, Base::subPreBasis_.makeNode());
│ │ │ │ +
92 return node;
│ │ │ │ +
93 }
│ │ │ │ +
│ │ │ │ +
94
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
97 {
│ │ │ │ +
98 return size(Dune::ReservedVector<size_type, Base::multiIndexBufferSize>{});
│ │ │ │ +
99 }
│ │ │ │ +
│ │ │ │ +
100
│ │ │ │ +
102 template<class SizePrefix>
│ │ │ │ +
│ │ │ │ +
103 size_type size(const SizePrefix& prefix) const
│ │ │ │ +
104 {
│ │ │ │ + │ │ │ │ +
106 }
│ │ │ │ +
│ │ │ │ +
107
│ │ │ │ +
109 template<class NodeType, typename It,
│ │ │ │ +
110 std::enable_if_t<NodeType::isPower, int> = 0>
│ │ │ │ +
│ │ │ │ +
111 It indices(const NodeType& node, It it) const
│ │ │ │ +
112 {
│ │ │ │ + │ │ │ │
114 }
│ │ │ │
│ │ │ │
115
│ │ │ │ -
│ │ │ │ -
116 std::size_t children() const
│ │ │ │ -
117 {
│ │ │ │ -
118 return children_;
│ │ │ │ -
119 }
│ │ │ │ -
│ │ │ │ -
120
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
123 {
│ │ │ │ -
124 return size(Dune::ReservedVector<size_type, multiIndexBufferSize>{});
│ │ │ │ -
125 }
│ │ │ │ -
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
118 {
│ │ │ │ + │ │ │ │ +
120 }
│ │ │ │ +
│ │ │ │ +
121};
│ │ │ │ +
│ │ │ │ +
122
│ │ │ │ +
123
│ │ │ │ +
124
│ │ │ │ +
125namespace BasisFactory {
│ │ │ │
126
│ │ │ │ -
128 template<class SizePrefix>
│ │ │ │ -
│ │ │ │ -
129 size_type size(const SizePrefix& prefix) const
│ │ │ │ -
130 {
│ │ │ │ -
131 return sizeImpl(prefix, children_, IndexMergingStrategy{});
│ │ │ │ -
132 }
│ │ │ │ -
│ │ │ │ -
133
│ │ │ │ -
134protected:
│ │ │ │ -
135
│ │ │ │ -
136 template<class SizePrefix, class Children>
│ │ │ │ -
│ │ │ │ -
137 size_type sizeImpl(SizePrefix prefix, Children children, BasisFactory::FlatInterleaved) const
│ │ │ │ -
138 {
│ │ │ │ -
139 // The root index size is the root index size of a single subnode
│ │ │ │ -
140 // multiplied by the number of subnodes, because we enumerate all
│ │ │ │ -
141 // child indices in a row.
│ │ │ │ -
142 if (prefix.size() == 0)
│ │ │ │ -
143 return children*subPreBasis_.size();
│ │ │ │ -
144
│ │ │ │ -
145 // The FlatInterleaved index merging strategy only changes the first
│ │ │ │ -
146 // index digit. Hence, we have to reconstruct the corresponding digit
│ │ │ │ -
147 // for the subtree and can then return the corresponding size of the subtree.
│ │ │ │ -
148 prefix[0] = prefix[0] / children;
│ │ │ │ -
149 return subPreBasis_.size(prefix);
│ │ │ │ -
150 }
│ │ │ │ -
│ │ │ │ -
151
│ │ │ │ -
152 template<class SizePrefix, class Children>
│ │ │ │ -
│ │ │ │ -
153 size_type sizeImpl(SizePrefix prefix, Children children, 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. Then we can append
│ │ │ │ -
164 // the other prefix entries unmodified, because the index tree
│ │ │ │ -
165 // looks the same after the first level.
│ │ │ │ -
166
│ │ │ │ -
167 // The FlatLexicographic index merging strategy only changes the first
│ │ │ │ -
168 // index digit. Hence, we have to reconstruct the corresponding digit
│ │ │ │ -
169 // for the subtree and can then return the corresponding size of the subtree.
│ │ │ │ -
170 prefix[0] = prefix[0] % subPreBasis_.size();
│ │ │ │ -
171 return subPreBasis_.size(prefix);
│ │ │ │ -
172 }
│ │ │ │ +
139template<std::size_t k, class ChildPreBasisFactory, class IndexMergingStrategy>
│ │ │ │ +
│ │ │ │ +
140auto power(ChildPreBasisFactory&& childPreBasisFactory, const IndexMergingStrategy&)
│ │ │ │ +
141{
│ │ │ │ +
142 return [childPreBasisFactory](const auto& gridView) {
│ │ │ │ +
143 auto childPreBasis = childPreBasisFactory(gridView);
│ │ │ │ + │ │ │ │ +
145 };
│ │ │ │ +
146}
│ │ │ │ +
│ │ │ │ +
147
│ │ │ │ +
158template<std::size_t k, class ChildPreBasisFactory>
│ │ │ │ +
│ │ │ │ +
159auto power(ChildPreBasisFactory&& childPreBasisFactory)
│ │ │ │ +
160{
│ │ │ │ +
161 return [childPreBasisFactory](const auto& gridView) {
│ │ │ │ +
162 auto childPreBasis = childPreBasisFactory(gridView);
│ │ │ │ + │ │ │ │ +
164 };
│ │ │ │ +
165}
│ │ │ │
│ │ │ │ +
166
│ │ │ │ +
167} // end namespace BasisFactory
│ │ │ │ +
168
│ │ │ │ +
169// Backward compatibility
│ │ │ │ +
170namespace [[deprecated("Will be removed after Dune 2.10")]] BasisBuilder {
│ │ │ │ +
171
│ │ │ │ +
172 using namespace BasisFactory;
│ │ │ │
173
│ │ │ │ -
174 template<class MultiIndex>
│ │ │ │ -
│ │ │ │ -
175 static void multiIndexPopFront(MultiIndex& M)
│ │ │ │ -
176 {
│ │ │ │ -
177 for(std::size_t i=0; i<M.size()-1; ++i)
│ │ │ │ -
178 M[i] = M[i+1];
│ │ │ │ -
179 M.resize(M.size()-1);
│ │ │ │ -
180 }
│ │ │ │ -
│ │ │ │ -
181
│ │ │ │ -
182 template<class SizePrefix, class Children>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
184 {
│ │ │ │ -
185 if (prefix.size() == 0)
│ │ │ │ -
186 return children;
│ │ │ │ -
187 multiIndexPopFront(prefix);
│ │ │ │ -
188 return subPreBasis_.size(prefix);
│ │ │ │ -
189 }
│ │ │ │ -
│ │ │ │ -
190
│ │ │ │ -
191 template<class SizePrefix, class Children>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
193 {
│ │ │ │ -
194 if (prefix.size() == 0)
│ │ │ │ -
195 return subPreBasis_.size();
│ │ │ │ -
196
│ │ │ │ -
197 // Remember last index, remove it and check if the remaining
│ │ │ │ -
198 // prefix refers to a leaf in the subPreBasis index tree.
│ │ │ │ -
199 // If yes, then the full prefix must also refer to a
│ │ │ │ -
200 // leaf in the merged index tree. If not, then restore the full
│ │ │ │ -
201 // prefix and proceed.
│ │ │ │ -
202 auto tail = prefix.back();
│ │ │ │ -
203 prefix.pop_back();
│ │ │ │ -
204 if (subPreBasis_.size(prefix) == 0)
│ │ │ │ -
205 return 0;
│ │ │ │ -
206 prefix.push_back(tail);
│ │ │ │ -
207
│ │ │ │ -
208 // Now check if the full prefix refers to a leaf in the subPreBasis
│ │ │ │ -
209 // index tree.
│ │ │ │ -
210 // If yes, then it has exactly 'children' appended children in the subtree.
│ │ │ │ -
211 // If not, then the index tree looks the same in the merged subtree and we
│ │ │ │ -
212 // can forward the result.
│ │ │ │ -
213 auto subSize = subPreBasis_.size(prefix);
│ │ │ │ -
214 if (subSize == 0)
│ │ │ │ -
215 return children;
│ │ │ │ -
216 return subSize;
│ │ │ │ -
217 }
│ │ │ │ -
│ │ │ │ -
218
│ │ │ │ -
219public:
│ │ │ │ -
220
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
223 {
│ │ │ │ -
224 return subPreBasis_.dimension() * children_;
│ │ │ │ -
225 }
│ │ │ │ -
│ │ │ │ -
226
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
229 {
│ │ │ │ -
230 return subPreBasis_.maxNodeSize() * children_;
│ │ │ │ -
231 }
│ │ │ │ -
│ │ │ │ -
232
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
235 {
│ │ │ │ -
236 return subPreBasis_;
│ │ │ │ -
237 }
│ │ │ │ -
│ │ │ │ -
238
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
241 {
│ │ │ │ -
242 return subPreBasis_;
│ │ │ │ -
243 }
│ │ │ │ -
│ │ │ │ -
244
│ │ │ │ -
246 template<class NodeType, typename It,
│ │ │ │ -
247 std::enable_if_t<NodeType::isPower, int> = 0>
│ │ │ │ -
│ │ │ │ -
248 It indices(const NodeType& node, It it) const
│ │ │ │ -
249 {
│ │ │ │ -
250 return indicesImpl(node, it, children_, IndexMergingStrategy{});
│ │ │ │ -
251 }
│ │ │ │ -
│ │ │ │ -
252
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
255 {
│ │ │ │ - │ │ │ │ -
257 }
│ │ │ │ -
│ │ │ │ -
258
│ │ │ │ -
259protected:
│ │ │ │ -
260
│ │ │ │ -
261 template<class NodeType, typename It, class Children>
│ │ │ │ -
│ │ │ │ -
262 It indicesImpl(const NodeType& node, It multiIndices, Children children, BasisFactory::FlatInterleaved) const
│ │ │ │ -
263 {
│ │ │ │ -
264 using namespace Dune::Indices;
│ │ │ │ -
265 size_type subTreeSize = node.child(_0).size();
│ │ │ │ -
266 // Fill indices for first child at the beginning.
│ │ │ │ -
267 auto next = subPreBasis().indices(node.child(_0), multiIndices);
│ │ │ │ -
268 // Multiply first component of all indices for first child by
│ │ │ │ -
269 // number of children to stretch the index range for interleaving.
│ │ │ │ -
270 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
271 multiIndices[i][0] *= children;
│ │ │ │ -
272 for (std::size_t child = 1; child<children; ++child)
│ │ │ │ -
273 {
│ │ │ │ -
274 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
275 {
│ │ │ │ -
276 // Copy indices from first child for all other children
│ │ │ │ -
277 // and shift them by child index to interleave indices.
│ │ │ │ -
278 // multiIndices[child*subTreeSize+i] = multiIndices[i];
│ │ │ │ -
279 // multiIndices[child*subTreeSize+i][0] = multiIndices[i][0]+child;
│ │ │ │ -
280 (*next) = multiIndices[i];
│ │ │ │ -
281 (*next)[0] = multiIndices[i][0]+child;
│ │ │ │ -
282 ++next;
│ │ │ │ -
283 }
│ │ │ │ -
284 }
│ │ │ │ -
285 return next;
│ │ │ │ -
286 }
│ │ │ │ -
│ │ │ │ -
287
│ │ │ │ -
288 template<class NodeType, typename It, class Children>
│ │ │ │ -
│ │ │ │ -
289 It indicesImpl(const NodeType& node, It multiIndices, Children children, BasisFactory::FlatLexicographic) const
│ │ │ │ -
290 {
│ │ │ │ -
291 using namespace Dune::Indices;
│ │ │ │ -
292 size_type subTreeSize = node.child(_0).size();
│ │ │ │ -
293 size_type firstIndexEntrySize = subPreBasis().size();
│ │ │ │ -
294 // Fill indices for first child at the beginning.
│ │ │ │ -
295 auto next = subPreBasis().indices(node.child(_0), multiIndices);
│ │ │ │ -
296 for (std::size_t child = 1; child<children_; ++child)
│ │ │ │ -
297 {
│ │ │ │ -
298 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
299 {
│ │ │ │ -
300 // Copy indices from first child for all other children
│ │ │ │ -
301 // and shift them by suitable offset to get lexicographic indices.
│ │ │ │ -
302 // multiIndices[child*subTreeSize+i] = multiIndices[i];
│ │ │ │ -
303 // multiIndices[child*subTreeSize+i][0] += child*firstIndexEntrySize;
│ │ │ │ -
304 (*next) = multiIndices[i];
│ │ │ │ -
305 (*next)[0] += child*firstIndexEntrySize;
│ │ │ │ -
306 ++next;
│ │ │ │ -
307 }
│ │ │ │ -
308 }
│ │ │ │ -
309 return next;
│ │ │ │ -
310 }
│ │ │ │ -
│ │ │ │ -
311
│ │ │ │ -
312 template<class MultiIndex>
│ │ │ │ -
│ │ │ │ -
313 static void multiIndexPushFront(MultiIndex& M, size_type M0)
│ │ │ │ -
314 {
│ │ │ │ -
315 M.resize(M.size()+1);
│ │ │ │ -
316 for(std::size_t i=M.size()-1; i>0; --i)
│ │ │ │ -
317 M[i] = M[i-1];
│ │ │ │ -
318 M[0] = M0;
│ │ │ │ -
319 }
│ │ │ │ -
│ │ │ │ -
320
│ │ │ │ -
321 template<class NodeType, typename It, class Children>
│ │ │ │ -
│ │ │ │ -
322 It indicesImpl(const NodeType& node, It multiIndices, Children children, BasisFactory::BlockedLexicographic) const
│ │ │ │ -
323 {
│ │ │ │ -
324 using namespace Dune::Indices;
│ │ │ │ -
325 size_type subTreeSize = node.child(_0).size();
│ │ │ │ -
326 // Fill indices for first child at the beginning.
│ │ │ │ -
327 auto next = subPreBasis().indices(node.child(_0), multiIndices);
│ │ │ │ -
328 // Insert 0 before first component of all indices for first child.
│ │ │ │ -
329 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
330 multiIndexPushFront(multiIndices[i], 0);
│ │ │ │ -
331 for (std::size_t child = 1; child<children_; ++child)
│ │ │ │ -
332 {
│ │ │ │ -
333 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
334 {
│ │ │ │ -
335 // Copy indices from first child for all other children and overwrite
│ │ │ │ -
336 // zero in first component as inserted above by child index.
│ │ │ │ -
337 // multiIndices[child*subTreeSize+i] = multiIndices[i];
│ │ │ │ -
338 // multiIndices[child*subTreeSize+i][0] = child;
│ │ │ │ -
339 (*next) = multiIndices[i];
│ │ │ │ -
340 (*next)[0] = child;
│ │ │ │ -
341 ++next;
│ │ │ │ -
342 }
│ │ │ │ -
343 }
│ │ │ │ -
344 return next;
│ │ │ │ -
345 }
│ │ │ │ -
│ │ │ │ -
346
│ │ │ │ -
347 template<class NodeType, typename It, class Children>
│ │ │ │ -
│ │ │ │ -
348 It indicesImpl(const NodeType& node, It multiIndices, Children children, BasisFactory::BlockedInterleaved) const
│ │ │ │ -
349 {
│ │ │ │ -
350 using namespace Dune::Indices;
│ │ │ │ -
351 size_type subTreeSize = node.child(_0).size();
│ │ │ │ -
352 // Fill indices for first child at the beginning.
│ │ │ │ -
353 auto next = subPreBasis().indices(node.child(_0), multiIndices);
│ │ │ │ -
354 // Append 0 after last component of all indices for first child.
│ │ │ │ -
355 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
356 multiIndices[i].push_back(0);
│ │ │ │ -
357 for (std::size_t child = 1; child<children_; ++child)
│ │ │ │ -
358 {
│ │ │ │ -
359 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
360 {
│ │ │ │ -
361 // Copy indices from first child for all other children and overwrite
│ │ │ │ -
362 // zero in last component as appended above by child index.
│ │ │ │ -
363 (*next) = multiIndices[i];
│ │ │ │ -
364 (*next).back() = child;
│ │ │ │ -
365 ++next;
│ │ │ │ -
366 }
│ │ │ │ -
367 }
│ │ │ │ -
368 return next;
│ │ │ │ -
369 }
│ │ │ │ -
│ │ │ │ -
370
│ │ │ │ -
371 template<class Children>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
373 {
│ │ │ │ - │ │ │ │ -
375 if constexpr(std::is_same_v<IMS, BasisFactory::FlatInterleaved>)
│ │ │ │ -
376 return ContainerDescriptors::Unknown{}; // Not yet implemented
│ │ │ │ -
377 else if constexpr(std::is_same_v<IMS, BasisFactory::FlatLexicographic>)
│ │ │ │ -
378 return ContainerDescriptors::Unknown{}; // Not yet implemented
│ │ │ │ -
379 else if constexpr(std::is_same_v<IMS, BasisFactory::BlockedLexicographic>)
│ │ │ │ -
380 return ContainerDescriptors::makeUniformDescriptor(children,std::move(subTree));
│ │ │ │ -
381 else if constexpr(std::is_same_v<IMS, BasisFactory::BlockedInterleaved>)
│ │ │ │ -
382 return ContainerDescriptors::Impl::appendToTree(children,std::move(subTree));
│ │ │ │ -
383 else
│ │ │ │ - │ │ │ │ -
385 }
│ │ │ │ -
│ │ │ │ -
386
│ │ │ │ -
387protected:
│ │ │ │ -
388 std::size_t children_;
│ │ │ │ - │ │ │ │ -
390};
│ │ │ │ -
│ │ │ │ -
391
│ │ │ │ -
392
│ │ │ │ -
393
│ │ │ │ -
394namespace BasisFactory {
│ │ │ │ -
395
│ │ │ │ -
408template<class ChildPreBasisFactory, class IndexMergingStrategy>
│ │ │ │ -
│ │ │ │ -
409auto power(ChildPreBasisFactory&& childPreBasisFactory, std::size_t k, const IndexMergingStrategy&)
│ │ │ │ -
410{
│ │ │ │ -
411 return [childPreBasisFactory,k](const auto& gridView) {
│ │ │ │ -
412 auto childPreBasis = childPreBasisFactory(gridView);
│ │ │ │ - │ │ │ │ -
414 };
│ │ │ │ -
415}
│ │ │ │ -
│ │ │ │ -
416
│ │ │ │ -
427template<class ChildPreBasisFactory>
│ │ │ │ -
│ │ │ │ -
428auto power(ChildPreBasisFactory&& childPreBasisFactory, std::size_t k)
│ │ │ │ -
429{
│ │ │ │ -
430 return [childPreBasisFactory,k](const auto& gridView) {
│ │ │ │ -
431 auto childPreBasis = childPreBasisFactory(gridView);
│ │ │ │ - │ │ │ │ -
433 };
│ │ │ │ -
434}
│ │ │ │ -
│ │ │ │ -
435
│ │ │ │ -
436} // end namespace BasisFactory
│ │ │ │ -
437
│ │ │ │ -
438} // end namespace Functions
│ │ │ │ -
439} // end namespace Dune
│ │ │ │ -
440
│ │ │ │ -
441
│ │ │ │ -
442#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DYNAMICPOWERBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +
174}
│ │ │ │ +
175
│ │ │ │ +
176
│ │ │ │ +
177} // end namespace Functions
│ │ │ │ +
178} // end namespace Dune
│ │ │ │ +
179
│ │ │ │ +
180
│ │ │ │ +
181#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_POWERBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
auto power(ChildPreBasisFactory &&childPreBasisFactory, std::size_t k, const IndexMergingStrategy &)
Create a pre-basis factory that can build a PowerPreBasis.
Definition dynamicpowerbasis.hh:409
│ │ │ │
std::enable_if_t< std::is_constructible_v< T, Args... >, int > enableIfConstructible
Helper to constrain forwarding constructors.
Definition type_traits.hh:31
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
auto containerDescriptor(const PreBasis &preBasis)
Return the container descriptor of the pre-basis, if defined, otherwise ContainerDescriptor::Unknown.
Definition containerdescriptors.hh:73
│ │ │ │ -
auto makeUniformDescriptor(std::integral_constant< std::size_t, n >, Child child)
Generate a uniform descriptor in case the size is a static constant.
Definition containerdescriptors.hh:159
│ │ │ │
Base class for index merging strategies to simplify detection.
Definition basistags.hh:48
│ │ │ │ -
Lexicographic merging of direct children without blocking.
Definition basistags.hh:84
│ │ │ │ -
Interleaved merging of direct children without blocking.
Definition basistags.hh:118
│ │ │ │ -
Lexicographic merging of direct children with blocking (i.e. creating one block per direct child).
Definition basistags.hh:152
│ │ │ │ -
Interleaved merging of direct children with blocking (i.e. creating blocks at the leaves containing o...
Definition basistags.hh:184
│ │ │ │ -
Fallback container descriptor if nothing else fits.
Definition containerdescriptors.hh:50
│ │ │ │
A pre-basis for dynamic power bases.
Definition dynamicpowerbasis.hh:48
│ │ │ │
std::size_t size_type
Type used for indices and size information.
Definition dynamicpowerbasis.hh:60
│ │ │ │ -
IMS IndexMergingStrategy
Strategy used to merge the global indices of the child factories.
Definition dynamicpowerbasis.hh:63
│ │ │ │ -
DynamicPowerPreBasis(std::size_t c, SFArgs &&... sfArgs)
Constructor for given child pre-basis objects.
Definition dynamicpowerbasis.hh:80
│ │ │ │ -
static void multiIndexPopFront(MultiIndex &M)
Definition dynamicpowerbasis.hh:175
│ │ │ │ -
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition dynamicpowerbasis.hh:222
│ │ │ │
auto containerDescriptorImpl(Children children) const
Definition dynamicpowerbasis.hh:372
│ │ │ │ -
It indices(const NodeType &node, It it) const
Maps from subtree index set [0..size-1] to a globally unique multi index in global basis.
Definition dynamicpowerbasis.hh:248
│ │ │ │ -
void initializeIndices()
Initialize the global indices.
Definition dynamicpowerbasis.hh:88
│ │ │ │
size_type sizeImpl(SizePrefix prefix, Children children, BasisFactory::FlatInterleaved) const
Definition dynamicpowerbasis.hh:137
│ │ │ │ -
static constexpr size_type maxMultiIndexSize
Definition dynamicpowerbasis.hh:68
│ │ │ │ -
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition dynamicpowerbasis.hh:100
│ │ │ │ -
auto containerDescriptor() const
Return the associated container descriptor.
Definition dynamicpowerbasis.hh:254
│ │ │ │ -
size_type size() const
Same as size(prefix) with empty prefix.
Definition dynamicpowerbasis.hh:122
│ │ │ │ -
It indicesImpl(const NodeType &node, It multiIndices, Children children, BasisFactory::BlockedInterleaved) const
Definition dynamicpowerbasis.hh:348
│ │ │ │ -
SubPreBasis & subPreBasis()
Mutable access to the stored prebasis of the factor in the power space.
Definition dynamicpowerbasis.hh:240
│ │ │ │ -
size_type sizeImpl(SizePrefix prefix, Children children, BasisFactory::FlatLexicographic) const
Definition dynamicpowerbasis.hh:153
│ │ │ │ -
static void multiIndexPushFront(MultiIndex &M, size_type M0)
Definition dynamicpowerbasis.hh:313
│ │ │ │
SubPreBasis subPreBasis_
Definition dynamicpowerbasis.hh:389
│ │ │ │ -
size_type sizeImpl(SizePrefix prefix, Children children, BasisFactory::BlockedLexicographic) const
Definition dynamicpowerbasis.hh:183
│ │ │ │ -
size_type sizeImpl(SizePrefix prefix, Children children, BasisFactory::BlockedInterleaved) const
Definition dynamicpowerbasis.hh:192
│ │ │ │ -
It indicesImpl(const NodeType &node, It multiIndices, Children children, BasisFactory::BlockedLexicographic) const
Definition dynamicpowerbasis.hh:322
│ │ │ │ -
static constexpr size_type multiIndexBufferSize
Definition dynamicpowerbasis.hh:70
│ │ │ │ -
SPB SubPreBasis
The child pre-basis.
Definition dynamicpowerbasis.hh:54
│ │ │ │ -
Node makeNode() const
Create tree node.
Definition dynamicpowerbasis.hh:108
│ │ │ │ -
const SubPreBasis & subPreBasis() const
Const access to the stored prebasis of the factor in the power space.
Definition dynamicpowerbasis.hh:234
│ │ │ │
It indicesImpl(const NodeType &node, It multiIndices, Children children, BasisFactory::FlatInterleaved) const
Definition dynamicpowerbasis.hh:262
│ │ │ │ -
std::size_t children() const
Definition dynamicpowerbasis.hh:116
│ │ │ │ -
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition dynamicpowerbasis.hh:228
│ │ │ │ -
It indicesImpl(const NodeType &node, It multiIndices, Children children, BasisFactory::FlatLexicographic) const
Definition dynamicpowerbasis.hh:289
│ │ │ │ -
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition dynamicpowerbasis.hh:129
│ │ │ │ -
typename SPB::GridView GridView
The grid view that the FE basis is defined on.
Definition dynamicpowerbasis.hh:57
│ │ │ │ -
std::size_t children_
Definition dynamicpowerbasis.hh:388
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition dynamicpowerbasis.hh:94
│ │ │ │ -
static constexpr size_type minMultiIndexSize
Definition dynamicpowerbasis.hh:69
│ │ │ │ - │ │ │ │ +
Definition nodes.hh:198
│ │ │ │ +
A pre-basis for power bases.
Definition powerbasis.hh:52
│ │ │ │ +
IMS IndexMergingStrategy
Strategy used to merge the global indices of the child factories.
Definition powerbasis.hh:67
│ │ │ │ +
typename Base::size_type size_type
Type used for indices and size information.
Definition powerbasis.hh:64
│ │ │ │ +
SPB SubPreBasis
The child pre-basis.
Definition powerbasis.hh:58
│ │ │ │ +
auto containerDescriptor() const
Return the associated container descriptor.
Definition powerbasis.hh:117
│ │ │ │ +
It indices(const NodeType &node, It it) const
Maps from subtree index set [0..size-1] to a globally unique multi index in global basis.
Definition powerbasis.hh:111
│ │ │ │ +
PowerPreBasis(SFArgs &&... sfArgs)
Constructor for given child pre-basis objects for static size of the power-basis.
Definition powerbasis.hh:80
│ │ │ │ +
size_type size() const
Same as size(prefix) with empty prefix.
Definition powerbasis.hh:96
│ │ │ │ +
Node makeNode() const
Create tree node.
Definition powerbasis.hh:87
│ │ │ │ +
static constexpr std::integral_constant< std::size_t, C > children
Number of children provided as an integral constant.
Definition powerbasis.hh:70
│ │ │ │ +
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition powerbasis.hh:103
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,605 +1,243 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -dynamicpowerbasis.hh │ │ │ │ │ +powerbasis.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DYNAMICPOWERBASIS_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DYNAMICPOWERBASIS_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_POWERBASIS_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_POWERBASIS_HH │ │ │ │ │ 9 │ │ │ │ │ 10#include │ │ │ │ │ 11#include │ │ │ │ │ 12#include │ │ │ │ │ 13 │ │ │ │ │ 14#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_u_t_i_l_i_t_y_._h_h> │ │ │ │ │ 15#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ 16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_b_a_s_i_s_t_a_g_s_._h_h> │ │ │ │ │ -17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h> │ │ │ │ │ +17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_y_n_a_m_i_c_p_o_w_e_r_b_a_s_i_s_._h_h> │ │ │ │ │ 18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ 19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ -20 │ │ │ │ │ -21 │ │ │ │ │ +20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h> │ │ │ │ │ +21#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ 22 │ │ │ │ │ -23namespace _D_u_n_e { │ │ │ │ │ -24namespace Functions { │ │ │ │ │ -25 │ │ │ │ │ -26 │ │ │ │ │ -27/ │ │ │ │ │ +23 │ │ │ │ │ +24 │ │ │ │ │ +25namespace _D_u_n_e { │ │ │ │ │ +26namespace Functions { │ │ │ │ │ +27 │ │ │ │ │ +28 │ │ │ │ │ +29/ │ │ │ │ │ / ***************************************************************************** │ │ │ │ │ -28// This is the reusable part of the dynamic power bases. It contains │ │ │ │ │ -29// │ │ │ │ │ -30// DynamicPowerPreBasis │ │ │ │ │ +30// This is the reusable part of the power bases. It contains │ │ │ │ │ 31// │ │ │ │ │ -32// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ +32// PowerPreBasis │ │ │ │ │ +33// │ │ │ │ │ +34// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ shared │ │ │ │ │ -33// state. These components do _not_ depend on the global basis and local view │ │ │ │ │ -34// and can be used without a global basis. │ │ │ │ │ -35/ │ │ │ │ │ +35// state. These components do _not_ depend on the global basis and local view │ │ │ │ │ +36// and can be used without a global basis. │ │ │ │ │ +37/ │ │ │ │ │ / ***************************************************************************** │ │ │ │ │ -36 │ │ │ │ │ -46template │ │ │ │ │ -_4_7class _D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s │ │ │ │ │ -48{ │ │ │ │ │ -49 static const bool isBlocked = std::is_same_v or std::is_same_v; │ │ │ │ │ -50 │ │ │ │ │ -51public: │ │ │ │ │ -52 │ │ │ │ │ -_5_4 using _S_u_b_P_r_e_B_a_s_i_s = SPB; │ │ │ │ │ -55 │ │ │ │ │ -_5_7 using _G_r_i_d_V_i_e_w = typename SPB::GridView; │ │ │ │ │ -58 │ │ │ │ │ -_6_0 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ -61 │ │ │ │ │ -_6_3 using _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y = IMS; │ │ │ │ │ -64 │ │ │ │ │ -_6_6 using _N_o_d_e = _D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e_<_t_y_p_e_n_a_m_e_ _S_u_b_P_r_e_B_a_s_i_s_:_:_N_o_d_e_>; │ │ │ │ │ -67 │ │ │ │ │ -_6_8 static constexpr _s_i_z_e___t_y_p_e _m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e = SubPreBasis:: │ │ │ │ │ -maxMultiIndexSize + isBlocked; │ │ │ │ │ -_6_9 static constexpr _s_i_z_e___t_y_p_e _m_i_n_M_u_l_t_i_I_n_d_e_x_S_i_z_e = SubPreBasis:: │ │ │ │ │ -minMultiIndexSize + isBlocked; │ │ │ │ │ -_7_0 static constexpr _s_i_z_e___t_y_p_e _m_u_l_t_i_I_n_d_e_x_B_u_f_f_e_r_S_i_z_e = SubPreBasis:: │ │ │ │ │ -multiIndexBufferSize + isBlocked; │ │ │ │ │ +38 │ │ │ │ │ +49template │ │ │ │ │ +_5_0class _P_o_w_e_r_P_r_e_B_a_s_i_s : │ │ │ │ │ +51 public _D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s │ │ │ │ │ +52{ │ │ │ │ │ +53 using _B_a_s_e = _D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_<_I_M_S_,_S_P_B_>; │ │ │ │ │ +54 │ │ │ │ │ +55public: │ │ │ │ │ +56 │ │ │ │ │ +_5_8 using _S_u_b_P_r_e_B_a_s_i_s = SPB; │ │ │ │ │ +59 │ │ │ │ │ +_6_1 using _N_o_d_e = _P_o_w_e_r_B_a_s_i_s_N_o_d_e_<_t_y_p_e_n_a_m_e_ _S_u_b_P_r_e_B_a_s_i_s_:_:_N_o_d_e_,_ _C_>; │ │ │ │ │ +62 │ │ │ │ │ +_6_4 using _s_i_z_e___t_y_p_e = typename _B_a_s_e_:_:_s_i_z_e___t_y_p_e; │ │ │ │ │ +65 │ │ │ │ │ +_6_7 using _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y = IMS; │ │ │ │ │ +68 │ │ │ │ │ +_7_0 inline static constexpr std::integral_constant _c_h_i_l_d_r_e_n = {}; │ │ │ │ │ 71 │ │ │ │ │ 77 template = 0, │ │ │ │ │ +78 disableCopyMove<_P_o_w_e_r_P_r_e_B_a_s_i_s, SFArgs...> = 0, │ │ │ │ │ 79 _e_n_a_b_l_e_I_f_C_o_n_s_t_r_u_c_t_i_b_l_e<_S_u_b_P_r_e_B_a_s_i_s, SFArgs...> = 0> │ │ │ │ │ -_8_0 explicit _D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s(std::size_t c, SFArgs&&... sfArgs) : │ │ │ │ │ -81 _c_h_i_l_d_r_e_n__(c), │ │ │ │ │ -82 _s_u_b_P_r_e_B_a_s_i_s__(std::forward(sfArgs)...) │ │ │ │ │ -83 { │ │ │ │ │ -84 static_assert(models, _S_u_b_P_r_e_B_a_s_i_s>(), │ │ │ │ │ -"Subprebasis passed to DynamicPowerPreBasis does not model the PreBasis │ │ │ │ │ -concept."); │ │ │ │ │ -85 } │ │ │ │ │ -86 │ │ │ │ │ -_8_8 void _i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s() │ │ │ │ │ -89 { │ │ │ │ │ -90 _s_u_b_P_r_e_B_a_s_i_s__.initializeIndices(); │ │ │ │ │ -91 } │ │ │ │ │ -92 │ │ │ │ │ -_9_4 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ -95 { │ │ │ │ │ -96 return _s_u_b_P_r_e_B_a_s_i_s__.gridView(); │ │ │ │ │ -97 } │ │ │ │ │ -98 │ │ │ │ │ -_1_0_0 void _u_p_d_a_t_e(const _G_r_i_d_V_i_e_w& gv) │ │ │ │ │ -101 { │ │ │ │ │ -102 _s_u_b_P_r_e_B_a_s_i_s__.update(gv); │ │ │ │ │ -103 } │ │ │ │ │ -104 │ │ │ │ │ -_1_0_8 _N_o_d_e _m_a_k_e_N_o_d_e() const │ │ │ │ │ -109 { │ │ │ │ │ -110 auto node = _N_o_d_e{_c_h_i_l_d_r_e_n__}; │ │ │ │ │ -111 for (std::size_t i=0; i<_c_h_i_l_d_r_e_n__; ++i) │ │ │ │ │ -112 node.setChild(i, _s_u_b_P_r_e_B_a_s_i_s__.makeNode()); │ │ │ │ │ -113 return node; │ │ │ │ │ +_8_0 explicit _P_o_w_e_r_P_r_e_B_a_s_i_s(SFArgs&&... sfArgs) : │ │ │ │ │ +81 _B_a_s_e(std::size_t(C), std::forward(sfArgs)...) │ │ │ │ │ +82 {} │ │ │ │ │ +83 │ │ │ │ │ +_8_7 _N_o_d_e _m_a_k_e_N_o_d_e() const │ │ │ │ │ +88 { │ │ │ │ │ +89 _N_o_d_e node{}; │ │ │ │ │ +90 for (std::size_t i=0; i<_c_h_i_l_d_r_e_n(); ++i) │ │ │ │ │ +91 node.setChild(i, _B_a_s_e_:_:_s_u_b_P_r_e_B_a_s_i_s__.makeNode()); │ │ │ │ │ +92 return node; │ │ │ │ │ +93 } │ │ │ │ │ +94 │ │ │ │ │ +_9_6 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ +97 { │ │ │ │ │ +98 return _s_i_z_e(Dune::ReservedVector{}); │ │ │ │ │ +99 } │ │ │ │ │ +100 │ │ │ │ │ +102 template │ │ │ │ │ +_1_0_3 _s_i_z_e___t_y_p_e _s_i_z_e(const SizePrefix& prefix) const │ │ │ │ │ +104 { │ │ │ │ │ +105 return _B_a_s_e_:_:_s_i_z_e_I_m_p_l(prefix, _c_h_i_l_d_r_e_n, _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y{}); │ │ │ │ │ +106 } │ │ │ │ │ +107 │ │ │ │ │ +109 template = 0> │ │ │ │ │ +_1_1_1 It _i_n_d_i_c_e_s(const NodeType& node, It it) const │ │ │ │ │ +112 { │ │ │ │ │ +113 return _B_a_s_e_:_:_i_n_d_i_c_e_s_I_m_p_l(node, it, _c_h_i_l_d_r_e_n, _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y{}); │ │ │ │ │ 114 } │ │ │ │ │ 115 │ │ │ │ │ -_1_1_6 std::size_t _c_h_i_l_d_r_e_n() const │ │ │ │ │ -117 { │ │ │ │ │ -118 return _c_h_i_l_d_r_e_n__; │ │ │ │ │ -119 } │ │ │ │ │ -120 │ │ │ │ │ -_1_2_2 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ -123 { │ │ │ │ │ -124 return _s_i_z_e(Dune::ReservedVector{}); │ │ │ │ │ -125 } │ │ │ │ │ +_1_1_7 auto _c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r() const │ │ │ │ │ +118 { │ │ │ │ │ +119 return _B_a_s_e_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_I_m_p_l(_c_h_i_l_d_r_e_n); │ │ │ │ │ +120 } │ │ │ │ │ +121}; │ │ │ │ │ +122 │ │ │ │ │ +123 │ │ │ │ │ +124 │ │ │ │ │ +125namespace BasisFactory { │ │ │ │ │ 126 │ │ │ │ │ -128 template │ │ │ │ │ -_1_2_9 _s_i_z_e___t_y_p_e _s_i_z_e(const SizePrefix& prefix) const │ │ │ │ │ -130 { │ │ │ │ │ -131 return _s_i_z_e_I_m_p_l(prefix, _c_h_i_l_d_r_e_n__, _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y{}); │ │ │ │ │ -132 } │ │ │ │ │ -133 │ │ │ │ │ -134protected: │ │ │ │ │ -135 │ │ │ │ │ -136 template │ │ │ │ │ -_1_3_7 _s_i_z_e___t_y_p_e _s_i_z_e_I_m_p_l(SizePrefix prefix, Children _c_h_i_l_d_r_e_n, _B_a_s_i_s_F_a_c_t_o_r_y_:_: │ │ │ │ │ -_F_l_a_t_I_n_t_e_r_l_e_a_v_e_d) const │ │ │ │ │ -138 { │ │ │ │ │ -139 // The root index size is the root index size of a single subnode │ │ │ │ │ -140 // multiplied by the number of subnodes, because we enumerate all │ │ │ │ │ -141 // child indices in a row. │ │ │ │ │ -142 if (prefix.size() == 0) │ │ │ │ │ -143 return _c_h_i_l_d_r_e_n*_s_u_b_P_r_e_B_a_s_i_s__.size(); │ │ │ │ │ -144 │ │ │ │ │ -145 // The FlatInterleaved index merging strategy only changes the first │ │ │ │ │ -146 // index digit. Hence, we have to reconstruct the corresponding digit │ │ │ │ │ -147 // for the subtree and can then return the corresponding size of the │ │ │ │ │ -subtree. │ │ │ │ │ -148 prefix[0] = prefix[0] / _c_h_i_l_d_r_e_n; │ │ │ │ │ -149 return _s_u_b_P_r_e_B_a_s_i_s__.size(prefix); │ │ │ │ │ -150 } │ │ │ │ │ -151 │ │ │ │ │ -152 template │ │ │ │ │ -_1_5_3 _s_i_z_e___t_y_p_e _s_i_z_e_I_m_p_l(SizePrefix prefix, Children _c_h_i_l_d_r_e_n, _B_a_s_i_s_F_a_c_t_o_r_y_:_: │ │ │ │ │ -_F_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c) 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 _c_h_i_l_d_r_e_n*_s_u_b_P_r_e_B_a_s_i_s__.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. Then we can append │ │ │ │ │ -164 // the other prefix entries unmodified, because the index tree │ │ │ │ │ -165 // looks the same after the first level. │ │ │ │ │ +139template │ │ │ │ │ +_1_4_0auto _p_o_w_e_r(ChildPreBasisFactory&& childPreBasisFactory, const │ │ │ │ │ +_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y&) │ │ │ │ │ +141{ │ │ │ │ │ +142 return [childPreBasisFactory](const auto& gridView) { │ │ │ │ │ +143 auto childPreBasis = childPreBasisFactory(gridView); │ │ │ │ │ +144 return _P_o_w_e_r_P_r_e_B_a_s_i_s_<_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y_,_ _d_e_c_l_t_y_p_e_(_c_h_i_l_d_P_r_e_B_a_s_i_s_)_,_ _k_> │ │ │ │ │ +(std::move(childPreBasis)); │ │ │ │ │ +145 }; │ │ │ │ │ +146} │ │ │ │ │ +147 │ │ │ │ │ +158template │ │ │ │ │ +_1_5_9auto _p_o_w_e_r(ChildPreBasisFactory&& childPreBasisFactory) │ │ │ │ │ +160{ │ │ │ │ │ +161 return [childPreBasisFactory](const auto& gridView) { │ │ │ │ │ +162 auto childPreBasis = childPreBasisFactory(gridView); │ │ │ │ │ +163 return _P_o_w_e_r_P_r_e_B_a_s_i_s_<_B_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d_,_ _d_e_c_l_t_y_p_e_(_c_h_i_l_d_P_r_e_B_a_s_i_s_)_,_ _k_>(std:: │ │ │ │ │ +move(childPreBasis)); │ │ │ │ │ +164 }; │ │ │ │ │ +165} │ │ │ │ │ 166 │ │ │ │ │ -167 // The FlatLexicographic index merging strategy only changes the first │ │ │ │ │ -168 // index digit. Hence, we have to reconstruct the corresponding digit │ │ │ │ │ -169 // for the subtree and can then return the corresponding size of the │ │ │ │ │ -subtree. │ │ │ │ │ -170 prefix[0] = prefix[0] % _s_u_b_P_r_e_B_a_s_i_s__.size(); │ │ │ │ │ -171 return _s_u_b_P_r_e_B_a_s_i_s__.size(prefix); │ │ │ │ │ -172 } │ │ │ │ │ +167} // end namespace BasisFactory │ │ │ │ │ +168 │ │ │ │ │ +169// Backward compatibility │ │ │ │ │ +170namespace [[deprecated("Will be removed after Dune 2.10")]] BasisBuilder { │ │ │ │ │ +171 │ │ │ │ │ +172 using namespace BasisFactory; │ │ │ │ │ 173 │ │ │ │ │ -174 template │ │ │ │ │ -_1_7_5 static void _m_u_l_t_i_I_n_d_e_x_P_o_p_F_r_o_n_t(MultiIndex& M) │ │ │ │ │ -176 { │ │ │ │ │ -177 for(std::size_t i=0; i │ │ │ │ │ -_1_8_3 _s_i_z_e___t_y_p_e _s_i_z_e_I_m_p_l(SizePrefix prefix, Children _c_h_i_l_d_r_e_n, _B_a_s_i_s_F_a_c_t_o_r_y_:_: │ │ │ │ │ -_B_l_o_c_k_e_d_L_e_x_i_c_o_g_r_a_p_h_i_c) const │ │ │ │ │ -184 { │ │ │ │ │ -185 if (prefix.size() == 0) │ │ │ │ │ -186 return _c_h_i_l_d_r_e_n; │ │ │ │ │ -187 _m_u_l_t_i_I_n_d_e_x_P_o_p_F_r_o_n_t(prefix); │ │ │ │ │ -188 return _s_u_b_P_r_e_B_a_s_i_s__.size(prefix); │ │ │ │ │ -189 } │ │ │ │ │ -190 │ │ │ │ │ -191 template │ │ │ │ │ -_1_9_2 _s_i_z_e___t_y_p_e _s_i_z_e_I_m_p_l(SizePrefix prefix, Children _c_h_i_l_d_r_e_n, _B_a_s_i_s_F_a_c_t_o_r_y_:_: │ │ │ │ │ -_B_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d) const │ │ │ │ │ -193 { │ │ │ │ │ -194 if (prefix.size() == 0) │ │ │ │ │ -195 return _s_u_b_P_r_e_B_a_s_i_s__.size(); │ │ │ │ │ -196 │ │ │ │ │ -197 // Remember last index, remove it and check if the remaining │ │ │ │ │ -198 // prefix refers to a leaf in the subPreBasis index tree. │ │ │ │ │ -199 // If yes, then the full prefix must also refer to a │ │ │ │ │ -200 // leaf in the merged index tree. If not, then restore the full │ │ │ │ │ -201 // prefix and proceed. │ │ │ │ │ -202 auto tail = prefix.back(); │ │ │ │ │ -203 prefix.pop_back(); │ │ │ │ │ -204 if (_s_u_b_P_r_e_B_a_s_i_s__.size(prefix) == 0) │ │ │ │ │ -205 return 0; │ │ │ │ │ -206 prefix.push_back(tail); │ │ │ │ │ -207 │ │ │ │ │ -208 // Now check if the full prefix refers to a leaf in the subPreBasis │ │ │ │ │ -209 // index tree. │ │ │ │ │ -210 // If yes, then it has exactly 'children' appended children in the subtree. │ │ │ │ │ -211 // If not, then the index tree looks the same in the merged subtree and we │ │ │ │ │ -212 // can forward the result. │ │ │ │ │ -213 auto subSize = _s_u_b_P_r_e_B_a_s_i_s__.size(prefix); │ │ │ │ │ -214 if (subSize == 0) │ │ │ │ │ -215 return _c_h_i_l_d_r_e_n; │ │ │ │ │ -216 return subSize; │ │ │ │ │ -217 } │ │ │ │ │ -218 │ │ │ │ │ -219public: │ │ │ │ │ -220 │ │ │ │ │ -_2_2_2 _s_i_z_e___t_y_p_e _d_i_m_e_n_s_i_o_n() const │ │ │ │ │ -223 { │ │ │ │ │ -224 return _s_u_b_P_r_e_B_a_s_i_s__.dimension() * _c_h_i_l_d_r_e_n__; │ │ │ │ │ -225 } │ │ │ │ │ -226 │ │ │ │ │ -_2_2_8 _s_i_z_e___t_y_p_e _m_a_x_N_o_d_e_S_i_z_e() const │ │ │ │ │ -229 { │ │ │ │ │ -230 return _s_u_b_P_r_e_B_a_s_i_s__.maxNodeSize() * _c_h_i_l_d_r_e_n__; │ │ │ │ │ -231 } │ │ │ │ │ -232 │ │ │ │ │ -_2_3_4 const _S_u_b_P_r_e_B_a_s_i_s& _s_u_b_P_r_e_B_a_s_i_s() const │ │ │ │ │ -235 { │ │ │ │ │ -236 return _s_u_b_P_r_e_B_a_s_i_s__; │ │ │ │ │ -237 } │ │ │ │ │ -238 │ │ │ │ │ -_2_4_0 _S_u_b_P_r_e_B_a_s_i_s& _s_u_b_P_r_e_B_a_s_i_s() │ │ │ │ │ -241 { │ │ │ │ │ -242 return _s_u_b_P_r_e_B_a_s_i_s__; │ │ │ │ │ -243 } │ │ │ │ │ -244 │ │ │ │ │ -246 template = 0> │ │ │ │ │ -_2_4_8 It _i_n_d_i_c_e_s(const NodeType& node, It it) const │ │ │ │ │ -249 { │ │ │ │ │ -250 return _i_n_d_i_c_e_s_I_m_p_l(node, it, _c_h_i_l_d_r_e_n__, _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y{}); │ │ │ │ │ -251 } │ │ │ │ │ -252 │ │ │ │ │ -_2_5_4 auto _c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r() const │ │ │ │ │ -255 { │ │ │ │ │ -256 return _c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_I_m_p_l(_c_h_i_l_d_r_e_n__); │ │ │ │ │ -257 } │ │ │ │ │ -258 │ │ │ │ │ -259protected: │ │ │ │ │ -260 │ │ │ │ │ -261 template │ │ │ │ │ -_2_6_2 It _i_n_d_i_c_e_s_I_m_p_l(const NodeType& node, It multiIndices, Children _c_h_i_l_d_r_e_n, │ │ │ │ │ -_B_a_s_i_s_F_a_c_t_o_r_y_:_:_F_l_a_t_I_n_t_e_r_l_e_a_v_e_d) const │ │ │ │ │ -263 { │ │ │ │ │ -264 using namespace Dune::Indices; │ │ │ │ │ -265 _s_i_z_e___t_y_p_e subTreeSize = node.child(_0).size(); │ │ │ │ │ -266 // Fill indices for first child at the beginning. │ │ │ │ │ -267 auto next = _s_u_b_P_r_e_B_a_s_i_s().indices(node.child(_0), multiIndices); │ │ │ │ │ -268 // Multiply first component of all indices for first child by │ │ │ │ │ -269 // number of children to stretch the index range for interleaving. │ │ │ │ │ -270 for (std::size_t i = 0; i │ │ │ │ │ -_2_8_9 It _i_n_d_i_c_e_s_I_m_p_l(const NodeType& node, It multiIndices, Children _c_h_i_l_d_r_e_n, │ │ │ │ │ -_B_a_s_i_s_F_a_c_t_o_r_y_:_:_F_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c) const │ │ │ │ │ -290 { │ │ │ │ │ -291 using namespace Dune::Indices; │ │ │ │ │ -292 _s_i_z_e___t_y_p_e subTreeSize = node.child(_0).size(); │ │ │ │ │ -293 _s_i_z_e___t_y_p_e firstIndexEntrySize = _s_u_b_P_r_e_B_a_s_i_s().size(); │ │ │ │ │ -294 // Fill indices for first child at the beginning. │ │ │ │ │ -295 auto next = _s_u_b_P_r_e_B_a_s_i_s().indices(node.child(_0), multiIndices); │ │ │ │ │ -296 for (std::size_t child = 1; child<_c_h_i_l_d_r_e_n__; ++child) │ │ │ │ │ -297 { │ │ │ │ │ -298 for (std::size_t i = 0; i │ │ │ │ │ -_3_1_3 static void _m_u_l_t_i_I_n_d_e_x_P_u_s_h_F_r_o_n_t(MultiIndex& M, _s_i_z_e___t_y_p_e M0) │ │ │ │ │ -314 { │ │ │ │ │ -315 M.resize(M.size()+1); │ │ │ │ │ -316 for(std::size_t i=M.size()-1; i>0; --i) │ │ │ │ │ -317 M[i] = M[i-1]; │ │ │ │ │ -318 M[0] = M0; │ │ │ │ │ -319 } │ │ │ │ │ -320 │ │ │ │ │ -321 template │ │ │ │ │ -_3_2_2 It _i_n_d_i_c_e_s_I_m_p_l(const NodeType& node, It multiIndices, Children _c_h_i_l_d_r_e_n, │ │ │ │ │ -_B_a_s_i_s_F_a_c_t_o_r_y_:_:_B_l_o_c_k_e_d_L_e_x_i_c_o_g_r_a_p_h_i_c) const │ │ │ │ │ -323 { │ │ │ │ │ -324 using namespace Dune::Indices; │ │ │ │ │ -325 _s_i_z_e___t_y_p_e subTreeSize = node.child(_0).size(); │ │ │ │ │ -326 // Fill indices for first child at the beginning. │ │ │ │ │ -327 auto next = _s_u_b_P_r_e_B_a_s_i_s().indices(node.child(_0), multiIndices); │ │ │ │ │ -328 // Insert 0 before first component of all indices for first child. │ │ │ │ │ -329 for (std::size_t i = 0; i │ │ │ │ │ -_3_4_8 It _i_n_d_i_c_e_s_I_m_p_l(const NodeType& node, It multiIndices, Children _c_h_i_l_d_r_e_n, │ │ │ │ │ -_B_a_s_i_s_F_a_c_t_o_r_y_:_:_B_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d) const │ │ │ │ │ -349 { │ │ │ │ │ -350 using namespace Dune::Indices; │ │ │ │ │ -351 _s_i_z_e___t_y_p_e subTreeSize = node.child(_0).size(); │ │ │ │ │ -352 // Fill indices for first child at the beginning. │ │ │ │ │ -353 auto next = _s_u_b_P_r_e_B_a_s_i_s().indices(node.child(_0), multiIndices); │ │ │ │ │ -354 // Append 0 after last component of all indices for first child. │ │ │ │ │ -355 for (std::size_t i = 0; i │ │ │ │ │ -_3_7_2 auto _c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_I_m_p_l(Children _c_h_i_l_d_r_e_n) const │ │ │ │ │ -373 { │ │ │ │ │ -374 auto subTree = _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r(_s_u_b_P_r_e_B_a_s_i_s__); │ │ │ │ │ -375 if constexpr(std::is_same_v) │ │ │ │ │ -376 return _C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_k_n_o_w_n{}; // Not yet implemented │ │ │ │ │ -377 else if constexpr(std::is_same_v) │ │ │ │ │ -378 return _C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_k_n_o_w_n{}; // Not yet implemented │ │ │ │ │ -379 else if constexpr(std::is_same_v) │ │ │ │ │ -380 return _C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_m_a_k_e_U_n_i_f_o_r_m_D_e_s_c_r_i_p_t_o_r(_c_h_i_l_d_r_e_n,std::move │ │ │ │ │ -(subTree)); │ │ │ │ │ -381 else if constexpr(std::is_same_v) │ │ │ │ │ -382 return ContainerDescriptors::Impl::appendToTree(_c_h_i_l_d_r_e_n,std::move │ │ │ │ │ -(subTree)); │ │ │ │ │ -383 else │ │ │ │ │ -384 return _C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_k_n_o_w_n{}; │ │ │ │ │ -385 } │ │ │ │ │ -386 │ │ │ │ │ -387protected: │ │ │ │ │ -_3_8_8 std::size_t _c_h_i_l_d_r_e_n__; │ │ │ │ │ -_3_8_9 _S_u_b_P_r_e_B_a_s_i_s _s_u_b_P_r_e_B_a_s_i_s__; │ │ │ │ │ -390}; │ │ │ │ │ -391 │ │ │ │ │ -392 │ │ │ │ │ -393 │ │ │ │ │ -394namespace BasisFactory { │ │ │ │ │ -395 │ │ │ │ │ -408template │ │ │ │ │ -_4_0_9auto _p_o_w_e_r(ChildPreBasisFactory&& childPreBasisFactory, std::size_t k, const │ │ │ │ │ -_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y&) │ │ │ │ │ -410{ │ │ │ │ │ -411 return [childPreBasisFactory,k](const auto& gridView) { │ │ │ │ │ -412 auto childPreBasis = childPreBasisFactory(gridView); │ │ │ │ │ -413 return _D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_<_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y_,_ _d_e_c_l_t_y_p_e_(_c_h_i_l_d_P_r_e_B_a_s_i_s_)_> │ │ │ │ │ -(k,std::move(childPreBasis)); │ │ │ │ │ -414 }; │ │ │ │ │ -415} │ │ │ │ │ -416 │ │ │ │ │ -427template │ │ │ │ │ -_4_2_8auto _p_o_w_e_r(ChildPreBasisFactory&& childPreBasisFactory, std::size_t k) │ │ │ │ │ -429{ │ │ │ │ │ -430 return [childPreBasisFactory,k](const auto& gridView) { │ │ │ │ │ -431 auto childPreBasis = childPreBasisFactory(gridView); │ │ │ │ │ -432 return _D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_<_B_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d_,_ _d_e_c_l_t_y_p_e_(_c_h_i_l_d_P_r_e_B_a_s_i_s_)_> │ │ │ │ │ -(k,std::move(childPreBasis)); │ │ │ │ │ -433 }; │ │ │ │ │ -434} │ │ │ │ │ -435 │ │ │ │ │ -436} // end namespace BasisFactory │ │ │ │ │ -437 │ │ │ │ │ -438} // end namespace Functions │ │ │ │ │ -439} // end namespace Dune │ │ │ │ │ -440 │ │ │ │ │ -441 │ │ │ │ │ -442#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DYNAMICPOWERBASIS_HH │ │ │ │ │ +174} │ │ │ │ │ +175 │ │ │ │ │ +176 │ │ │ │ │ +177} // end namespace Functions │ │ │ │ │ +178} // end namespace Dune │ │ │ │ │ +179 │ │ │ │ │ +180 │ │ │ │ │ +181#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_POWERBASIS_HH │ │ │ │ │ _u_t_i_l_i_t_y_._h_h │ │ │ │ │ _t_y_p_e___t_r_a_i_t_s_._h_h │ │ │ │ │ -_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h │ │ │ │ │ +_d_y_n_a_m_i_c_p_o_w_e_r_b_a_s_i_s_._h_h │ │ │ │ │ _b_a_s_i_s_t_a_g_s_._h_h │ │ │ │ │ +_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h │ │ │ │ │ _n_o_d_e_s_._h_h │ │ │ │ │ +_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_p_o_w_e_r │ │ │ │ │ auto power(ChildPreBasisFactory &&childPreBasisFactory, std::size_t k, const │ │ │ │ │ IndexMergingStrategy &) │ │ │ │ │ Create a pre-basis factory that can build a PowerPreBasis. │ │ │ │ │ DDeeffiinniittiioonn dynamicpowerbasis.hh:409 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_e_n_a_b_l_e_I_f_C_o_n_s_t_r_u_c_t_i_b_l_e │ │ │ │ │ std::enable_if_t< std::is_constructible_v< T, Args... >, int > │ │ │ │ │ enableIfConstructible │ │ │ │ │ Helper to constrain forwarding constructors. │ │ │ │ │ DDeeffiinniittiioonn type_traits.hh:31 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -auto containerDescriptor(const PreBasis &preBasis) │ │ │ │ │ -Return the container descriptor of the pre-basis, if defined, otherwise │ │ │ │ │ -ContainerDescriptor::Unknown. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_m_a_k_e_U_n_i_f_o_r_m_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -auto makeUniformDescriptor(std::integral_constant< std::size_t, n >, Child │ │ │ │ │ -child) │ │ │ │ │ -Generate a uniform descriptor in case the size is a static constant. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:159 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ Base class for index merging strategies to simplify detection. │ │ │ │ │ DDeeffiinniittiioonn basistags.hh:48 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_F_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c │ │ │ │ │ -Lexicographic merging of direct children without blocking. │ │ │ │ │ -DDeeffiinniittiioonn basistags.hh:84 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_F_l_a_t_I_n_t_e_r_l_e_a_v_e_d │ │ │ │ │ -Interleaved merging of direct children without blocking. │ │ │ │ │ -DDeeffiinniittiioonn basistags.hh:118 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_B_l_o_c_k_e_d_L_e_x_i_c_o_g_r_a_p_h_i_c │ │ │ │ │ -Lexicographic merging of direct children with blocking (i.e. creating one block │ │ │ │ │ -per direct child). │ │ │ │ │ -DDeeffiinniittiioonn basistags.hh:152 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_B_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d │ │ │ │ │ -Interleaved merging of direct children with blocking (i.e. creating blocks at │ │ │ │ │ -the leaves containing o... │ │ │ │ │ -DDeeffiinniittiioonn basistags.hh:184 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_k_n_o_w_n │ │ │ │ │ -Fallback container descriptor if nothing else fits. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:50 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s │ │ │ │ │ A pre-basis for dynamic power bases. │ │ │ │ │ DDeeffiinniittiioonn dynamicpowerbasis.hh:48 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ std::size_t size_type │ │ │ │ │ Type used for indices and size information. │ │ │ │ │ DDeeffiinniittiioonn dynamicpowerbasis.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ -IMS IndexMergingStrategy │ │ │ │ │ -Strategy used to merge the global indices of the child factories. │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:63 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s │ │ │ │ │ -DynamicPowerPreBasis(std::size_t c, SFArgs &&... sfArgs) │ │ │ │ │ -Constructor for given child pre-basis objects. │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:80 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_m_u_l_t_i_I_n_d_e_x_P_o_p_F_r_o_n_t │ │ │ │ │ -static void multiIndexPopFront(MultiIndex &M) │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:175 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ -size_type dimension() const │ │ │ │ │ -Get the total dimension of the space spanned by this basis. │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:222 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_I_m_p_l │ │ │ │ │ auto containerDescriptorImpl(Children children) const │ │ │ │ │ DDeeffiinniittiioonn dynamicpowerbasis.hh:372 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s │ │ │ │ │ -It indices(const NodeType &node, It it) const │ │ │ │ │ -Maps from subtree index set [0..size-1] to a globally unique multi index in │ │ │ │ │ -global basis. │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:248 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s │ │ │ │ │ -void initializeIndices() │ │ │ │ │ -Initialize the global indices. │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:88 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_i_z_e_I_m_p_l │ │ │ │ │ size_type sizeImpl(SizePrefix prefix, Children children, BasisFactory:: │ │ │ │ │ FlatInterleaved) const │ │ │ │ │ DDeeffiinniittiioonn dynamicpowerbasis.hh:137 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e │ │ │ │ │ -static constexpr size_type maxMultiIndexSize │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:68 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_u_p_d_a_t_e │ │ │ │ │ -void update(const GridView &gv) │ │ │ │ │ -Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:100 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -auto containerDescriptor() const │ │ │ │ │ -Return the associated container descriptor. │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:254 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ -size_type size() const │ │ │ │ │ -Same as size(prefix) with empty prefix. │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:122 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s_I_m_p_l │ │ │ │ │ -It indicesImpl(const NodeType &node, It multiIndices, Children children, │ │ │ │ │ -BasisFactory::BlockedInterleaved) const │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:348 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_u_b_P_r_e_B_a_s_i_s │ │ │ │ │ -SubPreBasis & subPreBasis() │ │ │ │ │ -Mutable access to the stored prebasis of the factor in the power space. │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:240 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_i_z_e_I_m_p_l │ │ │ │ │ -size_type sizeImpl(SizePrefix prefix, Children children, BasisFactory:: │ │ │ │ │ -FlatLexicographic) const │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:153 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_m_u_l_t_i_I_n_d_e_x_P_u_s_h_F_r_o_n_t │ │ │ │ │ -static void multiIndexPushFront(MultiIndex &M, size_type M0) │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:313 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_u_b_P_r_e_B_a_s_i_s__ │ │ │ │ │ SubPreBasis subPreBasis_ │ │ │ │ │ DDeeffiinniittiioonn dynamicpowerbasis.hh:389 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_i_z_e_I_m_p_l │ │ │ │ │ -size_type sizeImpl(SizePrefix prefix, Children children, BasisFactory:: │ │ │ │ │ -BlockedLexicographic) const │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:183 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_i_z_e_I_m_p_l │ │ │ │ │ -size_type sizeImpl(SizePrefix prefix, Children children, BasisFactory:: │ │ │ │ │ -BlockedInterleaved) const │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:192 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s_I_m_p_l │ │ │ │ │ It indicesImpl(const NodeType &node, It multiIndices, Children children, │ │ │ │ │ -BasisFactory::BlockedLexicographic) const │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:322 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_m_u_l_t_i_I_n_d_e_x_B_u_f_f_e_r_S_i_z_e │ │ │ │ │ -static constexpr size_type multiIndexBufferSize │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:70 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_S_u_b_P_r_e_B_a_s_i_s │ │ │ │ │ +BasisFactory::FlatInterleaved) const │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:262 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_B_a_s_i_s_N_o_d_e │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:198 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s │ │ │ │ │ +A pre-basis for power bases. │ │ │ │ │ +DDeeffiinniittiioonn powerbasis.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ +IMS IndexMergingStrategy │ │ │ │ │ +Strategy used to merge the global indices of the child factories. │ │ │ │ │ +DDeeffiinniittiioonn powerbasis.hh:67 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +typename Base::size_type size_type │ │ │ │ │ +Type used for indices and size information. │ │ │ │ │ +DDeeffiinniittiioonn powerbasis.hh:64 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_S_u_b_P_r_e_B_a_s_i_s │ │ │ │ │ SPB SubPreBasis │ │ │ │ │ The child pre-basis. │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:54 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ +DDeeffiinniittiioonn powerbasis.hh:58 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +auto containerDescriptor() const │ │ │ │ │ +Return the associated container descriptor. │ │ │ │ │ +DDeeffiinniittiioonn powerbasis.hh:117 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s │ │ │ │ │ +It indices(const NodeType &node, It it) const │ │ │ │ │ +Maps from subtree index set [0..size-1] to a globally unique multi index in │ │ │ │ │ +global basis. │ │ │ │ │ +DDeeffiinniittiioonn powerbasis.hh:111 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s │ │ │ │ │ +PowerPreBasis(SFArgs &&... sfArgs) │ │ │ │ │ +Constructor for given child pre-basis objects for static size of the power- │ │ │ │ │ +basis. │ │ │ │ │ +DDeeffiinniittiioonn powerbasis.hh:80 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ +size_type size() const │ │ │ │ │ +Same as size(prefix) with empty prefix. │ │ │ │ │ +DDeeffiinniittiioonn powerbasis.hh:96 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ Node makeNode() const │ │ │ │ │ Create tree node. │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:108 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_u_b_P_r_e_B_a_s_i_s │ │ │ │ │ -const SubPreBasis & subPreBasis() const │ │ │ │ │ -Const access to the stored prebasis of the factor in the power space. │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:234 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s_I_m_p_l │ │ │ │ │ -It indicesImpl(const NodeType &node, It multiIndices, Children children, │ │ │ │ │ -BasisFactory::FlatInterleaved) const │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:262 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_c_h_i_l_d_r_e_n │ │ │ │ │ -std::size_t children() const │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:116 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_m_a_x_N_o_d_e_S_i_z_e │ │ │ │ │ -size_type maxNodeSize() const │ │ │ │ │ -Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:228 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s_I_m_p_l │ │ │ │ │ -It indicesImpl(const NodeType &node, It multiIndices, Children children, │ │ │ │ │ -BasisFactory::FlatLexicographic) const │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:289 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ +DDeeffiinniittiioonn powerbasis.hh:87 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_c_h_i_l_d_r_e_n │ │ │ │ │ +static constexpr std::integral_constant< std::size_t, C > children │ │ │ │ │ +Number of children provided as an integral constant. │ │ │ │ │ +DDeeffiinniittiioonn powerbasis.hh:70 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ size_type size(const SizePrefix &prefix) const │ │ │ │ │ Return number of possible values for next position in multi index. │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:129 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ -typename SPB::GridView GridView │ │ │ │ │ -The grid view that the FE basis is defined on. │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:57 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_c_h_i_l_d_r_e_n__ │ │ │ │ │ -std::size_t children_ │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:388 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ -const GridView & gridView() const │ │ │ │ │ -Obtain the grid view that the basis is defined on. │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:94 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_m_i_n_M_u_l_t_i_I_n_d_e_x_S_i_z_e │ │ │ │ │ -static constexpr size_type minMultiIndexSize │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:69 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:224 │ │ │ │ │ +DDeeffiinniittiioonn powerbasis.hh:103 │ │ │ │ │ _c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00110.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: defaultglobalbasis.hh File Reference │ │ │ │ +dune-functions: dynamicpowerbasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -73,57 +73,54 @@ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
defaultglobalbasis.hh File Reference
│ │ │ │ +
dynamicpowerbasis.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <cstddef>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <dune/common/reservedvector.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/defaultlocalview.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/containerdescriptors.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ #include <dune/functions/functionspacebases/concepts.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::DynamicPowerPreBasis< IMS, SPB >
 A pre-basis for dynamic power bases. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ 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<class ChildPreBasisFactory , class IndexMergingStrategy >
auto Dune::Functions::BasisFactory::power (ChildPreBasisFactory &&childPreBasisFactory, std::size_t k, const IndexMergingStrategy &)
 Create a pre-basis factory that can build a PowerPreBasis.
 
template<class ChildPreBasisFactory >
auto Dune::Functions::BasisFactory::power (ChildPreBasisFactory &&childPreBasisFactory, std::size_t k)
 Create a factory builder that can build a PowerPreBasis.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -2,46 +2,42 @@ │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -defaultglobalbasis.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +dynamicpowerbasis.hh File Reference │ │ │ │ │ #include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_u_t_i_l_i_t_y_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_l_o_c_a_l_v_i_e_w_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_b_a_s_i_s_t_a_g_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_<_ _P_B_ _> │ │ │ │ │ -  Global basis for given pre-basis. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_<_ _I_M_S_,_ _S_P_B_ _> │ │ │ │ │ +  A pre-basis for dynamic power bases. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_B_u_i_l_d_e_r │ │ │ │ │ -  │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s (PreBasis &&) -> _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s< │ │ │ │ │ - std::decay_t< PreBasis > > │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s (const GridView &gv, PreBasisFactory │ │ │ │ │ - &&f) -> _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s< std::decay_t< decltype(f(gv))> > │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_m_a_k_e_B_a_s_i_s (const GridView &gridView, │ │ │ │ │ - PreBasisFactory &&preBasisFactory) │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_p_o_w_e_r (ChildPreBasisFactory │ │ │ │ │ + &&childPreBasisFactory, std::size_t k, const _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y &) │ │ │ │ │ +  Create a pre-basis factory that can build a _P_o_w_e_r_P_r_e_B_a_s_i_s. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_p_o_w_e_r (ChildPreBasisFactory │ │ │ │ │ + &&childPreBasisFactory, std::size_t k) │ │ │ │ │ +  Create a factory builder that can build a _P_o_w_e_r_P_r_e_B_a_s_i_s. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00110_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: defaultglobalbasis.hh Source File │ │ │ │ +dune-functions: dynamicpowerbasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,233 +74,512 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
defaultglobalbasis.hh
│ │ │ │ +
dynamicpowerbasis.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DYNAMICPOWERBASIS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DYNAMICPOWERBASIS_HH
│ │ │ │
9
│ │ │ │ -
10#include <cstddef>
│ │ │ │ -
11#include <type_traits>
│ │ │ │ -
12#include <utility>
│ │ │ │ +
10#include <dune/common/reservedvector.hh>
│ │ │ │ +
11#include <dune/common/typeutilities.hh>
│ │ │ │ +
12#include <dune/common/indices.hh>
│ │ │ │
13
│ │ │ │ -
14#include <dune/common/reservedvector.hh>
│ │ │ │ -
15#include <dune/common/typeutilities.hh>
│ │ │ │ -
16#include <dune/common/concept.hh>
│ │ │ │ -
17
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
20
│ │ │ │
21
│ │ │ │
22
│ │ │ │ -
23
│ │ │ │ -
24namespace Dune {
│ │ │ │ -
25namespace Functions {
│ │ │ │ +
23namespace Dune {
│ │ │ │ +
24namespace Functions {
│ │ │ │ +
25
│ │ │ │
26
│ │ │ │ -
27
│ │ │ │ -
28
│ │ │ │ -
48template<class PB>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
50{
│ │ │ │ -
51
│ │ │ │ -
52public:
│ │ │ │ -
53
│ │ │ │ -
55 using PreBasis = PB;
│ │ │ │ -
56
│ │ │ │ -
58 using PrefixPath = TypeTree::HybridTreePath<>;
│ │ │ │ -
59
│ │ │ │ -
61 using GridView = typename PreBasis::GridView;
│ │ │ │ -
62
│ │ │ │ -
64 using size_type = std::size_t;
│ │ │ │ -
65
│ │ │ │ - │ │ │ │ -
68
│ │ │ │ - │ │ │ │ +
27// *****************************************************************************
│ │ │ │ +
28// This is the reusable part of the dynamic power bases. It contains
│ │ │ │ +
29//
│ │ │ │ +
30// DynamicPowerPreBasis
│ │ │ │ +
31//
│ │ │ │ +
32// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ +
33// state. These components do _not_ depend on the global basis and local view
│ │ │ │ +
34// and can be used without a global basis.
│ │ │ │ +
35// *****************************************************************************
│ │ │ │ +
36
│ │ │ │ +
46template<class IMS, class SPB>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
48{
│ │ │ │ +
49 static const bool isBlocked = std::is_same_v<IMS,BasisFactory::BlockedLexicographic> or std::is_same_v<IMS,BasisFactory::BlockedInterleaved>;
│ │ │ │ +
50
│ │ │ │ +
51public:
│ │ │ │ +
52
│ │ │ │ +
54 using SubPreBasis = SPB;
│ │ │ │ +
55
│ │ │ │ +
57 using GridView = typename SPB::GridView;
│ │ │ │ +
58
│ │ │ │ +
60 using size_type = std::size_t;
│ │ │ │ +
61
│ │ │ │ + │ │ │ │ +
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
│ │ │ │ -
73 using SizePrefix = Dune::ReservedVector<std::size_t, PreBasis::multiIndexBufferSize>;
│ │ │ │ -
74
│ │ │ │ -
83 template<class... T,
│ │ │ │ -
84 disableCopyMove<DefaultGlobalBasis, T...> = 0,
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
87 preBasis_(std::forward<T>(t)...),
│ │ │ │ - │ │ │ │ +
77 template<class... SFArgs,
│ │ │ │ +
78 disableCopyMove<DynamicPowerPreBasis, SFArgs...> = 0,
│ │ │ │ +
79 enableIfConstructible<SubPreBasis, SFArgs...> = 0>
│ │ │ │ +
│ │ │ │ +
80 explicit DynamicPowerPreBasis(std::size_t c, SFArgs&&... sfArgs) :
│ │ │ │ +
81 children_(c),
│ │ │ │ +
82 subPreBasis_(std::forward<SFArgs>(sfArgs)...)
│ │ │ │ +
83 {
│ │ │ │ +
84 static_assert(models<Concept::PreBasis<GridView>, SubPreBasis>(), "Subprebasis passed to DynamicPowerPreBasis does not model the PreBasis concept.");
│ │ │ │ +
85 }
│ │ │ │ +
│ │ │ │ +
86
│ │ │ │ +
│ │ │ │ + │ │ │ │
89 {
│ │ │ │ -
90 static_assert(models<Concept::PreBasis<GridView>, PreBasis>(), "Type passed to DefaultGlobalBasis does not model the PreBasis concept.");
│ │ │ │ -
91 preBasis_.initializeIndices();
│ │ │ │ -
92 }
│ │ │ │ -
│ │ │ │ -
93
│ │ │ │ -
100 template<class PreBasisFactory,
│ │ │ │ -
101 std::enable_if_t<Dune::IsCallable<PreBasisFactory(GridView), PreBasis>::value, int> = 0>
│ │ │ │ -
│ │ │ │ -
102 DefaultGlobalBasis(const GridView& gridView, PreBasisFactory&& factory) :
│ │ │ │ -
103 preBasis_(factory(gridView)),
│ │ │ │ - │ │ │ │ -
105 {
│ │ │ │ -
106 static_assert(models<Concept::PreBasis<GridView>, PreBasis>(), "Type passed to DefaultGlobalBasis does not model the PreBasis concept.");
│ │ │ │ -
107 preBasis_.initializeIndices();
│ │ │ │ -
108 }
│ │ │ │ -
│ │ │ │ -
109
│ │ │ │ -
│ │ │ │ -
111 const GridView& gridView() const
│ │ │ │ -
112 {
│ │ │ │ -
113 return preBasis_.gridView();
│ │ │ │ +
90 subPreBasis_.initializeIndices();
│ │ │ │ +
91 }
│ │ │ │ +
│ │ │ │ +
92
│ │ │ │ +
│ │ │ │ +
94 const GridView& gridView() const
│ │ │ │ +
95 {
│ │ │ │ +
96 return subPreBasis_.gridView();
│ │ │ │ +
97 }
│ │ │ │ +
│ │ │ │ +
98
│ │ │ │ +
│ │ │ │ +
100 void update(const GridView& gv)
│ │ │ │ +
101 {
│ │ │ │ +
102 subPreBasis_.update(gv);
│ │ │ │ +
103 }
│ │ │ │ +
│ │ │ │ +
104
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
109 {
│ │ │ │ +
110 auto node = Node{children_};
│ │ │ │ +
111 for (std::size_t i=0; i<children_; ++i)
│ │ │ │ +
112 node.setChild(i, subPreBasis_.makeNode());
│ │ │ │ +
113 return node;
│ │ │ │
114 }
│ │ │ │
│ │ │ │
115
│ │ │ │ -
│ │ │ │ -
117 const PreBasis& preBasis() const
│ │ │ │ -
118 {
│ │ │ │ -
119 return preBasis_;
│ │ │ │ -
120 }
│ │ │ │ -
│ │ │ │ -
121
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
124 {
│ │ │ │ -
125 return preBasis_;
│ │ │ │ -
126 }
│ │ │ │ -
│ │ │ │ -
127
│ │ │ │ -
│ │ │ │ -
134 void update(const GridView & gv)
│ │ │ │ -
135 {
│ │ │ │ -
136 preBasis_.update(gv);
│ │ │ │ -
137 preBasis_.initializeIndices();
│ │ │ │ -
138 }
│ │ │ │ -
│ │ │ │ -
139
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
142 {
│ │ │ │ -
143 return preBasis_.dimension();
│ │ │ │ -
144 }
│ │ │ │ -
│ │ │ │ -
145
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
148 {
│ │ │ │ -
149 return preBasis_.size();
│ │ │ │ +
│ │ │ │ +
116 std::size_t children() const
│ │ │ │ +
117 {
│ │ │ │ +
118 return children_;
│ │ │ │ +
119 }
│ │ │ │ +
│ │ │ │ +
120
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
123 {
│ │ │ │ +
124 return size(Dune::ReservedVector<size_type, multiIndexBufferSize>{});
│ │ │ │ +
125 }
│ │ │ │ +
│ │ │ │ +
126
│ │ │ │ +
128 template<class SizePrefix>
│ │ │ │ +
│ │ │ │ +
129 size_type size(const SizePrefix& prefix) const
│ │ │ │ +
130 {
│ │ │ │ +
131 return sizeImpl(prefix, children_, IndexMergingStrategy{});
│ │ │ │ +
132 }
│ │ │ │ +
│ │ │ │ +
133
│ │ │ │ +
134protected:
│ │ │ │ +
135
│ │ │ │ +
136 template<class SizePrefix, class Children>
│ │ │ │ +
│ │ │ │ +
137 size_type sizeImpl(SizePrefix prefix, Children children, BasisFactory::FlatInterleaved) const
│ │ │ │ +
138 {
│ │ │ │ +
139 // The root index size is the root index size of a single subnode
│ │ │ │ +
140 // multiplied by the number of subnodes, because we enumerate all
│ │ │ │ +
141 // child indices in a row.
│ │ │ │ +
142 if (prefix.size() == 0)
│ │ │ │ +
143 return children*subPreBasis_.size();
│ │ │ │ +
144
│ │ │ │ +
145 // The FlatInterleaved index merging strategy only changes the first
│ │ │ │ +
146 // index digit. Hence, we have to reconstruct the corresponding digit
│ │ │ │ +
147 // for the subtree and can then return the corresponding size of the subtree.
│ │ │ │ +
148 prefix[0] = prefix[0] / children;
│ │ │ │ +
149 return subPreBasis_.size(prefix);
│ │ │ │
150 }
│ │ │ │
│ │ │ │
151
│ │ │ │ +
152 template<class SizePrefix, class Children>
│ │ │ │
│ │ │ │ -
153 size_type size(const SizePrefix& prefix) const
│ │ │ │ +
153 size_type sizeImpl(SizePrefix prefix, Children children, BasisFactory::FlatLexicographic) const
│ │ │ │
154 {
│ │ │ │ -
155 return preBasis_.size(prefix);
│ │ │ │ -
156 }
│ │ │ │ -
│ │ │ │ -
157
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
160 {
│ │ │ │ -
161 return LocalView(*this);
│ │ │ │ -
162 }
│ │ │ │ -
│ │ │ │ -
163
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
166 {
│ │ │ │ -
167 return *this;
│ │ │ │ -
168 }
│ │ │ │ -
│ │ │ │ -
169
│ │ │ │ -
│ │ │ │ -
171 const PrefixPath& prefixPath() const
│ │ │ │ -
172 {
│ │ │ │ -
173 return prefixPath_;
│ │ │ │ -
174 }
│ │ │ │ -
│ │ │ │ -
175
│ │ │ │ -
176protected:
│ │ │ │ - │ │ │ │ - │ │ │ │ -
179};
│ │ │ │ +
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. Then we can append
│ │ │ │ +
164 // the other prefix entries unmodified, because the index tree
│ │ │ │ +
165 // looks the same after the first level.
│ │ │ │ +
166
│ │ │ │ +
167 // The FlatLexicographic index merging strategy only changes the first
│ │ │ │ +
168 // index digit. Hence, we have to reconstruct the corresponding digit
│ │ │ │ +
169 // for the subtree and can then return the corresponding size of the subtree.
│ │ │ │ +
170 prefix[0] = prefix[0] % subPreBasis_.size();
│ │ │ │ +
171 return subPreBasis_.size(prefix);
│ │ │ │ +
172 }
│ │ │ │ +
│ │ │ │ +
173
│ │ │ │ +
174 template<class MultiIndex>
│ │ │ │ +
│ │ │ │ +
175 static void multiIndexPopFront(MultiIndex& M)
│ │ │ │ +
176 {
│ │ │ │ +
177 for(std::size_t i=0; i<M.size()-1; ++i)
│ │ │ │ +
178 M[i] = M[i+1];
│ │ │ │ +
179 M.resize(M.size()-1);
│ │ │ │ +
180 }
│ │ │ │
│ │ │ │ -
180
│ │ │ │
181
│ │ │ │ -
182
│ │ │ │ -
183template<class PreBasis>
│ │ │ │ - │ │ │ │ -
185
│ │ │ │ -
186template<class GridView, class PreBasisFactory>
│ │ │ │ -
187DefaultGlobalBasis(const GridView& gv, PreBasisFactory&& f) -> DefaultGlobalBasis<std::decay_t<decltype(f(gv))>>;
│ │ │ │ -
188
│ │ │ │ -
189
│ │ │ │ +
182 template<class SizePrefix, class Children>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
184 {
│ │ │ │ +
185 if (prefix.size() == 0)
│ │ │ │ +
186 return children;
│ │ │ │ +
187 multiIndexPopFront(prefix);
│ │ │ │ +
188 return subPreBasis_.size(prefix);
│ │ │ │ +
189 }
│ │ │ │ +
│ │ │ │
190
│ │ │ │ -
191namespace BasisFactory {
│ │ │ │ -
192
│ │ │ │ -
193template<class GridView, class PreBasisFactory>
│ │ │ │ -
│ │ │ │ -
194auto makeBasis(const GridView& gridView, PreBasisFactory&& preBasisFactory)
│ │ │ │ -
195{
│ │ │ │ -
196 return DefaultGlobalBasis(preBasisFactory(gridView));
│ │ │ │ -
197}
│ │ │ │ -
│ │ │ │ -
198
│ │ │ │ -
199} // end namespace BasisFactory
│ │ │ │ -
200
│ │ │ │ -
201// Backward compatibility
│ │ │ │ -
202namespace [[deprecated("Will be removed after Dune 2.10")]] BasisBuilder {
│ │ │ │ -
203
│ │ │ │ -
204 using namespace BasisFactory;
│ │ │ │ -
205
│ │ │ │ -
206}
│ │ │ │ +
191 template<class SizePrefix, class Children>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
193 {
│ │ │ │ +
194 if (prefix.size() == 0)
│ │ │ │ +
195 return subPreBasis_.size();
│ │ │ │ +
196
│ │ │ │ +
197 // Remember last index, remove it and check if the remaining
│ │ │ │ +
198 // prefix refers to a leaf in the subPreBasis index tree.
│ │ │ │ +
199 // If yes, then the full prefix must also refer to a
│ │ │ │ +
200 // leaf in the merged index tree. If not, then restore the full
│ │ │ │ +
201 // prefix and proceed.
│ │ │ │ +
202 auto tail = prefix.back();
│ │ │ │ +
203 prefix.pop_back();
│ │ │ │ +
204 if (subPreBasis_.size(prefix) == 0)
│ │ │ │ +
205 return 0;
│ │ │ │ +
206 prefix.push_back(tail);
│ │ │ │
207
│ │ │ │ -
208
│ │ │ │ -
209} // end namespace Functions
│ │ │ │ -
210} // end namespace Dune
│ │ │ │ -
211
│ │ │ │ -
212
│ │ │ │ -
213
│ │ │ │ -
214#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ +
208 // Now check if the full prefix refers to a leaf in the subPreBasis
│ │ │ │ +
209 // index tree.
│ │ │ │ +
210 // If yes, then it has exactly 'children' appended children in the subtree.
│ │ │ │ +
211 // If not, then the index tree looks the same in the merged subtree and we
│ │ │ │ +
212 // can forward the result.
│ │ │ │ +
213 auto subSize = subPreBasis_.size(prefix);
│ │ │ │ +
214 if (subSize == 0)
│ │ │ │ +
215 return children;
│ │ │ │ +
216 return subSize;
│ │ │ │ +
217 }
│ │ │ │ +
│ │ │ │ +
218
│ │ │ │ +
219public:
│ │ │ │ +
220
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
223 {
│ │ │ │ +
224 return subPreBasis_.dimension() * children_;
│ │ │ │ +
225 }
│ │ │ │ +
│ │ │ │ +
226
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
229 {
│ │ │ │ +
230 return subPreBasis_.maxNodeSize() * children_;
│ │ │ │ +
231 }
│ │ │ │ +
│ │ │ │ +
232
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
235 {
│ │ │ │ +
236 return subPreBasis_;
│ │ │ │ +
237 }
│ │ │ │ +
│ │ │ │ +
238
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
241 {
│ │ │ │ +
242 return subPreBasis_;
│ │ │ │ +
243 }
│ │ │ │ +
│ │ │ │ +
244
│ │ │ │ +
246 template<class NodeType, typename It,
│ │ │ │ +
247 std::enable_if_t<NodeType::isPower, int> = 0>
│ │ │ │ +
│ │ │ │ +
248 It indices(const NodeType& node, It it) const
│ │ │ │ +
249 {
│ │ │ │ +
250 return indicesImpl(node, it, children_, IndexMergingStrategy{});
│ │ │ │ +
251 }
│ │ │ │ +
│ │ │ │ +
252
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
255 {
│ │ │ │ + │ │ │ │ +
257 }
│ │ │ │ +
│ │ │ │ +
258
│ │ │ │ +
259protected:
│ │ │ │ +
260
│ │ │ │ +
261 template<class NodeType, typename It, class Children>
│ │ │ │ +
│ │ │ │ +
262 It indicesImpl(const NodeType& node, It multiIndices, Children children, BasisFactory::FlatInterleaved) const
│ │ │ │ +
263 {
│ │ │ │ +
264 using namespace Dune::Indices;
│ │ │ │ +
265 size_type subTreeSize = node.child(_0).size();
│ │ │ │ +
266 // Fill indices for first child at the beginning.
│ │ │ │ +
267 auto next = subPreBasis().indices(node.child(_0), multiIndices);
│ │ │ │ +
268 // Multiply first component of all indices for first child by
│ │ │ │ +
269 // number of children to stretch the index range for interleaving.
│ │ │ │ +
270 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ +
271 multiIndices[i][0] *= children;
│ │ │ │ +
272 for (std::size_t child = 1; child<children; ++child)
│ │ │ │ +
273 {
│ │ │ │ +
274 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ +
275 {
│ │ │ │ +
276 // Copy indices from first child for all other children
│ │ │ │ +
277 // and shift them by child index to interleave indices.
│ │ │ │ +
278 // multiIndices[child*subTreeSize+i] = multiIndices[i];
│ │ │ │ +
279 // multiIndices[child*subTreeSize+i][0] = multiIndices[i][0]+child;
│ │ │ │ +
280 (*next) = multiIndices[i];
│ │ │ │ +
281 (*next)[0] = multiIndices[i][0]+child;
│ │ │ │ +
282 ++next;
│ │ │ │ +
283 }
│ │ │ │ +
284 }
│ │ │ │ +
285 return next;
│ │ │ │ +
286 }
│ │ │ │ +
│ │ │ │ +
287
│ │ │ │ +
288 template<class NodeType, typename It, class Children>
│ │ │ │ +
│ │ │ │ +
289 It indicesImpl(const NodeType& node, It multiIndices, Children children, BasisFactory::FlatLexicographic) const
│ │ │ │ +
290 {
│ │ │ │ +
291 using namespace Dune::Indices;
│ │ │ │ +
292 size_type subTreeSize = node.child(_0).size();
│ │ │ │ +
293 size_type firstIndexEntrySize = subPreBasis().size();
│ │ │ │ +
294 // Fill indices for first child at the beginning.
│ │ │ │ +
295 auto next = subPreBasis().indices(node.child(_0), multiIndices);
│ │ │ │ +
296 for (std::size_t child = 1; child<children_; ++child)
│ │ │ │ +
297 {
│ │ │ │ +
298 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ +
299 {
│ │ │ │ +
300 // Copy indices from first child for all other children
│ │ │ │ +
301 // and shift them by suitable offset to get lexicographic indices.
│ │ │ │ +
302 // multiIndices[child*subTreeSize+i] = multiIndices[i];
│ │ │ │ +
303 // multiIndices[child*subTreeSize+i][0] += child*firstIndexEntrySize;
│ │ │ │ +
304 (*next) = multiIndices[i];
│ │ │ │ +
305 (*next)[0] += child*firstIndexEntrySize;
│ │ │ │ +
306 ++next;
│ │ │ │ +
307 }
│ │ │ │ +
308 }
│ │ │ │ +
309 return next;
│ │ │ │ +
310 }
│ │ │ │ +
│ │ │ │ +
311
│ │ │ │ +
312 template<class MultiIndex>
│ │ │ │ +
│ │ │ │ +
313 static void multiIndexPushFront(MultiIndex& M, size_type M0)
│ │ │ │ +
314 {
│ │ │ │ +
315 M.resize(M.size()+1);
│ │ │ │ +
316 for(std::size_t i=M.size()-1; i>0; --i)
│ │ │ │ +
317 M[i] = M[i-1];
│ │ │ │ +
318 M[0] = M0;
│ │ │ │ +
319 }
│ │ │ │ +
│ │ │ │ +
320
│ │ │ │ +
321 template<class NodeType, typename It, class Children>
│ │ │ │ +
│ │ │ │ +
322 It indicesImpl(const NodeType& node, It multiIndices, Children children, BasisFactory::BlockedLexicographic) const
│ │ │ │ +
323 {
│ │ │ │ +
324 using namespace Dune::Indices;
│ │ │ │ +
325 size_type subTreeSize = node.child(_0).size();
│ │ │ │ +
326 // Fill indices for first child at the beginning.
│ │ │ │ +
327 auto next = subPreBasis().indices(node.child(_0), multiIndices);
│ │ │ │ +
328 // Insert 0 before first component of all indices for first child.
│ │ │ │ +
329 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ +
330 multiIndexPushFront(multiIndices[i], 0);
│ │ │ │ +
331 for (std::size_t child = 1; child<children_; ++child)
│ │ │ │ +
332 {
│ │ │ │ +
333 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ +
334 {
│ │ │ │ +
335 // Copy indices from first child for all other children and overwrite
│ │ │ │ +
336 // zero in first component as inserted above by child index.
│ │ │ │ +
337 // multiIndices[child*subTreeSize+i] = multiIndices[i];
│ │ │ │ +
338 // multiIndices[child*subTreeSize+i][0] = child;
│ │ │ │ +
339 (*next) = multiIndices[i];
│ │ │ │ +
340 (*next)[0] = child;
│ │ │ │ +
341 ++next;
│ │ │ │ +
342 }
│ │ │ │ +
343 }
│ │ │ │ +
344 return next;
│ │ │ │ +
345 }
│ │ │ │ +
│ │ │ │ +
346
│ │ │ │ +
347 template<class NodeType, typename It, class Children>
│ │ │ │ +
│ │ │ │ +
348 It indicesImpl(const NodeType& node, It multiIndices, Children children, BasisFactory::BlockedInterleaved) const
│ │ │ │ +
349 {
│ │ │ │ +
350 using namespace Dune::Indices;
│ │ │ │ +
351 size_type subTreeSize = node.child(_0).size();
│ │ │ │ +
352 // Fill indices for first child at the beginning.
│ │ │ │ +
353 auto next = subPreBasis().indices(node.child(_0), multiIndices);
│ │ │ │ +
354 // Append 0 after last component of all indices for first child.
│ │ │ │ +
355 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ +
356 multiIndices[i].push_back(0);
│ │ │ │ +
357 for (std::size_t child = 1; child<children_; ++child)
│ │ │ │ +
358 {
│ │ │ │ +
359 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ +
360 {
│ │ │ │ +
361 // Copy indices from first child for all other children and overwrite
│ │ │ │ +
362 // zero in last component as appended above by child index.
│ │ │ │ +
363 (*next) = multiIndices[i];
│ │ │ │ +
364 (*next).back() = child;
│ │ │ │ +
365 ++next;
│ │ │ │ +
366 }
│ │ │ │ +
367 }
│ │ │ │ +
368 return next;
│ │ │ │ +
369 }
│ │ │ │ +
│ │ │ │ +
370
│ │ │ │ +
371 template<class Children>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
373 {
│ │ │ │ + │ │ │ │ +
375 if constexpr(std::is_same_v<IMS, BasisFactory::FlatInterleaved>)
│ │ │ │ +
376 return ContainerDescriptors::Unknown{}; // Not yet implemented
│ │ │ │ +
377 else if constexpr(std::is_same_v<IMS, BasisFactory::FlatLexicographic>)
│ │ │ │ +
378 return ContainerDescriptors::Unknown{}; // Not yet implemented
│ │ │ │ +
379 else if constexpr(std::is_same_v<IMS, BasisFactory::BlockedLexicographic>)
│ │ │ │ +
380 return ContainerDescriptors::makeUniformDescriptor(children,std::move(subTree));
│ │ │ │ +
381 else if constexpr(std::is_same_v<IMS, BasisFactory::BlockedInterleaved>)
│ │ │ │ +
382 return ContainerDescriptors::Impl::appendToTree(children,std::move(subTree));
│ │ │ │ +
383 else
│ │ │ │ + │ │ │ │ +
385 }
│ │ │ │ +
│ │ │ │ +
386
│ │ │ │ +
387protected:
│ │ │ │ +
388 std::size_t children_;
│ │ │ │ + │ │ │ │ +
390};
│ │ │ │ +
│ │ │ │ +
391
│ │ │ │ +
392
│ │ │ │ +
393
│ │ │ │ +
394namespace BasisFactory {
│ │ │ │ +
395
│ │ │ │ +
408template<class ChildPreBasisFactory, class IndexMergingStrategy>
│ │ │ │ +
│ │ │ │ +
409auto power(ChildPreBasisFactory&& childPreBasisFactory, std::size_t k, const IndexMergingStrategy&)
│ │ │ │ +
410{
│ │ │ │ +
411 return [childPreBasisFactory,k](const auto& gridView) {
│ │ │ │ +
412 auto childPreBasis = childPreBasisFactory(gridView);
│ │ │ │ + │ │ │ │ +
414 };
│ │ │ │ +
415}
│ │ │ │ +
│ │ │ │ +
416
│ │ │ │ +
427template<class ChildPreBasisFactory>
│ │ │ │ +
│ │ │ │ +
428auto power(ChildPreBasisFactory&& childPreBasisFactory, std::size_t k)
│ │ │ │ +
429{
│ │ │ │ +
430 return [childPreBasisFactory,k](const auto& gridView) {
│ │ │ │ +
431 auto childPreBasis = childPreBasisFactory(gridView);
│ │ │ │ + │ │ │ │ +
433 };
│ │ │ │ +
434}
│ │ │ │ +
│ │ │ │ +
435
│ │ │ │ +
436} // end namespace BasisFactory
│ │ │ │ +
437
│ │ │ │ +
438} // end namespace Functions
│ │ │ │ +
439} // end namespace Dune
│ │ │ │ +
440
│ │ │ │ +
441
│ │ │ │ +
442#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DYNAMICPOWERBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
auto power(ChildPreBasisFactory &&childPreBasisFactory, std::size_t k, const IndexMergingStrategy &)
Create a pre-basis factory that can build a PowerPreBasis.
Definition dynamicpowerbasis.hh:409
│ │ │ │
std::enable_if_t< std::is_constructible_v< T, Args... >, int > enableIfConstructible
Helper to constrain forwarding constructors.
Definition type_traits.hh:31
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
auto makeBasis(const GridView &gridView, PreBasisFactory &&preBasisFactory)
Definition defaultglobalbasis.hh:194
│ │ │ │ -
Global basis for given pre-basis.
Definition defaultglobalbasis.hh:50
│ │ │ │ -
Dune::ReservedVector< std::size_t, PreBasis::multiIndexBufferSize > SizePrefix
Type used for prefixes handed to the size() method.
Definition defaultglobalbasis.hh:73
│ │ │ │ -
std::size_t size_type
Type used for indices and size information.
Definition defaultglobalbasis.hh:64
│ │ │ │ -
typename PreBasis::GridView GridView
The grid view that the FE space is defined on.
Definition defaultglobalbasis.hh:61
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition defaultglobalbasis.hh:111
│ │ │ │ -
PB PreBasis
Pre-basis providing the implementation details.
Definition defaultglobalbasis.hh:55
│ │ │ │ -
PreBasis & preBasis()
Obtain the pre-basis providing the implementation details.
Definition defaultglobalbasis.hh:123
│ │ │ │ -
void update(const GridView &gv)
Update the stored grid view.
Definition defaultglobalbasis.hh:134
│ │ │ │ -
DefaultLocalView< DefaultGlobalBasis< PreBasis > > LocalView
Type of the local view on the restriction of the basis to a single element.
Definition defaultglobalbasis.hh:67
│ │ │ │ -
typename LocalView::MultiIndex MultiIndex
Type used for global numbering of the basis vectors.
Definition defaultglobalbasis.hh:70
│ │ │ │ -
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition defaultglobalbasis.hh:153
│ │ │ │ -
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition defaultglobalbasis.hh:141
│ │ │ │ -
PreBasis preBasis_
Definition defaultglobalbasis.hh:177
│ │ │ │ -
LocalView localView() const
Return local view for basis.
Definition defaultglobalbasis.hh:159
│ │ │ │ -
TypeTree::HybridTreePath<> PrefixPath
The empty prefix path that identifies the root in the local ansatz tree.
Definition defaultglobalbasis.hh:58
│ │ │ │ -
DefaultGlobalBasis(T &&... t)
Constructor.
Definition defaultglobalbasis.hh:86
│ │ │ │ -
DefaultGlobalBasis(const GridView &gridView, PreBasisFactory &&factory)
Constructor from a PreBasis factory.
Definition defaultglobalbasis.hh:102
│ │ │ │ -
size_type size() const
Return number of possible values for next position in empty multi index.
Definition defaultglobalbasis.hh:147
│ │ │ │ -
const PreBasis & preBasis() const
Obtain the pre-basis providing the implementation details.
Definition defaultglobalbasis.hh:117
│ │ │ │ -
PrefixPath prefixPath_
Definition defaultglobalbasis.hh:178
│ │ │ │ -
const DefaultGlobalBasis & rootBasis() const
Return *this because we are not embedded in a larger basis.
Definition defaultglobalbasis.hh:165
│ │ │ │ -
const PrefixPath & prefixPath() const
Return empty path, because this is the root in the local ansatz tree.
Definition defaultglobalbasis.hh:171
│ │ │ │ -
The restriction of a finite element basis to a single element.
Definition defaultlocalview.hh:32
│ │ │ │ -
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:68
│ │ │ │ +
auto containerDescriptor(const PreBasis &preBasis)
Return the container descriptor of the pre-basis, if defined, otherwise ContainerDescriptor::Unknown.
Definition containerdescriptors.hh:73
│ │ │ │ +
auto makeUniformDescriptor(std::integral_constant< std::size_t, n >, Child child)
Generate a uniform descriptor in case the size is a static constant.
Definition containerdescriptors.hh:159
│ │ │ │ +
Base class for index merging strategies to simplify detection.
Definition basistags.hh:48
│ │ │ │ +
Lexicographic merging of direct children without blocking.
Definition basistags.hh:84
│ │ │ │ +
Interleaved merging of direct children without blocking.
Definition basistags.hh:118
│ │ │ │ +
Lexicographic merging of direct children with blocking (i.e. creating one block per direct child).
Definition basistags.hh:152
│ │ │ │ +
Interleaved merging of direct children with blocking (i.e. creating blocks at the leaves containing o...
Definition basistags.hh:184
│ │ │ │ +
Fallback container descriptor if nothing else fits.
Definition containerdescriptors.hh:50
│ │ │ │ +
A pre-basis for dynamic power bases.
Definition dynamicpowerbasis.hh:48
│ │ │ │ +
std::size_t size_type
Type used for indices and size information.
Definition dynamicpowerbasis.hh:60
│ │ │ │ +
IMS IndexMergingStrategy
Strategy used to merge the global indices of the child factories.
Definition dynamicpowerbasis.hh:63
│ │ │ │ +
DynamicPowerPreBasis(std::size_t c, SFArgs &&... sfArgs)
Constructor for given child pre-basis objects.
Definition dynamicpowerbasis.hh:80
│ │ │ │ +
static void multiIndexPopFront(MultiIndex &M)
Definition dynamicpowerbasis.hh:175
│ │ │ │ +
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition dynamicpowerbasis.hh:222
│ │ │ │ +
auto containerDescriptorImpl(Children children) const
Definition dynamicpowerbasis.hh:372
│ │ │ │ +
It indices(const NodeType &node, It it) const
Maps from subtree index set [0..size-1] to a globally unique multi index in global basis.
Definition dynamicpowerbasis.hh:248
│ │ │ │ +
void initializeIndices()
Initialize the global indices.
Definition dynamicpowerbasis.hh:88
│ │ │ │ +
size_type sizeImpl(SizePrefix prefix, Children children, BasisFactory::FlatInterleaved) const
Definition dynamicpowerbasis.hh:137
│ │ │ │ +
static constexpr size_type maxMultiIndexSize
Definition dynamicpowerbasis.hh:68
│ │ │ │ +
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition dynamicpowerbasis.hh:100
│ │ │ │ +
auto containerDescriptor() const
Return the associated container descriptor.
Definition dynamicpowerbasis.hh:254
│ │ │ │ +
size_type size() const
Same as size(prefix) with empty prefix.
Definition dynamicpowerbasis.hh:122
│ │ │ │ +
It indicesImpl(const NodeType &node, It multiIndices, Children children, BasisFactory::BlockedInterleaved) const
Definition dynamicpowerbasis.hh:348
│ │ │ │ +
SubPreBasis & subPreBasis()
Mutable access to the stored prebasis of the factor in the power space.
Definition dynamicpowerbasis.hh:240
│ │ │ │ +
size_type sizeImpl(SizePrefix prefix, Children children, BasisFactory::FlatLexicographic) const
Definition dynamicpowerbasis.hh:153
│ │ │ │ +
static void multiIndexPushFront(MultiIndex &M, size_type M0)
Definition dynamicpowerbasis.hh:313
│ │ │ │ +
SubPreBasis subPreBasis_
Definition dynamicpowerbasis.hh:389
│ │ │ │ +
size_type sizeImpl(SizePrefix prefix, Children children, BasisFactory::BlockedLexicographic) const
Definition dynamicpowerbasis.hh:183
│ │ │ │ +
size_type sizeImpl(SizePrefix prefix, Children children, BasisFactory::BlockedInterleaved) const
Definition dynamicpowerbasis.hh:192
│ │ │ │ +
It indicesImpl(const NodeType &node, It multiIndices, Children children, BasisFactory::BlockedLexicographic) const
Definition dynamicpowerbasis.hh:322
│ │ │ │ +
static constexpr size_type multiIndexBufferSize
Definition dynamicpowerbasis.hh:70
│ │ │ │ +
SPB SubPreBasis
The child pre-basis.
Definition dynamicpowerbasis.hh:54
│ │ │ │ +
Node makeNode() const
Create tree node.
Definition dynamicpowerbasis.hh:108
│ │ │ │ +
const SubPreBasis & subPreBasis() const
Const access to the stored prebasis of the factor in the power space.
Definition dynamicpowerbasis.hh:234
│ │ │ │ +
It indicesImpl(const NodeType &node, It multiIndices, Children children, BasisFactory::FlatInterleaved) const
Definition dynamicpowerbasis.hh:262
│ │ │ │ +
std::size_t children() const
Definition dynamicpowerbasis.hh:116
│ │ │ │ +
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition dynamicpowerbasis.hh:228
│ │ │ │ +
It indicesImpl(const NodeType &node, It multiIndices, Children children, BasisFactory::FlatLexicographic) const
Definition dynamicpowerbasis.hh:289
│ │ │ │ +
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition dynamicpowerbasis.hh:129
│ │ │ │ +
typename SPB::GridView GridView
The grid view that the FE basis is defined on.
Definition dynamicpowerbasis.hh:57
│ │ │ │ +
std::size_t children_
Definition dynamicpowerbasis.hh:388
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition dynamicpowerbasis.hh:94
│ │ │ │ +
static constexpr size_type minMultiIndexSize
Definition dynamicpowerbasis.hh:69
│ │ │ │ + │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,285 +1,605 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -defaultglobalbasis.hh │ │ │ │ │ +dynamicpowerbasis.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DYNAMICPOWERBASIS_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DYNAMICPOWERBASIS_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ 13 │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17 │ │ │ │ │ -18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ -19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_l_o_c_a_l_v_i_e_w_._h_h> │ │ │ │ │ -20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +14#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_u_t_i_l_i_t_y_._h_h> │ │ │ │ │ +15#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ +16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_b_a_s_i_s_t_a_g_s_._h_h> │ │ │ │ │ +17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h> │ │ │ │ │ +18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ +19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +20 │ │ │ │ │ 21 │ │ │ │ │ 22 │ │ │ │ │ -23 │ │ │ │ │ -24namespace _D_u_n_e { │ │ │ │ │ -25namespace Functions { │ │ │ │ │ +23namespace _D_u_n_e { │ │ │ │ │ +24namespace Functions { │ │ │ │ │ +25 │ │ │ │ │ 26 │ │ │ │ │ -27 │ │ │ │ │ -28 │ │ │ │ │ -48template │ │ │ │ │ -_4_9class _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ -50{ │ │ │ │ │ -51 │ │ │ │ │ -52public: │ │ │ │ │ -53 │ │ │ │ │ -_5_5 using _P_r_e_B_a_s_i_s = PB; │ │ │ │ │ -56 │ │ │ │ │ -_5_8 using _P_r_e_f_i_x_P_a_t_h = TypeTree::HybridTreePath<>; │ │ │ │ │ -59 │ │ │ │ │ -_6_1 using _G_r_i_d_V_i_e_w = typename PreBasis::GridView; │ │ │ │ │ -62 │ │ │ │ │ -_6_4 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ -65 │ │ │ │ │ -_6_7 using _L_o_c_a_l_V_i_e_w = _D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_<_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_<_P_r_e_B_a_s_i_s_>>; │ │ │ │ │ -68 │ │ │ │ │ -_7_0 using _M_u_l_t_i_I_n_d_e_x = typename _L_o_c_a_l_V_i_e_w_:_:_M_u_l_t_i_I_n_d_e_x; │ │ │ │ │ +27/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ +28// This is the reusable part of the dynamic power bases. It contains │ │ │ │ │ +29// │ │ │ │ │ +30// DynamicPowerPreBasis │ │ │ │ │ +31// │ │ │ │ │ +32// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ +shared │ │ │ │ │ +33// state. These components do _not_ depend on the global basis and local view │ │ │ │ │ +34// and can be used without a global basis. │ │ │ │ │ +35/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ +36 │ │ │ │ │ +46template │ │ │ │ │ +_4_7class _D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s │ │ │ │ │ +48{ │ │ │ │ │ +49 static const bool isBlocked = std::is_same_v or std::is_same_v; │ │ │ │ │ +50 │ │ │ │ │ +51public: │ │ │ │ │ +52 │ │ │ │ │ +_5_4 using _S_u_b_P_r_e_B_a_s_i_s = SPB; │ │ │ │ │ +55 │ │ │ │ │ +_5_7 using _G_r_i_d_V_i_e_w = typename SPB::GridView; │ │ │ │ │ +58 │ │ │ │ │ +_6_0 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ +61 │ │ │ │ │ +_6_3 using _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y = IMS; │ │ │ │ │ +64 │ │ │ │ │ +_6_6 using _N_o_d_e = _D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e_<_t_y_p_e_n_a_m_e_ _S_u_b_P_r_e_B_a_s_i_s_:_:_N_o_d_e_>; │ │ │ │ │ +67 │ │ │ │ │ +_6_8 static constexpr _s_i_z_e___t_y_p_e _m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e = SubPreBasis:: │ │ │ │ │ +maxMultiIndexSize + isBlocked; │ │ │ │ │ +_6_9 static constexpr _s_i_z_e___t_y_p_e _m_i_n_M_u_l_t_i_I_n_d_e_x_S_i_z_e = SubPreBasis:: │ │ │ │ │ +minMultiIndexSize + isBlocked; │ │ │ │ │ +_7_0 static constexpr _s_i_z_e___t_y_p_e _m_u_l_t_i_I_n_d_e_x_B_u_f_f_e_r_S_i_z_e = SubPreBasis:: │ │ │ │ │ +multiIndexBufferSize + isBlocked; │ │ │ │ │ 71 │ │ │ │ │ -_7_3 using _S_i_z_e_P_r_e_f_i_x = Dune::ReservedVector; │ │ │ │ │ -74 │ │ │ │ │ -83 template = 0, │ │ │ │ │ -85 _e_n_a_b_l_e_I_f_C_o_n_s_t_r_u_c_t_i_b_l_e<_P_r_e_B_a_s_i_s, T...> = 0> │ │ │ │ │ -_8_6 _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s(T&&... t) : │ │ │ │ │ -87 _p_r_e_B_a_s_i_s__(std::forward(t)...), │ │ │ │ │ -88 _p_r_e_f_i_x_P_a_t_h__() │ │ │ │ │ +77 template = 0, │ │ │ │ │ +79 _e_n_a_b_l_e_I_f_C_o_n_s_t_r_u_c_t_i_b_l_e<_S_u_b_P_r_e_B_a_s_i_s, SFArgs...> = 0> │ │ │ │ │ +_8_0 explicit _D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s(std::size_t c, SFArgs&&... sfArgs) : │ │ │ │ │ +81 _c_h_i_l_d_r_e_n__(c), │ │ │ │ │ +82 _s_u_b_P_r_e_B_a_s_i_s__(std::forward(sfArgs)...) │ │ │ │ │ +83 { │ │ │ │ │ +84 static_assert(models, _S_u_b_P_r_e_B_a_s_i_s>(), │ │ │ │ │ +"Subprebasis passed to DynamicPowerPreBasis does not model the PreBasis │ │ │ │ │ +concept."); │ │ │ │ │ +85 } │ │ │ │ │ +86 │ │ │ │ │ +_8_8 void _i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s() │ │ │ │ │ 89 { │ │ │ │ │ -90 static_assert(models, _P_r_e_B_a_s_i_s>(), "Type passed │ │ │ │ │ -to DefaultGlobalBasis does not model the PreBasis concept."); │ │ │ │ │ -91 _p_r_e_B_a_s_i_s__.initializeIndices(); │ │ │ │ │ -92 } │ │ │ │ │ -93 │ │ │ │ │ -100 template:: │ │ │ │ │ -value, int> = 0> │ │ │ │ │ -_1_0_2 _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s(const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w, PreBasisFactory&& factory) : │ │ │ │ │ -103 _p_r_e_B_a_s_i_s__(factory(_g_r_i_d_V_i_e_w)), │ │ │ │ │ -104 _p_r_e_f_i_x_P_a_t_h__() │ │ │ │ │ -105 { │ │ │ │ │ -106 static_assert(models, _P_r_e_B_a_s_i_s>(), "Type passed │ │ │ │ │ -to DefaultGlobalBasis does not model the PreBasis concept."); │ │ │ │ │ -107 _p_r_e_B_a_s_i_s__.initializeIndices(); │ │ │ │ │ -108 } │ │ │ │ │ -109 │ │ │ │ │ -_1_1_1 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ -112 { │ │ │ │ │ -113 return _p_r_e_B_a_s_i_s__.gridView(); │ │ │ │ │ +90 _s_u_b_P_r_e_B_a_s_i_s__.initializeIndices(); │ │ │ │ │ +91 } │ │ │ │ │ +92 │ │ │ │ │ +_9_4 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ +95 { │ │ │ │ │ +96 return _s_u_b_P_r_e_B_a_s_i_s__.gridView(); │ │ │ │ │ +97 } │ │ │ │ │ +98 │ │ │ │ │ +_1_0_0 void _u_p_d_a_t_e(const _G_r_i_d_V_i_e_w& gv) │ │ │ │ │ +101 { │ │ │ │ │ +102 _s_u_b_P_r_e_B_a_s_i_s__.update(gv); │ │ │ │ │ +103 } │ │ │ │ │ +104 │ │ │ │ │ +_1_0_8 _N_o_d_e _m_a_k_e_N_o_d_e() const │ │ │ │ │ +109 { │ │ │ │ │ +110 auto node = _N_o_d_e{_c_h_i_l_d_r_e_n__}; │ │ │ │ │ +111 for (std::size_t i=0; i<_c_h_i_l_d_r_e_n__; ++i) │ │ │ │ │ +112 node.setChild(i, _s_u_b_P_r_e_B_a_s_i_s__.makeNode()); │ │ │ │ │ +113 return node; │ │ │ │ │ 114 } │ │ │ │ │ 115 │ │ │ │ │ -_1_1_7 const _P_r_e_B_a_s_i_s& _p_r_e_B_a_s_i_s() const │ │ │ │ │ -118 { │ │ │ │ │ -119 return _p_r_e_B_a_s_i_s__; │ │ │ │ │ -120 } │ │ │ │ │ -121 │ │ │ │ │ -_1_2_3 _P_r_e_B_a_s_i_s& _p_r_e_B_a_s_i_s() │ │ │ │ │ -124 { │ │ │ │ │ -125 return _p_r_e_B_a_s_i_s__; │ │ │ │ │ -126 } │ │ │ │ │ -127 │ │ │ │ │ -_1_3_4 void _u_p_d_a_t_e(const _G_r_i_d_V_i_e_w & gv) │ │ │ │ │ -135 { │ │ │ │ │ -136 _p_r_e_B_a_s_i_s__.update(gv); │ │ │ │ │ -137 _p_r_e_B_a_s_i_s__.initializeIndices(); │ │ │ │ │ -138 } │ │ │ │ │ -139 │ │ │ │ │ -_1_4_1 _s_i_z_e___t_y_p_e _d_i_m_e_n_s_i_o_n() const │ │ │ │ │ -142 { │ │ │ │ │ -143 return _p_r_e_B_a_s_i_s__.dimension(); │ │ │ │ │ -144 } │ │ │ │ │ -145 │ │ │ │ │ -_1_4_7 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ -148 { │ │ │ │ │ -149 return _p_r_e_B_a_s_i_s__.size(); │ │ │ │ │ +_1_1_6 std::size_t _c_h_i_l_d_r_e_n() const │ │ │ │ │ +117 { │ │ │ │ │ +118 return _c_h_i_l_d_r_e_n__; │ │ │ │ │ +119 } │ │ │ │ │ +120 │ │ │ │ │ +_1_2_2 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ +123 { │ │ │ │ │ +124 return _s_i_z_e(Dune::ReservedVector{}); │ │ │ │ │ +125 } │ │ │ │ │ +126 │ │ │ │ │ +128 template │ │ │ │ │ +_1_2_9 _s_i_z_e___t_y_p_e _s_i_z_e(const SizePrefix& prefix) const │ │ │ │ │ +130 { │ │ │ │ │ +131 return _s_i_z_e_I_m_p_l(prefix, _c_h_i_l_d_r_e_n__, _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y{}); │ │ │ │ │ +132 } │ │ │ │ │ +133 │ │ │ │ │ +134protected: │ │ │ │ │ +135 │ │ │ │ │ +136 template │ │ │ │ │ +_1_3_7 _s_i_z_e___t_y_p_e _s_i_z_e_I_m_p_l(SizePrefix prefix, Children _c_h_i_l_d_r_e_n, _B_a_s_i_s_F_a_c_t_o_r_y_:_: │ │ │ │ │ +_F_l_a_t_I_n_t_e_r_l_e_a_v_e_d) const │ │ │ │ │ +138 { │ │ │ │ │ +139 // The root index size is the root index size of a single subnode │ │ │ │ │ +140 // multiplied by the number of subnodes, because we enumerate all │ │ │ │ │ +141 // child indices in a row. │ │ │ │ │ +142 if (prefix.size() == 0) │ │ │ │ │ +143 return _c_h_i_l_d_r_e_n*_s_u_b_P_r_e_B_a_s_i_s__.size(); │ │ │ │ │ +144 │ │ │ │ │ +145 // The FlatInterleaved index merging strategy only changes the first │ │ │ │ │ +146 // index digit. Hence, we have to reconstruct the corresponding digit │ │ │ │ │ +147 // for the subtree and can then return the corresponding size of the │ │ │ │ │ +subtree. │ │ │ │ │ +148 prefix[0] = prefix[0] / _c_h_i_l_d_r_e_n; │ │ │ │ │ +149 return _s_u_b_P_r_e_B_a_s_i_s__.size(prefix); │ │ │ │ │ 150 } │ │ │ │ │ 151 │ │ │ │ │ -_1_5_3 _s_i_z_e___t_y_p_e _s_i_z_e(const _S_i_z_e_P_r_e_f_i_x& prefix) const │ │ │ │ │ +152 template │ │ │ │ │ +_1_5_3 _s_i_z_e___t_y_p_e _s_i_z_e_I_m_p_l(SizePrefix prefix, Children _c_h_i_l_d_r_e_n, _B_a_s_i_s_F_a_c_t_o_r_y_:_: │ │ │ │ │ +_F_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c) const │ │ │ │ │ 154 { │ │ │ │ │ -155 return _p_r_e_B_a_s_i_s__.size(prefix); │ │ │ │ │ -156 } │ │ │ │ │ -157 │ │ │ │ │ -_1_5_9 _L_o_c_a_l_V_i_e_w _l_o_c_a_l_V_i_e_w() const │ │ │ │ │ -160 { │ │ │ │ │ -161 return _L_o_c_a_l_V_i_e_w(*this); │ │ │ │ │ -162 } │ │ │ │ │ -163 │ │ │ │ │ -_1_6_5 const _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s& _r_o_o_t_B_a_s_i_s() const │ │ │ │ │ -166 { │ │ │ │ │ -167 return *this; │ │ │ │ │ -168 } │ │ │ │ │ -169 │ │ │ │ │ -_1_7_1 const _P_r_e_f_i_x_P_a_t_h& _p_r_e_f_i_x_P_a_t_h() const │ │ │ │ │ -172 { │ │ │ │ │ -173 return _p_r_e_f_i_x_P_a_t_h__; │ │ │ │ │ -174 } │ │ │ │ │ -175 │ │ │ │ │ -176protected: │ │ │ │ │ -_1_7_7 _P_r_e_B_a_s_i_s _p_r_e_B_a_s_i_s__; │ │ │ │ │ -_1_7_8 _P_r_e_f_i_x_P_a_t_h _p_r_e_f_i_x_P_a_t_h__; │ │ │ │ │ -179}; │ │ │ │ │ -180 │ │ │ │ │ +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 _c_h_i_l_d_r_e_n*_s_u_b_P_r_e_B_a_s_i_s__.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. Then we can append │ │ │ │ │ +164 // the other prefix entries unmodified, because the index tree │ │ │ │ │ +165 // looks the same after the first level. │ │ │ │ │ +166 │ │ │ │ │ +167 // The FlatLexicographic index merging strategy only changes the first │ │ │ │ │ +168 // index digit. Hence, we have to reconstruct the corresponding digit │ │ │ │ │ +169 // for the subtree and can then return the corresponding size of the │ │ │ │ │ +subtree. │ │ │ │ │ +170 prefix[0] = prefix[0] % _s_u_b_P_r_e_B_a_s_i_s__.size(); │ │ │ │ │ +171 return _s_u_b_P_r_e_B_a_s_i_s__.size(prefix); │ │ │ │ │ +172 } │ │ │ │ │ +173 │ │ │ │ │ +174 template │ │ │ │ │ +_1_7_5 static void _m_u_l_t_i_I_n_d_e_x_P_o_p_F_r_o_n_t(MultiIndex& M) │ │ │ │ │ +176 { │ │ │ │ │ +177 for(std::size_t i=0; i │ │ │ │ │ -_1_8_4_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s(PreBasis&&) -> _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_<_s_t_d_:_: │ │ │ │ │ -_d_e_c_a_y___t_<_P_r_e_B_a_s_i_s_>>; │ │ │ │ │ -185 │ │ │ │ │ -186template │ │ │ │ │ -_1_8_7_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s(const GridView& gv, PreBasisFactory&& f) - │ │ │ │ │ -> _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s>; │ │ │ │ │ -188 │ │ │ │ │ -189 │ │ │ │ │ +182 template │ │ │ │ │ +_1_8_3 _s_i_z_e___t_y_p_e _s_i_z_e_I_m_p_l(SizePrefix prefix, Children _c_h_i_l_d_r_e_n, _B_a_s_i_s_F_a_c_t_o_r_y_:_: │ │ │ │ │ +_B_l_o_c_k_e_d_L_e_x_i_c_o_g_r_a_p_h_i_c) const │ │ │ │ │ +184 { │ │ │ │ │ +185 if (prefix.size() == 0) │ │ │ │ │ +186 return _c_h_i_l_d_r_e_n; │ │ │ │ │ +187 _m_u_l_t_i_I_n_d_e_x_P_o_p_F_r_o_n_t(prefix); │ │ │ │ │ +188 return _s_u_b_P_r_e_B_a_s_i_s__.size(prefix); │ │ │ │ │ +189 } │ │ │ │ │ 190 │ │ │ │ │ -191namespace BasisFactory { │ │ │ │ │ -192 │ │ │ │ │ -193template │ │ │ │ │ -_1_9_4auto _m_a_k_e_B_a_s_i_s(const GridView& gridView, PreBasisFactory&& preBasisFactory) │ │ │ │ │ -195{ │ │ │ │ │ -196 return _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s(preBasisFactory(gridView)); │ │ │ │ │ -197} │ │ │ │ │ -198 │ │ │ │ │ -199} // end namespace BasisFactory │ │ │ │ │ -200 │ │ │ │ │ -201// Backward compatibility │ │ │ │ │ -202namespace [[deprecated("Will be removed after Dune 2.10")]] BasisBuilder { │ │ │ │ │ -203 │ │ │ │ │ -204 using namespace BasisFactory; │ │ │ │ │ -205 │ │ │ │ │ -206} │ │ │ │ │ +191 template │ │ │ │ │ +_1_9_2 _s_i_z_e___t_y_p_e _s_i_z_e_I_m_p_l(SizePrefix prefix, Children _c_h_i_l_d_r_e_n, _B_a_s_i_s_F_a_c_t_o_r_y_:_: │ │ │ │ │ +_B_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d) const │ │ │ │ │ +193 { │ │ │ │ │ +194 if (prefix.size() == 0) │ │ │ │ │ +195 return _s_u_b_P_r_e_B_a_s_i_s__.size(); │ │ │ │ │ +196 │ │ │ │ │ +197 // Remember last index, remove it and check if the remaining │ │ │ │ │ +198 // prefix refers to a leaf in the subPreBasis index tree. │ │ │ │ │ +199 // If yes, then the full prefix must also refer to a │ │ │ │ │ +200 // leaf in the merged index tree. If not, then restore the full │ │ │ │ │ +201 // prefix and proceed. │ │ │ │ │ +202 auto tail = prefix.back(); │ │ │ │ │ +203 prefix.pop_back(); │ │ │ │ │ +204 if (_s_u_b_P_r_e_B_a_s_i_s__.size(prefix) == 0) │ │ │ │ │ +205 return 0; │ │ │ │ │ +206 prefix.push_back(tail); │ │ │ │ │ 207 │ │ │ │ │ -208 │ │ │ │ │ -209} // end namespace Functions │ │ │ │ │ -210} // end namespace Dune │ │ │ │ │ -211 │ │ │ │ │ -212 │ │ │ │ │ -213 │ │ │ │ │ -214#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH │ │ │ │ │ +208 // Now check if the full prefix refers to a leaf in the subPreBasis │ │ │ │ │ +209 // index tree. │ │ │ │ │ +210 // If yes, then it has exactly 'children' appended children in the subtree. │ │ │ │ │ +211 // If not, then the index tree looks the same in the merged subtree and we │ │ │ │ │ +212 // can forward the result. │ │ │ │ │ +213 auto subSize = _s_u_b_P_r_e_B_a_s_i_s__.size(prefix); │ │ │ │ │ +214 if (subSize == 0) │ │ │ │ │ +215 return _c_h_i_l_d_r_e_n; │ │ │ │ │ +216 return subSize; │ │ │ │ │ +217 } │ │ │ │ │ +218 │ │ │ │ │ +219public: │ │ │ │ │ +220 │ │ │ │ │ +_2_2_2 _s_i_z_e___t_y_p_e _d_i_m_e_n_s_i_o_n() const │ │ │ │ │ +223 { │ │ │ │ │ +224 return _s_u_b_P_r_e_B_a_s_i_s__.dimension() * _c_h_i_l_d_r_e_n__; │ │ │ │ │ +225 } │ │ │ │ │ +226 │ │ │ │ │ +_2_2_8 _s_i_z_e___t_y_p_e _m_a_x_N_o_d_e_S_i_z_e() const │ │ │ │ │ +229 { │ │ │ │ │ +230 return _s_u_b_P_r_e_B_a_s_i_s__.maxNodeSize() * _c_h_i_l_d_r_e_n__; │ │ │ │ │ +231 } │ │ │ │ │ +232 │ │ │ │ │ +_2_3_4 const _S_u_b_P_r_e_B_a_s_i_s& _s_u_b_P_r_e_B_a_s_i_s() const │ │ │ │ │ +235 { │ │ │ │ │ +236 return _s_u_b_P_r_e_B_a_s_i_s__; │ │ │ │ │ +237 } │ │ │ │ │ +238 │ │ │ │ │ +_2_4_0 _S_u_b_P_r_e_B_a_s_i_s& _s_u_b_P_r_e_B_a_s_i_s() │ │ │ │ │ +241 { │ │ │ │ │ +242 return _s_u_b_P_r_e_B_a_s_i_s__; │ │ │ │ │ +243 } │ │ │ │ │ +244 │ │ │ │ │ +246 template = 0> │ │ │ │ │ +_2_4_8 It _i_n_d_i_c_e_s(const NodeType& node, It it) const │ │ │ │ │ +249 { │ │ │ │ │ +250 return _i_n_d_i_c_e_s_I_m_p_l(node, it, _c_h_i_l_d_r_e_n__, _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y{}); │ │ │ │ │ +251 } │ │ │ │ │ +252 │ │ │ │ │ +_2_5_4 auto _c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r() const │ │ │ │ │ +255 { │ │ │ │ │ +256 return _c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_I_m_p_l(_c_h_i_l_d_r_e_n__); │ │ │ │ │ +257 } │ │ │ │ │ +258 │ │ │ │ │ +259protected: │ │ │ │ │ +260 │ │ │ │ │ +261 template │ │ │ │ │ +_2_6_2 It _i_n_d_i_c_e_s_I_m_p_l(const NodeType& node, It multiIndices, Children _c_h_i_l_d_r_e_n, │ │ │ │ │ +_B_a_s_i_s_F_a_c_t_o_r_y_:_:_F_l_a_t_I_n_t_e_r_l_e_a_v_e_d) const │ │ │ │ │ +263 { │ │ │ │ │ +264 using namespace Dune::Indices; │ │ │ │ │ +265 _s_i_z_e___t_y_p_e subTreeSize = node.child(_0).size(); │ │ │ │ │ +266 // Fill indices for first child at the beginning. │ │ │ │ │ +267 auto next = _s_u_b_P_r_e_B_a_s_i_s().indices(node.child(_0), multiIndices); │ │ │ │ │ +268 // Multiply first component of all indices for first child by │ │ │ │ │ +269 // number of children to stretch the index range for interleaving. │ │ │ │ │ +270 for (std::size_t i = 0; i │ │ │ │ │ +_2_8_9 It _i_n_d_i_c_e_s_I_m_p_l(const NodeType& node, It multiIndices, Children _c_h_i_l_d_r_e_n, │ │ │ │ │ +_B_a_s_i_s_F_a_c_t_o_r_y_:_:_F_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c) const │ │ │ │ │ +290 { │ │ │ │ │ +291 using namespace Dune::Indices; │ │ │ │ │ +292 _s_i_z_e___t_y_p_e subTreeSize = node.child(_0).size(); │ │ │ │ │ +293 _s_i_z_e___t_y_p_e firstIndexEntrySize = _s_u_b_P_r_e_B_a_s_i_s().size(); │ │ │ │ │ +294 // Fill indices for first child at the beginning. │ │ │ │ │ +295 auto next = _s_u_b_P_r_e_B_a_s_i_s().indices(node.child(_0), multiIndices); │ │ │ │ │ +296 for (std::size_t child = 1; child<_c_h_i_l_d_r_e_n__; ++child) │ │ │ │ │ +297 { │ │ │ │ │ +298 for (std::size_t i = 0; i │ │ │ │ │ +_3_1_3 static void _m_u_l_t_i_I_n_d_e_x_P_u_s_h_F_r_o_n_t(MultiIndex& M, _s_i_z_e___t_y_p_e M0) │ │ │ │ │ +314 { │ │ │ │ │ +315 M.resize(M.size()+1); │ │ │ │ │ +316 for(std::size_t i=M.size()-1; i>0; --i) │ │ │ │ │ +317 M[i] = M[i-1]; │ │ │ │ │ +318 M[0] = M0; │ │ │ │ │ +319 } │ │ │ │ │ +320 │ │ │ │ │ +321 template │ │ │ │ │ +_3_2_2 It _i_n_d_i_c_e_s_I_m_p_l(const NodeType& node, It multiIndices, Children _c_h_i_l_d_r_e_n, │ │ │ │ │ +_B_a_s_i_s_F_a_c_t_o_r_y_:_:_B_l_o_c_k_e_d_L_e_x_i_c_o_g_r_a_p_h_i_c) const │ │ │ │ │ +323 { │ │ │ │ │ +324 using namespace Dune::Indices; │ │ │ │ │ +325 _s_i_z_e___t_y_p_e subTreeSize = node.child(_0).size(); │ │ │ │ │ +326 // Fill indices for first child at the beginning. │ │ │ │ │ +327 auto next = _s_u_b_P_r_e_B_a_s_i_s().indices(node.child(_0), multiIndices); │ │ │ │ │ +328 // Insert 0 before first component of all indices for first child. │ │ │ │ │ +329 for (std::size_t i = 0; i │ │ │ │ │ +_3_4_8 It _i_n_d_i_c_e_s_I_m_p_l(const NodeType& node, It multiIndices, Children _c_h_i_l_d_r_e_n, │ │ │ │ │ +_B_a_s_i_s_F_a_c_t_o_r_y_:_:_B_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d) const │ │ │ │ │ +349 { │ │ │ │ │ +350 using namespace Dune::Indices; │ │ │ │ │ +351 _s_i_z_e___t_y_p_e subTreeSize = node.child(_0).size(); │ │ │ │ │ +352 // Fill indices for first child at the beginning. │ │ │ │ │ +353 auto next = _s_u_b_P_r_e_B_a_s_i_s().indices(node.child(_0), multiIndices); │ │ │ │ │ +354 // Append 0 after last component of all indices for first child. │ │ │ │ │ +355 for (std::size_t i = 0; i │ │ │ │ │ +_3_7_2 auto _c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_I_m_p_l(Children _c_h_i_l_d_r_e_n) const │ │ │ │ │ +373 { │ │ │ │ │ +374 auto subTree = _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r(_s_u_b_P_r_e_B_a_s_i_s__); │ │ │ │ │ +375 if constexpr(std::is_same_v) │ │ │ │ │ +376 return _C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_k_n_o_w_n{}; // Not yet implemented │ │ │ │ │ +377 else if constexpr(std::is_same_v) │ │ │ │ │ +378 return _C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_k_n_o_w_n{}; // Not yet implemented │ │ │ │ │ +379 else if constexpr(std::is_same_v) │ │ │ │ │ +380 return _C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_m_a_k_e_U_n_i_f_o_r_m_D_e_s_c_r_i_p_t_o_r(_c_h_i_l_d_r_e_n,std::move │ │ │ │ │ +(subTree)); │ │ │ │ │ +381 else if constexpr(std::is_same_v) │ │ │ │ │ +382 return ContainerDescriptors::Impl::appendToTree(_c_h_i_l_d_r_e_n,std::move │ │ │ │ │ +(subTree)); │ │ │ │ │ +383 else │ │ │ │ │ +384 return _C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_k_n_o_w_n{}; │ │ │ │ │ +385 } │ │ │ │ │ +386 │ │ │ │ │ +387protected: │ │ │ │ │ +_3_8_8 std::size_t _c_h_i_l_d_r_e_n__; │ │ │ │ │ +_3_8_9 _S_u_b_P_r_e_B_a_s_i_s _s_u_b_P_r_e_B_a_s_i_s__; │ │ │ │ │ +390}; │ │ │ │ │ +391 │ │ │ │ │ +392 │ │ │ │ │ +393 │ │ │ │ │ +394namespace BasisFactory { │ │ │ │ │ +395 │ │ │ │ │ +408template │ │ │ │ │ +_4_0_9auto _p_o_w_e_r(ChildPreBasisFactory&& childPreBasisFactory, std::size_t k, const │ │ │ │ │ +_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y&) │ │ │ │ │ +410{ │ │ │ │ │ +411 return [childPreBasisFactory,k](const auto& gridView) { │ │ │ │ │ +412 auto childPreBasis = childPreBasisFactory(gridView); │ │ │ │ │ +413 return _D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_<_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y_,_ _d_e_c_l_t_y_p_e_(_c_h_i_l_d_P_r_e_B_a_s_i_s_)_> │ │ │ │ │ +(k,std::move(childPreBasis)); │ │ │ │ │ +414 }; │ │ │ │ │ +415} │ │ │ │ │ +416 │ │ │ │ │ +427template │ │ │ │ │ +_4_2_8auto _p_o_w_e_r(ChildPreBasisFactory&& childPreBasisFactory, std::size_t k) │ │ │ │ │ +429{ │ │ │ │ │ +430 return [childPreBasisFactory,k](const auto& gridView) { │ │ │ │ │ +431 auto childPreBasis = childPreBasisFactory(gridView); │ │ │ │ │ +432 return _D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_<_B_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d_,_ _d_e_c_l_t_y_p_e_(_c_h_i_l_d_P_r_e_B_a_s_i_s_)_> │ │ │ │ │ +(k,std::move(childPreBasis)); │ │ │ │ │ +433 }; │ │ │ │ │ +434} │ │ │ │ │ +435 │ │ │ │ │ +436} // end namespace BasisFactory │ │ │ │ │ +437 │ │ │ │ │ +438} // end namespace Functions │ │ │ │ │ +439} // end namespace Dune │ │ │ │ │ +440 │ │ │ │ │ +441 │ │ │ │ │ +442#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DYNAMICPOWERBASIS_HH │ │ │ │ │ +_u_t_i_l_i_t_y_._h_h │ │ │ │ │ _t_y_p_e___t_r_a_i_t_s_._h_h │ │ │ │ │ -_d_e_f_a_u_l_t_l_o_c_a_l_v_i_e_w_._h_h │ │ │ │ │ +_b_a_s_i_s_t_a_g_s_._h_h │ │ │ │ │ +_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h │ │ │ │ │ +_n_o_d_e_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_p_o_w_e_r │ │ │ │ │ +auto power(ChildPreBasisFactory &&childPreBasisFactory, std::size_t k, const │ │ │ │ │ +IndexMergingStrategy &) │ │ │ │ │ +Create a pre-basis factory that can build a PowerPreBasis. │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:409 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_e_n_a_b_l_e_I_f_C_o_n_s_t_r_u_c_t_i_b_l_e │ │ │ │ │ std::enable_if_t< std::is_constructible_v< T, Args... >, int > │ │ │ │ │ enableIfConstructible │ │ │ │ │ Helper to constrain forwarding constructors. │ │ │ │ │ DDeeffiinniittiioonn type_traits.hh:31 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_m_a_k_e_B_a_s_i_s │ │ │ │ │ -auto makeBasis(const GridView &gridView, PreBasisFactory &&preBasisFactory) │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:194 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ -Global basis for given pre-basis. │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:50 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_S_i_z_e_P_r_e_f_i_x │ │ │ │ │ -Dune::ReservedVector< std::size_t, PreBasis::multiIndexBufferSize > SizePrefix │ │ │ │ │ -Type used for prefixes handed to the size() method. │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +auto containerDescriptor(const PreBasis &preBasis) │ │ │ │ │ +Return the container descriptor of the pre-basis, if defined, otherwise │ │ │ │ │ +ContainerDescriptor::Unknown. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_m_a_k_e_U_n_i_f_o_r_m_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +auto makeUniformDescriptor(std::integral_constant< std::size_t, n >, Child │ │ │ │ │ +child) │ │ │ │ │ +Generate a uniform descriptor in case the size is a static constant. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:159 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ +Base class for index merging strategies to simplify detection. │ │ │ │ │ +DDeeffiinniittiioonn basistags.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_F_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c │ │ │ │ │ +Lexicographic merging of direct children without blocking. │ │ │ │ │ +DDeeffiinniittiioonn basistags.hh:84 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_F_l_a_t_I_n_t_e_r_l_e_a_v_e_d │ │ │ │ │ +Interleaved merging of direct children without blocking. │ │ │ │ │ +DDeeffiinniittiioonn basistags.hh:118 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_B_l_o_c_k_e_d_L_e_x_i_c_o_g_r_a_p_h_i_c │ │ │ │ │ +Lexicographic merging of direct children with blocking (i.e. creating one block │ │ │ │ │ +per direct child). │ │ │ │ │ +DDeeffiinniittiioonn basistags.hh:152 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_B_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d │ │ │ │ │ +Interleaved merging of direct children with blocking (i.e. creating blocks at │ │ │ │ │ +the leaves containing o... │ │ │ │ │ +DDeeffiinniittiioonn basistags.hh:184 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_k_n_o_w_n │ │ │ │ │ +Fallback container descriptor if nothing else fits. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:50 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s │ │ │ │ │ +A pre-basis for dynamic power bases. │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ std::size_t size_type │ │ │ │ │ Type used for indices and size information. │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:64 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ -typename PreBasis::GridView GridView │ │ │ │ │ -The grid view that the FE space is defined on. │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ -const GridView & gridView() const │ │ │ │ │ -Obtain the grid view that the basis is defined on. │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:111 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_P_r_e_B_a_s_i_s │ │ │ │ │ -PB PreBasis │ │ │ │ │ -Pre-basis providing the implementation details. │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:55 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_p_r_e_B_a_s_i_s │ │ │ │ │ -PreBasis & preBasis() │ │ │ │ │ -Obtain the pre-basis providing the implementation details. │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:123 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_u_p_d_a_t_e │ │ │ │ │ -void update(const GridView &gv) │ │ │ │ │ -Update the stored grid view. │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:134 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_L_o_c_a_l_V_i_e_w │ │ │ │ │ -DefaultLocalView< DefaultGlobalBasis< PreBasis > > LocalView │ │ │ │ │ -Type of the local view on the restriction of the basis to a single element. │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:67 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_M_u_l_t_i_I_n_d_e_x │ │ │ │ │ -typename LocalView::MultiIndex MultiIndex │ │ │ │ │ -Type used for global numbering of the basis vectors. │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:70 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ -size_type size(const SizePrefix &prefix) const │ │ │ │ │ -Return number of possible values for next position in multi index. │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:153 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:60 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ +IMS IndexMergingStrategy │ │ │ │ │ +Strategy used to merge the global indices of the child factories. │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:63 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s │ │ │ │ │ +DynamicPowerPreBasis(std::size_t c, SFArgs &&... sfArgs) │ │ │ │ │ +Constructor for given child pre-basis objects. │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:80 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_m_u_l_t_i_I_n_d_e_x_P_o_p_F_r_o_n_t │ │ │ │ │ +static void multiIndexPopFront(MultiIndex &M) │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:175 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ size_type dimension() const │ │ │ │ │ Get the total dimension of the space spanned by this basis. │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:141 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_p_r_e_B_a_s_i_s__ │ │ │ │ │ -PreBasis preBasis_ │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:177 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_l_o_c_a_l_V_i_e_w │ │ │ │ │ -LocalView localView() const │ │ │ │ │ -Return local view for basis. │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:159 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_P_r_e_f_i_x_P_a_t_h │ │ │ │ │ -TypeTree::HybridTreePath<> PrefixPath │ │ │ │ │ -The empty prefix path that identifies the root in the local ansatz tree. │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:58 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ -DefaultGlobalBasis(T &&... t) │ │ │ │ │ -Constructor. │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:86 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ -DefaultGlobalBasis(const GridView &gridView, PreBasisFactory &&factory) │ │ │ │ │ -Constructor from a PreBasis factory. │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:102 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:222 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_I_m_p_l │ │ │ │ │ +auto containerDescriptorImpl(Children children) const │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:372 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s │ │ │ │ │ +It indices(const NodeType &node, It it) const │ │ │ │ │ +Maps from subtree index set [0..size-1] to a globally unique multi index in │ │ │ │ │ +global basis. │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:248 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s │ │ │ │ │ +void initializeIndices() │ │ │ │ │ +Initialize the global indices. │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:88 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_i_z_e_I_m_p_l │ │ │ │ │ +size_type sizeImpl(SizePrefix prefix, Children children, BasisFactory:: │ │ │ │ │ +FlatInterleaved) const │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:137 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e │ │ │ │ │ +static constexpr size_type maxMultiIndexSize │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:68 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_u_p_d_a_t_e │ │ │ │ │ +void update(const GridView &gv) │ │ │ │ │ +Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:100 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +auto containerDescriptor() const │ │ │ │ │ +Return the associated container descriptor. │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:254 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ size_type size() const │ │ │ │ │ -Return number of possible values for next position in empty multi index. │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:147 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_p_r_e_B_a_s_i_s │ │ │ │ │ -const PreBasis & preBasis() const │ │ │ │ │ -Obtain the pre-basis providing the implementation details. │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:117 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_p_r_e_f_i_x_P_a_t_h__ │ │ │ │ │ -PrefixPath prefixPath_ │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:178 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_r_o_o_t_B_a_s_i_s │ │ │ │ │ -const DefaultGlobalBasis & rootBasis() const │ │ │ │ │ -Return *this because we are not embedded in a larger basis. │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:165 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_p_r_e_f_i_x_P_a_t_h │ │ │ │ │ -const PrefixPath & prefixPath() const │ │ │ │ │ -Return empty path, because this is the root in the local ansatz tree. │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:171 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w │ │ │ │ │ -The restriction of a finite element basis to a single element. │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:32 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_M_u_l_t_i_I_n_d_e_x │ │ │ │ │ -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. │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:68 │ │ │ │ │ +Same as size(prefix) with empty prefix. │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:122 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s_I_m_p_l │ │ │ │ │ +It indicesImpl(const NodeType &node, It multiIndices, Children children, │ │ │ │ │ +BasisFactory::BlockedInterleaved) const │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:348 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_u_b_P_r_e_B_a_s_i_s │ │ │ │ │ +SubPreBasis & subPreBasis() │ │ │ │ │ +Mutable access to the stored prebasis of the factor in the power space. │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:240 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_i_z_e_I_m_p_l │ │ │ │ │ +size_type sizeImpl(SizePrefix prefix, Children children, BasisFactory:: │ │ │ │ │ +FlatLexicographic) const │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:153 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_m_u_l_t_i_I_n_d_e_x_P_u_s_h_F_r_o_n_t │ │ │ │ │ +static void multiIndexPushFront(MultiIndex &M, size_type M0) │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:313 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_u_b_P_r_e_B_a_s_i_s__ │ │ │ │ │ +SubPreBasis subPreBasis_ │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:389 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_i_z_e_I_m_p_l │ │ │ │ │ +size_type sizeImpl(SizePrefix prefix, Children children, BasisFactory:: │ │ │ │ │ +BlockedLexicographic) const │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:183 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_i_z_e_I_m_p_l │ │ │ │ │ +size_type sizeImpl(SizePrefix prefix, Children children, BasisFactory:: │ │ │ │ │ +BlockedInterleaved) const │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:192 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s_I_m_p_l │ │ │ │ │ +It indicesImpl(const NodeType &node, It multiIndices, Children children, │ │ │ │ │ +BasisFactory::BlockedLexicographic) const │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:322 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_m_u_l_t_i_I_n_d_e_x_B_u_f_f_e_r_S_i_z_e │ │ │ │ │ +static constexpr size_type multiIndexBufferSize │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:70 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_S_u_b_P_r_e_B_a_s_i_s │ │ │ │ │ +SPB SubPreBasis │ │ │ │ │ +The child pre-basis. │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:54 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ +Node makeNode() const │ │ │ │ │ +Create tree node. │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:108 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_u_b_P_r_e_B_a_s_i_s │ │ │ │ │ +const SubPreBasis & subPreBasis() const │ │ │ │ │ +Const access to the stored prebasis of the factor in the power space. │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:234 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s_I_m_p_l │ │ │ │ │ +It indicesImpl(const NodeType &node, It multiIndices, Children children, │ │ │ │ │ +BasisFactory::FlatInterleaved) const │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:262 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_c_h_i_l_d_r_e_n │ │ │ │ │ +std::size_t children() const │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:116 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_m_a_x_N_o_d_e_S_i_z_e │ │ │ │ │ +size_type maxNodeSize() const │ │ │ │ │ +Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:228 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s_I_m_p_l │ │ │ │ │ +It indicesImpl(const NodeType &node, It multiIndices, Children children, │ │ │ │ │ +BasisFactory::FlatLexicographic) const │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:289 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ +size_type size(const SizePrefix &prefix) const │ │ │ │ │ +Return number of possible values for next position in multi index. │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:129 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ +typename SPB::GridView GridView │ │ │ │ │ +The grid view that the FE basis is defined on. │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:57 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_c_h_i_l_d_r_e_n__ │ │ │ │ │ +std::size_t children_ │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:388 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ +const GridView & gridView() const │ │ │ │ │ +Obtain the grid view that the basis is defined on. │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:94 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_P_r_e_B_a_s_i_s_:_:_m_i_n_M_u_l_t_i_I_n_d_e_x_S_i_z_e │ │ │ │ │ +static constexpr size_type minMultiIndexSize │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:69 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:224 │ │ │ │ │ _c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00113.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: flatmultiindex.hh File Reference │ │ │ │ +dune-functions: lagrangebasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,37 +70,66 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces | │ │ │ │ -Typedefs
│ │ │ │ -
flatmultiindex.hh File Reference
│ │ │ │ +Typedefs | │ │ │ │ +Functions
│ │ │ │ +
lagrangebasis.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <array>
│ │ │ │ -#include <dune/functions/common/multiindex.hh>
│ │ │ │ +
#include <type_traits>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/localfunctions/lagrange.hh>
│ │ │ │ +#include <dune/localfunctions/lagrange/equidistantpoints.hh>
│ │ │ │ +#include <dune/localfunctions/lagrange/lagrangelfecache.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/leafprebasismixin.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 >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │

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

│ │ │ │ +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.
 
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.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,24 +1,49 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s │ │ │ │ │ -flatmultiindex.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_m_u_l_t_i_i_n_d_e_x_._h_h> │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +lagrangebasis.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_<_ _G_V_,_ _k_,_ _R_ _> │ │ │ │ │ +  A pre-basis for a PQ-lagrange bases with given order. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_<_ _G_V_,_ _k_,_ _R_ _> │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ +namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y │ │ │ │ │ +  │ │ │ │ │ TTyyppeeddeeffss │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_l_a_t_M_u_l_t_i_I_n_d_e_x = _S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x< size_type, 1 > │ │ │ │ │ -  A multi-index class with only one level. │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s< _L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s< │ │ │ │ │ + GV, k, R > > │ │ │ │ │ +  Nodal basis of a scalar k-th-order Lagrangean finite element space. │ │ │ │ │ +  │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_l_a_g_r_a_n_g_e () │ │ │ │ │ +  Create a pre-basis factory that can create a Lagrange pre-basis. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_l_a_g_r_a_n_g_e (int order) │ │ │ │ │ +  Create a pre-basis factory that can create a Lagrange pre-basis with a │ │ │ │ │ + run-time order. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00113_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: flatmultiindex.hh Source File │ │ │ │ +dune-functions: lagrangebasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,48 +74,590 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
flatmultiindex.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATMULTIINDEX_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATMULTIINDEX_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH
│ │ │ │
9
│ │ │ │ -
10#include <array>
│ │ │ │ -
11
│ │ │ │ - │ │ │ │ -
13
│ │ │ │ -
14namespace Dune {
│ │ │ │ -
15namespace Functions {
│ │ │ │ +
10#include <type_traits>
│ │ │ │ +
11#include <dune/common/exceptions.hh>
│ │ │ │ +
12
│ │ │ │ +
13#include <dune/localfunctions/lagrange.hh>
│ │ │ │ +
14#include <dune/localfunctions/lagrange/equidistantpoints.hh>
│ │ │ │ +
15#include <dune/localfunctions/lagrange/lagrangelfecache.hh>
│ │ │ │
16
│ │ │ │ -
17
│ │ │ │ -
18
│ │ │ │ -
34template<class size_type>
│ │ │ │ - │ │ │ │ -
36
│ │ │ │ -
37
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
20
│ │ │ │ +
21
│ │ │ │ +
22namespace Dune {
│ │ │ │ +
23namespace Functions {
│ │ │ │ +
24
│ │ │ │ +
25// *****************************************************************************
│ │ │ │ +
26// This is the reusable part of the LagrangeBasis. It contains
│ │ │ │ +
27//
│ │ │ │ +
28// LagrangePreBasis
│ │ │ │ +
29// LagrangeNode
│ │ │ │ +
30//
│ │ │ │ +
31// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ +
32// state. These components do _not_ depend on the global basis and local view
│ │ │ │ +
33// and can be used without a global basis.
│ │ │ │ +
34// *****************************************************************************
│ │ │ │ +
35
│ │ │ │ +
36template<typename GV, int k, typename R=double>
│ │ │ │ +
37class LagrangeNode;
│ │ │ │
38
│ │ │ │ -
39} // end namespace Functions
│ │ │ │ -
40} // end namespace Dune
│ │ │ │ +
39template<typename GV, int k, typename R=double>
│ │ │ │ +
40class LagrangePreBasis;
│ │ │ │
41
│ │ │ │ -
42#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATMULTIINDEX_HH
│ │ │ │ - │ │ │ │ +
42
│ │ │ │ +
43
│ │ │ │ +
58template<typename GV, int k, typename R>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
60 public LeafPreBasisMixin< LagrangePreBasis<GV,k,R> >
│ │ │ │ +
61{
│ │ │ │ +
62 static const int dim = GV::dimension;
│ │ │ │ +
63 static const bool useDynamicOrder = (k<0);
│ │ │ │ +
64
│ │ │ │ +
65public:
│ │ │ │ +
66
│ │ │ │ +
68 using GridView = GV;
│ │ │ │ +
69
│ │ │ │ +
71 using size_type = std::size_t;
│ │ │ │ +
72
│ │ │ │ + │ │ │ │ +
75
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
78 : LagrangePreBasis(gv, std::numeric_limits<unsigned int>::max())
│ │ │ │ +
79 {}
│ │ │ │ +
│ │ │ │ +
80
│ │ │ │ +
│ │ │ │ +
82 LagrangePreBasis(const GridView& gv, unsigned int order) :
│ │ │ │ + │ │ │ │ +
84 {
│ │ │ │ +
85 if (!useDynamicOrder && order!=std::numeric_limits<unsigned int>::max())
│ │ │ │ +
86 DUNE_THROW(RangeError, "Template argument k has to be -1 when supplying a run-time order!");
│ │ │ │ +
87
│ │ │ │ +
88 for (int i=0; i<=dim; i++)
│ │ │ │ +
89 {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
92 }
│ │ │ │ + │ │ │ │ + │ │ │ │ +
95 }
│ │ │ │ +
│ │ │ │ +
96
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
99 {
│ │ │ │ +
100 vertexOffset_ = 0;
│ │ │ │ + │ │ │ │ +
102
│ │ │ │ +
103 if (dim>=2)
│ │ │ │ +
104 {
│ │ │ │ + │ │ │ │ +
106
│ │ │ │ +
107 quadrilateralOffset_ = triangleOffset_ + dofsPerSimplex(2) * ((size_type)gridView_.size(Dune::GeometryTypes::triangle));
│ │ │ │ +
108 }
│ │ │ │ +
109
│ │ │ │ +
110 if (dim==3) {
│ │ │ │ +
111 tetrahedronOffset_ = quadrilateralOffset_ + dofsPerCube(2) * ((size_type)gridView_.size(Dune::GeometryTypes::quadrilateral));
│ │ │ │ +
112
│ │ │ │ +
113 prismOffset_ = tetrahedronOffset_ + dofsPerSimplex(3) * ((size_type)gridView_.size(Dune::GeometryTypes::tetrahedron));
│ │ │ │ +
114
│ │ │ │ +
115 hexahedronOffset_ = prismOffset_ + dofsPerPrism() * ((size_type)gridView_.size(Dune::GeometryTypes::prism));
│ │ │ │ +
116
│ │ │ │ +
117 pyramidOffset_ = hexahedronOffset_ + dofsPerCube(3) * ((size_type)gridView_.size(Dune::GeometryTypes::hexahedron));
│ │ │ │ +
118 }
│ │ │ │ +
119 }
│ │ │ │ +
│ │ │ │ +
120
│ │ │ │ +
│ │ │ │ +
122 const GridView& gridView() const
│ │ │ │ +
123 {
│ │ │ │ +
124 return gridView_;
│ │ │ │ +
125 }
│ │ │ │ +
│ │ │ │ +
126
│ │ │ │ +
│ │ │ │ +
128 void update (const GridView& gv)
│ │ │ │ +
129 {
│ │ │ │ +
130 gridView_ = gv;
│ │ │ │ +
131 }
│ │ │ │ +
│ │ │ │ +
132
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
137 {
│ │ │ │ +
138 return Node{order_};
│ │ │ │ +
139 }
│ │ │ │ +
│ │ │ │ +
140
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
143 {
│ │ │ │ +
144 switch (dim)
│ │ │ │ +
145 {
│ │ │ │ +
146 case 1:
│ │ │ │ +
147 return dofsPerCube(0) * ((size_type)gridView_.size(dim))
│ │ │ │ +
148 + dofsPerCube(1) * ((size_type)gridView_.size(dim-1));
│ │ │ │ +
149 case 2:
│ │ │ │ +
150 {
│ │ │ │ +
151 return dofsPerCube(0) * ((size_type)gridView_.size(dim))
│ │ │ │ +
152 + dofsPerCube(1) * ((size_type)gridView_.size(dim-1))
│ │ │ │ +
153 + dofsPerSimplex(2) * ((size_type)gridView_.size(Dune::GeometryTypes::triangle))
│ │ │ │ +
154 + dofsPerCube(2) * ((size_type)gridView_.size(Dune::GeometryTypes::quadrilateral));
│ │ │ │ +
155 }
│ │ │ │ +
156 case 3:
│ │ │ │ +
157 {
│ │ │ │ +
158 return dofsPerCube(0) * ((size_type)gridView_.size(dim))
│ │ │ │ +
159 + dofsPerCube(1) * ((size_type)gridView_.size(dim-1))
│ │ │ │ +
160 + dofsPerSimplex(2) * ((size_type)gridView_.size(Dune::GeometryTypes::triangle))
│ │ │ │ +
161 + dofsPerCube(2) * ((size_type)gridView_.size(Dune::GeometryTypes::quadrilateral))
│ │ │ │ +
162 + dofsPerSimplex(3) * ((size_type)gridView_.size(Dune::GeometryTypes::tetrahedron))
│ │ │ │ +
163 + dofsPerPyramid() * ((size_type)gridView_.size(Dune::GeometryTypes::pyramid))
│ │ │ │ +
164 + dofsPerPrism() * ((size_type)gridView_.size(Dune::GeometryTypes::prism))
│ │ │ │ +
165 + dofsPerCube(3) * ((size_type)gridView_.size(Dune::GeometryTypes::hexahedron));
│ │ │ │ +
166 }
│ │ │ │ +
167 }
│ │ │ │ +
168 DUNE_THROW(Dune::NotImplemented, "No size method for " << dim << "d grids available yet!");
│ │ │ │ +
169 }
│ │ │ │ +
│ │ │ │ +
170
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
173 {
│ │ │ │ +
174 // That cast to unsigned int is necessary because GV::dimension is an enum,
│ │ │ │ +
175 // which is not recognized by the power method as an integer type...
│ │ │ │ +
176 return power(order()+1, (unsigned int)GV::dimension);
│ │ │ │ +
177 }
│ │ │ │ +
│ │ │ │ +
178
│ │ │ │ +
179 template<typename It>
│ │ │ │ +
│ │ │ │ +
180 It indices(const Node& node, It it) const
│ │ │ │ +
181 {
│ │ │ │ +
182 for (size_type i = 0, end = node.finiteElement().size() ; i < end ; ++it, ++i)
│ │ │ │ +
183 {
│ │ │ │ +
184 Dune::LocalKey localKey = node.finiteElement().localCoefficients().localKey(i);
│ │ │ │ +
185 const auto& gridIndexSet = gridView().indexSet();
│ │ │ │ +
186 const auto& element = node.element();
│ │ │ │ +
187
│ │ │ │ +
188 // The dimension of the entity that the current dof is related to
│ │ │ │ +
189 auto dofDim = dim - localKey.codim();
│ │ │ │ +
190
│ │ │ │ +
191 // Test for a vertex dof
│ │ │ │ +
192 // The test for k==1 is redundant, but having it here allows the compiler to conclude
│ │ │ │ +
193 // at compile-time that the dofDim==0 case is the only one that will ever happen.
│ │ │ │ +
194 // This leads to measurable speed-up: see
│ │ │ │ +
195 // https://gitlab.dune-project.org/staging/dune-functions/issues/30
│ │ │ │ +
196 if (k==1 || dofDim==0) {
│ │ │ │ +
197 *it = {{ (size_type)(gridIndexSet.subIndex(element,localKey.subEntity(),dim)) }};
│ │ │ │ +
198 continue;
│ │ │ │ +
199 }
│ │ │ │ +
200
│ │ │ │ +
201 if (dofDim==1)
│ │ │ │ +
202 { // edge dof
│ │ │ │ +
203 if (dim==1) // element dof -- any local numbering is fine
│ │ │ │ +
204 {
│ │ │ │ +
205 *it = {{ edgeOffset_
│ │ │ │ +
206 + dofsPerCube(1) * ((size_type)gridIndexSet.subIndex(element,0,0))
│ │ │ │ +
207 + localKey.index() }};
│ │ │ │ +
208 continue;
│ │ │ │ +
209 }
│ │ │ │ +
210 else
│ │ │ │ +
211 {
│ │ │ │ +
212 const auto refElement
│ │ │ │ +
213 = Dune::referenceElement<double,dim>(element.type());
│ │ │ │ +
214
│ │ │ │ +
215 // We have to reverse the numbering if the local element edge is
│ │ │ │ +
216 // not aligned with the global edge.
│ │ │ │ +
217 auto v0 = (size_type)gridIndexSet.subIndex(element,refElement.subEntity(localKey.subEntity(),localKey.codim(),0,dim),dim);
│ │ │ │ +
218 auto v1 = (size_type)gridIndexSet.subIndex(element,refElement.subEntity(localKey.subEntity(),localKey.codim(),1,dim),dim);
│ │ │ │ +
219 bool flip = (v0 > v1);
│ │ │ │ +
220 *it = {{ (flip)
│ │ │ │ + │ │ │ │ +
222 + dofsPerCube(1)*((size_type)gridIndexSet.subIndex(element,localKey.subEntity(),localKey.codim()))
│ │ │ │ +
223 + (dofsPerCube(1)-1)-localKey.index()
│ │ │ │ + │ │ │ │ +
225 + dofsPerCube(1)*((size_type)gridIndexSet.subIndex(element,localKey.subEntity(),localKey.codim()))
│ │ │ │ +
226 + localKey.index() }};
│ │ │ │ +
227 continue;
│ │ │ │ +
228 }
│ │ │ │ +
229 }
│ │ │ │ +
230
│ │ │ │ +
231 if (dofDim==2)
│ │ │ │ +
232 {
│ │ │ │ +
233 if (dim==2) // element dof -- any local numbering is fine
│ │ │ │ +
234 {
│ │ │ │ +
235 if (element.type().isTriangle())
│ │ │ │ +
236 {
│ │ │ │ +
237 *it = {{ triangleOffset_ + dofsPerSimplex(2)*((size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }};
│ │ │ │ +
238 continue;
│ │ │ │ +
239 }
│ │ │ │ +
240 else if (element.type().isQuadrilateral())
│ │ │ │ +
241 {
│ │ │ │ +
242 *it = {{ quadrilateralOffset_ + dofsPerCube(2)*((size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }};
│ │ │ │ +
243 continue;
│ │ │ │ +
244 }
│ │ │ │ +
245 else
│ │ │ │ +
246 DUNE_THROW(Dune::NotImplemented, "2d elements have to be triangles or quadrilaterals");
│ │ │ │ +
247 } else
│ │ │ │ +
248 {
│ │ │ │ +
249 const auto refElement
│ │ │ │ +
250 = Dune::referenceElement<double,dim>(element.type());
│ │ │ │ +
251
│ │ │ │ +
252 if (order()>3)
│ │ │ │ +
253 DUNE_THROW(Dune::NotImplemented, "LagrangeBasis for 3D grids is only implemented if k<=3");
│ │ │ │ +
254
│ │ │ │ +
255 if (order()==3 and !refElement.type(localKey.subEntity(), localKey.codim()).isTriangle())
│ │ │ │ +
256 DUNE_THROW(Dune::NotImplemented, "LagrangeBasis for 3D grids with k==3 is only implemented if the grid is a simplex grid");
│ │ │ │ +
257
│ │ │ │ +
258 *it = {{ triangleOffset_ + ((size_type)gridIndexSet.subIndex(element,localKey.subEntity(),localKey.codim())) }};
│ │ │ │ +
259 continue;
│ │ │ │ +
260 }
│ │ │ │ +
261 }
│ │ │ │ +
262
│ │ │ │ +
263 if (dofDim==3)
│ │ │ │ +
264 {
│ │ │ │ +
265 if (dim==3) // element dof -- any local numbering is fine
│ │ │ │ +
266 {
│ │ │ │ +
267 if (element.type().isTetrahedron())
│ │ │ │ +
268 {
│ │ │ │ +
269 *it = {{ tetrahedronOffset_ + dofsPerSimplex(3)*((size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }};
│ │ │ │ +
270 continue;
│ │ │ │ +
271 }
│ │ │ │ +
272 else if (element.type().isHexahedron())
│ │ │ │ +
273 {
│ │ │ │ +
274 *it = {{ hexahedronOffset_ + dofsPerCube(3)*((size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }};
│ │ │ │ +
275 continue;
│ │ │ │ +
276 }
│ │ │ │ +
277 else if (element.type().isPrism())
│ │ │ │ +
278 {
│ │ │ │ +
279 *it = {{ prismOffset_ + dofsPerPrism()*((size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }};
│ │ │ │ +
280 continue;
│ │ │ │ +
281 }
│ │ │ │ +
282 else if (element.type().isPyramid())
│ │ │ │ +
283 {
│ │ │ │ +
284 *it = {{ pyramidOffset_ + dofsPerPyramid()*((size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }};
│ │ │ │ +
285 continue;
│ │ │ │ +
286 }
│ │ │ │ +
287 else
│ │ │ │ +
288 DUNE_THROW(Dune::NotImplemented, "3d elements have to be tetrahedra, hexahedra, prisms, or pyramids");
│ │ │ │ +
289 } else
│ │ │ │ +
290 DUNE_THROW(Dune::NotImplemented, "Grids of dimension larger than 3 are no supported");
│ │ │ │ +
291 }
│ │ │ │ +
292 DUNE_THROW(Dune::NotImplemented, "Grid contains elements not supported for the LagrangeBasis");
│ │ │ │ +
293 }
│ │ │ │ +
294 return it;
│ │ │ │ +
295 }
│ │ │ │ +
│ │ │ │ +
296
│ │ │ │ +
│ │ │ │ +
298 unsigned int order() const
│ │ │ │ +
299 {
│ │ │ │ +
300 return (useDynamicOrder) ? order_ : k;
│ │ │ │ +
301 }
│ │ │ │ +
│ │ │ │ +
302
│ │ │ │ +
303protected:
│ │ │ │ + │ │ │ │ +
305
│ │ │ │ +
306 // Run-time order, only valid if k<0
│ │ │ │ +
307 unsigned int order_;
│ │ │ │ +
308
│ │ │ │ +
│ │ │ │ +
310 size_type dofsPerSimplex(std::size_t simplexDim) const
│ │ │ │ +
311 {
│ │ │ │ +
312 return useDynamicOrder ? dofsPerSimplex_[simplexDim] : computeDofsPerSimplex(simplexDim);
│ │ │ │ +
313 }
│ │ │ │ +
│ │ │ │ +
314
│ │ │ │ +
│ │ │ │ +
316 size_type dofsPerCube(std::size_t cubeDim) const
│ │ │ │ +
317 {
│ │ │ │ +
318 return useDynamicOrder ? dofsPerCube_[cubeDim] : computeDofsPerCube(cubeDim);
│ │ │ │ +
319 }
│ │ │ │ +
│ │ │ │ +
320
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
322 {
│ │ │ │ +
323 return useDynamicOrder ? dofsPerPrism_ : computeDofsPerPrism();
│ │ │ │ +
324 }
│ │ │ │ +
│ │ │ │ +
325
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
327 {
│ │ │ │ +
328 return useDynamicOrder ? dofsPerPyramid_ : computeDofsPerPyramid();
│ │ │ │ +
329 }
│ │ │ │ +
│ │ │ │ +
330
│ │ │ │ +
│ │ │ │ +
332 size_type computeDofsPerSimplex(std::size_t simplexDim) const
│ │ │ │ +
333 {
│ │ │ │ +
334 return order() == 0 ? (dim == simplexDim ? 1 : 0) : Dune::binomial(std::size_t(order()-1),simplexDim);
│ │ │ │ +
335 }
│ │ │ │ +
│ │ │ │ +
336
│ │ │ │ +
│ │ │ │ +
338 size_type computeDofsPerCube(std::size_t cubeDim) const
│ │ │ │ +
339 {
│ │ │ │ +
340 return order() == 0 ? (dim == cubeDim ? 1 : 0) : Dune::power(order()-1, cubeDim);
│ │ │ │ +
341 }
│ │ │ │ +
│ │ │ │ +
342
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
344 {
│ │ │ │ +
345 return order() == 0 ? (dim == 3 ? 1 : 0) : (order()-1)*(order()-1)*(order()-2)/2;
│ │ │ │ +
346 }
│ │ │ │ +
│ │ │ │ +
347
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
349 {
│ │ │ │ +
350 return order() == 0 ? (dim == 3 ? 1 : 0) : (order()-2)*(order()-1)*(2*order()-3)/6;
│ │ │ │ +
351 }
│ │ │ │ +
│ │ │ │ +
352
│ │ │ │ +
353 // When the order is given at run-time, the following numbers are pre-computed:
│ │ │ │ +
354 std::array<size_type,dim+1> dofsPerSimplex_;
│ │ │ │ +
355 std::array<size_type,dim+1> dofsPerCube_;
│ │ │ │ + │ │ │ │ + │ │ │ │ +
358
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
367
│ │ │ │ +
368};
│ │ │ │ +
│ │ │ │ +
369
│ │ │ │ +
370
│ │ │ │ +
371
│ │ │ │ +
372template<typename GV, int k, typename R>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
374 public LeafBasisNode
│ │ │ │ +
375{
│ │ │ │ +
376 // Stores LocalFiniteElement implementations with run-time order as a function of GeometryType
│ │ │ │ +
377 template<typename Domain, typename Range, int dim>
│ │ │ │ +
378 class LagrangeRunTimeLFECache
│ │ │ │ +
379 {
│ │ │ │ +
380 public:
│ │ │ │ +
381 using FiniteElementType = LagrangeLocalFiniteElement<EquidistantPointSet,dim,Domain,Range>;
│ │ │ │ +
382
│ │ │ │ +
383 const FiniteElementType& get(GeometryType type)
│ │ │ │ +
384 {
│ │ │ │ +
385 auto i = data_.find(type);
│ │ │ │ +
386 if (i==data_.end())
│ │ │ │ +
387 i = data_.emplace(type,FiniteElementType(type,order_)).first;
│ │ │ │ +
388 return (*i).second;
│ │ │ │ +
389 }
│ │ │ │ +
390
│ │ │ │ +
391 std::map<GeometryType, FiniteElementType> data_;
│ │ │ │ +
392 unsigned int order_;
│ │ │ │ +
393 };
│ │ │ │ +
394
│ │ │ │ +
395 static constexpr int dim = GV::dimension;
│ │ │ │ +
396 static constexpr bool useDynamicOrder = (k<0);
│ │ │ │ +
397
│ │ │ │ +
398 using FiniteElementCache = std::conditional_t<(useDynamicOrder),
│ │ │ │ +
399 LagrangeRunTimeLFECache<typename GV::ctype, R, dim>,
│ │ │ │ +
400 LagrangeLocalFiniteElementCache<typename GV::ctype, R, dim, std::max(k,0)>
│ │ │ │ +
401 >;
│ │ │ │ +
402
│ │ │ │ +
403public:
│ │ │ │ +
404
│ │ │ │ +
405 using size_type = std::size_t;
│ │ │ │ +
406 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ +
407 using FiniteElement = typename FiniteElementCache::FiniteElementType;
│ │ │ │ +
408
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
411 finiteElement_(nullptr),
│ │ │ │ +
412 element_(nullptr)
│ │ │ │ +
413 {}
│ │ │ │ +
│ │ │ │ +
414
│ │ │ │ +
│ │ │ │ +
416 LagrangeNode(unsigned int order) :
│ │ │ │ +
417 order_(order),
│ │ │ │ +
418 finiteElement_(nullptr),
│ │ │ │ +
419 element_(nullptr)
│ │ │ │ +
420 {
│ │ │ │ +
421 // Only the cache for the run-time-order case (i.e., k<0), has the 'order_' member
│ │ │ │ +
422 if constexpr (useDynamicOrder)
│ │ │ │ +
423 cache_.order_ = order;
│ │ │ │ +
424 }
│ │ │ │ +
│ │ │ │ +
425
│ │ │ │ +
│ │ │ │ +
427 const Element& element() const
│ │ │ │ +
428 {
│ │ │ │ +
429 return *element_;
│ │ │ │ +
430 }
│ │ │ │ +
│ │ │ │ +
431
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
437 {
│ │ │ │ +
438 return *finiteElement_;
│ │ │ │ +
439 }
│ │ │ │ +
│ │ │ │ +
440
│ │ │ │ +
│ │ │ │ +
442 void bind(const Element& e)
│ │ │ │ +
443 {
│ │ │ │ +
444 element_ = &e;
│ │ │ │ +
445 finiteElement_ = &(cache_.get(element_->type()));
│ │ │ │ +
446 this->setSize(finiteElement_->size());
│ │ │ │ +
447 }
│ │ │ │ +
│ │ │ │ +
448
│ │ │ │ +
449protected:
│ │ │ │ +
450
│ │ │ │ +
│ │ │ │ +
451 unsigned int order() const
│ │ │ │ +
452 {
│ │ │ │ +
453 return (useDynamicOrder) ? order_ : k;
│ │ │ │ +
454 }
│ │ │ │ +
│ │ │ │ +
455
│ │ │ │ +
456 // Run-time order, only valid if k<0
│ │ │ │ +
457 unsigned int order_;
│ │ │ │ +
458
│ │ │ │ +
459 FiniteElementCache cache_;
│ │ │ │ + │ │ │ │ + │ │ │ │ +
462};
│ │ │ │ +
│ │ │ │ +
463
│ │ │ │ +
464
│ │ │ │ +
465
│ │ │ │ +
466namespace BasisFactory {
│ │ │ │ +
467
│ │ │ │ +
476template<std::size_t k, typename R=double>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
478{
│ │ │ │ +
479 return [](const auto& gridView) {
│ │ │ │ +
480 return LagrangePreBasis<std::decay_t<decltype(gridView)>, k, R>(gridView);
│ │ │ │ +
481 };
│ │ │ │ +
482}
│ │ │ │ +
│ │ │ │ +
483
│ │ │ │ +
491template<typename R=double>
│ │ │ │ +
│ │ │ │ +
492auto lagrange(int order)
│ │ │ │ +
493{
│ │ │ │ +
494 return [=](const auto& gridView) {
│ │ │ │ +
495 return LagrangePreBasis<std::decay_t<decltype(gridView)>, -1, R>(gridView, order);
│ │ │ │ +
496 };
│ │ │ │ +
497}
│ │ │ │ +
│ │ │ │ +
498
│ │ │ │ +
499} // end namespace BasisFactory
│ │ │ │ +
500
│ │ │ │ +
501
│ │ │ │ +
502
│ │ │ │ +
526template<typename GV, int k=-1, typename R=double>
│ │ │ │ + │ │ │ │ +
528
│ │ │ │ +
529
│ │ │ │ +
530
│ │ │ │ +
531
│ │ │ │ +
532
│ │ │ │ +
533} // end namespace Functions
│ │ │ │ +
534} // end namespace Dune
│ │ │ │ +
535
│ │ │ │ +
536
│ │ │ │ +
537#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
auto lagrange()
Create a pre-basis factory that can create a Lagrange pre-basis.
Definition lagrangebasis.hh:477
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
A statically sized MultiIndex type.
Definition multiindex.hh:29
│ │ │ │ -
A statically sized MultiIndex type.
Definition multiindex.hh:54
│ │ │ │ +
Global basis for given pre-basis.
Definition defaultglobalbasis.hh:50
│ │ │ │ +
Definition lagrangebasis.hh:375
│ │ │ │ +
LagrangeNode(unsigned int order)
Constructor with a run-time order.
Definition lagrangebasis.hh:416
│ │ │ │ +
unsigned int order() const
Definition lagrangebasis.hh:451
│ │ │ │ +
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition lagrangebasis.hh:436
│ │ │ │ +
const Element * element_
Definition lagrangebasis.hh:461
│ │ │ │ +
const Element & element() const
Return current element, throw if unbound.
Definition lagrangebasis.hh:427
│ │ │ │ +
FiniteElementCache cache_
Definition lagrangebasis.hh:459
│ │ │ │ +
typename FiniteElementCache::FiniteElementType FiniteElement
Definition lagrangebasis.hh:407
│ │ │ │ +
void bind(const Element &e)
Bind to element.
Definition lagrangebasis.hh:442
│ │ │ │ +
typename GV::template Codim< 0 >::Entity Element
Definition lagrangebasis.hh:406
│ │ │ │ +
const FiniteElement * finiteElement_
Definition lagrangebasis.hh:460
│ │ │ │ +
unsigned int order_
Definition lagrangebasis.hh:457
│ │ │ │ +
std::size_t size_type
Definition lagrangebasis.hh:405
│ │ │ │ +
LagrangeNode()
Constructor without order (uses the compile-time value)
Definition lagrangebasis.hh:410
│ │ │ │ +
A pre-basis for a PQ-lagrange bases with given order.
Definition lagrangebasis.hh:61
│ │ │ │ +
size_type dofsPerPrism() const
Definition lagrangebasis.hh:321
│ │ │ │ +
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:338
│ │ │ │ +
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:332
│ │ │ │ +
size_type computeDofsPerPrism() const
Definition lagrangebasis.hh:343
│ │ │ │ +
unsigned int order_
Definition lagrangebasis.hh:307
│ │ │ │ +
size_type edgeOffset_
Definition lagrangebasis.hh:360
│ │ │ │ +
std::array< size_type, dim+1 > dofsPerSimplex_
Definition lagrangebasis.hh:354
│ │ │ │ +
It indices(const Node &node, It it) const
Definition lagrangebasis.hh:180
│ │ │ │ +
size_type vertexOffset_
Definition lagrangebasis.hh:359
│ │ │ │ +
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:310
│ │ │ │ +
std::size_t size_type
Type used for indices and size information.
Definition lagrangebasis.hh:71
│ │ │ │ +
size_type pyramidOffset_
Definition lagrangebasis.hh:364
│ │ │ │ +
size_type prismOffset_
Definition lagrangebasis.hh:365
│ │ │ │ +
size_type tetrahedronOffset_
Definition lagrangebasis.hh:363
│ │ │ │ +
void initializeIndices()
Initialize the global indices.
Definition lagrangebasis.hh:98
│ │ │ │ +
size_type computeDofsPerPyramid() const
Definition lagrangebasis.hh:348
│ │ │ │ +
LagrangePreBasis(const GridView &gv, unsigned int order)
Constructor for a given grid view object and run-time order.
Definition lagrangebasis.hh:82
│ │ │ │ +
size_type dofsPerPyramid_
Definition lagrangebasis.hh:357
│ │ │ │ +
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition lagrangebasis.hh:142
│ │ │ │ +
LagrangePreBasis(const GridView &gv)
Constructor for a given grid view object with compile-time order.
Definition lagrangebasis.hh:77
│ │ │ │ +
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition lagrangebasis.hh:128
│ │ │ │ +
GV GridView
The grid view that the FE basis is defined on.
Definition lagrangebasis.hh:68
│ │ │ │ +
size_type quadrilateralOffset_
Definition lagrangebasis.hh:362
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition lagrangebasis.hh:122
│ │ │ │ +
GridView gridView_
Definition lagrangebasis.hh:304
│ │ │ │ +
Node makeNode() const
Create tree node.
Definition lagrangebasis.hh:136
│ │ │ │ +
unsigned int order() const
Polynomial order used in the local Lagrange finite-elements.
Definition lagrangebasis.hh:298
│ │ │ │ +
std::array< size_type, dim+1 > dofsPerCube_
Definition lagrangebasis.hh:355
│ │ │ │ +
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition lagrangebasis.hh:172
│ │ │ │ +
size_type dofsPerPrism_
Definition lagrangebasis.hh:356
│ │ │ │ +
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:316
│ │ │ │ +
size_type triangleOffset_
Definition lagrangebasis.hh:361
│ │ │ │ +
size_type hexahedronOffset_
Definition lagrangebasis.hh:366
│ │ │ │ +
size_type dofsPerPyramid() const
Definition lagrangebasis.hh:326
│ │ │ │ +
A generic MixIn class for PreBasis.
Definition leafprebasismixin.hh:36
│ │ │ │ +
void setSize(const size_type size)
Definition nodes.hh:169
│ │ │ │ +
Definition nodes.hh:191
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,49 +1,715 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -flatmultiindex.hh │ │ │ │ │ +lagrangebasis.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATMULTIINDEX_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATMULTIINDEX_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11 │ │ │ │ │ -12#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_m_u_l_t_i_i_n_d_e_x_._h_h> │ │ │ │ │ -13 │ │ │ │ │ -14namespace _D_u_n_e { │ │ │ │ │ -15namespace Functions { │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12 │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ 16 │ │ │ │ │ -17 │ │ │ │ │ -18 │ │ │ │ │ -34template │ │ │ │ │ -_3_5using _F_l_a_t_M_u_l_t_i_I_n_d_e_x = _S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x_<_s_i_z_e___t_y_p_e_,_ _1_>; │ │ │ │ │ -36 │ │ │ │ │ -37 │ │ │ │ │ +17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ +18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ +19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ +20 │ │ │ │ │ +21 │ │ │ │ │ +22namespace _D_u_n_e { │ │ │ │ │ +23namespace Functions { │ │ │ │ │ +24 │ │ │ │ │ +25/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ +26// This is the reusable part of the LagrangeBasis. It contains │ │ │ │ │ +27// │ │ │ │ │ +28// LagrangePreBasis │ │ │ │ │ +29// LagrangeNode │ │ │ │ │ +30// │ │ │ │ │ +31// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ +shared │ │ │ │ │ +32// state. These components do _not_ depend on the global basis and local view │ │ │ │ │ +33// and can be used without a global basis. │ │ │ │ │ +34/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ +35 │ │ │ │ │ +36template │ │ │ │ │ +37class LagrangeNode; │ │ │ │ │ 38 │ │ │ │ │ -39} // end namespace Functions │ │ │ │ │ -40} // end namespace Dune │ │ │ │ │ +39template │ │ │ │ │ +40class LagrangePreBasis; │ │ │ │ │ 41 │ │ │ │ │ -42#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATMULTIINDEX_HH │ │ │ │ │ -_m_u_l_t_i_i_n_d_e_x_._h_h │ │ │ │ │ +42 │ │ │ │ │ +43 │ │ │ │ │ +58template │ │ │ │ │ +_5_9class _L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s : │ │ │ │ │ +60 public _L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n< LagrangePreBasis > │ │ │ │ │ +61{ │ │ │ │ │ +62 static const int dim = GV::dimension; │ │ │ │ │ +63 static const bool useDynamicOrder = (k<0); │ │ │ │ │ +64 │ │ │ │ │ +65public: │ │ │ │ │ +66 │ │ │ │ │ +_6_8 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ +69 │ │ │ │ │ +_7_1 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ +72 │ │ │ │ │ +_7_4 using _N_o_d_e = _L_a_g_r_a_n_g_e_N_o_d_e_<_G_V_,_ _k_,_ _R_>; │ │ │ │ │ +75 │ │ │ │ │ +_7_7 _L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s(const _G_r_i_d_V_i_e_w& gv) │ │ │ │ │ +78 : _L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s(gv, std::numeric_limits::max()) │ │ │ │ │ +79 {} │ │ │ │ │ +80 │ │ │ │ │ +_8_2 _L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s(const _G_r_i_d_V_i_e_w& gv, unsigned int _o_r_d_e_r) : │ │ │ │ │ +83 _g_r_i_d_V_i_e_w__(gv), _o_r_d_e_r__(_o_r_d_e_r) │ │ │ │ │ +84 { │ │ │ │ │ +85 if (!useDynamicOrder && _o_r_d_e_r!=std::numeric_limits::max()) │ │ │ │ │ +86 DUNE_THROW(RangeError, "Template argument k has to be -1 when supplying a │ │ │ │ │ +run-time order!"); │ │ │ │ │ +87 │ │ │ │ │ +88 for (int i=0; i<=dim; i++) │ │ │ │ │ +89 { │ │ │ │ │ +90 _d_o_f_s_P_e_r_C_u_b_e__[i] = _c_o_m_p_u_t_e_D_o_f_s_P_e_r_C_u_b_e(i); │ │ │ │ │ +91 _d_o_f_s_P_e_r_S_i_m_p_l_e_x__[i] = _c_o_m_p_u_t_e_D_o_f_s_P_e_r_S_i_m_p_l_e_x(i); │ │ │ │ │ +92 } │ │ │ │ │ +93 _d_o_f_s_P_e_r_P_r_i_s_m__ = _c_o_m_p_u_t_e_D_o_f_s_P_e_r_P_r_i_s_m(); │ │ │ │ │ +94 _d_o_f_s_P_e_r_P_y_r_a_m_i_d__ = _c_o_m_p_u_t_e_D_o_f_s_P_e_r_P_y_r_a_m_i_d(); │ │ │ │ │ +95 } │ │ │ │ │ +96 │ │ │ │ │ +_9_8 void _i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s() │ │ │ │ │ +99 { │ │ │ │ │ +100 _v_e_r_t_e_x_O_f_f_s_e_t__ = 0; │ │ │ │ │ +101 _e_d_g_e_O_f_f_s_e_t__ = _v_e_r_t_e_x_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_C_u_b_e(0) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size │ │ │ │ │ +(dim)); │ │ │ │ │ +102 │ │ │ │ │ +103 if (dim>=2) │ │ │ │ │ +104 { │ │ │ │ │ +105 _t_r_i_a_n_g_l_e_O_f_f_s_e_t__ = _e_d_g_e_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_C_u_b_e(1) * ((_s_i_z_e___t_y_p_e) │ │ │ │ │ +_g_r_i_d_V_i_e_w__.size(dim-1)); │ │ │ │ │ +106 │ │ │ │ │ +107 _q_u_a_d_r_i_l_a_t_e_r_a_l_O_f_f_s_e_t__ = _t_r_i_a_n_g_l_e_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_S_i_m_p_l_e_x(2) * ( │ │ │ │ │ +(_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes::triangle)); │ │ │ │ │ +108 } │ │ │ │ │ +109 │ │ │ │ │ +110 if (dim==3) { │ │ │ │ │ +111 _t_e_t_r_a_h_e_d_r_o_n_O_f_f_s_e_t__ = _q_u_a_d_r_i_l_a_t_e_r_a_l_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_C_u_b_e(2) * ( │ │ │ │ │ +(_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes::quadrilateral)); │ │ │ │ │ +112 │ │ │ │ │ +113 _p_r_i_s_m_O_f_f_s_e_t__ = _t_e_t_r_a_h_e_d_r_o_n_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_S_i_m_p_l_e_x(3) * ( │ │ │ │ │ +(_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes::tetrahedron)); │ │ │ │ │ +114 │ │ │ │ │ +115 _h_e_x_a_h_e_d_r_o_n_O_f_f_s_e_t__ = _p_r_i_s_m_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_P_r_i_s_m() * ( │ │ │ │ │ +(_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes::prism)); │ │ │ │ │ +116 │ │ │ │ │ +117 _p_y_r_a_m_i_d_O_f_f_s_e_t__ = _h_e_x_a_h_e_d_r_o_n_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_C_u_b_e(3) * ( │ │ │ │ │ +(_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes::hexahedron)); │ │ │ │ │ +118 } │ │ │ │ │ +119 } │ │ │ │ │ +120 │ │ │ │ │ +_1_2_2 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ +123 { │ │ │ │ │ +124 return _g_r_i_d_V_i_e_w__; │ │ │ │ │ +125 } │ │ │ │ │ +126 │ │ │ │ │ +_1_2_8 void _u_p_d_a_t_e (const _G_r_i_d_V_i_e_w& gv) │ │ │ │ │ +129 { │ │ │ │ │ +130 _g_r_i_d_V_i_e_w__ = gv; │ │ │ │ │ +131 } │ │ │ │ │ +132 │ │ │ │ │ +_1_3_6 _N_o_d_e _m_a_k_e_N_o_d_e() const │ │ │ │ │ +137 { │ │ │ │ │ +138 return _N_o_d_e{_o_r_d_e_r__}; │ │ │ │ │ +139 } │ │ │ │ │ +140 │ │ │ │ │ +_1_4_2 _s_i_z_e___t_y_p_e _d_i_m_e_n_s_i_o_n() const │ │ │ │ │ +143 { │ │ │ │ │ +144 switch (dim) │ │ │ │ │ +145 { │ │ │ │ │ +146 case 1: │ │ │ │ │ +147 return _d_o_f_s_P_e_r_C_u_b_e(0) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(dim)) │ │ │ │ │ +148 + _d_o_f_s_P_e_r_C_u_b_e(1) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(dim-1)); │ │ │ │ │ +149 case 2: │ │ │ │ │ +150 { │ │ │ │ │ +151 return _d_o_f_s_P_e_r_C_u_b_e(0) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(dim)) │ │ │ │ │ +152 + _d_o_f_s_P_e_r_C_u_b_e(1) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(dim-1)) │ │ │ │ │ +153 + _d_o_f_s_P_e_r_S_i_m_p_l_e_x(2) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes:: │ │ │ │ │ +triangle)) │ │ │ │ │ +154 + _d_o_f_s_P_e_r_C_u_b_e(2) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes:: │ │ │ │ │ +quadrilateral)); │ │ │ │ │ +155 } │ │ │ │ │ +156 case 3: │ │ │ │ │ +157 { │ │ │ │ │ +158 return _d_o_f_s_P_e_r_C_u_b_e(0) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(dim)) │ │ │ │ │ +159 + _d_o_f_s_P_e_r_C_u_b_e(1) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(dim-1)) │ │ │ │ │ +160 + _d_o_f_s_P_e_r_S_i_m_p_l_e_x(2) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes:: │ │ │ │ │ +triangle)) │ │ │ │ │ +161 + _d_o_f_s_P_e_r_C_u_b_e(2) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes:: │ │ │ │ │ +quadrilateral)) │ │ │ │ │ +162 + _d_o_f_s_P_e_r_S_i_m_p_l_e_x(3) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes:: │ │ │ │ │ +tetrahedron)) │ │ │ │ │ +163 + _d_o_f_s_P_e_r_P_y_r_a_m_i_d() * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes:: │ │ │ │ │ +pyramid)) │ │ │ │ │ +164 + _d_o_f_s_P_e_r_P_r_i_s_m() * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes::prism)) │ │ │ │ │ +165 + _d_o_f_s_P_e_r_C_u_b_e(3) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes:: │ │ │ │ │ +hexahedron)); │ │ │ │ │ +166 } │ │ │ │ │ +167 } │ │ │ │ │ +168 DUNE_THROW(Dune::NotImplemented, "No size method for " << dim << "d grids │ │ │ │ │ +available yet!"); │ │ │ │ │ +169 } │ │ │ │ │ +170 │ │ │ │ │ +_1_7_2 _s_i_z_e___t_y_p_e _m_a_x_N_o_d_e_S_i_z_e() const │ │ │ │ │ +173 { │ │ │ │ │ +174 // That cast to unsigned int is necessary because GV::dimension is an enum, │ │ │ │ │ +175 // which is not recognized by the power method as an integer type... │ │ │ │ │ +176 return power(_o_r_d_e_r()+1, (unsigned int)GV::dimension); │ │ │ │ │ +177 } │ │ │ │ │ +178 │ │ │ │ │ +179 template │ │ │ │ │ +_1_8_0 It _i_n_d_i_c_e_s(const _N_o_d_e& node, It it) const │ │ │ │ │ +181 { │ │ │ │ │ +182 for (_s_i_z_e___t_y_p_e i = 0, end = node._f_i_n_i_t_e_E_l_e_m_e_n_t().size() ; i < end ; ++it, │ │ │ │ │ +++i) │ │ │ │ │ +183 { │ │ │ │ │ +184 Dune::LocalKey localKey = node._f_i_n_i_t_e_E_l_e_m_e_n_t().localCoefficients().localKey │ │ │ │ │ +(i); │ │ │ │ │ +185 const auto& gridIndexSet = _g_r_i_d_V_i_e_w().indexSet(); │ │ │ │ │ +186 const auto& element = node._e_l_e_m_e_n_t(); │ │ │ │ │ +187 │ │ │ │ │ +188 // The dimension of the entity that the current dof is related to │ │ │ │ │ +189 auto dofDim = dim - localKey.codim(); │ │ │ │ │ +190 │ │ │ │ │ +191 // Test for a vertex dof │ │ │ │ │ +192 // The test for k==1 is redundant, but having it here allows the compiler │ │ │ │ │ +to conclude │ │ │ │ │ +193 // at compile-time that the dofDim==0 case is the only one that will ever │ │ │ │ │ +happen. │ │ │ │ │ +194 // This leads to measurable speed-up: see │ │ │ │ │ +195 // https://gitlab.dune-project.org/staging/dune-functions/issues/30 │ │ │ │ │ +196 if (k==1 || dofDim==0) { │ │ │ │ │ +197 *it = {{ (_s_i_z_e___t_y_p_e)(gridIndexSet.subIndex(element,localKey.subEntity │ │ │ │ │ +(),dim)) }}; │ │ │ │ │ +198 continue; │ │ │ │ │ +199 } │ │ │ │ │ +200 │ │ │ │ │ +201 if (dofDim==1) │ │ │ │ │ +202 { // edge dof │ │ │ │ │ +203 if (dim==1) // element dof -- any local numbering is fine │ │ │ │ │ +204 { │ │ │ │ │ +205 *it = {{ _e_d_g_e_O_f_f_s_e_t__ │ │ │ │ │ +206 + _d_o_f_s_P_e_r_C_u_b_e(1) * ((_s_i_z_e___t_y_p_e)gridIndexSet.subIndex(element,0,0)) │ │ │ │ │ +207 + localKey.index() }}; │ │ │ │ │ +208 continue; │ │ │ │ │ +209 } │ │ │ │ │ +210 else │ │ │ │ │ +211 { │ │ │ │ │ +212 const auto refElement │ │ │ │ │ +213 = Dune::referenceElement(element.type()); │ │ │ │ │ +214 │ │ │ │ │ +215 // We have to reverse the numbering if the local element edge is │ │ │ │ │ +216 // not aligned with the global edge. │ │ │ │ │ +217 auto v0 = (_s_i_z_e___t_y_p_e)gridIndexSet.subIndex(element,refElement.subEntity │ │ │ │ │ +(localKey.subEntity(),localKey.codim(),0,dim),dim); │ │ │ │ │ +218 auto v1 = (_s_i_z_e___t_y_p_e)gridIndexSet.subIndex(element,refElement.subEntity │ │ │ │ │ +(localKey.subEntity(),localKey.codim(),1,dim),dim); │ │ │ │ │ +219 bool flip = (v0 > v1); │ │ │ │ │ +220 *it = {{ (flip) │ │ │ │ │ +221 ? _e_d_g_e_O_f_f_s_e_t__ │ │ │ │ │ +222 + _d_o_f_s_P_e_r_C_u_b_e(1)*((_s_i_z_e___t_y_p_e)gridIndexSet.subIndex │ │ │ │ │ +(element,localKey.subEntity(),localKey.codim())) │ │ │ │ │ +223 + (_d_o_f_s_P_e_r_C_u_b_e(1)-1)-localKey.index() │ │ │ │ │ +224 : _e_d_g_e_O_f_f_s_e_t__ │ │ │ │ │ +225 + _d_o_f_s_P_e_r_C_u_b_e(1)*((_s_i_z_e___t_y_p_e)gridIndexSet.subIndex │ │ │ │ │ +(element,localKey.subEntity(),localKey.codim())) │ │ │ │ │ +226 + localKey.index() }}; │ │ │ │ │ +227 continue; │ │ │ │ │ +228 } │ │ │ │ │ +229 } │ │ │ │ │ +230 │ │ │ │ │ +231 if (dofDim==2) │ │ │ │ │ +232 { │ │ │ │ │ +233 if (dim==2) // element dof -- any local numbering is fine │ │ │ │ │ +234 { │ │ │ │ │ +235 if (element.type().isTriangle()) │ │ │ │ │ +236 { │ │ │ │ │ +237 *it = {{ _t_r_i_a_n_g_l_e_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_S_i_m_p_l_e_x(2)*( │ │ │ │ │ +(_s_i_z_e___t_y_p_e)gridIndexSet.subIndex(element,0,0)) + localKey.index() }}; │ │ │ │ │ +238 continue; │ │ │ │ │ +239 } │ │ │ │ │ +240 else if (element.type().isQuadrilateral()) │ │ │ │ │ +241 { │ │ │ │ │ +242 *it = {{ _q_u_a_d_r_i_l_a_t_e_r_a_l_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_C_u_b_e(2)*( │ │ │ │ │ +(_s_i_z_e___t_y_p_e)gridIndexSet.subIndex(element,0,0)) + localKey.index() }}; │ │ │ │ │ +243 continue; │ │ │ │ │ +244 } │ │ │ │ │ +245 else │ │ │ │ │ +246 DUNE_THROW(Dune::NotImplemented, "2d elements have to be triangles or │ │ │ │ │ +quadrilaterals"); │ │ │ │ │ +247 } else │ │ │ │ │ +248 { │ │ │ │ │ +249 const auto refElement │ │ │ │ │ +250 = Dune::referenceElement(element.type()); │ │ │ │ │ +251 │ │ │ │ │ +252 if (_o_r_d_e_r()>3) │ │ │ │ │ +253 DUNE_THROW(Dune::NotImplemented, "LagrangeBasis for 3D grids is only │ │ │ │ │ +implemented if k<=3"); │ │ │ │ │ +254 │ │ │ │ │ +255 if (_o_r_d_e_r()==3 and !refElement.type(localKey.subEntity(), localKey.codim │ │ │ │ │ +()).isTriangle()) │ │ │ │ │ +256 DUNE_THROW(Dune::NotImplemented, "LagrangeBasis for 3D grids with k==3 is │ │ │ │ │ +only implemented if the grid is a simplex grid"); │ │ │ │ │ +257 │ │ │ │ │ +258 *it = {{ _t_r_i_a_n_g_l_e_O_f_f_s_e_t__ + ((_s_i_z_e___t_y_p_e)gridIndexSet.subIndex │ │ │ │ │ +(element,localKey.subEntity(),localKey.codim())) }}; │ │ │ │ │ +259 continue; │ │ │ │ │ +260 } │ │ │ │ │ +261 } │ │ │ │ │ +262 │ │ │ │ │ +263 if (dofDim==3) │ │ │ │ │ +264 { │ │ │ │ │ +265 if (dim==3) // element dof -- any local numbering is fine │ │ │ │ │ +266 { │ │ │ │ │ +267 if (element.type().isTetrahedron()) │ │ │ │ │ +268 { │ │ │ │ │ +269 *it = {{ _t_e_t_r_a_h_e_d_r_o_n_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_S_i_m_p_l_e_x(3)*( │ │ │ │ │ +(_s_i_z_e___t_y_p_e)gridIndexSet.subIndex(element,0,0)) + localKey.index() }}; │ │ │ │ │ +270 continue; │ │ │ │ │ +271 } │ │ │ │ │ +272 else if (element.type().isHexahedron()) │ │ │ │ │ +273 { │ │ │ │ │ +274 *it = {{ _h_e_x_a_h_e_d_r_o_n_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_C_u_b_e(3)*( │ │ │ │ │ +(_s_i_z_e___t_y_p_e)gridIndexSet.subIndex(element,0,0)) + localKey.index() }}; │ │ │ │ │ +275 continue; │ │ │ │ │ +276 } │ │ │ │ │ +277 else if (element.type().isPrism()) │ │ │ │ │ +278 { │ │ │ │ │ +279 *it = {{ _p_r_i_s_m_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_P_r_i_s_m()*((_s_i_z_e___t_y_p_e)gridIndexSet.subIndex │ │ │ │ │ +(element,0,0)) + localKey.index() }}; │ │ │ │ │ +280 continue; │ │ │ │ │ +281 } │ │ │ │ │ +282 else if (element.type().isPyramid()) │ │ │ │ │ +283 { │ │ │ │ │ +284 *it = {{ _p_y_r_a_m_i_d_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_P_y_r_a_m_i_d()*( │ │ │ │ │ +(_s_i_z_e___t_y_p_e)gridIndexSet.subIndex(element,0,0)) + localKey.index() }}; │ │ │ │ │ +285 continue; │ │ │ │ │ +286 } │ │ │ │ │ +287 else │ │ │ │ │ +288 DUNE_THROW(Dune::NotImplemented, "3d elements have to be tetrahedra, │ │ │ │ │ +hexahedra, prisms, or pyramids"); │ │ │ │ │ +289 } else │ │ │ │ │ +290 DUNE_THROW(Dune::NotImplemented, "Grids of dimension larger than 3 are no │ │ │ │ │ +supported"); │ │ │ │ │ +291 } │ │ │ │ │ +292 DUNE_THROW(Dune::NotImplemented, "Grid contains elements not supported for │ │ │ │ │ +the LagrangeBasis"); │ │ │ │ │ +293 } │ │ │ │ │ +294 return it; │ │ │ │ │ +295 } │ │ │ │ │ +296 │ │ │ │ │ +_2_9_8 unsigned int _o_r_d_e_r() const │ │ │ │ │ +299 { │ │ │ │ │ +300 return (useDynamicOrder) ? _o_r_d_e_r__ : k; │ │ │ │ │ +301 } │ │ │ │ │ +302 │ │ │ │ │ +303protected: │ │ │ │ │ +_3_0_4 _G_r_i_d_V_i_e_w _g_r_i_d_V_i_e_w__; │ │ │ │ │ +305 │ │ │ │ │ +306 // Run-time order, only valid if k<0 │ │ │ │ │ +_3_0_7 unsigned int _o_r_d_e_r__; │ │ │ │ │ +308 │ │ │ │ │ +_3_1_0 _s_i_z_e___t_y_p_e _d_o_f_s_P_e_r_S_i_m_p_l_e_x(std::size_t simplexDim) const │ │ │ │ │ +311 { │ │ │ │ │ +312 return useDynamicOrder ? _d_o_f_s_P_e_r_S_i_m_p_l_e_x__[simplexDim] : │ │ │ │ │ +_c_o_m_p_u_t_e_D_o_f_s_P_e_r_S_i_m_p_l_e_x(simplexDim); │ │ │ │ │ +313 } │ │ │ │ │ +314 │ │ │ │ │ +_3_1_6 _s_i_z_e___t_y_p_e _d_o_f_s_P_e_r_C_u_b_e(std::size_t cubeDim) const │ │ │ │ │ +317 { │ │ │ │ │ +318 return useDynamicOrder ? _d_o_f_s_P_e_r_C_u_b_e__[cubeDim] : _c_o_m_p_u_t_e_D_o_f_s_P_e_r_C_u_b_e │ │ │ │ │ +(cubeDim); │ │ │ │ │ +319 } │ │ │ │ │ +320 │ │ │ │ │ +_3_2_1 _s_i_z_e___t_y_p_e _d_o_f_s_P_e_r_P_r_i_s_m() const │ │ │ │ │ +322 { │ │ │ │ │ +323 return useDynamicOrder ? _d_o_f_s_P_e_r_P_r_i_s_m__ : _c_o_m_p_u_t_e_D_o_f_s_P_e_r_P_r_i_s_m(); │ │ │ │ │ +324 } │ │ │ │ │ +325 │ │ │ │ │ +_3_2_6 _s_i_z_e___t_y_p_e _d_o_f_s_P_e_r_P_y_r_a_m_i_d() const │ │ │ │ │ +327 { │ │ │ │ │ +328 return useDynamicOrder ? _d_o_f_s_P_e_r_P_y_r_a_m_i_d__ : _c_o_m_p_u_t_e_D_o_f_s_P_e_r_P_y_r_a_m_i_d(); │ │ │ │ │ +329 } │ │ │ │ │ +330 │ │ │ │ │ +_3_3_2 _s_i_z_e___t_y_p_e _c_o_m_p_u_t_e_D_o_f_s_P_e_r_S_i_m_p_l_e_x(std::size_t simplexDim) const │ │ │ │ │ +333 { │ │ │ │ │ +334 return _o_r_d_e_r() == 0 ? (dim == simplexDim ? 1 : 0) : Dune::binomial(std:: │ │ │ │ │ +size_t(_o_r_d_e_r()-1),simplexDim); │ │ │ │ │ +335 } │ │ │ │ │ +336 │ │ │ │ │ +_3_3_8 _s_i_z_e___t_y_p_e _c_o_m_p_u_t_e_D_o_f_s_P_e_r_C_u_b_e(std::size_t cubeDim) const │ │ │ │ │ +339 { │ │ │ │ │ +340 return _o_r_d_e_r() == 0 ? (dim == cubeDim ? 1 : 0) : Dune::power(_o_r_d_e_r()-1, │ │ │ │ │ +cubeDim); │ │ │ │ │ +341 } │ │ │ │ │ +342 │ │ │ │ │ +_3_4_3 _s_i_z_e___t_y_p_e _c_o_m_p_u_t_e_D_o_f_s_P_e_r_P_r_i_s_m() const │ │ │ │ │ +344 { │ │ │ │ │ +345 return _o_r_d_e_r() == 0 ? (dim == 3 ? 1 : 0) : (_o_r_d_e_r()-1)*(_o_r_d_e_r()-1)*(_o_r_d_e_r │ │ │ │ │ +()-2)/2; │ │ │ │ │ +346 } │ │ │ │ │ +347 │ │ │ │ │ +_3_4_8 _s_i_z_e___t_y_p_e _c_o_m_p_u_t_e_D_o_f_s_P_e_r_P_y_r_a_m_i_d() const │ │ │ │ │ +349 { │ │ │ │ │ +350 return _o_r_d_e_r() == 0 ? (dim == 3 ? 1 : 0) : (_o_r_d_e_r()-2)*(_o_r_d_e_r()-1)*(2*_o_r_d_e_r │ │ │ │ │ +()-3)/6; │ │ │ │ │ +351 } │ │ │ │ │ +352 │ │ │ │ │ +353 // When the order is given at run-time, the following numbers are pre- │ │ │ │ │ +computed: │ │ │ │ │ +_3_5_4 std::array _d_o_f_s_P_e_r_S_i_m_p_l_e_x__; │ │ │ │ │ +_3_5_5 std::array _d_o_f_s_P_e_r_C_u_b_e__; │ │ │ │ │ +_3_5_6 _s_i_z_e___t_y_p_e _d_o_f_s_P_e_r_P_r_i_s_m__; │ │ │ │ │ +_3_5_7 _s_i_z_e___t_y_p_e _d_o_f_s_P_e_r_P_y_r_a_m_i_d__; │ │ │ │ │ +358 │ │ │ │ │ +_3_5_9 _s_i_z_e___t_y_p_e _v_e_r_t_e_x_O_f_f_s_e_t__; │ │ │ │ │ +_3_6_0 _s_i_z_e___t_y_p_e _e_d_g_e_O_f_f_s_e_t__; │ │ │ │ │ +_3_6_1 _s_i_z_e___t_y_p_e _t_r_i_a_n_g_l_e_O_f_f_s_e_t__; │ │ │ │ │ +_3_6_2 _s_i_z_e___t_y_p_e _q_u_a_d_r_i_l_a_t_e_r_a_l_O_f_f_s_e_t__; │ │ │ │ │ +_3_6_3 _s_i_z_e___t_y_p_e _t_e_t_r_a_h_e_d_r_o_n_O_f_f_s_e_t__; │ │ │ │ │ +_3_6_4 _s_i_z_e___t_y_p_e _p_y_r_a_m_i_d_O_f_f_s_e_t__; │ │ │ │ │ +_3_6_5 _s_i_z_e___t_y_p_e _p_r_i_s_m_O_f_f_s_e_t__; │ │ │ │ │ +_3_6_6 _s_i_z_e___t_y_p_e _h_e_x_a_h_e_d_r_o_n_O_f_f_s_e_t__; │ │ │ │ │ +367 │ │ │ │ │ +368}; │ │ │ │ │ +369 │ │ │ │ │ +370 │ │ │ │ │ +371 │ │ │ │ │ +372template │ │ │ │ │ +_3_7_3class _L_a_g_r_a_n_g_e_N_o_d_e : │ │ │ │ │ +374 public _L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ +375{ │ │ │ │ │ +376 // Stores LocalFiniteElement implementations with run-time order as a │ │ │ │ │ +function of GeometryType │ │ │ │ │ +377 template │ │ │ │ │ +378 class LagrangeRunTimeLFECache │ │ │ │ │ +379 { │ │ │ │ │ +380 public: │ │ │ │ │ +381 using FiniteElementType = │ │ │ │ │ +LagrangeLocalFiniteElement; │ │ │ │ │ +382 │ │ │ │ │ +383 const FiniteElementType& get(GeometryType type) │ │ │ │ │ +384 { │ │ │ │ │ +385 auto i = data_.find(type); │ │ │ │ │ +386 if (i==data_.end()) │ │ │ │ │ +387 i = data_.emplace(type,FiniteElementType(type,order_)).first; │ │ │ │ │ +388 return (*i).second; │ │ │ │ │ +389 } │ │ │ │ │ +390 │ │ │ │ │ +391 std::map data_; │ │ │ │ │ +392 unsigned int order_; │ │ │ │ │ +393 }; │ │ │ │ │ +394 │ │ │ │ │ +395 static constexpr int dim = GV::dimension; │ │ │ │ │ +396 static constexpr bool useDynamicOrder = (k<0); │ │ │ │ │ +397 │ │ │ │ │ +398 using FiniteElementCache = std::conditional_t<(useDynamicOrder), │ │ │ │ │ +399 LagrangeRunTimeLFECache, │ │ │ │ │ +400 LagrangeLocalFiniteElementCache │ │ │ │ │ +401 >; │ │ │ │ │ +402 │ │ │ │ │ +403public: │ │ │ │ │ +404 │ │ │ │ │ +_4_0_5 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ +_4_0_6 using _E_l_e_m_e_n_t = typename GV::template Codim<0>::Entity; │ │ │ │ │ +_4_0_7 using _F_i_n_i_t_e_E_l_e_m_e_n_t = typename FiniteElementCache::FiniteElementType; │ │ │ │ │ +408 │ │ │ │ │ +_4_1_0 _L_a_g_r_a_n_g_e_N_o_d_e() : │ │ │ │ │ +411 _f_i_n_i_t_e_E_l_e_m_e_n_t__(nullptr), │ │ │ │ │ +412 _e_l_e_m_e_n_t__(nullptr) │ │ │ │ │ +413 {} │ │ │ │ │ +414 │ │ │ │ │ +_4_1_6 _L_a_g_r_a_n_g_e_N_o_d_e(unsigned int _o_r_d_e_r) : │ │ │ │ │ +417 _o_r_d_e_r__(_o_r_d_e_r), │ │ │ │ │ +418 _f_i_n_i_t_e_E_l_e_m_e_n_t__(nullptr), │ │ │ │ │ +419 _e_l_e_m_e_n_t__(nullptr) │ │ │ │ │ +420 { │ │ │ │ │ +421 // Only the cache for the run-time-order case (i.e., k<0), has the 'order_' │ │ │ │ │ +member │ │ │ │ │ +422 if constexpr (useDynamicOrder) │ │ │ │ │ +423 _c_a_c_h_e__.order_ = _o_r_d_e_r; │ │ │ │ │ +424 } │ │ │ │ │ +425 │ │ │ │ │ +_4_2_7 const _E_l_e_m_e_n_t& _e_l_e_m_e_n_t() const │ │ │ │ │ +428 { │ │ │ │ │ +429 return *_e_l_e_m_e_n_t__; │ │ │ │ │ +430 } │ │ │ │ │ +431 │ │ │ │ │ +_4_3_6 const _F_i_n_i_t_e_E_l_e_m_e_n_t& _f_i_n_i_t_e_E_l_e_m_e_n_t() const │ │ │ │ │ +437 { │ │ │ │ │ +438 return *_f_i_n_i_t_e_E_l_e_m_e_n_t__; │ │ │ │ │ +439 } │ │ │ │ │ +440 │ │ │ │ │ +_4_4_2 void _b_i_n_d(const _E_l_e_m_e_n_t& e) │ │ │ │ │ +443 { │ │ │ │ │ +444 _e_l_e_m_e_n_t__ = &e; │ │ │ │ │ +445 _f_i_n_i_t_e_E_l_e_m_e_n_t__ = &(_c_a_c_h_e__.get(_e_l_e_m_e_n_t__->type())); │ │ │ │ │ +446 this->_s_e_t_S_i_z_e(_f_i_n_i_t_e_E_l_e_m_e_n_t__->size()); │ │ │ │ │ +447 } │ │ │ │ │ +448 │ │ │ │ │ +449protected: │ │ │ │ │ +450 │ │ │ │ │ +_4_5_1 unsigned int _o_r_d_e_r() const │ │ │ │ │ +452 { │ │ │ │ │ +453 return (useDynamicOrder) ? _o_r_d_e_r__ : k; │ │ │ │ │ +454 } │ │ │ │ │ +455 │ │ │ │ │ +456 // Run-time order, only valid if k<0 │ │ │ │ │ +_4_5_7 unsigned int _o_r_d_e_r__; │ │ │ │ │ +458 │ │ │ │ │ +_4_5_9 FiniteElementCache _c_a_c_h_e__; │ │ │ │ │ +_4_6_0 const _F_i_n_i_t_e_E_l_e_m_e_n_t* _f_i_n_i_t_e_E_l_e_m_e_n_t__; │ │ │ │ │ +_4_6_1 const _E_l_e_m_e_n_t* _e_l_e_m_e_n_t__; │ │ │ │ │ +462}; │ │ │ │ │ +463 │ │ │ │ │ +464 │ │ │ │ │ +465 │ │ │ │ │ +466namespace BasisFactory { │ │ │ │ │ +467 │ │ │ │ │ +476template │ │ │ │ │ +_4_7_7auto _l_a_g_r_a_n_g_e() │ │ │ │ │ +478{ │ │ │ │ │ +479 return [](const auto& gridView) { │ │ │ │ │ +480 return _L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s, k, R>(gridView); │ │ │ │ │ +481 }; │ │ │ │ │ +482} │ │ │ │ │ +483 │ │ │ │ │ +491template │ │ │ │ │ +_4_9_2auto _l_a_g_r_a_n_g_e(int order) │ │ │ │ │ +493{ │ │ │ │ │ +494 return [=](const auto& gridView) { │ │ │ │ │ +495 return _L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s, -1, R>(gridView, │ │ │ │ │ +order); │ │ │ │ │ +496 }; │ │ │ │ │ +497} │ │ │ │ │ +498 │ │ │ │ │ +499} // end namespace BasisFactory │ │ │ │ │ +500 │ │ │ │ │ +501 │ │ │ │ │ +502 │ │ │ │ │ +526template │ │ │ │ │ +_5_2_7using _L_a_g_r_a_n_g_e_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_<_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_<_G_V_,_ _k_,_ _R_> >; │ │ │ │ │ +528 │ │ │ │ │ +529 │ │ │ │ │ +530 │ │ │ │ │ +531 │ │ │ │ │ +532 │ │ │ │ │ +533} // end namespace Functions │ │ │ │ │ +534} // end namespace Dune │ │ │ │ │ +535 │ │ │ │ │ +536 │ │ │ │ │ +537#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH │ │ │ │ │ +_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h │ │ │ │ │ +_n_o_d_e_s_._h_h │ │ │ │ │ +_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_l_a_g_r_a_n_g_e │ │ │ │ │ +auto lagrange() │ │ │ │ │ +Create a pre-basis factory that can create a Lagrange pre-basis. │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:477 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x │ │ │ │ │ -A statically sized MultiIndex type. │ │ │ │ │ -DDeeffiinniittiioonn multiindex.hh:29 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x_<_ _s_i_z_e___t_y_p_e_,_ _1_ _> │ │ │ │ │ -A statically sized MultiIndex type. │ │ │ │ │ -DDeeffiinniittiioonn multiindex.hh:54 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ +Global basis for given pre-basis. │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:50 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:375 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_L_a_g_r_a_n_g_e_N_o_d_e │ │ │ │ │ +LagrangeNode(unsigned int order) │ │ │ │ │ +Constructor with a run-time order. │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:416 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_o_r_d_e_r │ │ │ │ │ +unsigned int order() const │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:451 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ +const FiniteElement & finiteElement() const │ │ │ │ │ +Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:436 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_e_l_e_m_e_n_t__ │ │ │ │ │ +const Element * element_ │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:461 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_e_l_e_m_e_n_t │ │ │ │ │ +const Element & element() const │ │ │ │ │ +Return current element, throw if unbound. │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:427 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_c_a_c_h_e__ │ │ │ │ │ +FiniteElementCache cache_ │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:459 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_F_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ +typename FiniteElementCache::FiniteElementType FiniteElement │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:407 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_b_i_n_d │ │ │ │ │ +void bind(const Element &e) │ │ │ │ │ +Bind to element. │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:442 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_E_l_e_m_e_n_t │ │ │ │ │ +typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:406 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t__ │ │ │ │ │ +const FiniteElement * finiteElement_ │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:460 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_o_r_d_e_r__ │ │ │ │ │ +unsigned int order_ │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:457 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:405 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_L_a_g_r_a_n_g_e_N_o_d_e │ │ │ │ │ +LagrangeNode() │ │ │ │ │ +Constructor without order (uses the compile-time value) │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:410 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s │ │ │ │ │ +A pre-basis for a PQ-lagrange bases with given order. │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_P_r_i_s_m │ │ │ │ │ +size_type dofsPerPrism() const │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:321 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_c_o_m_p_u_t_e_D_o_f_s_P_e_r_C_u_b_e │ │ │ │ │ +size_type computeDofsPerCube(std::size_t cubeDim) const │ │ │ │ │ +Number of degrees of freedom assigned to a cube (without the ones assigned to │ │ │ │ │ +its faces!... │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:338 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_c_o_m_p_u_t_e_D_o_f_s_P_e_r_S_i_m_p_l_e_x │ │ │ │ │ +size_type computeDofsPerSimplex(std::size_t simplexDim) const │ │ │ │ │ +Number of degrees of freedom assigned to a simplex (without the ones assigned │ │ │ │ │ +to its faces!... │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:332 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_c_o_m_p_u_t_e_D_o_f_s_P_e_r_P_r_i_s_m │ │ │ │ │ +size_type computeDofsPerPrism() const │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:343 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_o_r_d_e_r__ │ │ │ │ │ +unsigned int order_ │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:307 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_e_d_g_e_O_f_f_s_e_t__ │ │ │ │ │ +size_type edgeOffset_ │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:360 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_S_i_m_p_l_e_x__ │ │ │ │ │ +std::array< size_type, dim+1 > dofsPerSimplex_ │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:354 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s │ │ │ │ │ +It indices(const Node &node, It it) const │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:180 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_v_e_r_t_e_x_O_f_f_s_e_t__ │ │ │ │ │ +size_type vertexOffset_ │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:359 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_S_i_m_p_l_e_x │ │ │ │ │ +size_type dofsPerSimplex(std::size_t simplexDim) const │ │ │ │ │ +Number of degrees of freedom assigned to a simplex (without the ones assigned │ │ │ │ │ +to its faces!... │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:310 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +Type used for indices and size information. │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:71 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_p_y_r_a_m_i_d_O_f_f_s_e_t__ │ │ │ │ │ +size_type pyramidOffset_ │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:364 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_p_r_i_s_m_O_f_f_s_e_t__ │ │ │ │ │ +size_type prismOffset_ │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:365 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_t_e_t_r_a_h_e_d_r_o_n_O_f_f_s_e_t__ │ │ │ │ │ +size_type tetrahedronOffset_ │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:363 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s │ │ │ │ │ +void initializeIndices() │ │ │ │ │ +Initialize the global indices. │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:98 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_c_o_m_p_u_t_e_D_o_f_s_P_e_r_P_y_r_a_m_i_d │ │ │ │ │ +size_type computeDofsPerPyramid() const │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:348 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s │ │ │ │ │ +LagrangePreBasis(const GridView &gv, unsigned int order) │ │ │ │ │ +Constructor for a given grid view object and run-time order. │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:82 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_P_y_r_a_m_i_d__ │ │ │ │ │ +size_type dofsPerPyramid_ │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:357 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ +size_type dimension() const │ │ │ │ │ +Get the total dimension of the space spanned by this basis. │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:142 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s │ │ │ │ │ +LagrangePreBasis(const GridView &gv) │ │ │ │ │ +Constructor for a given grid view object with compile-time order. │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:77 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_u_p_d_a_t_e │ │ │ │ │ +void update(const GridView &gv) │ │ │ │ │ +Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:128 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ +GV GridView │ │ │ │ │ +The grid view that the FE basis is defined on. │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:68 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_q_u_a_d_r_i_l_a_t_e_r_a_l_O_f_f_s_e_t__ │ │ │ │ │ +size_type quadrilateralOffset_ │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:362 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ +const GridView & gridView() const │ │ │ │ │ +Obtain the grid view that the basis is defined on. │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:122 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w__ │ │ │ │ │ +GridView gridView_ │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:304 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ +Node makeNode() const │ │ │ │ │ +Create tree node. │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:136 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_o_r_d_e_r │ │ │ │ │ +unsigned int order() const │ │ │ │ │ +Polynomial order used in the local Lagrange finite-elements. │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:298 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_C_u_b_e__ │ │ │ │ │ +std::array< size_type, dim+1 > dofsPerCube_ │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:355 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_m_a_x_N_o_d_e_S_i_z_e │ │ │ │ │ +size_type maxNodeSize() const │ │ │ │ │ +Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:172 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_P_r_i_s_m__ │ │ │ │ │ +size_type dofsPerPrism_ │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:356 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_C_u_b_e │ │ │ │ │ +size_type dofsPerCube(std::size_t cubeDim) const │ │ │ │ │ +Number of degrees of freedom assigned to a cube (without the ones assigned to │ │ │ │ │ +its faces!... │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:316 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_t_r_i_a_n_g_l_e_O_f_f_s_e_t__ │ │ │ │ │ +size_type triangleOffset_ │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:361 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_h_e_x_a_h_e_d_r_o_n_O_f_f_s_e_t__ │ │ │ │ │ +size_type hexahedronOffset_ │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:366 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_P_y_r_a_m_i_d │ │ │ │ │ +size_type dofsPerPyramid() const │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:326 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n │ │ │ │ │ +A generic MixIn class for PreBasis. │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismixin.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_e_t_S_i_z_e │ │ │ │ │ +void setSize(const size_type size) │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:169 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:191 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00116.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: lagrangebasis.hh File Reference │ │ │ │ +dune-functions: taylorhoodbasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,62 +74,59 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Typedefs | │ │ │ │ Functions
│ │ │ │ -
lagrangebasis.hh File Reference
│ │ │ │ +
taylorhoodbasis.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/lagrangelfecache.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/leafprebasismixin.hh>
│ │ │ │ +
#include <dune/common/exceptions.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>
│ │ │ │
│ │ │ │

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::TaylorHoodPreBasis< GV, HI >
 Pre-basis for lowest order Taylor-Hood basis. More...
 
class  Dune::Functions::LagrangeNode< GV, k, R >
class  Dune::Functions::TaylorHoodVelocityTree< GV >
 
class  Dune::Functions::TaylorHoodBasisTree< GV >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ 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.
 
template<typename GV >
using Dune::Functions::TaylorHoodBasis = DefaultGlobalBasis< TaylorHoodPreBasis< GV > >
 Nodal basis for a lowest order Taylor-Hood Lagrangean finite element space.
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ 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.
 
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.
 
auto Dune::Functions::BasisFactory::taylorHood ()
 Create a pre-basis factory that can create a Taylor-Hood pre-basis.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -2,48 +2,45 @@ │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -lagrangebasis.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +taylorhoodbasis.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_a_g_r_a_n_g_e_b_a_s_i_s_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_<_ _G_V_,_ _k_,_ _R_ _> │ │ │ │ │ -  A pre-basis for a PQ-lagrange bases with given order. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_<_ _G_V_,_ _H_I_ _> │ │ │ │ │ +  Pre-basis for lowest order Taylor-Hood basis. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_<_ _G_V_,_ _k_,_ _R_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_V_e_l_o_c_i_t_y_T_r_e_e_<_ _G_V_ _> │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_B_a_s_i_s_T_r_e_e_<_ _G_V_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y │ │ │ │ │   │ │ │ │ │ TTyyppeeddeeffss │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s< _L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s< │ │ │ │ │ - GV, k, R > > │ │ │ │ │ -  Nodal basis of a scalar k-th-order Lagrangean finite element space. │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s< │ │ │ │ │ + _T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s< GV > > │ │ │ │ │ +  Nodal basis for a lowest order Taylor-Hood Lagrangean finite element │ │ │ │ │ + space. │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_l_a_g_r_a_n_g_e () │ │ │ │ │ -  Create a pre-basis factory that can create a Lagrange pre-basis. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_l_a_g_r_a_n_g_e (int order) │ │ │ │ │ -  Create a pre-basis factory that can create a Lagrange pre-basis with a │ │ │ │ │ - run-time order. │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_t_a_y_l_o_r_H_o_o_d () │ │ │ │ │ +  Create a pre-basis factory that can create a Taylor-Hood pre-basis. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00116_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: lagrangebasis.hh Source File │ │ │ │ +dune-functions: taylorhoodbasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,590 +74,412 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
lagrangebasis.hh
│ │ │ │ +
taylorhoodbasis.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TAYLORHOODBASIS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TAYLORHOODBASIS_HH
│ │ │ │
9
│ │ │ │ -
10#include <type_traits>
│ │ │ │ -
11#include <dune/common/exceptions.hh>
│ │ │ │ -
12
│ │ │ │ -
13#include <dune/localfunctions/lagrange.hh>
│ │ │ │ -
14#include <dune/localfunctions/lagrange/equidistantpoints.hh>
│ │ │ │ -
15#include <dune/localfunctions/lagrange/lagrangelfecache.hh>
│ │ │ │ +
10#include <dune/common/exceptions.hh>
│ │ │ │ +
11#include <dune/common/reservedvector.hh>
│ │ │ │ +
12#include <dune/common/indices.hh>
│ │ │ │ +
13
│ │ │ │ +
14#include <dune/typetree/powernode.hh>
│ │ │ │ +
15#include <dune/typetree/compositenode.hh>
│ │ │ │
16
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
20
│ │ │ │ + │ │ │ │ +
18
│ │ │ │ + │ │ │ │ + │ │ │ │
21
│ │ │ │
22namespace Dune {
│ │ │ │
23namespace Functions {
│ │ │ │
24
│ │ │ │ -
25// *****************************************************************************
│ │ │ │ -
26// This is the reusable part of the LagrangeBasis. It contains
│ │ │ │ -
27//
│ │ │ │ -
28// LagrangePreBasis
│ │ │ │ -
29// LagrangeNode
│ │ │ │ -
30//
│ │ │ │ -
31// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ -
32// state. These components do _not_ depend on the global basis and local view
│ │ │ │ -
33// and can be used without a global basis.
│ │ │ │ -
34// *****************************************************************************
│ │ │ │ -
35
│ │ │ │ -
36template<typename GV, int k, typename R=double>
│ │ │ │ -
37class LagrangeNode;
│ │ │ │ -
38
│ │ │ │ -
39template<typename GV, int k, typename R=double>
│ │ │ │ -
40class LagrangePreBasis;
│ │ │ │ -
41
│ │ │ │ -
42
│ │ │ │ +
25
│ │ │ │ +
26// *****************************************************************************
│ │ │ │ +
27// This is the reusable part of the basis. It contains
│ │ │ │ +
28//
│ │ │ │ +
29// TaylorHoodPreBasis
│ │ │ │ +
30// TaylorHoodBasisTree
│ │ │ │ +
31// TaylorHoodVelocityTree
│ │ │ │ +
32//
│ │ │ │ +
33// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ +
34// state. These components do _not_ depend on the global basis and local view
│ │ │ │ +
35// and can be used without a global basis.
│ │ │ │ +
36// *****************************************************************************
│ │ │ │ +
37
│ │ │ │ +
38template<typename GV>
│ │ │ │ +
39class TaylorHoodVelocityTree;
│ │ │ │ +
40
│ │ │ │ +
41template<typename GV>
│ │ │ │ +
42class TaylorHoodBasisTree;
│ │ │ │
43
│ │ │ │ -
58template<typename GV, int k, typename R>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
60 public LeafPreBasisMixin< LagrangePreBasis<GV,k,R> >
│ │ │ │ -
61{
│ │ │ │ -
62 static const int dim = GV::dimension;
│ │ │ │ -
63 static const bool useDynamicOrder = (k<0);
│ │ │ │ -
64
│ │ │ │ -
65public:
│ │ │ │ -
66
│ │ │ │ -
68 using GridView = GV;
│ │ │ │ +
63template<typename GV, bool HI=false>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
65{
│ │ │ │ +
66 static const bool useHybridIndices = HI;
│ │ │ │ +
67
│ │ │ │ +
68 static const int dim = GV::dimension;
│ │ │ │
69
│ │ │ │ -
71 using size_type = std::size_t;
│ │ │ │ -
72
│ │ │ │ - │ │ │ │ -
75
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
78 : LagrangePreBasis(gv, std::numeric_limits<unsigned int>::max())
│ │ │ │ -
79 {}
│ │ │ │ -
│ │ │ │ +
70public:
│ │ │ │ +
71
│ │ │ │ +
73 using GridView = GV;
│ │ │ │ +
74
│ │ │ │ +
76 using size_type = std::size_t;
│ │ │ │ +
77
│ │ │ │ + │ │ │ │
80
│ │ │ │ -
│ │ │ │ -
82 LagrangePreBasis(const GridView& gv, unsigned int order) :
│ │ │ │ - │ │ │ │ -
84 {
│ │ │ │ -
85 if (!useDynamicOrder && order!=std::numeric_limits<unsigned int>::max())
│ │ │ │ -
86 DUNE_THROW(RangeError, "Template argument k has to be -1 when supplying a run-time order!");
│ │ │ │ -
87
│ │ │ │ -
88 for (int i=0; i<=dim; i++)
│ │ │ │ -
89 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
92 }
│ │ │ │ - │ │ │ │ - │ │ │ │ -
95 }
│ │ │ │ -
│ │ │ │ -
96
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
99 {
│ │ │ │ -
100 vertexOffset_ = 0;
│ │ │ │ - │ │ │ │ -
102
│ │ │ │ -
103 if (dim>=2)
│ │ │ │ -
104 {
│ │ │ │ - │ │ │ │ -
106
│ │ │ │ -
107 quadrilateralOffset_ = triangleOffset_ + dofsPerSimplex(2) * ((size_type)gridView_.size(Dune::GeometryTypes::triangle));
│ │ │ │ -
108 }
│ │ │ │ -
109
│ │ │ │ -
110 if (dim==3) {
│ │ │ │ -
111 tetrahedronOffset_ = quadrilateralOffset_ + dofsPerCube(2) * ((size_type)gridView_.size(Dune::GeometryTypes::quadrilateral));
│ │ │ │ -
112
│ │ │ │ -
113 prismOffset_ = tetrahedronOffset_ + dofsPerSimplex(3) * ((size_type)gridView_.size(Dune::GeometryTypes::tetrahedron));
│ │ │ │ -
114
│ │ │ │ -
115 hexahedronOffset_ = prismOffset_ + dofsPerPrism() * ((size_type)gridView_.size(Dune::GeometryTypes::prism));
│ │ │ │ -
116
│ │ │ │ -
117 pyramidOffset_ = hexahedronOffset_ + dofsPerCube(3) * ((size_type)gridView_.size(Dune::GeometryTypes::hexahedron));
│ │ │ │ -
118 }
│ │ │ │ -
119 }
│ │ │ │ +
81 static constexpr size_type maxMultiIndexSize = useHybridIndices ? 3 : 2;
│ │ │ │ +
82 static constexpr size_type minMultiIndexSize = 2;
│ │ │ │ + │ │ │ │ +
84
│ │ │ │ +
85private:
│ │ │ │ +
86
│ │ │ │ + │ │ │ │ + │ │ │ │ +
89
│ │ │ │ +
90public:
│ │ │ │ +
91
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
94 gridView_(gv),
│ │ │ │ +
95 pq1PreBasis_(gv),
│ │ │ │ +
96 pq2PreBasis_(gv)
│ │ │ │ +
97 {}
│ │ │ │ +
│ │ │ │ +
98
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
101 {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
104 }
│ │ │ │ +
│ │ │ │ +
105
│ │ │ │ +
│ │ │ │ +
107 const GridView& gridView() const
│ │ │ │ +
108 {
│ │ │ │ +
109 return gridView_;
│ │ │ │ +
110 }
│ │ │ │ +
│ │ │ │ +
111
│ │ │ │ +
│ │ │ │ +
113 void update (const GridView& gv)
│ │ │ │ +
114 {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
117 }
│ │ │ │
│ │ │ │ -
120
│ │ │ │ +
118
│ │ │ │
│ │ │ │ -
122 const GridView& gridView() const
│ │ │ │ + │ │ │ │
123 {
│ │ │ │ -
124 return gridView_;
│ │ │ │ +
124 return Node{};
│ │ │ │
125 }
│ │ │ │
│ │ │ │
126
│ │ │ │
│ │ │ │ -
128 void update (const GridView& gv)
│ │ │ │ -
129 {
│ │ │ │ -
130 gridView_ = gv;
│ │ │ │ + │ │ │ │ +
129 {
│ │ │ │ +
130 return 2;
│ │ │ │
131 }
│ │ │ │
│ │ │ │
132
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
137 {
│ │ │ │ -
138 return Node{order_};
│ │ │ │ -
139 }
│ │ │ │ -
│ │ │ │ -
140
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
143 {
│ │ │ │ -
144 switch (dim)
│ │ │ │ -
145 {
│ │ │ │ -
146 case 1:
│ │ │ │ -
147 return dofsPerCube(0) * ((size_type)gridView_.size(dim))
│ │ │ │ -
148 + dofsPerCube(1) * ((size_type)gridView_.size(dim-1));
│ │ │ │ -
149 case 2:
│ │ │ │ -
150 {
│ │ │ │ -
151 return dofsPerCube(0) * ((size_type)gridView_.size(dim))
│ │ │ │ -
152 + dofsPerCube(1) * ((size_type)gridView_.size(dim-1))
│ │ │ │ -
153 + dofsPerSimplex(2) * ((size_type)gridView_.size(Dune::GeometryTypes::triangle))
│ │ │ │ -
154 + dofsPerCube(2) * ((size_type)gridView_.size(Dune::GeometryTypes::quadrilateral));
│ │ │ │ -
155 }
│ │ │ │ -
156 case 3:
│ │ │ │ -
157 {
│ │ │ │ -
158 return dofsPerCube(0) * ((size_type)gridView_.size(dim))
│ │ │ │ -
159 + dofsPerCube(1) * ((size_type)gridView_.size(dim-1))
│ │ │ │ -
160 + dofsPerSimplex(2) * ((size_type)gridView_.size(Dune::GeometryTypes::triangle))
│ │ │ │ -
161 + dofsPerCube(2) * ((size_type)gridView_.size(Dune::GeometryTypes::quadrilateral))
│ │ │ │ -
162 + dofsPerSimplex(3) * ((size_type)gridView_.size(Dune::GeometryTypes::tetrahedron))
│ │ │ │ -
163 + dofsPerPyramid() * ((size_type)gridView_.size(Dune::GeometryTypes::pyramid))
│ │ │ │ -
164 + dofsPerPrism() * ((size_type)gridView_.size(Dune::GeometryTypes::prism))
│ │ │ │ -
165 + dofsPerCube(3) * ((size_type)gridView_.size(Dune::GeometryTypes::hexahedron));
│ │ │ │ -
166 }
│ │ │ │ -
167 }
│ │ │ │ -
168 DUNE_THROW(Dune::NotImplemented, "No size method for " << dim << "d grids available yet!");
│ │ │ │ -
169 }
│ │ │ │ -
│ │ │ │ -
170
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
173 {
│ │ │ │ -
174 // That cast to unsigned int is necessary because GV::dimension is an enum,
│ │ │ │ -
175 // which is not recognized by the power method as an integer type...
│ │ │ │ -
176 return power(order()+1, (unsigned int)GV::dimension);
│ │ │ │ -
177 }
│ │ │ │ -
│ │ │ │ -
178
│ │ │ │ -
179 template<typename It>
│ │ │ │ -
│ │ │ │ -
180 It indices(const Node& node, It it) const
│ │ │ │ -
181 {
│ │ │ │ -
182 for (size_type i = 0, end = node.finiteElement().size() ; i < end ; ++it, ++i)
│ │ │ │ -
183 {
│ │ │ │ -
184 Dune::LocalKey localKey = node.finiteElement().localCoefficients().localKey(i);
│ │ │ │ -
185 const auto& gridIndexSet = gridView().indexSet();
│ │ │ │ -
186 const auto& element = node.element();
│ │ │ │ -
187
│ │ │ │ -
188 // The dimension of the entity that the current dof is related to
│ │ │ │ -
189 auto dofDim = dim - localKey.codim();
│ │ │ │ +
134 template<class SizePrefix>
│ │ │ │ +
│ │ │ │ +
135 size_type size(const SizePrefix& prefix) const
│ │ │ │ +
136 {
│ │ │ │ +
137 return sizeImp<useHybridIndices>(prefix);
│ │ │ │ +
138 }
│ │ │ │ +
│ │ │ │ +
139
│ │ │ │ +
140private:
│ │ │ │ +
141
│ │ │ │ +
142 template<bool hi, class SizePrefix,
│ │ │ │ +
143 std::enable_if_t<not hi,int> = 0>
│ │ │ │ +
144 size_type sizeImp(const SizePrefix& prefix) const
│ │ │ │ +
145 {
│ │ │ │ +
146 if (prefix.size() == 0)
│ │ │ │ +
147 return 2;
│ │ │ │ +
148 if (prefix.size() == 1)
│ │ │ │ +
149 {
│ │ │ │ +
150 if (prefix[0] == 0)
│ │ │ │ +
151 return dim * pq2PreBasis_.size();
│ │ │ │ +
152 if (prefix[0] == 1)
│ │ │ │ +
153 return pq1PreBasis_.size();
│ │ │ │ +
154 }
│ │ │ │ +
155 assert(prefix.size() == 2);
│ │ │ │ +
156 return 0;
│ │ │ │ +
157 }
│ │ │ │ +
158
│ │ │ │ +
159 template<bool hi, class SizePrefix,
│ │ │ │ +
160 std::enable_if_t<hi,int> = 0>
│ │ │ │ +
161 size_type sizeImp(const SizePrefix& prefix) const
│ │ │ │ +
162 {
│ │ │ │ +
163 if (prefix.size() == 0)
│ │ │ │ +
164 return 2;
│ │ │ │ +
165 if (prefix.size() == 1)
│ │ │ │ +
166 {
│ │ │ │ +
167 if (prefix[0] == 0)
│ │ │ │ +
168 return pq2PreBasis_.size();
│ │ │ │ +
169 if (prefix[0] == 1)
│ │ │ │ +
170 return pq1PreBasis_.size();
│ │ │ │ +
171 }
│ │ │ │ +
172 if (prefix.size() == 2)
│ │ │ │ +
173 {
│ │ │ │ +
174 if (prefix[0] == 0)
│ │ │ │ +
175 return dim;
│ │ │ │ +
176 if (prefix[0] == 1)
│ │ │ │ +
177 return 0;
│ │ │ │ +
178 }
│ │ │ │ +
179 assert(prefix.size() == 3);
│ │ │ │ +
180 return 0;
│ │ │ │ +
181 }
│ │ │ │ +
182
│ │ │ │ +
183public:
│ │ │ │ +
184
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
187 {
│ │ │ │ +
188 return dim * pq2PreBasis_.size() + pq1PreBasis_.size();
│ │ │ │ +
189 }
│ │ │ │ +
│ │ │ │
190
│ │ │ │ -
191 // Test for a vertex dof
│ │ │ │ -
192 // The test for k==1 is redundant, but having it here allows the compiler to conclude
│ │ │ │ -
193 // at compile-time that the dofDim==0 case is the only one that will ever happen.
│ │ │ │ -
194 // This leads to measurable speed-up: see
│ │ │ │ -
195 // https://gitlab.dune-project.org/staging/dune-functions/issues/30
│ │ │ │ -
196 if (k==1 || dofDim==0) {
│ │ │ │ -
197 *it = {{ (size_type)(gridIndexSet.subIndex(element,localKey.subEntity(),dim)) }};
│ │ │ │ -
198 continue;
│ │ │ │ -
199 }
│ │ │ │ -
200
│ │ │ │ -
201 if (dofDim==1)
│ │ │ │ -
202 { // edge dof
│ │ │ │ -
203 if (dim==1) // element dof -- any local numbering is fine
│ │ │ │ -
204 {
│ │ │ │ -
205 *it = {{ edgeOffset_
│ │ │ │ -
206 + dofsPerCube(1) * ((size_type)gridIndexSet.subIndex(element,0,0))
│ │ │ │ -
207 + localKey.index() }};
│ │ │ │ -
208 continue;
│ │ │ │ -
209 }
│ │ │ │ -
210 else
│ │ │ │ -
211 {
│ │ │ │ -
212 const auto refElement
│ │ │ │ -
213 = Dune::referenceElement<double,dim>(element.type());
│ │ │ │ -
214
│ │ │ │ -
215 // We have to reverse the numbering if the local element edge is
│ │ │ │ -
216 // not aligned with the global edge.
│ │ │ │ -
217 auto v0 = (size_type)gridIndexSet.subIndex(element,refElement.subEntity(localKey.subEntity(),localKey.codim(),0,dim),dim);
│ │ │ │ -
218 auto v1 = (size_type)gridIndexSet.subIndex(element,refElement.subEntity(localKey.subEntity(),localKey.codim(),1,dim),dim);
│ │ │ │ -
219 bool flip = (v0 > v1);
│ │ │ │ -
220 *it = {{ (flip)
│ │ │ │ - │ │ │ │ -
222 + dofsPerCube(1)*((size_type)gridIndexSet.subIndex(element,localKey.subEntity(),localKey.codim()))
│ │ │ │ -
223 + (dofsPerCube(1)-1)-localKey.index()
│ │ │ │ - │ │ │ │ -
225 + dofsPerCube(1)*((size_type)gridIndexSet.subIndex(element,localKey.subEntity(),localKey.codim()))
│ │ │ │ -
226 + localKey.index() }};
│ │ │ │ -
227 continue;
│ │ │ │ -
228 }
│ │ │ │ -
229 }
│ │ │ │ -
230
│ │ │ │ -
231 if (dofDim==2)
│ │ │ │ -
232 {
│ │ │ │ -
233 if (dim==2) // element dof -- any local numbering is fine
│ │ │ │ -
234 {
│ │ │ │ -
235 if (element.type().isTriangle())
│ │ │ │ -
236 {
│ │ │ │ -
237 *it = {{ triangleOffset_ + dofsPerSimplex(2)*((size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }};
│ │ │ │ -
238 continue;
│ │ │ │ -
239 }
│ │ │ │ -
240 else if (element.type().isQuadrilateral())
│ │ │ │ -
241 {
│ │ │ │ -
242 *it = {{ quadrilateralOffset_ + dofsPerCube(2)*((size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }};
│ │ │ │ -
243 continue;
│ │ │ │ -
244 }
│ │ │ │ -
245 else
│ │ │ │ -
246 DUNE_THROW(Dune::NotImplemented, "2d elements have to be triangles or quadrilaterals");
│ │ │ │ -
247 } else
│ │ │ │ -
248 {
│ │ │ │ -
249 const auto refElement
│ │ │ │ -
250 = Dune::referenceElement<double,dim>(element.type());
│ │ │ │ -
251
│ │ │ │ -
252 if (order()>3)
│ │ │ │ -
253 DUNE_THROW(Dune::NotImplemented, "LagrangeBasis for 3D grids is only implemented if k<=3");
│ │ │ │ -
254
│ │ │ │ -
255 if (order()==3 and !refElement.type(localKey.subEntity(), localKey.codim()).isTriangle())
│ │ │ │ -
256 DUNE_THROW(Dune::NotImplemented, "LagrangeBasis for 3D grids with k==3 is only implemented if the grid is a simplex grid");
│ │ │ │ -
257
│ │ │ │ -
258 *it = {{ triangleOffset_ + ((size_type)gridIndexSet.subIndex(element,localKey.subEntity(),localKey.codim())) }};
│ │ │ │ -
259 continue;
│ │ │ │ -
260 }
│ │ │ │ -
261 }
│ │ │ │ -
262
│ │ │ │ -
263 if (dofDim==3)
│ │ │ │ -
264 {
│ │ │ │ -
265 if (dim==3) // element dof -- any local numbering is fine
│ │ │ │ -
266 {
│ │ │ │ -
267 if (element.type().isTetrahedron())
│ │ │ │ -
268 {
│ │ │ │ -
269 *it = {{ tetrahedronOffset_ + dofsPerSimplex(3)*((size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }};
│ │ │ │ -
270 continue;
│ │ │ │ -
271 }
│ │ │ │ -
272 else if (element.type().isHexahedron())
│ │ │ │ -
273 {
│ │ │ │ -
274 *it = {{ hexahedronOffset_ + dofsPerCube(3)*((size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }};
│ │ │ │ -
275 continue;
│ │ │ │ -
276 }
│ │ │ │ -
277 else if (element.type().isPrism())
│ │ │ │ -
278 {
│ │ │ │ -
279 *it = {{ prismOffset_ + dofsPerPrism()*((size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }};
│ │ │ │ -
280 continue;
│ │ │ │ -
281 }
│ │ │ │ -
282 else if (element.type().isPyramid())
│ │ │ │ -
283 {
│ │ │ │ -
284 *it = {{ pyramidOffset_ + dofsPerPyramid()*((size_type)gridIndexSet.subIndex(element,0,0)) + localKey.index() }};
│ │ │ │ -
285 continue;
│ │ │ │ -
286 }
│ │ │ │ -
287 else
│ │ │ │ -
288 DUNE_THROW(Dune::NotImplemented, "3d elements have to be tetrahedra, hexahedra, prisms, or pyramids");
│ │ │ │ -
289 } else
│ │ │ │ -
290 DUNE_THROW(Dune::NotImplemented, "Grids of dimension larger than 3 are no supported");
│ │ │ │ -
291 }
│ │ │ │ -
292 DUNE_THROW(Dune::NotImplemented, "Grid contains elements not supported for the LagrangeBasis");
│ │ │ │ -
293 }
│ │ │ │ -
294 return it;
│ │ │ │ -
295 }
│ │ │ │ -
│ │ │ │ -
296
│ │ │ │ -
│ │ │ │ -
298 unsigned int order() const
│ │ │ │ -
299 {
│ │ │ │ -
300 return (useDynamicOrder) ? order_ : k;
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
193 {
│ │ │ │ + │ │ │ │ +
195 }
│ │ │ │ +
│ │ │ │ +
196
│ │ │ │ +
197 template<typename It>
│ │ │ │ +
│ │ │ │ +
198 It indices(const Node& node, It it) const
│ │ │ │ +
199 {
│ │ │ │ +
200 return indicesImp<useHybridIndices>(node, it);
│ │ │ │ +
201 }
│ │ │ │ +
│ │ │ │ +
202
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
209 {
│ │ │ │ + │ │ │ │ +
211 if constexpr(HI)
│ │ │ │ +
212 return CD::makeDescriptor(
│ │ │ │ +
213 CD::makeUniformDescriptor(pq2PreBasis_.size(),
│ │ │ │ +
214 CD::FlatArray<GV::dimension>{}),
│ │ │ │ +
215 CD::FlatVector{pq1PreBasis_.size()});
│ │ │ │ +
216 else
│ │ │ │ +
217 return CD::Array<CD::FlatVector,2>{
│ │ │ │ +
218 CD::FlatVector{GV::dimension * pq2PreBasis_.size()},
│ │ │ │ +
219 CD::FlatVector{pq1PreBasis_.size()} };
│ │ │ │ +
220 }
│ │ │ │ +
│ │ │ │ +
221
│ │ │ │ +
222protected:
│ │ │ │ +
223
│ │ │ │ +
224 template<class MultiIndex>
│ │ │ │ +
│ │ │ │ +
225 static const void multiIndexPushFront(MultiIndex& M, size_type M0)
│ │ │ │ +
226 {
│ │ │ │ +
227 M.resize(M.size()+1);
│ │ │ │ +
228 for(std::size_t i=M.size()-1; i>0; --i)
│ │ │ │ +
229 M[i] = M[i-1];
│ │ │ │ +
230 M[0] = M0;
│ │ │ │ +
231 }
│ │ │ │ +
│ │ │ │ +
232
│ │ │ │ +
233 template<bool hi, class It,
│ │ │ │ +
234 std::enable_if_t<not hi,int> = 0>
│ │ │ │ +
│ │ │ │ +
235 It indicesImp(const Node& node, It multiIndices) const
│ │ │ │ +
236 {
│ │ │ │ +
237 using namespace Dune::Indices;
│ │ │ │ +
238 for(std::size_t child=0; child<dim; ++child)
│ │ │ │ +
239 {
│ │ │ │ +
240 size_type subTreeSize = node.child(_0, 0).size();
│ │ │ │ +
241 pq2PreBasis_.indices(node.child(_0, 0), multiIndices);
│ │ │ │ +
242 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ +
243 {
│ │ │ │ +
244 multiIndexPushFront(multiIndices[i], 0);
│ │ │ │ +
245 multiIndices[i][1] = multiIndices[i][1]*dim + child;
│ │ │ │ +
246 }
│ │ │ │ +
247 multiIndices += subTreeSize;
│ │ │ │ +
248 }
│ │ │ │ +
249 size_type subTreeSize = node.child(_1).size();
│ │ │ │ +
250 pq1PreBasis_.indices(node.child(_1), multiIndices);
│ │ │ │ +
251 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ +
252 multiIndexPushFront(multiIndices[i], 1);
│ │ │ │ +
253 multiIndices += subTreeSize;
│ │ │ │ +
254 return multiIndices;
│ │ │ │ +
255 }
│ │ │ │ +
│ │ │ │ +
256
│ │ │ │ +
257 template<bool hi, class It,
│ │ │ │ +
258 std::enable_if_t<hi,int> = 0>
│ │ │ │ +
│ │ │ │ +
259 It indicesImp(const Node& node, It multiIndices) const
│ │ │ │ +
260 {
│ │ │ │ +
261 using namespace Dune::Indices;
│ │ │ │ +
262 for(std::size_t child=0; child<dim; ++child)
│ │ │ │ +
263 {
│ │ │ │ +
264 size_type subTreeSize = node.child(_0, 0).size();
│ │ │ │ +
265 pq2PreBasis_.indices(node.child(_0, 0), multiIndices);
│ │ │ │ +
266 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ +
267 {
│ │ │ │ +
268 multiIndexPushFront(multiIndices[i], 0);
│ │ │ │ +
269 multiIndices[i].push_back(i);
│ │ │ │ +
270 }
│ │ │ │ +
271 multiIndices += subTreeSize;
│ │ │ │ +
272 }
│ │ │ │ +
273 size_type subTreeSize = node.child(_1).size();
│ │ │ │ +
274 pq1PreBasis_.indices(node.child(_1), multiIndices);
│ │ │ │ +
275 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ +
276 multiIndexPushFront(multiIndices[i], 1);
│ │ │ │ +
277 multiIndices += subTreeSize;
│ │ │ │ +
278 return multiIndices;
│ │ │ │ +
279 }
│ │ │ │ +
│ │ │ │ +
280
│ │ │ │ + │ │ │ │ +
282
│ │ │ │ + │ │ │ │ + │ │ │ │ +
285};
│ │ │ │ +
│ │ │ │ +
286
│ │ │ │ +
287
│ │ │ │ +
288
│ │ │ │ +
289template<typename GV>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
291 public PowerBasisNode<LagrangeNode<GV,2>, GV::dimension>
│ │ │ │ +
292{
│ │ │ │ + │ │ │ │ + │ │ │ │ +
295
│ │ │ │ +
296public:
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
298 {
│ │ │ │ +
299 for(int i=0; i<GV::dimension; ++i)
│ │ │ │ +
300 this->setChild(i, std::make_shared<PQ2Node>());
│ │ │ │
301 }
│ │ │ │
│ │ │ │ -
302
│ │ │ │ -
303protected:
│ │ │ │ - │ │ │ │ -
305
│ │ │ │ -
306 // Run-time order, only valid if k<0
│ │ │ │ -
307 unsigned int order_;
│ │ │ │ -
308
│ │ │ │ -
│ │ │ │ -
310 size_type dofsPerSimplex(std::size_t simplexDim) const
│ │ │ │ -
311 {
│ │ │ │ -
312 return useDynamicOrder ? dofsPerSimplex_[simplexDim] : computeDofsPerSimplex(simplexDim);
│ │ │ │ -
313 }
│ │ │ │ -
│ │ │ │ -
314
│ │ │ │ -
│ │ │ │ -
316 size_type dofsPerCube(std::size_t cubeDim) const
│ │ │ │ -
317 {
│ │ │ │ -
318 return useDynamicOrder ? dofsPerCube_[cubeDim] : computeDofsPerCube(cubeDim);
│ │ │ │ -
319 }
│ │ │ │ -
│ │ │ │ -
320
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
322 {
│ │ │ │ -
323 return useDynamicOrder ? dofsPerPrism_ : computeDofsPerPrism();
│ │ │ │ -
324 }
│ │ │ │ +
302};
│ │ │ │ +
│ │ │ │ +
303
│ │ │ │ +
304template<typename GV>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
306 public CompositeBasisNode<
│ │ │ │ +
307 TaylorHoodVelocityTree<GV>,
│ │ │ │ +
308 LagrangeNode<GV,1>
│ │ │ │ +
309 >
│ │ │ │ +
310{
│ │ │ │ + │ │ │ │ + │ │ │ │ +
313
│ │ │ │ + │ │ │ │ +
315
│ │ │ │ +
316public:
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
318 {
│ │ │ │ +
319 this->template setChild<0>(std::make_shared<VelocityNode>());
│ │ │ │ +
320 this->template setChild<1>(std::make_shared<PressureNode>());
│ │ │ │ +
321 }
│ │ │ │
│ │ │ │ +
322};
│ │ │ │ +
│ │ │ │ +
323
│ │ │ │ +
324
│ │ │ │
325
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
327 {
│ │ │ │ -
328 return useDynamicOrder ? dofsPerPyramid_ : computeDofsPerPyramid();
│ │ │ │ -
329 }
│ │ │ │ -
│ │ │ │ -
330
│ │ │ │ -
│ │ │ │ -
332 size_type computeDofsPerSimplex(std::size_t simplexDim) const
│ │ │ │ -
333 {
│ │ │ │ -
334 return order() == 0 ? (dim == simplexDim ? 1 : 0) : Dune::binomial(std::size_t(order()-1),simplexDim);
│ │ │ │ -
335 }
│ │ │ │ -
│ │ │ │ -
336
│ │ │ │ -
│ │ │ │ -
338 size_type computeDofsPerCube(std::size_t cubeDim) const
│ │ │ │ -
339 {
│ │ │ │ -
340 return order() == 0 ? (dim == cubeDim ? 1 : 0) : Dune::power(order()-1, cubeDim);
│ │ │ │ -
341 }
│ │ │ │ +
326namespace BasisFactory {
│ │ │ │ +
327
│ │ │ │ +
│ │ │ │ +
334inline auto taylorHood()
│ │ │ │ +
335{
│ │ │ │ +
336 return [](const auto& gridView) {
│ │ │ │ +
337 return TaylorHoodPreBasis<std::decay_t<decltype(gridView)>>(gridView);
│ │ │ │ +
338 };
│ │ │ │ +
339}
│ │ │ │
│ │ │ │ +
340
│ │ │ │ +
341} // end namespace BasisFactory
│ │ │ │
342
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
344 {
│ │ │ │ -
345 return order() == 0 ? (dim == 3 ? 1 : 0) : (order()-1)*(order()-1)*(order()-2)/2;
│ │ │ │ -
346 }
│ │ │ │ -
│ │ │ │ -
347
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
349 {
│ │ │ │ -
350 return order() == 0 ? (dim == 3 ? 1 : 0) : (order()-2)*(order()-1)*(2*order()-3)/6;
│ │ │ │ -
351 }
│ │ │ │ -
│ │ │ │ -
352
│ │ │ │ -
353 // When the order is given at run-time, the following numbers are pre-computed:
│ │ │ │ -
354 std::array<size_type,dim+1> dofsPerSimplex_;
│ │ │ │ -
355 std::array<size_type,dim+1> dofsPerCube_;
│ │ │ │ - │ │ │ │ - │ │ │ │ -
358
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
367
│ │ │ │ -
368};
│ │ │ │ -
│ │ │ │ -
369
│ │ │ │ +
343// *****************************************************************************
│ │ │ │ +
344// This is the actual global basis implementation based on the reusable parts.
│ │ │ │ +
345// *****************************************************************************
│ │ │ │ +
346
│ │ │ │ +
368template<typename GV>
│ │ │ │ + │ │ │ │
370
│ │ │ │
371
│ │ │ │ -
372template<typename GV, int k, typename R>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
374 public LeafBasisNode
│ │ │ │ -
375{
│ │ │ │ -
376 // Stores LocalFiniteElement implementations with run-time order as a function of GeometryType
│ │ │ │ -
377 template<typename Domain, typename Range, int dim>
│ │ │ │ -
378 class LagrangeRunTimeLFECache
│ │ │ │ -
379 {
│ │ │ │ -
380 public:
│ │ │ │ -
381 using FiniteElementType = LagrangeLocalFiniteElement<EquidistantPointSet,dim,Domain,Range>;
│ │ │ │ -
382
│ │ │ │ -
383 const FiniteElementType& get(GeometryType type)
│ │ │ │ -
384 {
│ │ │ │ -
385 auto i = data_.find(type);
│ │ │ │ -
386 if (i==data_.end())
│ │ │ │ -
387 i = data_.emplace(type,FiniteElementType(type,order_)).first;
│ │ │ │ -
388 return (*i).second;
│ │ │ │ -
389 }
│ │ │ │ -
390
│ │ │ │ -
391 std::map<GeometryType, FiniteElementType> data_;
│ │ │ │ -
392 unsigned int order_;
│ │ │ │ -
393 };
│ │ │ │ -
394
│ │ │ │ -
395 static constexpr int dim = GV::dimension;
│ │ │ │ -
396 static constexpr bool useDynamicOrder = (k<0);
│ │ │ │ -
397
│ │ │ │ -
398 using FiniteElementCache = std::conditional_t<(useDynamicOrder),
│ │ │ │ -
399 LagrangeRunTimeLFECache<typename GV::ctype, R, dim>,
│ │ │ │ -
400 LagrangeLocalFiniteElementCache<typename GV::ctype, R, dim, std::max(k,0)>
│ │ │ │ -
401 >;
│ │ │ │ -
402
│ │ │ │ -
403public:
│ │ │ │ -
404
│ │ │ │ -
405 using size_type = std::size_t;
│ │ │ │ -
406 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ -
407 using FiniteElement = typename FiniteElementCache::FiniteElementType;
│ │ │ │ -
408
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
411 finiteElement_(nullptr),
│ │ │ │ -
412 element_(nullptr)
│ │ │ │ -
413 {}
│ │ │ │ -
│ │ │ │ -
414
│ │ │ │ -
│ │ │ │ -
416 LagrangeNode(unsigned int order) :
│ │ │ │ -
417 order_(order),
│ │ │ │ -
418 finiteElement_(nullptr),
│ │ │ │ -
419 element_(nullptr)
│ │ │ │ -
420 {
│ │ │ │ -
421 // Only the cache for the run-time-order case (i.e., k<0), has the 'order_' member
│ │ │ │ -
422 if constexpr (useDynamicOrder)
│ │ │ │ -
423 cache_.order_ = order;
│ │ │ │ -
424 }
│ │ │ │ -
│ │ │ │ -
425
│ │ │ │ -
│ │ │ │ -
427 const Element& element() const
│ │ │ │ -
428 {
│ │ │ │ -
429 return *element_;
│ │ │ │ -
430 }
│ │ │ │ -
│ │ │ │ -
431
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
437 {
│ │ │ │ -
438 return *finiteElement_;
│ │ │ │ -
439 }
│ │ │ │ -
│ │ │ │ -
440
│ │ │ │ -
│ │ │ │ -
442 void bind(const Element& e)
│ │ │ │ -
443 {
│ │ │ │ -
444 element_ = &e;
│ │ │ │ -
445 finiteElement_ = &(cache_.get(element_->type()));
│ │ │ │ -
446 this->setSize(finiteElement_->size());
│ │ │ │ -
447 }
│ │ │ │ -
│ │ │ │ -
448
│ │ │ │ -
449protected:
│ │ │ │ -
450
│ │ │ │ -
│ │ │ │ -
451 unsigned int order() const
│ │ │ │ -
452 {
│ │ │ │ -
453 return (useDynamicOrder) ? order_ : k;
│ │ │ │ -
454 }
│ │ │ │ -
│ │ │ │ -
455
│ │ │ │ -
456 // Run-time order, only valid if k<0
│ │ │ │ -
457 unsigned int order_;
│ │ │ │ -
458
│ │ │ │ -
459 FiniteElementCache cache_;
│ │ │ │ - │ │ │ │ - │ │ │ │ -
462};
│ │ │ │ -
│ │ │ │ -
463
│ │ │ │ -
464
│ │ │ │ -
465
│ │ │ │ -
466namespace BasisFactory {
│ │ │ │ -
467
│ │ │ │ -
476template<std::size_t k, typename R=double>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
478{
│ │ │ │ -
479 return [](const auto& gridView) {
│ │ │ │ -
480 return LagrangePreBasis<std::decay_t<decltype(gridView)>, k, R>(gridView);
│ │ │ │ -
481 };
│ │ │ │ -
482}
│ │ │ │ -
│ │ │ │ -
483
│ │ │ │ -
491template<typename R=double>
│ │ │ │ -
│ │ │ │ -
492auto lagrange(int order)
│ │ │ │ -
493{
│ │ │ │ -
494 return [=](const auto& gridView) {
│ │ │ │ -
495 return LagrangePreBasis<std::decay_t<decltype(gridView)>, -1, R>(gridView, order);
│ │ │ │ -
496 };
│ │ │ │ -
497}
│ │ │ │ -
│ │ │ │ -
498
│ │ │ │ -
499} // end namespace BasisFactory
│ │ │ │ -
500
│ │ │ │ -
501
│ │ │ │ -
502
│ │ │ │ -
526template<typename GV, int k=-1, typename R=double>
│ │ │ │ - │ │ │ │ -
528
│ │ │ │ -
529
│ │ │ │ -
530
│ │ │ │ -
531
│ │ │ │ -
532
│ │ │ │ -
533} // end namespace Functions
│ │ │ │ -
534} // end namespace Dune
│ │ │ │ -
535
│ │ │ │ -
536
│ │ │ │ -
537#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
auto lagrange()
Create a pre-basis factory that can create a Lagrange pre-basis.
Definition lagrangebasis.hh:477
│ │ │ │ +
372
│ │ │ │ +
373} // end namespace Functions
│ │ │ │ +
374} // end namespace Dune
│ │ │ │ +
375
│ │ │ │ +
376
│ │ │ │ +
377#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TAYLORHOODBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
auto taylorHood()
Create a pre-basis factory that can create a Taylor-Hood pre-basis.
Definition taylorhoodbasis.hh:334
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ +
Definition containerdescriptors.hh:47
│ │ │ │
Global basis for given pre-basis.
Definition defaultglobalbasis.hh:50
│ │ │ │
Definition lagrangebasis.hh:375
│ │ │ │ -
LagrangeNode(unsigned int order)
Constructor with a run-time order.
Definition lagrangebasis.hh:416
│ │ │ │ -
unsigned int order() const
Definition lagrangebasis.hh:451
│ │ │ │ -
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition lagrangebasis.hh:436
│ │ │ │ -
const Element * element_
Definition lagrangebasis.hh:461
│ │ │ │ -
const Element & element() const
Return current element, throw if unbound.
Definition lagrangebasis.hh:427
│ │ │ │ -
FiniteElementCache cache_
Definition lagrangebasis.hh:459
│ │ │ │ -
typename FiniteElementCache::FiniteElementType FiniteElement
Definition lagrangebasis.hh:407
│ │ │ │ -
void bind(const Element &e)
Bind to element.
Definition lagrangebasis.hh:442
│ │ │ │ -
typename GV::template Codim< 0 >::Entity Element
Definition lagrangebasis.hh:406
│ │ │ │ -
const FiniteElement * finiteElement_
Definition lagrangebasis.hh:460
│ │ │ │ -
unsigned int order_
Definition lagrangebasis.hh:457
│ │ │ │ -
std::size_t size_type
Definition lagrangebasis.hh:405
│ │ │ │ -
LagrangeNode()
Constructor without order (uses the compile-time value)
Definition lagrangebasis.hh:410
│ │ │ │ -
A pre-basis for a PQ-lagrange bases with given order.
Definition lagrangebasis.hh:61
│ │ │ │ -
size_type dofsPerPrism() const
Definition lagrangebasis.hh:321
│ │ │ │ -
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:338
│ │ │ │ -
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:332
│ │ │ │ -
size_type computeDofsPerPrism() const
Definition lagrangebasis.hh:343
│ │ │ │ -
unsigned int order_
Definition lagrangebasis.hh:307
│ │ │ │ -
size_type edgeOffset_
Definition lagrangebasis.hh:360
│ │ │ │ -
std::array< size_type, dim+1 > dofsPerSimplex_
Definition lagrangebasis.hh:354
│ │ │ │ + │ │ │ │
It indices(const Node &node, It it) const
Definition lagrangebasis.hh:180
│ │ │ │ -
size_type vertexOffset_
Definition lagrangebasis.hh:359
│ │ │ │ -
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:310
│ │ │ │ -
std::size_t size_type
Type used for indices and size information.
Definition lagrangebasis.hh:71
│ │ │ │ -
size_type pyramidOffset_
Definition lagrangebasis.hh:364
│ │ │ │ -
size_type prismOffset_
Definition lagrangebasis.hh:365
│ │ │ │ -
size_type tetrahedronOffset_
Definition lagrangebasis.hh:363
│ │ │ │
void initializeIndices()
Initialize the global indices.
Definition lagrangebasis.hh:98
│ │ │ │ -
size_type computeDofsPerPyramid() const
Definition lagrangebasis.hh:348
│ │ │ │ -
LagrangePreBasis(const GridView &gv, unsigned int order)
Constructor for a given grid view object and run-time order.
Definition lagrangebasis.hh:82
│ │ │ │ -
size_type dofsPerPyramid_
Definition lagrangebasis.hh:357
│ │ │ │ -
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition lagrangebasis.hh:142
│ │ │ │ -
LagrangePreBasis(const GridView &gv)
Constructor for a given grid view object with compile-time order.
Definition lagrangebasis.hh:77
│ │ │ │
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition lagrangebasis.hh:128
│ │ │ │ -
GV GridView
The grid view that the FE basis is defined on.
Definition lagrangebasis.hh:68
│ │ │ │ -
size_type quadrilateralOffset_
Definition lagrangebasis.hh:362
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition lagrangebasis.hh:122
│ │ │ │ -
GridView gridView_
Definition lagrangebasis.hh:304
│ │ │ │ -
Node makeNode() const
Create tree node.
Definition lagrangebasis.hh:136
│ │ │ │ -
unsigned int order() const
Polynomial order used in the local Lagrange finite-elements.
Definition lagrangebasis.hh:298
│ │ │ │ -
std::array< size_type, dim+1 > dofsPerCube_
Definition lagrangebasis.hh:355
│ │ │ │
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition lagrangebasis.hh:172
│ │ │ │ -
size_type dofsPerPrism_
Definition lagrangebasis.hh:356
│ │ │ │ -
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:316
│ │ │ │ -
size_type triangleOffset_
Definition lagrangebasis.hh:361
│ │ │ │ -
size_type hexahedronOffset_
Definition lagrangebasis.hh:366
│ │ │ │ -
size_type dofsPerPyramid() const
Definition lagrangebasis.hh:326
│ │ │ │ -
A generic MixIn class for PreBasis.
Definition leafprebasismixin.hh:36
│ │ │ │ -
void setSize(const size_type size)
Definition nodes.hh:169
│ │ │ │ -
Definition nodes.hh:191
│ │ │ │ +
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition leafprebasismixin.hh:53
│ │ │ │ +
size_type size() const
Definition nodes.hh:147
│ │ │ │ +
Definition nodes.hh:198
│ │ │ │ + │ │ │ │ +
Definition taylorhoodbasis.hh:292
│ │ │ │ +
TaylorHoodVelocityTree()
Definition taylorhoodbasis.hh:297
│ │ │ │ +
Definition taylorhoodbasis.hh:310
│ │ │ │ +
TaylorHoodBasisTree()
Definition taylorhoodbasis.hh:317
│ │ │ │ +
Pre-basis for lowest order Taylor-Hood basis.
Definition taylorhoodbasis.hh:65
│ │ │ │ +
TaylorHoodPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition taylorhoodbasis.hh:93
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition taylorhoodbasis.hh:107
│ │ │ │ +
static constexpr size_type minMultiIndexSize
Definition taylorhoodbasis.hh:82
│ │ │ │ +
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition taylorhoodbasis.hh:135
│ │ │ │ +
GridView gridView_
Definition taylorhoodbasis.hh:281
│ │ │ │ +
GV GridView
The grid view that the FE basis is defined on.
Definition taylorhoodbasis.hh:73
│ │ │ │ +
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition taylorhoodbasis.hh:113
│ │ │ │ +
auto containerDescriptor() const
Return an container descriptor depending on the flag HI. Either return a Tuple if hybrid indices shou...
Definition taylorhoodbasis.hh:208
│ │ │ │ +
PQ2PreBasis pq2PreBasis_
Definition taylorhoodbasis.hh:284
│ │ │ │ +
size_type size() const
Same as size(prefix) with empty prefix.
Definition taylorhoodbasis.hh:128
│ │ │ │ +
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition taylorhoodbasis.hh:186
│ │ │ │ +
PQ1PreBasis pq1PreBasis_
Definition taylorhoodbasis.hh:283
│ │ │ │ +
static const void multiIndexPushFront(MultiIndex &M, size_type M0)
Definition taylorhoodbasis.hh:225
│ │ │ │ +
static constexpr size_type maxMultiIndexSize
Definition taylorhoodbasis.hh:81
│ │ │ │ +
Node makeNode() const
Create tree node.
Definition taylorhoodbasis.hh:122
│ │ │ │ +
It indices(const Node &node, It it) const
Definition taylorhoodbasis.hh:198
│ │ │ │ +
static constexpr size_type multiIndexBufferSize
Definition taylorhoodbasis.hh:83
│ │ │ │ +
void initializeIndices()
Initialize the global indices.
Definition taylorhoodbasis.hh:100
│ │ │ │ +
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition taylorhoodbasis.hh:192
│ │ │ │ +
std::size_t size_type
Type used for indices and size information.
Definition taylorhoodbasis.hh:76
│ │ │ │ +
It indicesImp(const Node &node, It multiIndices) const
Definition taylorhoodbasis.hh:235
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,715 +1,463 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -lagrangebasis.hh │ │ │ │ │ +taylorhoodbasis.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TAYLORHOODBASIS_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TAYLORHOODBASIS_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12 │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13 │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ 16 │ │ │ │ │ 17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ -18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ -19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ -20 │ │ │ │ │ +18 │ │ │ │ │ +19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_a_g_r_a_n_g_e_b_a_s_i_s_._h_h> │ │ │ │ │ +20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ 21 │ │ │ │ │ 22namespace _D_u_n_e { │ │ │ │ │ 23namespace Functions { │ │ │ │ │ 24 │ │ │ │ │ -25/ │ │ │ │ │ +25 │ │ │ │ │ +26/ │ │ │ │ │ / ***************************************************************************** │ │ │ │ │ -26// This is the reusable part of the LagrangeBasis. It contains │ │ │ │ │ -27// │ │ │ │ │ -28// LagrangePreBasis │ │ │ │ │ -29// LagrangeNode │ │ │ │ │ -30// │ │ │ │ │ -31// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ +27// This is the reusable part of the basis. It contains │ │ │ │ │ +28// │ │ │ │ │ +29// TaylorHoodPreBasis │ │ │ │ │ +30// TaylorHoodBasisTree │ │ │ │ │ +31// TaylorHoodVelocityTree │ │ │ │ │ +32// │ │ │ │ │ +33// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ shared │ │ │ │ │ -32// state. These components do _not_ depend on the global basis and local view │ │ │ │ │ -33// and can be used without a global basis. │ │ │ │ │ -34/ │ │ │ │ │ +34// state. These components do _not_ depend on the global basis and local view │ │ │ │ │ +35// and can be used without a global basis. │ │ │ │ │ +36/ │ │ │ │ │ / ***************************************************************************** │ │ │ │ │ -35 │ │ │ │ │ -36template │ │ │ │ │ -37class LagrangeNode; │ │ │ │ │ -38 │ │ │ │ │ -39template │ │ │ │ │ -40class LagrangePreBasis; │ │ │ │ │ -41 │ │ │ │ │ -42 │ │ │ │ │ +37 │ │ │ │ │ +38template │ │ │ │ │ +39class TaylorHoodVelocityTree; │ │ │ │ │ +40 │ │ │ │ │ +41template │ │ │ │ │ +42class TaylorHoodBasisTree; │ │ │ │ │ 43 │ │ │ │ │ -58template │ │ │ │ │ -_5_9class _L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s : │ │ │ │ │ -60 public _L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n< LagrangePreBasis > │ │ │ │ │ -61{ │ │ │ │ │ -62 static const int dim = GV::dimension; │ │ │ │ │ -63 static const bool useDynamicOrder = (k<0); │ │ │ │ │ -64 │ │ │ │ │ -65public: │ │ │ │ │ -66 │ │ │ │ │ -_6_8 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ +63template │ │ │ │ │ +_6_4class _T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s │ │ │ │ │ +65{ │ │ │ │ │ +66 static const bool useHybridIndices = HI; │ │ │ │ │ +67 │ │ │ │ │ +68 static const int dim = GV::dimension; │ │ │ │ │ 69 │ │ │ │ │ -_7_1 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ -72 │ │ │ │ │ -_7_4 using _N_o_d_e = _L_a_g_r_a_n_g_e_N_o_d_e_<_G_V_,_ _k_,_ _R_>; │ │ │ │ │ -75 │ │ │ │ │ -_7_7 _L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s(const _G_r_i_d_V_i_e_w& gv) │ │ │ │ │ -78 : _L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s(gv, std::numeric_limits::max()) │ │ │ │ │ -79 {} │ │ │ │ │ +70public: │ │ │ │ │ +71 │ │ │ │ │ +_7_3 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ +74 │ │ │ │ │ +_7_6 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ +77 │ │ │ │ │ +_7_9 using _N_o_d_e = _T_a_y_l_o_r_H_o_o_d_B_a_s_i_s_T_r_e_e_<_G_V_>; │ │ │ │ │ 80 │ │ │ │ │ -_8_2 _L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s(const _G_r_i_d_V_i_e_w& gv, unsigned int _o_r_d_e_r) : │ │ │ │ │ -83 _g_r_i_d_V_i_e_w__(gv), _o_r_d_e_r__(_o_r_d_e_r) │ │ │ │ │ -84 { │ │ │ │ │ -85 if (!useDynamicOrder && _o_r_d_e_r!=std::numeric_limits::max()) │ │ │ │ │ -86 DUNE_THROW(RangeError, "Template argument k has to be -1 when supplying a │ │ │ │ │ -run-time order!"); │ │ │ │ │ -87 │ │ │ │ │ -88 for (int i=0; i<=dim; i++) │ │ │ │ │ -89 { │ │ │ │ │ -90 _d_o_f_s_P_e_r_C_u_b_e__[i] = _c_o_m_p_u_t_e_D_o_f_s_P_e_r_C_u_b_e(i); │ │ │ │ │ -91 _d_o_f_s_P_e_r_S_i_m_p_l_e_x__[i] = _c_o_m_p_u_t_e_D_o_f_s_P_e_r_S_i_m_p_l_e_x(i); │ │ │ │ │ -92 } │ │ │ │ │ -93 _d_o_f_s_P_e_r_P_r_i_s_m__ = _c_o_m_p_u_t_e_D_o_f_s_P_e_r_P_r_i_s_m(); │ │ │ │ │ -94 _d_o_f_s_P_e_r_P_y_r_a_m_i_d__ = _c_o_m_p_u_t_e_D_o_f_s_P_e_r_P_y_r_a_m_i_d(); │ │ │ │ │ -95 } │ │ │ │ │ -96 │ │ │ │ │ -_9_8 void _i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s() │ │ │ │ │ -99 { │ │ │ │ │ -100 _v_e_r_t_e_x_O_f_f_s_e_t__ = 0; │ │ │ │ │ -101 _e_d_g_e_O_f_f_s_e_t__ = _v_e_r_t_e_x_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_C_u_b_e(0) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size │ │ │ │ │ -(dim)); │ │ │ │ │ -102 │ │ │ │ │ -103 if (dim>=2) │ │ │ │ │ -104 { │ │ │ │ │ -105 _t_r_i_a_n_g_l_e_O_f_f_s_e_t__ = _e_d_g_e_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_C_u_b_e(1) * ((_s_i_z_e___t_y_p_e) │ │ │ │ │ -_g_r_i_d_V_i_e_w__.size(dim-1)); │ │ │ │ │ -106 │ │ │ │ │ -107 _q_u_a_d_r_i_l_a_t_e_r_a_l_O_f_f_s_e_t__ = _t_r_i_a_n_g_l_e_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_S_i_m_p_l_e_x(2) * ( │ │ │ │ │ -(_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes::triangle)); │ │ │ │ │ -108 } │ │ │ │ │ -109 │ │ │ │ │ -110 if (dim==3) { │ │ │ │ │ -111 _t_e_t_r_a_h_e_d_r_o_n_O_f_f_s_e_t__ = _q_u_a_d_r_i_l_a_t_e_r_a_l_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_C_u_b_e(2) * ( │ │ │ │ │ -(_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes::quadrilateral)); │ │ │ │ │ -112 │ │ │ │ │ -113 _p_r_i_s_m_O_f_f_s_e_t__ = _t_e_t_r_a_h_e_d_r_o_n_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_S_i_m_p_l_e_x(3) * ( │ │ │ │ │ -(_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes::tetrahedron)); │ │ │ │ │ -114 │ │ │ │ │ -115 _h_e_x_a_h_e_d_r_o_n_O_f_f_s_e_t__ = _p_r_i_s_m_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_P_r_i_s_m() * ( │ │ │ │ │ -(_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes::prism)); │ │ │ │ │ -116 │ │ │ │ │ -117 _p_y_r_a_m_i_d_O_f_f_s_e_t__ = _h_e_x_a_h_e_d_r_o_n_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_C_u_b_e(3) * ( │ │ │ │ │ -(_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes::hexahedron)); │ │ │ │ │ -118 } │ │ │ │ │ -119 } │ │ │ │ │ -120 │ │ │ │ │ -_1_2_2 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ +_8_1 static constexpr _s_i_z_e___t_y_p_e _m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e = useHybridIndices ? 3 : 2; │ │ │ │ │ +_8_2 static constexpr _s_i_z_e___t_y_p_e _m_i_n_M_u_l_t_i_I_n_d_e_x_S_i_z_e = 2; │ │ │ │ │ +_8_3 static constexpr _s_i_z_e___t_y_p_e _m_u_l_t_i_I_n_d_e_x_B_u_f_f_e_r_S_i_z_e = _m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e; │ │ │ │ │ +84 │ │ │ │ │ +85private: │ │ │ │ │ +86 │ │ │ │ │ +87 using _P_Q_1_P_r_e_B_a_s_i_s = _L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_<_G_V_,_1_>; │ │ │ │ │ +88 using _P_Q_2_P_r_e_B_a_s_i_s = _L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_<_G_V_,_2_>; │ │ │ │ │ +89 │ │ │ │ │ +90public: │ │ │ │ │ +91 │ │ │ │ │ +_9_3 _T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s(const _G_r_i_d_V_i_e_w& gv) : │ │ │ │ │ +94 _g_r_i_d_V_i_e_w__(gv), │ │ │ │ │ +95 _p_q_1_P_r_e_B_a_s_i_s__(gv), │ │ │ │ │ +96 _p_q_2_P_r_e_B_a_s_i_s__(gv) │ │ │ │ │ +97 {} │ │ │ │ │ +98 │ │ │ │ │ +_1_0_0 void _i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s() │ │ │ │ │ +101 { │ │ │ │ │ +102 _p_q_1_P_r_e_B_a_s_i_s__._i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s(); │ │ │ │ │ +103 _p_q_2_P_r_e_B_a_s_i_s__._i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s(); │ │ │ │ │ +104 } │ │ │ │ │ +105 │ │ │ │ │ +_1_0_7 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ +108 { │ │ │ │ │ +109 return _g_r_i_d_V_i_e_w__; │ │ │ │ │ +110 } │ │ │ │ │ +111 │ │ │ │ │ +_1_1_3 void _u_p_d_a_t_e (const _G_r_i_d_V_i_e_w& gv) │ │ │ │ │ +114 { │ │ │ │ │ +115 _p_q_1_P_r_e_B_a_s_i_s__._u_p_d_a_t_e(gv); │ │ │ │ │ +116 _p_q_2_P_r_e_B_a_s_i_s__._u_p_d_a_t_e(gv); │ │ │ │ │ +117 } │ │ │ │ │ +118 │ │ │ │ │ +_1_2_2 _N_o_d_e _m_a_k_e_N_o_d_e() const │ │ │ │ │ 123 { │ │ │ │ │ -124 return _g_r_i_d_V_i_e_w__; │ │ │ │ │ +124 return _N_o_d_e{}; │ │ │ │ │ 125 } │ │ │ │ │ 126 │ │ │ │ │ -_1_2_8 void _u_p_d_a_t_e (const _G_r_i_d_V_i_e_w& gv) │ │ │ │ │ +_1_2_8 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ 129 { │ │ │ │ │ -130 _g_r_i_d_V_i_e_w__ = gv; │ │ │ │ │ +130 return 2; │ │ │ │ │ 131 } │ │ │ │ │ 132 │ │ │ │ │ -_1_3_6 _N_o_d_e _m_a_k_e_N_o_d_e() const │ │ │ │ │ -137 { │ │ │ │ │ -138 return _N_o_d_e{_o_r_d_e_r__}; │ │ │ │ │ -139 } │ │ │ │ │ -140 │ │ │ │ │ -_1_4_2 _s_i_z_e___t_y_p_e _d_i_m_e_n_s_i_o_n() const │ │ │ │ │ -143 { │ │ │ │ │ -144 switch (dim) │ │ │ │ │ +134 template │ │ │ │ │ +_1_3_5 _s_i_z_e___t_y_p_e _s_i_z_e(const SizePrefix& prefix) const │ │ │ │ │ +136 { │ │ │ │ │ +137 return sizeImp(prefix); │ │ │ │ │ +138 } │ │ │ │ │ +139 │ │ │ │ │ +140private: │ │ │ │ │ +141 │ │ │ │ │ +142 template = 0> │ │ │ │ │ +144 _s_i_z_e___t_y_p_e sizeImp(const SizePrefix& prefix) const │ │ │ │ │ 145 { │ │ │ │ │ -146 case 1: │ │ │ │ │ -147 return _d_o_f_s_P_e_r_C_u_b_e(0) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(dim)) │ │ │ │ │ -148 + _d_o_f_s_P_e_r_C_u_b_e(1) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(dim-1)); │ │ │ │ │ -149 case 2: │ │ │ │ │ -150 { │ │ │ │ │ -151 return _d_o_f_s_P_e_r_C_u_b_e(0) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(dim)) │ │ │ │ │ -152 + _d_o_f_s_P_e_r_C_u_b_e(1) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(dim-1)) │ │ │ │ │ -153 + _d_o_f_s_P_e_r_S_i_m_p_l_e_x(2) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes:: │ │ │ │ │ -triangle)) │ │ │ │ │ -154 + _d_o_f_s_P_e_r_C_u_b_e(2) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes:: │ │ │ │ │ -quadrilateral)); │ │ │ │ │ -155 } │ │ │ │ │ -156 case 3: │ │ │ │ │ -157 { │ │ │ │ │ -158 return _d_o_f_s_P_e_r_C_u_b_e(0) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(dim)) │ │ │ │ │ -159 + _d_o_f_s_P_e_r_C_u_b_e(1) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(dim-1)) │ │ │ │ │ -160 + _d_o_f_s_P_e_r_S_i_m_p_l_e_x(2) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes:: │ │ │ │ │ -triangle)) │ │ │ │ │ -161 + _d_o_f_s_P_e_r_C_u_b_e(2) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes:: │ │ │ │ │ -quadrilateral)) │ │ │ │ │ -162 + _d_o_f_s_P_e_r_S_i_m_p_l_e_x(3) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes:: │ │ │ │ │ -tetrahedron)) │ │ │ │ │ -163 + _d_o_f_s_P_e_r_P_y_r_a_m_i_d() * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes:: │ │ │ │ │ -pyramid)) │ │ │ │ │ -164 + _d_o_f_s_P_e_r_P_r_i_s_m() * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes::prism)) │ │ │ │ │ -165 + _d_o_f_s_P_e_r_C_u_b_e(3) * ((_s_i_z_e___t_y_p_e)_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes:: │ │ │ │ │ -hexahedron)); │ │ │ │ │ -166 } │ │ │ │ │ -167 } │ │ │ │ │ -168 DUNE_THROW(Dune::NotImplemented, "No size method for " << dim << "d grids │ │ │ │ │ -available yet!"); │ │ │ │ │ -169 } │ │ │ │ │ -170 │ │ │ │ │ -_1_7_2 _s_i_z_e___t_y_p_e _m_a_x_N_o_d_e_S_i_z_e() const │ │ │ │ │ +146 if (prefix.size() == 0) │ │ │ │ │ +147 return 2; │ │ │ │ │ +148 if (prefix.size() == 1) │ │ │ │ │ +149 { │ │ │ │ │ +150 if (prefix[0] == 0) │ │ │ │ │ +151 return dim * _p_q_2_P_r_e_B_a_s_i_s__._s_i_z_e(); │ │ │ │ │ +152 if (prefix[0] == 1) │ │ │ │ │ +153 return _p_q_1_P_r_e_B_a_s_i_s__._s_i_z_e(); │ │ │ │ │ +154 } │ │ │ │ │ +155 assert(prefix.size() == 2); │ │ │ │ │ +156 return 0; │ │ │ │ │ +157 } │ │ │ │ │ +158 │ │ │ │ │ +159 template = 0> │ │ │ │ │ +161 _s_i_z_e___t_y_p_e sizeImp(const SizePrefix& prefix) const │ │ │ │ │ +162 { │ │ │ │ │ +163 if (prefix.size() == 0) │ │ │ │ │ +164 return 2; │ │ │ │ │ +165 if (prefix.size() == 1) │ │ │ │ │ +166 { │ │ │ │ │ +167 if (prefix[0] == 0) │ │ │ │ │ +168 return _p_q_2_P_r_e_B_a_s_i_s__._s_i_z_e(); │ │ │ │ │ +169 if (prefix[0] == 1) │ │ │ │ │ +170 return _p_q_1_P_r_e_B_a_s_i_s__._s_i_z_e(); │ │ │ │ │ +171 } │ │ │ │ │ +172 if (prefix.size() == 2) │ │ │ │ │ 173 { │ │ │ │ │ -174 // That cast to unsigned int is necessary because GV::dimension is an enum, │ │ │ │ │ -175 // which is not recognized by the power method as an integer type... │ │ │ │ │ -176 return power(_o_r_d_e_r()+1, (unsigned int)GV::dimension); │ │ │ │ │ -177 } │ │ │ │ │ -178 │ │ │ │ │ -179 template │ │ │ │ │ -_1_8_0 It _i_n_d_i_c_e_s(const _N_o_d_e& node, It it) const │ │ │ │ │ -181 { │ │ │ │ │ -182 for (_s_i_z_e___t_y_p_e i = 0, end = node._f_i_n_i_t_e_E_l_e_m_e_n_t().size() ; i < end ; ++it, │ │ │ │ │ -++i) │ │ │ │ │ -183 { │ │ │ │ │ -184 Dune::LocalKey localKey = node._f_i_n_i_t_e_E_l_e_m_e_n_t().localCoefficients().localKey │ │ │ │ │ -(i); │ │ │ │ │ -185 const auto& gridIndexSet = _g_r_i_d_V_i_e_w().indexSet(); │ │ │ │ │ -186 const auto& element = node._e_l_e_m_e_n_t(); │ │ │ │ │ -187 │ │ │ │ │ -188 // The dimension of the entity that the current dof is related to │ │ │ │ │ -189 auto dofDim = dim - localKey.codim(); │ │ │ │ │ +174 if (prefix[0] == 0) │ │ │ │ │ +175 return dim; │ │ │ │ │ +176 if (prefix[0] == 1) │ │ │ │ │ +177 return 0; │ │ │ │ │ +178 } │ │ │ │ │ +179 assert(prefix.size() == 3); │ │ │ │ │ +180 return 0; │ │ │ │ │ +181 } │ │ │ │ │ +182 │ │ │ │ │ +183public: │ │ │ │ │ +184 │ │ │ │ │ +_1_8_6 _s_i_z_e___t_y_p_e _d_i_m_e_n_s_i_o_n() const │ │ │ │ │ +187 { │ │ │ │ │ +188 return dim * _p_q_2_P_r_e_B_a_s_i_s__._s_i_z_e() + _p_q_1_P_r_e_B_a_s_i_s__._s_i_z_e(); │ │ │ │ │ +189 } │ │ │ │ │ 190 │ │ │ │ │ -191 // Test for a vertex dof │ │ │ │ │ -192 // The test for k==1 is redundant, but having it here allows the compiler │ │ │ │ │ -to conclude │ │ │ │ │ -193 // at compile-time that the dofDim==0 case is the only one that will ever │ │ │ │ │ -happen. │ │ │ │ │ -194 // This leads to measurable speed-up: see │ │ │ │ │ -195 // https://gitlab.dune-project.org/staging/dune-functions/issues/30 │ │ │ │ │ -196 if (k==1 || dofDim==0) { │ │ │ │ │ -197 *it = {{ (_s_i_z_e___t_y_p_e)(gridIndexSet.subIndex(element,localKey.subEntity │ │ │ │ │ -(),dim)) }}; │ │ │ │ │ -198 continue; │ │ │ │ │ -199 } │ │ │ │ │ -200 │ │ │ │ │ -201 if (dofDim==1) │ │ │ │ │ -202 { // edge dof │ │ │ │ │ -203 if (dim==1) // element dof -- any local numbering is fine │ │ │ │ │ -204 { │ │ │ │ │ -205 *it = {{ _e_d_g_e_O_f_f_s_e_t__ │ │ │ │ │ -206 + _d_o_f_s_P_e_r_C_u_b_e(1) * ((_s_i_z_e___t_y_p_e)gridIndexSet.subIndex(element,0,0)) │ │ │ │ │ -207 + localKey.index() }}; │ │ │ │ │ -208 continue; │ │ │ │ │ -209 } │ │ │ │ │ -210 else │ │ │ │ │ -211 { │ │ │ │ │ -212 const auto refElement │ │ │ │ │ -213 = Dune::referenceElement(element.type()); │ │ │ │ │ -214 │ │ │ │ │ -215 // We have to reverse the numbering if the local element edge is │ │ │ │ │ -216 // not aligned with the global edge. │ │ │ │ │ -217 auto v0 = (_s_i_z_e___t_y_p_e)gridIndexSet.subIndex(element,refElement.subEntity │ │ │ │ │ -(localKey.subEntity(),localKey.codim(),0,dim),dim); │ │ │ │ │ -218 auto v1 = (_s_i_z_e___t_y_p_e)gridIndexSet.subIndex(element,refElement.subEntity │ │ │ │ │ -(localKey.subEntity(),localKey.codim(),1,dim),dim); │ │ │ │ │ -219 bool flip = (v0 > v1); │ │ │ │ │ -220 *it = {{ (flip) │ │ │ │ │ -221 ? _e_d_g_e_O_f_f_s_e_t__ │ │ │ │ │ -222 + _d_o_f_s_P_e_r_C_u_b_e(1)*((_s_i_z_e___t_y_p_e)gridIndexSet.subIndex │ │ │ │ │ -(element,localKey.subEntity(),localKey.codim())) │ │ │ │ │ -223 + (_d_o_f_s_P_e_r_C_u_b_e(1)-1)-localKey.index() │ │ │ │ │ -224 : _e_d_g_e_O_f_f_s_e_t__ │ │ │ │ │ -225 + _d_o_f_s_P_e_r_C_u_b_e(1)*((_s_i_z_e___t_y_p_e)gridIndexSet.subIndex │ │ │ │ │ -(element,localKey.subEntity(),localKey.codim())) │ │ │ │ │ -226 + localKey.index() }}; │ │ │ │ │ -227 continue; │ │ │ │ │ -228 } │ │ │ │ │ -229 } │ │ │ │ │ -230 │ │ │ │ │ -231 if (dofDim==2) │ │ │ │ │ -232 { │ │ │ │ │ -233 if (dim==2) // element dof -- any local numbering is fine │ │ │ │ │ -234 { │ │ │ │ │ -235 if (element.type().isTriangle()) │ │ │ │ │ +_1_9_2 _s_i_z_e___t_y_p_e _m_a_x_N_o_d_e_S_i_z_e() const │ │ │ │ │ +193 { │ │ │ │ │ +194 return dim * _p_q_2_P_r_e_B_a_s_i_s__._m_a_x_N_o_d_e_S_i_z_e() + _p_q_1_P_r_e_B_a_s_i_s__._m_a_x_N_o_d_e_S_i_z_e(); │ │ │ │ │ +195 } │ │ │ │ │ +196 │ │ │ │ │ +197 template │ │ │ │ │ +_1_9_8 It _i_n_d_i_c_e_s(const _N_o_d_e& node, It it) const │ │ │ │ │ +199 { │ │ │ │ │ +200 return indicesImp(node, it); │ │ │ │ │ +201 } │ │ │ │ │ +202 │ │ │ │ │ +_2_0_8 auto _c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r() const │ │ │ │ │ +209 { │ │ │ │ │ +210 namespace CD = _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s; │ │ │ │ │ +211 if constexpr(HI) │ │ │ │ │ +212 return CD::makeDescriptor( │ │ │ │ │ +213 CD::makeUniformDescriptor(_p_q_2_P_r_e_B_a_s_i_s__._s_i_z_e(), │ │ │ │ │ +214 CD::FlatArray{}), │ │ │ │ │ +215 CD::FlatVector{_p_q_1_P_r_e_B_a_s_i_s__._s_i_z_e()}); │ │ │ │ │ +216 else │ │ │ │ │ +217 return CD::Array{ │ │ │ │ │ +218 CD::FlatVector{GV::dimension * _p_q_2_P_r_e_B_a_s_i_s__._s_i_z_e()}, │ │ │ │ │ +219 CD::FlatVector{_p_q_1_P_r_e_B_a_s_i_s__._s_i_z_e()} }; │ │ │ │ │ +220 } │ │ │ │ │ +221 │ │ │ │ │ +222protected: │ │ │ │ │ +223 │ │ │ │ │ +224 template │ │ │ │ │ +_2_2_5 static const void _m_u_l_t_i_I_n_d_e_x_P_u_s_h_F_r_o_n_t(MultiIndex& M, _s_i_z_e___t_y_p_e M0) │ │ │ │ │ +226 { │ │ │ │ │ +227 M.resize(M.size()+1); │ │ │ │ │ +228 for(std::size_t i=M.size()-1; i>0; --i) │ │ │ │ │ +229 M[i] = M[i-1]; │ │ │ │ │ +230 M[0] = M0; │ │ │ │ │ +231 } │ │ │ │ │ +232 │ │ │ │ │ +233 template = 0> │ │ │ │ │ +_2_3_5 It _i_n_d_i_c_e_s_I_m_p(const _N_o_d_e& node, It multiIndices) const │ │ │ │ │ 236 { │ │ │ │ │ -237 *it = {{ _t_r_i_a_n_g_l_e_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_S_i_m_p_l_e_x(2)*( │ │ │ │ │ -(_s_i_z_e___t_y_p_e)gridIndexSet.subIndex(element,0,0)) + localKey.index() }}; │ │ │ │ │ -238 continue; │ │ │ │ │ -239 } │ │ │ │ │ -240 else if (element.type().isQuadrilateral()) │ │ │ │ │ -241 { │ │ │ │ │ -242 *it = {{ _q_u_a_d_r_i_l_a_t_e_r_a_l_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_C_u_b_e(2)*( │ │ │ │ │ -(_s_i_z_e___t_y_p_e)gridIndexSet.subIndex(element,0,0)) + localKey.index() }}; │ │ │ │ │ -243 continue; │ │ │ │ │ -244 } │ │ │ │ │ -245 else │ │ │ │ │ -246 DUNE_THROW(Dune::NotImplemented, "2d elements have to be triangles or │ │ │ │ │ -quadrilaterals"); │ │ │ │ │ -247 } else │ │ │ │ │ -248 { │ │ │ │ │ -249 const auto refElement │ │ │ │ │ -250 = Dune::referenceElement(element.type()); │ │ │ │ │ -251 │ │ │ │ │ -252 if (_o_r_d_e_r()>3) │ │ │ │ │ -253 DUNE_THROW(Dune::NotImplemented, "LagrangeBasis for 3D grids is only │ │ │ │ │ -implemented if k<=3"); │ │ │ │ │ -254 │ │ │ │ │ -255 if (_o_r_d_e_r()==3 and !refElement.type(localKey.subEntity(), localKey.codim │ │ │ │ │ -()).isTriangle()) │ │ │ │ │ -256 DUNE_THROW(Dune::NotImplemented, "LagrangeBasis for 3D grids with k==3 is │ │ │ │ │ -only implemented if the grid is a simplex grid"); │ │ │ │ │ -257 │ │ │ │ │ -258 *it = {{ _t_r_i_a_n_g_l_e_O_f_f_s_e_t__ + ((_s_i_z_e___t_y_p_e)gridIndexSet.subIndex │ │ │ │ │ -(element,localKey.subEntity(),localKey.codim())) }}; │ │ │ │ │ -259 continue; │ │ │ │ │ -260 } │ │ │ │ │ -261 } │ │ │ │ │ -262 │ │ │ │ │ -263 if (dofDim==3) │ │ │ │ │ -264 { │ │ │ │ │ -265 if (dim==3) // element dof -- any local numbering is fine │ │ │ │ │ -266 { │ │ │ │ │ -267 if (element.type().isTetrahedron()) │ │ │ │ │ -268 { │ │ │ │ │ -269 *it = {{ _t_e_t_r_a_h_e_d_r_o_n_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_S_i_m_p_l_e_x(3)*( │ │ │ │ │ -(_s_i_z_e___t_y_p_e)gridIndexSet.subIndex(element,0,0)) + localKey.index() }}; │ │ │ │ │ -270 continue; │ │ │ │ │ -271 } │ │ │ │ │ -272 else if (element.type().isHexahedron()) │ │ │ │ │ -273 { │ │ │ │ │ -274 *it = {{ _h_e_x_a_h_e_d_r_o_n_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_C_u_b_e(3)*( │ │ │ │ │ -(_s_i_z_e___t_y_p_e)gridIndexSet.subIndex(element,0,0)) + localKey.index() }}; │ │ │ │ │ -275 continue; │ │ │ │ │ -276 } │ │ │ │ │ -277 else if (element.type().isPrism()) │ │ │ │ │ -278 { │ │ │ │ │ -279 *it = {{ _p_r_i_s_m_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_P_r_i_s_m()*((_s_i_z_e___t_y_p_e)gridIndexSet.subIndex │ │ │ │ │ -(element,0,0)) + localKey.index() }}; │ │ │ │ │ -280 continue; │ │ │ │ │ -281 } │ │ │ │ │ -282 else if (element.type().isPyramid()) │ │ │ │ │ -283 { │ │ │ │ │ -284 *it = {{ _p_y_r_a_m_i_d_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_P_y_r_a_m_i_d()*( │ │ │ │ │ -(_s_i_z_e___t_y_p_e)gridIndexSet.subIndex(element,0,0)) + localKey.index() }}; │ │ │ │ │ -285 continue; │ │ │ │ │ -286 } │ │ │ │ │ -287 else │ │ │ │ │ -288 DUNE_THROW(Dune::NotImplemented, "3d elements have to be tetrahedra, │ │ │ │ │ -hexahedra, prisms, or pyramids"); │ │ │ │ │ -289 } else │ │ │ │ │ -290 DUNE_THROW(Dune::NotImplemented, "Grids of dimension larger than 3 are no │ │ │ │ │ -supported"); │ │ │ │ │ -291 } │ │ │ │ │ -292 DUNE_THROW(Dune::NotImplemented, "Grid contains elements not supported for │ │ │ │ │ -the LagrangeBasis"); │ │ │ │ │ -293 } │ │ │ │ │ -294 return it; │ │ │ │ │ -295 } │ │ │ │ │ -296 │ │ │ │ │ -_2_9_8 unsigned int _o_r_d_e_r() const │ │ │ │ │ -299 { │ │ │ │ │ -300 return (useDynamicOrder) ? _o_r_d_e_r__ : k; │ │ │ │ │ +237 using namespace Dune::Indices; │ │ │ │ │ +238 for(std::size_t child=0; child = 0> │ │ │ │ │ +_2_5_9 It _i_n_d_i_c_e_s_I_m_p(const _N_o_d_e& node, It multiIndices) const │ │ │ │ │ +260 { │ │ │ │ │ +261 using namespace Dune::Indices; │ │ │ │ │ +262 for(std::size_t child=0; child │ │ │ │ │ +_2_9_0class _T_a_y_l_o_r_H_o_o_d_V_e_l_o_c_i_t_y_T_r_e_e : │ │ │ │ │ +291 public _P_o_w_e_r_B_a_s_i_s_N_o_d_e, GV::dimension> │ │ │ │ │ +292{ │ │ │ │ │ +293 using _P_Q_2_N_o_d_e = _L_a_g_r_a_n_g_e_N_o_d_e_<_G_V_,_2_>; │ │ │ │ │ +294 using _B_a_s_e = _P_o_w_e_r_B_a_s_i_s_N_o_d_e_<_P_Q_2_N_o_d_e_,_ _G_V_:_:_d_i_m_e_n_s_i_o_n_>; │ │ │ │ │ +295 │ │ │ │ │ +296public: │ │ │ │ │ +_2_9_7 _T_a_y_l_o_r_H_o_o_d_V_e_l_o_c_i_t_y_T_r_e_e() │ │ │ │ │ +298 { │ │ │ │ │ +299 for(int i=0; isetChild(i, std::make_shared()); │ │ │ │ │ 301 } │ │ │ │ │ -302 │ │ │ │ │ -303protected: │ │ │ │ │ -_3_0_4 _G_r_i_d_V_i_e_w _g_r_i_d_V_i_e_w__; │ │ │ │ │ -305 │ │ │ │ │ -306 // Run-time order, only valid if k<0 │ │ │ │ │ -_3_0_7 unsigned int _o_r_d_e_r__; │ │ │ │ │ -308 │ │ │ │ │ -_3_1_0 _s_i_z_e___t_y_p_e _d_o_f_s_P_e_r_S_i_m_p_l_e_x(std::size_t simplexDim) const │ │ │ │ │ -311 { │ │ │ │ │ -312 return useDynamicOrder ? _d_o_f_s_P_e_r_S_i_m_p_l_e_x__[simplexDim] : │ │ │ │ │ -_c_o_m_p_u_t_e_D_o_f_s_P_e_r_S_i_m_p_l_e_x(simplexDim); │ │ │ │ │ -313 } │ │ │ │ │ -314 │ │ │ │ │ -_3_1_6 _s_i_z_e___t_y_p_e _d_o_f_s_P_e_r_C_u_b_e(std::size_t cubeDim) const │ │ │ │ │ -317 { │ │ │ │ │ -318 return useDynamicOrder ? _d_o_f_s_P_e_r_C_u_b_e__[cubeDim] : _c_o_m_p_u_t_e_D_o_f_s_P_e_r_C_u_b_e │ │ │ │ │ -(cubeDim); │ │ │ │ │ -319 } │ │ │ │ │ -320 │ │ │ │ │ -_3_2_1 _s_i_z_e___t_y_p_e _d_o_f_s_P_e_r_P_r_i_s_m() const │ │ │ │ │ -322 { │ │ │ │ │ -323 return useDynamicOrder ? _d_o_f_s_P_e_r_P_r_i_s_m__ : _c_o_m_p_u_t_e_D_o_f_s_P_e_r_P_r_i_s_m(); │ │ │ │ │ -324 } │ │ │ │ │ +302}; │ │ │ │ │ +303 │ │ │ │ │ +304template │ │ │ │ │ +_3_0_5class _T_a_y_l_o_r_H_o_o_d_B_a_s_i_s_T_r_e_e : │ │ │ │ │ +306 public _C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e< │ │ │ │ │ +307 TaylorHoodVelocityTree, │ │ │ │ │ +308 LagrangeNode │ │ │ │ │ +309 > │ │ │ │ │ +310{ │ │ │ │ │ +311 using _V_e_l_o_c_i_t_y_N_o_d_e=_T_a_y_l_o_r_H_o_o_d_V_e_l_o_c_i_t_y_T_r_e_e_<_G_V_>; │ │ │ │ │ +312 using _P_r_e_s_s_u_r_e_N_o_d_e=_L_a_g_r_a_n_g_e_N_o_d_e_<_G_V_,_1_>; │ │ │ │ │ +313 │ │ │ │ │ +314 using _B_a_s_e=_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e_<_V_e_l_o_c_i_t_y_N_o_d_e_,_ _P_r_e_s_s_u_r_e_N_o_d_e_>; │ │ │ │ │ +315 │ │ │ │ │ +316public: │ │ │ │ │ +_3_1_7 _T_a_y_l_o_r_H_o_o_d_B_a_s_i_s_T_r_e_e() │ │ │ │ │ +318 { │ │ │ │ │ +319 this->template setChild<0>(std::make_shared()); │ │ │ │ │ +320 this->template setChild<1>(std::make_shared()); │ │ │ │ │ +321 } │ │ │ │ │ +322}; │ │ │ │ │ +323 │ │ │ │ │ +324 │ │ │ │ │ 325 │ │ │ │ │ -_3_2_6 _s_i_z_e___t_y_p_e _d_o_f_s_P_e_r_P_y_r_a_m_i_d() const │ │ │ │ │ -327 { │ │ │ │ │ -328 return useDynamicOrder ? _d_o_f_s_P_e_r_P_y_r_a_m_i_d__ : _c_o_m_p_u_t_e_D_o_f_s_P_e_r_P_y_r_a_m_i_d(); │ │ │ │ │ -329 } │ │ │ │ │ -330 │ │ │ │ │ -_3_3_2 _s_i_z_e___t_y_p_e _c_o_m_p_u_t_e_D_o_f_s_P_e_r_S_i_m_p_l_e_x(std::size_t simplexDim) const │ │ │ │ │ -333 { │ │ │ │ │ -334 return _o_r_d_e_r() == 0 ? (dim == simplexDim ? 1 : 0) : Dune::binomial(std:: │ │ │ │ │ -size_t(_o_r_d_e_r()-1),simplexDim); │ │ │ │ │ -335 } │ │ │ │ │ -336 │ │ │ │ │ -_3_3_8 _s_i_z_e___t_y_p_e _c_o_m_p_u_t_e_D_o_f_s_P_e_r_C_u_b_e(std::size_t cubeDim) const │ │ │ │ │ -339 { │ │ │ │ │ -340 return _o_r_d_e_r() == 0 ? (dim == cubeDim ? 1 : 0) : Dune::power(_o_r_d_e_r()-1, │ │ │ │ │ -cubeDim); │ │ │ │ │ -341 } │ │ │ │ │ +326namespace BasisFactory { │ │ │ │ │ +327 │ │ │ │ │ +_3_3_4inline auto _t_a_y_l_o_r_H_o_o_d() │ │ │ │ │ +335{ │ │ │ │ │ +336 return [](const auto& gridView) { │ │ │ │ │ +337 return _T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s>(gridView); │ │ │ │ │ +338 }; │ │ │ │ │ +339} │ │ │ │ │ +340 │ │ │ │ │ +341} // end namespace BasisFactory │ │ │ │ │ 342 │ │ │ │ │ -_3_4_3 _s_i_z_e___t_y_p_e _c_o_m_p_u_t_e_D_o_f_s_P_e_r_P_r_i_s_m() const │ │ │ │ │ -344 { │ │ │ │ │ -345 return _o_r_d_e_r() == 0 ? (dim == 3 ? 1 : 0) : (_o_r_d_e_r()-1)*(_o_r_d_e_r()-1)*(_o_r_d_e_r │ │ │ │ │ -()-2)/2; │ │ │ │ │ -346 } │ │ │ │ │ -347 │ │ │ │ │ -_3_4_8 _s_i_z_e___t_y_p_e _c_o_m_p_u_t_e_D_o_f_s_P_e_r_P_y_r_a_m_i_d() const │ │ │ │ │ -349 { │ │ │ │ │ -350 return _o_r_d_e_r() == 0 ? (dim == 3 ? 1 : 0) : (_o_r_d_e_r()-2)*(_o_r_d_e_r()-1)*(2*_o_r_d_e_r │ │ │ │ │ -()-3)/6; │ │ │ │ │ -351 } │ │ │ │ │ -352 │ │ │ │ │ -353 // When the order is given at run-time, the following numbers are pre- │ │ │ │ │ -computed: │ │ │ │ │ -_3_5_4 std::array _d_o_f_s_P_e_r_S_i_m_p_l_e_x__; │ │ │ │ │ -_3_5_5 std::array _d_o_f_s_P_e_r_C_u_b_e__; │ │ │ │ │ -_3_5_6 _s_i_z_e___t_y_p_e _d_o_f_s_P_e_r_P_r_i_s_m__; │ │ │ │ │ -_3_5_7 _s_i_z_e___t_y_p_e _d_o_f_s_P_e_r_P_y_r_a_m_i_d__; │ │ │ │ │ -358 │ │ │ │ │ -_3_5_9 _s_i_z_e___t_y_p_e _v_e_r_t_e_x_O_f_f_s_e_t__; │ │ │ │ │ -_3_6_0 _s_i_z_e___t_y_p_e _e_d_g_e_O_f_f_s_e_t__; │ │ │ │ │ -_3_6_1 _s_i_z_e___t_y_p_e _t_r_i_a_n_g_l_e_O_f_f_s_e_t__; │ │ │ │ │ -_3_6_2 _s_i_z_e___t_y_p_e _q_u_a_d_r_i_l_a_t_e_r_a_l_O_f_f_s_e_t__; │ │ │ │ │ -_3_6_3 _s_i_z_e___t_y_p_e _t_e_t_r_a_h_e_d_r_o_n_O_f_f_s_e_t__; │ │ │ │ │ -_3_6_4 _s_i_z_e___t_y_p_e _p_y_r_a_m_i_d_O_f_f_s_e_t__; │ │ │ │ │ -_3_6_5 _s_i_z_e___t_y_p_e _p_r_i_s_m_O_f_f_s_e_t__; │ │ │ │ │ -_3_6_6 _s_i_z_e___t_y_p_e _h_e_x_a_h_e_d_r_o_n_O_f_f_s_e_t__; │ │ │ │ │ -367 │ │ │ │ │ -368}; │ │ │ │ │ -369 │ │ │ │ │ +343/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ +344// This is the actual global basis implementation based on the reusable │ │ │ │ │ +parts. │ │ │ │ │ +345/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ +346 │ │ │ │ │ +368template │ │ │ │ │ +_3_6_9using _T_a_y_l_o_r_H_o_o_d_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_<_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_<_G_V_> >; │ │ │ │ │ 370 │ │ │ │ │ 371 │ │ │ │ │ -372template │ │ │ │ │ -_3_7_3class _L_a_g_r_a_n_g_e_N_o_d_e : │ │ │ │ │ -374 public _L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ -375{ │ │ │ │ │ -376 // Stores LocalFiniteElement implementations with run-time order as a │ │ │ │ │ -function of GeometryType │ │ │ │ │ -377 template │ │ │ │ │ -378 class LagrangeRunTimeLFECache │ │ │ │ │ -379 { │ │ │ │ │ -380 public: │ │ │ │ │ -381 using FiniteElementType = │ │ │ │ │ -LagrangeLocalFiniteElement; │ │ │ │ │ -382 │ │ │ │ │ -383 const FiniteElementType& get(GeometryType type) │ │ │ │ │ -384 { │ │ │ │ │ -385 auto i = data_.find(type); │ │ │ │ │ -386 if (i==data_.end()) │ │ │ │ │ -387 i = data_.emplace(type,FiniteElementType(type,order_)).first; │ │ │ │ │ -388 return (*i).second; │ │ │ │ │ -389 } │ │ │ │ │ -390 │ │ │ │ │ -391 std::map data_; │ │ │ │ │ -392 unsigned int order_; │ │ │ │ │ -393 }; │ │ │ │ │ -394 │ │ │ │ │ -395 static constexpr int dim = GV::dimension; │ │ │ │ │ -396 static constexpr bool useDynamicOrder = (k<0); │ │ │ │ │ -397 │ │ │ │ │ -398 using FiniteElementCache = std::conditional_t<(useDynamicOrder), │ │ │ │ │ -399 LagrangeRunTimeLFECache, │ │ │ │ │ -400 LagrangeLocalFiniteElementCache │ │ │ │ │ -401 >; │ │ │ │ │ -402 │ │ │ │ │ -403public: │ │ │ │ │ -404 │ │ │ │ │ -_4_0_5 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ -_4_0_6 using _E_l_e_m_e_n_t = typename GV::template Codim<0>::Entity; │ │ │ │ │ -_4_0_7 using _F_i_n_i_t_e_E_l_e_m_e_n_t = typename FiniteElementCache::FiniteElementType; │ │ │ │ │ -408 │ │ │ │ │ -_4_1_0 _L_a_g_r_a_n_g_e_N_o_d_e() : │ │ │ │ │ -411 _f_i_n_i_t_e_E_l_e_m_e_n_t__(nullptr), │ │ │ │ │ -412 _e_l_e_m_e_n_t__(nullptr) │ │ │ │ │ -413 {} │ │ │ │ │ -414 │ │ │ │ │ -_4_1_6 _L_a_g_r_a_n_g_e_N_o_d_e(unsigned int _o_r_d_e_r) : │ │ │ │ │ -417 _o_r_d_e_r__(_o_r_d_e_r), │ │ │ │ │ -418 _f_i_n_i_t_e_E_l_e_m_e_n_t__(nullptr), │ │ │ │ │ -419 _e_l_e_m_e_n_t__(nullptr) │ │ │ │ │ -420 { │ │ │ │ │ -421 // Only the cache for the run-time-order case (i.e., k<0), has the 'order_' │ │ │ │ │ -member │ │ │ │ │ -422 if constexpr (useDynamicOrder) │ │ │ │ │ -423 _c_a_c_h_e__.order_ = _o_r_d_e_r; │ │ │ │ │ -424 } │ │ │ │ │ -425 │ │ │ │ │ -_4_2_7 const _E_l_e_m_e_n_t& _e_l_e_m_e_n_t() const │ │ │ │ │ -428 { │ │ │ │ │ -429 return *_e_l_e_m_e_n_t__; │ │ │ │ │ -430 } │ │ │ │ │ -431 │ │ │ │ │ -_4_3_6 const _F_i_n_i_t_e_E_l_e_m_e_n_t& _f_i_n_i_t_e_E_l_e_m_e_n_t() const │ │ │ │ │ -437 { │ │ │ │ │ -438 return *_f_i_n_i_t_e_E_l_e_m_e_n_t__; │ │ │ │ │ -439 } │ │ │ │ │ -440 │ │ │ │ │ -_4_4_2 void _b_i_n_d(const _E_l_e_m_e_n_t& e) │ │ │ │ │ -443 { │ │ │ │ │ -444 _e_l_e_m_e_n_t__ = &e; │ │ │ │ │ -445 _f_i_n_i_t_e_E_l_e_m_e_n_t__ = &(_c_a_c_h_e__.get(_e_l_e_m_e_n_t__->type())); │ │ │ │ │ -446 this->_s_e_t_S_i_z_e(_f_i_n_i_t_e_E_l_e_m_e_n_t__->size()); │ │ │ │ │ -447 } │ │ │ │ │ -448 │ │ │ │ │ -449protected: │ │ │ │ │ -450 │ │ │ │ │ -_4_5_1 unsigned int _o_r_d_e_r() const │ │ │ │ │ -452 { │ │ │ │ │ -453 return (useDynamicOrder) ? _o_r_d_e_r__ : k; │ │ │ │ │ -454 } │ │ │ │ │ -455 │ │ │ │ │ -456 // Run-time order, only valid if k<0 │ │ │ │ │ -_4_5_7 unsigned int _o_r_d_e_r__; │ │ │ │ │ -458 │ │ │ │ │ -_4_5_9 FiniteElementCache _c_a_c_h_e__; │ │ │ │ │ -_4_6_0 const _F_i_n_i_t_e_E_l_e_m_e_n_t* _f_i_n_i_t_e_E_l_e_m_e_n_t__; │ │ │ │ │ -_4_6_1 const _E_l_e_m_e_n_t* _e_l_e_m_e_n_t__; │ │ │ │ │ -462}; │ │ │ │ │ -463 │ │ │ │ │ -464 │ │ │ │ │ -465 │ │ │ │ │ -466namespace BasisFactory { │ │ │ │ │ -467 │ │ │ │ │ -476template │ │ │ │ │ -_4_7_7auto _l_a_g_r_a_n_g_e() │ │ │ │ │ -478{ │ │ │ │ │ -479 return [](const auto& gridView) { │ │ │ │ │ -480 return _L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s, k, R>(gridView); │ │ │ │ │ -481 }; │ │ │ │ │ -482} │ │ │ │ │ -483 │ │ │ │ │ -491template │ │ │ │ │ -_4_9_2auto _l_a_g_r_a_n_g_e(int order) │ │ │ │ │ -493{ │ │ │ │ │ -494 return [=](const auto& gridView) { │ │ │ │ │ -495 return _L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s, -1, R>(gridView, │ │ │ │ │ -order); │ │ │ │ │ -496 }; │ │ │ │ │ -497} │ │ │ │ │ -498 │ │ │ │ │ -499} // end namespace BasisFactory │ │ │ │ │ -500 │ │ │ │ │ -501 │ │ │ │ │ -502 │ │ │ │ │ -526template │ │ │ │ │ -_5_2_7using _L_a_g_r_a_n_g_e_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_<_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_<_G_V_,_ _k_,_ _R_> >; │ │ │ │ │ -528 │ │ │ │ │ -529 │ │ │ │ │ -530 │ │ │ │ │ -531 │ │ │ │ │ -532 │ │ │ │ │ -533} // end namespace Functions │ │ │ │ │ -534} // end namespace Dune │ │ │ │ │ -535 │ │ │ │ │ -536 │ │ │ │ │ -537#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEBASIS_HH │ │ │ │ │ -_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h │ │ │ │ │ +372 │ │ │ │ │ +373} // end namespace Functions │ │ │ │ │ +374} // end namespace Dune │ │ │ │ │ +375 │ │ │ │ │ +376 │ │ │ │ │ +377#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TAYLORHOODBASIS_HH │ │ │ │ │ +_l_a_g_r_a_n_g_e_b_a_s_i_s_._h_h │ │ │ │ │ _n_o_d_e_s_._h_h │ │ │ │ │ -_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_l_a_g_r_a_n_g_e │ │ │ │ │ -auto lagrange() │ │ │ │ │ -Create a pre-basis factory that can create a Lagrange pre-basis. │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:477 │ │ │ │ │ +_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_t_a_y_l_o_r_H_o_o_d │ │ │ │ │ +auto taylorHood() │ │ │ │ │ +Create a pre-basis factory that can create a Taylor-Hood pre-basis. │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:334 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:47 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ Global basis for given pre-basis. │ │ │ │ │ DDeeffiinniittiioonn defaultglobalbasis.hh:50 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e │ │ │ │ │ DDeeffiinniittiioonn lagrangebasis.hh:375 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_L_a_g_r_a_n_g_e_N_o_d_e │ │ │ │ │ -LagrangeNode(unsigned int order) │ │ │ │ │ -Constructor with a run-time order. │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:416 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_o_r_d_e_r │ │ │ │ │ -unsigned int order() const │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:451 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ -const FiniteElement & finiteElement() const │ │ │ │ │ -Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:436 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_e_l_e_m_e_n_t__ │ │ │ │ │ -const Element * element_ │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:461 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_e_l_e_m_e_n_t │ │ │ │ │ -const Element & element() const │ │ │ │ │ -Return current element, throw if unbound. │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:427 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_c_a_c_h_e__ │ │ │ │ │ -FiniteElementCache cache_ │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:459 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_F_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ -typename FiniteElementCache::FiniteElementType FiniteElement │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:407 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_b_i_n_d │ │ │ │ │ -void bind(const Element &e) │ │ │ │ │ -Bind to element. │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:442 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_E_l_e_m_e_n_t │ │ │ │ │ -typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:406 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t__ │ │ │ │ │ -const FiniteElement * finiteElement_ │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:460 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_o_r_d_e_r__ │ │ │ │ │ -unsigned int order_ │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:457 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:405 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_L_a_g_r_a_n_g_e_N_o_d_e │ │ │ │ │ -LagrangeNode() │ │ │ │ │ -Constructor without order (uses the compile-time value) │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:410 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s │ │ │ │ │ -A pre-basis for a PQ-lagrange bases with given order. │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_P_r_i_s_m │ │ │ │ │ -size_type dofsPerPrism() const │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:321 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_c_o_m_p_u_t_e_D_o_f_s_P_e_r_C_u_b_e │ │ │ │ │ -size_type computeDofsPerCube(std::size_t cubeDim) const │ │ │ │ │ -Number of degrees of freedom assigned to a cube (without the ones assigned to │ │ │ │ │ -its faces!... │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:338 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_c_o_m_p_u_t_e_D_o_f_s_P_e_r_S_i_m_p_l_e_x │ │ │ │ │ -size_type computeDofsPerSimplex(std::size_t simplexDim) const │ │ │ │ │ -Number of degrees of freedom assigned to a simplex (without the ones assigned │ │ │ │ │ -to its faces!... │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:332 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_c_o_m_p_u_t_e_D_o_f_s_P_e_r_P_r_i_s_m │ │ │ │ │ -size_type computeDofsPerPrism() const │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:343 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_o_r_d_e_r__ │ │ │ │ │ -unsigned int order_ │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:307 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_e_d_g_e_O_f_f_s_e_t__ │ │ │ │ │ -size_type edgeOffset_ │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:360 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_S_i_m_p_l_e_x__ │ │ │ │ │ -std::array< size_type, dim+1 > dofsPerSimplex_ │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:354 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_<_ _G_V_,_ _1_ _> │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s │ │ │ │ │ It indices(const Node &node, It it) const │ │ │ │ │ DDeeffiinniittiioonn lagrangebasis.hh:180 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_v_e_r_t_e_x_O_f_f_s_e_t__ │ │ │ │ │ -size_type vertexOffset_ │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:359 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_S_i_m_p_l_e_x │ │ │ │ │ -size_type dofsPerSimplex(std::size_t simplexDim) const │ │ │ │ │ -Number of degrees of freedom assigned to a simplex (without the ones assigned │ │ │ │ │ -to its faces!... │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:310 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Type used for indices and size information. │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:71 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_p_y_r_a_m_i_d_O_f_f_s_e_t__ │ │ │ │ │ -size_type pyramidOffset_ │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:364 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_p_r_i_s_m_O_f_f_s_e_t__ │ │ │ │ │ -size_type prismOffset_ │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:365 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_t_e_t_r_a_h_e_d_r_o_n_O_f_f_s_e_t__ │ │ │ │ │ -size_type tetrahedronOffset_ │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:363 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s │ │ │ │ │ void initializeIndices() │ │ │ │ │ Initialize the global indices. │ │ │ │ │ DDeeffiinniittiioonn lagrangebasis.hh:98 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_c_o_m_p_u_t_e_D_o_f_s_P_e_r_P_y_r_a_m_i_d │ │ │ │ │ -size_type computeDofsPerPyramid() const │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:348 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s │ │ │ │ │ -LagrangePreBasis(const GridView &gv, unsigned int order) │ │ │ │ │ -Constructor for a given grid view object and run-time order. │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:82 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_P_y_r_a_m_i_d__ │ │ │ │ │ -size_type dofsPerPyramid_ │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:357 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ -size_type dimension() const │ │ │ │ │ -Get the total dimension of the space spanned by this basis. │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:142 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s │ │ │ │ │ -LagrangePreBasis(const GridView &gv) │ │ │ │ │ -Constructor for a given grid view object with compile-time order. │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:77 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_u_p_d_a_t_e │ │ │ │ │ void update(const GridView &gv) │ │ │ │ │ Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ DDeeffiinniittiioonn lagrangebasis.hh:128 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ -GV GridView │ │ │ │ │ -The grid view that the FE basis is defined on. │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:68 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_q_u_a_d_r_i_l_a_t_e_r_a_l_O_f_f_s_e_t__ │ │ │ │ │ -size_type quadrilateralOffset_ │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:362 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_m_a_x_N_o_d_e_S_i_z_e │ │ │ │ │ +size_type maxNodeSize() const │ │ │ │ │ +Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:172 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_s_i_z_e │ │ │ │ │ +size_type size(const SizePrefix &prefix) const │ │ │ │ │ +Return number of possible values for next position in multi index. │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismixin.hh:53 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_i_z_e │ │ │ │ │ +size_type size() const │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:147 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_B_a_s_i_s_N_o_d_e │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:198 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:252 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_V_e_l_o_c_i_t_y_T_r_e_e │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:292 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_V_e_l_o_c_i_t_y_T_r_e_e_:_:_T_a_y_l_o_r_H_o_o_d_V_e_l_o_c_i_t_y_T_r_e_e │ │ │ │ │ +TaylorHoodVelocityTree() │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:297 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_B_a_s_i_s_T_r_e_e │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:310 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_B_a_s_i_s_T_r_e_e_:_:_T_a_y_l_o_r_H_o_o_d_B_a_s_i_s_T_r_e_e │ │ │ │ │ +TaylorHoodBasisTree() │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:317 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s │ │ │ │ │ +Pre-basis for lowest order Taylor-Hood basis. │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:65 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s │ │ │ │ │ +TaylorHoodPreBasis(const GridView &gv) │ │ │ │ │ +Constructor for a given grid view object. │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:93 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ const GridView & gridView() const │ │ │ │ │ Obtain the grid view that the basis is defined on. │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:122 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w__ │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:107 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_m_i_n_M_u_l_t_i_I_n_d_e_x_S_i_z_e │ │ │ │ │ +static constexpr size_type minMultiIndexSize │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:82 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ +size_type size(const SizePrefix &prefix) const │ │ │ │ │ +Return number of possible values for next position in multi index. │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:135 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w__ │ │ │ │ │ GridView gridView_ │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:304 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:281 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ +GV GridView │ │ │ │ │ +The grid view that the FE basis is defined on. │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_u_p_d_a_t_e │ │ │ │ │ +void update(const GridView &gv) │ │ │ │ │ +Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:113 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +auto containerDescriptor() const │ │ │ │ │ +Return an container descriptor depending on the flag HI. Either return a Tuple │ │ │ │ │ +if hybrid indices shou... │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:208 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_p_q_2_P_r_e_B_a_s_i_s__ │ │ │ │ │ +PQ2PreBasis pq2PreBasis_ │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:284 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ +size_type size() const │ │ │ │ │ +Same as size(prefix) with empty prefix. │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:128 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ +size_type dimension() const │ │ │ │ │ +Get the total dimension of the space spanned by this basis. │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:186 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_p_q_1_P_r_e_B_a_s_i_s__ │ │ │ │ │ +PQ1PreBasis pq1PreBasis_ │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:283 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_m_u_l_t_i_I_n_d_e_x_P_u_s_h_F_r_o_n_t │ │ │ │ │ +static const void multiIndexPushFront(MultiIndex &M, size_type M0) │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:225 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e │ │ │ │ │ +static constexpr size_type maxMultiIndexSize │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:81 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ Node makeNode() const │ │ │ │ │ Create tree node. │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:136 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_o_r_d_e_r │ │ │ │ │ -unsigned int order() const │ │ │ │ │ -Polynomial order used in the local Lagrange finite-elements. │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:298 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_C_u_b_e__ │ │ │ │ │ -std::array< size_type, dim+1 > dofsPerCube_ │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:355 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_m_a_x_N_o_d_e_S_i_z_e │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:122 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s │ │ │ │ │ +It indices(const Node &node, It it) const │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:198 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_m_u_l_t_i_I_n_d_e_x_B_u_f_f_e_r_S_i_z_e │ │ │ │ │ +static constexpr size_type multiIndexBufferSize │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:83 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s │ │ │ │ │ +void initializeIndices() │ │ │ │ │ +Initialize the global indices. │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:100 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_m_a_x_N_o_d_e_S_i_z_e │ │ │ │ │ size_type maxNodeSize() const │ │ │ │ │ Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:172 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_P_r_i_s_m__ │ │ │ │ │ -size_type dofsPerPrism_ │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:356 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_C_u_b_e │ │ │ │ │ -size_type dofsPerCube(std::size_t cubeDim) const │ │ │ │ │ -Number of degrees of freedom assigned to a cube (without the ones assigned to │ │ │ │ │ -its faces!... │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:316 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_t_r_i_a_n_g_l_e_O_f_f_s_e_t__ │ │ │ │ │ -size_type triangleOffset_ │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:361 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_h_e_x_a_h_e_d_r_o_n_O_f_f_s_e_t__ │ │ │ │ │ -size_type hexahedronOffset_ │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:366 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_P_y_r_a_m_i_d │ │ │ │ │ -size_type dofsPerPyramid() const │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:326 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n │ │ │ │ │ -A generic MixIn class for PreBasis. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismixin.hh:36 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_e_t_S_i_z_e │ │ │ │ │ -void setSize(const size_type size) │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:169 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:191 │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:192 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +Type used for indices and size information. │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:76 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_T_a_y_l_o_r_H_o_o_d_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s_I_m_p │ │ │ │ │ +It indicesImp(const Node &node, It multiIndices) const │ │ │ │ │ +DDeeffiinniittiioonn taylorhoodbasis.hh:235 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00119.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: flatvectorview.hh File Reference │ │ │ │ +dune-functions: defaultnodetorangemap.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,48 +70,50 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
flatvectorview.hh File Reference
│ │ │ │ +
defaultnodetorangemap.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <array>
│ │ │ │ -#include <dune/common/concept.hh>
│ │ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ │ -#include <dune/common/indices.hh>
│ │ │ │ +
#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

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 T >
auto Dune::Functions::flatVectorView (T &t)
 Create flat vector view of passed mutable container.
 
template<class T >
auto Dune::Functions::flatVectorView (const T &t)
 Create flat vector view of passed const container.
 
template<class T >
auto Dune::Functions::flatVectorView (T &&t)
 Create flat vector view of passed container temporary.
 
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 {} │ │ │ │ │ @@ -1,35 +1,38 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -flatvectorview.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +defaultnodetorangemap.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p_<_ _T_r_e_e_ _> │ │ │ │ │ +  A simple node to range map using lexicographic ordering. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p_<_ _T_r_e_e_ _>_:_:_V_i_s_i_t_o_r │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_l_a_t_V_e_c_t_o_r_V_i_e_w (T &t) │ │ │ │ │ -  Create flat vector view of passed mutable container. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_l_a_t_V_e_c_t_o_r_V_i_e_w (const T &t) │ │ │ │ │ -  Create flat vector view of passed const container. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_l_a_t_V_e_c_t_o_r_V_i_e_w (T &&t) │ │ │ │ │ -  Create flat vector view of passed container temporary. │ │ │ │ │ +template │ │ │ │ │ +_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p< Tree >  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p │ │ │ │ │ + (const Tree &tree) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p │ │ │ │ │ + (const Basis &basis, TreePath &&treePath) - │ │ │ │ │ + > decltype(makeDefaultNodeToRangeMap(TypeTree:: │ │ │ │ │ + child(basis.localView().tree(), treePath))) │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00119_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: flatvectorview.hh Source File │ │ │ │ +dune-functions: defaultnodetorangemap.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,218 +74,151 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
flatvectorview.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATVECTORVIEW_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATVECTORVIEW_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTNODETORANGEMAP_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTNODETORANGEMAP_HH
│ │ │ │
9
│ │ │ │ -
10
│ │ │ │ -
11#include <array>
│ │ │ │ -
12
│ │ │ │ -
13#include <dune/common/concept.hh>
│ │ │ │ -
14#include <dune/common/hybridutilities.hh>
│ │ │ │ -
15#include <dune/common/indices.hh>
│ │ │ │ -
16
│ │ │ │ - │ │ │ │ +
10#warning The header dune/functions/common/defaultnodetorangemap.hh is deprecated and will be removed after release 2.10.
│ │ │ │ +
11
│ │ │ │ +
12#include <dune/common/concept.hh>
│ │ │ │ +
13
│ │ │ │ + │ │ │ │ +
15
│ │ │ │ +
16#include <dune/typetree/traversal.hh>
│ │ │ │ +
17#include <dune/typetree/visitor.hh>
│ │ │ │
18
│ │ │ │
19
│ │ │ │ -
20
│ │ │ │ -
21
│ │ │ │ -
22namespace Dune {
│ │ │ │ -
23namespace Functions {
│ │ │ │ -
24namespace Impl {
│ │ │ │ -
25
│ │ │ │ -
26
│ │ │ │ -
27template<class V>
│ │ │ │ -
28struct FlatVectorBackend
│ │ │ │ -
29{
│ │ │ │ -
30
│ │ │ │ -
31 template<class VV, class Index,
│ │ │ │ -
32 std::enable_if_t< models<Concept::HasIndexAccess, VV, Index>(), int> = 0>
│ │ │ │ -
33 static decltype(auto) getEntry(VV&& v, const Index& i)
│ │ │ │ -
34 {
│ │ │ │ -
35 return v[i];
│ │ │ │ -
36 }
│ │ │ │ -
37
│ │ │ │ -
38 template<class VV, class Index,
│ │ │ │ -
39 std::enable_if_t< not models<Concept::HasIndexAccess, VV, Index>(), int> = 0>
│ │ │ │ -
40 static decltype(auto) getEntry(VV&& v, const Index&)
│ │ │ │ -
41 {
│ │ │ │ -
42 return std::forward<VV>(v);
│ │ │ │ -
43 }
│ │ │ │ -
44
│ │ │ │ -
45 template<class VV,
│ │ │ │ -
46 std::enable_if_t< models<Concept::HasSizeMethod, VV>(), int> = 0>
│ │ │ │ -
47 static auto size(VV&& v)
│ │ │ │ -
48 {
│ │ │ │ -
49 return Dune::Hybrid::size(v);
│ │ │ │ -
50 }
│ │ │ │ -
51
│ │ │ │ -
52 template<class VV,
│ │ │ │ -
53 std::enable_if_t< not models<Concept::HasSizeMethod, VV>(), int>type = 0>
│ │ │ │ -
54 static auto size(VV&&)
│ │ │ │ -
55 {
│ │ │ │ -
56 return Dune::index_constant<1>{};
│ │ │ │ -
57 }
│ │ │ │ -
58};
│ │ │ │ -
59
│ │ │ │ -
60
│ │ │ │ -
61
│ │ │ │ -
62
│ │ │ │ -
63template<class K, int n, int m>
│ │ │ │ -
64struct FlatVectorBackend<typename Dune::FieldMatrix<K, n, m> >
│ │ │ │ -
65{
│ │ │ │ -
66
│ │ │ │ -
67 template<class VV, class Index>
│ │ │ │ -
68 static decltype(auto) getEntry(VV&& v, const Index& i)
│ │ │ │ -
69 {
│ │ │ │ -
70 return v[i/m][i%m];
│ │ │ │ -
71 }
│ │ │ │ +
20namespace Dune {
│ │ │ │ +
21namespace Functions {
│ │ │ │ +
22
│ │ │ │ +
23
│ │ │ │ +
24
│ │ │ │ +
44template<class Tree>
│ │ │ │ +
│ │ │ │ +
45struct
│ │ │ │ +
46[[deprecated("DefaultNodeToRangeMap is deprecated and will be removed after release 2.10.")]]
│ │ │ │ + │ │ │ │ +
48{
│ │ │ │ +
49
│ │ │ │ +
50 // A simple visitor for computing lexicographic
│ │ │ │ +
51 // subtree indices. To identify a leaf node
│ │ │ │ +
52 // we use its treeIndex() which is unique
│ │ │ │ +
53 // wrt the whole tree and store the computed
│ │ │ │ +
54 // index in a vector indexed by the tree indices.
│ │ │ │ +
│ │ │ │ +
55 struct Visitor
│ │ │ │ +
56 : public TypeTree::TreeVisitor
│ │ │ │ +
57 , public TypeTree::DynamicTraversal
│ │ │ │ +
58 {
│ │ │ │ +
│ │ │ │ +
59 Visitor(std::vector<std::size_t>& indices) :
│ │ │ │ +
60 indices_(indices),
│ │ │ │ +
61 counter_(0)
│ │ │ │ +
62 {}
│ │ │ │ +
│ │ │ │ +
63
│ │ │ │ +
64 template<typename Node, typename TreePath>
│ │ │ │ +
│ │ │ │ +
65 void leaf(Node& node, TreePath treePath)
│ │ │ │ +
66 {
│ │ │ │ +
67 if (indices_.size() < node.treeIndex()+1)
│ │ │ │ +
68 indices_.resize(node.treeIndex()+1);
│ │ │ │ +
69 indices_[node.treeIndex()] = counter_;
│ │ │ │ +
70 ++counter_;
│ │ │ │ +
71 }
│ │ │ │ +
│ │ │ │
72
│ │ │ │ -
73 template<class VV>
│ │ │ │ -
74 static auto size(VV&& v)
│ │ │ │ -
75 {
│ │ │ │ -
76 return Dune::index_constant<n*m>{};
│ │ │ │ -
77 }
│ │ │ │ -
78};
│ │ │ │ -
79
│ │ │ │ -
80
│ │ │ │ -
81
│ │ │ │ -
82template<class K, std::size_t n>
│ │ │ │ -
83struct FlatVectorBackend< std::array<K, n> >
│ │ │ │ -
84{
│ │ │ │ -
85
│ │ │ │ -
86 template<class VV, class Index>
│ │ │ │ -
87 static decltype(auto) getEntry(VV&& v, const Index& i)
│ │ │ │ +
73 std::vector<std::size_t>& indices_;
│ │ │ │ +
74 std::size_t counter_;
│ │ │ │ +
75 };
│ │ │ │ +
│ │ │ │ +
76
│ │ │ │ +
│ │ │ │ +
87 DefaultNodeToRangeMap(const Tree& tree)
│ │ │ │
88 {
│ │ │ │ -
89 const auto innerSize = decltype(FlatVectorBackend<K>::size(v[0]))::value;
│ │ │ │ -
90 return FlatVectorBackend<K>::getEntry(v[i/innerSize], i%innerSize);
│ │ │ │ -
91 }
│ │ │ │ -
92
│ │ │ │ -
93 template<class VV>
│ │ │ │ -
94 static auto size(VV&& v)
│ │ │ │ +
89 TypeTree::applyToTree(tree, Visitor(indices_));
│ │ │ │ +
90 }
│ │ │ │ +
│ │ │ │ +
91
│ │ │ │ +
92 template<class Node, class TreePath, class Range,
│ │ │ │ +
93 std::enable_if_t<models<Concept::HasIndexAccess, Range, decltype(std::declval<Node>().treeIndex())>() and not Tree::isLeaf, int> = 0>
│ │ │ │ +
│ │ │ │ +
94 decltype(auto) operator()(const Node& node, const TreePath& treePath, Range&& y) const
│ │ │ │
95 {
│ │ │ │ -
96 const auto innerSize = decltype(FlatVectorBackend<K>::size(v[0]))::value;
│ │ │ │ -
97 return Dune::index_constant<n*innerSize>{};
│ │ │ │ -
98 }
│ │ │ │ -
99
│ │ │ │ -
100};
│ │ │ │ -
101
│ │ │ │ -
102
│ │ │ │ -
103
│ │ │ │ -
104
│ │ │ │ -
105template<class T>
│ │ │ │ -
106class FlatVectorView
│ │ │ │ -
107{
│ │ │ │ -
108 using Backend = FlatVectorBackend<std::decay_t<T>>;
│ │ │ │ -
109public:
│ │ │ │ -
110 FlatVectorView(T& t) :
│ │ │ │ -
111 t_(&t)
│ │ │ │ -
112 {}
│ │ │ │ -
113
│ │ │ │ -
114 auto size() const
│ │ │ │ -
115 {
│ │ │ │ -
116 return Backend::size(*t_);
│ │ │ │ -
117 }
│ │ │ │ +
96 return y[indices_[node.treeIndex()]];
│ │ │ │ +
97 }
│ │ │ │ +
│ │ │ │ +
98
│ │ │ │ +
99 template<class Node, class TreePath, class Range,
│ │ │ │ +
100 std::enable_if_t< not models<Concept::HasIndexAccess, Range, decltype(std::declval<Node>().treeIndex())>() or Tree::isLeaf, int> = 0>
│ │ │ │ +
│ │ │ │ +
101 decltype(auto) operator()(const Node& node, const TreePath& treePath, Range&& y) const
│ │ │ │ +
102 {
│ │ │ │ +
103 return std::forward<Range>(y);
│ │ │ │ +
104 }
│ │ │ │ +
│ │ │ │ +
105
│ │ │ │ +
106 std::vector<std::size_t> indices_;
│ │ │ │ +
107};
│ │ │ │ +
│ │ │ │ +
108
│ │ │ │ +
109
│ │ │ │ +
110
│ │ │ │ +
111template<class Tree>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
113{
│ │ │ │ +
114 return DefaultNodeToRangeMap<Tree>(tree);
│ │ │ │ +
115}
│ │ │ │ +
│ │ │ │ +
116
│ │ │ │ +
117
│ │ │ │
118
│ │ │ │ -
119 template<class Index>
│ │ │ │ -
120 decltype(auto) operator[](const Index& i) const
│ │ │ │ -
121 {
│ │ │ │ -
122 return Backend::getEntry(*t_, i);
│ │ │ │ -
123 }
│ │ │ │ -
124
│ │ │ │ -
125 template<class Index>
│ │ │ │ -
126 decltype(auto) operator[](const Index& i)
│ │ │ │ -
127 {
│ │ │ │ -
128 return Backend::getEntry(*t_, i);
│ │ │ │ -
129 }
│ │ │ │ +
119template<class Basis, class TreePath>
│ │ │ │ +
│ │ │ │ +
120auto makeDefaultNodeToRangeMap(const Basis& basis, TreePath&& treePath)
│ │ │ │ +
121 -> decltype(makeDefaultNodeToRangeMap(TypeTree::child(basis.localView().tree(),treePath)))
│ │ │ │ +
122{
│ │ │ │ +
123 auto&& localView = basis.localView();
│ │ │ │ +
124 localView.bind(*basis.gridView().template begin<0>());
│ │ │ │ +
125 auto&& tree = TypeTree::child(localView.tree(),treePath);
│ │ │ │ +
126 return makeDefaultNodeToRangeMap(tree);
│ │ │ │ +
127}
│ │ │ │ +
│ │ │ │ +
128
│ │ │ │ +
129
│ │ │ │
130
│ │ │ │ -
131private:
│ │ │ │ -
132 T* t_;
│ │ │ │ -
133};
│ │ │ │ +
131} // namespace Dune::Functions
│ │ │ │ +
132} // namespace Dune
│ │ │ │ +
133
│ │ │ │
134
│ │ │ │ -
135
│ │ │ │ -
136template<class T>
│ │ │ │ -
137class FlatVectorView<T&&>
│ │ │ │ -
138{
│ │ │ │ -
139 using Backend = FlatVectorBackend<std::decay_t<T>>;
│ │ │ │ -
140public:
│ │ │ │ -
141 FlatVectorView(T&& t) :
│ │ │ │ -
142 t_(std::move(t))
│ │ │ │ -
143 {}
│ │ │ │ -
144
│ │ │ │ -
145 auto size() const
│ │ │ │ -
146 {
│ │ │ │ -
147 return Backend::size(t_);
│ │ │ │ -
148 }
│ │ │ │ -
149
│ │ │ │ -
150 template<class Index>
│ │ │ │ -
151 decltype(auto) operator[](const Index& i) const
│ │ │ │ -
152 {
│ │ │ │ -
153 return Backend::getEntry(t_, i);
│ │ │ │ -
154 }
│ │ │ │ -
155
│ │ │ │ -
156 template<class Index>
│ │ │ │ -
157 decltype(auto) operator[](const Index& i)
│ │ │ │ -
158 {
│ │ │ │ -
159 return Backend::getEntry(t_, i);
│ │ │ │ -
160 }
│ │ │ │ -
161
│ │ │ │ -
162private:
│ │ │ │ -
163 T t_;
│ │ │ │ -
164};
│ │ │ │ -
165
│ │ │ │ -
166} // namespace Impl
│ │ │ │ -
167
│ │ │ │ -
168
│ │ │ │ -
169
│ │ │ │ -
182template<class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
184{
│ │ │ │ -
185 return Impl::FlatVectorView<T>(t);
│ │ │ │ -
186}
│ │ │ │ -
│ │ │ │ -
187
│ │ │ │ -
200template<class T>
│ │ │ │ -
│ │ │ │ -
201auto flatVectorView(const T& t)
│ │ │ │ -
202{
│ │ │ │ -
203 return Impl::FlatVectorView<const T>(t);
│ │ │ │ -
204}
│ │ │ │ -
│ │ │ │ -
205
│ │ │ │ -
218template<class T>
│ │ │ │ -
│ │ │ │ -
219auto flatVectorView(T&& t)
│ │ │ │ -
220{
│ │ │ │ -
221 return Impl::FlatVectorView<T&&>(std::move(t));
│ │ │ │ -
222}
│ │ │ │ -
│ │ │ │ -
223
│ │ │ │ -
224
│ │ │ │ -
225} // namespace Dune::Functions
│ │ │ │ -
226} // namespace Dune
│ │ │ │ -
227
│ │ │ │ -
228
│ │ │ │ -
229#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATVECTORVIEW_HH
│ │ │ │ +
135#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTNODETORANGEMAP_HH
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
auto flatVectorView(T &t)
Create flat vector view of passed mutable container.
Definition flatvectorview.hh:183
│ │ │ │ +
DefaultNodeToRangeMap< Tree > makeDefaultNodeToRangeMap(const Tree &tree)
Definition defaultnodetorangemap.hh:112
│ │ │ │ +
A simple node to range map using lexicographic ordering.
Definition defaultnodetorangemap.hh:48
│ │ │ │ +
std::vector< std::size_t > indices_
Definition defaultnodetorangemap.hh:106
│ │ │ │ +
DefaultNodeToRangeMap(const Tree &tree)
Construct DefaultNodeToRangeMap.
Definition defaultnodetorangemap.hh:87
│ │ │ │ +
Definition defaultnodetorangemap.hh:58
│ │ │ │ +
Visitor(std::vector< std::size_t > &indices)
Definition defaultnodetorangemap.hh:59
│ │ │ │ +
void leaf(Node &node, TreePath treePath)
Definition defaultnodetorangemap.hh:65
│ │ │ │ +
std::size_t counter_
Definition defaultnodetorangemap.hh:74
│ │ │ │ +
std::vector< std::size_t > & indices_
Definition defaultnodetorangemap.hh:73
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,214 +1,156 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -flatvectorview.hh │ │ │ │ │ +defaultnodetorangemap.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATVECTORVIEW_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATVECTORVIEW_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTNODETORANGEMAP_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTNODETORANGEMAP_HH │ │ │ │ │ 9 │ │ │ │ │ -10 │ │ │ │ │ -11#include │ │ │ │ │ -12 │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16 │ │ │ │ │ -17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +10#warning The header dune/functions/common/defaultnodetorangemap.hh is │ │ │ │ │ +deprecated and will be removed after release 2.10. │ │ │ │ │ +11 │ │ │ │ │ +12#include │ │ │ │ │ +13 │ │ │ │ │ +14#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +15 │ │ │ │ │ +16#include │ │ │ │ │ +17#include │ │ │ │ │ 18 │ │ │ │ │ 19 │ │ │ │ │ -20 │ │ │ │ │ -21 │ │ │ │ │ -22namespace _D_u_n_e { │ │ │ │ │ -23namespace Functions { │ │ │ │ │ -24namespace Impl { │ │ │ │ │ -25 │ │ │ │ │ -26 │ │ │ │ │ -27template │ │ │ │ │ -28struct FlatVectorBackend │ │ │ │ │ -29{ │ │ │ │ │ -30 │ │ │ │ │ -31 template(), int> = 0> │ │ │ │ │ -33 static decltype(auto) getEntry(VV&& v, const Index& i) │ │ │ │ │ -34 { │ │ │ │ │ -35 return v[i]; │ │ │ │ │ -36 } │ │ │ │ │ -37 │ │ │ │ │ -38 template(), int> = │ │ │ │ │ -0> │ │ │ │ │ -40 static decltype(auto) getEntry(VV&& v, const Index&) │ │ │ │ │ -41 { │ │ │ │ │ -42 return std::forward(v); │ │ │ │ │ -43 } │ │ │ │ │ -44 │ │ │ │ │ -45 template(), int> = 0> │ │ │ │ │ -47 static auto size(VV&& v) │ │ │ │ │ -48 { │ │ │ │ │ -49 return Dune::Hybrid::size(v); │ │ │ │ │ -50 } │ │ │ │ │ -51 │ │ │ │ │ -52 template(), int>type = 0> │ │ │ │ │ -54 static auto size(VV&&) │ │ │ │ │ -55 { │ │ │ │ │ -56 return Dune::index_constant<1>{}; │ │ │ │ │ -57 } │ │ │ │ │ -58}; │ │ │ │ │ -59 │ │ │ │ │ -60 │ │ │ │ │ -61 │ │ │ │ │ -62 │ │ │ │ │ -63template │ │ │ │ │ -64struct FlatVectorBackend > │ │ │ │ │ -65{ │ │ │ │ │ -66 │ │ │ │ │ -67 template │ │ │ │ │ -68 static decltype(auto) getEntry(VV&& v, const Index& i) │ │ │ │ │ -69 { │ │ │ │ │ -70 return v[i/m][i%m]; │ │ │ │ │ +20namespace _D_u_n_e { │ │ │ │ │ +21namespace Functions { │ │ │ │ │ +22 │ │ │ │ │ +23 │ │ │ │ │ +24 │ │ │ │ │ +44template │ │ │ │ │ +_4_5struct │ │ │ │ │ +46[[deprecated("DefaultNodeToRangeMap is deprecated and will be removed after │ │ │ │ │ +release 2.10.")]] │ │ │ │ │ +47_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p │ │ │ │ │ +48{ │ │ │ │ │ +49 │ │ │ │ │ +50 // A simple visitor for computing lexicographic │ │ │ │ │ +51 // subtree indices. To identify a leaf node │ │ │ │ │ +52 // we use its treeIndex() which is unique │ │ │ │ │ +53 // wrt the whole tree and store the computed │ │ │ │ │ +54 // index in a vector indexed by the tree indices. │ │ │ │ │ +_5_5 struct _V_i_s_i_t_o_r │ │ │ │ │ +56 : public TypeTree::TreeVisitor │ │ │ │ │ +57 , public TypeTree::DynamicTraversal │ │ │ │ │ +58 { │ │ │ │ │ +_5_9 _V_i_s_i_t_o_r(std::vector& indices) : │ │ │ │ │ +60 indices_(indices), │ │ │ │ │ +61 counter_(0) │ │ │ │ │ +62 {} │ │ │ │ │ +63 │ │ │ │ │ +64 template │ │ │ │ │ +_6_5 void _l_e_a_f(Node& node, TreePath treePath) │ │ │ │ │ +66 { │ │ │ │ │ +67 if (indices_.size() < node.treeIndex()+1) │ │ │ │ │ +68 indices_.resize(node.treeIndex()+1); │ │ │ │ │ +69 indices_[node.treeIndex()] = counter_; │ │ │ │ │ +70 ++counter_; │ │ │ │ │ 71 } │ │ │ │ │ 72 │ │ │ │ │ -73 template │ │ │ │ │ -74 static auto size(VV&& v) │ │ │ │ │ -75 { │ │ │ │ │ -76 return Dune::index_constant{}; │ │ │ │ │ -77 } │ │ │ │ │ -78}; │ │ │ │ │ -79 │ │ │ │ │ -80 │ │ │ │ │ -81 │ │ │ │ │ -82template │ │ │ │ │ -83struct FlatVectorBackend< std::array > │ │ │ │ │ -84{ │ │ │ │ │ -85 │ │ │ │ │ -86 template │ │ │ │ │ -87 static decltype(auto) getEntry(VV&& v, const Index& i) │ │ │ │ │ +_7_3 std::vector& _i_n_d_i_c_e_s__; │ │ │ │ │ +_7_4 std::size_t _c_o_u_n_t_e_r__; │ │ │ │ │ +75 }; │ │ │ │ │ +76 │ │ │ │ │ +_8_7 _D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p(const Tree& tree) │ │ │ │ │ 88 { │ │ │ │ │ -89 const auto innerSize = decltype(FlatVectorBackend::size(v[0]))::value; │ │ │ │ │ -90 return FlatVectorBackend::getEntry(v[i/innerSize], i%innerSize); │ │ │ │ │ -91 } │ │ │ │ │ -92 │ │ │ │ │ -93 template │ │ │ │ │ -94 static auto size(VV&& v) │ │ │ │ │ +89 TypeTree::applyToTree(tree, _V_i_s_i_t_o_r(indices_)); │ │ │ │ │ +90 } │ │ │ │ │ +91 │ │ │ │ │ +92 template().treeIndex())>() and not Tree::isLeaf, int> = 0> │ │ │ │ │ +_9_4 decltype(auto) operator()(const Node& node, const TreePath& treePath, │ │ │ │ │ +Range&& y) const │ │ │ │ │ 95 { │ │ │ │ │ -96 const auto innerSize = decltype(FlatVectorBackend::size(v[0]))::value; │ │ │ │ │ -97 return Dune::index_constant{}; │ │ │ │ │ -98 } │ │ │ │ │ -99 │ │ │ │ │ -100}; │ │ │ │ │ -101 │ │ │ │ │ -102 │ │ │ │ │ -103 │ │ │ │ │ -104 │ │ │ │ │ -105template │ │ │ │ │ -106class FlatVectorView │ │ │ │ │ -107{ │ │ │ │ │ -108 using Backend = FlatVectorBackend>; │ │ │ │ │ -109public: │ │ │ │ │ -110 FlatVectorView(T& t) : │ │ │ │ │ -111 t_(&t) │ │ │ │ │ -112 {} │ │ │ │ │ -113 │ │ │ │ │ -114 auto size() const │ │ │ │ │ -115 { │ │ │ │ │ -116 return Backend::size(*t_); │ │ │ │ │ -117 } │ │ │ │ │ +96 return y[indices_[node.treeIndex()]]; │ │ │ │ │ +97 } │ │ │ │ │ +98 │ │ │ │ │ +99 template().treeIndex())>() or Tree::isLeaf, int> = 0> │ │ │ │ │ +_1_0_1 decltype(auto) operator()(const Node& node, const TreePath& treePath, │ │ │ │ │ +Range&& y) const │ │ │ │ │ +102 { │ │ │ │ │ +103 return std::forward(y); │ │ │ │ │ +104 } │ │ │ │ │ +105 │ │ │ │ │ +_1_0_6 std::vector _i_n_d_i_c_e_s__; │ │ │ │ │ +107}; │ │ │ │ │ +108 │ │ │ │ │ +109 │ │ │ │ │ +110 │ │ │ │ │ +111template │ │ │ │ │ +_1_1_2_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p_<_T_r_e_e_> _m_a_k_e_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p(const Tree& tree) │ │ │ │ │ +113{ │ │ │ │ │ +114 return _D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p_<_T_r_e_e_>(tree); │ │ │ │ │ +115} │ │ │ │ │ +116 │ │ │ │ │ +117 │ │ │ │ │ 118 │ │ │ │ │ -119 template │ │ │ │ │ -120 decltype(auto) operator[](const Index& i) const │ │ │ │ │ -121 { │ │ │ │ │ -122 return Backend::getEntry(*t_, i); │ │ │ │ │ -123 } │ │ │ │ │ -124 │ │ │ │ │ -125 template │ │ │ │ │ -126 decltype(auto) operator[](const Index& i) │ │ │ │ │ -127 { │ │ │ │ │ -128 return Backend::getEntry(*t_, i); │ │ │ │ │ -129 } │ │ │ │ │ +119template │ │ │ │ │ +_1_2_0auto _m_a_k_e_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p(const Basis& basis, TreePath&& treePath) │ │ │ │ │ +121 -> decltype(_m_a_k_e_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p(TypeTree::child(basis.localView │ │ │ │ │ +().tree(),treePath))) │ │ │ │ │ +122{ │ │ │ │ │ +123 auto&& localView = basis.localView(); │ │ │ │ │ +124 localView.bind(*basis.gridView().template begin<0>()); │ │ │ │ │ +125 auto&& tree = TypeTree::child(localView.tree(),treePath); │ │ │ │ │ +126 return _m_a_k_e_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p(tree); │ │ │ │ │ +127} │ │ │ │ │ +128 │ │ │ │ │ +129 │ │ │ │ │ 130 │ │ │ │ │ -131private: │ │ │ │ │ -132 T* t_; │ │ │ │ │ -133}; │ │ │ │ │ +131} // namespace Dune::Functions │ │ │ │ │ +132} // namespace Dune │ │ │ │ │ +133 │ │ │ │ │ 134 │ │ │ │ │ -135 │ │ │ │ │ -136template │ │ │ │ │ -137class FlatVectorView │ │ │ │ │ -138{ │ │ │ │ │ -139 using Backend = FlatVectorBackend>; │ │ │ │ │ -140public: │ │ │ │ │ -141 FlatVectorView(T&& t) : │ │ │ │ │ -142 t_(std::move(t)) │ │ │ │ │ -143 {} │ │ │ │ │ -144 │ │ │ │ │ -145 auto size() const │ │ │ │ │ -146 { │ │ │ │ │ -147 return Backend::size(t_); │ │ │ │ │ -148 } │ │ │ │ │ -149 │ │ │ │ │ -150 template │ │ │ │ │ -151 decltype(auto) operator[](const Index& i) const │ │ │ │ │ -152 { │ │ │ │ │ -153 return Backend::getEntry(t_, i); │ │ │ │ │ -154 } │ │ │ │ │ -155 │ │ │ │ │ -156 template │ │ │ │ │ -157 decltype(auto) operator[](const Index& i) │ │ │ │ │ -158 { │ │ │ │ │ -159 return Backend::getEntry(t_, i); │ │ │ │ │ -160 } │ │ │ │ │ -161 │ │ │ │ │ -162private: │ │ │ │ │ -163 T t_; │ │ │ │ │ -164}; │ │ │ │ │ -165 │ │ │ │ │ -166} // namespace Impl │ │ │ │ │ -167 │ │ │ │ │ -168 │ │ │ │ │ -169 │ │ │ │ │ -182template │ │ │ │ │ -_1_8_3auto _f_l_a_t_V_e_c_t_o_r_V_i_e_w(T& t) │ │ │ │ │ -184{ │ │ │ │ │ -185 return Impl::FlatVectorView(t); │ │ │ │ │ -186} │ │ │ │ │ -187 │ │ │ │ │ -200template │ │ │ │ │ -_2_0_1auto _f_l_a_t_V_e_c_t_o_r_V_i_e_w(const T& t) │ │ │ │ │ -202{ │ │ │ │ │ -203 return Impl::FlatVectorView(t); │ │ │ │ │ -204} │ │ │ │ │ -205 │ │ │ │ │ -218template │ │ │ │ │ -_2_1_9auto _f_l_a_t_V_e_c_t_o_r_V_i_e_w(T&& t) │ │ │ │ │ -220{ │ │ │ │ │ -221 return Impl::FlatVectorView(std::move(t)); │ │ │ │ │ -222} │ │ │ │ │ -223 │ │ │ │ │ -224 │ │ │ │ │ -225} // namespace Dune::Functions │ │ │ │ │ -226} // namespace Dune │ │ │ │ │ -227 │ │ │ │ │ -228 │ │ │ │ │ -229#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATVECTORVIEW_HH │ │ │ │ │ +135#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTNODETORANGEMAP_HH │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_l_a_t_V_e_c_t_o_r_V_i_e_w │ │ │ │ │ -auto flatVectorView(T &t) │ │ │ │ │ -Create flat vector view of passed mutable container. │ │ │ │ │ -DDeeffiinniittiioonn flatvectorview.hh:183 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p │ │ │ │ │ +DefaultNodeToRangeMap< Tree > makeDefaultNodeToRangeMap(const Tree &tree) │ │ │ │ │ +DDeeffiinniittiioonn defaultnodetorangemap.hh:112 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p │ │ │ │ │ +A simple node to range map using lexicographic ordering. │ │ │ │ │ +DDeeffiinniittiioonn defaultnodetorangemap.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p_:_:_i_n_d_i_c_e_s__ │ │ │ │ │ +std::vector< std::size_t > indices_ │ │ │ │ │ +DDeeffiinniittiioonn defaultnodetorangemap.hh:106 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p_:_:_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p │ │ │ │ │ +DefaultNodeToRangeMap(const Tree &tree) │ │ │ │ │ +Construct DefaultNodeToRangeMap. │ │ │ │ │ +DDeeffiinniittiioonn defaultnodetorangemap.hh:87 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p_:_:_V_i_s_i_t_o_r │ │ │ │ │ +DDeeffiinniittiioonn defaultnodetorangemap.hh:58 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p_:_:_V_i_s_i_t_o_r_:_:_V_i_s_i_t_o_r │ │ │ │ │ +Visitor(std::vector< std::size_t > &indices) │ │ │ │ │ +DDeeffiinniittiioonn defaultnodetorangemap.hh:59 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p_:_:_V_i_s_i_t_o_r_:_:_l_e_a_f │ │ │ │ │ +void leaf(Node &node, TreePath treePath) │ │ │ │ │ +DDeeffiinniittiioonn defaultnodetorangemap.hh:65 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p_:_:_V_i_s_i_t_o_r_:_:_c_o_u_n_t_e_r__ │ │ │ │ │ +std::size_t counter_ │ │ │ │ │ +DDeeffiinniittiioonn defaultnodetorangemap.hh:74 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p_:_:_V_i_s_i_t_o_r_:_:_i_n_d_i_c_e_s__ │ │ │ │ │ +std::vector< std::size_t > & indices_ │ │ │ │ │ +DDeeffiinniittiioonn defaultnodetorangemap.hh:73 │ │ │ │ │ _c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00122.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: nedelecbasis.hh File Reference │ │ │ │ +dune-functions: lagrangedgbasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,59 +74,57 @@ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Typedefs | │ │ │ │ Functions
│ │ │ │ -
nedelecbasis.hh File Reference
│ │ │ │ +
lagrangedgbasis.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/leafprebasismixin.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/nodes.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/functions/functionspacebases/leafprebasismixin.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::LagrangeDGPreBasis< GV, k >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

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

│ │ │ │ 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.
 
template<std::size_t k>
auto Dune::Functions::BasisFactory::lagrangeDG ()
 Create a pre-basis factory that can create a LagrangeDG pre-basis.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -utf-8 │ │ │ │ │ +us-ascii │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -2,45 +2,42 @@ │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -nedelecbasis.hh File Reference │ │ │ │ │ +lagrangedgbasis.hh File Reference │ │ │ │ │ #include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_g_l_o_b_a_l_v_a_l_u_e_d_l_o_c_a_l_f_i_n_i_t_e_e_l_e_m_e_n_t_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_a_g_r_a_n_g_e_b_a_s_i_s_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_<_ _G_V_,_ _R_a_n_g_e_,_ _k_i_n_d_,_ _o_r_d_e_r_ _> │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e_<_ _G_V_,_ _R_a_n_g_e_,_ _k_i_n_d_,_ _o_r_d_e_r_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_<_ _G_V_,_ _k_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y │ │ │ │ │   │ │ │ │ │ TTyyppeeddeeffss │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s< _N_e_d_e_l_e_c_P_r_e_B_a_s_i_s< GV, │ │ │ │ │ - Range, kind, order > > │ │ │ │ │ -  Basis of a k-th-order Nédélec finite element space. │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_N_o_d_e = _L_a_g_r_a_n_g_e_N_o_d_e< GV, k > │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s< │ │ │ │ │ + _L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s< GV, k > > │ │ │ │ │ +  Basis of a scalar k-th-order Lagrangean-DG finite element space. │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_n_e_d_e_l_e_c () │ │ │ │ │ -  Create a pre-basis factory that can create a Nédélec pre-basis. │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_l_a_g_r_a_n_g_e_D_G () │ │ │ │ │ +  Create a pre-basis factory that can create a LagrangeDG pre-basis. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00122_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: nedelecbasis.hh Source File │ │ │ │ +dune-functions: lagrangedgbasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,398 +74,291 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
nedelecbasis.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NEDELECBASIS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NEDELECBASIS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH
│ │ │ │
9
│ │ │ │
10#include <array>
│ │ │ │
11#include <dune/common/exceptions.hh>
│ │ │ │ -
12
│ │ │ │ -
13#include <dune/grid/common/capabilities.hh>
│ │ │ │ -
14#include <dune/grid/common/mcmgmapper.hh>
│ │ │ │ -
15
│ │ │ │ -
16#include <dune/localfunctions/common/localfiniteelementvariant.hh>
│ │ │ │ -
17#include <dune/localfunctions/nedelec.hh>
│ │ │ │ +
12#include <dune/common/math.hh>
│ │ │ │ +
13
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
18
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
23
│ │ │ │ -
24namespace Dune::Functions
│ │ │ │ -
25{
│ │ │ │ +
19
│ │ │ │ +
20
│ │ │ │ +
21
│ │ │ │ +
22namespace Dune {
│ │ │ │ +
23namespace Functions {
│ │ │ │ +
24
│ │ │ │ +
25
│ │ │ │
26
│ │ │ │ -
27namespace Impl
│ │ │ │ -
28{
│ │ │ │ -
29 template<typename GV, int dim, typename R, std::size_t order>
│ │ │ │ -
30 class Nedelec1stKindLocalFiniteElementMap
│ │ │ │ -
31 {
│ │ │ │ -
32 using D = typename GV::ctype;
│ │ │ │ -
33 constexpr static bool hasFixedElementType = Capabilities::hasSingleGeometryType<typename GV::Grid>::v;
│ │ │ │ -
34
│ │ │ │ -
35 using CubeFiniteElement = Nedelec1stKindCubeLocalFiniteElement<D,R,dim,order>;
│ │ │ │ -
36 using SimplexFiniteElement = Nedelec1stKindSimplexLocalFiniteElement<D,R,dim,order>;
│ │ │ │ +
27// *****************************************************************************
│ │ │ │ +
28// This is the reusable part of the basis. It contains
│ │ │ │ +
29//
│ │ │ │ +
30// LagrangeDGPreBasis
│ │ │ │ +
31// LagrangeDGNode
│ │ │ │ +
32//
│ │ │ │ +
33// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ +
34// state. These components do _not_ depend on the global basis and local view
│ │ │ │ +
35// and can be used without a global basis.
│ │ │ │ +
36// *****************************************************************************
│ │ │ │
37
│ │ │ │ -
38 public:
│ │ │ │ -
39
│ │ │ │ -
40 using T = LocalBasisTraits<D, dim, FieldVector<D,dim>, R, dim, FieldVector<R,dim>, FieldMatrix<D,dim,dim> >;
│ │ │ │ -
41
│ │ │ │ -
42 constexpr static unsigned int topologyId = Capabilities::hasSingleGeometryType<typename GV::Grid>::topologyId; // meaningless if hasFixedElementType is false
│ │ │ │ -
43 constexpr static GeometryType type = GeometryType(topologyId, GV::dimension);
│ │ │ │ -
44
│ │ │ │ -
45 using FiniteElement = std::conditional_t<hasFixedElementType,
│ │ │ │ -
46 std::conditional_t<type.isCube(),CubeFiniteElement,SimplexFiniteElement>,
│ │ │ │ -
47 LocalFiniteElementVariant<CubeFiniteElement, SimplexFiniteElement> >;
│ │ │ │ +
38template<typename GV, int k>
│ │ │ │ + │ │ │ │ +
40
│ │ │ │ +
41template<typename GV, int k>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
43 public LeafPreBasisMixin< LagrangeDGPreBasis<GV,k> >
│ │ │ │ +
44{
│ │ │ │ +
45 static const int dim = GV::dimension;
│ │ │ │ +
46
│ │ │ │ +
47public:
│ │ │ │
48
│ │ │ │ -
49 static std::size_t numVariants(GeometryType type)
│ │ │ │ -
50 {
│ │ │ │ -
51 if (order!=1) // I am not sure whether the formula below is correct for all orders.
│ │ │ │ -
52 DUNE_THROW(NotImplemented, "Only Nedelec elements of order 1 are implemented!");
│ │ │ │ +
50 using GridView = GV;
│ │ │ │ +
51 using size_type = std::size_t;
│ │ │ │ +
52
│ │ │ │
53
│ │ │ │ -
54 auto numEdges = referenceElement<D,dim>(type).size(dim-1);
│ │ │ │ -
55 return power(2,numEdges);
│ │ │ │ -
56 }
│ │ │ │ -
57
│ │ │ │ -
58 Nedelec1stKindLocalFiniteElementMap(const GV& gv)
│ │ │ │ -
59 : elementMapper_(gv, mcmgElementLayout()),
│ │ │ │ -
60 orientation_(gv.size(0))
│ │ │ │ -
61 {
│ │ │ │ -
62 // create all variants
│ │ │ │ -
63 if constexpr (hasFixedElementType)
│ │ │ │ -
64 {
│ │ │ │ -
65 variants_.resize(numVariants(type));
│ │ │ │ -
66 for (size_t i = 0; i < numVariants(type); i++)
│ │ │ │ -
67 variants_[i] = FiniteElement(i);
│ │ │ │ -
68 }
│ │ │ │ -
69 else
│ │ │ │ -
70 {
│ │ │ │ -
71 // for mixed grids add offset for cubes
│ │ │ │ -
72 variants_.resize(numVariants(GeometryTypes::simplex(dim)) + numVariants(GeometryTypes::cube(dim)));
│ │ │ │ -
73 for (size_t i = 0; i < numVariants(GeometryTypes::simplex(dim)); i++)
│ │ │ │ -
74 variants_[i] = SimplexFiniteElement(i);
│ │ │ │ -
75 for (size_t i = 0; i < numVariants(GeometryTypes::cube(dim)); i++)
│ │ │ │ -
76 variants_[i + numVariants(GeometryTypes::simplex(dim))] = CubeFiniteElement(i);
│ │ │ │ -
77 }
│ │ │ │ -
78
│ │ │ │ -
79
│ │ │ │ -
80 // compute orientation for all elements
│ │ │ │ -
81 const auto& indexSet = gv.indexSet();
│ │ │ │ -
82
│ │ │ │ -
83 for(const auto& element : elements(gv))
│ │ │ │ -
84 {
│ │ │ │ -
85 const auto& refElement = referenceElement(element);
│ │ │ │ -
86 auto elementIndex = elementMapper_.index(element);
│ │ │ │ -
87 orientation_[elementIndex] = 0;
│ │ │ │ +
54 // Precompute the number of dofs per entity type
│ │ │ │ +
55 const static int dofsPerEdge = k+1;
│ │ │ │ +
56 const static int dofsPerTriangle = (k+1)*(k+2)/2;
│ │ │ │ +
57 const static int dofsPerQuad = (k+1)*(k+1);
│ │ │ │ +
58 const static int dofsPerTetrahedron = (k+1)*(k+2)*(k+3)/6;
│ │ │ │ +
59 const static int dofsPerPrism = (k+1)*(k+1)*(k+2)/2;
│ │ │ │ +
60 const static int dofsPerHexahedron = (k+1)*(k+1)*(k+1);
│ │ │ │ +
61 const static int dofsPerPyramid = (k+1)*(k+2)*(2*k+3)/6;
│ │ │ │ +
62
│ │ │ │ +
63
│ │ │ │ + │ │ │ │ +
65
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
68 gridView_(gv)
│ │ │ │ +
69 {}
│ │ │ │ +
│ │ │ │ +
70
│ │ │ │ +
71
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
73 {
│ │ │ │ +
74 switch (dim)
│ │ │ │ +
75 {
│ │ │ │ +
76 case 1:
│ │ │ │ +
77 {
│ │ │ │ +
78 break;
│ │ │ │ +
79 }
│ │ │ │ +
80 case 2:
│ │ │ │ +
81 {
│ │ │ │ +
82 quadrilateralOffset_ = dofsPerTriangle * gridView_.size(Dune::GeometryTypes::triangle);
│ │ │ │ +
83 break;
│ │ │ │ +
84 }
│ │ │ │ +
85 case 3:
│ │ │ │ +
86 {
│ │ │ │ +
87 prismOffset_ = dofsPerTetrahedron * gridView_.size(Dune::GeometryTypes::tetrahedron);
│ │ │ │
88
│ │ │ │ -
89 for (std::size_t i=0; i<element.subEntities(dim-1); i++)
│ │ │ │ -
90 {
│ │ │ │ -
91 // Local vertex indices within the element
│ │ │ │ -
92 auto localV0 = refElement.subEntity(i,dim-1, 0,dim);
│ │ │ │ -
93 auto localV1 = refElement.subEntity(i,dim-1, 1,dim);
│ │ │ │ -
94
│ │ │ │ -
95 // Global vertex indices within the grid
│ │ │ │ -
96 auto globalV0 = indexSet.subIndex(element,localV0,dim);
│ │ │ │ -
97 auto globalV1 = indexSet.subIndex(element,localV1,dim);
│ │ │ │ -
98
│ │ │ │ -
99 if ( (localV0<localV1 && globalV0>globalV1) || (localV0>localV1 && globalV0<globalV1) )
│ │ │ │ -
100 orientation_[elementIndex] |= (1 << i);
│ │ │ │ -
101 }
│ │ │ │ -
102 // for mixed grids add offset for cubes
│ │ │ │ -
103 if constexpr (!hasFixedElementType)
│ │ │ │ -
104 if (element.type().isCube())
│ │ │ │ -
105 orientation_[elementIndex] += numVariants(GeometryTypes::simplex(dim));
│ │ │ │ -
106 }
│ │ │ │ -
107 }
│ │ │ │ +
89 hexahedronOffset_ = prismOffset_ + dofsPerPrism * gridView_.size(Dune::GeometryTypes::prism);
│ │ │ │ +
90
│ │ │ │ +
91 pyramidOffset_ = hexahedronOffset_ + dofsPerHexahedron * gridView_.size(Dune::GeometryTypes::hexahedron);
│ │ │ │ +
92 break;
│ │ │ │ +
93 }
│ │ │ │ +
94 }
│ │ │ │ +
95 }
│ │ │ │ +
│ │ │ │ +
96
│ │ │ │ +
│ │ │ │ +
99 const GridView& gridView() const
│ │ │ │ +
100 {
│ │ │ │ +
101 return gridView_;
│ │ │ │ +
102 }
│ │ │ │ +
│ │ │ │ +
103
│ │ │ │ +
│ │ │ │ +
104 void update(const GridView& gv)
│ │ │ │ +
105 {
│ │ │ │ +
106 gridView_ = gv;
│ │ │ │ +
107 }
│ │ │ │ +
│ │ │ │
108
│ │ │ │ -
109 template<class Element>
│ │ │ │ -
110 const auto& find(const Element& element) const
│ │ │ │ -
111 {
│ │ │ │ -
112 return variants_[orientation_[elementMapper_.index(element)]];
│ │ │ │ -
113 }
│ │ │ │ -
114
│ │ │ │ -
115 private:
│ │ │ │ -
116 std::vector<FiniteElement> variants_;
│ │ │ │ -
117 Dune::MultipleCodimMultipleGeomTypeMapper<GV> elementMapper_;
│ │ │ │ -
118 std::vector<unsigned short> orientation_;
│ │ │ │ -
119 };
│ │ │ │ -
120
│ │ │ │ -
121
│ │ │ │ -
122} // namespace Impl
│ │ │ │ -
123
│ │ │ │ -
124
│ │ │ │ -
125// *****************************************************************************
│ │ │ │ -
126// This is the reusable part of the basis. It contains
│ │ │ │ -
127//
│ │ │ │ -
128// NedelecPreBasis
│ │ │ │ -
129// NedelecNode
│ │ │ │ -
130//
│ │ │ │ -
131// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ -
132// state. These components do _not_ depend on the global basis and local view
│ │ │ │ -
133// and can be used without a global basis.
│ │ │ │ -
134// *****************************************************************************
│ │ │ │ -
135
│ │ │ │ -
136template<typename GV, typename Range, std::size_t kind, int order>
│ │ │ │ -
137class NedelecNode;
│ │ │ │ -
138
│ │ │ │ -
139template<typename GV, typename Range, std::size_t kind, int order>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
141 public LeafPreBasisMixin< NedelecPreBasis<GV,Range,kind,order> >
│ │ │ │ -
142{
│ │ │ │ -
143 static const int dim = GV::dimension;
│ │ │ │ -
144 static_assert(kind==1, "Only the Nedelec basis of the first kind is currently implemented!");
│ │ │ │ -
145 using FiniteElementMap = typename Impl::Nedelec1stKindLocalFiniteElementMap<GV, dim, Range, order>;
│ │ │ │ -
146
│ │ │ │ -
147 using Mapper = Dune::MultipleCodimMultipleGeomTypeMapper<GV>;
│ │ │ │ -
148public:
│ │ │ │ -
149
│ │ │ │ -
151 using GridView = GV;
│ │ │ │ -
152 using size_type = std::size_t;
│ │ │ │ -
153
│ │ │ │ - │ │ │ │ -
155
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
158 gridView_(gv),
│ │ │ │ - │ │ │ │ -
160 mapper_(gridView_, mcmgLayout(Dim<1>{}))
│ │ │ │ -
161 {
│ │ │ │ -
162 if (kind!=1)
│ │ │ │ -
163 DUNE_THROW(NotImplemented, "Only Nedelec elements of the first kind are implemented!");
│ │ │ │ -
164
│ │ │ │ -
165 // There is no inherent reason why the basis shouldn't work for grids with more than two
│ │ │ │ -
166 // element types. Somebody simply has to sit down and implement the missing bits.
│ │ │ │ -
167 if (gv.indexSet().types(0).size() > 2)
│ │ │ │ -
168 DUNE_THROW(NotImplemented, "Nédélec basis is only implemented for grids with simplex and cube elements");
│ │ │ │ -
169
│ │ │ │ -
170 for(auto type : gv.indexSet().types(0))
│ │ │ │ -
171 if (!type.isSimplex() && !type.isCube())
│ │ │ │ -
172 DUNE_THROW(NotImplemented, "Nédélec basis is only implemented for grids with simplex or cube elements.");
│ │ │ │ -
173
│ │ │ │ -
174 if (order>1)
│ │ │ │ -
175 DUNE_THROW(NotImplemented, "Only first-order elements are implemented");
│ │ │ │ -
176
│ │ │ │ -
177 if (dim!=2 && dim!=3)
│ │ │ │ -
178 DUNE_THROW(NotImplemented, "Only 2d and 3d Nédélec elements are implemented");
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
113 {
│ │ │ │ +
114 return Node{};
│ │ │ │ +
115 }
│ │ │ │ +
│ │ │ │ +
116
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
118 {
│ │ │ │ +
119 switch (dim)
│ │ │ │ +
120 {
│ │ │ │ +
121 case 1:
│ │ │ │ +
122 return dofsPerEdge*gridView_.size(0);
│ │ │ │ +
123 case 2:
│ │ │ │ +
124 {
│ │ │ │ +
125 return dofsPerTriangle*gridView_.size(Dune::GeometryTypes::triangle) + dofsPerQuad*gridView_.size(Dune::GeometryTypes::quadrilateral);
│ │ │ │ +
126 }
│ │ │ │ +
127 case 3:
│ │ │ │ +
128 {
│ │ │ │ +
129 return dofsPerTetrahedron*gridView_.size(Dune::GeometryTypes::tetrahedron)
│ │ │ │ +
130 + dofsPerPyramid*gridView_.size(Dune::GeometryTypes::pyramid)
│ │ │ │ +
131 + dofsPerPrism*gridView_.size(Dune::GeometryTypes::prism)
│ │ │ │ +
132 + dofsPerHexahedron*gridView_.size(Dune::GeometryTypes::hexahedron);
│ │ │ │ +
133 }
│ │ │ │ +
134 }
│ │ │ │ +
135 DUNE_THROW(Dune::NotImplemented, "No size method for " << dim << "d grids available yet!");
│ │ │ │ +
136 }
│ │ │ │ +
│ │ │ │ +
137
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
139 {
│ │ │ │ +
140 return Dune::power(k+1, int(GV::dimension));
│ │ │ │ +
141 }
│ │ │ │ +
│ │ │ │ +
142
│ │ │ │ +
143 template<typename It>
│ │ │ │ +
│ │ │ │ +
144 It indices(const Node& node, It it) const
│ │ │ │ +
145 {
│ │ │ │ +
146 const auto& gridIndexSet = gridView().indexSet();
│ │ │ │ +
147 const auto& element = node.element();
│ │ │ │ +
148
│ │ │ │ +
149 size_type offset = 0;
│ │ │ │ +
150 if constexpr (dim==1)
│ │ │ │ +
151 offset = dofsPerEdge*gridIndexSet.subIndex(element,0,0);
│ │ │ │ +
152 else if constexpr (dim==2)
│ │ │ │ +
153 {
│ │ │ │ +
154 if (element.type().isTriangle())
│ │ │ │ +
155 offset = dofsPerTriangle*gridIndexSet.subIndex(element,0,0);
│ │ │ │ +
156 else if (element.type().isQuadrilateral())
│ │ │ │ +
157 offset = quadrilateralOffset_ + dofsPerQuad*gridIndexSet.subIndex(element,0,0);
│ │ │ │ +
158 else
│ │ │ │ +
159 DUNE_THROW(Dune::NotImplemented, "2d elements have to be triangles or quadrilaterals");
│ │ │ │ +
160 }
│ │ │ │ +
161 else if constexpr (dim==3)
│ │ │ │ +
162 {
│ │ │ │ +
163 if (element.type().isTetrahedron())
│ │ │ │ +
164 offset = dofsPerTetrahedron*gridIndexSet.subIndex(element,0,0);
│ │ │ │ +
165 else if (element.type().isPrism())
│ │ │ │ +
166 offset = prismOffset_ + dofsPerPrism*gridIndexSet.subIndex(element,0,0);
│ │ │ │ +
167 else if (element.type().isHexahedron())
│ │ │ │ +
168 offset = hexahedronOffset_ + dofsPerHexahedron*gridIndexSet.subIndex(element,0,0);
│ │ │ │ +
169 else if (element.type().isPyramid())
│ │ │ │ +
170 offset = pyramidOffset_ + dofsPerPyramid*gridIndexSet.subIndex(element,0,0);
│ │ │ │ +
171 else
│ │ │ │ +
172 DUNE_THROW(Dune::NotImplemented, "3d elements have to be tetrahedrons, prisms, hexahedrons or pyramids");
│ │ │ │ +
173 }
│ │ │ │ +
174 else
│ │ │ │ +
175 DUNE_THROW(Dune::NotImplemented, "No index method for " << dim << "d grids available yet!");
│ │ │ │ +
176 for (size_type i = 0, end = node.size() ; i < end ; ++i, ++it)
│ │ │ │ +
177 *it = {offset + i};
│ │ │ │ +
178 return it;
│ │ │ │
179 }
│ │ │ │
│ │ │ │
180
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
182 {}
│ │ │ │ -
│ │ │ │ -
183
│ │ │ │ -
│ │ │ │ -
186 const GridView& gridView() const
│ │ │ │ -
187 {
│ │ │ │ -
188 return gridView_;
│ │ │ │ -
189 }
│ │ │ │ -
│ │ │ │ -
190
│ │ │ │ -
191 /* \brief Update the stored grid view, to be called if the grid has changed */
│ │ │ │ -
│ │ │ │ -
192 void update (const GridView& gv)
│ │ │ │ -
193 {
│ │ │ │ -
194 gridView_ = gv;
│ │ │ │ -
195 mapper_.update(gridView_);
│ │ │ │ -
196 }
│ │ │ │ +
│ │ │ │ +
182 unsigned int order() const
│ │ │ │ +
183 {
│ │ │ │ +
184 return k;
│ │ │ │ +
185 }
│ │ │ │ +
│ │ │ │ +
186
│ │ │ │ +
187protected:
│ │ │ │ + │ │ │ │ +
189
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
194};
│ │ │ │
│ │ │ │ +
195
│ │ │ │ +
196
│ │ │ │
197
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
202 {
│ │ │ │ -
203 return Node{&finiteElementMap_};
│ │ │ │ -
204 }
│ │ │ │ -
│ │ │ │ -
205
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
207 {
│ │ │ │ -
208 return mapper_.size();
│ │ │ │ -
209 }
│ │ │ │ -
│ │ │ │ -
210
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
212 {
│ │ │ │ -
213 size_type result = 0;
│ │ │ │ -
214 for (auto&& type : gridView_.indexSet().types(0))
│ │ │ │ -
215 {
│ │ │ │ -
216 size_type numEdges = referenceElement<typename GV::ctype,dim>(type).size(dim-1);
│ │ │ │ -
217 result = std::max(result, numEdges);
│ │ │ │ -
218 }
│ │ │ │ -
219
│ │ │ │ -
220 return result;
│ │ │ │ -
221 }
│ │ │ │ -
│ │ │ │ +
198namespace BasisFactory {
│ │ │ │ +
199
│ │ │ │ +
207template<std::size_t k>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
209{
│ │ │ │ +
210 return [](const auto& gridView) {
│ │ │ │ +
211 return LagrangeDGPreBasis<std::decay_t<decltype(gridView)>, k>(gridView);
│ │ │ │ +
212 };
│ │ │ │ +
213}
│ │ │ │ +
│ │ │ │ +
214
│ │ │ │ +
215} // end namespace BasisFactory
│ │ │ │ +
216
│ │ │ │ +
217
│ │ │ │ +
218
│ │ │ │ +
219// *****************************************************************************
│ │ │ │ +
220// This is the actual global basis implementation based on the reusable parts.
│ │ │ │ +
221// *****************************************************************************
│ │ │ │
222
│ │ │ │ -
226 template<typename It>
│ │ │ │ -
│ │ │ │ -
227 It indices(const Node& node, It it) const
│ │ │ │ -
228 {
│ │ │ │ -
229 const auto& element = node.element();
│ │ │ │ -
230
│ │ │ │ -
231 // throw if Element is not of predefined type
│ │ │ │ -
232 if (not(element.type().isCube()) and not(element.type().isSimplex()))
│ │ │ │ -
233 DUNE_THROW(NotImplemented, "NedelecBasis only implemented for cube and simplex elements.");
│ │ │ │ +
230template<typename GV, int k>
│ │ │ │ + │ │ │ │ +
232
│ │ │ │ +
233
│ │ │ │
234
│ │ │ │ -
235 for(std::size_t i=0, end=node.size(); i<end; ++i, ++it)
│ │ │ │ -
236 {
│ │ │ │ -
237 Dune::LocalKey localKey = node.finiteElement().localCoefficients().localKey(i);
│ │ │ │ -
238 *it = { mapper_.subIndex(element, localKey.subEntity(), localKey.codim()) + localKey.index() };
│ │ │ │ -
239 }
│ │ │ │ -
240
│ │ │ │ -
241 return it;
│ │ │ │ -
242 }
│ │ │ │ -
│ │ │ │ -
243
│ │ │ │ -
244protected:
│ │ │ │ - │ │ │ │ -
246 FiniteElementMap finiteElementMap_;
│ │ │ │ -
247 Mapper mapper_;
│ │ │ │ -
248};
│ │ │ │ -
│ │ │ │ -
249
│ │ │ │ -
250
│ │ │ │ -
251
│ │ │ │ -
252template<typename GV, typename Range, size_t kind, int order>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
254 public LeafBasisNode
│ │ │ │ -
255{
│ │ │ │ -
256 static const int dim = GV::dimension;
│ │ │ │ -
257
│ │ │ │ -
258public:
│ │ │ │ -
259
│ │ │ │ -
260 using size_type = std::size_t;
│ │ │ │ -
261 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ -
262 static_assert(kind==1, "Only Nedelec elements of the first kind are implemented!");
│ │ │ │ -
263 using FiniteElementMap = typename Impl::Nedelec1stKindLocalFiniteElementMap<GV, dim, Range, order>;
│ │ │ │ -
264 using FiniteElement = Impl::GlobalValuedLocalFiniteElement<Impl::CovariantPiolaTransformator,
│ │ │ │ -
265 typename FiniteElementMap::FiniteElement,
│ │ │ │ -
266 Element>;
│ │ │ │ -
267
│ │ │ │ -
│ │ │ │ -
268 NedelecNode(const FiniteElementMap* finiteElementMap) :
│ │ │ │ -
269 element_(nullptr),
│ │ │ │ -
270 finiteElementMap_(finiteElementMap)
│ │ │ │ -
271 { }
│ │ │ │ -
│ │ │ │ -
272
│ │ │ │ -
│ │ │ │ -
274 const Element& element() const
│ │ │ │ -
275 {
│ │ │ │ -
276 return *element_;
│ │ │ │ -
277 }
│ │ │ │ -
│ │ │ │ -
278
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
284 {
│ │ │ │ -
285 return finiteElement_;
│ │ │ │ -
286 }
│ │ │ │ -
│ │ │ │ -
287
│ │ │ │ -
│ │ │ │ -
289 void bind(const Element& e)
│ │ │ │ -
290 {
│ │ │ │ -
291 element_ = &e;
│ │ │ │ -
292 finiteElement_.bind((finiteElementMap_->find(*element_)), e);
│ │ │ │ -
293 this->setSize(finiteElement_.size());
│ │ │ │ -
294 }
│ │ │ │ -
│ │ │ │ -
295
│ │ │ │ -
296protected:
│ │ │ │ -
297
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
301};
│ │ │ │ -
│ │ │ │ -
302
│ │ │ │ -
303
│ │ │ │ -
304
│ │ │ │ -
305namespace BasisFactory {
│ │ │ │ -
306
│ │ │ │ -
316template<std::size_t kind, std::size_t order, typename Range=double>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
318{
│ │ │ │ -
319 return [](const auto& gridView) {
│ │ │ │ -
320 return NedelecPreBasis<std::decay_t<decltype(gridView)>, Range, kind, order>(gridView);
│ │ │ │ -
321 };
│ │ │ │ -
322}
│ │ │ │ -
│ │ │ │ -
323
│ │ │ │ -
324} // end namespace BasisFactory
│ │ │ │ -
325
│ │ │ │ -
326
│ │ │ │ -
327
│ │ │ │ -
328// *****************************************************************************
│ │ │ │ -
329// This is the actual global basis implementation based on the reusable parts.
│ │ │ │ -
330// *****************************************************************************
│ │ │ │ -
331
│ │ │ │ -
339template<typename GV, std::size_t kind, std::size_t order, typename Range=double>
│ │ │ │ - │ │ │ │ -
341
│ │ │ │ -
342} // end namespace Dune::Functions
│ │ │ │ -
343
│ │ │ │ -
344
│ │ │ │ -
345#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NEDELECBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
auto power(ChildPreBasisFactory &&childPreBasisFactory, std::size_t k, const IndexMergingStrategy &)
Create a pre-basis factory that can build a PowerPreBasis.
Definition dynamicpowerbasis.hh:409
│ │ │ │ -
auto nedelec()
Create a pre-basis factory that can create a Nédélec pre-basis.
Definition nedelecbasis.hh:317
│ │ │ │ -
Definition polynomial.hh:18
│ │ │ │ +
235} // end namespace Functions
│ │ │ │ +
236} // end namespace Dune
│ │ │ │ +
237
│ │ │ │ +
238
│ │ │ │ +
239#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
auto lagrangeDG()
Create a pre-basis factory that can create a LagrangeDG pre-basis.
Definition lagrangedgbasis.hh:208
│ │ │ │ +
Definition polynomial.hh:17
│ │ │ │
Global basis for given pre-basis.
Definition defaultglobalbasis.hh:50
│ │ │ │ +
Definition lagrangebasis.hh:375
│ │ │ │ +
const Element & element() const
Return current element, throw if unbound.
Definition lagrangebasis.hh:427
│ │ │ │ +
Definition lagrangedgbasis.hh:44
│ │ │ │ +
It indices(const Node &node, It it) const
Definition lagrangedgbasis.hh:144
│ │ │ │ +
size_type maxNodeSize() const
Definition lagrangedgbasis.hh:138
│ │ │ │ +
unsigned int order() const
Polynomial order used in the local Lagrange finite-elements.
Definition lagrangedgbasis.hh:182
│ │ │ │ +
void update(const GridView &gv)
Definition lagrangedgbasis.hh:104
│ │ │ │ +
size_t hexahedronOffset_
Definition lagrangedgbasis.hh:193
│ │ │ │ +
Node makeNode() const
Create tree node.
Definition lagrangedgbasis.hh:112
│ │ │ │ +
static const int dofsPerHexahedron
Definition lagrangedgbasis.hh:60
│ │ │ │ +
LagrangeDGPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition lagrangedgbasis.hh:67
│ │ │ │ +
size_t pyramidOffset_
Definition lagrangedgbasis.hh:191
│ │ │ │ +
static const int dofsPerTetrahedron
Definition lagrangedgbasis.hh:58
│ │ │ │ +
GV GridView
The grid view that the FE space is defined on.
Definition lagrangedgbasis.hh:50
│ │ │ │ +
void initializeIndices()
Definition lagrangedgbasis.hh:72
│ │ │ │ +
size_t quadrilateralOffset_
Definition lagrangedgbasis.hh:190
│ │ │ │ +
static const int dofsPerEdge
Definition lagrangedgbasis.hh:55
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition lagrangedgbasis.hh:99
│ │ │ │ +
static const int dofsPerQuad
Definition lagrangedgbasis.hh:57
│ │ │ │ +
static const int dofsPerTriangle
Definition lagrangedgbasis.hh:56
│ │ │ │ +
static const int dofsPerPyramid
Definition lagrangedgbasis.hh:61
│ │ │ │ +
GridView gridView_
Definition lagrangedgbasis.hh:188
│ │ │ │ +
std::size_t size_type
Definition lagrangedgbasis.hh:51
│ │ │ │ +
size_type dimension() const
Definition lagrangedgbasis.hh:117
│ │ │ │ +
size_t prismOffset_
Definition lagrangedgbasis.hh:192
│ │ │ │ +
static const int dofsPerPrism
Definition lagrangedgbasis.hh:59
│ │ │ │
A generic MixIn class for PreBasis.
Definition leafprebasismixin.hh:36
│ │ │ │ -
Definition nedelecbasis.hh:255
│ │ │ │ -
const FiniteElementMap * finiteElementMap_
Definition nedelecbasis.hh:300
│ │ │ │ -
FiniteElement finiteElement_
Definition nedelecbasis.hh:298
│ │ │ │ -
Impl::GlobalValuedLocalFiniteElement< Impl::CovariantPiolaTransformator, typename FiniteElementMap::FiniteElement, Element > FiniteElement
Definition nedelecbasis.hh:266
│ │ │ │ -
void bind(const Element &e)
Bind to element.
Definition nedelecbasis.hh:289
│ │ │ │ -
const Element & element() const
Return current element, throw if unbound.
Definition nedelecbasis.hh:274
│ │ │ │ -
typename GV::template Codim< 0 >::Entity Element
Definition nedelecbasis.hh:261
│ │ │ │ -
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition nedelecbasis.hh:283
│ │ │ │ -
NedelecNode(const FiniteElementMap *finiteElementMap)
Definition nedelecbasis.hh:268
│ │ │ │ -
typename Impl::Nedelec1stKindLocalFiniteElementMap< GV, dim, Range, order > FiniteElementMap
Definition nedelecbasis.hh:263
│ │ │ │ -
const Element * element_
Definition nedelecbasis.hh:299
│ │ │ │ -
std::size_t size_type
Definition nedelecbasis.hh:260
│ │ │ │ -
Definition nedelecbasis.hh:142
│ │ │ │ -
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:227
│ │ │ │ -
std::size_t size_type
Definition nedelecbasis.hh:152
│ │ │ │ -
NedelecPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition nedelecbasis.hh:157
│ │ │ │ -
GV GridView
The grid view that the FE space is defined on.
Definition nedelecbasis.hh:151
│ │ │ │ -
size_type dimension() const
Definition nedelecbasis.hh:206
│ │ │ │ -
GridView gridView_
Definition nedelecbasis.hh:245
│ │ │ │ -
FiniteElementMap finiteElementMap_
Definition nedelecbasis.hh:246
│ │ │ │ -
void initializeIndices()
Definition nedelecbasis.hh:181
│ │ │ │ -
void update(const GridView &gv)
Definition nedelecbasis.hh:192
│ │ │ │ -
size_type maxNodeSize() const
Definition nedelecbasis.hh:211
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition nedelecbasis.hh:186
│ │ │ │ -
Node makeNode() const
Create tree node.
Definition nedelecbasis.hh:201
│ │ │ │ -
Mapper mapper_
Definition nedelecbasis.hh:247
│ │ │ │
size_type size() const
Definition nodes.hh:147
│ │ │ │ -
void setSize(const size_type size)
Definition nodes.hh:169
│ │ │ │ -
Definition nodes.hh:191
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,481 +1,349 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -nedelecbasis.hh │ │ │ │ │ +lagrangedgbasis.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NEDELECBASIS_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NEDELECBASIS_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH │ │ │ │ │ 9 │ │ │ │ │ 10#include │ │ │ │ │ 11#include │ │ │ │ │ -12 │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15 │ │ │ │ │ -16#include │ │ │ │ │ -17#include │ │ │ │ │ +12#include │ │ │ │ │ +13 │ │ │ │ │ +14#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ +15#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ +16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_a_g_r_a_n_g_e_b_a_s_i_s_._h_h> │ │ │ │ │ +17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ 18 │ │ │ │ │ -19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ -20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/ │ │ │ │ │ -_g_l_o_b_a_l_v_a_l_u_e_d_l_o_c_a_l_f_i_n_i_t_e_e_l_e_m_e_n_t_._h_h> │ │ │ │ │ -21#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ -22#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ -23 │ │ │ │ │ -24namespace _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │ -25{ │ │ │ │ │ +19 │ │ │ │ │ +20 │ │ │ │ │ +21 │ │ │ │ │ +22namespace _D_u_n_e { │ │ │ │ │ +23namespace Functions { │ │ │ │ │ +24 │ │ │ │ │ +25 │ │ │ │ │ 26 │ │ │ │ │ -27namespace Impl │ │ │ │ │ -28{ │ │ │ │ │ -29 template │ │ │ │ │ -30 class Nedelec1stKindLocalFiniteElementMap │ │ │ │ │ -31 { │ │ │ │ │ -32 using D = typename GV::ctype; │ │ │ │ │ -33 constexpr static bool hasFixedElementType = Capabilities:: │ │ │ │ │ -hasSingleGeometryType::v; │ │ │ │ │ -34 │ │ │ │ │ -35 using CubeFiniteElement = │ │ │ │ │ -Nedelec1stKindCubeLocalFiniteElement; │ │ │ │ │ -36 using SimplexFiniteElement = │ │ │ │ │ -Nedelec1stKindSimplexLocalFiniteElement; │ │ │ │ │ +27/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ +28// This is the reusable part of the basis. It contains │ │ │ │ │ +29// │ │ │ │ │ +30// LagrangeDGPreBasis │ │ │ │ │ +31// LagrangeDGNode │ │ │ │ │ +32// │ │ │ │ │ +33// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ +shared │ │ │ │ │ +34// state. These components do _not_ depend on the global basis and local view │ │ │ │ │ +35// and can be used without a global basis. │ │ │ │ │ +36/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ 37 │ │ │ │ │ -38 public: │ │ │ │ │ -39 │ │ │ │ │ -40 using T = LocalBasisTraits, R, dim, │ │ │ │ │ -FieldVector, FieldMatrix >; │ │ │ │ │ -41 │ │ │ │ │ -42 constexpr static unsigned int topologyId = Capabilities:: │ │ │ │ │ -hasSingleGeometryType::topologyId; // meaningless if │ │ │ │ │ -hasFixedElementType is false │ │ │ │ │ -43 constexpr static GeometryType type = GeometryType(topologyId, GV:: │ │ │ │ │ -dimension); │ │ │ │ │ -44 │ │ │ │ │ -45 using FiniteElement = std::conditional_t, │ │ │ │ │ -47 LocalFiniteElementVariant >; │ │ │ │ │ +38template │ │ │ │ │ +_3_9using _L_a_g_r_a_n_g_e_D_G_N_o_d_e = _L_a_g_r_a_n_g_e_N_o_d_e_<_G_V_,_ _k_>; │ │ │ │ │ +40 │ │ │ │ │ +41template │ │ │ │ │ +_4_2class _L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s : │ │ │ │ │ +43 public _L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n< LagrangeDGPreBasis > │ │ │ │ │ +44{ │ │ │ │ │ +45 static const int dim = GV::dimension; │ │ │ │ │ +46 │ │ │ │ │ +47public: │ │ │ │ │ 48 │ │ │ │ │ -49 static std::size_t numVariants(GeometryType type) │ │ │ │ │ -50 { │ │ │ │ │ -51 if (order!=1) // I am not sure whether the formula below is correct for all │ │ │ │ │ -orders. │ │ │ │ │ -52 DUNE_THROW(NotImplemented, "Only Nedelec elements of order 1 are │ │ │ │ │ -implemented!"); │ │ │ │ │ +_5_0 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ +_5_1 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ +52 │ │ │ │ │ 53 │ │ │ │ │ -54 auto numEdges = referenceElement(type).size(dim-1); │ │ │ │ │ -55 return _p_o_w_e_r(2,numEdges); │ │ │ │ │ -56 } │ │ │ │ │ -57 │ │ │ │ │ -58 Nedelec1stKindLocalFiniteElementMap(const GV& gv) │ │ │ │ │ -59 : elementMapper_(gv, mcmgElementLayout()), │ │ │ │ │ -60 orientation_(gv.size(0)) │ │ │ │ │ -61 { │ │ │ │ │ -62 // create all variants │ │ │ │ │ -63 if constexpr (hasFixedElementType) │ │ │ │ │ -64 { │ │ │ │ │ -65 variants_.resize(numVariants(type)); │ │ │ │ │ -66 for (size_t i = 0; i < numVariants(type); i++) │ │ │ │ │ -67 variants_[i] = FiniteElement(i); │ │ │ │ │ -68 } │ │ │ │ │ -69 else │ │ │ │ │ -70 { │ │ │ │ │ -71 // for mixed grids add offset for cubes │ │ │ │ │ -72 variants_.resize(numVariants(GeometryTypes::simplex(dim)) + numVariants │ │ │ │ │ -(GeometryTypes::cube(dim))); │ │ │ │ │ -73 for (size_t i = 0; i < numVariants(GeometryTypes::simplex(dim)); i++) │ │ │ │ │ -74 variants_[i] = SimplexFiniteElement(i); │ │ │ │ │ -75 for (size_t i = 0; i < numVariants(GeometryTypes::cube(dim)); i++) │ │ │ │ │ -76 variants_[i + numVariants(GeometryTypes::simplex(dim))] = CubeFiniteElement │ │ │ │ │ -(i); │ │ │ │ │ -77 } │ │ │ │ │ -78 │ │ │ │ │ -79 │ │ │ │ │ -80 // compute orientation for all elements │ │ │ │ │ -81 const auto& indexSet = gv.indexSet(); │ │ │ │ │ -82 │ │ │ │ │ -83 for(const auto& element : elements(gv)) │ │ │ │ │ -84 { │ │ │ │ │ -85 const auto& refElement = referenceElement(element); │ │ │ │ │ -86 auto elementIndex = elementMapper_.index(element); │ │ │ │ │ -87 orientation_[elementIndex] = 0; │ │ │ │ │ +54 // Precompute the number of dofs per entity type │ │ │ │ │ +_5_5 const static int _d_o_f_s_P_e_r_E_d_g_e = k+1; │ │ │ │ │ +_5_6 const static int _d_o_f_s_P_e_r_T_r_i_a_n_g_l_e = (k+1)*(k+2)/2; │ │ │ │ │ +_5_7 const static int _d_o_f_s_P_e_r_Q_u_a_d = (k+1)*(k+1); │ │ │ │ │ +_5_8 const static int _d_o_f_s_P_e_r_T_e_t_r_a_h_e_d_r_o_n = (k+1)*(k+2)*(k+3)/6; │ │ │ │ │ +_5_9 const static int _d_o_f_s_P_e_r_P_r_i_s_m = (k+1)*(k+1)*(k+2)/2; │ │ │ │ │ +_6_0 const static int _d_o_f_s_P_e_r_H_e_x_a_h_e_d_r_o_n = (k+1)*(k+1)*(k+1); │ │ │ │ │ +_6_1 const static int _d_o_f_s_P_e_r_P_y_r_a_m_i_d = (k+1)*(k+2)*(2*k+3)/6; │ │ │ │ │ +62 │ │ │ │ │ +63 │ │ │ │ │ +_6_4 using _N_o_d_e = _L_a_g_r_a_n_g_e_D_G_N_o_d_e_<_G_V_,_ _k_>; │ │ │ │ │ +65 │ │ │ │ │ +_6_7 _L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s(const _G_r_i_d_V_i_e_w& gv) : │ │ │ │ │ +68 _g_r_i_d_V_i_e_w__(gv) │ │ │ │ │ +69 {} │ │ │ │ │ +70 │ │ │ │ │ +71 │ │ │ │ │ +_7_2 void _i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s() │ │ │ │ │ +73 { │ │ │ │ │ +74 switch (dim) │ │ │ │ │ +75 { │ │ │ │ │ +76 case 1: │ │ │ │ │ +77 { │ │ │ │ │ +78 break; │ │ │ │ │ +79 } │ │ │ │ │ +80 case 2: │ │ │ │ │ +81 { │ │ │ │ │ +82 _q_u_a_d_r_i_l_a_t_e_r_a_l_O_f_f_s_e_t__ = _d_o_f_s_P_e_r_T_r_i_a_n_g_l_e * _g_r_i_d_V_i_e_w__.size(Dune:: │ │ │ │ │ +GeometryTypes::triangle); │ │ │ │ │ +83 break; │ │ │ │ │ +84 } │ │ │ │ │ +85 case 3: │ │ │ │ │ +86 { │ │ │ │ │ +87 _p_r_i_s_m_O_f_f_s_e_t__ = _d_o_f_s_P_e_r_T_e_t_r_a_h_e_d_r_o_n * _g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes:: │ │ │ │ │ +tetrahedron); │ │ │ │ │ 88 │ │ │ │ │ -89 for (std::size_t i=0; iglobalV1) || (localV0>localV1 && │ │ │ │ │ -globalV0 │ │ │ │ │ -110 const auto& find(const Element& element) const │ │ │ │ │ -111 { │ │ │ │ │ -112 return variants_[orientation_[elementMapper_.index(element)]]; │ │ │ │ │ -113 } │ │ │ │ │ -114 │ │ │ │ │ -115 private: │ │ │ │ │ -116 std::vector variants_; │ │ │ │ │ -117 Dune::MultipleCodimMultipleGeomTypeMapper elementMapper_; │ │ │ │ │ -118 std::vector orientation_; │ │ │ │ │ -119 }; │ │ │ │ │ -120 │ │ │ │ │ -121 │ │ │ │ │ -122} // namespace Impl │ │ │ │ │ -123 │ │ │ │ │ -124 │ │ │ │ │ -125/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ -126// This is the reusable part of the basis. It contains │ │ │ │ │ -127// │ │ │ │ │ -128// NedelecPreBasis │ │ │ │ │ -129// NedelecNode │ │ │ │ │ -130// │ │ │ │ │ -131// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ -shared │ │ │ │ │ -132// state. These components do _not_ depend on the global basis and local │ │ │ │ │ -view │ │ │ │ │ -133// and can be used without a global basis. │ │ │ │ │ -134/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ -135 │ │ │ │ │ -136template │ │ │ │ │ -137class NedelecNode; │ │ │ │ │ -138 │ │ │ │ │ -139template │ │ │ │ │ -_1_4_0class _N_e_d_e_l_e_c_P_r_e_B_a_s_i_s : │ │ │ │ │ -141 public _L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n< NedelecPreBasis > │ │ │ │ │ -142{ │ │ │ │ │ -143 static const int dim = GV::dimension; │ │ │ │ │ -144 static_assert(kind==1, "Only the Nedelec basis of the first kind is │ │ │ │ │ -currently implemented!"); │ │ │ │ │ -145 using FiniteElementMap = typename Impl:: │ │ │ │ │ -Nedelec1stKindLocalFiniteElementMap; │ │ │ │ │ -146 │ │ │ │ │ -147 using Mapper = Dune::MultipleCodimMultipleGeomTypeMapper; │ │ │ │ │ -148public: │ │ │ │ │ -149 │ │ │ │ │ -_1_5_1 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ -_1_5_2 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ -153 │ │ │ │ │ -_1_5_4 using _N_o_d_e = _N_e_d_e_l_e_c_N_o_d_e_<_G_V_,_ _R_a_n_g_e_,_ _k_i_n_d_,_ _o_r_d_e_r_>; │ │ │ │ │ -155 │ │ │ │ │ -_1_5_7 _N_e_d_e_l_e_c_P_r_e_B_a_s_i_s(const _G_r_i_d_V_i_e_w& gv) : │ │ │ │ │ -158 _g_r_i_d_V_i_e_w__(gv), │ │ │ │ │ -159 _f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__(gv), │ │ │ │ │ -160 _m_a_p_p_e_r__(_g_r_i_d_V_i_e_w__, mcmgLayout(Dim<1>{})) │ │ │ │ │ -161 { │ │ │ │ │ -162 if (kind!=1) │ │ │ │ │ -163 DUNE_THROW(NotImplemented, "Only Nedelec elements of the first kind are │ │ │ │ │ -implemented!"); │ │ │ │ │ -164 │ │ │ │ │ -165 // There is no inherent reason why the basis shouldn't work for grids with │ │ │ │ │ -more than two │ │ │ │ │ -166 // element types. Somebody simply has to sit down and implement the missing │ │ │ │ │ -bits. │ │ │ │ │ -167 if (gv.indexSet().types(0).size() > 2) │ │ │ │ │ -168 DUNE_THROW(NotImplemented, "Nédélec basis is only implemented for grids │ │ │ │ │ -with simplex and cube elements"); │ │ │ │ │ -169 │ │ │ │ │ -170 for(auto type : gv.indexSet().types(0)) │ │ │ │ │ -171 if (!type.isSimplex() && !type.isCube()) │ │ │ │ │ -172 DUNE_THROW(NotImplemented, "Nédélec basis is only implemented for grids │ │ │ │ │ -with simplex or cube elements."); │ │ │ │ │ -173 │ │ │ │ │ -174 if (order>1) │ │ │ │ │ -175 DUNE_THROW(NotImplemented, "Only first-order elements are implemented"); │ │ │ │ │ -176 │ │ │ │ │ -177 if (dim!=2 && dim!=3) │ │ │ │ │ -178 DUNE_THROW(NotImplemented, "Only 2d and 3d Nédélec elements are │ │ │ │ │ -implemented"); │ │ │ │ │ +_1_1_2 _N_o_d_e _m_a_k_e_N_o_d_e() const │ │ │ │ │ +113 { │ │ │ │ │ +114 return _N_o_d_e{}; │ │ │ │ │ +115 } │ │ │ │ │ +116 │ │ │ │ │ +_1_1_7 _s_i_z_e___t_y_p_e _d_i_m_e_n_s_i_o_n() const │ │ │ │ │ +118 { │ │ │ │ │ +119 switch (dim) │ │ │ │ │ +120 { │ │ │ │ │ +121 case 1: │ │ │ │ │ +122 return _d_o_f_s_P_e_r_E_d_g_e*_g_r_i_d_V_i_e_w__.size(0); │ │ │ │ │ +123 case 2: │ │ │ │ │ +124 { │ │ │ │ │ +125 return _d_o_f_s_P_e_r_T_r_i_a_n_g_l_e*_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes::triangle) + │ │ │ │ │ +_d_o_f_s_P_e_r_Q_u_a_d*_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes::quadrilateral); │ │ │ │ │ +126 } │ │ │ │ │ +127 case 3: │ │ │ │ │ +128 { │ │ │ │ │ +129 return _d_o_f_s_P_e_r_T_e_t_r_a_h_e_d_r_o_n*_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes::tetrahedron) │ │ │ │ │ +130 + _d_o_f_s_P_e_r_P_y_r_a_m_i_d*_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes::pyramid) │ │ │ │ │ +131 + _d_o_f_s_P_e_r_P_r_i_s_m*_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes::prism) │ │ │ │ │ +132 + _d_o_f_s_P_e_r_H_e_x_a_h_e_d_r_o_n*_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes::hexahedron); │ │ │ │ │ +133 } │ │ │ │ │ +134 } │ │ │ │ │ +135 DUNE_THROW(Dune::NotImplemented, "No size method for " << dim << "d grids │ │ │ │ │ +available yet!"); │ │ │ │ │ +136 } │ │ │ │ │ +137 │ │ │ │ │ +_1_3_8 _s_i_z_e___t_y_p_e _m_a_x_N_o_d_e_S_i_z_e() const │ │ │ │ │ +139 { │ │ │ │ │ +140 return Dune::power(k+1, int(GV::dimension)); │ │ │ │ │ +141 } │ │ │ │ │ +142 │ │ │ │ │ +143 template │ │ │ │ │ +_1_4_4 It _i_n_d_i_c_e_s(const _N_o_d_e& node, It it) const │ │ │ │ │ +145 { │ │ │ │ │ +146 const auto& gridIndexSet = _g_r_i_d_V_i_e_w().indexSet(); │ │ │ │ │ +147 const auto& element = node._e_l_e_m_e_n_t(); │ │ │ │ │ +148 │ │ │ │ │ +149 _s_i_z_e___t_y_p_e offset = 0; │ │ │ │ │ +150 if constexpr (dim==1) │ │ │ │ │ +151 offset = _d_o_f_s_P_e_r_E_d_g_e*gridIndexSet.subIndex(element,0,0); │ │ │ │ │ +152 else if constexpr (dim==2) │ │ │ │ │ +153 { │ │ │ │ │ +154 if (element.type().isTriangle()) │ │ │ │ │ +155 offset = _d_o_f_s_P_e_r_T_r_i_a_n_g_l_e*gridIndexSet.subIndex(element,0,0); │ │ │ │ │ +156 else if (element.type().isQuadrilateral()) │ │ │ │ │ +157 offset = _q_u_a_d_r_i_l_a_t_e_r_a_l_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_Q_u_a_d*gridIndexSet.subIndex │ │ │ │ │ +(element,0,0); │ │ │ │ │ +158 else │ │ │ │ │ +159 DUNE_THROW(Dune::NotImplemented, "2d elements have to be triangles or │ │ │ │ │ +quadrilaterals"); │ │ │ │ │ +160 } │ │ │ │ │ +161 else if constexpr (dim==3) │ │ │ │ │ +162 { │ │ │ │ │ +163 if (element.type().isTetrahedron()) │ │ │ │ │ +164 offset = _d_o_f_s_P_e_r_T_e_t_r_a_h_e_d_r_o_n*gridIndexSet.subIndex(element,0,0); │ │ │ │ │ +165 else if (element.type().isPrism()) │ │ │ │ │ +166 offset = _p_r_i_s_m_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_P_r_i_s_m*gridIndexSet.subIndex(element,0,0); │ │ │ │ │ +167 else if (element.type().isHexahedron()) │ │ │ │ │ +168 offset = _h_e_x_a_h_e_d_r_o_n_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_H_e_x_a_h_e_d_r_o_n*gridIndexSet.subIndex │ │ │ │ │ +(element,0,0); │ │ │ │ │ +169 else if (element.type().isPyramid()) │ │ │ │ │ +170 offset = _p_y_r_a_m_i_d_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_P_y_r_a_m_i_d*gridIndexSet.subIndex │ │ │ │ │ +(element,0,0); │ │ │ │ │ +171 else │ │ │ │ │ +172 DUNE_THROW(Dune::NotImplemented, "3d elements have to be tetrahedrons, │ │ │ │ │ +prisms, hexahedrons or pyramids"); │ │ │ │ │ +173 } │ │ │ │ │ +174 else │ │ │ │ │ +175 DUNE_THROW(Dune::NotImplemented, "No index method for " << dim << "d grids │ │ │ │ │ +available yet!"); │ │ │ │ │ +176 for (_s_i_z_e___t_y_p_e i = 0, end = node._s_i_z_e() ; i < end ; ++i, ++it) │ │ │ │ │ +177 *it = {offset + i}; │ │ │ │ │ +178 return it; │ │ │ │ │ 179 } │ │ │ │ │ 180 │ │ │ │ │ -_1_8_1 void _i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s() │ │ │ │ │ -182 {} │ │ │ │ │ -183 │ │ │ │ │ -_1_8_6 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ -187 { │ │ │ │ │ -188 return _g_r_i_d_V_i_e_w__; │ │ │ │ │ -189 } │ │ │ │ │ -190 │ │ │ │ │ -191 /* \brief Update the stored grid view, to be called if the grid has changed │ │ │ │ │ -*/ │ │ │ │ │ -_1_9_2 void _u_p_d_a_t_e (const _G_r_i_d_V_i_e_w& gv) │ │ │ │ │ -193 { │ │ │ │ │ -194 _g_r_i_d_V_i_e_w__ = gv; │ │ │ │ │ -195 _m_a_p_p_e_r__.update(_g_r_i_d_V_i_e_w__); │ │ │ │ │ -196 } │ │ │ │ │ +_1_8_2 unsigned int _o_r_d_e_r() const │ │ │ │ │ +183 { │ │ │ │ │ +184 return k; │ │ │ │ │ +185 } │ │ │ │ │ +186 │ │ │ │ │ +187protected: │ │ │ │ │ +_1_8_8 _G_r_i_d_V_i_e_w _g_r_i_d_V_i_e_w__; │ │ │ │ │ +189 │ │ │ │ │ +_1_9_0 size_t _q_u_a_d_r_i_l_a_t_e_r_a_l_O_f_f_s_e_t__; │ │ │ │ │ +_1_9_1 size_t _p_y_r_a_m_i_d_O_f_f_s_e_t__; │ │ │ │ │ +_1_9_2 size_t _p_r_i_s_m_O_f_f_s_e_t__; │ │ │ │ │ +_1_9_3 size_t _h_e_x_a_h_e_d_r_o_n_O_f_f_s_e_t__; │ │ │ │ │ +194}; │ │ │ │ │ +195 │ │ │ │ │ +196 │ │ │ │ │ 197 │ │ │ │ │ -_2_0_1 _N_o_d_e _m_a_k_e_N_o_d_e() const │ │ │ │ │ -202 { │ │ │ │ │ -203 return _N_o_d_e{&_f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__}; │ │ │ │ │ -204 } │ │ │ │ │ -205 │ │ │ │ │ -_2_0_6 _s_i_z_e___t_y_p_e _d_i_m_e_n_s_i_o_n() const │ │ │ │ │ -207 { │ │ │ │ │ -208 return _m_a_p_p_e_r__.size(); │ │ │ │ │ -209 } │ │ │ │ │ -210 │ │ │ │ │ -_2_1_1 _s_i_z_e___t_y_p_e _m_a_x_N_o_d_e_S_i_z_e() const │ │ │ │ │ -212 { │ │ │ │ │ -213 _s_i_z_e___t_y_p_e result = 0; │ │ │ │ │ -214 for (auto&& type : _g_r_i_d_V_i_e_w__.indexSet().types(0)) │ │ │ │ │ -215 { │ │ │ │ │ -216 _s_i_z_e___t_y_p_e numEdges = referenceElement(type).size │ │ │ │ │ -(dim-1); │ │ │ │ │ -217 result = std::max(result, numEdges); │ │ │ │ │ -218 } │ │ │ │ │ -219 │ │ │ │ │ -220 return result; │ │ │ │ │ -221 } │ │ │ │ │ -222 │ │ │ │ │ -226 template │ │ │ │ │ -_2_2_7 It _i_n_d_i_c_e_s(const _N_o_d_e& node, It it) const │ │ │ │ │ -228 { │ │ │ │ │ -229 const auto& element = node._e_l_e_m_e_n_t(); │ │ │ │ │ -230 │ │ │ │ │ -231 // throw if Element is not of predefined type │ │ │ │ │ -232 if (not(element.type().isCube()) and not(element.type().isSimplex())) │ │ │ │ │ -233 DUNE_THROW(NotImplemented, "NedelecBasis only implemented for cube and │ │ │ │ │ -simplex elements."); │ │ │ │ │ -234 │ │ │ │ │ -235 for(std::size_t i=0, end=node._s_i_z_e(); i │ │ │ │ │ -_2_5_3class _N_e_d_e_l_e_c_N_o_d_e : │ │ │ │ │ -254 public _L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ -255{ │ │ │ │ │ -256 static const int dim = GV::dimension; │ │ │ │ │ -257 │ │ │ │ │ -258public: │ │ │ │ │ -259 │ │ │ │ │ -_2_6_0 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ -_2_6_1 using _E_l_e_m_e_n_t = typename GV::template Codim<0>::Entity; │ │ │ │ │ -262 static_assert(kind==1, "Only Nedelec elements of the first kind are │ │ │ │ │ -implemented!"); │ │ │ │ │ -_2_6_3 using _F_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p = typename Impl:: │ │ │ │ │ -Nedelec1stKindLocalFiniteElementMap; │ │ │ │ │ -_2_6_4 using _F_i_n_i_t_e_E_l_e_m_e_n_t = Impl::GlobalValuedLocalFiniteElement; │ │ │ │ │ -267 │ │ │ │ │ -_2_6_8 _N_e_d_e_l_e_c_N_o_d_e(const _F_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p* finiteElementMap) : │ │ │ │ │ -269 _e_l_e_m_e_n_t__(nullptr), │ │ │ │ │ -270 _f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__(finiteElementMap) │ │ │ │ │ -271 { } │ │ │ │ │ -272 │ │ │ │ │ -_2_7_4 const _E_l_e_m_e_n_t& _e_l_e_m_e_n_t() const │ │ │ │ │ -275 { │ │ │ │ │ -276 return *_e_l_e_m_e_n_t__; │ │ │ │ │ -277 } │ │ │ │ │ -278 │ │ │ │ │ -_2_8_3 const _F_i_n_i_t_e_E_l_e_m_e_n_t& _f_i_n_i_t_e_E_l_e_m_e_n_t() const │ │ │ │ │ -284 { │ │ │ │ │ -285 return _f_i_n_i_t_e_E_l_e_m_e_n_t__; │ │ │ │ │ -286 } │ │ │ │ │ -287 │ │ │ │ │ -_2_8_9 void _b_i_n_d(const _E_l_e_m_e_n_t& e) │ │ │ │ │ -290 { │ │ │ │ │ -291 _e_l_e_m_e_n_t__ = &e; │ │ │ │ │ -292 _f_i_n_i_t_e_E_l_e_m_e_n_t__.bind((_f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__->find(*_e_l_e_m_e_n_t__)), e); │ │ │ │ │ -293 this->_s_e_t_S_i_z_e(_f_i_n_i_t_e_E_l_e_m_e_n_t__.size()); │ │ │ │ │ -294 } │ │ │ │ │ -295 │ │ │ │ │ -296protected: │ │ │ │ │ -297 │ │ │ │ │ -_2_9_8 _F_i_n_i_t_e_E_l_e_m_e_n_t _f_i_n_i_t_e_E_l_e_m_e_n_t__; │ │ │ │ │ -_2_9_9 const _E_l_e_m_e_n_t* _e_l_e_m_e_n_t__; │ │ │ │ │ -_3_0_0 const _F_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p* _f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__; │ │ │ │ │ -301}; │ │ │ │ │ -302 │ │ │ │ │ -303 │ │ │ │ │ -304 │ │ │ │ │ -305namespace BasisFactory { │ │ │ │ │ -306 │ │ │ │ │ -316template │ │ │ │ │ -_3_1_7auto _n_e_d_e_l_e_c() │ │ │ │ │ -318{ │ │ │ │ │ -319 return [](const auto& gridView) { │ │ │ │ │ -320 return _N_e_d_e_l_e_c_P_r_e_B_a_s_i_s, Range, kind, │ │ │ │ │ -order>(gridView); │ │ │ │ │ -321 }; │ │ │ │ │ -322} │ │ │ │ │ -323 │ │ │ │ │ -324} // end namespace BasisFactory │ │ │ │ │ -325 │ │ │ │ │ -326 │ │ │ │ │ -327 │ │ │ │ │ -328/ │ │ │ │ │ +198namespace BasisFactory { │ │ │ │ │ +199 │ │ │ │ │ +207template │ │ │ │ │ +_2_0_8auto _l_a_g_r_a_n_g_e_D_G() │ │ │ │ │ +209{ │ │ │ │ │ +210 return [](const auto& gridView) { │ │ │ │ │ +211 return _L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s, k>(gridView); │ │ │ │ │ +212 }; │ │ │ │ │ +213} │ │ │ │ │ +214 │ │ │ │ │ +215} // end namespace BasisFactory │ │ │ │ │ +216 │ │ │ │ │ +217 │ │ │ │ │ +218 │ │ │ │ │ +219/ │ │ │ │ │ / ***************************************************************************** │ │ │ │ │ -329// This is the actual global basis implementation based on the reusable │ │ │ │ │ +220// This is the actual global basis implementation based on the reusable │ │ │ │ │ parts. │ │ │ │ │ -330/ │ │ │ │ │ +221/ │ │ │ │ │ / ***************************************************************************** │ │ │ │ │ -331 │ │ │ │ │ -339template │ │ │ │ │ -_3_4_0using _N_e_d_e_l_e_c_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_<_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_<_G_V_,_ _R_a_n_g_e_,_ _k_i_n_d_, │ │ │ │ │ -_o_r_d_e_r_ _> >; │ │ │ │ │ -341 │ │ │ │ │ -342} // end namespace Dune::Functions │ │ │ │ │ -343 │ │ │ │ │ -344 │ │ │ │ │ -345#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NEDELECBASIS_HH │ │ │ │ │ -_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h │ │ │ │ │ -_g_l_o_b_a_l_v_a_l_u_e_d_l_o_c_a_l_f_i_n_i_t_e_e_l_e_m_e_n_t_._h_h │ │ │ │ │ -_n_o_d_e_s_._h_h │ │ │ │ │ +222 │ │ │ │ │ +230template │ │ │ │ │ +_2_3_1using _L_a_g_r_a_n_g_e_D_G_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_<_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_<_G_V_,_ _k_> >; │ │ │ │ │ +232 │ │ │ │ │ +233 │ │ │ │ │ +234 │ │ │ │ │ +235} // end namespace Functions │ │ │ │ │ +236} // end namespace Dune │ │ │ │ │ +237 │ │ │ │ │ +238 │ │ │ │ │ +239#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH │ │ │ │ │ +_l_a_g_r_a_n_g_e_b_a_s_i_s_._h_h │ │ │ │ │ _l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_p_o_w_e_r │ │ │ │ │ -auto power(ChildPreBasisFactory &&childPreBasisFactory, std::size_t k, const │ │ │ │ │ -IndexMergingStrategy &) │ │ │ │ │ -Create a pre-basis factory that can build a PowerPreBasis. │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:409 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_n_e_d_e_l_e_c │ │ │ │ │ -auto nedelec() │ │ │ │ │ -Create a pre-basis factory that can create a Nédélec pre-basis. │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:317 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │ -DDeeffiinniittiioonn polynomial.hh:18 │ │ │ │ │ +_n_o_d_e_s_._h_h │ │ │ │ │ +_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_l_a_g_r_a_n_g_e_D_G │ │ │ │ │ +auto lagrangeDG() │ │ │ │ │ +Create a pre-basis factory that can create a LagrangeDG pre-basis. │ │ │ │ │ +DDeeffiinniittiioonn lagrangedgbasis.hh:208 │ │ │ │ │ +_D_u_n_e │ │ │ │ │ +DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ Global basis for given pre-basis. │ │ │ │ │ DDeeffiinniittiioonn defaultglobalbasis.hh:50 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n │ │ │ │ │ -A generic MixIn class for PreBasis. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismixin.hh:36 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:255 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__ │ │ │ │ │ -const FiniteElementMap * finiteElementMap_ │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:300 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t__ │ │ │ │ │ -FiniteElement finiteElement_ │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:298 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e_:_:_F_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ -Impl::GlobalValuedLocalFiniteElement< Impl::CovariantPiolaTransformator, │ │ │ │ │ -typename FiniteElementMap::FiniteElement, Element > FiniteElement │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:266 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e_:_:_b_i_n_d │ │ │ │ │ -void bind(const Element &e) │ │ │ │ │ -Bind to element. │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:289 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e_:_:_e_l_e_m_e_n_t │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:375 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_e_l_e_m_e_n_t │ │ │ │ │ const Element & element() const │ │ │ │ │ Return current element, throw if unbound. │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:274 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e_:_:_E_l_e_m_e_n_t │ │ │ │ │ -typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:261 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ -const FiniteElement & finiteElement() const │ │ │ │ │ -Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:283 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e_:_:_N_e_d_e_l_e_c_N_o_d_e │ │ │ │ │ -NedelecNode(const FiniteElementMap *finiteElementMap) │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:268 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e_:_:_F_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p │ │ │ │ │ -typename Impl::Nedelec1stKindLocalFiniteElementMap< GV, dim, Range, order > │ │ │ │ │ -FiniteElementMap │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:263 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e_:_:_e_l_e_m_e_n_t__ │ │ │ │ │ -const Element * element_ │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:299 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:260 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:142 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s │ │ │ │ │ +DDeeffiinniittiioonn lagrangebasis.hh:427 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s │ │ │ │ │ +DDeeffiinniittiioonn lagrangedgbasis.hh:44 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s │ │ │ │ │ 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. │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:227 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:152 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s │ │ │ │ │ -NedelecPreBasis(const GridView &gv) │ │ │ │ │ +DDeeffiinniittiioonn lagrangedgbasis.hh:144 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_m_a_x_N_o_d_e_S_i_z_e │ │ │ │ │ +size_type maxNodeSize() const │ │ │ │ │ +DDeeffiinniittiioonn lagrangedgbasis.hh:138 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_o_r_d_e_r │ │ │ │ │ +unsigned int order() const │ │ │ │ │ +Polynomial order used in the local Lagrange finite-elements. │ │ │ │ │ +DDeeffiinniittiioonn lagrangedgbasis.hh:182 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_u_p_d_a_t_e │ │ │ │ │ +void update(const GridView &gv) │ │ │ │ │ +DDeeffiinniittiioonn lagrangedgbasis.hh:104 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_h_e_x_a_h_e_d_r_o_n_O_f_f_s_e_t__ │ │ │ │ │ +size_t hexahedronOffset_ │ │ │ │ │ +DDeeffiinniittiioonn lagrangedgbasis.hh:193 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ +Node makeNode() const │ │ │ │ │ +Create tree node. │ │ │ │ │ +DDeeffiinniittiioonn lagrangedgbasis.hh:112 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_H_e_x_a_h_e_d_r_o_n │ │ │ │ │ +static const int dofsPerHexahedron │ │ │ │ │ +DDeeffiinniittiioonn lagrangedgbasis.hh:60 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s │ │ │ │ │ +LagrangeDGPreBasis(const GridView &gv) │ │ │ │ │ Constructor for a given grid view object. │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:157 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ +DDeeffiinniittiioonn lagrangedgbasis.hh:67 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_p_y_r_a_m_i_d_O_f_f_s_e_t__ │ │ │ │ │ +size_t pyramidOffset_ │ │ │ │ │ +DDeeffiinniittiioonn lagrangedgbasis.hh:191 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_T_e_t_r_a_h_e_d_r_o_n │ │ │ │ │ +static const int dofsPerTetrahedron │ │ │ │ │ +DDeeffiinniittiioonn lagrangedgbasis.hh:58 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ GV GridView │ │ │ │ │ The grid view that the FE space is defined on. │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:151 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ -size_type dimension() const │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:206 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w__ │ │ │ │ │ -GridView gridView_ │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:245 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__ │ │ │ │ │ -FiniteElementMap finiteElementMap_ │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:246 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s │ │ │ │ │ +DDeeffiinniittiioonn lagrangedgbasis.hh:50 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s │ │ │ │ │ void initializeIndices() │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:181 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_u_p_d_a_t_e │ │ │ │ │ -void update(const GridView &gv) │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:192 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_m_a_x_N_o_d_e_S_i_z_e │ │ │ │ │ -size_type maxNodeSize() const │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:211 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ +DDeeffiinniittiioonn lagrangedgbasis.hh:72 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_q_u_a_d_r_i_l_a_t_e_r_a_l_O_f_f_s_e_t__ │ │ │ │ │ +size_t quadrilateralOffset_ │ │ │ │ │ +DDeeffiinniittiioonn lagrangedgbasis.hh:190 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_E_d_g_e │ │ │ │ │ +static const int dofsPerEdge │ │ │ │ │ +DDeeffiinniittiioonn lagrangedgbasis.hh:55 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ const GridView & gridView() const │ │ │ │ │ Obtain the grid view that the basis is defined on. │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:186 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ -Node makeNode() const │ │ │ │ │ -Create tree node. │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:201 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_m_a_p_p_e_r__ │ │ │ │ │ -Mapper mapper_ │ │ │ │ │ -DDeeffiinniittiioonn nedelecbasis.hh:247 │ │ │ │ │ +DDeeffiinniittiioonn lagrangedgbasis.hh:99 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_Q_u_a_d │ │ │ │ │ +static const int dofsPerQuad │ │ │ │ │ +DDeeffiinniittiioonn lagrangedgbasis.hh:57 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_T_r_i_a_n_g_l_e │ │ │ │ │ +static const int dofsPerTriangle │ │ │ │ │ +DDeeffiinniittiioonn lagrangedgbasis.hh:56 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_P_y_r_a_m_i_d │ │ │ │ │ +static const int dofsPerPyramid │ │ │ │ │ +DDeeffiinniittiioonn lagrangedgbasis.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w__ │ │ │ │ │ +GridView gridView_ │ │ │ │ │ +DDeeffiinniittiioonn lagrangedgbasis.hh:188 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +DDeeffiinniittiioonn lagrangedgbasis.hh:51 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ +size_type dimension() const │ │ │ │ │ +DDeeffiinniittiioonn lagrangedgbasis.hh:117 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_p_r_i_s_m_O_f_f_s_e_t__ │ │ │ │ │ +size_t prismOffset_ │ │ │ │ │ +DDeeffiinniittiioonn lagrangedgbasis.hh:192 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_P_r_i_s_m │ │ │ │ │ +static const int dofsPerPrism │ │ │ │ │ +DDeeffiinniittiioonn lagrangedgbasis.hh:59 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n │ │ │ │ │ +A generic MixIn class for PreBasis. │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismixin.hh:36 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_i_z_e │ │ │ │ │ size_type size() const │ │ │ │ │ DDeeffiinniittiioonn nodes.hh:147 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_e_t_S_i_z_e │ │ │ │ │ -void setSize(const size_type size) │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:169 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:191 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00125.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: globalvaluedlocalfiniteelement.hh File Reference │ │ │ │ +dune-functions: sizeinfo.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,36 +70,42 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ -Namespaces
│ │ │ │ -
globalvaluedlocalfiniteelement.hh File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
sizeinfo.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>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ +Classes

class  Dune::Functions::SizeInfo< B >
 A class encapsulating size information. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

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

│ │ │ │ +Functions

template<class Basis >
SizeInfo< Basis > Dune::Functions::sizeInfo (const Basis &basis)
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,26 +1,26 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -globalvaluedlocalfiniteelement.hh File Reference │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +sizeinfo.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_z_e_I_n_f_o_<_ _B_ _> │ │ │ │ │ +  A class encapsulating size information. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +_S_i_z_e_I_n_f_o< Basis >  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_i_z_e_I_n_f_o (const Basis &basis) │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00125_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: globalvaluedlocalfiniteelement.hh Source File │ │ │ │ +dune-functions: sizeinfo.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,327 +74,104 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
globalvaluedlocalfiniteelement.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_GLOBALVALUEDLOCALFINITEELEMENT_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_GLOBALVALUEDLOCALFINITEELEMENT_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SIZEINFO_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SIZEINFO_HH
│ │ │ │
9
│ │ │ │ -
10#include <array>
│ │ │ │ -
11#include <numeric>
│ │ │ │ -
12
│ │ │ │ -
13#include <dune/common/fmatrix.hh>
│ │ │ │ -
14#include <dune/common/fvector.hh>
│ │ │ │ -
15#include <dune/common/math.hh>
│ │ │ │ -
16#include <dune/common/rangeutilities.hh>
│ │ │ │ +
10#warning The header dune/functions/functionspacebases/sizeinfo.hh is deprecated and will be removed after release 2.10.
│ │ │ │ +
11
│ │ │ │ +
12#include <array>
│ │ │ │ +
13
│ │ │ │ +
14namespace Dune {
│ │ │ │ +
15namespace Functions {
│ │ │ │ +
16
│ │ │ │
17
│ │ │ │ -
18#include <dune/geometry/referenceelements.hh>
│ │ │ │ -
19
│ │ │ │ -
20#include <dune/localfunctions/common/localbasis.hh>
│ │ │ │ -
21#include <dune/localfunctions/common/localfiniteelementtraits.hh>
│ │ │ │ -
22
│ │ │ │ -
23namespace Dune::Functions::Impl
│ │ │ │ -
24{
│ │ │ │ -
25
│ │ │ │ -
39 struct ContravariantPiolaTransformator
│ │ │ │ -
40 {
│ │ │ │ -
45 template<typename Values, typename LocalCoordinate, typename Geometry>
│ │ │ │ -
46 static auto apply(Values& values,
│ │ │ │ -
47 const LocalCoordinate& xi,
│ │ │ │ -
48 const Geometry& geometry)
│ │ │ │ -
49 {
│ │ │ │ -
50 auto jacobianTransposed = geometry.jacobianTransposed(xi);
│ │ │ │ -
51 auto integrationElement = geometry.integrationElement(xi);
│ │ │ │ -
52
│ │ │ │ -
53 for (auto& value : values)
│ │ │ │ -
54 {
│ │ │ │ -
55 auto tmp = value;
│ │ │ │ -
56 jacobianTransposed.mtv(tmp, value);
│ │ │ │ -
57 value /= integrationElement;
│ │ │ │ -
58 }
│ │ │ │ -
59 }
│ │ │ │ -
60
│ │ │ │ -
70 template<typename Gradients, typename LocalCoordinate, typename Geometry>
│ │ │ │ -
71 static auto applyJacobian(Gradients& gradients,
│ │ │ │ -
72 const LocalCoordinate& xi,
│ │ │ │ -
73 const Geometry& geometry)
│ │ │ │ -
74 {
│ │ │ │ -
75 auto jacobianTransposed = geometry.jacobianTransposed(xi);
│ │ │ │ -
76 auto integrationElement = geometry.integrationElement(xi);
│ │ │ │ -
77 for (auto& gradient : gradients)
│ │ │ │ -
78 {
│ │ │ │ -
79 auto tmp = gradient;
│ │ │ │ -
80 gradient = 0;
│ │ │ │ -
81 for (size_t k=0; k<gradient.M(); k++)
│ │ │ │ -
82 for (size_t l=0; l<tmp.N(); l++)
│ │ │ │ -
83 // Use sparseRange because jacobianTransposed may be a sparse DiagonalMatrix
│ │ │ │ -
84 for(auto&& [jacobianTransposed_l_j, j] : sparseRange(jacobianTransposed[l]))
│ │ │ │ -
85 gradient[j][k] += jacobianTransposed_l_j * tmp[l][k];
│ │ │ │ -
86 gradient /= integrationElement;
│ │ │ │ -
87 }
│ │ │ │ -
88 }
│ │ │ │ -
89
│ │ │ │ -
97 template<class Function, class LocalCoordinate, class Element>
│ │ │ │ -
98 class LocalValuedFunction
│ │ │ │ -
99 {
│ │ │ │ -
100 const Function& f_;
│ │ │ │ -
101 const Element& element_;
│ │ │ │ -
102
│ │ │ │ -
103 using LocalValue = LocalCoordinate;
│ │ │ │ -
104
│ │ │ │ -
105 public:
│ │ │ │ -
106
│ │ │ │ -
107 LocalValuedFunction(const Function& f, const Element& element)
│ │ │ │ -
108 : f_(f), element_(element)
│ │ │ │ -
109 {}
│ │ │ │ -
110
│ │ │ │ -
111 auto operator()(const LocalCoordinate& xi) const
│ │ │ │ -
112 {
│ │ │ │ -
113 auto globalValue = f_(xi);
│ │ │ │ -
114
│ │ │ │ -
115 // Apply the inverse Piola transform
│ │ │ │ -
116 auto jacobianInverseTransposed = element_.geometry().jacobianInverseTransposed(xi);
│ │ │ │ -
117 auto integrationElement = element_.geometry().integrationElement(xi);
│ │ │ │ -
118
│ │ │ │ -
119 auto localValue = LocalValue{};
│ │ │ │ -
120 jacobianInverseTransposed.mtv(globalValue, localValue);
│ │ │ │ -
121 localValue *= integrationElement;
│ │ │ │ -
122
│ │ │ │ -
123 return localValue;
│ │ │ │ -
124 }
│ │ │ │ -
125 };
│ │ │ │ -
126 };
│ │ │ │ -
127
│ │ │ │ -
141 struct CovariantPiolaTransformator
│ │ │ │ -
142 {
│ │ │ │ -
147 template<typename Values, typename LocalCoordinate, typename Geometry>
│ │ │ │ -
148 static auto apply(Values& values,
│ │ │ │ -
149 const LocalCoordinate& xi,
│ │ │ │ -
150 const Geometry& geometry)
│ │ │ │ -
151 {
│ │ │ │ -
152 auto jacobianInverseTransposed = geometry.jacobianInverseTransposed(xi);
│ │ │ │ -
153
│ │ │ │ -
154 for (auto& value : values)
│ │ │ │ -
155 {
│ │ │ │ -
156 auto tmp = value;
│ │ │ │ -
157 jacobianInverseTransposed.mv(tmp, value);
│ │ │ │ -
158 }
│ │ │ │ -
159 }
│ │ │ │ -
160
│ │ │ │ -
170 template<typename Gradients, typename LocalCoordinate, typename Geometry>
│ │ │ │ -
171 static auto applyJacobian(Gradients& gradients,
│ │ │ │ -
172 const LocalCoordinate& xi,
│ │ │ │ -
173 const Geometry& geometry)
│ │ │ │ -
174 {
│ │ │ │ -
175 auto jacobianInverseTransposed = geometry.jacobianInverseTransposed(xi);
│ │ │ │ -
176
│ │ │ │ -
177 for (auto& gradient : gradients)
│ │ │ │ -
178 {
│ │ │ │ -
179 auto tmp = gradient;
│ │ │ │ -
180 gradient = 0;
│ │ │ │ -
181 for (size_t j=0; j<gradient.N(); j++)
│ │ │ │ -
182 for (size_t k=0; k<gradient.M(); k++)
│ │ │ │ -
183 // Use sparseRange because jacobianTransposed may be a sparse DiagonalMatrix
│ │ │ │ -
184 for(auto&& [jacobianInverseTransposed_j_l, l] : sparseRange(jacobianInverseTransposed[j]))
│ │ │ │ -
185 gradient[j][k] += jacobianInverseTransposed_j_l * tmp[l][k];
│ │ │ │ -
186 }
│ │ │ │ -
187 }
│ │ │ │ -
188
│ │ │ │ -
196 template<class Function, class LocalCoordinate, class Element>
│ │ │ │ -
197 class LocalValuedFunction
│ │ │ │ -
198 {
│ │ │ │ -
199 const Function& f_;
│ │ │ │ -
200 const Element& element_;
│ │ │ │ -
201
│ │ │ │ -
202 public:
│ │ │ │ -
203
│ │ │ │ -
204 LocalValuedFunction(const Function& f, const Element& element)
│ │ │ │ -
205 : f_(f), element_(element)
│ │ │ │ -
206 {}
│ │ │ │ -
207
│ │ │ │ -
208 auto operator()(const LocalCoordinate& xi) const
│ │ │ │ -
209 {
│ │ │ │ -
210 auto globalValue = f_(xi);
│ │ │ │ -
211
│ │ │ │ -
212 // Apply the inverse Piola transform
│ │ │ │ -
213 auto jacobianTransposed = element_.geometry().jacobianTransposed(xi);
│ │ │ │ -
214
│ │ │ │ -
215 auto localValue = globalValue;
│ │ │ │ -
216 jacobianTransposed.mv(globalValue, localValue);
│ │ │ │ -
217
│ │ │ │ -
218 return localValue;
│ │ │ │ -
219 }
│ │ │ │ -
220 };
│ │ │ │ -
221 };
│ │ │ │ -
222
│ │ │ │ -
229 template<class Transformator, class LocalValuedLocalBasis, class Element>
│ │ │ │ -
230 class GlobalValuedLocalBasis
│ │ │ │ -
231 {
│ │ │ │ -
232 public:
│ │ │ │ -
233 using Traits = typename LocalValuedLocalBasis::Traits;
│ │ │ │ -
234
│ │ │ │ -
237 void bind(const LocalValuedLocalBasis& localValuedLocalBasis, const Element& element)
│ │ │ │ -
238 {
│ │ │ │ -
239 localValuedLocalBasis_ = &localValuedLocalBasis;
│ │ │ │ -
240 element_ = &element;
│ │ │ │ -
241 }
│ │ │ │ -
242
│ │ │ │ -
245 auto size() const
│ │ │ │ -
246 {
│ │ │ │ -
247 return localValuedLocalBasis_->size();
│ │ │ │ -
248 }
│ │ │ │ -
249
│ │ │ │ -
251 void evaluateFunction(const typename Traits::DomainType& x,
│ │ │ │ -
252 std::vector<typename Traits::RangeType>& out) const
│ │ │ │ -
253 {
│ │ │ │ -
254 localValuedLocalBasis_->evaluateFunction(x,out);
│ │ │ │ -
255
│ │ │ │ -
256 Transformator::apply(out, x, element_->geometry());
│ │ │ │ -
257 }
│ │ │ │ -
258
│ │ │ │ -
264 void evaluateJacobian(const typename Traits::DomainType& x,
│ │ │ │ -
265 std::vector<typename Traits::JacobianType>& out) const
│ │ │ │ -
266 {
│ │ │ │ -
267 localValuedLocalBasis_->evaluateJacobian(x,out);
│ │ │ │ -
268
│ │ │ │ -
269 Transformator::applyJacobian(out, x, element_->geometry());
│ │ │ │ -
270 }
│ │ │ │ -
271
│ │ │ │ -
278 void partial(const std::array<unsigned int,2>& order,
│ │ │ │ -
279 const typename Traits::DomainType& x,
│ │ │ │ -
280 std::vector<typename Traits::RangeType>& out) const
│ │ │ │ -
281 {
│ │ │ │ -
282 auto totalOrder = std::accumulate(order.begin(), order.end(), 0);
│ │ │ │ -
283 if (totalOrder == 0) {
│ │ │ │ -
284 evaluateFunction(x, out);
│ │ │ │ -
285 } else if (totalOrder == 1) {
│ │ │ │ -
286 auto const direction = std::distance(order.begin(), std::find(order.begin(), order.end(), 1));
│ │ │ │ -
287 out.resize(size());
│ │ │ │ -
288
│ │ │ │ -
289 // TODO: The following is wasteful: We compute the full Jacobian and then return
│ │ │ │ -
290 // only a part of it. While we need the full Jacobian of the underlying local-valued LFE,
│ │ │ │ -
291 // it should be possible to compute only a partial Piola transform for the requested
│ │ │ │ -
292 // partial derivatives.
│ │ │ │ -
293 std::vector<typename Traits::JacobianType> fullJacobian;
│ │ │ │ -
294 localValuedLocalBasis_->evaluateJacobian(x,fullJacobian);
│ │ │ │ -
295
│ │ │ │ -
296 Transformator::applyJacobian(fullJacobian, x, element_->geometry());
│ │ │ │ -
297
│ │ │ │ -
298 for (std::size_t i=0; i<out.size(); i++)
│ │ │ │ -
299 for (std::size_t j=0; j<out[i].size(); j++)
│ │ │ │ -
300 out[i][j] = fullJacobian[i][j][direction];
│ │ │ │ -
301
│ │ │ │ -
302 } else
│ │ │ │ -
303 DUNE_THROW(NotImplemented, "Partial derivatives of order 2 or higher");
│ │ │ │ -
304 }
│ │ │ │ -
305
│ │ │ │ -
307 auto order() const
│ │ │ │ -
308 {
│ │ │ │ -
309 return localValuedLocalBasis_->order();
│ │ │ │ -
310 }
│ │ │ │ -
311
│ │ │ │ -
312 const LocalValuedLocalBasis* localValuedLocalBasis_;
│ │ │ │ -
313 const Element* element_;
│ │ │ │ -
314 };
│ │ │ │ -
315
│ │ │ │ -
324 template<class Transformator, class LocalValuedLocalInterpolation, class Element>
│ │ │ │ -
325 class GlobalValuedLocalInterpolation
│ │ │ │ -
326 {
│ │ │ │ -
327 public:
│ │ │ │ -
330 void bind(const LocalValuedLocalInterpolation& localValuedLocalInterpolation, const Element& element)
│ │ │ │ -
331 {
│ │ │ │ -
332 localValuedLocalInterpolation_ = &localValuedLocalInterpolation;
│ │ │ │ -
333 element_ = &element;
│ │ │ │ -
334 }
│ │ │ │ -
335
│ │ │ │ -
336 template<typename F, typename C>
│ │ │ │ -
337 void interpolate (const F& f, std::vector<C>& out) const
│ │ │ │ -
338 {
│ │ │ │ -
339 using LocalCoordinate = typename Element::Geometry::LocalCoordinate;
│ │ │ │ -
340 typename Transformator::template LocalValuedFunction<F,LocalCoordinate,Element> localValuedFunction(f, *element_);
│ │ │ │ -
341 localValuedLocalInterpolation_->interpolate(localValuedFunction, out);
│ │ │ │ -
342 }
│ │ │ │ -
343
│ │ │ │ -
344 private:
│ │ │ │ -
345 const LocalValuedLocalInterpolation* localValuedLocalInterpolation_;
│ │ │ │ -
346 const Element* element_;
│ │ │ │ -
347 };
│ │ │ │ -
348
│ │ │ │ -
349
│ │ │ │ -
356 template<class Transformator, class LocalValuedLFE, class Element>
│ │ │ │ -
357 class GlobalValuedLocalFiniteElement
│ │ │ │ -
358 {
│ │ │ │ -
359 using LocalBasis = GlobalValuedLocalBasis<Transformator,
│ │ │ │ -
360 typename LocalValuedLFE::Traits::LocalBasisType,
│ │ │ │ -
361 Element>;
│ │ │ │ -
362 using LocalInterpolation = GlobalValuedLocalInterpolation<Transformator,
│ │ │ │ -
363 typename LocalValuedLFE::Traits::LocalInterpolationType,
│ │ │ │ -
364 Element>;
│ │ │ │ -
365
│ │ │ │ -
366 public:
│ │ │ │ -
369 using Traits = LocalFiniteElementTraits<LocalBasis,
│ │ │ │ -
370 typename LocalValuedLFE::Traits::LocalCoefficientsType,
│ │ │ │ -
371 LocalInterpolation>;
│ │ │ │ -
372
│ │ │ │ -
373 GlobalValuedLocalFiniteElement() {}
│ │ │ │ -
374
│ │ │ │ -
375 void bind(const LocalValuedLFE& localValuedLFE, const Element& element)
│ │ │ │ -
376 {
│ │ │ │ -
377 globalValuedLocalBasis_.bind(localValuedLFE.localBasis(), element);
│ │ │ │ -
378 globalValuedLocalInterpolation_.bind(localValuedLFE.localInterpolation(), element);
│ │ │ │ -
379 localValuedLFE_ = &localValuedLFE;
│ │ │ │ -
380 }
│ │ │ │ -
381
│ │ │ │ -
384 const typename Traits::LocalBasisType& localBasis() const
│ │ │ │ -
385 {
│ │ │ │ -
386 return globalValuedLocalBasis_;
│ │ │ │ -
387 }
│ │ │ │ -
388
│ │ │ │ -
391 const typename Traits::LocalCoefficientsType& localCoefficients() const
│ │ │ │ -
392 {
│ │ │ │ -
393 return localValuedLFE_->localCoefficients();
│ │ │ │ -
394 }
│ │ │ │ -
395
│ │ │ │ -
398 const typename Traits::LocalInterpolationType& localInterpolation() const
│ │ │ │ -
399 {
│ │ │ │ -
400 return globalValuedLocalInterpolation_;
│ │ │ │ -
401 }
│ │ │ │ -
402
│ │ │ │ -
404 std::size_t size() const
│ │ │ │ -
405 {
│ │ │ │ -
406 return localValuedLFE_->size();
│ │ │ │ -
407 }
│ │ │ │ -
408
│ │ │ │ -
411 GeometryType type() const
│ │ │ │ -
412 {
│ │ │ │ -
413 return localValuedLFE_->type();
│ │ │ │ -
414 }
│ │ │ │ -
415
│ │ │ │ -
416 private:
│ │ │ │ -
417
│ │ │ │ -
418 typename Traits::LocalBasisType globalValuedLocalBasis_;
│ │ │ │ -
419 typename Traits::LocalInterpolationType globalValuedLocalInterpolation_;
│ │ │ │ -
420 const LocalValuedLFE* localValuedLFE_;
│ │ │ │ -
421 };
│ │ │ │ -
422
│ │ │ │ -
423} // namespace Dune::Functions::Impl
│ │ │ │ -
424
│ │ │ │ -
425#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:203
│ │ │ │ +
18
│ │ │ │ +
31template<class B>
│ │ │ │ +
│ │ │ │ +
32class
│ │ │ │ +
33[[deprecated("SizeInfo is deprecated and will be removed after release 2.10.")]]
│ │ │ │ + │ │ │ │ +
35{
│ │ │ │ +
36public:
│ │ │ │ +
37 using Basis = B;
│ │ │ │ +
38 using size_type = typename Basis::size_type;
│ │ │ │ +
39 using SizePrefix = typename Basis::SizePrefix;
│ │ │ │ +
40
│ │ │ │ +
│ │ │ │ +
44 SizeInfo(const Basis& basis) :
│ │ │ │ +
45 basis_(&basis)
│ │ │ │ +
46 {}
│ │ │ │ +
│ │ │ │ +
47
│ │ │ │ +
│ │ │ │ +
51 size_type operator()(const SizePrefix& prefix) const
│ │ │ │ +
52 {
│ │ │ │ +
53 return basis_->size(prefix);
│ │ │ │ +
54 }
│ │ │ │ +
│ │ │ │ +
55
│ │ │ │ +
│ │ │ │ +
62 size_type size(const SizePrefix& prefix) const
│ │ │ │ +
63 {
│ │ │ │ +
64 return basis_->size(prefix);
│ │ │ │ +
65 }
│ │ │ │ +
│ │ │ │ +
66
│ │ │ │ +
│ │ │ │ +
67 operator size_type () const
│ │ │ │ +
68 {
│ │ │ │ +
69 return basis_->dimension();
│ │ │ │ +
70 }
│ │ │ │ +
│ │ │ │ +
71
│ │ │ │ +
72protected:
│ │ │ │ +
73
│ │ │ │ +
74 const Basis* basis_;
│ │ │ │ +
75};
│ │ │ │ +
│ │ │ │ +
76
│ │ │ │ +
77
│ │ │ │ +
81template<class Basis>
│ │ │ │ +
│ │ │ │ +
82SizeInfo<Basis> sizeInfo(const Basis& basis)
│ │ │ │ +
83{
│ │ │ │ +
84 return SizeInfo<Basis>(basis);
│ │ │ │ +
85}
│ │ │ │ +
│ │ │ │ +
86
│ │ │ │ +
87
│ │ │ │ +
88
│ │ │ │ +
89} // end namespace Functions
│ │ │ │ +
90} // end namespace Dune
│ │ │ │ +
91
│ │ │ │ +
92#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SIZEINFO_HH
│ │ │ │ +
Definition polynomial.hh:17
│ │ │ │ +
SizeInfo< Basis > sizeInfo(const Basis &basis)
Definition sizeinfo.hh:82
│ │ │ │ +
A class encapsulating size information.
Definition sizeinfo.hh:35
│ │ │ │ +
typename Basis::SizePrefix SizePrefix
Definition sizeinfo.hh:39
│ │ │ │ +
size_type size(const SizePrefix &prefix) const
Return number possible values for next position in multi index.
Definition sizeinfo.hh:62
│ │ │ │ +
size_type operator()(const SizePrefix &prefix) const
Return number possible values for next position in multi index.
Definition sizeinfo.hh:51
│ │ │ │ +
typename Basis::size_type size_type
Definition sizeinfo.hh:38
│ │ │ │ +
B Basis
Definition sizeinfo.hh:37
│ │ │ │ +
SizeInfo(const Basis &basis)
Construct from basis.
Definition sizeinfo.hh:44
│ │ │ │ +
const Basis * basis_
Definition sizeinfo.hh:74
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,341 +1,112 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -globalvaluedlocalfiniteelement.hh │ │ │ │ │ +sizeinfo.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_GLOBALVALUEDLOCALFINITEELEMENT_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_GLOBALVALUEDLOCALFINITEELEMENT_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SIZEINFO_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SIZEINFO_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12 │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ +10#warning The header dune/functions/functionspacebases/sizeinfo.hh is │ │ │ │ │ +deprecated and will be removed after release 2.10. │ │ │ │ │ +11 │ │ │ │ │ +12#include │ │ │ │ │ +13 │ │ │ │ │ +14namespace _D_u_n_e { │ │ │ │ │ +15namespace Functions { │ │ │ │ │ +16 │ │ │ │ │ 17 │ │ │ │ │ -18#include │ │ │ │ │ -19 │ │ │ │ │ -20#include │ │ │ │ │ -21#include │ │ │ │ │ -22 │ │ │ │ │ -23namespace Dune::Functions::Impl │ │ │ │ │ -24{ │ │ │ │ │ -25 │ │ │ │ │ -39 struct ContravariantPiolaTransformator │ │ │ │ │ -40 { │ │ │ │ │ -45 template │ │ │ │ │ -46 static auto apply(Values& values, │ │ │ │ │ -47 const LocalCoordinate& xi, │ │ │ │ │ -48 const Geometry& geometry) │ │ │ │ │ -49 { │ │ │ │ │ -50 auto jacobianTransposed = geometry.jacobianTransposed(xi); │ │ │ │ │ -51 auto integrationElement = geometry.integrationElement(xi); │ │ │ │ │ -52 │ │ │ │ │ -53 for (auto& value : values) │ │ │ │ │ -54 { │ │ │ │ │ -55 auto tmp = value; │ │ │ │ │ -56 jacobianTransposed.mtv(tmp, value); │ │ │ │ │ -57 value /= integrationElement; │ │ │ │ │ -58 } │ │ │ │ │ -59 } │ │ │ │ │ -60 │ │ │ │ │ -70 template │ │ │ │ │ -71 static auto applyJacobian(Gradients& gradients, │ │ │ │ │ -72 const LocalCoordinate& xi, │ │ │ │ │ -73 const Geometry& geometry) │ │ │ │ │ -74 { │ │ │ │ │ -75 auto jacobianTransposed = geometry.jacobianTransposed(xi); │ │ │ │ │ -76 auto integrationElement = geometry.integrationElement(xi); │ │ │ │ │ -77 for (auto& gradient : gradients) │ │ │ │ │ -78 { │ │ │ │ │ -79 auto tmp = gradient; │ │ │ │ │ -80 gradient = 0; │ │ │ │ │ -81 for (size_t k=0; k │ │ │ │ │ -98 class LocalValuedFunction │ │ │ │ │ -99 { │ │ │ │ │ -100 const Function& f_; │ │ │ │ │ -101 const Element& element_; │ │ │ │ │ -102 │ │ │ │ │ -103 using LocalValue = LocalCoordinate; │ │ │ │ │ -104 │ │ │ │ │ -105 public: │ │ │ │ │ -106 │ │ │ │ │ -107 LocalValuedFunction(const Function& f, const Element& element) │ │ │ │ │ -108 : f_(f), element_(element) │ │ │ │ │ -109 {} │ │ │ │ │ -110 │ │ │ │ │ -111 auto operator()(const LocalCoordinate& xi) const │ │ │ │ │ -112 { │ │ │ │ │ -113 auto globalValue = f_(xi); │ │ │ │ │ -114 │ │ │ │ │ -115 // Apply the inverse Piola transform │ │ │ │ │ -116 auto jacobianInverseTransposed = element_.geometry │ │ │ │ │ -().jacobianInverseTransposed(xi); │ │ │ │ │ -117 auto integrationElement = element_.geometry().integrationElement(xi); │ │ │ │ │ -118 │ │ │ │ │ -119 auto localValue = LocalValue{}; │ │ │ │ │ -120 jacobianInverseTransposed.mtv(globalValue, localValue); │ │ │ │ │ -121 localValue *= integrationElement; │ │ │ │ │ -122 │ │ │ │ │ -123 return localValue; │ │ │ │ │ -124 } │ │ │ │ │ -125 }; │ │ │ │ │ -126 }; │ │ │ │ │ -127 │ │ │ │ │ -141 struct CovariantPiolaTransformator │ │ │ │ │ -142 { │ │ │ │ │ -147 template │ │ │ │ │ -148 static auto apply(Values& values, │ │ │ │ │ -149 const LocalCoordinate& xi, │ │ │ │ │ -150 const Geometry& geometry) │ │ │ │ │ -151 { │ │ │ │ │ -152 auto jacobianInverseTransposed = geometry.jacobianInverseTransposed(xi); │ │ │ │ │ -153 │ │ │ │ │ -154 for (auto& value : values) │ │ │ │ │ -155 { │ │ │ │ │ -156 auto tmp = value; │ │ │ │ │ -157 jacobianInverseTransposed.mv(tmp, value); │ │ │ │ │ -158 } │ │ │ │ │ -159 } │ │ │ │ │ -160 │ │ │ │ │ -170 template │ │ │ │ │ -171 static auto applyJacobian(Gradients& gradients, │ │ │ │ │ -172 const LocalCoordinate& xi, │ │ │ │ │ -173 const Geometry& geometry) │ │ │ │ │ -174 { │ │ │ │ │ -175 auto jacobianInverseTransposed = geometry.jacobianInverseTransposed(xi); │ │ │ │ │ -176 │ │ │ │ │ -177 for (auto& gradient : gradients) │ │ │ │ │ -178 { │ │ │ │ │ -179 auto tmp = gradient; │ │ │ │ │ -180 gradient = 0; │ │ │ │ │ -181 for (size_t j=0; j │ │ │ │ │ -197 class LocalValuedFunction │ │ │ │ │ -198 { │ │ │ │ │ -199 const Function& f_; │ │ │ │ │ -200 const Element& element_; │ │ │ │ │ -201 │ │ │ │ │ -202 public: │ │ │ │ │ -203 │ │ │ │ │ -204 LocalValuedFunction(const Function& f, const Element& element) │ │ │ │ │ -205 : f_(f), element_(element) │ │ │ │ │ -206 {} │ │ │ │ │ -207 │ │ │ │ │ -208 auto operator()(const LocalCoordinate& xi) const │ │ │ │ │ -209 { │ │ │ │ │ -210 auto globalValue = f_(xi); │ │ │ │ │ -211 │ │ │ │ │ -212 // Apply the inverse Piola transform │ │ │ │ │ -213 auto jacobianTransposed = element_.geometry().jacobianTransposed(xi); │ │ │ │ │ -214 │ │ │ │ │ -215 auto localValue = globalValue; │ │ │ │ │ -216 jacobianTransposed.mv(globalValue, localValue); │ │ │ │ │ -217 │ │ │ │ │ -218 return localValue; │ │ │ │ │ -219 } │ │ │ │ │ -220 }; │ │ │ │ │ -221 }; │ │ │ │ │ -222 │ │ │ │ │ -229 template │ │ │ │ │ -230 class GlobalValuedLocalBasis │ │ │ │ │ -231 { │ │ │ │ │ -232 public: │ │ │ │ │ -233 using Traits = typename LocalValuedLocalBasis::Traits; │ │ │ │ │ -234 │ │ │ │ │ -237 void bind(const LocalValuedLocalBasis& localValuedLocalBasis, const │ │ │ │ │ -Element& element) │ │ │ │ │ -238 { │ │ │ │ │ -239 localValuedLocalBasis_ = &localValuedLocalBasis; │ │ │ │ │ -240 element_ = &element; │ │ │ │ │ -241 } │ │ │ │ │ -242 │ │ │ │ │ -245 auto size() const │ │ │ │ │ -246 { │ │ │ │ │ -247 return localValuedLocalBasis_->size(); │ │ │ │ │ -248 } │ │ │ │ │ -249 │ │ │ │ │ -251 void evaluateFunction(const typename Traits::DomainType& x, │ │ │ │ │ -252 std::vector& out) const │ │ │ │ │ -253 { │ │ │ │ │ -254 localValuedLocalBasis_->evaluateFunction(x,out); │ │ │ │ │ -255 │ │ │ │ │ -256 Transformator::apply(out, x, element_->geometry()); │ │ │ │ │ -257 } │ │ │ │ │ -258 │ │ │ │ │ -264 void evaluateJacobian(const typename Traits::DomainType& x, │ │ │ │ │ -265 std::vector& out) const │ │ │ │ │ -266 { │ │ │ │ │ -267 localValuedLocalBasis_->evaluateJacobian(x,out); │ │ │ │ │ -268 │ │ │ │ │ -269 Transformator::applyJacobian(out, x, element_->geometry()); │ │ │ │ │ -270 } │ │ │ │ │ -271 │ │ │ │ │ -278 void partial(const std::array& order, │ │ │ │ │ -279 const typename Traits::DomainType& x, │ │ │ │ │ -280 std::vector& out) const │ │ │ │ │ -281 { │ │ │ │ │ -282 auto totalOrder = std::accumulate(order.begin(), order.end(), 0); │ │ │ │ │ -283 if (totalOrder == 0) { │ │ │ │ │ -284 evaluateFunction(x, out); │ │ │ │ │ -285 } else if (totalOrder == 1) { │ │ │ │ │ -286 auto const direction = std::distance(order.begin(), std::find(order.begin │ │ │ │ │ -(), order.end(), 1)); │ │ │ │ │ -287 out.resize(size()); │ │ │ │ │ -288 │ │ │ │ │ -289 // TODO: The following is wasteful: We compute the full Jacobian and then │ │ │ │ │ -return │ │ │ │ │ -290 // only a part of it. While we need the full Jacobian of the underlying │ │ │ │ │ -local-valued LFE, │ │ │ │ │ -291 // it should be possible to compute only a partial Piola transform for the │ │ │ │ │ -requested │ │ │ │ │ -292 // partial derivatives. │ │ │ │ │ -293 std::vector fullJacobian; │ │ │ │ │ -294 localValuedLocalBasis_->evaluateJacobian(x,fullJacobian); │ │ │ │ │ -295 │ │ │ │ │ -296 Transformator::applyJacobian(fullJacobian, x, element_->geometry()); │ │ │ │ │ -297 │ │ │ │ │ -298 for (std::size_t i=0; iorder(); │ │ │ │ │ -310 } │ │ │ │ │ -311 │ │ │ │ │ -312 const LocalValuedLocalBasis* localValuedLocalBasis_; │ │ │ │ │ -313 const Element* element_; │ │ │ │ │ -314 }; │ │ │ │ │ -315 │ │ │ │ │ -324 template │ │ │ │ │ -325 class GlobalValuedLocalInterpolation │ │ │ │ │ -326 { │ │ │ │ │ -327 public: │ │ │ │ │ -330 void bind(const LocalValuedLocalInterpolation& │ │ │ │ │ -localValuedLocalInterpolation, const Element& element) │ │ │ │ │ -331 { │ │ │ │ │ -332 localValuedLocalInterpolation_ = &localValuedLocalInterpolation; │ │ │ │ │ -333 element_ = &element; │ │ │ │ │ -334 } │ │ │ │ │ -335 │ │ │ │ │ -336 template │ │ │ │ │ -337 void _i_n_t_e_r_p_o_l_a_t_e (const F& f, std::vector& out) const │ │ │ │ │ -338 { │ │ │ │ │ -339 using LocalCoordinate = typename Element::Geometry::LocalCoordinate; │ │ │ │ │ -340 typename Transformator::template │ │ │ │ │ -LocalValuedFunction localValuedFunction(f, │ │ │ │ │ -*element_); │ │ │ │ │ -341 localValuedLocalInterpolation_->interpolate(localValuedFunction, out); │ │ │ │ │ -342 } │ │ │ │ │ -343 │ │ │ │ │ -344 private: │ │ │ │ │ -345 const LocalValuedLocalInterpolation* localValuedLocalInterpolation_; │ │ │ │ │ -346 const Element* element_; │ │ │ │ │ -347 }; │ │ │ │ │ -348 │ │ │ │ │ -349 │ │ │ │ │ -356 template │ │ │ │ │ -357 class GlobalValuedLocalFiniteElement │ │ │ │ │ -358 { │ │ │ │ │ -359 using LocalBasis = GlobalValuedLocalBasis; │ │ │ │ │ -362 using LocalInterpolation = GlobalValuedLocalInterpolation; │ │ │ │ │ -365 │ │ │ │ │ -366 public: │ │ │ │ │ -369 using Traits = LocalFiniteElementTraits; │ │ │ │ │ -372 │ │ │ │ │ -373 GlobalValuedLocalFiniteElement() {} │ │ │ │ │ -374 │ │ │ │ │ -375 void bind(const LocalValuedLFE& localValuedLFE, const Element& element) │ │ │ │ │ -376 { │ │ │ │ │ -377 globalValuedLocalBasis_.bind(localValuedLFE.localBasis(), element); │ │ │ │ │ -378 globalValuedLocalInterpolation_.bind(localValuedLFE.localInterpolation(), │ │ │ │ │ -element); │ │ │ │ │ -379 localValuedLFE_ = &localValuedLFE; │ │ │ │ │ -380 } │ │ │ │ │ -381 │ │ │ │ │ -384 const typename Traits::LocalBasisType& localBasis() const │ │ │ │ │ -385 { │ │ │ │ │ -386 return globalValuedLocalBasis_; │ │ │ │ │ -387 } │ │ │ │ │ -388 │ │ │ │ │ -391 const typename Traits::LocalCoefficientsType& localCoefficients() const │ │ │ │ │ -392 { │ │ │ │ │ -393 return localValuedLFE_->localCoefficients(); │ │ │ │ │ -394 } │ │ │ │ │ -395 │ │ │ │ │ -398 const typename Traits::LocalInterpolationType& localInterpolation() const │ │ │ │ │ -399 { │ │ │ │ │ -400 return globalValuedLocalInterpolation_; │ │ │ │ │ -401 } │ │ │ │ │ -402 │ │ │ │ │ -404 std::size_t size() const │ │ │ │ │ -405 { │ │ │ │ │ -406 return localValuedLFE_->size(); │ │ │ │ │ -407 } │ │ │ │ │ -408 │ │ │ │ │ -411 GeometryType type() const │ │ │ │ │ -412 { │ │ │ │ │ -413 return localValuedLFE_->type(); │ │ │ │ │ -414 } │ │ │ │ │ -415 │ │ │ │ │ -416 private: │ │ │ │ │ -417 │ │ │ │ │ -418 typename Traits::LocalBasisType globalValuedLocalBasis_; │ │ │ │ │ -419 typename Traits::LocalInterpolationType globalValuedLocalInterpolation_; │ │ │ │ │ -420 const LocalValuedLFE* localValuedLFE_; │ │ │ │ │ -421 }; │ │ │ │ │ -422 │ │ │ │ │ -423} // namespace Dune::Functions::Impl │ │ │ │ │ -424 │ │ │ │ │ -425#endif / │ │ │ │ │ -/ DUNE_FUNCTIONS_FUNCTIONSPACEBASES_GLOBALVALUEDLOCALFINITEELEMENT_HH │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_n_t_e_r_p_o_l_a_t_e │ │ │ │ │ -void interpolate(const B &basis, C &&coeff, const F &f, const BV &bv, const │ │ │ │ │ -NTRE &nodeToRangeEntry) │ │ │ │ │ -Interpolate given function in discrete function space. │ │ │ │ │ -DDeeffiinniittiioonn interpolate.hh:203 │ │ │ │ │ +18 │ │ │ │ │ +31template │ │ │ │ │ +_3_2class │ │ │ │ │ +33[[deprecated("SizeInfo is deprecated and will be removed after release │ │ │ │ │ +2.10.")]] │ │ │ │ │ +34_S_i_z_e_I_n_f_o │ │ │ │ │ +35{ │ │ │ │ │ +36public: │ │ │ │ │ +_3_7 using _B_a_s_i_s = B; │ │ │ │ │ +_3_8 using _s_i_z_e___t_y_p_e = typename Basis::size_type; │ │ │ │ │ +_3_9 using _S_i_z_e_P_r_e_f_i_x = typename Basis::SizePrefix; │ │ │ │ │ +40 │ │ │ │ │ +_4_4 _S_i_z_e_I_n_f_o(const _B_a_s_i_s& basis) : │ │ │ │ │ +45 basis_(&basis) │ │ │ │ │ +46 {} │ │ │ │ │ +47 │ │ │ │ │ +_5_1 _s_i_z_e___t_y_p_e _o_p_e_r_a_t_o_r_(_)(const _S_i_z_e_P_r_e_f_i_x& prefix) const │ │ │ │ │ +52 { │ │ │ │ │ +53 return basis_->size(prefix); │ │ │ │ │ +54 } │ │ │ │ │ +55 │ │ │ │ │ +_6_2 _s_i_z_e___t_y_p_e _s_i_z_e(const _S_i_z_e_P_r_e_f_i_x& prefix) const │ │ │ │ │ +63 { │ │ │ │ │ +64 return basis_->size(prefix); │ │ │ │ │ +65 } │ │ │ │ │ +66 │ │ │ │ │ +_6_7 operator _s_i_z_e___t_y_p_e () const │ │ │ │ │ +68 { │ │ │ │ │ +69 return basis_->dimension(); │ │ │ │ │ +70 } │ │ │ │ │ +71 │ │ │ │ │ +72protected: │ │ │ │ │ +73 │ │ │ │ │ +_7_4 const _B_a_s_i_s* _b_a_s_i_s__; │ │ │ │ │ +75}; │ │ │ │ │ +76 │ │ │ │ │ +77 │ │ │ │ │ +81template │ │ │ │ │ +_8_2_S_i_z_e_I_n_f_o_<_B_a_s_i_s_> _s_i_z_e_I_n_f_o(const Basis& basis) │ │ │ │ │ +83{ │ │ │ │ │ +84 return _S_i_z_e_I_n_f_o_<_B_a_s_i_s_>(basis); │ │ │ │ │ +85} │ │ │ │ │ +86 │ │ │ │ │ +87 │ │ │ │ │ +88 │ │ │ │ │ +89} // end namespace Functions │ │ │ │ │ +90} // end namespace Dune │ │ │ │ │ +91 │ │ │ │ │ +92#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SIZEINFO_HH │ │ │ │ │ +_D_u_n_e │ │ │ │ │ +DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_i_z_e_I_n_f_o │ │ │ │ │ +SizeInfo< Basis > sizeInfo(const Basis &basis) │ │ │ │ │ +DDeeffiinniittiioonn sizeinfo.hh:82 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_z_e_I_n_f_o │ │ │ │ │ +A class encapsulating size information. │ │ │ │ │ +DDeeffiinniittiioonn sizeinfo.hh:35 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_z_e_I_n_f_o_:_:_S_i_z_e_P_r_e_f_i_x │ │ │ │ │ +typename Basis::SizePrefix SizePrefix │ │ │ │ │ +DDeeffiinniittiioonn sizeinfo.hh:39 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_z_e_I_n_f_o_:_:_s_i_z_e │ │ │ │ │ +size_type size(const SizePrefix &prefix) const │ │ │ │ │ +Return number possible values for next position in multi index. │ │ │ │ │ +DDeeffiinniittiioonn sizeinfo.hh:62 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_z_e_I_n_f_o_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +size_type operator()(const SizePrefix &prefix) const │ │ │ │ │ +Return number possible values for next position in multi index. │ │ │ │ │ +DDeeffiinniittiioonn sizeinfo.hh:51 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_z_e_I_n_f_o_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +typename Basis::size_type size_type │ │ │ │ │ +DDeeffiinniittiioonn sizeinfo.hh:38 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_z_e_I_n_f_o_:_:_B_a_s_i_s │ │ │ │ │ +B Basis │ │ │ │ │ +DDeeffiinniittiioonn sizeinfo.hh:37 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_z_e_I_n_f_o_:_:_S_i_z_e_I_n_f_o │ │ │ │ │ +SizeInfo(const Basis &basis) │ │ │ │ │ +Construct from basis. │ │ │ │ │ +DDeeffiinniittiioonn sizeinfo.hh:44 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_z_e_I_n_f_o_:_:_b_a_s_i_s__ │ │ │ │ │ +const Basis * basis_ │ │ │ │ │ +DDeeffiinniittiioonn sizeinfo.hh:74 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00128.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: raviartthomasbasis.hh File Reference │ │ │ │ +dune-functions: compositebasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,70 +71,52 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Typedefs | │ │ │ │ -Functions
│ │ │ │ -
raviartthomasbasis.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
compositebasis.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 <dune/functions/functionspacebases/leafprebasismixin.hh>
│ │ │ │ +
#include <tuple>
│ │ │ │ +#include <utility>
│ │ │ │ +#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 <dune/functions/functionspacebases/concepts.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/containerdescriptors.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 >
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 , int k>
using Dune::Functions::RaviartThomasBasis = DefaultGlobalBasis< RaviartThomasPreBasis< GV, k > >
 Basis of a k-th-order Raviart Thomas finite element space.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Functions

template<std::size_t k>
auto Dune::Functions::BasisFactory::raviartThomas ()
 Create a pre-basis factory that can create a Raviart-Thomas pre-basis.
 
namespace  Dune::Functions::BasisBuilder
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,53 +1,40 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -raviartthomasbasis.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_g_l_o_b_a_l_v_a_l_u_e_d_l_o_c_a_l_f_i_n_i_t_e_e_l_e_m_e_n_t_._h_h> │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +compositebasis.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_s_t_a_t_i_c_f_o_r_l_o_o_p_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_u_t_i_l_i_t_y_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_b_a_s_i_s_t_a_g_s_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_<_ _G_V_,_ _k_ _> │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_<_ _G_V_,_ _k_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_<_ _I_M_S_,_ _S_P_B_ _> │ │ │ │ │ +  A pre-basis for composite bases. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y │ │ │ │ │   │ │ │ │ │ -TTyyppeeddeeffss │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s< │ │ │ │ │ - _R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s< GV, k > > │ │ │ │ │ -  Basis of a k-th-order Raviart Thomas finite element space. │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_r_a_v_i_a_r_t_T_h_o_m_a_s () │ │ │ │ │ -  Create a pre-basis factory that can create a Raviart-Thomas pre-basis. │ │ │ │ │ +namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_B_u_i_l_d_e_r │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00128_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: raviartthomasbasis.hh Source File │ │ │ │ +dune-functions: compositebasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,462 +74,482 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
raviartthomasbasis.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_COMPOSITEBASIS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_COMPOSITEBASIS_HH
│ │ │ │
9
│ │ │ │ -
10#include <array>
│ │ │ │ -
11#include <dune/common/exceptions.hh>
│ │ │ │ +
10#include <tuple>
│ │ │ │ +
11#include <utility>
│ │ │ │
12
│ │ │ │ -
13#include <dune/grid/common/capabilities.hh>
│ │ │ │ -
14#include <dune/grid/common/mcmgmapper.hh>
│ │ │ │ -
15
│ │ │ │ -
16#include <dune/localfunctions/common/localfiniteelementvariant.hh>
│ │ │ │ -
17#include <dune/localfunctions/raviartthomas.hh>
│ │ │ │ -
18#include <dune/localfunctions/raviartthomas/raviartthomas0cube2d.hh>
│ │ │ │ -
19#include <dune/localfunctions/raviartthomas/raviartthomas0cube3d.hh>
│ │ │ │ -
20#include <dune/localfunctions/raviartthomas/raviartthomas02d.hh>
│ │ │ │ -
21#include <dune/localfunctions/raviartthomas/raviartthomas03d.hh>
│ │ │ │ -
22#include <dune/localfunctions/raviartthomas/raviartthomas1cube2d.hh>
│ │ │ │ -
23#include <dune/localfunctions/raviartthomas/raviartthomas1cube3d.hh>
│ │ │ │ -
24#include <dune/localfunctions/raviartthomas/raviartthomas12d.hh>
│ │ │ │ -
25#include <dune/localfunctions/raviartthomas/raviartthomas2cube2d.hh>
│ │ │ │ -
26
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
31
│ │ │ │ -
32namespace Dune {
│ │ │ │ -
33namespace Functions {
│ │ │ │ -
34
│ │ │ │ -
35namespace Impl {
│ │ │ │ -
36
│ │ │ │ -
37 template<int dim, typename D, typename R, std::size_t k>
│ │ │ │ -
38 struct RaviartThomasSimplexLocalInfo
│ │ │ │ -
39 {
│ │ │ │ -
40 // Dummy type, must be something that we can have a std::unique_ptr to
│ │ │ │ -
41 using FiniteElement = void*;
│ │ │ │ -
42 };
│ │ │ │ +
13#include <dune/common/hybridutilities.hh>
│ │ │ │ +
14#include <dune/common/reservedvector.hh>
│ │ │ │ +
15#include <dune/common/typeutilities.hh>
│ │ │ │ +
16#include <dune/common/hybridutilities.hh>
│ │ │ │ +
17#include <dune/common/tupleutility.hh>
│ │ │ │ +
18#include <dune/common/tuplevector.hh>
│ │ │ │ +
19
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
28
│ │ │ │ +
29
│ │ │ │ +
30namespace Dune {
│ │ │ │ +
31namespace Functions {
│ │ │ │ +
32
│ │ │ │ +
33// *****************************************************************************
│ │ │ │ +
34// This is the reusable part of the composite bases. It contains
│ │ │ │ +
35//
│ │ │ │ +
36// CompositePreBasis
│ │ │ │ +
37//
│ │ │ │ +
38// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ +
39// state. These components do _not_ depend on the global basis and local view
│ │ │ │ +
40// and can be used without a global basis.
│ │ │ │ +
41// *****************************************************************************
│ │ │ │ +
42
│ │ │ │
43
│ │ │ │ -
44 template<typename D, typename R>
│ │ │ │ -
45 struct RaviartThomasSimplexLocalInfo<2,D,R,0>
│ │ │ │ -
46 {
│ │ │ │ -
47 using FiniteElement = RT02DLocalFiniteElement<D,R>;
│ │ │ │ -
48 };
│ │ │ │ -
49
│ │ │ │ -
50 template<typename D, typename R>
│ │ │ │ -
51 struct RaviartThomasSimplexLocalInfo<2,D,R,1>
│ │ │ │ -
52 {
│ │ │ │ -
53 using FiniteElement = RT12DLocalFiniteElement<D,R>;
│ │ │ │ -
54 };
│ │ │ │ -
55
│ │ │ │ -
56 template<typename D, typename R>
│ │ │ │ -
57 struct RaviartThomasSimplexLocalInfo<3,D,R,0>
│ │ │ │ -
58 {
│ │ │ │ -
59 using FiniteElement = RT03DLocalFiniteElement<D,R>;
│ │ │ │ -
60 };
│ │ │ │ -
61
│ │ │ │ -
62 template<int dim, typename D, typename R, std::size_t k>
│ │ │ │ -
63 struct RaviartThomasCubeLocalInfo
│ │ │ │ -
64 {
│ │ │ │ -
65 // Dummy type, must be something that we can have a std::unique_ptr to
│ │ │ │ -
66 using FiniteElement = void*;
│ │ │ │ -
67 };
│ │ │ │ -
68
│ │ │ │ -
69 template<typename D, typename R>
│ │ │ │ -
70 struct RaviartThomasCubeLocalInfo<2,D,R,0>
│ │ │ │ -
71 {
│ │ │ │ -
72 using FiniteElement = RT0Cube2DLocalFiniteElement<D,R>;
│ │ │ │ -
73 };
│ │ │ │ -
74
│ │ │ │ -
75 template<typename D, typename R>
│ │ │ │ -
76 struct RaviartThomasCubeLocalInfo<2,D,R,1>
│ │ │ │ -
77 {
│ │ │ │ -
78 using FiniteElement = RT1Cube2DLocalFiniteElement<D,R>;
│ │ │ │ -
79 };
│ │ │ │ -
80
│ │ │ │ -
81 template<typename D, typename R>
│ │ │ │ -
82 struct RaviartThomasCubeLocalInfo<2,D,R,2>
│ │ │ │ -
83 {
│ │ │ │ -
84 using FiniteElement = RT2Cube2DLocalFiniteElement<D,R>;
│ │ │ │ -
85 };
│ │ │ │ +
55template<class IMS, class... SPB>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
57{
│ │ │ │ +
58 static const bool isBlocked = std::is_same_v<IMS,BasisFactory::BlockedLexicographic> or std::is_same_v<IMS,BasisFactory::BlockedInterleaved>;
│ │ │ │ +
59public:
│ │ │ │ +
60
│ │ │ │ +
62 using SubPreBases = std::tuple<SPB...>;
│ │ │ │ +
63
│ │ │ │ +
65 template<std::size_t i>
│ │ │ │ +
66 using SubPreBasis = std::tuple_element_t<i, SubPreBases>;
│ │ │ │ +
67
│ │ │ │ +
69 using GridView = typename std::tuple_element_t<0, SubPreBases>::GridView;
│ │ │ │ +
70
│ │ │ │ +
72 using size_type = std::size_t;
│ │ │ │ +
73
│ │ │ │ + │ │ │ │ +
76
│ │ │ │ +
77protected:
│ │ │ │ +
78 static const std::size_t children = sizeof...(SPB);
│ │ │ │ +
79
│ │ │ │ +
80 using ChildIndices = std::make_index_sequence<children>;
│ │ │ │ +
81
│ │ │ │ +
82public:
│ │ │ │ +
83
│ │ │ │ +
85 using Node = CompositeBasisNode<typename SPB::Node...>;
│ │ │ │
86
│ │ │ │ -
87 template<typename D, typename R>
│ │ │ │ -
88 struct RaviartThomasCubeLocalInfo<3,D,R,0>
│ │ │ │ -
89 {
│ │ │ │ -
90 using FiniteElement = RT0Cube3DLocalFiniteElement<D,R>;
│ │ │ │ -
91 };
│ │ │ │ -
92
│ │ │ │ -
93 template<typename D, typename R>
│ │ │ │ -
94 struct RaviartThomasCubeLocalInfo<3,D,R,1>
│ │ │ │ -
95 {
│ │ │ │ -
96 using FiniteElement = RT1Cube3DLocalFiniteElement<D,R>;
│ │ │ │ -
97 };
│ │ │ │ -
98
│ │ │ │ -
99 template<typename GV, int dim, typename R, std::size_t k>
│ │ │ │ -
100 class RaviartThomasLocalFiniteElementMap
│ │ │ │ +
87 static constexpr size_type maxMultiIndexSize = std::max({SPB::maxMultiIndexSize...}) + isBlocked;
│ │ │ │ +
88 static constexpr size_type minMultiIndexSize = std::min({SPB::minMultiIndexSize...}) + isBlocked;
│ │ │ │ +
89 static constexpr size_type multiIndexBufferSize = std::max({SPB::multiIndexBufferSize...}) + isBlocked;
│ │ │ │ +
90
│ │ │ │ +
96 template<class... SFArgs,
│ │ │ │ +
97 disableCopyMove<CompositePreBasis, SFArgs...> = 0,
│ │ │ │ +
98 enableIfConstructible<std::tuple<SPB...>, SFArgs...> = 0>
│ │ │ │ +
│ │ │ │ +
99 CompositePreBasis(SFArgs&&... sfArgs) :
│ │ │ │ +
100 subPreBases_(std::forward<SFArgs>(sfArgs)...)
│ │ │ │
101 {
│ │ │ │ -
102 using D = typename GV::ctype;
│ │ │ │ -
103 constexpr static bool hasFixedElementType = Capabilities::hasSingleGeometryType<typename GV::Grid>::v;
│ │ │ │ -
104
│ │ │ │ -
105 using CubeFiniteElement = typename RaviartThomasCubeLocalInfo<dim, D, R, k>::FiniteElement;
│ │ │ │ -
106 using SimplexFiniteElement = typename RaviartThomasSimplexLocalInfo<dim, D, R, k>::FiniteElement;
│ │ │ │ -
107
│ │ │ │ -
108 public:
│ │ │ │ -
109
│ │ │ │ -
110 using T = LocalBasisTraits<D, dim, FieldVector<D,dim>, R, dim, FieldVector<R,dim>, FieldMatrix<D,dim,dim> >;
│ │ │ │ -
111
│ │ │ │ -
112 constexpr static unsigned int topologyId = Capabilities::hasSingleGeometryType<typename GV::Grid>::topologyId; // meaningless if hasFixedElementType is false
│ │ │ │ -
113 constexpr static GeometryType type = GeometryType(topologyId, GV::dimension);
│ │ │ │ -
114
│ │ │ │ -
115 using FiniteElement = std::conditional_t<hasFixedElementType,
│ │ │ │ -
116 std::conditional_t<type.isCube(),CubeFiniteElement,SimplexFiniteElement>,
│ │ │ │ -
117 LocalFiniteElementVariant<CubeFiniteElement, SimplexFiniteElement> >;
│ │ │ │ -
118
│ │ │ │ -
119 // Each element facet can have its orientation reversed, hence there are
│ │ │ │ -
120 // 2^#facets different variants.
│ │ │ │ -
121 static std::size_t numVariants(GeometryType type)
│ │ │ │ -
122 {
│ │ │ │ -
123 auto numFacets = referenceElement<D,dim>(type).size(1);
│ │ │ │ -
124 return power(2,numFacets);
│ │ │ │ -
125 }
│ │ │ │ +
102 Hybrid::forEach(subPreBases_, [&](const auto& subPreBasis){
│ │ │ │ +
103 static_assert(models<Concept::PreBasis<GridView>, std::decay_t<decltype(subPreBasis)>>(), "Subprebases passed to CompositePreBasis does not model the PreBasis concept.");
│ │ │ │ +
104 });
│ │ │ │ +
105 }
│ │ │ │ +
│ │ │ │ +
106
│ │ │ │ +
113 template<class GV,
│ │ │ │ +
114 std::enable_if_t<std::conjunction_v<
│ │ │ │ +
115 std::bool_constant<(children > 1)>, // Avoid ambiguous constructor if there's only one child
│ │ │ │ +
116 std::is_same<GV, GridView>,
│ │ │ │ +
117 std::is_constructible<SPB, GridView>...
│ │ │ │ +
118 >, int> = 0>
│ │ │ │ +
│ │ │ │ +
119 CompositePreBasis(const GV& gv) :
│ │ │ │ +
120 subPreBases_(SPB(gv)...)
│ │ │ │ +
121 {
│ │ │ │ +
122 Hybrid::forEach(subPreBases_, [&](const auto& subPreBasis){
│ │ │ │ +
123 static_assert(models<Concept::PreBasis<GridView>, std::decay_t<decltype(subPreBasis)>>(), "Subprebases passed to CompositePreBasis does not model the PreBasis concept.");
│ │ │ │ +
124 });
│ │ │ │ +
125 }
│ │ │ │ +
│ │ │ │
126
│ │ │ │ -
127 RaviartThomasLocalFiniteElementMap(const GV& gv)
│ │ │ │ -
128 : elementMapper_(gv, mcmgElementLayout()),
│ │ │ │ -
129 orient_(gv.size(0))
│ │ │ │ -
130 {
│ │ │ │ -
131 if constexpr (hasFixedElementType)
│ │ │ │ -
132 {
│ │ │ │ -
133 variants_.resize(numVariants(type));
│ │ │ │ -
134 for (size_t i = 0; i < numVariants(type); i++)
│ │ │ │ -
135 variants_[i] = FiniteElement(i);
│ │ │ │ -
136 }
│ │ │ │ -
137 else
│ │ │ │ -
138 {
│ │ │ │ -
139 // for mixed grids add offset for cubes
│ │ │ │ -
140 variants_.resize(numVariants(GeometryTypes::simplex(dim)) + numVariants(GeometryTypes::cube(dim)));
│ │ │ │ -
141 for (size_t i = 0; i < numVariants(GeometryTypes::simplex(dim)); i++)
│ │ │ │ -
142 variants_[i] = SimplexFiniteElement(i);
│ │ │ │ -
143 for (size_t i = 0; i < numVariants(GeometryTypes::cube(dim)); i++)
│ │ │ │ -
144 variants_[i + numVariants(GeometryTypes::simplex(dim))] = CubeFiniteElement(i);
│ │ │ │ -
145 }
│ │ │ │ -
146
│ │ │ │ -
147 for(const auto& cell : elements(gv))
│ │ │ │ -
148 {
│ │ │ │ -
149 unsigned int myId = elementMapper_.index(cell);
│ │ │ │ -
150 orient_[myId] = 0;
│ │ │ │ -
151
│ │ │ │ -
152 for (const auto& intersection : intersections(gv,cell))
│ │ │ │ -
153 {
│ │ │ │ -
154 if (intersection.neighbor() && (elementMapper_.index(intersection.outside()) > myId))
│ │ │ │ -
155 orient_[myId] |= (1 << intersection.indexInInside());
│ │ │ │ -
156 }
│ │ │ │ -
157
│ │ │ │ -
158 // for mixed grids add offset for cubes
│ │ │ │ -
159 if constexpr (!hasFixedElementType)
│ │ │ │ -
160 if (cell.type().isCube())
│ │ │ │ -
161 orient_[myId] += numVariants(GeometryTypes::simplex(dim));
│ │ │ │ -
162 }
│ │ │ │ -
163 }
│ │ │ │ -
164
│ │ │ │ -
165 template<class EntityType>
│ │ │ │ -
166 const FiniteElement& find(const EntityType& e) const
│ │ │ │ -
167 {
│ │ │ │ -
168 return variants_[orient_[elementMapper_.index(e)]];
│ │ │ │ -
169 }
│ │ │ │ -
170
│ │ │ │ -
171 private:
│ │ │ │ -
172 std::vector<FiniteElement> variants_;
│ │ │ │ -
173 Dune::MultipleCodimMultipleGeomTypeMapper<GV> elementMapper_;
│ │ │ │ -
174 std::vector<unsigned char> orient_;
│ │ │ │ -
175 };
│ │ │ │ -
176
│ │ │ │ -
177
│ │ │ │ -
178} // namespace Impl
│ │ │ │ -
179
│ │ │ │ -
180
│ │ │ │ -
181// *****************************************************************************
│ │ │ │ -
182// This is the reusable part of the basis. It contains
│ │ │ │ -
183//
│ │ │ │ -
184// RaviartThomasPreBasis
│ │ │ │ -
185// RaviartThomasNode
│ │ │ │ -
186//
│ │ │ │ -
187// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ -
188// state. These components do _not_ depend on the global basis and local view
│ │ │ │ -
189// and can be used without a global basis.
│ │ │ │ -
190// *****************************************************************************
│ │ │ │ -
191
│ │ │ │ -
192template<typename GV, int k>
│ │ │ │ -
193class RaviartThomasNode;
│ │ │ │ -
194
│ │ │ │ -
195template<typename GV, int k>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
197 public LeafPreBasisMixin< RaviartThomasPreBasis<GV,k> >
│ │ │ │ -
198{
│ │ │ │ -
199 static const int dim = GV::dimension;
│ │ │ │ -
200 using FiniteElementMap = typename Impl::RaviartThomasLocalFiniteElementMap<GV, dim, double, k>;
│ │ │ │ -
201
│ │ │ │ -
202public:
│ │ │ │ -
203
│ │ │ │ -
205 using GridView = GV;
│ │ │ │ -
206 using size_type = std::size_t;
│ │ │ │ -
207
│ │ │ │ - │ │ │ │ -
209
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
212 gridView_(gv),
│ │ │ │ - │ │ │ │ -
214 {
│ │ │ │ -
215 // Currently there are some unresolved bugs with hybrid grids and higher order Raviart-Thomas elements
│ │ │ │ -
216 if (gv.indexSet().types(0).size() > 1 and k>0)
│ │ │ │ -
217 DUNE_THROW(Dune::NotImplemented, "Raviart-Thomas basis with index k>0 is only implemented for grids with a single element type");
│ │ │ │ -
218
│ │ │ │ -
219 for(auto type : gv.indexSet().types(0))
│ │ │ │ -
220 if (!type.isSimplex() && !type.isCube())
│ │ │ │ -
221 DUNE_THROW(Dune::NotImplemented, "Raviart-Thomas elements are only implemented for grids with simplex or cube elements.");
│ │ │ │ -
222
│ │ │ │ -
223 GeometryType type = gv.template begin<0>()->type();
│ │ │ │ -
224 const static int dofsPerElement = type.isCube() ? ((dim == 2) ? k*(k+1)*dim : k*(k+1)*(k+1)*dim) : k*dim;
│ │ │ │ -
225 const static int dofsPerFace = type.isCube() ? (dim-2)*2*k+k+1 : (dim-1)*k+1 ;
│ │ │ │ -
226
│ │ │ │ -
227 dofsPerCodim_ = {{dofsPerElement, dofsPerFace}};
│ │ │ │ -
228 }
│ │ │ │ -
│ │ │ │ -
229
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
231 {
│ │ │ │ -
232 codimOffset_[0] = 0;
│ │ │ │ -
233 codimOffset_[1] = codimOffset_[0] + dofsPerCodim_[0] * gridView_.size(0);
│ │ │ │ -
234 }
│ │ │ │ -
│ │ │ │ -
235
│ │ │ │ -
│ │ │ │ -
238 const GridView& gridView() const
│ │ │ │ -
239 {
│ │ │ │ -
240 return gridView_;
│ │ │ │ -
241 }
│ │ │ │ -
│ │ │ │ -
242
│ │ │ │ -
243 /* \brief Update the stored grid view, to be called if the grid has changed */
│ │ │ │ -
│ │ │ │ -
244 void update (const GridView& gv)
│ │ │ │ -
245 {
│ │ │ │ -
246 gridView_ = gv;
│ │ │ │ -
247 }
│ │ │ │ -
│ │ │ │ -
248
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
253 {
│ │ │ │ -
254 return Node{&finiteElementMap_};
│ │ │ │ -
255 }
│ │ │ │ -
│ │ │ │ -
256
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
258 {
│ │ │ │ -
259 return dofsPerCodim_[0] * gridView_.size(0) + dofsPerCodim_[1] * gridView_.size(1);
│ │ │ │ -
260 }
│ │ │ │ -
│ │ │ │ -
261
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
263 {
│ │ │ │ -
264 size_type result = 0;
│ │ │ │ -
265 for (auto&& type : gridView_.indexSet().types(0))
│ │ │ │ -
266 {
│ │ │ │ -
267 size_t numFaces = ReferenceElements<double,dim>::general(type).size(1);
│ │ │ │ -
268 const static int dofsPerElement = type.isCube() ? ((dim == 2) ? k*(k+1)*dim : k*(k+1)*(k+1)*dim) : k*dim;
│ │ │ │ -
269 const static int dofsPerFace = type.isCube() ? (dim-2)*2*k+k+1 : (dim-1)*k+1 ;
│ │ │ │ -
270 result = std::max(result, dofsPerElement + dofsPerFace * numFaces);
│ │ │ │ -
271 }
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
129 {
│ │ │ │ +
130 Hybrid::forEach(ChildIndices(), [&](auto i) {
│ │ │ │ +
131 this->subPreBasis(i).initializeIndices();
│ │ │ │ +
132 });
│ │ │ │ +
133 }
│ │ │ │ +
│ │ │ │ +
134
│ │ │ │ +
│ │ │ │ +
136 const GridView& gridView() const
│ │ │ │ +
137 {
│ │ │ │ +
138 return std::get<0>(subPreBases_).gridView();
│ │ │ │ +
139 }
│ │ │ │ +
│ │ │ │ +
140
│ │ │ │ +
│ │ │ │ +
142 void update(const GridView& gv)
│ │ │ │ +
143 {
│ │ │ │ +
144 Hybrid::forEach(ChildIndices(), [&](auto i) {
│ │ │ │ +
145 this->subPreBasis(i).update(gv);
│ │ │ │ +
146 });
│ │ │ │ +
147 }
│ │ │ │ +
│ │ │ │ +
148
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
153 {
│ │ │ │ +
154 auto node = Node{};
│ │ │ │ +
155 Hybrid::forEach(ChildIndices(), [&](auto i) {
│ │ │ │ +
156 node.setChild(this->subPreBasis(i).makeNode(), i);
│ │ │ │ +
157 });
│ │ │ │ +
158 return node;
│ │ │ │ +
159 }
│ │ │ │ +
│ │ │ │ +
160
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
163 {
│ │ │ │ +
164 return size(Dune::ReservedVector<size_type, multiIndexBufferSize>{});
│ │ │ │ +
165 }
│ │ │ │ +
│ │ │ │ +
166
│ │ │ │ +
168 template<class SizePrefix>
│ │ │ │ +
│ │ │ │ +
169 size_type size(const SizePrefix& prefix) const
│ │ │ │ +
170 {
│ │ │ │ +
171 return size(prefix, IndexMergingStrategy{});
│ │ │ │ +
172 }
│ │ │ │ +
│ │ │ │ +
173
│ │ │ │ +
174private:
│ │ │ │ +
175
│ │ │ │ +
176 template<class MultiIndex>
│ │ │ │ +
177 static void multiIndexPopFront(MultiIndex& M)
│ │ │ │ +
178 {
│ │ │ │ +
179 for(std::size_t i=0; i<M.size()-1; ++i)
│ │ │ │ +
180 M[i] = M[i+1];
│ │ │ │ +
181 M.resize(M.size()-1);
│ │ │ │ +
182 }
│ │ │ │ +
183
│ │ │ │ +
184 template<class SizePrefix>
│ │ │ │ +
185 size_type size(SizePrefix prefix, BasisFactory::BlockedLexicographic) const
│ │ │ │ +
186 {
│ │ │ │ +
187 if (prefix.size() == 0)
│ │ │ │ +
188 return children;
│ │ │ │ +
189
│ │ │ │ +
190 auto front = prefix.front();
│ │ │ │ +
191 multiIndexPopFront(prefix);
│ │ │ │ +
192 return Hybrid::switchCases(ChildIndices(), front, [&] (auto i) {
│ │ │ │ +
193 return this->subPreBasis(i).size(prefix);
│ │ │ │ +
194 }, []() {
│ │ │ │ +
195 return size_type(0);
│ │ │ │ +
196 });
│ │ │ │ +
197 }
│ │ │ │ +
198
│ │ │ │ +
199 template<class SizePrefix>
│ │ │ │ +
200 size_type size(SizePrefix prefix, BasisFactory::FlatLexicographic) const
│ │ │ │ +
201 {
│ │ │ │ +
202 size_type result = 0;
│ │ │ │ +
203 if (prefix.size() == 0)
│ │ │ │ +
204 Hybrid::forEach(ChildIndices(), [&](auto i) {
│ │ │ │ +
205 result += this->subPreBasis(i).size();
│ │ │ │ +
206 });
│ │ │ │ +
207 else {
│ │ │ │ +
208 staticFindInRange<0, children>([&](auto i) {
│ │ │ │ +
209 auto firstDigitSize = this->subPreBasis(i).size();
│ │ │ │ +
210 if (prefix[0] < firstDigitSize)
│ │ │ │ +
211 {
│ │ │ │ +
212 result = this->subPreBasis(i).size(prefix);
│ │ │ │ +
213 return true;
│ │ │ │ +
214 }
│ │ │ │ +
215 prefix[0] -= firstDigitSize;
│ │ │ │ +
216 return false;
│ │ │ │ +
217 });
│ │ │ │ +
218 }
│ │ │ │ +
219 return result;
│ │ │ │ +
220 }
│ │ │ │ +
221
│ │ │ │ +
222public:
│ │ │ │ +
223
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
226 {
│ │ │ │ +
227 size_type r=0;
│ │ │ │ +
228 // Accumulate dimension() for all subprebases
│ │ │ │ +
229 Hybrid::forEach(ChildIndices(), [&](auto i) {
│ │ │ │ +
230 r += this->subPreBasis(i).dimension();
│ │ │ │ +
231 });
│ │ │ │ +
232 return r;
│ │ │ │ +
233 }
│ │ │ │ +
│ │ │ │ +
234
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
237 {
│ │ │ │ +
238 size_type r=0;
│ │ │ │ +
239 // Accumulate maxNodeSize() for all subprebases
│ │ │ │ +
240 Hybrid::forEach(ChildIndices(), [&](auto i) {
│ │ │ │ +
241 r += this->subPreBasis(i).maxNodeSize();
│ │ │ │ +
242 });
│ │ │ │ +
243 return r;
│ │ │ │ +
244 }
│ │ │ │ +
│ │ │ │ +
245
│ │ │ │ +
247 template<std::size_t i>
│ │ │ │ +
│ │ │ │ +
248 const SubPreBasis<i>& subPreBasis(Dune::index_constant<i> = {}) const
│ │ │ │ +
249 {
│ │ │ │ +
250 return std::get<i>(subPreBases_);
│ │ │ │ +
251 }
│ │ │ │ +
│ │ │ │ +
252
│ │ │ │ +
254 template<std::size_t i>
│ │ │ │ +
│ │ │ │ +
255 SubPreBasis<i>& subPreBasis(Dune::index_constant<i> = {})
│ │ │ │ +
256 {
│ │ │ │ +
257 return std::get<i>(subPreBases_);
│ │ │ │ +
258 }
│ │ │ │ +
│ │ │ │ +
259
│ │ │ │ +
│ │ │ │ +
261 const auto& subPreBases() const
│ │ │ │ +
262 {
│ │ │ │ +
263 return subPreBases_;
│ │ │ │ +
264 }
│ │ │ │ +
│ │ │ │ +
265
│ │ │ │ +
267 template<typename It>
│ │ │ │ +
│ │ │ │ +
268 It indices(const Node& node, It it) const
│ │ │ │ +
269 {
│ │ │ │ +
270 return indices(node, it, IndexMergingStrategy{});
│ │ │ │ +
271 }
│ │ │ │ +
│ │ │ │
272
│ │ │ │ -
273 return result;
│ │ │ │ -
274 }
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
275 {
│ │ │ │ + │ │ │ │ +
277 if constexpr(std::is_same_v<IMS, BasisFactory::BlockedLexicographic>) {
│ │ │ │ +
278 return std::apply([&](auto const&... spb) {
│ │ │ │ +
279 return CD::makeDescriptor(Dune::Functions::containerDescriptor(spb)...);
│ │ │ │ +
280 }, subPreBases_);
│ │ │ │ +
281 }
│ │ │ │ +
282 else if constexpr(std::is_same_v<IMS, BasisFactory::FlatLexicographic>) {
│ │ │ │ +
283 return CD::Unknown{}; // Not yet implemented
│ │ │ │ +
284 }
│ │ │ │ +
285 else
│ │ │ │ +
286 return CD::Unknown{};
│ │ │ │ +
287 }
│ │ │ │
│ │ │ │ -
275
│ │ │ │ -
281 template<typename It>
│ │ │ │ -
│ │ │ │ -
282 It indices(const Node& node, It it) const
│ │ │ │ -
283 {
│ │ │ │ -
284 const auto& gridIndexSet = gridView().indexSet();
│ │ │ │ -
285 const auto& element = node.element();
│ │ │ │ -
286
│ │ │ │ -
287 // throw if Element is not of predefined type
│ │ │ │ -
288 if (not(element.type().isCube()) and not(element.type().isSimplex()))
│ │ │ │ -
289 DUNE_THROW(Dune::NotImplemented, "RaviartThomasBasis only implemented for cube and simplex elements.");
│ │ │ │ +
288
│ │ │ │ +
289private:
│ │ │ │
290
│ │ │ │ -
291 for(std::size_t i=0, end=node.size(); i<end; ++i, ++it)
│ │ │ │ -
292 {
│ │ │ │ -
293 Dune::LocalKey localKey = node.finiteElement().localCoefficients().localKey(i);
│ │ │ │ -
294
│ │ │ │ -
295 // The dimension of the entity that the current dof is related to
│ │ │ │ -
296 size_t subentity = localKey.subEntity();
│ │ │ │ -
297 size_t codim = localKey.codim();
│ │ │ │ -
298
│ │ │ │ -
299 if (not(codim==0 or codim==1))
│ │ │ │ -
300 DUNE_THROW(Dune::NotImplemented, "Grid contains elements not supported for the RaviartThomasBasis");
│ │ │ │ -
301
│ │ │ │ -
302 *it = { codimOffset_[codim] +
│ │ │ │ -
303 dofsPerCodim_[codim] * gridIndexSet.subIndex(element, subentity, codim) + localKey.index() };
│ │ │ │ -
304 }
│ │ │ │ -
305
│ │ │ │ -
306 return it;
│ │ │ │ -
307 }
│ │ │ │ -
│ │ │ │ -
308
│ │ │ │ -
309protected:
│ │ │ │ - │ │ │ │ -
311 std::array<size_t,dim+1> codimOffset_;
│ │ │ │ -
312 FiniteElementMap finiteElementMap_;
│ │ │ │ -
313 // Number of dofs per entity type depending on the entity's codimension and type
│ │ │ │ -
314 std::array<int,dim+1> dofsPerCodim_;
│ │ │ │ -
315};
│ │ │ │ -
│ │ │ │ -
316
│ │ │ │ -
317
│ │ │ │ -
318
│ │ │ │ -
319template<typename GV, int k>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
321 public LeafBasisNode
│ │ │ │ -
322{
│ │ │ │ -
323 static const int dim = GV::dimension;
│ │ │ │ -
324
│ │ │ │ -
325public:
│ │ │ │ -
326
│ │ │ │ -
327 using size_type = std::size_t;
│ │ │ │ -
328 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ -
329 using FiniteElementMap = typename Impl::RaviartThomasLocalFiniteElementMap<GV, dim, double, k>;
│ │ │ │ -
330 using FiniteElement = Impl::GlobalValuedLocalFiniteElement<Impl::ContravariantPiolaTransformator,
│ │ │ │ -
331 typename FiniteElementMap::FiniteElement,
│ │ │ │ -
332 Element>;
│ │ │ │ -
333
│ │ │ │ -
│ │ │ │ -
334 RaviartThomasNode(const FiniteElementMap* finiteElementMap) :
│ │ │ │ -
335 element_(nullptr),
│ │ │ │ -
336 finiteElementMap_(finiteElementMap)
│ │ │ │ -
337 { }
│ │ │ │ -
│ │ │ │ -
338
│ │ │ │ -
│ │ │ │ -
340 const Element& element() const
│ │ │ │ -
341 {
│ │ │ │ -
342 return *element_;
│ │ │ │ -
343 }
│ │ │ │ -
│ │ │ │ +
291 template<typename It>
│ │ │ │ +
292 It indices(const Node& node, It multiIndices, BasisFactory::FlatLexicographic) const
│ │ │ │ +
293 {
│ │ │ │ +
294 size_type firstComponentOffset = 0;
│ │ │ │ +
295 // Loop over all children
│ │ │ │ +
296 Hybrid::forEach(ChildIndices(), [&](auto child){
│ │ │ │ +
297 size_type subTreeSize = node.child(child).size();
│ │ │ │ +
298 // Fill indices for current child into index buffer starting from current
│ │ │ │ +
299 // buffer position and shift first index component of any index for current
│ │ │ │ +
300 // child by suitable offset to get lexicographic indices.
│ │ │ │ +
301 subPreBasis(child).indices(node.child(child), multiIndices);
│ │ │ │ +
302 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ +
303 multiIndices[i][0] += firstComponentOffset;
│ │ │ │ +
304 // Increment offset by the size for first index component of the current child
│ │ │ │ +
305 firstComponentOffset += subPreBasis(child).size();
│ │ │ │ +
306 // Increment buffer iterator by the number of indices processed for current child
│ │ │ │ +
307 multiIndices += subTreeSize;
│ │ │ │ +
308 });
│ │ │ │ +
309 return multiIndices;
│ │ │ │ +
310 }
│ │ │ │ +
311
│ │ │ │ +
312 template<class MultiIndex>
│ │ │ │ +
313 static void multiIndexPushFront(MultiIndex& M, size_type M0)
│ │ │ │ +
314 {
│ │ │ │ +
315 M.resize(M.size()+1);
│ │ │ │ +
316 for(std::size_t i=M.size()-1; i>0; --i)
│ │ │ │ +
317 M[i] = M[i-1];
│ │ │ │ +
318 M[0] = M0;
│ │ │ │ +
319 }
│ │ │ │ +
320
│ │ │ │ +
321 template<typename It>
│ │ │ │ +
322 It indices(const Node& node, It multiIndices, BasisFactory::BlockedLexicographic) const
│ │ │ │ +
323 {
│ │ │ │ +
324 // Loop over all children
│ │ │ │ +
325 Hybrid::forEach(ChildIndices(), [&](auto child){
│ │ │ │ +
326 size_type subTreeSize = node.child(child).size();
│ │ │ │ +
327 // Fill indices for current child into index buffer starting from current position
│ │ │ │ +
328 subPreBasis(child).indices(node.child(child), multiIndices);
│ │ │ │ +
329 // Insert child index before first component of all indices of current child.
│ │ │ │ +
330 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ +
331 this->multiIndexPushFront(multiIndices[i], child);
│ │ │ │ +
332 // Increment buffer iterator by the number of indices processed for current child
│ │ │ │ +
333 multiIndices += subTreeSize;
│ │ │ │ +
334 });
│ │ │ │ +
335 return multiIndices;
│ │ │ │ +
336 }
│ │ │ │ +
337
│ │ │ │ +
338 std::tuple<SPB...> subPreBases_;
│ │ │ │ +
339};
│ │ │ │ +
│ │ │ │ +
340
│ │ │ │ +
341
│ │ │ │ +
342
│ │ │ │ +
343namespace BasisFactory {
│ │ │ │
344
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
350 {
│ │ │ │ -
351 return finiteElement_;
│ │ │ │ -
352 }
│ │ │ │ -
│ │ │ │ -
353
│ │ │ │ -
│ │ │ │ -
355 void bind(const Element& e)
│ │ │ │ -
356 {
│ │ │ │ -
357 element_ = &e;
│ │ │ │ -
358 finiteElement_.bind((finiteElementMap_->find(*element_)), e);
│ │ │ │ -
359 this->setSize(finiteElement_.size());
│ │ │ │ -
360 }
│ │ │ │ -
│ │ │ │ -
361
│ │ │ │ -
362protected:
│ │ │ │ -
363
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
367};
│ │ │ │ -
│ │ │ │ -
368
│ │ │ │ -
369namespace BasisFactory {
│ │ │ │ -
370
│ │ │ │ -
378template<std::size_t k>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
380{
│ │ │ │ -
381 return [](const auto& gridView) {
│ │ │ │ -
382 return RaviartThomasPreBasis<std::decay_t<decltype(gridView)>, k>(gridView);
│ │ │ │ -
383 };
│ │ │ │ -
384}
│ │ │ │ -
│ │ │ │ -
385
│ │ │ │ -
386} // end namespace BasisFactory
│ │ │ │ -
387
│ │ │ │ -
388
│ │ │ │ -
389
│ │ │ │ -
390// *****************************************************************************
│ │ │ │ -
391// This is the actual global basis implementation based on the reusable parts.
│ │ │ │ -
392// *****************************************************************************
│ │ │ │ -
393
│ │ │ │ -
401template<typename GV, int k>
│ │ │ │ - │ │ │ │ +
345namespace Imp {
│ │ │ │ +
346
│ │ │ │ +
347template<class IndexMergingStrategy, class... ChildPreBasisFactory>
│ │ │ │ +
348class CompositePreBasisFactory
│ │ │ │ +
349{
│ │ │ │ +
350
│ │ │ │ +
351 template<class GridView, class... ChildPreBasis>
│ │ │ │ +
352 auto makePreBasisFromChildPreBases(const GridView&, ChildPreBasis&&... childPreBasis) const
│ │ │ │ +
353 {
│ │ │ │ +
354 return CompositePreBasis<IndexMergingStrategy, std::decay_t<ChildPreBasis>...>(std::forward<ChildPreBasis>(childPreBasis)...);
│ │ │ │ +
355 }
│ │ │ │ +
356
│ │ │ │ +
357public:
│ │ │ │ +
358
│ │ │ │ +
359 CompositePreBasisFactory(const ChildPreBasisFactory&... childPreBasisFactory) :
│ │ │ │ +
360 childPreBasisFactories_(childPreBasisFactory...)
│ │ │ │ +
361 {}
│ │ │ │ +
362
│ │ │ │ +
363 CompositePreBasisFactory(ChildPreBasisFactory&&... childPreBasisFactory) :
│ │ │ │ +
364 childPreBasisFactories_(std::move(childPreBasisFactory)...)
│ │ │ │ +
365 {}
│ │ │ │ +
366
│ │ │ │ +
367 template<class GridView>
│ │ │ │ +
368 auto operator()(const GridView& gridView) const
│ │ │ │ +
369 {
│ │ │ │ +
370 // Use std::apply to unpack the tuple childPreBasisFactories_
│ │ │ │ +
371 return std::apply([&](const auto&... childPreBasisFactory) {
│ │ │ │ +
372 return this->makePreBasisFromChildPreBases(gridView, childPreBasisFactory(gridView)...);
│ │ │ │ +
373 }, childPreBasisFactories_);
│ │ │ │ +
374 }
│ │ │ │ +
375
│ │ │ │ +
376private:
│ │ │ │ +
377 std::tuple<ChildPreBasisFactory...> childPreBasisFactories_;
│ │ │ │ +
378};
│ │ │ │ +
379
│ │ │ │ +
380} // end namespace BasisFactory::Imp
│ │ │ │ +
381
│ │ │ │ +
382
│ │ │ │ +
383
│ │ │ │ +
394template<
│ │ │ │ +
395 typename... Args,
│ │ │ │ +
396 std::enable_if_t<Concept::isIndexMergingStrategy<typename LastType<Args...>::type>(),int> = 0>
│ │ │ │ +
397auto composite(Args&&... args)
│ │ │ │ +
398{
│ │ │ │ +
399 // We have to separate the last entry which is the IndexMergingStrategy
│ │ │ │ +
400 // and the preceding ones, which are the ChildPreBasisFactories
│ │ │ │ +
401
│ │ │ │ +
402 using ArgTuple = std::tuple<std::decay_t<Args>...>;
│ │ │ │
403
│ │ │ │ -
404} // end namespace Functions
│ │ │ │ -
405} // end namespace Dune
│ │ │ │ +
404 // Compute number of children and index of the IndexMergingStrategy argument
│ │ │ │ +
405 constexpr std::size_t children = sizeof...(Args) - 1;
│ │ │ │
406
│ │ │ │ -
407
│ │ │ │ -
408#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
auto raviartThomas()
Create a pre-basis factory that can create a Raviart-Thomas pre-basis.
Definition raviartthomasbasis.hh:379
│ │ │ │ -
auto power(ChildPreBasisFactory &&childPreBasisFactory, std::size_t k, const IndexMergingStrategy &)
Create a pre-basis factory that can build a PowerPreBasis.
Definition dynamicpowerbasis.hh:409
│ │ │ │ +
407 // Use last type as IndexMergingStrategy
│ │ │ │ +
408 using IndexMergingStrategy = std::tuple_element_t<children, ArgTuple>;
│ │ │ │ +
409
│ │ │ │ +
410 // Index sequence for all but the last entry for partial tuple unpacking
│ │ │ │ +
411 auto childIndices = std::make_index_sequence<children>{};
│ │ │ │ +
412
│ │ │ │ +
413 // Unpack tuple only for those entries related to children
│ │ │ │ +
414 return applyPartial([](auto&&... childPreBasisFactory){
│ │ │ │ +
415 return Imp::CompositePreBasisFactory<IndexMergingStrategy, std::decay_t<decltype(childPreBasisFactory)>...>(std::forward<decltype(childPreBasisFactory)>(childPreBasisFactory)...);
│ │ │ │ +
416 },
│ │ │ │ +
417 std::forward_as_tuple(std::forward<Args>(args)...),
│ │ │ │ +
418 childIndices);
│ │ │ │ +
419}
│ │ │ │ +
420
│ │ │ │ +
432template<
│ │ │ │ +
433 typename... Args,
│ │ │ │ +
434 std::enable_if_t<not Concept::isIndexMergingStrategy<typename LastType<Args...>::type>(),int> = 0>
│ │ │ │ +
435auto composite(Args&&... args)
│ │ │ │ +
436{
│ │ │ │ +
437 return Imp::CompositePreBasisFactory<BasisFactory::BlockedLexicographic, std::decay_t<Args>...>(std::forward<Args>(args)...);
│ │ │ │ +
438}
│ │ │ │ +
439
│ │ │ │ +
440} // end namespace BasisFactory
│ │ │ │ +
441
│ │ │ │ +
442// Backward compatibility
│ │ │ │ +
443namespace [[deprecated("Will be removed after Dune 2.10")]] BasisBuilder {
│ │ │ │ +
444
│ │ │ │ +
445 using namespace BasisFactory;
│ │ │ │ +
446
│ │ │ │ +
447}
│ │ │ │ +
448
│ │ │ │ +
449
│ │ │ │ +
450
│ │ │ │ +
451} // end namespace Functions
│ │ │ │ +
452} // end namespace Dune
│ │ │ │ +
453
│ │ │ │ +
454
│ │ │ │ +
455#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_COMPOSITEBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
std::enable_if_t< std::is_constructible_v< T, Args... >, int > enableIfConstructible
Helper to constrain forwarding constructors.
Definition type_traits.hh:31
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
Global basis for given pre-basis.
Definition defaultglobalbasis.hh:50
│ │ │ │ -
A generic MixIn class for PreBasis.
Definition leafprebasismixin.hh:36
│ │ │ │ -
size_type size() const
Definition nodes.hh:147
│ │ │ │ -
void setSize(const size_type size)
Definition nodes.hh:169
│ │ │ │ -
Definition nodes.hh:191
│ │ │ │ -
Definition raviartthomasbasis.hh:322
│ │ │ │ -
typename Impl::RaviartThomasLocalFiniteElementMap< GV, dim, double, k > FiniteElementMap
Definition raviartthomasbasis.hh:329
│ │ │ │ -
void bind(const Element &e)
Bind to element.
Definition raviartthomasbasis.hh:355
│ │ │ │ -
Impl::GlobalValuedLocalFiniteElement< Impl::ContravariantPiolaTransformator, typename FiniteElementMap::FiniteElement, Element > FiniteElement
Definition raviartthomasbasis.hh:332
│ │ │ │ -
typename GV::template Codim< 0 >::Entity Element
Definition raviartthomasbasis.hh:328
│ │ │ │ -
const Element * element_
Definition raviartthomasbasis.hh:365
│ │ │ │ -
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition raviartthomasbasis.hh:349
│ │ │ │ -
std::size_t size_type
Definition raviartthomasbasis.hh:327
│ │ │ │ -
RaviartThomasNode(const FiniteElementMap *finiteElementMap)
Definition raviartthomasbasis.hh:334
│ │ │ │ -
const Element & element() const
Return current element, throw if unbound.
Definition raviartthomasbasis.hh:340
│ │ │ │ -
FiniteElement finiteElement_
Definition raviartthomasbasis.hh:364
│ │ │ │ -
const FiniteElementMap * finiteElementMap_
Definition raviartthomasbasis.hh:366
│ │ │ │ -
Definition raviartthomasbasis.hh:198
│ │ │ │ -
Node makeNode() const
Create tree node.
Definition raviartthomasbasis.hh:252
│ │ │ │ -
std::array< int, dim+1 > dofsPerCodim_
Definition raviartthomasbasis.hh:314
│ │ │ │ -
void update(const GridView &gv)
Definition raviartthomasbasis.hh:244
│ │ │ │ -
RaviartThomasPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition raviartthomasbasis.hh:211
│ │ │ │ -
std::size_t size_type
Definition raviartthomasbasis.hh:206
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition raviartthomasbasis.hh:238
│ │ │ │ -
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:282
│ │ │ │ -
FiniteElementMap finiteElementMap_
Definition raviartthomasbasis.hh:312
│ │ │ │ -
size_type dimension() const
Definition raviartthomasbasis.hh:257
│ │ │ │ -
GV GridView
The grid view that the FE space is defined on.
Definition raviartthomasbasis.hh:205
│ │ │ │ -
size_type maxNodeSize() const
Definition raviartthomasbasis.hh:262
│ │ │ │ -
GridView gridView_
Definition raviartthomasbasis.hh:310
│ │ │ │ -
void initializeIndices()
Definition raviartthomasbasis.hh:230
│ │ │ │ -
std::array< size_t, dim+1 > codimOffset_
Definition raviartthomasbasis.hh:311
│ │ │ │ +
auto containerDescriptor(const PreBasis &preBasis)
Return the container descriptor of the pre-basis, if defined, otherwise ContainerDescriptor::Unknown.
Definition containerdescriptors.hh:73
│ │ │ │ +
static constexpr bool isIndexMergingStrategy()
Definition basistags.hh:27
│ │ │ │ +
Definition containerdescriptors.hh:47
│ │ │ │ +
Lexicographic merging of direct children without blocking.
Definition basistags.hh:84
│ │ │ │ +
A pre-basis for composite bases.
Definition compositebasis.hh:57
│ │ │ │ +
SubPreBasis< i > & subPreBasis(Dune::index_constant< i >={})
Mutable access to the stored prebasis of the factor in the power space.
Definition compositebasis.hh:255
│ │ │ │ +
IMS IndexMergingStrategy
Strategy used to merge the global indices of the child pre-bases.
Definition compositebasis.hh:75
│ │ │ │ +
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition compositebasis.hh:236
│ │ │ │ +
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:248
│ │ │ │ +
std::size_t size_type
Type used for indices and size information.
Definition compositebasis.hh:72
│ │ │ │ +
CompositeBasisNode< typename SPB::Node... > Node
Template mapping root tree path to type of created tree node.
Definition compositebasis.hh:85
│ │ │ │ +
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition compositebasis.hh:169
│ │ │ │ +
CompositePreBasis(SFArgs &&... sfArgs)
Constructor for given child pre-basis objects.
Definition compositebasis.hh:99
│ │ │ │ +
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition compositebasis.hh:225
│ │ │ │ +
CompositePreBasis(const GV &gv)
Constructor for given GridView.
Definition compositebasis.hh:119
│ │ │ │ +
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:268
│ │ │ │ +
size_type size() const
Same as size(prefix) with empty prefix.
Definition compositebasis.hh:162
│ │ │ │ +
typename std::tuple_element_t< 0, SubPreBases >::GridView GridView
The grid view that the FE basis is defined on.
Definition compositebasis.hh:69
│ │ │ │ +
static const std::size_t children
Definition compositebasis.hh:78
│ │ │ │ +
std::tuple< SPB... > SubPreBases
Tuple of child pre-bases.
Definition compositebasis.hh:62
│ │ │ │ +
Node makeNode() const
Create tree node.
Definition compositebasis.hh:152
│ │ │ │ +
void initializeIndices()
Initialize the global indices.
Definition compositebasis.hh:128
│ │ │ │ +
std::tuple_element_t< i, SubPreBases > SubPreBasis
Export individual child pre-bases by index.
Definition compositebasis.hh:66
│ │ │ │ +
std::make_index_sequence< children > ChildIndices
Definition compositebasis.hh:80
│ │ │ │ +
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition compositebasis.hh:142
│ │ │ │ +
static constexpr size_type multiIndexBufferSize
Definition compositebasis.hh:89
│ │ │ │ +
const auto & subPreBases() const
Const access to the stored prebases tuple.
Definition compositebasis.hh:261
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition compositebasis.hh:136
│ │ │ │ +
static constexpr size_type minMultiIndexSize
Definition compositebasis.hh:88
│ │ │ │ +
auto containerDescriptor() const
Return the associated container descriptor.
Definition compositebasis.hh:274
│ │ │ │ +
static constexpr size_type maxMultiIndexSize
Definition compositebasis.hh:87
│ │ │ │ + │ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,545 +1,566 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -raviartthomasbasis.hh │ │ │ │ │ +compositebasis.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_COMPOSITEBASIS_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_COMPOSITEBASIS_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ 12 │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15 │ │ │ │ │ -16#include │ │ │ │ │ -17#include │ │ │ │ │ -18#include │ │ │ │ │ -19#include │ │ │ │ │ -20#include │ │ │ │ │ -21#include │ │ │ │ │ -22#include │ │ │ │ │ -23#include │ │ │ │ │ -24#include │ │ │ │ │ -25#include │ │ │ │ │ -26 │ │ │ │ │ -27#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/ │ │ │ │ │ -_g_l_o_b_a_l_v_a_l_u_e_d_l_o_c_a_l_f_i_n_i_t_e_e_l_e_m_e_n_t_._h_h> │ │ │ │ │ -28#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ -29#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ -30#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ -31 │ │ │ │ │ -32namespace _D_u_n_e { │ │ │ │ │ -33namespace Functions { │ │ │ │ │ -34 │ │ │ │ │ -35namespace Impl { │ │ │ │ │ -36 │ │ │ │ │ -37 template │ │ │ │ │ -38 struct RaviartThomasSimplexLocalInfo │ │ │ │ │ -39 { │ │ │ │ │ -40 // Dummy type, must be something that we can have a std::unique_ptr to │ │ │ │ │ -41 using FiniteElement = void*; │ │ │ │ │ -42 }; │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17#include │ │ │ │ │ +18#include │ │ │ │ │ +19 │ │ │ │ │ +20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_s_t_a_t_i_c_f_o_r_l_o_o_p_._h_h> │ │ │ │ │ +21#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ +22#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_u_t_i_l_i_t_y_._h_h> │ │ │ │ │ +23#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_b_a_s_i_s_t_a_g_s_._h_h> │ │ │ │ │ +24#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ +25#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +26#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h> │ │ │ │ │ +27#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ +28 │ │ │ │ │ +29 │ │ │ │ │ +30namespace _D_u_n_e { │ │ │ │ │ +31namespace Functions { │ │ │ │ │ +32 │ │ │ │ │ +33/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ +34// This is the reusable part of the composite bases. It contains │ │ │ │ │ +35// │ │ │ │ │ +36// CompositePreBasis │ │ │ │ │ +37// │ │ │ │ │ +38// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ +shared │ │ │ │ │ +39// state. These components do _not_ depend on the global basis and local view │ │ │ │ │ +40// and can be used without a global basis. │ │ │ │ │ +41/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ +42 │ │ │ │ │ 43 │ │ │ │ │ -44 template │ │ │ │ │ -45 struct RaviartThomasSimplexLocalInfo<2,D,R,0> │ │ │ │ │ -46 { │ │ │ │ │ -47 using FiniteElement = RT02DLocalFiniteElement; │ │ │ │ │ -48 }; │ │ │ │ │ -49 │ │ │ │ │ -50 template │ │ │ │ │ -51 struct RaviartThomasSimplexLocalInfo<2,D,R,1> │ │ │ │ │ -52 { │ │ │ │ │ -53 using FiniteElement = RT12DLocalFiniteElement; │ │ │ │ │ -54 }; │ │ │ │ │ -55 │ │ │ │ │ -56 template │ │ │ │ │ -57 struct RaviartThomasSimplexLocalInfo<3,D,R,0> │ │ │ │ │ -58 { │ │ │ │ │ -59 using FiniteElement = RT03DLocalFiniteElement; │ │ │ │ │ -60 }; │ │ │ │ │ -61 │ │ │ │ │ -62 template │ │ │ │ │ -63 struct RaviartThomasCubeLocalInfo │ │ │ │ │ -64 { │ │ │ │ │ -65 // Dummy type, must be something that we can have a std::unique_ptr to │ │ │ │ │ -66 using FiniteElement = void*; │ │ │ │ │ -67 }; │ │ │ │ │ -68 │ │ │ │ │ -69 template │ │ │ │ │ -70 struct RaviartThomasCubeLocalInfo<2,D,R,0> │ │ │ │ │ -71 { │ │ │ │ │ -72 using FiniteElement = RT0Cube2DLocalFiniteElement; │ │ │ │ │ -73 }; │ │ │ │ │ -74 │ │ │ │ │ -75 template │ │ │ │ │ -76 struct RaviartThomasCubeLocalInfo<2,D,R,1> │ │ │ │ │ -77 { │ │ │ │ │ -78 using FiniteElement = RT1Cube2DLocalFiniteElement; │ │ │ │ │ -79 }; │ │ │ │ │ -80 │ │ │ │ │ -81 template │ │ │ │ │ -82 struct RaviartThomasCubeLocalInfo<2,D,R,2> │ │ │ │ │ -83 { │ │ │ │ │ -84 using FiniteElement = RT2Cube2DLocalFiniteElement; │ │ │ │ │ -85 }; │ │ │ │ │ +55template │ │ │ │ │ +_5_6class _C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s │ │ │ │ │ +57{ │ │ │ │ │ +58 static const bool isBlocked = std::is_same_v or std::is_same_v; │ │ │ │ │ +59public: │ │ │ │ │ +60 │ │ │ │ │ +_6_2 using _S_u_b_P_r_e_B_a_s_e_s = std::tuple; │ │ │ │ │ +63 │ │ │ │ │ +65 template │ │ │ │ │ +_6_6 using _S_u_b_P_r_e_B_a_s_i_s = std::tuple_element_t; │ │ │ │ │ +67 │ │ │ │ │ +_6_9 using _G_r_i_d_V_i_e_w = typename std::tuple_element_t<0, SubPreBases>::GridView; │ │ │ │ │ +70 │ │ │ │ │ +_7_2 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ +73 │ │ │ │ │ +_7_5 using _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y = IMS; │ │ │ │ │ +76 │ │ │ │ │ +77protected: │ │ │ │ │ +_7_8 static const std::size_t _c_h_i_l_d_r_e_n = sizeof...(SPB); │ │ │ │ │ +79 │ │ │ │ │ +_8_0 using _C_h_i_l_d_I_n_d_i_c_e_s = std::make_index_sequence; │ │ │ │ │ +81 │ │ │ │ │ +82public: │ │ │ │ │ +83 │ │ │ │ │ +_8_5 using _N_o_d_e = _C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e; │ │ │ │ │ 86 │ │ │ │ │ -87 template │ │ │ │ │ -88 struct RaviartThomasCubeLocalInfo<3,D,R,0> │ │ │ │ │ -89 { │ │ │ │ │ -90 using FiniteElement = RT0Cube3DLocalFiniteElement; │ │ │ │ │ -91 }; │ │ │ │ │ -92 │ │ │ │ │ -93 template │ │ │ │ │ -94 struct RaviartThomasCubeLocalInfo<3,D,R,1> │ │ │ │ │ -95 { │ │ │ │ │ -96 using FiniteElement = RT1Cube3DLocalFiniteElement; │ │ │ │ │ -97 }; │ │ │ │ │ -98 │ │ │ │ │ -99 template │ │ │ │ │ -100 class RaviartThomasLocalFiniteElementMap │ │ │ │ │ +_8_7 static constexpr _s_i_z_e___t_y_p_e _m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e = std::max({SPB:: │ │ │ │ │ +maxMultiIndexSize...}) + isBlocked; │ │ │ │ │ +_8_8 static constexpr _s_i_z_e___t_y_p_e _m_i_n_M_u_l_t_i_I_n_d_e_x_S_i_z_e = std::min({SPB:: │ │ │ │ │ +minMultiIndexSize...}) + isBlocked; │ │ │ │ │ +_8_9 static constexpr _s_i_z_e___t_y_p_e _m_u_l_t_i_I_n_d_e_x_B_u_f_f_e_r_S_i_z_e = std::max({SPB:: │ │ │ │ │ +multiIndexBufferSize...}) + isBlocked; │ │ │ │ │ +90 │ │ │ │ │ +96 template = 0, │ │ │ │ │ +98 _e_n_a_b_l_e_I_f_C_o_n_s_t_r_u_c_t_i_b_l_e, SFArgs...> = 0> │ │ │ │ │ +_9_9 _C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s(SFArgs&&... sfArgs) : │ │ │ │ │ +100 subPreBases_(std::forward(sfArgs)...) │ │ │ │ │ 101 { │ │ │ │ │ -102 using D = typename GV::ctype; │ │ │ │ │ -103 constexpr static bool hasFixedElementType = Capabilities:: │ │ │ │ │ -hasSingleGeometryType::v; │ │ │ │ │ -104 │ │ │ │ │ -105 using CubeFiniteElement = typename RaviartThomasCubeLocalInfo::FiniteElement; │ │ │ │ │ -106 using SimplexFiniteElement = typename RaviartThomasSimplexLocalInfo::FiniteElement; │ │ │ │ │ -107 │ │ │ │ │ -108 public: │ │ │ │ │ -109 │ │ │ │ │ -110 using T = LocalBasisTraits, R, dim, │ │ │ │ │ -FieldVector, FieldMatrix >; │ │ │ │ │ -111 │ │ │ │ │ -112 constexpr static unsigned int topologyId = Capabilities:: │ │ │ │ │ -hasSingleGeometryType::topologyId; // meaningless if │ │ │ │ │ -hasFixedElementType is false │ │ │ │ │ -113 constexpr static GeometryType type = GeometryType(topologyId, GV:: │ │ │ │ │ -dimension); │ │ │ │ │ -114 │ │ │ │ │ -115 using FiniteElement = std::conditional_t, │ │ │ │ │ -117 LocalFiniteElementVariant >; │ │ │ │ │ -118 │ │ │ │ │ -119 // Each element facet can have its orientation reversed, hence there are │ │ │ │ │ -120 // 2^#facets different variants. │ │ │ │ │ -121 static std::size_t numVariants(GeometryType type) │ │ │ │ │ -122 { │ │ │ │ │ -123 auto numFacets = referenceElement(type).size(1); │ │ │ │ │ -124 return _p_o_w_e_r(2,numFacets); │ │ │ │ │ +102 Hybrid::forEach(subPreBases_, [&](const auto& _s_u_b_P_r_e_B_a_s_i_s){ │ │ │ │ │ +103 static_assert(models, std::decay_t>(), "Subprebases passed to CompositePreBasis does not model the │ │ │ │ │ +PreBasis concept."); │ │ │ │ │ +104 }); │ │ │ │ │ +105 } │ │ │ │ │ +106 │ │ │ │ │ +113 template 1)>, // Avoid ambiguous constructor if │ │ │ │ │ +there's only one child │ │ │ │ │ +116 std::is_same, │ │ │ │ │ +117 std::is_constructible... │ │ │ │ │ +118 >, int> = 0> │ │ │ │ │ +_1_1_9 _C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s(const GV& gv) : │ │ │ │ │ +120 subPreBases_(SPB(gv)...) │ │ │ │ │ +121 { │ │ │ │ │ +122 Hybrid::forEach(subPreBases_, [&](const auto& _s_u_b_P_r_e_B_a_s_i_s){ │ │ │ │ │ +123 static_assert(models, std::decay_t>(), "Subprebases passed to CompositePreBasis does not model the │ │ │ │ │ +PreBasis concept."); │ │ │ │ │ +124 }); │ │ │ │ │ 125 } │ │ │ │ │ 126 │ │ │ │ │ -127 RaviartThomasLocalFiniteElementMap(const GV& gv) │ │ │ │ │ -128 : elementMapper_(gv, mcmgElementLayout()), │ │ │ │ │ -129 orient_(gv.size(0)) │ │ │ │ │ -130 { │ │ │ │ │ -131 if constexpr (hasFixedElementType) │ │ │ │ │ -132 { │ │ │ │ │ -133 variants_.resize(numVariants(type)); │ │ │ │ │ -134 for (size_t i = 0; i < numVariants(type); i++) │ │ │ │ │ -135 variants_[i] = FiniteElement(i); │ │ │ │ │ -136 } │ │ │ │ │ -137 else │ │ │ │ │ -138 { │ │ │ │ │ -139 // for mixed grids add offset for cubes │ │ │ │ │ -140 variants_.resize(numVariants(GeometryTypes::simplex(dim)) + numVariants │ │ │ │ │ -(GeometryTypes::cube(dim))); │ │ │ │ │ -141 for (size_t i = 0; i < numVariants(GeometryTypes::simplex(dim)); i++) │ │ │ │ │ -142 variants_[i] = SimplexFiniteElement(i); │ │ │ │ │ -143 for (size_t i = 0; i < numVariants(GeometryTypes::cube(dim)); i++) │ │ │ │ │ -144 variants_[i + numVariants(GeometryTypes::simplex(dim))] = CubeFiniteElement │ │ │ │ │ -(i); │ │ │ │ │ -145 } │ │ │ │ │ -146 │ │ │ │ │ -147 for(const auto& cell : elements(gv)) │ │ │ │ │ -148 { │ │ │ │ │ -149 unsigned int myId = elementMapper_.index(cell); │ │ │ │ │ -150 orient_[myId] = 0; │ │ │ │ │ -151 │ │ │ │ │ -152 for (const auto& intersection : intersections(gv,cell)) │ │ │ │ │ +_1_2_8 void _i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s() │ │ │ │ │ +129 { │ │ │ │ │ +130 Hybrid::forEach(_C_h_i_l_d_I_n_d_i_c_e_s(), [&](auto i) { │ │ │ │ │ +131 this->_s_u_b_P_r_e_B_a_s_i_s(i).initializeIndices(); │ │ │ │ │ +132 }); │ │ │ │ │ +133 } │ │ │ │ │ +134 │ │ │ │ │ +_1_3_6 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ +137 { │ │ │ │ │ +138 return std::get<0>(subPreBases_).gridView(); │ │ │ │ │ +139 } │ │ │ │ │ +140 │ │ │ │ │ +_1_4_2 void _u_p_d_a_t_e(const _G_r_i_d_V_i_e_w& gv) │ │ │ │ │ +143 { │ │ │ │ │ +144 Hybrid::forEach(_C_h_i_l_d_I_n_d_i_c_e_s(), [&](auto i) { │ │ │ │ │ +145 this->_s_u_b_P_r_e_B_a_s_i_s(i).update(gv); │ │ │ │ │ +146 }); │ │ │ │ │ +147 } │ │ │ │ │ +148 │ │ │ │ │ +_1_5_2 _N_o_d_e _m_a_k_e_N_o_d_e() const │ │ │ │ │ 153 { │ │ │ │ │ -154 if (intersection.neighbor() && (elementMapper_.index(intersection.outside │ │ │ │ │ -()) > myId)) │ │ │ │ │ -155 orient_[myId] |= (1 << intersection.indexInInside()); │ │ │ │ │ -156 } │ │ │ │ │ -157 │ │ │ │ │ -158 // for mixed grids add offset for cubes │ │ │ │ │ -159 if constexpr (!hasFixedElementType) │ │ │ │ │ -160 if (cell.type().isCube()) │ │ │ │ │ -161 orient_[myId] += numVariants(GeometryTypes::simplex(dim)); │ │ │ │ │ -162 } │ │ │ │ │ -163 } │ │ │ │ │ -164 │ │ │ │ │ -165 template │ │ │ │ │ -166 const FiniteElement& find(const EntityType& e) const │ │ │ │ │ -167 { │ │ │ │ │ -168 return variants_[orient_[elementMapper_.index(e)]]; │ │ │ │ │ -169 } │ │ │ │ │ -170 │ │ │ │ │ -171 private: │ │ │ │ │ -172 std::vector variants_; │ │ │ │ │ -173 Dune::MultipleCodimMultipleGeomTypeMapper elementMapper_; │ │ │ │ │ -174 std::vector orient_; │ │ │ │ │ -175 }; │ │ │ │ │ -176 │ │ │ │ │ -177 │ │ │ │ │ -178} // namespace Impl │ │ │ │ │ -179 │ │ │ │ │ -180 │ │ │ │ │ -181/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ -182// This is the reusable part of the basis. It contains │ │ │ │ │ -183// │ │ │ │ │ -184// RaviartThomasPreBasis │ │ │ │ │ -185// RaviartThomasNode │ │ │ │ │ -186// │ │ │ │ │ -187// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ -shared │ │ │ │ │ -188// state. These components do _not_ depend on the global basis and local │ │ │ │ │ -view │ │ │ │ │ -189// and can be used without a global basis. │ │ │ │ │ -190/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ -191 │ │ │ │ │ -192template │ │ │ │ │ -193class RaviartThomasNode; │ │ │ │ │ -194 │ │ │ │ │ -195template │ │ │ │ │ -_1_9_6class _R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s : │ │ │ │ │ -197 public _L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n< RaviartThomasPreBasis > │ │ │ │ │ -198{ │ │ │ │ │ -199 static const int dim = GV::dimension; │ │ │ │ │ -200 using FiniteElementMap = typename Impl:: │ │ │ │ │ -RaviartThomasLocalFiniteElementMap; │ │ │ │ │ -201 │ │ │ │ │ -202public: │ │ │ │ │ -203 │ │ │ │ │ -_2_0_5 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ -_2_0_6 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ -207 │ │ │ │ │ -_2_0_8 using _N_o_d_e = _R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_<_G_V_,_ _k_>; │ │ │ │ │ -209 │ │ │ │ │ -_2_1_1 _R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s(const _G_r_i_d_V_i_e_w& gv) : │ │ │ │ │ -212 _g_r_i_d_V_i_e_w__(gv), │ │ │ │ │ -213 _f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__(gv) │ │ │ │ │ -214 { │ │ │ │ │ -215 // Currently there are some unresolved bugs with hybrid grids and higher │ │ │ │ │ -order Raviart-Thomas elements │ │ │ │ │ -216 if (gv.indexSet().types(0).size() > 1 and k>0) │ │ │ │ │ -217 DUNE_THROW(Dune::NotImplemented, "Raviart-Thomas basis with index k>0 is │ │ │ │ │ -only implemented for grids with a single element type"); │ │ │ │ │ -218 │ │ │ │ │ -219 for(auto type : gv.indexSet().types(0)) │ │ │ │ │ -220 if (!type.isSimplex() && !type.isCube()) │ │ │ │ │ -221 DUNE_THROW(Dune::NotImplemented, "Raviart-Thomas elements are only │ │ │ │ │ -implemented for grids with simplex or cube elements."); │ │ │ │ │ -222 │ │ │ │ │ -223 GeometryType type = gv.template begin<0>()->type(); │ │ │ │ │ -224 const static int dofsPerElement = type.isCube() ? ((dim == 2) ? k*(k+1)*dim │ │ │ │ │ -: k*(k+1)*(k+1)*dim) : k*dim; │ │ │ │ │ -225 const static int dofsPerFace = type.isCube() ? (dim-2)*2*k+k+1 : (dim- │ │ │ │ │ -1)*k+1 ; │ │ │ │ │ -226 │ │ │ │ │ -227 _d_o_f_s_P_e_r_C_o_d_i_m__ = {{dofsPerElement, dofsPerFace}}; │ │ │ │ │ -228 } │ │ │ │ │ -229 │ │ │ │ │ -_2_3_0 void _i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s() │ │ │ │ │ -231 { │ │ │ │ │ -232 _c_o_d_i_m_O_f_f_s_e_t__[0] = 0; │ │ │ │ │ -233 _c_o_d_i_m_O_f_f_s_e_t__[1] = _c_o_d_i_m_O_f_f_s_e_t__[0] + _d_o_f_s_P_e_r_C_o_d_i_m__[0] * _g_r_i_d_V_i_e_w__.size(0); │ │ │ │ │ -234 } │ │ │ │ │ -235 │ │ │ │ │ -_2_3_8 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ -239 { │ │ │ │ │ -240 return _g_r_i_d_V_i_e_w__; │ │ │ │ │ -241 } │ │ │ │ │ -242 │ │ │ │ │ -243 /* \brief Update the stored grid view, to be called if the grid has changed │ │ │ │ │ -*/ │ │ │ │ │ -_2_4_4 void _u_p_d_a_t_e (const _G_r_i_d_V_i_e_w& gv) │ │ │ │ │ -245 { │ │ │ │ │ -246 _g_r_i_d_V_i_e_w__ = gv; │ │ │ │ │ -247 } │ │ │ │ │ -248 │ │ │ │ │ -_2_5_2 _N_o_d_e _m_a_k_e_N_o_d_e() const │ │ │ │ │ -253 { │ │ │ │ │ -254 return _N_o_d_e{&_f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__}; │ │ │ │ │ -255 } │ │ │ │ │ -256 │ │ │ │ │ -_2_5_7 _s_i_z_e___t_y_p_e _d_i_m_e_n_s_i_o_n() const │ │ │ │ │ -258 { │ │ │ │ │ -259 return _d_o_f_s_P_e_r_C_o_d_i_m__[0] * _g_r_i_d_V_i_e_w__.size(0) + _d_o_f_s_P_e_r_C_o_d_i_m__[1] * │ │ │ │ │ -_g_r_i_d_V_i_e_w__.size(1); │ │ │ │ │ -260 } │ │ │ │ │ -261 │ │ │ │ │ -_2_6_2 _s_i_z_e___t_y_p_e _m_a_x_N_o_d_e_S_i_z_e() const │ │ │ │ │ -263 { │ │ │ │ │ -264 _s_i_z_e___t_y_p_e result = 0; │ │ │ │ │ -265 for (auto&& type : _g_r_i_d_V_i_e_w__.indexSet().types(0)) │ │ │ │ │ -266 { │ │ │ │ │ -267 size_t numFaces = ReferenceElements::general(type).size(1); │ │ │ │ │ -268 const static int dofsPerElement = type.isCube() ? ((dim == 2) ? k*(k+1)*dim │ │ │ │ │ -: k*(k+1)*(k+1)*dim) : k*dim; │ │ │ │ │ -269 const static int dofsPerFace = type.isCube() ? (dim-2)*2*k+k+1 : (dim- │ │ │ │ │ -1)*k+1 ; │ │ │ │ │ -270 result = std::max(result, dofsPerElement + dofsPerFace * numFaces); │ │ │ │ │ +154 auto node = _N_o_d_e{}; │ │ │ │ │ +155 Hybrid::forEach(_C_h_i_l_d_I_n_d_i_c_e_s(), [&](auto i) { │ │ │ │ │ +156 node.setChild(this->_s_u_b_P_r_e_B_a_s_i_s(i)._m_a_k_e_N_o_d_e(), i); │ │ │ │ │ +157 }); │ │ │ │ │ +158 return node; │ │ │ │ │ +159 } │ │ │ │ │ +160 │ │ │ │ │ +_1_6_2 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ +163 { │ │ │ │ │ +164 return _s_i_z_e(Dune::ReservedVector{}); │ │ │ │ │ +165 } │ │ │ │ │ +166 │ │ │ │ │ +168 template │ │ │ │ │ +_1_6_9 _s_i_z_e___t_y_p_e _s_i_z_e(const SizePrefix& prefix) const │ │ │ │ │ +170 { │ │ │ │ │ +171 return _s_i_z_e(prefix, _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y{}); │ │ │ │ │ +172 } │ │ │ │ │ +173 │ │ │ │ │ +174private: │ │ │ │ │ +175 │ │ │ │ │ +176 template │ │ │ │ │ +177 static void multiIndexPopFront(MultiIndex& M) │ │ │ │ │ +178 { │ │ │ │ │ +179 for(std::size_t i=0; i │ │ │ │ │ +185 _s_i_z_e___t_y_p_e _s_i_z_e(SizePrefix prefix, BasisFactory::BlockedLexicographic) const │ │ │ │ │ +186 { │ │ │ │ │ +187 if (prefix.size() == 0) │ │ │ │ │ +188 return _c_h_i_l_d_r_e_n; │ │ │ │ │ +189 │ │ │ │ │ +190 auto front = prefix.front(); │ │ │ │ │ +191 multiIndexPopFront(prefix); │ │ │ │ │ +192 return Hybrid::switchCases(_C_h_i_l_d_I_n_d_i_c_e_s(), front, [&] (auto i) { │ │ │ │ │ +193 return this->_s_u_b_P_r_e_B_a_s_i_s(i).size(prefix); │ │ │ │ │ +194 }, []() { │ │ │ │ │ +195 return _s_i_z_e___t_y_p_e(0); │ │ │ │ │ +196 }); │ │ │ │ │ +197 } │ │ │ │ │ +198 │ │ │ │ │ +199 template │ │ │ │ │ +200 _s_i_z_e___t_y_p_e _s_i_z_e(SizePrefix prefix, BasisFactory::FlatLexicographic) const │ │ │ │ │ +201 { │ │ │ │ │ +202 _s_i_z_e___t_y_p_e result = 0; │ │ │ │ │ +203 if (prefix.size() == 0) │ │ │ │ │ +204 Hybrid::forEach(_C_h_i_l_d_I_n_d_i_c_e_s(), [&](auto i) { │ │ │ │ │ +205 result += this->_s_u_b_P_r_e_B_a_s_i_s(i).size(); │ │ │ │ │ +206 }); │ │ │ │ │ +207 else { │ │ │ │ │ +208 staticFindInRange<0, children>([&](auto i) { │ │ │ │ │ +209 auto firstDigitSize = this->_s_u_b_P_r_e_B_a_s_i_s(i).size(); │ │ │ │ │ +210 if (prefix[0] < firstDigitSize) │ │ │ │ │ +211 { │ │ │ │ │ +212 result = this->_s_u_b_P_r_e_B_a_s_i_s(i).size(prefix); │ │ │ │ │ +213 return true; │ │ │ │ │ +214 } │ │ │ │ │ +215 prefix[0] -= firstDigitSize; │ │ │ │ │ +216 return false; │ │ │ │ │ +217 }); │ │ │ │ │ +218 } │ │ │ │ │ +219 return result; │ │ │ │ │ +220 } │ │ │ │ │ +221 │ │ │ │ │ +222public: │ │ │ │ │ +223 │ │ │ │ │ +_2_2_5 _s_i_z_e___t_y_p_e _d_i_m_e_n_s_i_o_n() const │ │ │ │ │ +226 { │ │ │ │ │ +227 _s_i_z_e___t_y_p_e r=0; │ │ │ │ │ +228 // Accumulate dimension() for all subprebases │ │ │ │ │ +229 Hybrid::forEach(_C_h_i_l_d_I_n_d_i_c_e_s(), [&](auto i) { │ │ │ │ │ +230 r += this->_s_u_b_P_r_e_B_a_s_i_s(i).dimension(); │ │ │ │ │ +231 }); │ │ │ │ │ +232 return r; │ │ │ │ │ +233 } │ │ │ │ │ +234 │ │ │ │ │ +_2_3_6 _s_i_z_e___t_y_p_e _m_a_x_N_o_d_e_S_i_z_e() const │ │ │ │ │ +237 { │ │ │ │ │ +238 _s_i_z_e___t_y_p_e r=0; │ │ │ │ │ +239 // Accumulate maxNodeSize() for all subprebases │ │ │ │ │ +240 Hybrid::forEach(_C_h_i_l_d_I_n_d_i_c_e_s(), [&](auto i) { │ │ │ │ │ +241 r += this->_s_u_b_P_r_e_B_a_s_i_s(i).maxNodeSize(); │ │ │ │ │ +242 }); │ │ │ │ │ +243 return r; │ │ │ │ │ +244 } │ │ │ │ │ +245 │ │ │ │ │ +247 template │ │ │ │ │ +_2_4_8 const _S_u_b_P_r_e_B_a_s_i_s_<_i_>& _s_u_b_P_r_e_B_a_s_i_s(Dune::index_constant = {}) const │ │ │ │ │ +249 { │ │ │ │ │ +250 return std::get(subPreBases_); │ │ │ │ │ +251 } │ │ │ │ │ +252 │ │ │ │ │ +254 template │ │ │ │ │ +_2_5_5 _S_u_b_P_r_e_B_a_s_i_s_<_i_>& _s_u_b_P_r_e_B_a_s_i_s(Dune::index_constant = {}) │ │ │ │ │ +256 { │ │ │ │ │ +257 return std::get(subPreBases_); │ │ │ │ │ +258 } │ │ │ │ │ +259 │ │ │ │ │ +_2_6_1 const auto& _s_u_b_P_r_e_B_a_s_e_s() const │ │ │ │ │ +262 { │ │ │ │ │ +263 return subPreBases_; │ │ │ │ │ +264 } │ │ │ │ │ +265 │ │ │ │ │ +267 template │ │ │ │ │ +_2_6_8 It _i_n_d_i_c_e_s(const _N_o_d_e& node, It it) const │ │ │ │ │ +269 { │ │ │ │ │ +270 return _i_n_d_i_c_e_s(node, it, _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y{}); │ │ │ │ │ 271 } │ │ │ │ │ 272 │ │ │ │ │ -273 return result; │ │ │ │ │ -274 } │ │ │ │ │ -275 │ │ │ │ │ -281 template │ │ │ │ │ -_2_8_2 It _i_n_d_i_c_e_s(const _N_o_d_e& node, It it) const │ │ │ │ │ -283 { │ │ │ │ │ -284 const auto& gridIndexSet = _g_r_i_d_V_i_e_w().indexSet(); │ │ │ │ │ -285 const auto& element = node._e_l_e_m_e_n_t(); │ │ │ │ │ -286 │ │ │ │ │ -287 // throw if Element is not of predefined type │ │ │ │ │ -288 if (not(element.type().isCube()) and not(element.type().isSimplex())) │ │ │ │ │ -289 DUNE_THROW(Dune::NotImplemented, "RaviartThomasBasis only implemented for │ │ │ │ │ -cube and simplex elements."); │ │ │ │ │ +_2_7_4 auto _c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r() const │ │ │ │ │ +275 { │ │ │ │ │ +276 namespace CD = _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s; │ │ │ │ │ +277 if constexpr(std::is_same_v) { │ │ │ │ │ +278 return std::apply([&](auto const&... spb) { │ │ │ │ │ +279 return CD::makeDescriptor(_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r(spb)...); │ │ │ │ │ +280 }, subPreBases_); │ │ │ │ │ +281 } │ │ │ │ │ +282 else if constexpr(std::is_same_v) { │ │ │ │ │ +283 return CD::Unknown{}; // Not yet implemented │ │ │ │ │ +284 } │ │ │ │ │ +285 else │ │ │ │ │ +286 return CD::Unknown{}; │ │ │ │ │ +287 } │ │ │ │ │ +288 │ │ │ │ │ +289private: │ │ │ │ │ 290 │ │ │ │ │ -291 for(std::size_t i=0, end=node._s_i_z_e(); i _c_o_d_i_m_O_f_f_s_e_t__; │ │ │ │ │ -_3_1_2 FiniteElementMap _f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__; │ │ │ │ │ -313 // Number of dofs per entity type depending on the entity's codimension and │ │ │ │ │ -type │ │ │ │ │ -_3_1_4 std::array _d_o_f_s_P_e_r_C_o_d_i_m__; │ │ │ │ │ -315}; │ │ │ │ │ -316 │ │ │ │ │ -317 │ │ │ │ │ -318 │ │ │ │ │ -319template │ │ │ │ │ -_3_2_0class _R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e : │ │ │ │ │ -321 public _L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ -322{ │ │ │ │ │ -323 static const int dim = GV::dimension; │ │ │ │ │ -324 │ │ │ │ │ -325public: │ │ │ │ │ -326 │ │ │ │ │ -_3_2_7 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ -_3_2_8 using _E_l_e_m_e_n_t = typename GV::template Codim<0>::Entity; │ │ │ │ │ -_3_2_9 using _F_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p = typename Impl:: │ │ │ │ │ -RaviartThomasLocalFiniteElementMap; │ │ │ │ │ -_3_3_0 using _F_i_n_i_t_e_E_l_e_m_e_n_t = Impl::GlobalValuedLocalFiniteElement; │ │ │ │ │ -333 │ │ │ │ │ -_3_3_4 _R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e(const _F_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p* finiteElementMap) : │ │ │ │ │ -335 _e_l_e_m_e_n_t__(nullptr), │ │ │ │ │ -336 _f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__(finiteElementMap) │ │ │ │ │ -337 { } │ │ │ │ │ -338 │ │ │ │ │ -_3_4_0 const _E_l_e_m_e_n_t& _e_l_e_m_e_n_t() const │ │ │ │ │ -341 { │ │ │ │ │ -342 return *_e_l_e_m_e_n_t__; │ │ │ │ │ -343 } │ │ │ │ │ +291 template │ │ │ │ │ +292 It _i_n_d_i_c_e_s(const _N_o_d_e& node, It multiIndices, _B_a_s_i_s_F_a_c_t_o_r_y_:_: │ │ │ │ │ +_F_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c) const │ │ │ │ │ +293 { │ │ │ │ │ +294 _s_i_z_e___t_y_p_e firstComponentOffset = 0; │ │ │ │ │ +295 // Loop over all children │ │ │ │ │ +296 Hybrid::forEach(_C_h_i_l_d_I_n_d_i_c_e_s(), [&](auto child){ │ │ │ │ │ +297 _s_i_z_e___t_y_p_e subTreeSize = node.child(child)._s_i_z_e(); │ │ │ │ │ +298 // Fill indices for current child into index buffer starting from current │ │ │ │ │ +299 // buffer position and shift first index component of any index for current │ │ │ │ │ +300 // child by suitable offset to get lexicographic indices. │ │ │ │ │ +301 _s_u_b_P_r_e_B_a_s_i_s(child).indices(node.child(child), multiIndices); │ │ │ │ │ +302 for (std::size_t i = 0; i │ │ │ │ │ +313 static void multiIndexPushFront(MultiIndex& M, _s_i_z_e___t_y_p_e M0) │ │ │ │ │ +314 { │ │ │ │ │ +315 M.resize(M.size()+1); │ │ │ │ │ +316 for(std::size_t i=M.size()-1; i>0; --i) │ │ │ │ │ +317 M[i] = M[i-1]; │ │ │ │ │ +318 M[0] = M0; │ │ │ │ │ +319 } │ │ │ │ │ +320 │ │ │ │ │ +321 template │ │ │ │ │ +322 It _i_n_d_i_c_e_s(const _N_o_d_e& node, It multiIndices, BasisFactory:: │ │ │ │ │ +BlockedLexicographic) const │ │ │ │ │ +323 { │ │ │ │ │ +324 // Loop over all children │ │ │ │ │ +325 Hybrid::forEach(_C_h_i_l_d_I_n_d_i_c_e_s(), [&](auto child){ │ │ │ │ │ +326 _s_i_z_e___t_y_p_e subTreeSize = node.child(child)._s_i_z_e(); │ │ │ │ │ +327 // Fill indices for current child into index buffer starting from current │ │ │ │ │ +position │ │ │ │ │ +328 _s_u_b_P_r_e_B_a_s_i_s(child).indices(node.child(child), multiIndices); │ │ │ │ │ +329 // Insert child index before first component of all indices of current │ │ │ │ │ +child. │ │ │ │ │ +330 for (std::size_t i = 0; imultiIndexPushFront(multiIndices[i], child); │ │ │ │ │ +332 // Increment buffer iterator by the number of indices processed for current │ │ │ │ │ +child │ │ │ │ │ +333 multiIndices += subTreeSize; │ │ │ │ │ +334 }); │ │ │ │ │ +335 return multiIndices; │ │ │ │ │ +336 } │ │ │ │ │ +337 │ │ │ │ │ +338 std::tuple subPreBases_; │ │ │ │ │ +339}; │ │ │ │ │ +340 │ │ │ │ │ +341 │ │ │ │ │ +342 │ │ │ │ │ +343namespace BasisFactory { │ │ │ │ │ 344 │ │ │ │ │ -_3_4_9 const _F_i_n_i_t_e_E_l_e_m_e_n_t& _f_i_n_i_t_e_E_l_e_m_e_n_t() const │ │ │ │ │ -350 { │ │ │ │ │ -351 return _f_i_n_i_t_e_E_l_e_m_e_n_t__; │ │ │ │ │ -352 } │ │ │ │ │ -353 │ │ │ │ │ -_3_5_5 void _b_i_n_d(const _E_l_e_m_e_n_t& e) │ │ │ │ │ -356 { │ │ │ │ │ -357 _e_l_e_m_e_n_t__ = &e; │ │ │ │ │ -358 _f_i_n_i_t_e_E_l_e_m_e_n_t__.bind((_f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__->find(*_e_l_e_m_e_n_t__)), e); │ │ │ │ │ -359 this->_s_e_t_S_i_z_e(_f_i_n_i_t_e_E_l_e_m_e_n_t__.size()); │ │ │ │ │ -360 } │ │ │ │ │ -361 │ │ │ │ │ -362protected: │ │ │ │ │ -363 │ │ │ │ │ -_3_6_4 _F_i_n_i_t_e_E_l_e_m_e_n_t _f_i_n_i_t_e_E_l_e_m_e_n_t__; │ │ │ │ │ -_3_6_5 const _E_l_e_m_e_n_t* _e_l_e_m_e_n_t__; │ │ │ │ │ -_3_6_6 const _F_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p* _f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__; │ │ │ │ │ -367}; │ │ │ │ │ -368 │ │ │ │ │ -369namespace BasisFactory { │ │ │ │ │ -370 │ │ │ │ │ -378template │ │ │ │ │ -_3_7_9auto _r_a_v_i_a_r_t_T_h_o_m_a_s() │ │ │ │ │ -380{ │ │ │ │ │ -381 return [](const auto& gridView) { │ │ │ │ │ -382 return _R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s, k> │ │ │ │ │ -(gridView); │ │ │ │ │ -383 }; │ │ │ │ │ -384} │ │ │ │ │ -385 │ │ │ │ │ -386} // end namespace BasisFactory │ │ │ │ │ -387 │ │ │ │ │ -388 │ │ │ │ │ -389 │ │ │ │ │ -390/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ -391// This is the actual global basis implementation based on the reusable │ │ │ │ │ -parts. │ │ │ │ │ -392/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ -393 │ │ │ │ │ -401template │ │ │ │ │ -_4_0_2using _R_a_v_i_a_r_t_T_h_o_m_a_s_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_<_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_<_G_V_,_ _k_> │ │ │ │ │ ->; │ │ │ │ │ +345namespace Imp { │ │ │ │ │ +346 │ │ │ │ │ +347template │ │ │ │ │ +348class CompositePreBasisFactory │ │ │ │ │ +349{ │ │ │ │ │ +350 │ │ │ │ │ +351 template │ │ │ │ │ +352 auto makePreBasisFromChildPreBases(const GridView&, ChildPreBasis&&... │ │ │ │ │ +childPreBasis) const │ │ │ │ │ +353 { │ │ │ │ │ +354 return CompositePreBasis...>(std::forward(childPreBasis)...); │ │ │ │ │ +355 } │ │ │ │ │ +356 │ │ │ │ │ +357public: │ │ │ │ │ +358 │ │ │ │ │ +359 CompositePreBasisFactory(const ChildPreBasisFactory&... │ │ │ │ │ +childPreBasisFactory) : │ │ │ │ │ +360 childPreBasisFactories_(childPreBasisFactory...) │ │ │ │ │ +361 {} │ │ │ │ │ +362 │ │ │ │ │ +363 CompositePreBasisFactory(ChildPreBasisFactory&&... childPreBasisFactory) : │ │ │ │ │ +364 childPreBasisFactories_(std::move(childPreBasisFactory)...) │ │ │ │ │ +365 {} │ │ │ │ │ +366 │ │ │ │ │ +367 template │ │ │ │ │ +368 auto operator()(const GridView& gridView) const │ │ │ │ │ +369 { │ │ │ │ │ +370 // Use std::apply to unpack the tuple childPreBasisFactories_ │ │ │ │ │ +371 return std::apply([&](const auto&... childPreBasisFactory) { │ │ │ │ │ +372 return this->makePreBasisFromChildPreBases(gridView, childPreBasisFactory │ │ │ │ │ +(gridView)...); │ │ │ │ │ +373 }, childPreBasisFactories_); │ │ │ │ │ +374 } │ │ │ │ │ +375 │ │ │ │ │ +376private: │ │ │ │ │ +377 std::tuple childPreBasisFactories_; │ │ │ │ │ +378}; │ │ │ │ │ +379 │ │ │ │ │ +380} // end namespace BasisFactory::Imp │ │ │ │ │ +381 │ │ │ │ │ +382 │ │ │ │ │ +383 │ │ │ │ │ +394template< │ │ │ │ │ +395 typename... Args, │ │ │ │ │ +396 std::enable_if_t<_C_o_n_c_e_p_t_:_:_i_s_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y::type>(),int> = 0> │ │ │ │ │ +397auto composite(Args&&... args) │ │ │ │ │ +398{ │ │ │ │ │ +399 // We have to separate the last entry which is the IndexMergingStrategy │ │ │ │ │ +400 // and the preceding ones, which are the ChildPreBasisFactories │ │ │ │ │ +401 │ │ │ │ │ +402 using ArgTuple = std::tuple...>; │ │ │ │ │ 403 │ │ │ │ │ -404} // end namespace Functions │ │ │ │ │ -405} // end namespace Dune │ │ │ │ │ +404 // Compute number of children and index of the IndexMergingStrategy │ │ │ │ │ +argument │ │ │ │ │ +405 constexpr std::size_t children = sizeof...(Args) - 1; │ │ │ │ │ 406 │ │ │ │ │ -407 │ │ │ │ │ -408#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH │ │ │ │ │ -_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h │ │ │ │ │ -_g_l_o_b_a_l_v_a_l_u_e_d_l_o_c_a_l_f_i_n_i_t_e_e_l_e_m_e_n_t_._h_h │ │ │ │ │ +407 // Use last type as IndexMergingStrategy │ │ │ │ │ +408 using IndexMergingStrategy = std::tuple_element_t; │ │ │ │ │ +409 │ │ │ │ │ +410 // Index sequence for all but the last entry for partial tuple unpacking │ │ │ │ │ +411 auto childIndices = std::make_index_sequence{}; │ │ │ │ │ +412 │ │ │ │ │ +413 // Unpack tuple only for those entries related to children │ │ │ │ │ +414 return applyPartial([](auto&&... childPreBasisFactory){ │ │ │ │ │ +415 return Imp::CompositePreBasisFactory...>(std::forward(childPreBasisFactory)...); │ │ │ │ │ +416 }, │ │ │ │ │ +417 std::forward_as_tuple(std::forward(args)...), │ │ │ │ │ +418 childIndices); │ │ │ │ │ +419} │ │ │ │ │ +420 │ │ │ │ │ +432template< │ │ │ │ │ +433 typename... Args, │ │ │ │ │ +434 std::enable_if_t::type>(),int> = 0> │ │ │ │ │ +435auto composite(Args&&... args) │ │ │ │ │ +436{ │ │ │ │ │ +437 return Imp::CompositePreBasisFactory...>(std::forward(args)...); │ │ │ │ │ +438} │ │ │ │ │ +439 │ │ │ │ │ +440} // end namespace BasisFactory │ │ │ │ │ +441 │ │ │ │ │ +442// Backward compatibility │ │ │ │ │ +443namespace [[deprecated("Will be removed after Dune 2.10")]] BasisBuilder { │ │ │ │ │ +444 │ │ │ │ │ +445 using namespace BasisFactory; │ │ │ │ │ +446 │ │ │ │ │ +447} │ │ │ │ │ +448 │ │ │ │ │ +449 │ │ │ │ │ +450 │ │ │ │ │ +451} // end namespace Functions │ │ │ │ │ +452} // end namespace Dune │ │ │ │ │ +453 │ │ │ │ │ +454 │ │ │ │ │ +455#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_COMPOSITEBASIS_HH │ │ │ │ │ +_u_t_i_l_i_t_y_._h_h │ │ │ │ │ +_t_y_p_e___t_r_a_i_t_s_._h_h │ │ │ │ │ +_s_t_a_t_i_c_f_o_r_l_o_o_p_._h_h │ │ │ │ │ +_b_a_s_i_s_t_a_g_s_._h_h │ │ │ │ │ +_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h │ │ │ │ │ _n_o_d_e_s_._h_h │ │ │ │ │ -_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_r_a_v_i_a_r_t_T_h_o_m_a_s │ │ │ │ │ -auto raviartThomas() │ │ │ │ │ -Create a pre-basis factory that can create a Raviart-Thomas pre-basis. │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:379 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_p_o_w_e_r │ │ │ │ │ -auto power(ChildPreBasisFactory &&childPreBasisFactory, std::size_t k, const │ │ │ │ │ -IndexMergingStrategy &) │ │ │ │ │ -Create a pre-basis factory that can build a PowerPreBasis. │ │ │ │ │ -DDeeffiinniittiioonn dynamicpowerbasis.hh:409 │ │ │ │ │ +_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_e_n_a_b_l_e_I_f_C_o_n_s_t_r_u_c_t_i_b_l_e │ │ │ │ │ +std::enable_if_t< std::is_constructible_v< T, Args... >, int > │ │ │ │ │ +enableIfConstructible │ │ │ │ │ +Helper to constrain forwarding constructors. │ │ │ │ │ +DDeeffiinniittiioonn type_traits.hh:31 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ -Global basis for given pre-basis. │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:50 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n │ │ │ │ │ -A generic MixIn class for PreBasis. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismixin.hh:36 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_i_z_e │ │ │ │ │ -size_type size() const │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:147 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_e_t_S_i_z_e │ │ │ │ │ -void setSize(const size_type size) │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:169 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:191 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:322 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_:_:_F_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p │ │ │ │ │ -typename Impl::RaviartThomasLocalFiniteElementMap< GV, dim, double, k > │ │ │ │ │ -FiniteElementMap │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:329 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_:_:_b_i_n_d │ │ │ │ │ -void bind(const Element &e) │ │ │ │ │ -Bind to element. │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:355 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_:_:_F_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ -Impl::GlobalValuedLocalFiniteElement< Impl::ContravariantPiolaTransformator, │ │ │ │ │ -typename FiniteElementMap::FiniteElement, Element > FiniteElement │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:332 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_:_:_E_l_e_m_e_n_t │ │ │ │ │ -typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:328 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_:_:_e_l_e_m_e_n_t__ │ │ │ │ │ -const Element * element_ │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:365 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ -const FiniteElement & finiteElement() const │ │ │ │ │ -Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:349 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +auto containerDescriptor(const PreBasis &preBasis) │ │ │ │ │ +Return the container descriptor of the pre-basis, if defined, otherwise │ │ │ │ │ +ContainerDescriptor::Unknown. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ +static constexpr bool isIndexMergingStrategy() │ │ │ │ │ +DDeeffiinniittiioonn basistags.hh:27 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:47 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_F_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c │ │ │ │ │ +Lexicographic merging of direct children without blocking. │ │ │ │ │ +DDeeffiinniittiioonn basistags.hh:84 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s │ │ │ │ │ +A pre-basis for composite bases. │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:57 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_s_u_b_P_r_e_B_a_s_i_s │ │ │ │ │ +SubPreBasis< i > & subPreBasis(Dune::index_constant< i >={}) │ │ │ │ │ +Mutable access to the stored prebasis of the factor in the power space. │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:255 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ +IMS IndexMergingStrategy │ │ │ │ │ +Strategy used to merge the global indices of the child pre-bases. │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:75 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_m_a_x_N_o_d_e_S_i_z_e │ │ │ │ │ +size_type maxNodeSize() const │ │ │ │ │ +Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:236 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_s_u_b_P_r_e_B_a_s_i_s │ │ │ │ │ +const SubPreBasis< i > & subPreBasis(Dune::index_constant< i >={}) const │ │ │ │ │ +Const access to the stored prebasis of the factor in the power space. │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:248 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ std::size_t size_type │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:327 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e │ │ │ │ │ -RaviartThomasNode(const FiniteElementMap *finiteElementMap) │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:334 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_:_:_e_l_e_m_e_n_t │ │ │ │ │ -const Element & element() const │ │ │ │ │ -Return current element, throw if unbound. │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:340 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t__ │ │ │ │ │ -FiniteElement finiteElement_ │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:364 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__ │ │ │ │ │ -const FiniteElementMap * finiteElementMap_ │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:366 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:198 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ +Type used for indices and size information. │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:72 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_N_o_d_e │ │ │ │ │ +CompositeBasisNode< typename SPB::Node... > Node │ │ │ │ │ +Template mapping root tree path to type of created tree node. │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:85 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ +size_type size(const SizePrefix &prefix) const │ │ │ │ │ +Return number of possible values for next position in multi index. │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:169 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s │ │ │ │ │ +CompositePreBasis(SFArgs &&... sfArgs) │ │ │ │ │ +Constructor for given child pre-basis objects. │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:99 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ +size_type dimension() const │ │ │ │ │ +Get the total dimension of the space spanned by this basis. │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:225 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s │ │ │ │ │ +CompositePreBasis(const GV &gv) │ │ │ │ │ +Constructor for given GridView. │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:119 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s │ │ │ │ │ +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. │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:268 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ +size_type size() const │ │ │ │ │ +Same as size(prefix) with empty prefix. │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:162 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ +typename std::tuple_element_t< 0, SubPreBases >::GridView GridView │ │ │ │ │ +The grid view that the FE basis is defined on. │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:69 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_c_h_i_l_d_r_e_n │ │ │ │ │ +static const std::size_t children │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:78 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_S_u_b_P_r_e_B_a_s_e_s │ │ │ │ │ +std::tuple< SPB... > SubPreBases │ │ │ │ │ +Tuple of child pre-bases. │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:62 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ Node makeNode() const │ │ │ │ │ Create tree node. │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:252 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_C_o_d_i_m__ │ │ │ │ │ -std::array< int, dim+1 > dofsPerCodim_ │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:314 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_u_p_d_a_t_e │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:152 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s │ │ │ │ │ +void initializeIndices() │ │ │ │ │ +Initialize the global indices. │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:128 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_S_u_b_P_r_e_B_a_s_i_s │ │ │ │ │ +std::tuple_element_t< i, SubPreBases > SubPreBasis │ │ │ │ │ +Export individual child pre-bases by index. │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:66 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_C_h_i_l_d_I_n_d_i_c_e_s │ │ │ │ │ +std::make_index_sequence< children > ChildIndices │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:80 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_u_p_d_a_t_e │ │ │ │ │ void update(const GridView &gv) │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:244 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s │ │ │ │ │ -RaviartThomasPreBasis(const GridView &gv) │ │ │ │ │ -Constructor for a given grid view object. │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:211 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:206 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ +Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:142 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_m_u_l_t_i_I_n_d_e_x_B_u_f_f_e_r_S_i_z_e │ │ │ │ │ +static constexpr size_type multiIndexBufferSize │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:89 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_s_u_b_P_r_e_B_a_s_e_s │ │ │ │ │ +const auto & subPreBases() const │ │ │ │ │ +Const access to the stored prebases tuple. │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:261 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ const GridView & gridView() const │ │ │ │ │ Obtain the grid view that the basis is defined on. │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:238 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s │ │ │ │ │ -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. │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:282 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__ │ │ │ │ │ -FiniteElementMap finiteElementMap_ │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:312 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ -size_type dimension() const │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:257 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ -GV GridView │ │ │ │ │ -The grid view that the FE space is defined on. │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:205 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_m_a_x_N_o_d_e_S_i_z_e │ │ │ │ │ -size_type maxNodeSize() const │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:262 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w__ │ │ │ │ │ -GridView gridView_ │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:310 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s │ │ │ │ │ -void initializeIndices() │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:230 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_c_o_d_i_m_O_f_f_s_e_t__ │ │ │ │ │ -std::array< size_t, dim+1 > codimOffset_ │ │ │ │ │ -DDeeffiinniittiioonn raviartthomasbasis.hh:311 │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:136 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_m_i_n_M_u_l_t_i_I_n_d_e_x_S_i_z_e │ │ │ │ │ +static constexpr size_type minMultiIndexSize │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:88 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +auto containerDescriptor() const │ │ │ │ │ +Return the associated container descriptor. │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:274 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e │ │ │ │ │ +static constexpr size_type maxMultiIndexSize │ │ │ │ │ +DDeeffiinniittiioonn compositebasis.hh:87 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:252 │ │ │ │ │ +_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00131.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: defaultlocalview.hh File Reference │ │ │ │ +dune-functions: lfeprebasismixin.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,41 +71,49 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
defaultlocalview.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
lfeprebasismixin.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#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>
│ │ │ │ +
#include <cassert>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/leafprebasismappermixin.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ +#include <dune/grid/common/mcmgmapper.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::LFEPreBasisMixin< GV, LFE >
 A pre-basis mixin class parametrized with a local finite-element and a DOF layout. More...
 
class  Dune::Functions::LFEPreBasisMixin< GV, LFE >::Node
 Leaf basis node that encapsulates a local finite-element given from the LFEPreBasisMixin of type LFE. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

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

│ │ │ │ +Functions

template<class GV , class LFE >
 Dune::Functions::LFEPreBasisMixin (const GV &, const LFE &, MCMGLayout) -> LFEPreBasisMixin< GV, LFE >
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,29 +1,37 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -defaultlocalview.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_o_v_e_r_f_l_o_w_a_r_r_a_y_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_m_u_l_t_i_i_n_d_e_x_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +lfeprebasismixin.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_a_p_p_e_r_m_i_x_i_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_<_ _G_B_ _> │ │ │ │ │ -  The restriction of a finite element basis to a single element. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_<_ _G_V_,_ _L_F_E_ _> │ │ │ │ │ +  A pre-basis mixin class parametrized with a local finite-element and a │ │ │ │ │ + DOF layout. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_<_ _G_V_,_ _L_F_E_ _>_:_:_N_o_d_e │ │ │ │ │ +  Leaf basis node that encapsulates a local finite-element given from the │ │ │ │ │ + _L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n of type LFE. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n (const GV &, const LFE &, MCMGLayout) - │ │ │ │ │ + > _L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n< GV, LFE > │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00131_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: defaultlocalview.hh Source File │ │ │ │ +dune-functions: lfeprebasismixin.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,212 +74,161 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
defaultlocalview.hh
│ │ │ │ +
lfeprebasismixin.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALVIEW_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALVIEW_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LFEPREBASISMIXIN_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LFEPREBASISMIXIN_HH
│ │ │ │
9
│ │ │ │ -
10
│ │ │ │ -
11#include <tuple>
│ │ │ │ -
12#include <optional>
│ │ │ │ -
13
│ │ │ │ -
14#include <dune/common/concept.hh>
│ │ │ │ -
15#include <dune/common/hybridutilities.hh>
│ │ │ │ -
16#include <dune/common/reservedvector.hh>
│ │ │ │ +
10#include <cassert>
│ │ │ │ +
11#include <type_traits>
│ │ │ │ +
12
│ │ │ │ +
13#include <dune/common/exceptions.hh>
│ │ │ │ +
14
│ │ │ │ + │ │ │ │ + │ │ │ │
17
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +
18#include <dune/grid/common/mcmgmapper.hh>
│ │ │ │ +
19
│ │ │ │ +
20namespace Dune::Functions {
│ │ │ │
21
│ │ │ │ -
22
│ │ │ │ -
23
│ │ │ │ -
24namespace Dune {
│ │ │ │ -
25namespace Functions {
│ │ │ │ -
26
│ │ │ │ -
27
│ │ │ │ -
28
│ │ │ │ -
30template<class GB>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
32{
│ │ │ │ -
33public:
│ │ │ │ -
34
│ │ │ │ -
36 using GlobalBasis = GB;
│ │ │ │ -
37
│ │ │ │ -
39 using GridView = typename GlobalBasis::GridView;
│ │ │ │ -
40
│ │ │ │ -
42 using Element = typename GridView::template Codim<0>::Entity;
│ │ │ │ -
43
│ │ │ │ -
45 using size_type = std::size_t;
│ │ │ │ -
46
│ │ │ │ -
48 using Tree = typename GlobalBasis::PreBasis::Node;
│ │ │ │ -
49
│ │ │ │ -
50protected:
│ │ │ │ -
51
│ │ │ │ -
52 using PreBasis = typename GlobalBasis::PreBasis;
│ │ │ │ -
53
│ │ │ │ -
54 // Type used to store the multi indices of the basis vectors.
│ │ │ │ -
55 // In contrast to MultiIndex this always has dynamic size.
│ │ │ │ -
56 // It's guaranteed, that you can always cast it to MultiIndex
│ │ │ │ - │ │ │ │ -
58 std::conditional_t<(PreBasis::minMultiIndexSize == PreBasis::maxMultiIndexSize),
│ │ │ │ - │ │ │ │ -
60 Dune::ReservedVector<size_type, PreBasis::multiIndexBufferSize>>;
│ │ │ │ +
54template <class GV, class LFE>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
56 public LeafPreBasisMapperMixin< GV >
│ │ │ │ +
57{
│ │ │ │ + │ │ │ │ +
59
│ │ │ │ +
60public:
│ │ │ │
61
│ │ │ │ -
62public:
│ │ │ │ -
63
│ │ │ │ -
65 using MultiIndex =
│ │ │ │ -
66 std::conditional_t<(PreBasis::minMultiIndexSize == PreBasis::maxMultiIndexSize),
│ │ │ │ - │ │ │ │ -
68 Dune::ReservedVector<size_type, PreBasis::multiIndexBufferSize>>;
│ │ │ │ -
69
│ │ │ │ -
70
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
74 tree_(globalBasis_->preBasis().makeNode())
│ │ │ │ -
75 {
│ │ │ │ -
76 static_assert(models<Concept::BasisTree<GridView>, Tree>(), "Tree type passed to DefaultLocalView does not model the BasisNode concept.");
│ │ │ │ - │ │ │ │ -
78 }
│ │ │ │ +
63 using GridView = GV;
│ │ │ │ +
64
│ │ │ │ +
66 class Node;
│ │ │ │ +
67
│ │ │ │ +
73 template <class LFE_ = LFE,
│ │ │ │ +
74 std::enable_if_t<std::is_default_constructible_v<LFE_>, int> = 0>
│ │ │ │ +
│ │ │ │ +
75 LFEPreBasisMixin (const GridView& gv, MCMGLayout layout)
│ │ │ │ +
76 : Base(gv, layout)
│ │ │ │ +
77 , lfe_{}
│ │ │ │ +
78 {}
│ │ │ │
│ │ │ │
79
│ │ │ │ -
│ │ │ │ -
85 void bind(const Element& e)
│ │ │ │ -
86 {
│ │ │ │ -
87 element_ = e;
│ │ │ │ - │ │ │ │ -
89 indices_.resize(size());
│ │ │ │ -
90 globalBasis_->preBasis().indices(tree_, indices_.begin());
│ │ │ │ -
91 }
│ │ │ │ -
│ │ │ │ -
92
│ │ │ │ -
│ │ │ │ -
95 bool bound() const
│ │ │ │ -
96 {
│ │ │ │ -
97 return static_cast<bool>(element_);
│ │ │ │ -
98 }
│ │ │ │ -
│ │ │ │ -
99
│ │ │ │ -
│ │ │ │ -
104 const Element& element() const
│ │ │ │ -
105 {
│ │ │ │ -
106 return *element_;
│ │ │ │ -
107 }
│ │ │ │ -
│ │ │ │ -
108
│ │ │ │ -
│ │ │ │ -
113 void unbind()
│ │ │ │ -
114 {
│ │ │ │ -
115 element_.reset();
│ │ │ │ -
116 }
│ │ │ │ -
│ │ │ │ -
117
│ │ │ │ -
│ │ │ │ -
122 const Tree& tree() const
│ │ │ │ -
123 {
│ │ │ │ -
124 return tree_;
│ │ │ │ -
125 }
│ │ │ │ -
│ │ │ │ -
126
│ │ │ │ +
85 template <class LFE_>
│ │ │ │ +
│ │ │ │ +
86 LFEPreBasisMixin (const GridView& gv, LFE_&& lfe, MCMGLayout layout)
│ │ │ │ +
87 : Base(gv, layout)
│ │ │ │ +
88 , lfe_(std::forward<LFE_>(lfe))
│ │ │ │ +
89 {}
│ │ │ │ +
│ │ │ │ +
90
│ │ │ │ +
│ │ │ │ +
92 Node makeNode () const
│ │ │ │ +
93 {
│ │ │ │ +
94 return Node(lfe_);
│ │ │ │ +
95 }
│ │ │ │ +
│ │ │ │ +
96
│ │ │ │ +
97private:
│ │ │ │ +
98 LFE lfe_;
│ │ │ │ +
99};
│ │ │ │ +
│ │ │ │ +
100
│ │ │ │ +
101// deduction guide
│ │ │ │ +
102template <class GV, class LFE>
│ │ │ │ +
103LFEPreBasisMixin(const GV&, const LFE&, MCMGLayout)
│ │ │ │ + │ │ │ │ +
105
│ │ │ │ +
106
│ │ │ │ +
107
│ │ │ │ +
117template <class GV, class LFE>
│ │ │ │ +
│ │ │ │ +
118class LFEPreBasisMixin<GV,LFE>::Node
│ │ │ │ +
119 : public LeafBasisNode
│ │ │ │ +
120{
│ │ │ │ +
121 static constexpr int dim = GV::dimension;
│ │ │ │ +
122
│ │ │ │ +
123public:
│ │ │ │ +
124 using size_type = std::size_t;
│ │ │ │ +
125 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ +
126 using FiniteElement = LFE;
│ │ │ │ +
127
│ │ │ │
│ │ │ │ - │ │ │ │ -
130 {
│ │ │ │ -
131 return tree_.size();
│ │ │ │ -
132 }
│ │ │ │ +
129 explicit Node (const LFE& lfe)
│ │ │ │ +
130 : lfe_{&lfe}
│ │ │ │ +
131 , element_{nullptr}
│ │ │ │ +
132 {}
│ │ │ │
│ │ │ │
133
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
141 {
│ │ │ │ -
142 return globalBasis_->preBasis().maxNodeSize();
│ │ │ │ -
143 }
│ │ │ │ +
│ │ │ │ +
135 const Element& element () const
│ │ │ │ +
136 {
│ │ │ │ +
137 assert(!!element_);
│ │ │ │ +
138 return *element_;
│ │ │ │ +
139 }
│ │ │ │
│ │ │ │ -
144
│ │ │ │ +
140
│ │ │ │
│ │ │ │ -
146 const MultiIndex& index(size_type i) const
│ │ │ │ + │ │ │ │
147 {
│ │ │ │ -
148 return indices_[i];
│ │ │ │ -
149 }
│ │ │ │ +
148 assert(!!lfe_);
│ │ │ │ +
149 return *lfe_;
│ │ │ │ +
150 }
│ │ │ │
│ │ │ │ -
150
│ │ │ │ +
151
│ │ │ │
│ │ │ │ - │ │ │ │ -
154 {
│ │ │ │ -
155 return *globalBasis_;
│ │ │ │ -
156 }
│ │ │ │ -
│ │ │ │ -
157
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
159 {
│ │ │ │ -
160 return *this;
│ │ │ │ -
161 }
│ │ │ │ -
│ │ │ │ -
162
│ │ │ │ -
163protected:
│ │ │ │ - │ │ │ │ -
165 std::optional<Element> element_;
│ │ │ │ - │ │ │ │ -
167 std::vector<MultiIndexStorage> indices_;
│ │ │ │ -
168};
│ │ │ │ -
│ │ │ │ -
169
│ │ │ │ -
170
│ │ │ │ -
171
│ │ │ │ -
172} // end namespace Functions
│ │ │ │ -
173} // end namespace Dune
│ │ │ │ -
174
│ │ │ │ -
175
│ │ │ │ -
176
│ │ │ │ -
177#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALVIEW_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ -
Definition polynomial.hh:17
│ │ │ │ -
void bindTree(Tree &tree, const Entity &entity, std::size_t offset=0)
Definition nodes.hh:286
│ │ │ │ -
void initializeTree(Tree &tree, std::size_t treeIndexOffset=0)
Definition nodes.hh:293
│ │ │ │ -
A statically sized MultiIndex type.
Definition multiindex.hh:29
│ │ │ │ -
A dynamically sized array-like class with overflow.
Definition overflowarray.hh:49
│ │ │ │ -
The restriction of a finite element basis to a single element.
Definition defaultlocalview.hh:32
│ │ │ │ -
typename GlobalBasis::PreBasis PreBasis
Definition defaultlocalview.hh:52
│ │ │ │ -
void unbind()
Unbind from the current element.
Definition defaultlocalview.hh:113
│ │ │ │ -
bool bound() const
Return if the view is bound to a grid element.
Definition defaultlocalview.hh:95
│ │ │ │ -
typename GlobalBasis::GridView GridView
The grid view the global FE basis lives on.
Definition defaultlocalview.hh:39
│ │ │ │ -
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:146
│ │ │ │ -
std::optional< Element > element_
Definition defaultlocalview.hh:165
│ │ │ │ -
typename GridView::template Codim< 0 >::Entity Element
Type of the grid element we are bound to.
Definition defaultlocalview.hh:42
│ │ │ │ -
const Tree & tree() const
Return the local ansatz tree associated to the bound entity.
Definition defaultlocalview.hh:122
│ │ │ │ -
void bind(const Element &e)
Bind the view to a grid element.
Definition defaultlocalview.hh:85
│ │ │ │ -
const Element & element() const
Return the grid element that the view is bound to.
Definition defaultlocalview.hh:104
│ │ │ │ -
size_type size() const
Total number of degrees of freedom on this element.
Definition defaultlocalview.hh:129
│ │ │ │ -
GB GlobalBasis
The global FE basis that this is a view on.
Definition defaultlocalview.hh:36
│ │ │ │ -
Tree tree_
Definition defaultlocalview.hh:166
│ │ │ │ -
size_type maxSize() const
Maximum local size for any element on the GridView.
Definition defaultlocalview.hh:140
│ │ │ │ -
std::size_t size_type
The type used for sizes.
Definition defaultlocalview.hh:45
│ │ │ │ -
const DefaultLocalView & rootLocalView() const
Definition defaultlocalview.hh:158
│ │ │ │ -
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:60
│ │ │ │ -
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:68
│ │ │ │ -
std::vector< MultiIndexStorage > indices_
Definition defaultlocalview.hh:167
│ │ │ │ -
typename GlobalBasis::PreBasis::Node Tree
Tree of local finite elements / local shape function sets.
Definition defaultlocalview.hh:48
│ │ │ │ -
DefaultLocalView(const GlobalBasis &globalBasis)
Construct local view for a given global finite element basis.
Definition defaultlocalview.hh:72
│ │ │ │ -
const GlobalBasis * globalBasis_
Definition defaultlocalview.hh:164
│ │ │ │ -
const GlobalBasis & globalBasis() const
Return the global basis that we are a view on.
Definition defaultlocalview.hh:153
│ │ │ │ - │ │ │ │ +
153 void bind (const Element& e)
│ │ │ │ +
154 {
│ │ │ │ +
155 element_ = &e;
│ │ │ │ +
156 this->setSize(lfe_->size());
│ │ │ │ +
157 }
│ │ │ │ +
│ │ │ │ +
158
│ │ │ │ +
159protected:
│ │ │ │ + │ │ │ │ + │ │ │ │ +
162};
│ │ │ │ +
│ │ │ │ +
163
│ │ │ │ +
164
│ │ │ │ +
165} // end namespace Dune::Functions
│ │ │ │ +
166
│ │ │ │ +
167
│ │ │ │ +
168#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LFEPREBASISMIXIN_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ +
Definition polynomial.hh:18
│ │ │ │ +
A generic MixIn class for PreBasis with flat indices computed from a mapper.
Definition leafprebasismappermixin.hh:62
│ │ │ │ +
A pre-basis mixin class parametrized with a local finite-element and a DOF layout.
Definition lfeprebasismixin.hh:57
│ │ │ │ +
LFEPreBasisMixin(const GridView &gv, LFE_ &&lfe, MCMGLayout layout)
Constructor for a given grid view object, local finite-element and layout.
Definition lfeprebasismixin.hh:86
│ │ │ │ +
LFEPreBasisMixin(const GridView &gv, MCMGLayout layout)
Constructor for a given grid view object and layout.
Definition lfeprebasismixin.hh:75
│ │ │ │ +
Node makeNode() const
Create tree node.
Definition lfeprebasismixin.hh:92
│ │ │ │ +
GV GridView
The grid view that the FE basis is defined on.
Definition lfeprebasismixin.hh:63
│ │ │ │ +
Leaf basis node that encapsulates a local finite-element given from the LFEPreBasisMixin of type LFE.
Definition lfeprebasismixin.hh:120
│ │ │ │ +
LFE FiniteElement
Definition lfeprebasismixin.hh:126
│ │ │ │ +
std::size_t size_type
Definition lfeprebasismixin.hh:124
│ │ │ │ +
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to; might raise an error if unbound.
Definition lfeprebasismixin.hh:146
│ │ │ │ +
const Element & element() const
Return current element; might raise an error if unbound.
Definition lfeprebasismixin.hh:135
│ │ │ │ +
const FiniteElement * lfe_
Definition lfeprebasismixin.hh:160
│ │ │ │ +
void bind(const Element &e)
Bind to element. Stores a pointer to the passed element reference.
Definition lfeprebasismixin.hh:153
│ │ │ │ +
Node(const LFE &lfe)
Constructor; stores a pointer to the passed local finite-element lfe.
Definition lfeprebasismixin.hh:129
│ │ │ │ +
typename GV::template Codim< 0 >::Entity Element
Definition lfeprebasismixin.hh:125
│ │ │ │ +
const Element * element_
Definition lfeprebasismixin.hh:161
│ │ │ │ +
Definition nodes.hh:191
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,267 +1,184 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -defaultlocalview.hh │ │ │ │ │ +lfeprebasismixin.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALVIEW_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALVIEW_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LFEPREBASISMIXIN_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LFEPREBASISMIXIN_HH │ │ │ │ │ 9 │ │ │ │ │ -10 │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13 │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12 │ │ │ │ │ +13#include │ │ │ │ │ +14 │ │ │ │ │ +15#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_a_p_p_e_r_m_i_x_i_n_._h_h> │ │ │ │ │ +16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ 17 │ │ │ │ │ -18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_o_v_e_r_f_l_o_w_a_r_r_a_y_._h_h> │ │ │ │ │ -19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_m_u_l_t_i_i_n_d_e_x_._h_h> │ │ │ │ │ -20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +18#include │ │ │ │ │ +19 │ │ │ │ │ +20namespace _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s { │ │ │ │ │ 21 │ │ │ │ │ -22 │ │ │ │ │ -23 │ │ │ │ │ -24namespace _D_u_n_e { │ │ │ │ │ -25namespace Functions { │ │ │ │ │ -26 │ │ │ │ │ -27 │ │ │ │ │ -28 │ │ │ │ │ -30template │ │ │ │ │ -_3_1class _D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w │ │ │ │ │ -32{ │ │ │ │ │ -33public: │ │ │ │ │ -34 │ │ │ │ │ -_3_6 using _G_l_o_b_a_l_B_a_s_i_s = GB; │ │ │ │ │ -37 │ │ │ │ │ -_3_9 using _G_r_i_d_V_i_e_w = typename GlobalBasis::GridView; │ │ │ │ │ -40 │ │ │ │ │ -_4_2 using _E_l_e_m_e_n_t = typename GridView::template Codim<0>::Entity; │ │ │ │ │ -43 │ │ │ │ │ -_4_5 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ -46 │ │ │ │ │ -_4_8 using _T_r_e_e = typename GlobalBasis::PreBasis::Node; │ │ │ │ │ -49 │ │ │ │ │ -50protected: │ │ │ │ │ -51 │ │ │ │ │ -_5_2 using _P_r_e_B_a_s_i_s = typename GlobalBasis::PreBasis; │ │ │ │ │ -53 │ │ │ │ │ -54 // Type used to store the multi indices of the basis vectors. │ │ │ │ │ -55 // In contrast to MultiIndex this always has dynamic size. │ │ │ │ │ -56 // It's guaranteed, that you can always cast it to MultiIndex │ │ │ │ │ -_5_7 using _M_u_l_t_i_I_n_d_e_x_S_t_o_r_a_g_e = │ │ │ │ │ -58 std::conditional_t<(PreBasis::minMultiIndexSize == PreBasis:: │ │ │ │ │ -maxMultiIndexSize), │ │ │ │ │ -59 _O_v_e_r_f_l_o_w_A_r_r_a_y<_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x_<_s_i_z_e___t_y_p_e_,_ _P_r_e_B_a_s_i_s_:_:_m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e_>, │ │ │ │ │ -PreBasis::multiIndexBufferSize>, │ │ │ │ │ -60 Dune::ReservedVector>; │ │ │ │ │ +54template │ │ │ │ │ +_5_5class _L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n : │ │ │ │ │ +56 public _L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n< GV > │ │ │ │ │ +57{ │ │ │ │ │ +58 using _B_a_s_e = _L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_<_ _G_V_ _>; │ │ │ │ │ +59 │ │ │ │ │ +60public: │ │ │ │ │ 61 │ │ │ │ │ -62public: │ │ │ │ │ -63 │ │ │ │ │ -_6_5 using _M_u_l_t_i_I_n_d_e_x = │ │ │ │ │ -66 std::conditional_t<(PreBasis::minMultiIndexSize == PreBasis:: │ │ │ │ │ -maxMultiIndexSize), │ │ │ │ │ -67 _S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x_<_s_i_z_e___t_y_p_e_,_ _P_r_e_B_a_s_i_s_:_:_m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e_>, │ │ │ │ │ -68 Dune::ReservedVector>; │ │ │ │ │ -69 │ │ │ │ │ -70 │ │ │ │ │ -_7_2 _D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w(const _G_l_o_b_a_l_B_a_s_i_s& _g_l_o_b_a_l_B_a_s_i_s) : │ │ │ │ │ -73 _g_l_o_b_a_l_B_a_s_i_s__(&_g_l_o_b_a_l_B_a_s_i_s), │ │ │ │ │ -74 _t_r_e_e__(_g_l_o_b_a_l_B_a_s_i_s__->preBasis().makeNode()) │ │ │ │ │ -75 { │ │ │ │ │ -76 static_assert(models, _T_r_e_e>(), "Tree type │ │ │ │ │ -passed to DefaultLocalView does not model the BasisNode concept."); │ │ │ │ │ -77 _i_n_i_t_i_a_l_i_z_e_T_r_e_e(_t_r_e_e__); │ │ │ │ │ -78 } │ │ │ │ │ +_6_3 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ +64 │ │ │ │ │ +66 class _N_o_d_e; │ │ │ │ │ +67 │ │ │ │ │ +73 template , int> = 0> │ │ │ │ │ +_7_5 _L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n (const _G_r_i_d_V_i_e_w& gv, MCMGLayout layout) │ │ │ │ │ +76 : _B_a_s_e(gv, layout) │ │ │ │ │ +77 , lfe_{} │ │ │ │ │ +78 {} │ │ │ │ │ 79 │ │ │ │ │ -_8_5 void _b_i_n_d(const _E_l_e_m_e_n_t& e) │ │ │ │ │ -86 { │ │ │ │ │ -87 _e_l_e_m_e_n_t__ = e; │ │ │ │ │ -88 _b_i_n_d_T_r_e_e(_t_r_e_e__, *_e_l_e_m_e_n_t__); │ │ │ │ │ -89 _i_n_d_i_c_e_s__.resize(_s_i_z_e()); │ │ │ │ │ -90 _g_l_o_b_a_l_B_a_s_i_s__->preBasis().indices(_t_r_e_e__, _i_n_d_i_c_e_s__.begin()); │ │ │ │ │ -91 } │ │ │ │ │ -92 │ │ │ │ │ -_9_5 bool _b_o_u_n_d() const │ │ │ │ │ -96 { │ │ │ │ │ -97 return static_cast(_e_l_e_m_e_n_t__); │ │ │ │ │ -98 } │ │ │ │ │ -99 │ │ │ │ │ -_1_0_4 const _E_l_e_m_e_n_t& _e_l_e_m_e_n_t() const │ │ │ │ │ -105 { │ │ │ │ │ -106 return *_e_l_e_m_e_n_t__; │ │ │ │ │ -107 } │ │ │ │ │ -108 │ │ │ │ │ -_1_1_3 void _u_n_b_i_n_d() │ │ │ │ │ -114 { │ │ │ │ │ -115 _e_l_e_m_e_n_t__.reset(); │ │ │ │ │ -116 } │ │ │ │ │ -117 │ │ │ │ │ -_1_2_2 const _T_r_e_e& _t_r_e_e() const │ │ │ │ │ -123 { │ │ │ │ │ -124 return _t_r_e_e__; │ │ │ │ │ -125 } │ │ │ │ │ -126 │ │ │ │ │ -_1_2_9 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ -130 { │ │ │ │ │ -131 return _t_r_e_e__.size(); │ │ │ │ │ -132 } │ │ │ │ │ +85 template │ │ │ │ │ +_8_6 _L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n (const _G_r_i_d_V_i_e_w& gv, LFE_&& lfe, MCMGLayout layout) │ │ │ │ │ +87 : _B_a_s_e(gv, layout) │ │ │ │ │ +88 , lfe_(std::forward(lfe)) │ │ │ │ │ +89 {} │ │ │ │ │ +90 │ │ │ │ │ +_9_2 _N_o_d_e _m_a_k_e_N_o_d_e () const │ │ │ │ │ +93 { │ │ │ │ │ +94 return _N_o_d_e(lfe_); │ │ │ │ │ +95 } │ │ │ │ │ +96 │ │ │ │ │ +97private: │ │ │ │ │ +98 LFE lfe_; │ │ │ │ │ +99}; │ │ │ │ │ +100 │ │ │ │ │ +101// deduction guide │ │ │ │ │ +102template │ │ │ │ │ +_1_0_3_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n(const GV&, const LFE&, MCMGLayout) │ │ │ │ │ +104 -> _L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_<_G_V_,_L_F_E_>; │ │ │ │ │ +105 │ │ │ │ │ +106 │ │ │ │ │ +107 │ │ │ │ │ +117template │ │ │ │ │ +_1_1_8class _L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n::_N_o_d_e │ │ │ │ │ +119 : public _L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ +120{ │ │ │ │ │ +121 static constexpr int dim = GV::dimension; │ │ │ │ │ +122 │ │ │ │ │ +123public: │ │ │ │ │ +_1_2_4 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ +_1_2_5 using _E_l_e_m_e_n_t = typename GV::template Codim<0>::Entity; │ │ │ │ │ +_1_2_6 using _F_i_n_i_t_e_E_l_e_m_e_n_t = LFE; │ │ │ │ │ +127 │ │ │ │ │ +_1_2_9 explicit _N_o_d_e (const LFE& lfe) │ │ │ │ │ +130 : lfe_{&lfe} │ │ │ │ │ +131 , element_{nullptr} │ │ │ │ │ +132 {} │ │ │ │ │ 133 │ │ │ │ │ -_1_4_0 _s_i_z_e___t_y_p_e _m_a_x_S_i_z_e() const │ │ │ │ │ -141 { │ │ │ │ │ -142 return _g_l_o_b_a_l_B_a_s_i_s__->preBasis().maxNodeSize(); │ │ │ │ │ -143 } │ │ │ │ │ -144 │ │ │ │ │ -_1_4_6 const _M_u_l_t_i_I_n_d_e_x& _i_n_d_e_x(_s_i_z_e___t_y_p_e i) const │ │ │ │ │ +_1_3_5 const _E_l_e_m_e_n_t& _e_l_e_m_e_n_t () const │ │ │ │ │ +136 { │ │ │ │ │ +137 assert(!!element_); │ │ │ │ │ +138 return *element_; │ │ │ │ │ +139 } │ │ │ │ │ +140 │ │ │ │ │ +_1_4_6 const _F_i_n_i_t_e_E_l_e_m_e_n_t& _f_i_n_i_t_e_E_l_e_m_e_n_t () const │ │ │ │ │ 147 { │ │ │ │ │ -148 return _i_n_d_i_c_e_s__[i]; │ │ │ │ │ -149 } │ │ │ │ │ -150 │ │ │ │ │ -_1_5_3 const _G_l_o_b_a_l_B_a_s_i_s& _g_l_o_b_a_l_B_a_s_i_s() const │ │ │ │ │ +148 assert(!!lfe_); │ │ │ │ │ +149 return *lfe_; │ │ │ │ │ +150 } │ │ │ │ │ +151 │ │ │ │ │ +_1_5_3 void _b_i_n_d (const _E_l_e_m_e_n_t& e) │ │ │ │ │ 154 { │ │ │ │ │ -155 return *_g_l_o_b_a_l_B_a_s_i_s__; │ │ │ │ │ -156 } │ │ │ │ │ -157 │ │ │ │ │ -_1_5_8 const _D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w& _r_o_o_t_L_o_c_a_l_V_i_e_w() const │ │ │ │ │ -159 { │ │ │ │ │ -160 return *this; │ │ │ │ │ -161 } │ │ │ │ │ -162 │ │ │ │ │ -163protected: │ │ │ │ │ -_1_6_4 const _G_l_o_b_a_l_B_a_s_i_s* _g_l_o_b_a_l_B_a_s_i_s__; │ │ │ │ │ -_1_6_5 std::optional _e_l_e_m_e_n_t__; │ │ │ │ │ -_1_6_6 _T_r_e_e _t_r_e_e__; │ │ │ │ │ -_1_6_7 std::vector _i_n_d_i_c_e_s__; │ │ │ │ │ -168}; │ │ │ │ │ -169 │ │ │ │ │ -170 │ │ │ │ │ -171 │ │ │ │ │ -172} // end namespace Functions │ │ │ │ │ -173} // end namespace Dune │ │ │ │ │ -174 │ │ │ │ │ -175 │ │ │ │ │ -176 │ │ │ │ │ -177#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTLOCALVIEW_HH │ │ │ │ │ -_o_v_e_r_f_l_o_w_a_r_r_a_y_._h_h │ │ │ │ │ -_m_u_l_t_i_i_n_d_e_x_._h_h │ │ │ │ │ -_D_u_n_e │ │ │ │ │ -DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_b_i_n_d_T_r_e_e │ │ │ │ │ -void bindTree(Tree &tree, const Entity &entity, std::size_t offset=0) │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:286 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_n_i_t_i_a_l_i_z_e_T_r_e_e │ │ │ │ │ -void initializeTree(Tree &tree, std::size_t treeIndexOffset=0) │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:293 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x │ │ │ │ │ -A statically sized MultiIndex type. │ │ │ │ │ -DDeeffiinniittiioonn multiindex.hh:29 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_O_v_e_r_f_l_o_w_A_r_r_a_y │ │ │ │ │ -A dynamically sized array-like class with overflow. │ │ │ │ │ -DDeeffiinniittiioonn overflowarray.hh:49 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w │ │ │ │ │ -The restriction of a finite element basis to a single element. │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:32 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_P_r_e_B_a_s_i_s │ │ │ │ │ -typename GlobalBasis::PreBasis PreBasis │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_u_n_b_i_n_d │ │ │ │ │ -void unbind() │ │ │ │ │ -Unbind from the current element. │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:113 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_b_o_u_n_d │ │ │ │ │ -bool bound() const │ │ │ │ │ -Return if the view is bound to a grid element. │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:95 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ -typename GlobalBasis::GridView GridView │ │ │ │ │ -The grid view the global FE basis lives on. │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:39 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_i_n_d_e_x │ │ │ │ │ -const MultiIndex & index(size_type i) const │ │ │ │ │ -Maps from subtree index set [0..size-1] to a globally unique multi index in │ │ │ │ │ -global basis. │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:146 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_e_l_e_m_e_n_t__ │ │ │ │ │ -std::optional< Element > element_ │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:165 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_E_l_e_m_e_n_t │ │ │ │ │ -typename GridView::template Codim< 0 >::Entity Element │ │ │ │ │ -Type of the grid element we are bound to. │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:42 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_t_r_e_e │ │ │ │ │ -const Tree & tree() const │ │ │ │ │ -Return the local ansatz tree associated to the bound entity. │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:122 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_b_i_n_d │ │ │ │ │ -void bind(const Element &e) │ │ │ │ │ -Bind the view to a grid element. │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:85 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_e_l_e_m_e_n_t │ │ │ │ │ -const Element & element() const │ │ │ │ │ -Return the grid element that the view is bound to. │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:104 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_s_i_z_e │ │ │ │ │ -size_type size() const │ │ │ │ │ -Total number of degrees of freedom on this element. │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:129 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_G_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ -GB GlobalBasis │ │ │ │ │ -The global FE basis that this is a view on. │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:36 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_t_r_e_e__ │ │ │ │ │ -Tree tree_ │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:166 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_m_a_x_S_i_z_e │ │ │ │ │ -size_type maxSize() const │ │ │ │ │ -Maximum local size for any element on the GridView. │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:140 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +155 element_ = &e; │ │ │ │ │ +156 this->setSize(lfe_->size()); │ │ │ │ │ +157 } │ │ │ │ │ +158 │ │ │ │ │ +159protected: │ │ │ │ │ +_1_6_0 const _F_i_n_i_t_e_E_l_e_m_e_n_t* _l_f_e__; │ │ │ │ │ +_1_6_1 const _E_l_e_m_e_n_t* _e_l_e_m_e_n_t__; │ │ │ │ │ +162}; │ │ │ │ │ +163 │ │ │ │ │ +164 │ │ │ │ │ +165} // end namespace Dune::Functions │ │ │ │ │ +166 │ │ │ │ │ +167 │ │ │ │ │ +168#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LFEPREBASISMIXIN_HH │ │ │ │ │ +_l_e_a_f_p_r_e_b_a_s_i_s_m_a_p_p_e_r_m_i_x_i_n_._h_h │ │ │ │ │ +_n_o_d_e_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │ +DDeeffiinniittiioonn polynomial.hh:18 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n │ │ │ │ │ +A generic MixIn class for PreBasis with flat indices computed from a mapper. │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismappermixin.hh:62 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n │ │ │ │ │ +A pre-basis mixin class parametrized with a local finite-element and a DOF │ │ │ │ │ +layout. │ │ │ │ │ +DDeeffiinniittiioonn lfeprebasismixin.hh:57 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n │ │ │ │ │ +LFEPreBasisMixin(const GridView &gv, LFE_ &&lfe, MCMGLayout layout) │ │ │ │ │ +Constructor for a given grid view object, local finite-element and layout. │ │ │ │ │ +DDeeffiinniittiioonn lfeprebasismixin.hh:86 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n │ │ │ │ │ +LFEPreBasisMixin(const GridView &gv, MCMGLayout layout) │ │ │ │ │ +Constructor for a given grid view object and layout. │ │ │ │ │ +DDeeffiinniittiioonn lfeprebasismixin.hh:75 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ +Node makeNode() const │ │ │ │ │ +Create tree node. │ │ │ │ │ +DDeeffiinniittiioonn lfeprebasismixin.hh:92 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ +GV GridView │ │ │ │ │ +The grid view that the FE basis is defined on. │ │ │ │ │ +DDeeffiinniittiioonn lfeprebasismixin.hh:63 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_N_o_d_e │ │ │ │ │ +Leaf basis node that encapsulates a local finite-element given from the │ │ │ │ │ +LFEPreBasisMixin of type LFE. │ │ │ │ │ +DDeeffiinniittiioonn lfeprebasismixin.hh:120 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_N_o_d_e_:_:_F_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ +LFE FiniteElement │ │ │ │ │ +DDeeffiinniittiioonn lfeprebasismixin.hh:126 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_N_o_d_e_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ std::size_t size_type │ │ │ │ │ -The type used for sizes. │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:45 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_r_o_o_t_L_o_c_a_l_V_i_e_w │ │ │ │ │ -const DefaultLocalView & rootLocalView() const │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:158 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_M_u_l_t_i_I_n_d_e_x_S_t_o_r_a_g_e │ │ │ │ │ -std::conditional_t<(PreBasis::minMultiIndexSize==PreBasis::maxMultiIndexSize), │ │ │ │ │ -OverflowArray< StaticMultiIndex< size_type, PreBasis::maxMultiIndexSize >, │ │ │ │ │ -PreBasis::multiIndexBufferSize >, Dune::ReservedVector< size_type, PreBasis:: │ │ │ │ │ -multiIndexBufferSize > > MultiIndexStorage │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_M_u_l_t_i_I_n_d_e_x │ │ │ │ │ -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. │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:68 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_i_n_d_i_c_e_s__ │ │ │ │ │ -std::vector< MultiIndexStorage > indices_ │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:167 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_T_r_e_e │ │ │ │ │ -typename GlobalBasis::PreBasis::Node Tree │ │ │ │ │ -Tree of local finite elements / local shape function sets. │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:48 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w │ │ │ │ │ -DefaultLocalView(const GlobalBasis &globalBasis) │ │ │ │ │ -Construct local view for a given global finite element basis. │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:72 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_g_l_o_b_a_l_B_a_s_i_s__ │ │ │ │ │ -const GlobalBasis * globalBasis_ │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:164 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_g_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ -const GlobalBasis & globalBasis() const │ │ │ │ │ -Return the global basis that we are a view on. │ │ │ │ │ -DDeeffiinniittiioonn defaultlocalview.hh:153 │ │ │ │ │ -_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ +DDeeffiinniittiioonn lfeprebasismixin.hh:124 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ +const FiniteElement & finiteElement() const │ │ │ │ │ +Return the LocalFiniteElement for the element we are bound to; might raise an │ │ │ │ │ +error if unbound. │ │ │ │ │ +DDeeffiinniittiioonn lfeprebasismixin.hh:146 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_N_o_d_e_:_:_e_l_e_m_e_n_t │ │ │ │ │ +const Element & element() const │ │ │ │ │ +Return current element; might raise an error if unbound. │ │ │ │ │ +DDeeffiinniittiioonn lfeprebasismixin.hh:135 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_N_o_d_e_:_:_l_f_e__ │ │ │ │ │ +const FiniteElement * lfe_ │ │ │ │ │ +DDeeffiinniittiioonn lfeprebasismixin.hh:160 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_N_o_d_e_:_:_b_i_n_d │ │ │ │ │ +void bind(const Element &e) │ │ │ │ │ +Bind to element. Stores a pointer to the passed element reference. │ │ │ │ │ +DDeeffiinniittiioonn lfeprebasismixin.hh:153 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_N_o_d_e_:_:_N_o_d_e │ │ │ │ │ +Node(const LFE &lfe) │ │ │ │ │ +Constructor; stores a pointer to the passed local finite-element lfe. │ │ │ │ │ +DDeeffiinniittiioonn lfeprebasismixin.hh:129 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_N_o_d_e_:_:_E_l_e_m_e_n_t │ │ │ │ │ +typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ +DDeeffiinniittiioonn lfeprebasismixin.hh:125 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_N_o_d_e_:_:_e_l_e_m_e_n_t__ │ │ │ │ │ +const Element * element_ │ │ │ │ │ +DDeeffiinniittiioonn lfeprebasismixin.hh:161 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:191 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00134.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: lagrangedgbasis.hh File Reference │ │ │ │ +dune-functions: subspacelocalview.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,60 +71,37 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Typedefs | │ │ │ │ -Functions
│ │ │ │ -
lagrangedgbasis.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
subspacelocalview.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <array>
│ │ │ │ -#include <dune/common/exceptions.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/functions/functionspacebases/leafprebasismixin.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::LagrangeDGPreBasis< GV, k >
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::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.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<std::size_t k>
auto Dune::Functions::BasisFactory::lagrangeDG ()
 Create a pre-basis factory that can create a LagrangeDG pre-basis.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,43 +1,25 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -lagrangedgbasis.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_a_g_r_a_n_g_e_b_a_s_i_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +subspacelocalview.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_<_ _G_V_,_ _k_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_<_ _R_L_V_,_ _P_P_ _> │ │ │ │ │ +  The restriction of a finite element basis to a single element. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y │ │ │ │ │ -  │ │ │ │ │ -TTyyppeeddeeffss │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_N_o_d_e = _L_a_g_r_a_n_g_e_N_o_d_e< GV, k > │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s< │ │ │ │ │ - _L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s< GV, k > > │ │ │ │ │ -  Basis of a scalar k-th-order Lagrangean-DG finite element space. │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_l_a_g_r_a_n_g_e_D_G () │ │ │ │ │ -  Create a pre-basis factory that can create a LagrangeDG pre-basis. │ │ │ │ │ -  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00134_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: lagrangedgbasis.hh Source File │ │ │ │ +dune-functions: subspacelocalview.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,291 +74,191 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
lagrangedgbasis.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACELOCALVIEW_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACELOCALVIEW_HH
│ │ │ │
9
│ │ │ │ -
10#include <array>
│ │ │ │ -
11#include <dune/common/exceptions.hh>
│ │ │ │ -
12#include <dune/common/math.hh>
│ │ │ │ -
13
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +
10
│ │ │ │ +
11#include <tuple>
│ │ │ │ +
12
│ │ │ │ +
13#include <dune/common/concept.hh>
│ │ │ │ +
14
│ │ │ │ +
15#include <dune/typetree/childextraction.hh>
│ │ │ │ +
16
│ │ │ │ + │ │ │ │
18
│ │ │ │
19
│ │ │ │
20
│ │ │ │ -
21
│ │ │ │ -
22namespace Dune {
│ │ │ │ -
23namespace Functions {
│ │ │ │ +
21namespace Dune {
│ │ │ │ +
22namespace Functions {
│ │ │ │ +
23
│ │ │ │
24
│ │ │ │
25
│ │ │ │ -
26
│ │ │ │ -
27// *****************************************************************************
│ │ │ │ -
28// This is the reusable part of the basis. It contains
│ │ │ │ -
29//
│ │ │ │ -
30// LagrangeDGPreBasis
│ │ │ │ -
31// LagrangeDGNode
│ │ │ │ -
32//
│ │ │ │ -
33// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ -
34// state. These components do _not_ depend on the global basis and local view
│ │ │ │ -
35// and can be used without a global basis.
│ │ │ │ -
36// *****************************************************************************
│ │ │ │ -
37
│ │ │ │ -
38template<typename GV, int k>
│ │ │ │ - │ │ │ │ +
26template<class RB, class PP>
│ │ │ │ +
27class SubspaceBasis;
│ │ │ │ +
28
│ │ │ │ +
29
│ │ │ │ +
30
│ │ │ │ +
32template<class RLV, class PP>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
34{
│ │ │ │ +
35 using PrefixPath = PP;
│ │ │ │ +
36
│ │ │ │ +
37public:
│ │ │ │ +
38
│ │ │ │ +
39 using RootLocalView = RLV;
│ │ │ │
40
│ │ │ │ -
41template<typename GV, int k>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
43 public LeafPreBasisMixin< LagrangeDGPreBasis<GV,k> >
│ │ │ │ -
44{
│ │ │ │ -
45 static const int dim = GV::dimension;
│ │ │ │ + │ │ │ │ +
43
│ │ │ │ + │ │ │ │
46
│ │ │ │ -
47public:
│ │ │ │ -
48
│ │ │ │ -
50 using GridView = GV;
│ │ │ │ -
51 using size_type = std::size_t;
│ │ │ │ +
48 using Element = typename GridView::template Codim<0>::Entity;
│ │ │ │ +
49
│ │ │ │ +
51 using size_type = std::size_t;
│ │ │ │
52
│ │ │ │ -
53
│ │ │ │ -
54 // Precompute the number of dofs per entity type
│ │ │ │ -
55 const static int dofsPerEdge = k+1;
│ │ │ │ -
56 const static int dofsPerTriangle = (k+1)*(k+2)/2;
│ │ │ │ -
57 const static int dofsPerQuad = (k+1)*(k+1);
│ │ │ │ -
58 const static int dofsPerTetrahedron = (k+1)*(k+2)*(k+3)/6;
│ │ │ │ -
59 const static int dofsPerPrism = (k+1)*(k+1)*(k+2)/2;
│ │ │ │ -
60 const static int dofsPerHexahedron = (k+1)*(k+1)*(k+1);
│ │ │ │ -
61 const static int dofsPerPyramid = (k+1)*(k+2)*(2*k+3)/6;
│ │ │ │ -
62
│ │ │ │ -
63
│ │ │ │ - │ │ │ │ -
65
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
68 gridView_(gv)
│ │ │ │ -
69 {}
│ │ │ │ -
│ │ │ │ -
70
│ │ │ │ -
71
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
73 {
│ │ │ │ -
74 switch (dim)
│ │ │ │ -
75 {
│ │ │ │ -
76 case 1:
│ │ │ │ -
77 {
│ │ │ │ -
78 break;
│ │ │ │ -
79 }
│ │ │ │ -
80 case 2:
│ │ │ │ -
81 {
│ │ │ │ -
82 quadrilateralOffset_ = dofsPerTriangle * gridView_.size(Dune::GeometryTypes::triangle);
│ │ │ │ -
83 break;
│ │ │ │ -
84 }
│ │ │ │ -
85 case 3:
│ │ │ │ -
86 {
│ │ │ │ -
87 prismOffset_ = dofsPerTetrahedron * gridView_.size(Dune::GeometryTypes::tetrahedron);
│ │ │ │ +
54 using RootTree = typename RootLocalView::Tree;
│ │ │ │ +
55
│ │ │ │ +
57 using Tree = typename TypeTree::ChildForTreePath<RootTree, PrefixPath>;
│ │ │ │ +
58
│ │ │ │ +
60 using MultiIndex = typename RootLocalView::MultiIndex;
│ │ │ │ +
61
│ │ │ │ +
│ │ │ │ +
63 SubspaceLocalView(const GlobalBasis& globalBasis, const PrefixPath& /*prefixPath*/) :
│ │ │ │ + │ │ │ │ +
65 rootLocalView_(globalBasis.rootBasis().localView())
│ │ │ │ +
66 {
│ │ │ │ +
67// static_assert(models<Concept::BasisTree<GridView>, Tree>(), "Tree type passed to SubspaceLocalView does not model the BasisNode concept.");
│ │ │ │ +
68 }
│ │ │ │ +
│ │ │ │ +
69
│ │ │ │ +
│ │ │ │ +
75 void bind(const Element& e)
│ │ │ │ +
76 {
│ │ │ │ +
77 rootLocalView_.bind(e);
│ │ │ │ +
78 }
│ │ │ │ +
│ │ │ │ +
79
│ │ │ │ +
│ │ │ │ +
84 const Element& element() const
│ │ │ │ +
85 {
│ │ │ │ +
86 return rootLocalView_.element();
│ │ │ │ +
87 }
│ │ │ │ +
│ │ │ │
88
│ │ │ │ -
89 hexahedronOffset_ = prismOffset_ + dofsPerPrism * gridView_.size(Dune::GeometryTypes::prism);
│ │ │ │ -
90
│ │ │ │ -
91 pyramidOffset_ = hexahedronOffset_ + dofsPerHexahedron * gridView_.size(Dune::GeometryTypes::hexahedron);
│ │ │ │ -
92 break;
│ │ │ │ -
93 }
│ │ │ │ -
94 }
│ │ │ │ -
95 }
│ │ │ │ -
│ │ │ │ -
96
│ │ │ │ -
│ │ │ │ -
99 const GridView& gridView() const
│ │ │ │ -
100 {
│ │ │ │ -
101 return gridView_;
│ │ │ │ -
102 }
│ │ │ │ -
│ │ │ │ -
103
│ │ │ │ -
│ │ │ │ -
104 void update(const GridView& gv)
│ │ │ │ -
105 {
│ │ │ │ -
106 gridView_ = gv;
│ │ │ │ -
107 }
│ │ │ │ -
│ │ │ │ -
108
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
113 {
│ │ │ │ -
114 return Node{};
│ │ │ │ -
115 }
│ │ │ │ -
│ │ │ │ -
116
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
118 {
│ │ │ │ -
119 switch (dim)
│ │ │ │ -
120 {
│ │ │ │ -
121 case 1:
│ │ │ │ -
122 return dofsPerEdge*gridView_.size(0);
│ │ │ │ -
123 case 2:
│ │ │ │ -
124 {
│ │ │ │ -
125 return dofsPerTriangle*gridView_.size(Dune::GeometryTypes::triangle) + dofsPerQuad*gridView_.size(Dune::GeometryTypes::quadrilateral);
│ │ │ │ -
126 }
│ │ │ │ -
127 case 3:
│ │ │ │ -
128 {
│ │ │ │ -
129 return dofsPerTetrahedron*gridView_.size(Dune::GeometryTypes::tetrahedron)
│ │ │ │ -
130 + dofsPerPyramid*gridView_.size(Dune::GeometryTypes::pyramid)
│ │ │ │ -
131 + dofsPerPrism*gridView_.size(Dune::GeometryTypes::prism)
│ │ │ │ -
132 + dofsPerHexahedron*gridView_.size(Dune::GeometryTypes::hexahedron);
│ │ │ │ -
133 }
│ │ │ │ -
134 }
│ │ │ │ -
135 DUNE_THROW(Dune::NotImplemented, "No size method for " << dim << "d grids available yet!");
│ │ │ │ +
│ │ │ │ +
93 void unbind()
│ │ │ │ +
94 {
│ │ │ │ +
95 rootLocalView_.unbind();
│ │ │ │ +
96 }
│ │ │ │ +
│ │ │ │ +
97
│ │ │ │ +
│ │ │ │ +
100 bool bound() const
│ │ │ │ +
101 {
│ │ │ │ +
102 return rootLocalView_.bound();
│ │ │ │ +
103 }
│ │ │ │ +
│ │ │ │ +
104
│ │ │ │ +
│ │ │ │ +
109 const Tree& tree() const
│ │ │ │ +
110 {
│ │ │ │ +
111 return TypeTree::child(rootLocalView_.tree(), globalBasis_->prefixPath());
│ │ │ │ +
112 }
│ │ │ │ +
│ │ │ │ +
113
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
117 {
│ │ │ │ +
118 return rootLocalView_.size();
│ │ │ │ +
119 }
│ │ │ │ +
│ │ │ │ +
120
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
128 {
│ │ │ │ +
129 return rootLocalView_.maxSize();
│ │ │ │ +
130 }
│ │ │ │ +
│ │ │ │ +
131
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
134 {
│ │ │ │ +
135 return rootLocalView_.index(i);
│ │ │ │
136 }
│ │ │ │
│ │ │ │
137
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
139 {
│ │ │ │ -
140 return Dune::power(k+1, int(GV::dimension));
│ │ │ │ -
141 }
│ │ │ │ -
│ │ │ │ -
142
│ │ │ │ -
143 template<typename It>
│ │ │ │ -
│ │ │ │ -
144 It indices(const Node& node, It it) const
│ │ │ │ -
145 {
│ │ │ │ -
146 const auto& gridIndexSet = gridView().indexSet();
│ │ │ │ -
147 const auto& element = node.element();
│ │ │ │ -
148
│ │ │ │ -
149 size_type offset = 0;
│ │ │ │ -
150 if constexpr (dim==1)
│ │ │ │ -
151 offset = dofsPerEdge*gridIndexSet.subIndex(element,0,0);
│ │ │ │ -
152 else if constexpr (dim==2)
│ │ │ │ -
153 {
│ │ │ │ -
154 if (element.type().isTriangle())
│ │ │ │ -
155 offset = dofsPerTriangle*gridIndexSet.subIndex(element,0,0);
│ │ │ │ -
156 else if (element.type().isQuadrilateral())
│ │ │ │ -
157 offset = quadrilateralOffset_ + dofsPerQuad*gridIndexSet.subIndex(element,0,0);
│ │ │ │ -
158 else
│ │ │ │ -
159 DUNE_THROW(Dune::NotImplemented, "2d elements have to be triangles or quadrilaterals");
│ │ │ │ -
160 }
│ │ │ │ -
161 else if constexpr (dim==3)
│ │ │ │ -
162 {
│ │ │ │ -
163 if (element.type().isTetrahedron())
│ │ │ │ -
164 offset = dofsPerTetrahedron*gridIndexSet.subIndex(element,0,0);
│ │ │ │ -
165 else if (element.type().isPrism())
│ │ │ │ -
166 offset = prismOffset_ + dofsPerPrism*gridIndexSet.subIndex(element,0,0);
│ │ │ │ -
167 else if (element.type().isHexahedron())
│ │ │ │ -
168 offset = hexahedronOffset_ + dofsPerHexahedron*gridIndexSet.subIndex(element,0,0);
│ │ │ │ -
169 else if (element.type().isPyramid())
│ │ │ │ -
170 offset = pyramidOffset_ + dofsPerPyramid*gridIndexSet.subIndex(element,0,0);
│ │ │ │ -
171 else
│ │ │ │ -
172 DUNE_THROW(Dune::NotImplemented, "3d elements have to be tetrahedrons, prisms, hexahedrons or pyramids");
│ │ │ │ -
173 }
│ │ │ │ -
174 else
│ │ │ │ -
175 DUNE_THROW(Dune::NotImplemented, "No index method for " << dim << "d grids available yet!");
│ │ │ │ -
176 for (size_type i = 0, end = node.size() ; i < end ; ++i, ++it)
│ │ │ │ -
177 *it = {offset + i};
│ │ │ │ -
178 return it;
│ │ │ │ -
179 }
│ │ │ │ -
│ │ │ │ -
180
│ │ │ │ -
│ │ │ │ -
182 unsigned int order() const
│ │ │ │ -
183 {
│ │ │ │ -
184 return k;
│ │ │ │ -
185 }
│ │ │ │ -
│ │ │ │ -
186
│ │ │ │ -
187protected:
│ │ │ │ - │ │ │ │ -
189
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
194};
│ │ │ │ -
│ │ │ │ -
195
│ │ │ │ -
196
│ │ │ │ -
197
│ │ │ │ -
198namespace BasisFactory {
│ │ │ │ -
199
│ │ │ │ -
207template<std::size_t k>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
209{
│ │ │ │ -
210 return [](const auto& gridView) {
│ │ │ │ -
211 return LagrangeDGPreBasis<std::decay_t<decltype(gridView)>, k>(gridView);
│ │ │ │ -
212 };
│ │ │ │ -
213}
│ │ │ │ -
│ │ │ │ -
214
│ │ │ │ -
215} // end namespace BasisFactory
│ │ │ │ -
216
│ │ │ │ -
217
│ │ │ │ -
218
│ │ │ │ -
219// *****************************************************************************
│ │ │ │ -
220// This is the actual global basis implementation based on the reusable parts.
│ │ │ │ -
221// *****************************************************************************
│ │ │ │ -
222
│ │ │ │ -
230template<typename GV, int k>
│ │ │ │ - │ │ │ │ -
232
│ │ │ │ -
233
│ │ │ │ -
234
│ │ │ │ -
235} // end namespace Functions
│ │ │ │ -
236} // end namespace Dune
│ │ │ │ -
237
│ │ │ │ -
238
│ │ │ │ -
239#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
auto lagrangeDG()
Create a pre-basis factory that can create a LagrangeDG pre-basis.
Definition lagrangedgbasis.hh:208
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
141 {
│ │ │ │ +
142 return *globalBasis_;
│ │ │ │ +
143 }
│ │ │ │ +
│ │ │ │ +
144
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
146 {
│ │ │ │ +
147 return rootLocalView_;
│ │ │ │ +
148 }
│ │ │ │ +
│ │ │ │ +
149
│ │ │ │ +
150protected:
│ │ │ │ + │ │ │ │ + │ │ │ │ +
153};
│ │ │ │ +
│ │ │ │ +
154
│ │ │ │ +
155
│ │ │ │ +
156
│ │ │ │ +
157} // end namespace Functions
│ │ │ │ +
158} // end namespace Dune
│ │ │ │ +
159
│ │ │ │ +
160
│ │ │ │ +
161
│ │ │ │ +
162#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACELOCALVIEW_HH
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
Global basis for given pre-basis.
Definition defaultglobalbasis.hh:50
│ │ │ │ -
Definition lagrangebasis.hh:375
│ │ │ │ -
const Element & element() const
Return current element, throw if unbound.
Definition lagrangebasis.hh:427
│ │ │ │ -
Definition lagrangedgbasis.hh:44
│ │ │ │ -
It indices(const Node &node, It it) const
Definition lagrangedgbasis.hh:144
│ │ │ │ -
size_type maxNodeSize() const
Definition lagrangedgbasis.hh:138
│ │ │ │ -
unsigned int order() const
Polynomial order used in the local Lagrange finite-elements.
Definition lagrangedgbasis.hh:182
│ │ │ │ -
void update(const GridView &gv)
Definition lagrangedgbasis.hh:104
│ │ │ │ -
size_t hexahedronOffset_
Definition lagrangedgbasis.hh:193
│ │ │ │ -
Node makeNode() const
Create tree node.
Definition lagrangedgbasis.hh:112
│ │ │ │ -
static const int dofsPerHexahedron
Definition lagrangedgbasis.hh:60
│ │ │ │ -
LagrangeDGPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition lagrangedgbasis.hh:67
│ │ │ │ -
size_t pyramidOffset_
Definition lagrangedgbasis.hh:191
│ │ │ │ -
static const int dofsPerTetrahedron
Definition lagrangedgbasis.hh:58
│ │ │ │ -
GV GridView
The grid view that the FE space is defined on.
Definition lagrangedgbasis.hh:50
│ │ │ │ -
void initializeIndices()
Definition lagrangedgbasis.hh:72
│ │ │ │ -
size_t quadrilateralOffset_
Definition lagrangedgbasis.hh:190
│ │ │ │ -
static const int dofsPerEdge
Definition lagrangedgbasis.hh:55
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition lagrangedgbasis.hh:99
│ │ │ │ -
static const int dofsPerQuad
Definition lagrangedgbasis.hh:57
│ │ │ │ -
static const int dofsPerTriangle
Definition lagrangedgbasis.hh:56
│ │ │ │ -
static const int dofsPerPyramid
Definition lagrangedgbasis.hh:61
│ │ │ │ -
GridView gridView_
Definition lagrangedgbasis.hh:188
│ │ │ │ -
std::size_t size_type
Definition lagrangedgbasis.hh:51
│ │ │ │ -
size_type dimension() const
Definition lagrangedgbasis.hh:117
│ │ │ │ -
size_t prismOffset_
Definition lagrangedgbasis.hh:192
│ │ │ │ -
static const int dofsPerPrism
Definition lagrangedgbasis.hh:59
│ │ │ │ -
A generic MixIn class for PreBasis.
Definition leafprebasismixin.hh:36
│ │ │ │ -
size_type size() const
Definition nodes.hh:147
│ │ │ │ +
SubspaceBasis(const RB &, const TP) -> SubspaceBasis< RB, TP >
│ │ │ │ +
Definition subspacebasis.hh:42
│ │ │ │ +
typename RootBasis::GridView GridView
The grid view that the FE space is defined on.
Definition subspacebasis.hh:52
│ │ │ │ +
const PrefixPath & prefixPath() const
Definition subspacebasis.hh:122
│ │ │ │ +
The restriction of a finite element basis to a single element.
Definition subspacelocalview.hh:34
│ │ │ │ +
typename TypeTree::ChildForTreePath< RootTree, PrefixPath > Tree
Tree of local finite elements / local shape function sets.
Definition subspacelocalview.hh:57
│ │ │ │ +
void unbind()
Unbind from the current element.
Definition subspacelocalview.hh:93
│ │ │ │ +
const Element & element() const
Return the grid element that the view is bound to.
Definition subspacelocalview.hh:84
│ │ │ │ +
const GlobalBasis * globalBasis_
Definition subspacelocalview.hh:151
│ │ │ │ +
bool bound() const
Return if the view is bound to a grid element.
Definition subspacelocalview.hh:100
│ │ │ │ +
typename RootLocalView::MultiIndex MultiIndex
Type used for global numbering of the basis vectors.
Definition subspacelocalview.hh:60
│ │ │ │ +
size_type size() const
Total number of degrees of freedom on this element.
Definition subspacelocalview.hh:116
│ │ │ │ +
RootLocalView rootLocalView_
Definition subspacelocalview.hh:152
│ │ │ │ +
void bind(const Element &e)
Bind the view to a grid element.
Definition subspacelocalview.hh:75
│ │ │ │ +
typename GlobalBasis::GridView GridView
The grid view the global FE basis lives on.
Definition subspacelocalview.hh:45
│ │ │ │ +
SubspaceLocalView(const GlobalBasis &globalBasis, const PrefixPath &)
Construct local view for a given global finite element basis.
Definition subspacelocalview.hh:63
│ │ │ │ +
RLV RootLocalView
Definition subspacelocalview.hh:39
│ │ │ │ +
const RootLocalView & rootLocalView() const
Definition subspacelocalview.hh:145
│ │ │ │ +
std::size_t size_type
The type used for sizes.
Definition subspacelocalview.hh:51
│ │ │ │ +
typename GridView::template Codim< 0 >::Entity Element
Type of the grid element we are bound to.
Definition subspacelocalview.hh:48
│ │ │ │ +
const GlobalBasis & globalBasis() const
Return the global basis that we are a view on.
Definition subspacelocalview.hh:140
│ │ │ │ +
size_type maxSize() const
Maximum local size for any element on the GridView.
Definition subspacelocalview.hh:127
│ │ │ │ +
const Tree & tree() const
Return the local ansatz tree associated to the bound entity.
Definition subspacelocalview.hh:109
│ │ │ │ +
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:133
│ │ │ │ +
typename RootLocalView::Tree RootTree
Tree of local finite elements / local shape function sets.
Definition subspacelocalview.hh:54
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,349 +1,233 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -lagrangedgbasis.hh │ │ │ │ │ +subspacelocalview.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACELOCALVIEW_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACELOCALVIEW_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13 │ │ │ │ │ -14#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ -15#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ -16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_a_g_r_a_n_g_e_b_a_s_i_s_._h_h> │ │ │ │ │ -17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ +10 │ │ │ │ │ +11#include │ │ │ │ │ +12 │ │ │ │ │ +13#include │ │ │ │ │ +14 │ │ │ │ │ +15#include │ │ │ │ │ +16 │ │ │ │ │ +17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ 18 │ │ │ │ │ 19 │ │ │ │ │ 20 │ │ │ │ │ -21 │ │ │ │ │ -22namespace _D_u_n_e { │ │ │ │ │ -23namespace Functions { │ │ │ │ │ +21namespace _D_u_n_e { │ │ │ │ │ +22namespace Functions { │ │ │ │ │ +23 │ │ │ │ │ 24 │ │ │ │ │ 25 │ │ │ │ │ -26 │ │ │ │ │ -27/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ -28// This is the reusable part of the basis. It contains │ │ │ │ │ -29// │ │ │ │ │ -30// LagrangeDGPreBasis │ │ │ │ │ -31// LagrangeDGNode │ │ │ │ │ -32// │ │ │ │ │ -33// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ -shared │ │ │ │ │ -34// state. These components do _not_ depend on the global basis and local view │ │ │ │ │ -35// and can be used without a global basis. │ │ │ │ │ -36/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ -37 │ │ │ │ │ -38template │ │ │ │ │ -_3_9using _L_a_g_r_a_n_g_e_D_G_N_o_d_e = _L_a_g_r_a_n_g_e_N_o_d_e_<_G_V_,_ _k_>; │ │ │ │ │ +26template │ │ │ │ │ +27class _S_u_b_s_p_a_c_e_B_a_s_i_s; │ │ │ │ │ +28 │ │ │ │ │ +29 │ │ │ │ │ +30 │ │ │ │ │ +32template │ │ │ │ │ +_3_3class _S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w │ │ │ │ │ +34{ │ │ │ │ │ +35 using PrefixPath = PP; │ │ │ │ │ +36 │ │ │ │ │ +37public: │ │ │ │ │ +38 │ │ │ │ │ +_3_9 using _R_o_o_t_L_o_c_a_l_V_i_e_w = RLV; │ │ │ │ │ 40 │ │ │ │ │ -41template │ │ │ │ │ -_4_2class _L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s : │ │ │ │ │ -43 public _L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n< LagrangeDGPreBasis > │ │ │ │ │ -44{ │ │ │ │ │ -45 static const int dim = GV::dimension; │ │ │ │ │ +_4_2 using _G_l_o_b_a_l_B_a_s_i_s = _S_u_b_s_p_a_c_e_B_a_s_i_s_<_t_y_p_e_n_a_m_e_ _R_o_o_t_L_o_c_a_l_V_i_e_w_:_:_G_l_o_b_a_l_B_a_s_i_s_, │ │ │ │ │ +_P_r_e_f_i_x_P_a_t_h_>; │ │ │ │ │ +43 │ │ │ │ │ +_4_5 using _G_r_i_d_V_i_e_w = typename _G_l_o_b_a_l_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w; │ │ │ │ │ 46 │ │ │ │ │ -47public: │ │ │ │ │ -48 │ │ │ │ │ -_5_0 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ +_4_8 using _E_l_e_m_e_n_t = typename GridView::template Codim<0>::Entity; │ │ │ │ │ +49 │ │ │ │ │ _5_1 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ 52 │ │ │ │ │ -53 │ │ │ │ │ -54 // Precompute the number of dofs per entity type │ │ │ │ │ -_5_5 const static int _d_o_f_s_P_e_r_E_d_g_e = k+1; │ │ │ │ │ -_5_6 const static int _d_o_f_s_P_e_r_T_r_i_a_n_g_l_e = (k+1)*(k+2)/2; │ │ │ │ │ -_5_7 const static int _d_o_f_s_P_e_r_Q_u_a_d = (k+1)*(k+1); │ │ │ │ │ -_5_8 const static int _d_o_f_s_P_e_r_T_e_t_r_a_h_e_d_r_o_n = (k+1)*(k+2)*(k+3)/6; │ │ │ │ │ -_5_9 const static int _d_o_f_s_P_e_r_P_r_i_s_m = (k+1)*(k+1)*(k+2)/2; │ │ │ │ │ -_6_0 const static int _d_o_f_s_P_e_r_H_e_x_a_h_e_d_r_o_n = (k+1)*(k+1)*(k+1); │ │ │ │ │ -_6_1 const static int _d_o_f_s_P_e_r_P_y_r_a_m_i_d = (k+1)*(k+2)*(2*k+3)/6; │ │ │ │ │ -62 │ │ │ │ │ -63 │ │ │ │ │ -_6_4 using _N_o_d_e = _L_a_g_r_a_n_g_e_D_G_N_o_d_e_<_G_V_,_ _k_>; │ │ │ │ │ -65 │ │ │ │ │ -_6_7 _L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s(const _G_r_i_d_V_i_e_w& gv) : │ │ │ │ │ -68 _g_r_i_d_V_i_e_w__(gv) │ │ │ │ │ -69 {} │ │ │ │ │ -70 │ │ │ │ │ -71 │ │ │ │ │ -_7_2 void _i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s() │ │ │ │ │ -73 { │ │ │ │ │ -74 switch (dim) │ │ │ │ │ -75 { │ │ │ │ │ -76 case 1: │ │ │ │ │ -77 { │ │ │ │ │ -78 break; │ │ │ │ │ -79 } │ │ │ │ │ -80 case 2: │ │ │ │ │ -81 { │ │ │ │ │ -82 _q_u_a_d_r_i_l_a_t_e_r_a_l_O_f_f_s_e_t__ = _d_o_f_s_P_e_r_T_r_i_a_n_g_l_e * _g_r_i_d_V_i_e_w__.size(Dune:: │ │ │ │ │ -GeometryTypes::triangle); │ │ │ │ │ -83 break; │ │ │ │ │ -84 } │ │ │ │ │ -85 case 3: │ │ │ │ │ -86 { │ │ │ │ │ -87 _p_r_i_s_m_O_f_f_s_e_t__ = _d_o_f_s_P_e_r_T_e_t_r_a_h_e_d_r_o_n * _g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes:: │ │ │ │ │ -tetrahedron); │ │ │ │ │ +_5_4 using _R_o_o_t_T_r_e_e = typename RootLocalView::Tree; │ │ │ │ │ +55 │ │ │ │ │ +_5_7 using _T_r_e_e = typename TypeTree::ChildForTreePath; │ │ │ │ │ +58 │ │ │ │ │ +_6_0 using _M_u_l_t_i_I_n_d_e_x = typename RootLocalView::MultiIndex; │ │ │ │ │ +61 │ │ │ │ │ +_6_3 _S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w(const _G_l_o_b_a_l_B_a_s_i_s& _g_l_o_b_a_l_B_a_s_i_s, const PrefixPath& / │ │ │ │ │ +*prefixPath*/) : │ │ │ │ │ +64 _g_l_o_b_a_l_B_a_s_i_s__(&_g_l_o_b_a_l_B_a_s_i_s), │ │ │ │ │ +65 _r_o_o_t_L_o_c_a_l_V_i_e_w__(_g_l_o_b_a_l_B_a_s_i_s.rootBasis().localView()) │ │ │ │ │ +66 { │ │ │ │ │ +67// static_assert(models, Tree>(), "Tree type │ │ │ │ │ +passed to SubspaceLocalView does not model the BasisNode concept."); │ │ │ │ │ +68 } │ │ │ │ │ +69 │ │ │ │ │ +_7_5 void _b_i_n_d(const _E_l_e_m_e_n_t& e) │ │ │ │ │ +76 { │ │ │ │ │ +77 _r_o_o_t_L_o_c_a_l_V_i_e_w__.bind(e); │ │ │ │ │ +78 } │ │ │ │ │ +79 │ │ │ │ │ +_8_4 const _E_l_e_m_e_n_t& _e_l_e_m_e_n_t() const │ │ │ │ │ +85 { │ │ │ │ │ +86 return _r_o_o_t_L_o_c_a_l_V_i_e_w__.element(); │ │ │ │ │ +87 } │ │ │ │ │ 88 │ │ │ │ │ -89 _h_e_x_a_h_e_d_r_o_n_O_f_f_s_e_t__ = _p_r_i_s_m_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_P_r_i_s_m * _g_r_i_d_V_i_e_w__.size(Dune:: │ │ │ │ │ -GeometryTypes::prism); │ │ │ │ │ -90 │ │ │ │ │ -91 _p_y_r_a_m_i_d_O_f_f_s_e_t__ = _h_e_x_a_h_e_d_r_o_n_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_H_e_x_a_h_e_d_r_o_n * _g_r_i_d_V_i_e_w__.size │ │ │ │ │ -(Dune::GeometryTypes::hexahedron); │ │ │ │ │ -92 break; │ │ │ │ │ -93 } │ │ │ │ │ -94 } │ │ │ │ │ -95 } │ │ │ │ │ -96 │ │ │ │ │ -_9_9 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ -100 { │ │ │ │ │ -101 return _g_r_i_d_V_i_e_w__; │ │ │ │ │ -102 } │ │ │ │ │ -103 │ │ │ │ │ -_1_0_4 void _u_p_d_a_t_e(const _G_r_i_d_V_i_e_w& gv) │ │ │ │ │ -105 { │ │ │ │ │ -106 _g_r_i_d_V_i_e_w__ = gv; │ │ │ │ │ -107 } │ │ │ │ │ -108 │ │ │ │ │ -_1_1_2 _N_o_d_e _m_a_k_e_N_o_d_e() const │ │ │ │ │ -113 { │ │ │ │ │ -114 return _N_o_d_e{}; │ │ │ │ │ -115 } │ │ │ │ │ -116 │ │ │ │ │ -_1_1_7 _s_i_z_e___t_y_p_e _d_i_m_e_n_s_i_o_n() const │ │ │ │ │ -118 { │ │ │ │ │ -119 switch (dim) │ │ │ │ │ -120 { │ │ │ │ │ -121 case 1: │ │ │ │ │ -122 return _d_o_f_s_P_e_r_E_d_g_e*_g_r_i_d_V_i_e_w__.size(0); │ │ │ │ │ -123 case 2: │ │ │ │ │ -124 { │ │ │ │ │ -125 return _d_o_f_s_P_e_r_T_r_i_a_n_g_l_e*_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes::triangle) + │ │ │ │ │ -_d_o_f_s_P_e_r_Q_u_a_d*_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes::quadrilateral); │ │ │ │ │ -126 } │ │ │ │ │ -127 case 3: │ │ │ │ │ +_9_3 void _u_n_b_i_n_d() │ │ │ │ │ +94 { │ │ │ │ │ +95 _r_o_o_t_L_o_c_a_l_V_i_e_w__.unbind(); │ │ │ │ │ +96 } │ │ │ │ │ +97 │ │ │ │ │ +_1_0_0 bool _b_o_u_n_d() const │ │ │ │ │ +101 { │ │ │ │ │ +102 return _r_o_o_t_L_o_c_a_l_V_i_e_w__.bound(); │ │ │ │ │ +103 } │ │ │ │ │ +104 │ │ │ │ │ +_1_0_9 const _T_r_e_e& _t_r_e_e() const │ │ │ │ │ +110 { │ │ │ │ │ +111 return TypeTree::child(_r_o_o_t_L_o_c_a_l_V_i_e_w__.tree(), _g_l_o_b_a_l_B_a_s_i_s__->_p_r_e_f_i_x_P_a_t_h()); │ │ │ │ │ +112 } │ │ │ │ │ +113 │ │ │ │ │ +_1_1_6 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ +117 { │ │ │ │ │ +118 return _r_o_o_t_L_o_c_a_l_V_i_e_w__.size(); │ │ │ │ │ +119 } │ │ │ │ │ +120 │ │ │ │ │ +_1_2_7 _s_i_z_e___t_y_p_e _m_a_x_S_i_z_e() const │ │ │ │ │ 128 { │ │ │ │ │ -129 return _d_o_f_s_P_e_r_T_e_t_r_a_h_e_d_r_o_n*_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes::tetrahedron) │ │ │ │ │ -130 + _d_o_f_s_P_e_r_P_y_r_a_m_i_d*_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes::pyramid) │ │ │ │ │ -131 + _d_o_f_s_P_e_r_P_r_i_s_m*_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes::prism) │ │ │ │ │ -132 + _d_o_f_s_P_e_r_H_e_x_a_h_e_d_r_o_n*_g_r_i_d_V_i_e_w__.size(Dune::GeometryTypes::hexahedron); │ │ │ │ │ -133 } │ │ │ │ │ -134 } │ │ │ │ │ -135 DUNE_THROW(Dune::NotImplemented, "No size method for " << dim << "d grids │ │ │ │ │ -available yet!"); │ │ │ │ │ +129 return _r_o_o_t_L_o_c_a_l_V_i_e_w__.maxSize(); │ │ │ │ │ +130 } │ │ │ │ │ +131 │ │ │ │ │ +_1_3_3 _M_u_l_t_i_I_n_d_e_x _i_n_d_e_x(_s_i_z_e___t_y_p_e i) const │ │ │ │ │ +134 { │ │ │ │ │ +135 return _r_o_o_t_L_o_c_a_l_V_i_e_w__.index(i); │ │ │ │ │ 136 } │ │ │ │ │ 137 │ │ │ │ │ -_1_3_8 _s_i_z_e___t_y_p_e _m_a_x_N_o_d_e_S_i_z_e() const │ │ │ │ │ -139 { │ │ │ │ │ -140 return Dune::power(k+1, int(GV::dimension)); │ │ │ │ │ -141 } │ │ │ │ │ -142 │ │ │ │ │ -143 template │ │ │ │ │ -_1_4_4 It _i_n_d_i_c_e_s(const _N_o_d_e& node, It it) const │ │ │ │ │ -145 { │ │ │ │ │ -146 const auto& gridIndexSet = _g_r_i_d_V_i_e_w().indexSet(); │ │ │ │ │ -147 const auto& element = node._e_l_e_m_e_n_t(); │ │ │ │ │ -148 │ │ │ │ │ -149 _s_i_z_e___t_y_p_e offset = 0; │ │ │ │ │ -150 if constexpr (dim==1) │ │ │ │ │ -151 offset = _d_o_f_s_P_e_r_E_d_g_e*gridIndexSet.subIndex(element,0,0); │ │ │ │ │ -152 else if constexpr (dim==2) │ │ │ │ │ -153 { │ │ │ │ │ -154 if (element.type().isTriangle()) │ │ │ │ │ -155 offset = _d_o_f_s_P_e_r_T_r_i_a_n_g_l_e*gridIndexSet.subIndex(element,0,0); │ │ │ │ │ -156 else if (element.type().isQuadrilateral()) │ │ │ │ │ -157 offset = _q_u_a_d_r_i_l_a_t_e_r_a_l_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_Q_u_a_d*gridIndexSet.subIndex │ │ │ │ │ -(element,0,0); │ │ │ │ │ -158 else │ │ │ │ │ -159 DUNE_THROW(Dune::NotImplemented, "2d elements have to be triangles or │ │ │ │ │ -quadrilaterals"); │ │ │ │ │ -160 } │ │ │ │ │ -161 else if constexpr (dim==3) │ │ │ │ │ -162 { │ │ │ │ │ -163 if (element.type().isTetrahedron()) │ │ │ │ │ -164 offset = _d_o_f_s_P_e_r_T_e_t_r_a_h_e_d_r_o_n*gridIndexSet.subIndex(element,0,0); │ │ │ │ │ -165 else if (element.type().isPrism()) │ │ │ │ │ -166 offset = _p_r_i_s_m_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_P_r_i_s_m*gridIndexSet.subIndex(element,0,0); │ │ │ │ │ -167 else if (element.type().isHexahedron()) │ │ │ │ │ -168 offset = _h_e_x_a_h_e_d_r_o_n_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_H_e_x_a_h_e_d_r_o_n*gridIndexSet.subIndex │ │ │ │ │ -(element,0,0); │ │ │ │ │ -169 else if (element.type().isPyramid()) │ │ │ │ │ -170 offset = _p_y_r_a_m_i_d_O_f_f_s_e_t__ + _d_o_f_s_P_e_r_P_y_r_a_m_i_d*gridIndexSet.subIndex │ │ │ │ │ -(element,0,0); │ │ │ │ │ -171 else │ │ │ │ │ -172 DUNE_THROW(Dune::NotImplemented, "3d elements have to be tetrahedrons, │ │ │ │ │ -prisms, hexahedrons or pyramids"); │ │ │ │ │ -173 } │ │ │ │ │ -174 else │ │ │ │ │ -175 DUNE_THROW(Dune::NotImplemented, "No index method for " << dim << "d grids │ │ │ │ │ -available yet!"); │ │ │ │ │ -176 for (_s_i_z_e___t_y_p_e i = 0, end = node._s_i_z_e() ; i < end ; ++i, ++it) │ │ │ │ │ -177 *it = {offset + i}; │ │ │ │ │ -178 return it; │ │ │ │ │ -179 } │ │ │ │ │ -180 │ │ │ │ │ -_1_8_2 unsigned int _o_r_d_e_r() const │ │ │ │ │ -183 { │ │ │ │ │ -184 return k; │ │ │ │ │ -185 } │ │ │ │ │ -186 │ │ │ │ │ -187protected: │ │ │ │ │ -_1_8_8 _G_r_i_d_V_i_e_w _g_r_i_d_V_i_e_w__; │ │ │ │ │ -189 │ │ │ │ │ -_1_9_0 size_t _q_u_a_d_r_i_l_a_t_e_r_a_l_O_f_f_s_e_t__; │ │ │ │ │ -_1_9_1 size_t _p_y_r_a_m_i_d_O_f_f_s_e_t__; │ │ │ │ │ -_1_9_2 size_t _p_r_i_s_m_O_f_f_s_e_t__; │ │ │ │ │ -_1_9_3 size_t _h_e_x_a_h_e_d_r_o_n_O_f_f_s_e_t__; │ │ │ │ │ -194}; │ │ │ │ │ -195 │ │ │ │ │ -196 │ │ │ │ │ -197 │ │ │ │ │ -198namespace BasisFactory { │ │ │ │ │ -199 │ │ │ │ │ -207template │ │ │ │ │ -_2_0_8auto _l_a_g_r_a_n_g_e_D_G() │ │ │ │ │ -209{ │ │ │ │ │ -210 return [](const auto& gridView) { │ │ │ │ │ -211 return _L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s, k>(gridView); │ │ │ │ │ -212 }; │ │ │ │ │ -213} │ │ │ │ │ -214 │ │ │ │ │ -215} // end namespace BasisFactory │ │ │ │ │ -216 │ │ │ │ │ -217 │ │ │ │ │ -218 │ │ │ │ │ -219/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ -220// This is the actual global basis implementation based on the reusable │ │ │ │ │ -parts. │ │ │ │ │ -221/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ -222 │ │ │ │ │ -230template │ │ │ │ │ -_2_3_1using _L_a_g_r_a_n_g_e_D_G_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_<_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_<_G_V_,_ _k_> >; │ │ │ │ │ -232 │ │ │ │ │ -233 │ │ │ │ │ -234 │ │ │ │ │ -235} // end namespace Functions │ │ │ │ │ -236} // end namespace Dune │ │ │ │ │ -237 │ │ │ │ │ -238 │ │ │ │ │ -239#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LAGRANGEDGBASIS_HH │ │ │ │ │ -_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h │ │ │ │ │ -_l_a_g_r_a_n_g_e_b_a_s_i_s_._h_h │ │ │ │ │ -_n_o_d_e_s_._h_h │ │ │ │ │ -_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_l_a_g_r_a_n_g_e_D_G │ │ │ │ │ -auto lagrangeDG() │ │ │ │ │ -Create a pre-basis factory that can create a LagrangeDG pre-basis. │ │ │ │ │ -DDeeffiinniittiioonn lagrangedgbasis.hh:208 │ │ │ │ │ +_1_4_0 const _G_l_o_b_a_l_B_a_s_i_s& _g_l_o_b_a_l_B_a_s_i_s() const │ │ │ │ │ +141 { │ │ │ │ │ +142 return *_g_l_o_b_a_l_B_a_s_i_s__; │ │ │ │ │ +143 } │ │ │ │ │ +144 │ │ │ │ │ +_1_4_5 const _R_o_o_t_L_o_c_a_l_V_i_e_w& _r_o_o_t_L_o_c_a_l_V_i_e_w() const │ │ │ │ │ +146 { │ │ │ │ │ +147 return _r_o_o_t_L_o_c_a_l_V_i_e_w__; │ │ │ │ │ +148 } │ │ │ │ │ +149 │ │ │ │ │ +150protected: │ │ │ │ │ +_1_5_1 const _G_l_o_b_a_l_B_a_s_i_s* _g_l_o_b_a_l_B_a_s_i_s__; │ │ │ │ │ +_1_5_2 _R_o_o_t_L_o_c_a_l_V_i_e_w _r_o_o_t_L_o_c_a_l_V_i_e_w__; │ │ │ │ │ +153}; │ │ │ │ │ +154 │ │ │ │ │ +155 │ │ │ │ │ +156 │ │ │ │ │ +157} // end namespace Functions │ │ │ │ │ +158} // end namespace Dune │ │ │ │ │ +159 │ │ │ │ │ +160 │ │ │ │ │ +161 │ │ │ │ │ +162#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACELOCALVIEW_HH │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ -Global basis for given pre-basis. │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:50 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:375 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_N_o_d_e_:_:_e_l_e_m_e_n_t │ │ │ │ │ -const Element & element() const │ │ │ │ │ -Return current element, throw if unbound. │ │ │ │ │ -DDeeffiinniittiioonn lagrangebasis.hh:427 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s │ │ │ │ │ -DDeeffiinniittiioonn lagrangedgbasis.hh:44 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s │ │ │ │ │ -It indices(const Node &node, It it) const │ │ │ │ │ -DDeeffiinniittiioonn lagrangedgbasis.hh:144 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_m_a_x_N_o_d_e_S_i_z_e │ │ │ │ │ -size_type maxNodeSize() const │ │ │ │ │ -DDeeffiinniittiioonn lagrangedgbasis.hh:138 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_o_r_d_e_r │ │ │ │ │ -unsigned int order() const │ │ │ │ │ -Polynomial order used in the local Lagrange finite-elements. │ │ │ │ │ -DDeeffiinniittiioonn lagrangedgbasis.hh:182 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_u_p_d_a_t_e │ │ │ │ │ -void update(const GridView &gv) │ │ │ │ │ -DDeeffiinniittiioonn lagrangedgbasis.hh:104 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_h_e_x_a_h_e_d_r_o_n_O_f_f_s_e_t__ │ │ │ │ │ -size_t hexahedronOffset_ │ │ │ │ │ -DDeeffiinniittiioonn lagrangedgbasis.hh:193 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ -Node makeNode() const │ │ │ │ │ -Create tree node. │ │ │ │ │ -DDeeffiinniittiioonn lagrangedgbasis.hh:112 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_H_e_x_a_h_e_d_r_o_n │ │ │ │ │ -static const int dofsPerHexahedron │ │ │ │ │ -DDeeffiinniittiioonn lagrangedgbasis.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s │ │ │ │ │ -LagrangeDGPreBasis(const GridView &gv) │ │ │ │ │ -Constructor for a given grid view object. │ │ │ │ │ -DDeeffiinniittiioonn lagrangedgbasis.hh:67 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_p_y_r_a_m_i_d_O_f_f_s_e_t__ │ │ │ │ │ -size_t pyramidOffset_ │ │ │ │ │ -DDeeffiinniittiioonn lagrangedgbasis.hh:191 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_T_e_t_r_a_h_e_d_r_o_n │ │ │ │ │ -static const int dofsPerTetrahedron │ │ │ │ │ -DDeeffiinniittiioonn lagrangedgbasis.hh:58 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ -GV GridView │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s │ │ │ │ │ +SubspaceBasis(const RB &, const TP) -> SubspaceBasis< RB, TP > │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s │ │ │ │ │ +DDeeffiinniittiioonn subspacebasis.hh:42 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ +typename RootBasis::GridView GridView │ │ │ │ │ The grid view that the FE space is defined on. │ │ │ │ │ -DDeeffiinniittiioonn lagrangedgbasis.hh:50 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s │ │ │ │ │ -void initializeIndices() │ │ │ │ │ -DDeeffiinniittiioonn lagrangedgbasis.hh:72 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_q_u_a_d_r_i_l_a_t_e_r_a_l_O_f_f_s_e_t__ │ │ │ │ │ -size_t quadrilateralOffset_ │ │ │ │ │ -DDeeffiinniittiioonn lagrangedgbasis.hh:190 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_E_d_g_e │ │ │ │ │ -static const int dofsPerEdge │ │ │ │ │ -DDeeffiinniittiioonn lagrangedgbasis.hh:55 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ -const GridView & gridView() const │ │ │ │ │ -Obtain the grid view that the basis is defined on. │ │ │ │ │ -DDeeffiinniittiioonn lagrangedgbasis.hh:99 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_Q_u_a_d │ │ │ │ │ -static const int dofsPerQuad │ │ │ │ │ -DDeeffiinniittiioonn lagrangedgbasis.hh:57 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_T_r_i_a_n_g_l_e │ │ │ │ │ -static const int dofsPerTriangle │ │ │ │ │ -DDeeffiinniittiioonn lagrangedgbasis.hh:56 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_P_y_r_a_m_i_d │ │ │ │ │ -static const int dofsPerPyramid │ │ │ │ │ -DDeeffiinniittiioonn lagrangedgbasis.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w__ │ │ │ │ │ -GridView gridView_ │ │ │ │ │ -DDeeffiinniittiioonn lagrangedgbasis.hh:188 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -DDeeffiinniittiioonn lagrangedgbasis.hh:51 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ -size_type dimension() const │ │ │ │ │ -DDeeffiinniittiioonn lagrangedgbasis.hh:117 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_p_r_i_s_m_O_f_f_s_e_t__ │ │ │ │ │ -size_t prismOffset_ │ │ │ │ │ -DDeeffiinniittiioonn lagrangedgbasis.hh:192 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_a_g_r_a_n_g_e_D_G_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_P_r_i_s_m │ │ │ │ │ -static const int dofsPerPrism │ │ │ │ │ -DDeeffiinniittiioonn lagrangedgbasis.hh:59 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n │ │ │ │ │ -A generic MixIn class for PreBasis. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismixin.hh:36 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_i_z_e │ │ │ │ │ +DDeeffiinniittiioonn subspacebasis.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_p_r_e_f_i_x_P_a_t_h │ │ │ │ │ +const PrefixPath & prefixPath() const │ │ │ │ │ +DDeeffiinniittiioonn subspacebasis.hh:122 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w │ │ │ │ │ +The restriction of a finite element basis to a single element. │ │ │ │ │ +DDeeffiinniittiioonn subspacelocalview.hh:34 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_T_r_e_e │ │ │ │ │ +typename TypeTree::ChildForTreePath< RootTree, PrefixPath > Tree │ │ │ │ │ +Tree of local finite elements / local shape function sets. │ │ │ │ │ +DDeeffiinniittiioonn subspacelocalview.hh:57 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_u_n_b_i_n_d │ │ │ │ │ +void unbind() │ │ │ │ │ +Unbind from the current element. │ │ │ │ │ +DDeeffiinniittiioonn subspacelocalview.hh:93 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_e_l_e_m_e_n_t │ │ │ │ │ +const Element & element() const │ │ │ │ │ +Return the grid element that the view is bound to. │ │ │ │ │ +DDeeffiinniittiioonn subspacelocalview.hh:84 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_g_l_o_b_a_l_B_a_s_i_s__ │ │ │ │ │ +const GlobalBasis * globalBasis_ │ │ │ │ │ +DDeeffiinniittiioonn subspacelocalview.hh:151 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_b_o_u_n_d │ │ │ │ │ +bool bound() const │ │ │ │ │ +Return if the view is bound to a grid element. │ │ │ │ │ +DDeeffiinniittiioonn subspacelocalview.hh:100 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_M_u_l_t_i_I_n_d_e_x │ │ │ │ │ +typename RootLocalView::MultiIndex MultiIndex │ │ │ │ │ +Type used for global numbering of the basis vectors. │ │ │ │ │ +DDeeffiinniittiioonn subspacelocalview.hh:60 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_s_i_z_e │ │ │ │ │ size_type size() const │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:147 │ │ │ │ │ +Total number of degrees of freedom on this element. │ │ │ │ │ +DDeeffiinniittiioonn subspacelocalview.hh:116 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_r_o_o_t_L_o_c_a_l_V_i_e_w__ │ │ │ │ │ +RootLocalView rootLocalView_ │ │ │ │ │ +DDeeffiinniittiioonn subspacelocalview.hh:152 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_b_i_n_d │ │ │ │ │ +void bind(const Element &e) │ │ │ │ │ +Bind the view to a grid element. │ │ │ │ │ +DDeeffiinniittiioonn subspacelocalview.hh:75 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ +typename GlobalBasis::GridView GridView │ │ │ │ │ +The grid view the global FE basis lives on. │ │ │ │ │ +DDeeffiinniittiioonn subspacelocalview.hh:45 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w │ │ │ │ │ +SubspaceLocalView(const GlobalBasis &globalBasis, const PrefixPath &) │ │ │ │ │ +Construct local view for a given global finite element basis. │ │ │ │ │ +DDeeffiinniittiioonn subspacelocalview.hh:63 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_R_o_o_t_L_o_c_a_l_V_i_e_w │ │ │ │ │ +RLV RootLocalView │ │ │ │ │ +DDeeffiinniittiioonn subspacelocalview.hh:39 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_r_o_o_t_L_o_c_a_l_V_i_e_w │ │ │ │ │ +const RootLocalView & rootLocalView() const │ │ │ │ │ +DDeeffiinniittiioonn subspacelocalview.hh:145 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +The type used for sizes. │ │ │ │ │ +DDeeffiinniittiioonn subspacelocalview.hh:51 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_E_l_e_m_e_n_t │ │ │ │ │ +typename GridView::template Codim< 0 >::Entity Element │ │ │ │ │ +Type of the grid element we are bound to. │ │ │ │ │ +DDeeffiinniittiioonn subspacelocalview.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_g_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ +const GlobalBasis & globalBasis() const │ │ │ │ │ +Return the global basis that we are a view on. │ │ │ │ │ +DDeeffiinniittiioonn subspacelocalview.hh:140 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_m_a_x_S_i_z_e │ │ │ │ │ +size_type maxSize() const │ │ │ │ │ +Maximum local size for any element on the GridView. │ │ │ │ │ +DDeeffiinniittiioonn subspacelocalview.hh:127 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_t_r_e_e │ │ │ │ │ +const Tree & tree() const │ │ │ │ │ +Return the local ansatz tree associated to the bound entity. │ │ │ │ │ +DDeeffiinniittiioonn subspacelocalview.hh:109 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_i_n_d_e_x │ │ │ │ │ +MultiIndex index(size_type i) const │ │ │ │ │ +Maps from subtree index set [0..size-1] to a globally unique multi index in │ │ │ │ │ +global basis. │ │ │ │ │ +DDeeffiinniittiioonn subspacelocalview.hh:133 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_R_o_o_t_T_r_e_e │ │ │ │ │ +typename RootLocalView::Tree RootTree │ │ │ │ │ +Tree of local finite elements / local shape function sets. │ │ │ │ │ +DDeeffiinniittiioonn subspacelocalview.hh:54 │ │ │ │ │ +_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00137.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: subspacelocalview.hh File Reference │ │ │ │ +dune-functions: hierarchicallagrangebasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,37 +71,59 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
subspacelocalview.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Typedefs | │ │ │ │ +Functions
│ │ │ │ +
hierarchicallagrangebasis.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <tuple>
│ │ │ │ -#include <dune/common/concept.hh>
│ │ │ │ -#include <dune/typetree/childextraction.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │ +
#include <type_traits>
│ │ │ │ +#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/functions/functionspacebases/lfeprebasismixin.hh>
│ │ │ │ +#include <dune/geometry/type.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...
class  Dune::Functions::HierarchicalLagrangePreBasis< GV, 1, R >
 
class  Dune::Functions::HierarchicalLagrangePreBasis< GV, 2, 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.
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<int k, typename R = double>
auto Dune::Functions::BasisFactory::hierarchicalLagrange ()
 A factory that can create a HierarchicalLagrange pre-basis.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,25 +1,42 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -subspacelocalview.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +hierarchicallagrangebasis.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_f_e_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_<_ _R_L_V_,_ _P_P_ _> │ │ │ │ │ -  The restriction of a finite element basis to a single element. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_<_ _G_V_,_ _1_,_ _R_ _> │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_<_ _G_V_,_ _2_,_ _R_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ +namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y │ │ │ │ │ +  │ │ │ │ │ +TTyyppeeddeeffss │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s< │ │ │ │ │ + _H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s< GV, k, R > > │ │ │ │ │ +  Basis of a scalar Hierarchical Lagrange finite element space. │ │ │ │ │ +  │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_h_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e () │ │ │ │ │ +  A factory that can create a HierarchicalLagrange pre-basis. │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00137_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: subspacelocalview.hh Source File │ │ │ │ +dune-functions: hierarchicallagrangebasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,191 +74,128 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
subspacelocalview.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACELOCALVIEW_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACELOCALVIEW_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICALLAGRANGEBASIS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICALLAGRANGEBASIS_HH
│ │ │ │
9
│ │ │ │ -
10
│ │ │ │ -
11#include <tuple>
│ │ │ │ -
12
│ │ │ │ -
13#include <dune/common/concept.hh>
│ │ │ │ -
14
│ │ │ │ -
15#include <dune/typetree/childextraction.hh>
│ │ │ │ -
16
│ │ │ │ - │ │ │ │ -
18
│ │ │ │ +
10#include <type_traits>
│ │ │ │ +
11
│ │ │ │ +
12#include <dune/common/exceptions.hh>
│ │ │ │ +
13
│ │ │ │ +
14#include <dune/localfunctions/hierarchical/hierarchicalp2.hh>
│ │ │ │ +
15
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
19
│ │ │ │ -
20
│ │ │ │ -
21namespace Dune {
│ │ │ │ -
22namespace Functions {
│ │ │ │ -
23
│ │ │ │ +
20#include <dune/geometry/type.hh>
│ │ │ │ +
21
│ │ │ │ +
22namespace Dune {
│ │ │ │ +
23 namespace Functions {
│ │ │ │
24
│ │ │ │ -
25
│ │ │ │ -
26template<class RB, class PP>
│ │ │ │ -
27class SubspaceBasis;
│ │ │ │ -
28
│ │ │ │ -
29
│ │ │ │ -
30
│ │ │ │ -
32template<class RLV, class PP>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
34{
│ │ │ │ -
35 using PrefixPath = PP;
│ │ │ │ -
36
│ │ │ │ -
37public:
│ │ │ │ -
38
│ │ │ │ -
39 using RootLocalView = RLV;
│ │ │ │ -
40
│ │ │ │ - │ │ │ │ -
43
│ │ │ │ - │ │ │ │ -
46
│ │ │ │ -
48 using Element = typename GridView::template Codim<0>::Entity;
│ │ │ │ -
49
│ │ │ │ -
51 using size_type = std::size_t;
│ │ │ │ -
52
│ │ │ │ -
54 using RootTree = typename RootLocalView::Tree;
│ │ │ │ -
55
│ │ │ │ -
57 using Tree = typename TypeTree::ChildForTreePath<RootTree, PrefixPath>;
│ │ │ │ -
58
│ │ │ │ -
60 using MultiIndex = typename RootLocalView::MultiIndex;
│ │ │ │ -
61
│ │ │ │ -
│ │ │ │ -
63 SubspaceLocalView(const GlobalBasis& globalBasis, const PrefixPath& /*prefixPath*/) :
│ │ │ │ - │ │ │ │ -
65 rootLocalView_(globalBasis.rootBasis().localView())
│ │ │ │ -
66 {
│ │ │ │ -
67// static_assert(models<Concept::BasisTree<GridView>, Tree>(), "Tree type passed to SubspaceLocalView does not model the BasisNode concept.");
│ │ │ │ -
68 }
│ │ │ │ -
│ │ │ │ -
69
│ │ │ │ -
│ │ │ │ -
75 void bind(const Element& e)
│ │ │ │ -
76 {
│ │ │ │ -
77 rootLocalView_.bind(e);
│ │ │ │ -
78 }
│ │ │ │ +
25 // *****************************************************************************
│ │ │ │ +
26 // Implementation for Hierarchical Lagrange Basis
│ │ │ │ +
27 //
│ │ │ │ +
28 // - only orders k=1,2 are implemented up to now
│ │ │ │ +
29 // - order k=1 is identical to the standard Lagrange basis
│ │ │ │ +
30 // - implementation is restricted to simplex grids
│ │ │ │ +
31 //
│ │ │ │ +
32 // *****************************************************************************
│ │ │ │ +
33
│ │ │ │ +
43 template<typename GV, int k, typename R = double>
│ │ │ │ + │ │ │ │ +
45
│ │ │ │ +
46 template<typename GV, typename R>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
48 : public LFEPreBasisMixin<GV, LagrangeSimplexLocalFiniteElement<typename GV::ctype,R,GV::dimension,1>>
│ │ │ │ +
49 {
│ │ │ │ + │ │ │ │ +
51 public:
│ │ │ │ +
│ │ │ │ +
52 HierarchicalLagrangePreBasis (const GV& gridView) :
│ │ │ │ +
53 Base(gridView, [](GeometryType gt, int) -> std::size_t { return gt.isVertex() ? 1 : 0; })
│ │ │ │ +
54 {
│ │ │ │ +
55 for (auto gt : gridView.indexSet().types(0)) {
│ │ │ │ +
56 if (!gt.isSimplex())
│ │ │ │ +
57 DUNE_THROW(Dune::NotImplemented,
│ │ │ │ +
58 "Hierarchical Lagrange basis only implemented for simplex grids.");
│ │ │ │ +
59 }
│ │ │ │ +
60 }
│ │ │ │ +
│ │ │ │ +
61 };
│ │ │ │ +
│ │ │ │ +
62
│ │ │ │ +
63 template<typename GV, typename R>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
65 : public LFEPreBasisMixin<GV, HierarchicalP2LocalFiniteElement<typename GV::ctype,R,GV::dimension>>
│ │ │ │ +
66 {
│ │ │ │ + │ │ │ │ +
68 public:
│ │ │ │ +
│ │ │ │ +
69 HierarchicalLagrangePreBasis (const GV& gridView) :
│ │ │ │ +
70 Base(gridView, [](GeometryType gt, int) -> std::size_t { return (gt.isVertex() || gt.isLine()) ? 1 : 0; })
│ │ │ │ +
71 {
│ │ │ │ +
72 for (auto gt : gridView.indexSet().types(0)) {
│ │ │ │ +
73 if (!gt.isSimplex())
│ │ │ │ +
74 DUNE_THROW(Dune::NotImplemented,
│ │ │ │ +
75 "Hierarchical Lagrange basis only implemented for simplex grids.");
│ │ │ │ +
76 }
│ │ │ │ +
77 }
│ │ │ │ +
│ │ │ │ +
78 };
│ │ │ │
│ │ │ │
79
│ │ │ │ -
│ │ │ │ -
84 const Element& element() const
│ │ │ │ -
85 {
│ │ │ │ -
86 return rootLocalView_.element();
│ │ │ │ -
87 }
│ │ │ │ -
│ │ │ │ -
88
│ │ │ │ -
│ │ │ │ -
93 void unbind()
│ │ │ │ -
94 {
│ │ │ │ -
95 rootLocalView_.unbind();
│ │ │ │ -
96 }
│ │ │ │ -
│ │ │ │ -
97
│ │ │ │ -
│ │ │ │ -
100 bool bound() const
│ │ │ │ -
101 {
│ │ │ │ -
102 return rootLocalView_.bound();
│ │ │ │ -
103 }
│ │ │ │ -
│ │ │ │ -
104
│ │ │ │ -
│ │ │ │ -
109 const Tree& tree() const
│ │ │ │ -
110 {
│ │ │ │ -
111 return TypeTree::child(rootLocalView_.tree(), globalBasis_->prefixPath());
│ │ │ │ -
112 }
│ │ │ │ -
│ │ │ │ -
113
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
117 {
│ │ │ │ -
118 return rootLocalView_.size();
│ │ │ │ -
119 }
│ │ │ │ -
│ │ │ │ -
120
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
128 {
│ │ │ │ -
129 return rootLocalView_.maxSize();
│ │ │ │ -
130 }
│ │ │ │ -
│ │ │ │ -
131
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
134 {
│ │ │ │ -
135 return rootLocalView_.index(i);
│ │ │ │ -
136 }
│ │ │ │ -
│ │ │ │ -
137
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
141 {
│ │ │ │ -
142 return *globalBasis_;
│ │ │ │ -
143 }
│ │ │ │ -
│ │ │ │ -
144
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
146 {
│ │ │ │ -
147 return rootLocalView_;
│ │ │ │ -
148 }
│ │ │ │ -
│ │ │ │ -
149
│ │ │ │ -
150protected:
│ │ │ │ - │ │ │ │ - │ │ │ │ -
153};
│ │ │ │ -
│ │ │ │ -
154
│ │ │ │ -
155
│ │ │ │ -
156
│ │ │ │ -
157} // end namespace Functions
│ │ │ │ -
158} // end namespace Dune
│ │ │ │ -
159
│ │ │ │ -
160
│ │ │ │ -
161
│ │ │ │ -
162#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACELOCALVIEW_HH
│ │ │ │ +
80
│ │ │ │ +
81 namespace BasisFactory {
│ │ │ │ +
82
│ │ │ │ +
91 template<int k, typename R=double>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
93 {
│ │ │ │ +
94 static_assert(0 < k && k <= 2);
│ │ │ │ +
95 return [](const auto& gridView) {
│ │ │ │ +
96 return HierarchicalLagrangePreBasis<std::decay_t<decltype(gridView)>, k, R>(gridView);
│ │ │ │ +
97 };
│ │ │ │ +
98 }
│ │ │ │ +
│ │ │ │ +
99
│ │ │ │ +
100 } // end namespace BasisFactory
│ │ │ │ +
101
│ │ │ │ +
112 template<typename GV, int k, typename R=double>
│ │ │ │ + │ │ │ │ +
114
│ │ │ │ +
115 } // end namespace Functions
│ │ │ │ +
116} // end namespace Dune
│ │ │ │ +
117
│ │ │ │ +
118#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICALLAGRANGEBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
auto hierarchicalLagrange()
A factory that can create a HierarchicalLagrange pre-basis.
Definition hierarchicallagrangebasis.hh:92
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
SubspaceBasis(const RB &, const TP) -> SubspaceBasis< RB, TP >
│ │ │ │ -
Definition subspacebasis.hh:42
│ │ │ │ -
typename RootBasis::GridView GridView
The grid view that the FE space is defined on.
Definition subspacebasis.hh:52
│ │ │ │ -
const PrefixPath & prefixPath() const
Definition subspacebasis.hh:122
│ │ │ │ -
The restriction of a finite element basis to a single element.
Definition subspacelocalview.hh:34
│ │ │ │ -
typename TypeTree::ChildForTreePath< RootTree, PrefixPath > Tree
Tree of local finite elements / local shape function sets.
Definition subspacelocalview.hh:57
│ │ │ │ -
void unbind()
Unbind from the current element.
Definition subspacelocalview.hh:93
│ │ │ │ -
const Element & element() const
Return the grid element that the view is bound to.
Definition subspacelocalview.hh:84
│ │ │ │ -
const GlobalBasis * globalBasis_
Definition subspacelocalview.hh:151
│ │ │ │ -
bool bound() const
Return if the view is bound to a grid element.
Definition subspacelocalview.hh:100
│ │ │ │ -
typename RootLocalView::MultiIndex MultiIndex
Type used for global numbering of the basis vectors.
Definition subspacelocalview.hh:60
│ │ │ │ -
size_type size() const
Total number of degrees of freedom on this element.
Definition subspacelocalview.hh:116
│ │ │ │ -
RootLocalView rootLocalView_
Definition subspacelocalview.hh:152
│ │ │ │ -
void bind(const Element &e)
Bind the view to a grid element.
Definition subspacelocalview.hh:75
│ │ │ │ -
typename GlobalBasis::GridView GridView
The grid view the global FE basis lives on.
Definition subspacelocalview.hh:45
│ │ │ │ -
SubspaceLocalView(const GlobalBasis &globalBasis, const PrefixPath &)
Construct local view for a given global finite element basis.
Definition subspacelocalview.hh:63
│ │ │ │ -
RLV RootLocalView
Definition subspacelocalview.hh:39
│ │ │ │ -
const RootLocalView & rootLocalView() const
Definition subspacelocalview.hh:145
│ │ │ │ -
std::size_t size_type
The type used for sizes.
Definition subspacelocalview.hh:51
│ │ │ │ -
typename GridView::template Codim< 0 >::Entity Element
Type of the grid element we are bound to.
Definition subspacelocalview.hh:48
│ │ │ │ -
const GlobalBasis & globalBasis() const
Return the global basis that we are a view on.
Definition subspacelocalview.hh:140
│ │ │ │ -
size_type maxSize() const
Maximum local size for any element on the GridView.
Definition subspacelocalview.hh:127
│ │ │ │ -
const Tree & tree() const
Return the local ansatz tree associated to the bound entity.
Definition subspacelocalview.hh:109
│ │ │ │ -
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:133
│ │ │ │ -
typename RootLocalView::Tree RootTree
Tree of local finite elements / local shape function sets.
Definition subspacelocalview.hh:54
│ │ │ │ - │ │ │ │ +
Global basis for given pre-basis.
Definition defaultglobalbasis.hh:50
│ │ │ │ +
A pre-basis for a hierarchical Lagrange basis.
Definition hierarchicallagrangebasis.hh:44
│ │ │ │ +
HierarchicalLagrangePreBasis(const GV &gridView)
Definition hierarchicallagrangebasis.hh:52
│ │ │ │ +
HierarchicalLagrangePreBasis(const GV &gridView)
Definition hierarchicallagrangebasis.hh:69
│ │ │ │ +
A pre-basis mixin class parametrized with a local finite-element and a DOF layout.
Definition lfeprebasismixin.hh:57
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,233 +1,141 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -subspacelocalview.hh │ │ │ │ │ +hierarchicallagrangebasis.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACELOCALVIEW_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACELOCALVIEW_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICALLAGRANGEBASIS_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICALLAGRANGEBASIS_HH │ │ │ │ │ 9 │ │ │ │ │ -10 │ │ │ │ │ -11#include │ │ │ │ │ -12 │ │ │ │ │ -13#include │ │ │ │ │ -14 │ │ │ │ │ -15#include │ │ │ │ │ -16 │ │ │ │ │ -17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ -18 │ │ │ │ │ +10#include │ │ │ │ │ +11 │ │ │ │ │ +12#include │ │ │ │ │ +13 │ │ │ │ │ +14#include │ │ │ │ │ +15 │ │ │ │ │ +16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ +17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ +18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_f_e_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ 19 │ │ │ │ │ -20 │ │ │ │ │ -21namespace _D_u_n_e { │ │ │ │ │ -22namespace Functions { │ │ │ │ │ -23 │ │ │ │ │ +20#include │ │ │ │ │ +21 │ │ │ │ │ +22namespace _D_u_n_e { │ │ │ │ │ +23 namespace Functions { │ │ │ │ │ 24 │ │ │ │ │ -25 │ │ │ │ │ -26template │ │ │ │ │ -27class _S_u_b_s_p_a_c_e_B_a_s_i_s; │ │ │ │ │ -28 │ │ │ │ │ -29 │ │ │ │ │ -30 │ │ │ │ │ -32template │ │ │ │ │ -_3_3class _S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w │ │ │ │ │ -34{ │ │ │ │ │ -35 using PrefixPath = PP; │ │ │ │ │ -36 │ │ │ │ │ -37public: │ │ │ │ │ -38 │ │ │ │ │ -_3_9 using _R_o_o_t_L_o_c_a_l_V_i_e_w = RLV; │ │ │ │ │ -40 │ │ │ │ │ -_4_2 using _G_l_o_b_a_l_B_a_s_i_s = _S_u_b_s_p_a_c_e_B_a_s_i_s_<_t_y_p_e_n_a_m_e_ _R_o_o_t_L_o_c_a_l_V_i_e_w_:_:_G_l_o_b_a_l_B_a_s_i_s_, │ │ │ │ │ -_P_r_e_f_i_x_P_a_t_h_>; │ │ │ │ │ -43 │ │ │ │ │ -_4_5 using _G_r_i_d_V_i_e_w = typename _G_l_o_b_a_l_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w; │ │ │ │ │ -46 │ │ │ │ │ -_4_8 using _E_l_e_m_e_n_t = typename GridView::template Codim<0>::Entity; │ │ │ │ │ -49 │ │ │ │ │ -_5_1 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ -52 │ │ │ │ │ -_5_4 using _R_o_o_t_T_r_e_e = typename RootLocalView::Tree; │ │ │ │ │ -55 │ │ │ │ │ -_5_7 using _T_r_e_e = typename TypeTree::ChildForTreePath; │ │ │ │ │ -58 │ │ │ │ │ -_6_0 using _M_u_l_t_i_I_n_d_e_x = typename RootLocalView::MultiIndex; │ │ │ │ │ -61 │ │ │ │ │ -_6_3 _S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w(const _G_l_o_b_a_l_B_a_s_i_s& _g_l_o_b_a_l_B_a_s_i_s, const PrefixPath& / │ │ │ │ │ -*prefixPath*/) : │ │ │ │ │ -64 _g_l_o_b_a_l_B_a_s_i_s__(&_g_l_o_b_a_l_B_a_s_i_s), │ │ │ │ │ -65 _r_o_o_t_L_o_c_a_l_V_i_e_w__(_g_l_o_b_a_l_B_a_s_i_s.rootBasis().localView()) │ │ │ │ │ +25 / │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ +26 // Implementation for Hierarchical Lagrange Basis │ │ │ │ │ +27 // │ │ │ │ │ +28 // - only orders k=1,2 are implemented up to now │ │ │ │ │ +29 // - order k=1 is identical to the standard Lagrange basis │ │ │ │ │ +30 // - implementation is restricted to simplex grids │ │ │ │ │ +31 // │ │ │ │ │ +32 / │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ +33 │ │ │ │ │ +43 template │ │ │ │ │ +_4_4 class _H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s; │ │ │ │ │ +45 │ │ │ │ │ +46 template │ │ │ │ │ +_4_7 class _H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s │ │ │ │ │ +48 : public _L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n> │ │ │ │ │ +49 { │ │ │ │ │ +50 using _B_a_s_e = _L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_<_G_V_,_ _L_a_g_r_a_n_g_e_S_i_m_p_l_e_x_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_<_t_y_p_e_n_a_m_e │ │ │ │ │ +_G_V_:_:_c_t_y_p_e_,_R_,_G_V_:_:_d_i_m_e_n_s_i_o_n_,_1_>>; │ │ │ │ │ +51 public: │ │ │ │ │ +_5_2 _H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s (const GV& gridView) : │ │ │ │ │ +53 _B_a_s_e(gridView, [](GeometryType gt, int) -> std::size_t { return gt.isVertex │ │ │ │ │ +() ? 1 : 0; }) │ │ │ │ │ +54 { │ │ │ │ │ +55 for (auto gt : gridView.indexSet().types(0)) { │ │ │ │ │ +56 if (!gt.isSimplex()) │ │ │ │ │ +57 DUNE_THROW(Dune::NotImplemented, │ │ │ │ │ +58 "Hierarchical Lagrange basis only implemented for simplex grids."); │ │ │ │ │ +59 } │ │ │ │ │ +60 } │ │ │ │ │ +61 }; │ │ │ │ │ +62 │ │ │ │ │ +63 template │ │ │ │ │ +_6_4 class _H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s │ │ │ │ │ +65 : public _L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n> │ │ │ │ │ 66 { │ │ │ │ │ -67// static_assert(models, Tree>(), "Tree type │ │ │ │ │ -passed to SubspaceLocalView does not model the BasisNode concept."); │ │ │ │ │ -68 } │ │ │ │ │ -69 │ │ │ │ │ -_7_5 void _b_i_n_d(const _E_l_e_m_e_n_t& e) │ │ │ │ │ -76 { │ │ │ │ │ -77 _r_o_o_t_L_o_c_a_l_V_i_e_w__.bind(e); │ │ │ │ │ -78 } │ │ │ │ │ +67 using _B_a_s_e = _L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_<_G_V_,_ _H_i_e_r_a_r_c_h_i_c_a_l_P_2_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_<_t_y_p_e_n_a_m_e │ │ │ │ │ +_G_V_:_:_c_t_y_p_e_,_R_,_G_V_:_:_d_i_m_e_n_s_i_o_n_>>; │ │ │ │ │ +68 public: │ │ │ │ │ +_6_9 _H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s (const GV& gridView) : │ │ │ │ │ +70 _B_a_s_e(gridView, [](GeometryType gt, int) -> std::size_t { return (gt.isVertex │ │ │ │ │ +() || gt.isLine()) ? 1 : 0; }) │ │ │ │ │ +71 { │ │ │ │ │ +72 for (auto gt : gridView.indexSet().types(0)) { │ │ │ │ │ +73 if (!gt.isSimplex()) │ │ │ │ │ +74 DUNE_THROW(Dune::NotImplemented, │ │ │ │ │ +75 "Hierarchical Lagrange basis only implemented for simplex grids."); │ │ │ │ │ +76 } │ │ │ │ │ +77 } │ │ │ │ │ +78 }; │ │ │ │ │ 79 │ │ │ │ │ -_8_4 const _E_l_e_m_e_n_t& _e_l_e_m_e_n_t() const │ │ │ │ │ -85 { │ │ │ │ │ -86 return _r_o_o_t_L_o_c_a_l_V_i_e_w__.element(); │ │ │ │ │ -87 } │ │ │ │ │ -88 │ │ │ │ │ -_9_3 void _u_n_b_i_n_d() │ │ │ │ │ -94 { │ │ │ │ │ -95 _r_o_o_t_L_o_c_a_l_V_i_e_w__.unbind(); │ │ │ │ │ -96 } │ │ │ │ │ -97 │ │ │ │ │ -_1_0_0 bool _b_o_u_n_d() const │ │ │ │ │ -101 { │ │ │ │ │ -102 return _r_o_o_t_L_o_c_a_l_V_i_e_w__.bound(); │ │ │ │ │ -103 } │ │ │ │ │ -104 │ │ │ │ │ -_1_0_9 const _T_r_e_e& _t_r_e_e() const │ │ │ │ │ -110 { │ │ │ │ │ -111 return TypeTree::child(_r_o_o_t_L_o_c_a_l_V_i_e_w__.tree(), _g_l_o_b_a_l_B_a_s_i_s__->_p_r_e_f_i_x_P_a_t_h()); │ │ │ │ │ -112 } │ │ │ │ │ -113 │ │ │ │ │ -_1_1_6 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ -117 { │ │ │ │ │ -118 return _r_o_o_t_L_o_c_a_l_V_i_e_w__.size(); │ │ │ │ │ -119 } │ │ │ │ │ -120 │ │ │ │ │ -_1_2_7 _s_i_z_e___t_y_p_e _m_a_x_S_i_z_e() const │ │ │ │ │ -128 { │ │ │ │ │ -129 return _r_o_o_t_L_o_c_a_l_V_i_e_w__.maxSize(); │ │ │ │ │ -130 } │ │ │ │ │ -131 │ │ │ │ │ -_1_3_3 _M_u_l_t_i_I_n_d_e_x _i_n_d_e_x(_s_i_z_e___t_y_p_e i) const │ │ │ │ │ -134 { │ │ │ │ │ -135 return _r_o_o_t_L_o_c_a_l_V_i_e_w__.index(i); │ │ │ │ │ -136 } │ │ │ │ │ -137 │ │ │ │ │ -_1_4_0 const _G_l_o_b_a_l_B_a_s_i_s& _g_l_o_b_a_l_B_a_s_i_s() const │ │ │ │ │ -141 { │ │ │ │ │ -142 return *_g_l_o_b_a_l_B_a_s_i_s__; │ │ │ │ │ -143 } │ │ │ │ │ -144 │ │ │ │ │ -_1_4_5 const _R_o_o_t_L_o_c_a_l_V_i_e_w& _r_o_o_t_L_o_c_a_l_V_i_e_w() const │ │ │ │ │ -146 { │ │ │ │ │ -147 return _r_o_o_t_L_o_c_a_l_V_i_e_w__; │ │ │ │ │ -148 } │ │ │ │ │ -149 │ │ │ │ │ -150protected: │ │ │ │ │ -_1_5_1 const _G_l_o_b_a_l_B_a_s_i_s* _g_l_o_b_a_l_B_a_s_i_s__; │ │ │ │ │ -_1_5_2 _R_o_o_t_L_o_c_a_l_V_i_e_w _r_o_o_t_L_o_c_a_l_V_i_e_w__; │ │ │ │ │ -153}; │ │ │ │ │ -154 │ │ │ │ │ -155 │ │ │ │ │ -156 │ │ │ │ │ -157} // end namespace Functions │ │ │ │ │ -158} // end namespace Dune │ │ │ │ │ -159 │ │ │ │ │ -160 │ │ │ │ │ -161 │ │ │ │ │ -162#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACELOCALVIEW_HH │ │ │ │ │ +80 │ │ │ │ │ +81 namespace BasisFactory { │ │ │ │ │ +82 │ │ │ │ │ +91 template │ │ │ │ │ +_9_2 auto _h_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e() │ │ │ │ │ +93 { │ │ │ │ │ +94 static_assert(0 < k && k <= 2); │ │ │ │ │ +95 return [](const auto& gridView) { │ │ │ │ │ +96 return _H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s, k, R> │ │ │ │ │ +(gridView); │ │ │ │ │ +97 }; │ │ │ │ │ +98 } │ │ │ │ │ +99 │ │ │ │ │ +100 } // end namespace BasisFactory │ │ │ │ │ +101 │ │ │ │ │ +112 template │ │ │ │ │ +_1_1_3 using _H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_B_a_s_i_s = │ │ │ │ │ +_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_<_H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_<_G_V_,_ _k_,_ _R_> >; │ │ │ │ │ +114 │ │ │ │ │ +115 } // end namespace Functions │ │ │ │ │ +116} // end namespace Dune │ │ │ │ │ +117 │ │ │ │ │ +118#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICALLAGRANGEBASIS_HH │ │ │ │ │ +_l_f_e_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h │ │ │ │ │ +_n_o_d_e_s_._h_h │ │ │ │ │ +_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_h_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e │ │ │ │ │ +auto hierarchicalLagrange() │ │ │ │ │ +A factory that can create a HierarchicalLagrange pre-basis. │ │ │ │ │ +DDeeffiinniittiioonn hierarchicallagrangebasis.hh:92 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s │ │ │ │ │ -SubspaceBasis(const RB &, const TP) -> SubspaceBasis< RB, TP > │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s │ │ │ │ │ -DDeeffiinniittiioonn subspacebasis.hh:42 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ -typename RootBasis::GridView GridView │ │ │ │ │ -The grid view that the FE space is defined on. │ │ │ │ │ -DDeeffiinniittiioonn subspacebasis.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_p_r_e_f_i_x_P_a_t_h │ │ │ │ │ -const PrefixPath & prefixPath() const │ │ │ │ │ -DDeeffiinniittiioonn subspacebasis.hh:122 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w │ │ │ │ │ -The restriction of a finite element basis to a single element. │ │ │ │ │ -DDeeffiinniittiioonn subspacelocalview.hh:34 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_T_r_e_e │ │ │ │ │ -typename TypeTree::ChildForTreePath< RootTree, PrefixPath > Tree │ │ │ │ │ -Tree of local finite elements / local shape function sets. │ │ │ │ │ -DDeeffiinniittiioonn subspacelocalview.hh:57 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_u_n_b_i_n_d │ │ │ │ │ -void unbind() │ │ │ │ │ -Unbind from the current element. │ │ │ │ │ -DDeeffiinniittiioonn subspacelocalview.hh:93 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_e_l_e_m_e_n_t │ │ │ │ │ -const Element & element() const │ │ │ │ │ -Return the grid element that the view is bound to. │ │ │ │ │ -DDeeffiinniittiioonn subspacelocalview.hh:84 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_g_l_o_b_a_l_B_a_s_i_s__ │ │ │ │ │ -const GlobalBasis * globalBasis_ │ │ │ │ │ -DDeeffiinniittiioonn subspacelocalview.hh:151 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_b_o_u_n_d │ │ │ │ │ -bool bound() const │ │ │ │ │ -Return if the view is bound to a grid element. │ │ │ │ │ -DDeeffiinniittiioonn subspacelocalview.hh:100 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_M_u_l_t_i_I_n_d_e_x │ │ │ │ │ -typename RootLocalView::MultiIndex MultiIndex │ │ │ │ │ -Type used for global numbering of the basis vectors. │ │ │ │ │ -DDeeffiinniittiioonn subspacelocalview.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_s_i_z_e │ │ │ │ │ -size_type size() const │ │ │ │ │ -Total number of degrees of freedom on this element. │ │ │ │ │ -DDeeffiinniittiioonn subspacelocalview.hh:116 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_r_o_o_t_L_o_c_a_l_V_i_e_w__ │ │ │ │ │ -RootLocalView rootLocalView_ │ │ │ │ │ -DDeeffiinniittiioonn subspacelocalview.hh:152 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_b_i_n_d │ │ │ │ │ -void bind(const Element &e) │ │ │ │ │ -Bind the view to a grid element. │ │ │ │ │ -DDeeffiinniittiioonn subspacelocalview.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ -typename GlobalBasis::GridView GridView │ │ │ │ │ -The grid view the global FE basis lives on. │ │ │ │ │ -DDeeffiinniittiioonn subspacelocalview.hh:45 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w │ │ │ │ │ -SubspaceLocalView(const GlobalBasis &globalBasis, const PrefixPath &) │ │ │ │ │ -Construct local view for a given global finite element basis. │ │ │ │ │ -DDeeffiinniittiioonn subspacelocalview.hh:63 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_R_o_o_t_L_o_c_a_l_V_i_e_w │ │ │ │ │ -RLV RootLocalView │ │ │ │ │ -DDeeffiinniittiioonn subspacelocalview.hh:39 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_r_o_o_t_L_o_c_a_l_V_i_e_w │ │ │ │ │ -const RootLocalView & rootLocalView() const │ │ │ │ │ -DDeeffiinniittiioonn subspacelocalview.hh:145 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -The type used for sizes. │ │ │ │ │ -DDeeffiinniittiioonn subspacelocalview.hh:51 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_E_l_e_m_e_n_t │ │ │ │ │ -typename GridView::template Codim< 0 >::Entity Element │ │ │ │ │ -Type of the grid element we are bound to. │ │ │ │ │ -DDeeffiinniittiioonn subspacelocalview.hh:48 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_g_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ -const GlobalBasis & globalBasis() const │ │ │ │ │ -Return the global basis that we are a view on. │ │ │ │ │ -DDeeffiinniittiioonn subspacelocalview.hh:140 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_m_a_x_S_i_z_e │ │ │ │ │ -size_type maxSize() const │ │ │ │ │ -Maximum local size for any element on the GridView. │ │ │ │ │ -DDeeffiinniittiioonn subspacelocalview.hh:127 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_t_r_e_e │ │ │ │ │ -const Tree & tree() const │ │ │ │ │ -Return the local ansatz tree associated to the bound entity. │ │ │ │ │ -DDeeffiinniittiioonn subspacelocalview.hh:109 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_i_n_d_e_x │ │ │ │ │ -MultiIndex index(size_type i) const │ │ │ │ │ -Maps from subtree index set [0..size-1] to a globally unique multi index in │ │ │ │ │ -global basis. │ │ │ │ │ -DDeeffiinniittiioonn subspacelocalview.hh:133 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_:_:_R_o_o_t_T_r_e_e │ │ │ │ │ -typename RootLocalView::Tree RootTree │ │ │ │ │ -Tree of local finite elements / local shape function sets. │ │ │ │ │ -DDeeffiinniittiioonn subspacelocalview.hh:54 │ │ │ │ │ -_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ +Global basis for given pre-basis. │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:50 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s │ │ │ │ │ +A pre-basis for a hierarchical Lagrange basis. │ │ │ │ │ +DDeeffiinniittiioonn hierarchicallagrangebasis.hh:44 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_<_ _G_V_,_ _1_,_ _R_ _>_:_: │ │ │ │ │ +_H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s │ │ │ │ │ +HierarchicalLagrangePreBasis(const GV &gridView) │ │ │ │ │ +DDeeffiinniittiioonn hierarchicallagrangebasis.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_<_ _G_V_,_ _2_,_ _R_ _>_:_: │ │ │ │ │ +_H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s │ │ │ │ │ +HierarchicalLagrangePreBasis(const GV &gridView) │ │ │ │ │ +DDeeffiinniittiioonn hierarchicallagrangebasis.hh:69 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n │ │ │ │ │ +A pre-basis mixin class parametrized with a local finite-element and a DOF │ │ │ │ │ +layout. │ │ │ │ │ +DDeeffiinniittiioonn lfeprebasismixin.hh:57 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00140.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: hierarchicallagrangebasis.hh File Reference │ │ │ │ +dune-functions: flatvectorview.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,60 +70,48 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ Namespaces | │ │ │ │ -Typedefs | │ │ │ │ Functions
│ │ │ │ -
hierarchicallagrangebasis.hh File Reference
│ │ │ │ +
flatvectorview.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ -#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/functions/functionspacebases/lfeprebasismixin.hh>
│ │ │ │ -#include <dune/geometry/type.hh>
│ │ │ │ +
#include <array>
│ │ │ │ +#include <dune/common/concept.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::HierarchicalLagrangePreBasis< GV, 1, R >
 
class  Dune::Functions::HierarchicalLagrangePreBasis< GV, 2, 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.
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<int k, typename R = double>
auto Dune::Functions::BasisFactory::hierarchicalLagrange ()
 A factory that can create a HierarchicalLagrange pre-basis.
 
template<class T >
auto Dune::Functions::flatVectorView (T &t)
 Create flat vector view of passed mutable container.
 
template<class T >
auto Dune::Functions::flatVectorView (const T &t)
 Create flat vector view of passed const container.
 
template<class T >
auto Dune::Functions::flatVectorView (T &&t)
 Create flat vector view of passed container temporary.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,42 +1,35 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -hierarchicallagrangebasis.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_f_e_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ -#include │ │ │ │ │ +_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +flatvectorview.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_<_ _G_V_,_ _1_,_ _R_ _> │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_<_ _G_V_,_ _2_,_ _R_ _> │ │ │ │ │ -  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y │ │ │ │ │ -  │ │ │ │ │ -TTyyppeeddeeffss │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s< │ │ │ │ │ - _H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s< GV, k, R > > │ │ │ │ │ -  Basis of a scalar Hierarchical Lagrange finite element space. │ │ │ │ │ -  │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_h_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e () │ │ │ │ │ -  A factory that can create a HierarchicalLagrange pre-basis. │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_l_a_t_V_e_c_t_o_r_V_i_e_w (T &t) │ │ │ │ │ +  Create flat vector view of passed mutable container. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_l_a_t_V_e_c_t_o_r_V_i_e_w (const T &t) │ │ │ │ │ +  Create flat vector view of passed const container. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_l_a_t_V_e_c_t_o_r_V_i_e_w (T &&t) │ │ │ │ │ +  Create flat vector view of passed container temporary. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00140_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: hierarchicallagrangebasis.hh Source File │ │ │ │ +dune-functions: flatvectorview.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,128 +74,219 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
hierarchicallagrangebasis.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICALLAGRANGEBASIS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICALLAGRANGEBASIS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATVECTORVIEW_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATVECTORVIEW_HH
│ │ │ │
9
│ │ │ │ -
10#include <type_traits>
│ │ │ │ -
11
│ │ │ │ -
12#include <dune/common/exceptions.hh>
│ │ │ │ -
13
│ │ │ │ -
14#include <dune/localfunctions/hierarchical/hierarchicalp2.hh>
│ │ │ │ -
15
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +
10
│ │ │ │ +
11#include <array>
│ │ │ │ +
12
│ │ │ │ +
13#include <dune/common/concept.hh>
│ │ │ │ +
14#include <dune/common/hybridutilities.hh>
│ │ │ │ +
15#include <dune/common/indices.hh>
│ │ │ │ +
16
│ │ │ │ + │ │ │ │ +
18
│ │ │ │
19
│ │ │ │ -
20#include <dune/geometry/type.hh>
│ │ │ │ +
20
│ │ │ │
21
│ │ │ │
22namespace Dune {
│ │ │ │ -
23 namespace Functions {
│ │ │ │ -
24
│ │ │ │ -
25 // *****************************************************************************
│ │ │ │ -
26 // Implementation for Hierarchical Lagrange Basis
│ │ │ │ -
27 //
│ │ │ │ -
28 // - only orders k=1,2 are implemented up to now
│ │ │ │ -
29 // - order k=1 is identical to the standard Lagrange basis
│ │ │ │ -
30 // - implementation is restricted to simplex grids
│ │ │ │ -
31 //
│ │ │ │ -
32 // *****************************************************************************
│ │ │ │ -
33
│ │ │ │ -
43 template<typename GV, int k, typename R = double>
│ │ │ │ - │ │ │ │ -
45
│ │ │ │ -
46 template<typename GV, typename R>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
48 : public LFEPreBasisMixin<GV, LagrangeSimplexLocalFiniteElement<typename GV::ctype,R,GV::dimension,1>>
│ │ │ │ -
49 {
│ │ │ │ - │ │ │ │ -
51 public:
│ │ │ │ -
│ │ │ │ -
52 HierarchicalLagrangePreBasis (const GV& gridView) :
│ │ │ │ -
53 Base(gridView, [](GeometryType gt, int) -> std::size_t { return gt.isVertex() ? 1 : 0; })
│ │ │ │ -
54 {
│ │ │ │ -
55 for (auto gt : gridView.indexSet().types(0)) {
│ │ │ │ -
56 if (!gt.isSimplex())
│ │ │ │ -
57 DUNE_THROW(Dune::NotImplemented,
│ │ │ │ -
58 "Hierarchical Lagrange basis only implemented for simplex grids.");
│ │ │ │ -
59 }
│ │ │ │ -
60 }
│ │ │ │ -
│ │ │ │ -
61 };
│ │ │ │ -
│ │ │ │ +
23namespace Functions {
│ │ │ │ +
24namespace Impl {
│ │ │ │ +
25
│ │ │ │ +
26
│ │ │ │ +
27template<class V>
│ │ │ │ +
28struct FlatVectorBackend
│ │ │ │ +
29{
│ │ │ │ +
30
│ │ │ │ +
31 template<class VV, class Index,
│ │ │ │ +
32 std::enable_if_t< models<Concept::HasIndexAccess, VV, Index>(), int> = 0>
│ │ │ │ +
33 static decltype(auto) getEntry(VV&& v, const Index& i)
│ │ │ │ +
34 {
│ │ │ │ +
35 return v[i];
│ │ │ │ +
36 }
│ │ │ │ +
37
│ │ │ │ +
38 template<class VV, class Index,
│ │ │ │ +
39 std::enable_if_t< not models<Concept::HasIndexAccess, VV, Index>(), int> = 0>
│ │ │ │ +
40 static decltype(auto) getEntry(VV&& v, const Index&)
│ │ │ │ +
41 {
│ │ │ │ +
42 return std::forward<VV>(v);
│ │ │ │ +
43 }
│ │ │ │ +
44
│ │ │ │ +
45 template<class VV,
│ │ │ │ +
46 std::enable_if_t< models<Concept::HasSizeMethod, VV>(), int> = 0>
│ │ │ │ +
47 static auto size(VV&& v)
│ │ │ │ +
48 {
│ │ │ │ +
49 return Dune::Hybrid::size(v);
│ │ │ │ +
50 }
│ │ │ │ +
51
│ │ │ │ +
52 template<class VV,
│ │ │ │ +
53 std::enable_if_t< not models<Concept::HasSizeMethod, VV>(), int>type = 0>
│ │ │ │ +
54 static auto size(VV&&)
│ │ │ │ +
55 {
│ │ │ │ +
56 return Dune::index_constant<1>{};
│ │ │ │ +
57 }
│ │ │ │ +
58};
│ │ │ │ +
59
│ │ │ │ +
60
│ │ │ │ +
61
│ │ │ │
62
│ │ │ │ -
63 template<typename GV, typename R>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
65 : public LFEPreBasisMixin<GV, HierarchicalP2LocalFiniteElement<typename GV::ctype,R,GV::dimension>>
│ │ │ │ -
66 {
│ │ │ │ - │ │ │ │ -
68 public:
│ │ │ │ -
│ │ │ │ -
69 HierarchicalLagrangePreBasis (const GV& gridView) :
│ │ │ │ -
70 Base(gridView, [](GeometryType gt, int) -> std::size_t { return (gt.isVertex() || gt.isLine()) ? 1 : 0; })
│ │ │ │ -
71 {
│ │ │ │ -
72 for (auto gt : gridView.indexSet().types(0)) {
│ │ │ │ -
73 if (!gt.isSimplex())
│ │ │ │ -
74 DUNE_THROW(Dune::NotImplemented,
│ │ │ │ -
75 "Hierarchical Lagrange basis only implemented for simplex grids.");
│ │ │ │ -
76 }
│ │ │ │ -
77 }
│ │ │ │ -
│ │ │ │ -
78 };
│ │ │ │ -
│ │ │ │ +
63template<class K, int n, int m>
│ │ │ │ +
64struct FlatVectorBackend<typename Dune::FieldMatrix<K, n, m> >
│ │ │ │ +
65{
│ │ │ │ +
66
│ │ │ │ +
67 template<class VV, class Index>
│ │ │ │ +
68 static decltype(auto) getEntry(VV&& v, const Index& i)
│ │ │ │ +
69 {
│ │ │ │ +
70 return v[i/m][i%m];
│ │ │ │ +
71 }
│ │ │ │ +
72
│ │ │ │ +
73 template<class VV>
│ │ │ │ +
74 static auto size(VV&& v)
│ │ │ │ +
75 {
│ │ │ │ +
76 return Dune::index_constant<n*m>{};
│ │ │ │ +
77 }
│ │ │ │ +
78};
│ │ │ │
79
│ │ │ │
80
│ │ │ │ -
81 namespace BasisFactory {
│ │ │ │ -
82
│ │ │ │ -
91 template<int k, typename R=double>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
93 {
│ │ │ │ -
94 static_assert(0 < k && k <= 2);
│ │ │ │ -
95 return [](const auto& gridView) {
│ │ │ │ -
96 return HierarchicalLagrangePreBasis<std::decay_t<decltype(gridView)>, k, R>(gridView);
│ │ │ │ -
97 };
│ │ │ │ -
98 }
│ │ │ │ -
│ │ │ │ +
81
│ │ │ │ +
82template<class K, std::size_t n>
│ │ │ │ +
83struct FlatVectorBackend< std::array<K, n> >
│ │ │ │ +
84{
│ │ │ │ +
85
│ │ │ │ +
86 template<class VV, class Index>
│ │ │ │ +
87 static decltype(auto) getEntry(VV&& v, const Index& i)
│ │ │ │ +
88 {
│ │ │ │ +
89 const auto innerSize = decltype(FlatVectorBackend<K>::size(v[0]))::value;
│ │ │ │ +
90 return FlatVectorBackend<K>::getEntry(v[i/innerSize], i%innerSize);
│ │ │ │ +
91 }
│ │ │ │ +
92
│ │ │ │ +
93 template<class VV>
│ │ │ │ +
94 static auto size(VV&& v)
│ │ │ │ +
95 {
│ │ │ │ +
96 const auto innerSize = decltype(FlatVectorBackend<K>::size(v[0]))::value;
│ │ │ │ +
97 return Dune::index_constant<n*innerSize>{};
│ │ │ │ +
98 }
│ │ │ │
99
│ │ │ │ -
100 } // end namespace BasisFactory
│ │ │ │ +
100};
│ │ │ │
101
│ │ │ │ -
112 template<typename GV, int k, typename R=double>
│ │ │ │ - │ │ │ │ -
114
│ │ │ │ -
115 } // end namespace Functions
│ │ │ │ -
116} // end namespace Dune
│ │ │ │ -
117
│ │ │ │ -
118#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICALLAGRANGEBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
auto hierarchicalLagrange()
A factory that can create a HierarchicalLagrange pre-basis.
Definition hierarchicallagrangebasis.hh:92
│ │ │ │ +
102
│ │ │ │ +
103
│ │ │ │ +
104
│ │ │ │ +
105template<class T>
│ │ │ │ +
106class FlatVectorView
│ │ │ │ +
107{
│ │ │ │ +
108 using Backend = FlatVectorBackend<std::decay_t<T>>;
│ │ │ │ +
109public:
│ │ │ │ +
110 FlatVectorView(T& t) :
│ │ │ │ +
111 t_(&t)
│ │ │ │ +
112 {}
│ │ │ │ +
113
│ │ │ │ +
114 auto size() const
│ │ │ │ +
115 {
│ │ │ │ +
116 return Backend::size(*t_);
│ │ │ │ +
117 }
│ │ │ │ +
118
│ │ │ │ +
119 template<class Index>
│ │ │ │ +
120 decltype(auto) operator[](const Index& i) const
│ │ │ │ +
121 {
│ │ │ │ +
122 return Backend::getEntry(*t_, i);
│ │ │ │ +
123 }
│ │ │ │ +
124
│ │ │ │ +
125 template<class Index>
│ │ │ │ +
126 decltype(auto) operator[](const Index& i)
│ │ │ │ +
127 {
│ │ │ │ +
128 return Backend::getEntry(*t_, i);
│ │ │ │ +
129 }
│ │ │ │ +
130
│ │ │ │ +
131private:
│ │ │ │ +
132 T* t_;
│ │ │ │ +
133};
│ │ │ │ +
134
│ │ │ │ +
135
│ │ │ │ +
136template<class T>
│ │ │ │ +
137class FlatVectorView<T&&>
│ │ │ │ +
138{
│ │ │ │ +
139 using Backend = FlatVectorBackend<std::decay_t<T>>;
│ │ │ │ +
140public:
│ │ │ │ +
141 FlatVectorView(T&& t) :
│ │ │ │ +
142 t_(std::move(t))
│ │ │ │ +
143 {}
│ │ │ │ +
144
│ │ │ │ +
145 auto size() const
│ │ │ │ +
146 {
│ │ │ │ +
147 return Backend::size(t_);
│ │ │ │ +
148 }
│ │ │ │ +
149
│ │ │ │ +
150 template<class Index>
│ │ │ │ +
151 decltype(auto) operator[](const Index& i) const
│ │ │ │ +
152 {
│ │ │ │ +
153 return Backend::getEntry(t_, i);
│ │ │ │ +
154 }
│ │ │ │ +
155
│ │ │ │ +
156 template<class Index>
│ │ │ │ +
157 decltype(auto) operator[](const Index& i)
│ │ │ │ +
158 {
│ │ │ │ +
159 return Backend::getEntry(t_, i);
│ │ │ │ +
160 }
│ │ │ │ +
161
│ │ │ │ +
162private:
│ │ │ │ +
163 T t_;
│ │ │ │ +
164};
│ │ │ │ +
165
│ │ │ │ +
166} // namespace Impl
│ │ │ │ +
167
│ │ │ │ +
168
│ │ │ │ +
169
│ │ │ │ +
182template<class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
184{
│ │ │ │ +
185 return Impl::FlatVectorView<T>(t);
│ │ │ │ +
186}
│ │ │ │ +
│ │ │ │ +
187
│ │ │ │ +
200template<class T>
│ │ │ │ +
│ │ │ │ +
201auto flatVectorView(const T& t)
│ │ │ │ +
202{
│ │ │ │ +
203 return Impl::FlatVectorView<const T>(t);
│ │ │ │ +
204}
│ │ │ │ +
│ │ │ │ +
205
│ │ │ │ +
218template<class T>
│ │ │ │ +
│ │ │ │ +
219auto flatVectorView(T&& t)
│ │ │ │ +
220{
│ │ │ │ +
221 return Impl::FlatVectorView<T&&>(std::move(t));
│ │ │ │ +
222}
│ │ │ │ +
│ │ │ │ +
223
│ │ │ │ +
224
│ │ │ │ +
225} // namespace Dune::Functions
│ │ │ │ +
226} // namespace Dune
│ │ │ │ +
227
│ │ │ │ +
228
│ │ │ │ +
229#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATVECTORVIEW_HH
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
Global basis for given pre-basis.
Definition defaultglobalbasis.hh:50
│ │ │ │ -
A pre-basis for a hierarchical Lagrange basis.
Definition hierarchicallagrangebasis.hh:44
│ │ │ │ -
HierarchicalLagrangePreBasis(const GV &gridView)
Definition hierarchicallagrangebasis.hh:52
│ │ │ │ -
HierarchicalLagrangePreBasis(const GV &gridView)
Definition hierarchicallagrangebasis.hh:69
│ │ │ │ -
A pre-basis mixin class parametrized with a local finite-element and a DOF layout.
Definition lfeprebasismixin.hh:57
│ │ │ │ +
auto flatVectorView(T &t)
Create flat vector view of passed mutable container.
Definition flatvectorview.hh:183
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,141 +1,214 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -hierarchicallagrangebasis.hh │ │ │ │ │ +flatvectorview.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICALLAGRANGEBASIS_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICALLAGRANGEBASIS_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATVECTORVIEW_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATVECTORVIEW_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11 │ │ │ │ │ -12#include │ │ │ │ │ -13 │ │ │ │ │ -14#include │ │ │ │ │ -15 │ │ │ │ │ -16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ -17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ -18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_f_e_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ +10 │ │ │ │ │ +11#include │ │ │ │ │ +12 │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16 │ │ │ │ │ +17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +18 │ │ │ │ │ 19 │ │ │ │ │ -20#include │ │ │ │ │ +20 │ │ │ │ │ 21 │ │ │ │ │ 22namespace _D_u_n_e { │ │ │ │ │ -23 namespace Functions { │ │ │ │ │ -24 │ │ │ │ │ -25 / │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ -26 // Implementation for Hierarchical Lagrange Basis │ │ │ │ │ -27 // │ │ │ │ │ -28 // - only orders k=1,2 are implemented up to now │ │ │ │ │ -29 // - order k=1 is identical to the standard Lagrange basis │ │ │ │ │ -30 // - implementation is restricted to simplex grids │ │ │ │ │ -31 // │ │ │ │ │ -32 / │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ -33 │ │ │ │ │ -43 template │ │ │ │ │ -_4_4 class _H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s; │ │ │ │ │ -45 │ │ │ │ │ -46 template │ │ │ │ │ -_4_7 class _H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s │ │ │ │ │ -48 : public _L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n> │ │ │ │ │ -49 { │ │ │ │ │ -50 using _B_a_s_e = _L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_<_G_V_,_ _L_a_g_r_a_n_g_e_S_i_m_p_l_e_x_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_<_t_y_p_e_n_a_m_e │ │ │ │ │ -_G_V_:_:_c_t_y_p_e_,_R_,_G_V_:_:_d_i_m_e_n_s_i_o_n_,_1_>>; │ │ │ │ │ -51 public: │ │ │ │ │ -_5_2 _H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s (const GV& gridView) : │ │ │ │ │ -53 _B_a_s_e(gridView, [](GeometryType gt, int) -> std::size_t { return gt.isVertex │ │ │ │ │ -() ? 1 : 0; }) │ │ │ │ │ -54 { │ │ │ │ │ -55 for (auto gt : gridView.indexSet().types(0)) { │ │ │ │ │ -56 if (!gt.isSimplex()) │ │ │ │ │ -57 DUNE_THROW(Dune::NotImplemented, │ │ │ │ │ -58 "Hierarchical Lagrange basis only implemented for simplex grids."); │ │ │ │ │ -59 } │ │ │ │ │ -60 } │ │ │ │ │ -61 }; │ │ │ │ │ +23namespace Functions { │ │ │ │ │ +24namespace Impl { │ │ │ │ │ +25 │ │ │ │ │ +26 │ │ │ │ │ +27template │ │ │ │ │ +28struct FlatVectorBackend │ │ │ │ │ +29{ │ │ │ │ │ +30 │ │ │ │ │ +31 template(), int> = 0> │ │ │ │ │ +33 static decltype(auto) getEntry(VV&& v, const Index& i) │ │ │ │ │ +34 { │ │ │ │ │ +35 return v[i]; │ │ │ │ │ +36 } │ │ │ │ │ +37 │ │ │ │ │ +38 template(), int> = │ │ │ │ │ +0> │ │ │ │ │ +40 static decltype(auto) getEntry(VV&& v, const Index&) │ │ │ │ │ +41 { │ │ │ │ │ +42 return std::forward(v); │ │ │ │ │ +43 } │ │ │ │ │ +44 │ │ │ │ │ +45 template(), int> = 0> │ │ │ │ │ +47 static auto size(VV&& v) │ │ │ │ │ +48 { │ │ │ │ │ +49 return Dune::Hybrid::size(v); │ │ │ │ │ +50 } │ │ │ │ │ +51 │ │ │ │ │ +52 template(), int>type = 0> │ │ │ │ │ +54 static auto size(VV&&) │ │ │ │ │ +55 { │ │ │ │ │ +56 return Dune::index_constant<1>{}; │ │ │ │ │ +57 } │ │ │ │ │ +58}; │ │ │ │ │ +59 │ │ │ │ │ +60 │ │ │ │ │ +61 │ │ │ │ │ 62 │ │ │ │ │ -63 template │ │ │ │ │ -_6_4 class _H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s │ │ │ │ │ -65 : public _L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n> │ │ │ │ │ -66 { │ │ │ │ │ -67 using _B_a_s_e = _L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_<_G_V_,_ _H_i_e_r_a_r_c_h_i_c_a_l_P_2_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_<_t_y_p_e_n_a_m_e │ │ │ │ │ -_G_V_:_:_c_t_y_p_e_,_R_,_G_V_:_:_d_i_m_e_n_s_i_o_n_>>; │ │ │ │ │ -68 public: │ │ │ │ │ -_6_9 _H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s (const GV& gridView) : │ │ │ │ │ -70 _B_a_s_e(gridView, [](GeometryType gt, int) -> std::size_t { return (gt.isVertex │ │ │ │ │ -() || gt.isLine()) ? 1 : 0; }) │ │ │ │ │ -71 { │ │ │ │ │ -72 for (auto gt : gridView.indexSet().types(0)) { │ │ │ │ │ -73 if (!gt.isSimplex()) │ │ │ │ │ -74 DUNE_THROW(Dune::NotImplemented, │ │ │ │ │ -75 "Hierarchical Lagrange basis only implemented for simplex grids."); │ │ │ │ │ -76 } │ │ │ │ │ +63template │ │ │ │ │ +64struct FlatVectorBackend > │ │ │ │ │ +65{ │ │ │ │ │ +66 │ │ │ │ │ +67 template │ │ │ │ │ +68 static decltype(auto) getEntry(VV&& v, const Index& i) │ │ │ │ │ +69 { │ │ │ │ │ +70 return v[i/m][i%m]; │ │ │ │ │ +71 } │ │ │ │ │ +72 │ │ │ │ │ +73 template │ │ │ │ │ +74 static auto size(VV&& v) │ │ │ │ │ +75 { │ │ │ │ │ +76 return Dune::index_constant{}; │ │ │ │ │ 77 } │ │ │ │ │ -78 }; │ │ │ │ │ +78}; │ │ │ │ │ 79 │ │ │ │ │ 80 │ │ │ │ │ -81 namespace BasisFactory { │ │ │ │ │ -82 │ │ │ │ │ -91 template │ │ │ │ │ -_9_2 auto _h_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e() │ │ │ │ │ -93 { │ │ │ │ │ -94 static_assert(0 < k && k <= 2); │ │ │ │ │ -95 return [](const auto& gridView) { │ │ │ │ │ -96 return _H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s, k, R> │ │ │ │ │ -(gridView); │ │ │ │ │ -97 }; │ │ │ │ │ +81 │ │ │ │ │ +82template │ │ │ │ │ +83struct FlatVectorBackend< std::array > │ │ │ │ │ +84{ │ │ │ │ │ +85 │ │ │ │ │ +86 template │ │ │ │ │ +87 static decltype(auto) getEntry(VV&& v, const Index& i) │ │ │ │ │ +88 { │ │ │ │ │ +89 const auto innerSize = decltype(FlatVectorBackend::size(v[0]))::value; │ │ │ │ │ +90 return FlatVectorBackend::getEntry(v[i/innerSize], i%innerSize); │ │ │ │ │ +91 } │ │ │ │ │ +92 │ │ │ │ │ +93 template │ │ │ │ │ +94 static auto size(VV&& v) │ │ │ │ │ +95 { │ │ │ │ │ +96 const auto innerSize = decltype(FlatVectorBackend::size(v[0]))::value; │ │ │ │ │ +97 return Dune::index_constant{}; │ │ │ │ │ 98 } │ │ │ │ │ 99 │ │ │ │ │ -100 } // end namespace BasisFactory │ │ │ │ │ +100}; │ │ │ │ │ 101 │ │ │ │ │ -112 template │ │ │ │ │ -_1_1_3 using _H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_B_a_s_i_s = │ │ │ │ │ -_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_<_H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_<_G_V_,_ _k_,_ _R_> >; │ │ │ │ │ -114 │ │ │ │ │ -115 } // end namespace Functions │ │ │ │ │ -116} // end namespace Dune │ │ │ │ │ -117 │ │ │ │ │ -118#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICALLAGRANGEBASIS_HH │ │ │ │ │ -_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h │ │ │ │ │ -_l_f_e_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h │ │ │ │ │ -_n_o_d_e_s_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_h_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e │ │ │ │ │ -auto hierarchicalLagrange() │ │ │ │ │ -A factory that can create a HierarchicalLagrange pre-basis. │ │ │ │ │ -DDeeffiinniittiioonn hierarchicallagrangebasis.hh:92 │ │ │ │ │ +102 │ │ │ │ │ +103 │ │ │ │ │ +104 │ │ │ │ │ +105template │ │ │ │ │ +106class FlatVectorView │ │ │ │ │ +107{ │ │ │ │ │ +108 using Backend = FlatVectorBackend>; │ │ │ │ │ +109public: │ │ │ │ │ +110 FlatVectorView(T& t) : │ │ │ │ │ +111 t_(&t) │ │ │ │ │ +112 {} │ │ │ │ │ +113 │ │ │ │ │ +114 auto size() const │ │ │ │ │ +115 { │ │ │ │ │ +116 return Backend::size(*t_); │ │ │ │ │ +117 } │ │ │ │ │ +118 │ │ │ │ │ +119 template │ │ │ │ │ +120 decltype(auto) operator[](const Index& i) const │ │ │ │ │ +121 { │ │ │ │ │ +122 return Backend::getEntry(*t_, i); │ │ │ │ │ +123 } │ │ │ │ │ +124 │ │ │ │ │ +125 template │ │ │ │ │ +126 decltype(auto) operator[](const Index& i) │ │ │ │ │ +127 { │ │ │ │ │ +128 return Backend::getEntry(*t_, i); │ │ │ │ │ +129 } │ │ │ │ │ +130 │ │ │ │ │ +131private: │ │ │ │ │ +132 T* t_; │ │ │ │ │ +133}; │ │ │ │ │ +134 │ │ │ │ │ +135 │ │ │ │ │ +136template │ │ │ │ │ +137class FlatVectorView │ │ │ │ │ +138{ │ │ │ │ │ +139 using Backend = FlatVectorBackend>; │ │ │ │ │ +140public: │ │ │ │ │ +141 FlatVectorView(T&& t) : │ │ │ │ │ +142 t_(std::move(t)) │ │ │ │ │ +143 {} │ │ │ │ │ +144 │ │ │ │ │ +145 auto size() const │ │ │ │ │ +146 { │ │ │ │ │ +147 return Backend::size(t_); │ │ │ │ │ +148 } │ │ │ │ │ +149 │ │ │ │ │ +150 template │ │ │ │ │ +151 decltype(auto) operator[](const Index& i) const │ │ │ │ │ +152 { │ │ │ │ │ +153 return Backend::getEntry(t_, i); │ │ │ │ │ +154 } │ │ │ │ │ +155 │ │ │ │ │ +156 template │ │ │ │ │ +157 decltype(auto) operator[](const Index& i) │ │ │ │ │ +158 { │ │ │ │ │ +159 return Backend::getEntry(t_, i); │ │ │ │ │ +160 } │ │ │ │ │ +161 │ │ │ │ │ +162private: │ │ │ │ │ +163 T t_; │ │ │ │ │ +164}; │ │ │ │ │ +165 │ │ │ │ │ +166} // namespace Impl │ │ │ │ │ +167 │ │ │ │ │ +168 │ │ │ │ │ +169 │ │ │ │ │ +182template │ │ │ │ │ +_1_8_3auto _f_l_a_t_V_e_c_t_o_r_V_i_e_w(T& t) │ │ │ │ │ +184{ │ │ │ │ │ +185 return Impl::FlatVectorView(t); │ │ │ │ │ +186} │ │ │ │ │ +187 │ │ │ │ │ +200template │ │ │ │ │ +_2_0_1auto _f_l_a_t_V_e_c_t_o_r_V_i_e_w(const T& t) │ │ │ │ │ +202{ │ │ │ │ │ +203 return Impl::FlatVectorView(t); │ │ │ │ │ +204} │ │ │ │ │ +205 │ │ │ │ │ +218template │ │ │ │ │ +_2_1_9auto _f_l_a_t_V_e_c_t_o_r_V_i_e_w(T&& t) │ │ │ │ │ +220{ │ │ │ │ │ +221 return Impl::FlatVectorView(std::move(t)); │ │ │ │ │ +222} │ │ │ │ │ +223 │ │ │ │ │ +224 │ │ │ │ │ +225} // namespace Dune::Functions │ │ │ │ │ +226} // namespace Dune │ │ │ │ │ +227 │ │ │ │ │ +228 │ │ │ │ │ +229#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATVECTORVIEW_HH │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ -Global basis for given pre-basis. │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:50 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s │ │ │ │ │ -A pre-basis for a hierarchical Lagrange basis. │ │ │ │ │ -DDeeffiinniittiioonn hierarchicallagrangebasis.hh:44 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_<_ _G_V_,_ _1_,_ _R_ _>_:_: │ │ │ │ │ -_H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s │ │ │ │ │ -HierarchicalLagrangePreBasis(const GV &gridView) │ │ │ │ │ -DDeeffiinniittiioonn hierarchicallagrangebasis.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_<_ _G_V_,_ _2_,_ _R_ _>_:_: │ │ │ │ │ -_H_i_e_r_a_r_c_h_i_c_a_l_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s │ │ │ │ │ -HierarchicalLagrangePreBasis(const GV &gridView) │ │ │ │ │ -DDeeffiinniittiioonn hierarchicallagrangebasis.hh:69 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n │ │ │ │ │ -A pre-basis mixin class parametrized with a local finite-element and a DOF │ │ │ │ │ -layout. │ │ │ │ │ -DDeeffiinniittiioonn lfeprebasismixin.hh:57 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_l_a_t_V_e_c_t_o_r_V_i_e_w │ │ │ │ │ +auto flatVectorView(T &t) │ │ │ │ │ +Create flat vector view of passed mutable container. │ │ │ │ │ +DDeeffiinniittiioonn flatvectorview.hh:183 │ │ │ │ │ +_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00143.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: subentitydofs.hh File Reference │ │ │ │ +dune-functions: flatmultiindex.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,53 +70,37 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ Namespaces | │ │ │ │ -Functions
│ │ │ │ -
subentitydofs.hh File Reference
│ │ │ │ +Typedefs
│ │ │ │ +
flatmultiindex.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <vector>
│ │ │ │ -#include <dune/geometry/referenceelements.hh>
│ │ │ │ -#include <dune/typetree/traversal.hh>
│ │ │ │ +
#include <array>
│ │ │ │ +#include <dune/functions/common/multiindex.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::Functions::SubEntityDOFs< GridView >
 Range of DOFs associated to sub-entity. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ -Functions

template<class T >
auto Dune::Functions::subEntityDOFs (const T &)
 Create SubEntityDOFs object.
 
template<class LocalView >
auto Dune::Functions::subEntityDOFs (const LocalView &localView, std::size_t subEntityIndex, std::size_t subEntityCodim)
 Create bound SubEntityDOFs object.
 
template<class LocalView , class Intersection >
auto Dune::Functions::subEntityDOFs (const LocalView &localView, const Intersection &intersection)
 Create bound SubEntityDOFs object.
 

│ │ │ │ +Typedefs

template<class size_type >
using Dune::Functions::FlatMultiIndex = StaticMultiIndex< size_type, 1 >
 A multi-index class with only one level.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,39 +1,24 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -subentitydofs.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +_N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s │ │ │ │ │ +flatmultiindex.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_m_u_l_t_i_i_n_d_e_x_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_E_n_t_i_t_y_D_O_F_s_<_ _G_r_i_d_V_i_e_w_ _> │ │ │ │ │ -  Range of DOFs associated to sub-entity. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_u_b_E_n_t_i_t_y_D_O_F_s (const T &) │ │ │ │ │ -  Create _S_u_b_E_n_t_i_t_y_D_O_F_s object. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_u_b_E_n_t_i_t_y_D_O_F_s (const LocalView &localView, std::size_t │ │ │ │ │ - subEntityIndex, std::size_t subEntityCodim) │ │ │ │ │ -  Create bound _S_u_b_E_n_t_i_t_y_D_O_F_s object. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_u_b_E_n_t_i_t_y_D_O_F_s (const LocalView &localView, const │ │ │ │ │ - Intersection &intersection) │ │ │ │ │ -  Create bound _S_u_b_E_n_t_i_t_y_D_O_F_s object. │ │ │ │ │ +TTyyppeeddeeffss │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_F_l_a_t_M_u_l_t_i_I_n_d_e_x = _S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x< size_type, 1 > │ │ │ │ │ +  A multi-index class with only one level. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00143_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: subentitydofs.hh Source File │ │ │ │ +dune-functions: flatmultiindex.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,174 +74,48 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
subentitydofs.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBENTITYDOFS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBENTITYDOFS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATMULTIINDEX_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATMULTIINDEX_HH
│ │ │ │
9
│ │ │ │ -
10#include <vector>
│ │ │ │ +
10#include <array>
│ │ │ │
11
│ │ │ │ -
12#include <dune/geometry/referenceelements.hh>
│ │ │ │ -
13#include <dune/typetree/traversal.hh>
│ │ │ │ -
14
│ │ │ │ -
15
│ │ │ │ + │ │ │ │ +
13
│ │ │ │ +
14namespace Dune {
│ │ │ │ +
15namespace Functions {
│ │ │ │
16
│ │ │ │ -
17namespace Dune {
│ │ │ │ -
18namespace Functions {
│ │ │ │ -
19
│ │ │ │ -
20
│ │ │ │ -
21
│ │ │ │ -
44template<class GridView>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
46{
│ │ │ │ -
47 static const int dim = GridView::dimension;
│ │ │ │ -
48
│ │ │ │ -
49public:
│ │ │ │ -
50
│ │ │ │ -
67 template<class LocalView>
│ │ │ │ -
│ │ │ │ -
68 SubEntityDOFs& bind(const LocalView& localView, std::size_t subEntityIndex, std::size_t subEntityCodim)
│ │ │ │ -
69 {
│ │ │ │ -
70 // fill vector with local indices of all DOFs contained in subentity
│ │ │ │ -
71 containedDOFs_.clear();
│ │ │ │ -
72 dofIsContained_.assign(localView.size(), false);
│ │ │ │ -
73
│ │ │ │ -
74 auto re = Dune::referenceElement<double,dim>(localView.element().type());
│ │ │ │ -
75
│ │ │ │ -
76 Dune::TypeTree::forEachLeafNode(localView.tree(), [&](auto&& node, auto&& /*treePath*/) {
│ │ │ │ -
77 const auto& localCoefficients = node.finiteElement().localCoefficients();
│ │ │ │ -
78 std::size_t localSize = localCoefficients.size();
│ │ │ │ -
79 for(std::size_t i=0; i<localSize; ++i)
│ │ │ │ -
80 {
│ │ │ │ -
81 auto localKey = localCoefficients.localKey(i);
│ │ │ │ -
82 if (re.subEntities(subEntityIndex, subEntityCodim, localKey.codim()).contains(localKey.subEntity()))
│ │ │ │ -
83 {
│ │ │ │ -
84 containedDOFs_.push_back(node.localIndex(i));
│ │ │ │ -
85 dofIsContained_[node.localIndex(i)] = true;
│ │ │ │ -
86 }
│ │ │ │ -
87 }
│ │ │ │ -
88 });
│ │ │ │ -
89 return *this;
│ │ │ │ -
90 }
│ │ │ │ -
│ │ │ │ -
91
│ │ │ │ -
107 template<class LocalView, class Intersection>
│ │ │ │ -
│ │ │ │ -
108 SubEntityDOFs& bind(const LocalView& localView, const Intersection& intersection)
│ │ │ │ -
109 {
│ │ │ │ -
110 return bind(localView, intersection.indexInInside(), 1);
│ │ │ │ -
111 }
│ │ │ │ -
│ │ │ │ -
112
│ │ │ │ -
│ │ │ │ -
114 auto begin() const
│ │ │ │ -
115 {
│ │ │ │ -
116 return containedDOFs_.cbegin();
│ │ │ │ -
117 }
│ │ │ │ -
│ │ │ │ -
118
│ │ │ │ -
│ │ │ │ -
120 auto end() const
│ │ │ │ -
121 {
│ │ │ │ -
122 return containedDOFs_.cend();
│ │ │ │ -
123 }
│ │ │ │ -
│ │ │ │ -
124
│ │ │ │ -
│ │ │ │ -
126 auto size() const
│ │ │ │ -
127 {
│ │ │ │ -
128 return containedDOFs_.size();
│ │ │ │ -
129 }
│ │ │ │ -
│ │ │ │ -
130
│ │ │ │ -
│ │ │ │ -
132 decltype(auto) operator[](std::size_t i) const
│ │ │ │ -
133 {
│ │ │ │ -
134 return containedDOFs_[i];
│ │ │ │ -
135 }
│ │ │ │ -
│ │ │ │ -
136
│ │ │ │ -
│ │ │ │ -
138 bool contains(std::size_t localIndex) const
│ │ │ │ -
139 {
│ │ │ │ -
140 return dofIsContained_[localIndex];
│ │ │ │ -
141 }
│ │ │ │ -
│ │ │ │ -
142
│ │ │ │ -
143private:
│ │ │ │ -
144
│ │ │ │ -
145 std::vector<std::size_t> containedDOFs_;
│ │ │ │ -
146 std::vector<bool> dofIsContained_;
│ │ │ │ -
147};
│ │ │ │ -
│ │ │ │ -
148
│ │ │ │ -
149
│ │ │ │ -
150
│ │ │ │ -
163template<class T>
│ │ │ │ -
│ │ │ │ -
164auto subEntityDOFs(const T&)
│ │ │ │ -
165{
│ │ │ │ - │ │ │ │ -
167}
│ │ │ │ -
│ │ │ │ -
168
│ │ │ │ -
169
│ │ │ │ -
170
│ │ │ │ -
190template<class LocalView>
│ │ │ │ -
│ │ │ │ -
191auto subEntityDOFs(const LocalView& localView, std::size_t subEntityIndex, std::size_t subEntityCodim)
│ │ │ │ -
192{
│ │ │ │ -
193 using GridView = typename LocalView::GridView;
│ │ │ │ - │ │ │ │ -
195 subEntityDOFs.bind(localView, subEntityIndex, subEntityCodim);
│ │ │ │ -
196 return subEntityDOFs;
│ │ │ │ -
197}
│ │ │ │ -
│ │ │ │ -
198
│ │ │ │ -
199
│ │ │ │ -
200
│ │ │ │ -
219template<class LocalView, class Intersection>
│ │ │ │ -
│ │ │ │ -
220auto subEntityDOFs(const LocalView& localView, const Intersection& intersection)
│ │ │ │ -
221{
│ │ │ │ -
222 using GridView = typename LocalView::GridView;
│ │ │ │ - │ │ │ │ -
224 subEntityDOFs.bind(localView, intersection);
│ │ │ │ -
225 return subEntityDOFs;
│ │ │ │ -
226}
│ │ │ │ -
│ │ │ │ -
227
│ │ │ │ -
228
│ │ │ │ -
229
│ │ │ │ -
230} // namespace Functions
│ │ │ │ -
231} // namespace Dune
│ │ │ │ -
232
│ │ │ │ -
233#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBENTITYDOFS_HH
│ │ │ │ -
auto subEntityDOFs(const T &)
Create SubEntityDOFs object.
Definition subentitydofs.hh:164
│ │ │ │ +
17
│ │ │ │ +
18
│ │ │ │ +
34template<class size_type>
│ │ │ │ + │ │ │ │ +
36
│ │ │ │ +
37
│ │ │ │ +
38
│ │ │ │ +
39} // end namespace Functions
│ │ │ │ +
40} // end namespace Dune
│ │ │ │ +
41
│ │ │ │ +
42#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATMULTIINDEX_HH
│ │ │ │ + │ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
Range of DOFs associated to sub-entity.
Definition subentitydofs.hh:46
│ │ │ │ -
auto begin() const
Create begin iterator for access to range of contained local indices.
Definition subentitydofs.hh:114
│ │ │ │ -
auto size() const
Return number of contained DOFs.
Definition subentitydofs.hh:126
│ │ │ │ -
SubEntityDOFs & bind(const LocalView &localView, const Intersection &intersection)
Bind SubEntityDOFs object to LocalView and sub-entity.
Definition subentitydofs.hh:108
│ │ │ │ -
bool contains(std::size_t localIndex) const
Check if given local index is contained in this range of DOFs.
Definition subentitydofs.hh:138
│ │ │ │ -
auto end() const
Create end iterator for access to range of contained local indices.
Definition subentitydofs.hh:120
│ │ │ │ -
SubEntityDOFs & bind(const LocalView &localView, std::size_t subEntityIndex, std::size_t subEntityCodim)
Bind SubEntityDOFs object to LocalView and sub-entity.
Definition subentitydofs.hh:68
│ │ │ │ +
A statically sized MultiIndex type.
Definition multiindex.hh:29
│ │ │ │ +
A statically sized MultiIndex type.
Definition multiindex.hh:54
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,180 +1,49 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -subentitydofs.hh │ │ │ │ │ +flatmultiindex.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBENTITYDOFS_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBENTITYDOFS_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATMULTIINDEX_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATMULTIINDEX_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ +10#include │ │ │ │ │ 11 │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14 │ │ │ │ │ -15 │ │ │ │ │ +12#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_m_u_l_t_i_i_n_d_e_x_._h_h> │ │ │ │ │ +13 │ │ │ │ │ +14namespace _D_u_n_e { │ │ │ │ │ +15namespace Functions { │ │ │ │ │ 16 │ │ │ │ │ -17namespace _D_u_n_e { │ │ │ │ │ -18namespace Functions { │ │ │ │ │ -19 │ │ │ │ │ -20 │ │ │ │ │ -21 │ │ │ │ │ -44template │ │ │ │ │ -_4_5class _S_u_b_E_n_t_i_t_y_D_O_F_s │ │ │ │ │ -46{ │ │ │ │ │ -47 static const int dim = GridView::dimension; │ │ │ │ │ -48 │ │ │ │ │ -49public: │ │ │ │ │ -50 │ │ │ │ │ -67 template │ │ │ │ │ -_6_8 _S_u_b_E_n_t_i_t_y_D_O_F_s& _b_i_n_d(const LocalView& localView, std::size_t subEntityIndex, │ │ │ │ │ -std::size_t subEntityCodim) │ │ │ │ │ -69 { │ │ │ │ │ -70 // fill vector with local indices of all DOFs contained in subentity │ │ │ │ │ -71 containedDOFs_.clear(); │ │ │ │ │ -72 dofIsContained_.assign(localView.size(), false); │ │ │ │ │ -73 │ │ │ │ │ -74 auto re = Dune::referenceElement(localView.element().type()); │ │ │ │ │ -75 │ │ │ │ │ -76 Dune::TypeTree::forEachLeafNode(localView.tree(), [&](auto&& node, auto&& / │ │ │ │ │ -*treePath*/) { │ │ │ │ │ -77 const auto& localCoefficients = node.finiteElement().localCoefficients(); │ │ │ │ │ -78 std::size_t localSize = localCoefficients.size(); │ │ │ │ │ -79 for(std::size_t i=0; i │ │ │ │ │ -_1_0_8 _S_u_b_E_n_t_i_t_y_D_O_F_s& _b_i_n_d(const LocalView& localView, const Intersection& │ │ │ │ │ -intersection) │ │ │ │ │ -109 { │ │ │ │ │ -110 return bind(localView, intersection.indexInInside(), 1); │ │ │ │ │ -111 } │ │ │ │ │ -112 │ │ │ │ │ -_1_1_4 auto _b_e_g_i_n() const │ │ │ │ │ -115 { │ │ │ │ │ -116 return containedDOFs_.cbegin(); │ │ │ │ │ -117 } │ │ │ │ │ -118 │ │ │ │ │ -_1_2_0 auto _e_n_d() const │ │ │ │ │ -121 { │ │ │ │ │ -122 return containedDOFs_.cend(); │ │ │ │ │ -123 } │ │ │ │ │ -124 │ │ │ │ │ -_1_2_6 auto _s_i_z_e() const │ │ │ │ │ -127 { │ │ │ │ │ -128 return containedDOFs_.size(); │ │ │ │ │ -129 } │ │ │ │ │ -130 │ │ │ │ │ -_1_3_2 decltype(auto) operator[](std::size_t i) const │ │ │ │ │ -133 { │ │ │ │ │ -134 return containedDOFs_[i]; │ │ │ │ │ -135 } │ │ │ │ │ -136 │ │ │ │ │ -_1_3_8 bool _c_o_n_t_a_i_n_s(std::size_t localIndex) const │ │ │ │ │ -139 { │ │ │ │ │ -140 return dofIsContained_[localIndex]; │ │ │ │ │ -141 } │ │ │ │ │ -142 │ │ │ │ │ -143private: │ │ │ │ │ -144 │ │ │ │ │ -145 std::vector containedDOFs_; │ │ │ │ │ -146 std::vector dofIsContained_; │ │ │ │ │ -147}; │ │ │ │ │ -148 │ │ │ │ │ -149 │ │ │ │ │ -150 │ │ │ │ │ -163template │ │ │ │ │ -_1_6_4auto _s_u_b_E_n_t_i_t_y_D_O_F_s(const T&) │ │ │ │ │ -165{ │ │ │ │ │ -166 return _S_u_b_E_n_t_i_t_y_D_O_F_s_<_t_y_p_e_n_a_m_e_ _T_:_:_G_r_i_d_V_i_e_w_>{}; │ │ │ │ │ -167} │ │ │ │ │ -168 │ │ │ │ │ -169 │ │ │ │ │ -170 │ │ │ │ │ -190template │ │ │ │ │ -_1_9_1auto _s_u_b_E_n_t_i_t_y_D_O_F_s(const LocalView& localView, std::size_t subEntityIndex, │ │ │ │ │ -std::size_t subEntityCodim) │ │ │ │ │ -192{ │ │ │ │ │ -193 using GridView = typename LocalView::GridView; │ │ │ │ │ -194 _S_u_b_E_n_t_i_t_y_D_O_F_s_<_G_r_i_d_V_i_e_w_> _s_u_b_E_n_t_i_t_y_D_O_F_s; │ │ │ │ │ -195 _s_u_b_E_n_t_i_t_y_D_O_F_s.bind(localView, subEntityIndex, subEntityCodim); │ │ │ │ │ -196 return _s_u_b_E_n_t_i_t_y_D_O_F_s; │ │ │ │ │ -197} │ │ │ │ │ -198 │ │ │ │ │ -199 │ │ │ │ │ -200 │ │ │ │ │ -219template │ │ │ │ │ -_2_2_0auto _s_u_b_E_n_t_i_t_y_D_O_F_s(const LocalView& localView, const Intersection& │ │ │ │ │ -intersection) │ │ │ │ │ -221{ │ │ │ │ │ -222 using GridView = typename LocalView::GridView; │ │ │ │ │ -223 _S_u_b_E_n_t_i_t_y_D_O_F_s_<_G_r_i_d_V_i_e_w_> _s_u_b_E_n_t_i_t_y_D_O_F_s; │ │ │ │ │ -224 _s_u_b_E_n_t_i_t_y_D_O_F_s.bind(localView, intersection); │ │ │ │ │ -225 return _s_u_b_E_n_t_i_t_y_D_O_F_s; │ │ │ │ │ -226} │ │ │ │ │ -227 │ │ │ │ │ -228 │ │ │ │ │ -229 │ │ │ │ │ -230} // namespace Functions │ │ │ │ │ -231} // namespace Dune │ │ │ │ │ -232 │ │ │ │ │ -233#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBENTITYDOFS_HH │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_u_b_E_n_t_i_t_y_D_O_F_s │ │ │ │ │ -auto subEntityDOFs(const T &) │ │ │ │ │ -Create SubEntityDOFs object. │ │ │ │ │ -DDeeffiinniittiioonn subentitydofs.hh:164 │ │ │ │ │ +17 │ │ │ │ │ +18 │ │ │ │ │ +34template │ │ │ │ │ +_3_5using _F_l_a_t_M_u_l_t_i_I_n_d_e_x = _S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x_<_s_i_z_e___t_y_p_e_,_ _1_>; │ │ │ │ │ +36 │ │ │ │ │ +37 │ │ │ │ │ +38 │ │ │ │ │ +39} // end namespace Functions │ │ │ │ │ +40} // end namespace Dune │ │ │ │ │ +41 │ │ │ │ │ +42#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_FLATMULTIINDEX_HH │ │ │ │ │ +_m_u_l_t_i_i_n_d_e_x_._h_h │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_E_n_t_i_t_y_D_O_F_s │ │ │ │ │ -Range of DOFs associated to sub-entity. │ │ │ │ │ -DDeeffiinniittiioonn subentitydofs.hh:46 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_E_n_t_i_t_y_D_O_F_s_:_:_b_e_g_i_n │ │ │ │ │ -auto begin() const │ │ │ │ │ -Create begin iterator for access to range of contained local indices. │ │ │ │ │ -DDeeffiinniittiioonn subentitydofs.hh:114 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_E_n_t_i_t_y_D_O_F_s_:_:_s_i_z_e │ │ │ │ │ -auto size() const │ │ │ │ │ -Return number of contained DOFs. │ │ │ │ │ -DDeeffiinniittiioonn subentitydofs.hh:126 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_E_n_t_i_t_y_D_O_F_s_:_:_b_i_n_d │ │ │ │ │ -SubEntityDOFs & bind(const LocalView &localView, const Intersection │ │ │ │ │ -&intersection) │ │ │ │ │ -Bind SubEntityDOFs object to LocalView and sub-entity. │ │ │ │ │ -DDeeffiinniittiioonn subentitydofs.hh:108 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_E_n_t_i_t_y_D_O_F_s_:_:_c_o_n_t_a_i_n_s │ │ │ │ │ -bool contains(std::size_t localIndex) const │ │ │ │ │ -Check if given local index is contained in this range of DOFs. │ │ │ │ │ -DDeeffiinniittiioonn subentitydofs.hh:138 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_E_n_t_i_t_y_D_O_F_s_:_:_e_n_d │ │ │ │ │ -auto end() const │ │ │ │ │ -Create end iterator for access to range of contained local indices. │ │ │ │ │ -DDeeffiinniittiioonn subentitydofs.hh:120 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_E_n_t_i_t_y_D_O_F_s_:_:_b_i_n_d │ │ │ │ │ -SubEntityDOFs & bind(const LocalView &localView, std::size_t subEntityIndex, │ │ │ │ │ -std::size_t subEntityCodim) │ │ │ │ │ -Bind SubEntityDOFs object to LocalView and sub-entity. │ │ │ │ │ -DDeeffiinniittiioonn subentitydofs.hh:68 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x │ │ │ │ │ +A statically sized MultiIndex type. │ │ │ │ │ +DDeeffiinniittiioonn multiindex.hh:29 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x_<_ _s_i_z_e___t_y_p_e_,_ _1_ _> │ │ │ │ │ +A statically sized MultiIndex type. │ │ │ │ │ +DDeeffiinniittiioonn multiindex.hh:54 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00146.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: sizeinfo.hh File Reference │ │ │ │ +dune-functions: hierarchicnodetorangemap.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,41 +71,38 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
sizeinfo.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
hierarchicnodetorangemap.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <array>
│ │ │ │ +
#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::SizeInfo< B >
 A class encapsulating size information. More...
struct  Dune::Functions::HierarchicNodeToRangeMap
 A simple node to range map using the nested tree indices. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

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

│ │ │ │ -Functions

template<class Basis >
SizeInfo< Basis > Dune::Functions::sizeInfo (const Basis &basis)
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,26 +1,26 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -sizeinfo.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +hierarchicnodetorangemap.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_i_n_d_e_x_a_c_c_e_s_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_z_e_I_n_f_o_<_ _B_ _> │ │ │ │ │ -  A class encapsulating size information. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_N_o_d_e_T_o_R_a_n_g_e_M_a_p │ │ │ │ │ +  A simple node to range map using the nested tree indices. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -_S_i_z_e_I_n_f_o< Basis >  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_i_z_e_I_n_f_o (const Basis &basis) │ │ │ │ │ -  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00146_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: sizeinfo.hh Source File │ │ │ │ +dune-functions: hierarchicnodetorangemap.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,104 +74,77 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
sizeinfo.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SIZEINFO_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SIZEINFO_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICNODETORANGEMAP_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICNODETORANGEMAP_HH
│ │ │ │
9
│ │ │ │ -
10#warning The header dune/functions/functionspacebases/sizeinfo.hh is deprecated and will be removed after release 2.10.
│ │ │ │ -
11
│ │ │ │ -
12#include <array>
│ │ │ │ +
10
│ │ │ │ +
11#include <utility>
│ │ │ │ +
12#include <type_traits>
│ │ │ │
13
│ │ │ │ -
14namespace Dune {
│ │ │ │ -
15namespace Functions {
│ │ │ │ -
16
│ │ │ │ -
17
│ │ │ │ +
14#include <dune/common/concept.hh>
│ │ │ │ +
15
│ │ │ │ + │ │ │ │ + │ │ │ │
18
│ │ │ │ -
31template<class B>
│ │ │ │ -
│ │ │ │ -
32class
│ │ │ │ -
33[[deprecated("SizeInfo is deprecated and will be removed after release 2.10.")]]
│ │ │ │ - │ │ │ │ -
35{
│ │ │ │ -
36public:
│ │ │ │ -
37 using Basis = B;
│ │ │ │ -
38 using size_type = typename Basis::size_type;
│ │ │ │ -
39 using SizePrefix = typename Basis::SizePrefix;
│ │ │ │ -
40
│ │ │ │ +
19namespace Dune {
│ │ │ │ +
20namespace Functions {
│ │ │ │ +
21
│ │ │ │ +
22
│ │ │ │ +
23
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
34{
│ │ │ │ +
35 template<class Node, class TreePath, class Range,
│ │ │ │ +
36 std::enable_if_t< models<Concept::HasIndexAccess, Range, Dune::index_constant<0>>(), int> = 0>
│ │ │ │ +
│ │ │ │ +
37 decltype(auto) operator()(const Node&, const TreePath& treePath, Range&& y) const
│ │ │ │ +
38 {
│ │ │ │ +
39 return resolveStaticMultiIndex(y, treePath);
│ │ │ │ +
40 }
│ │ │ │ +
│ │ │ │ +
41
│ │ │ │ +
42 template<class Node, class TreePath, class Range,
│ │ │ │ +
43 std::enable_if_t<not models<Concept::HasIndexAccess, Range, Dune::index_constant<0>>(), int> = 0>
│ │ │ │
│ │ │ │ -
44 SizeInfo(const Basis& basis) :
│ │ │ │ -
45 basis_(&basis)
│ │ │ │ -
46 {}
│ │ │ │ -
│ │ │ │ -
47
│ │ │ │ -
│ │ │ │ -
51 size_type operator()(const SizePrefix& prefix) const
│ │ │ │ -
52 {
│ │ │ │ -
53 return basis_->size(prefix);
│ │ │ │ -
54 }
│ │ │ │ -
│ │ │ │ +
44 decltype(auto) operator()(const Node&, const TreePath&, Range&& y) const
│ │ │ │ +
45 {
│ │ │ │ +
46 return std::forward<Range>(y);
│ │ │ │ +
47 }
│ │ │ │ +
│ │ │ │ +
48};
│ │ │ │ +
│ │ │ │ +
49
│ │ │ │ +
50
│ │ │ │ +
51
│ │ │ │ +
52} // namespace Dune::Functions
│ │ │ │ +
53} // namespace Dune
│ │ │ │ +
54
│ │ │ │
55
│ │ │ │ -
│ │ │ │ -
62 size_type size(const SizePrefix& prefix) const
│ │ │ │ -
63 {
│ │ │ │ -
64 return basis_->size(prefix);
│ │ │ │ -
65 }
│ │ │ │ -
│ │ │ │ -
66
│ │ │ │ -
│ │ │ │ -
67 operator size_type () const
│ │ │ │ -
68 {
│ │ │ │ -
69 return basis_->dimension();
│ │ │ │ -
70 }
│ │ │ │ -
│ │ │ │ -
71
│ │ │ │ -
72protected:
│ │ │ │ -
73
│ │ │ │ -
74 const Basis* basis_;
│ │ │ │ -
75};
│ │ │ │ -
│ │ │ │ -
76
│ │ │ │ -
77
│ │ │ │ -
81template<class Basis>
│ │ │ │ -
│ │ │ │ -
82SizeInfo<Basis> sizeInfo(const Basis& basis)
│ │ │ │ -
83{
│ │ │ │ -
84 return SizeInfo<Basis>(basis);
│ │ │ │ -
85}
│ │ │ │ -
│ │ │ │ -
86
│ │ │ │ -
87
│ │ │ │ -
88
│ │ │ │ -
89} // end namespace Functions
│ │ │ │ -
90} // end namespace Dune
│ │ │ │ -
91
│ │ │ │ -
92#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SIZEINFO_HH
│ │ │ │ +
56#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:421
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
SizeInfo< Basis > sizeInfo(const Basis &basis)
Definition sizeinfo.hh:82
│ │ │ │ -
A class encapsulating size information.
Definition sizeinfo.hh:35
│ │ │ │ -
typename Basis::SizePrefix SizePrefix
Definition sizeinfo.hh:39
│ │ │ │ -
size_type size(const SizePrefix &prefix) const
Return number possible values for next position in multi index.
Definition sizeinfo.hh:62
│ │ │ │ -
size_type operator()(const SizePrefix &prefix) const
Return number possible values for next position in multi index.
Definition sizeinfo.hh:51
│ │ │ │ -
typename Basis::size_type size_type
Definition sizeinfo.hh:38
│ │ │ │ -
B Basis
Definition sizeinfo.hh:37
│ │ │ │ -
SizeInfo(const Basis &basis)
Construct from basis.
Definition sizeinfo.hh:44
│ │ │ │ -
const Basis * basis_
Definition sizeinfo.hh:74
│ │ │ │ +
A simple node to range map using the nested tree indices.
Definition hierarchicnodetorangemap.hh:34
│ │ │ │ +
decltype(auto) operator()(const Node &, const TreePath &treePath, Range &&y) const
Definition hierarchicnodetorangemap.hh:37
│ │ │ │ +
decltype(auto) operator()(const Node &, const TreePath &, Range &&y) const
Definition hierarchicnodetorangemap.hh:44
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,112 +1,82 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -sizeinfo.hh │ │ │ │ │ +hierarchicnodetorangemap.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SIZEINFO_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SIZEINFO_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICNODETORANGEMAP_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICNODETORANGEMAP_HH │ │ │ │ │ 9 │ │ │ │ │ -10#warning The header dune/functions/functionspacebases/sizeinfo.hh is │ │ │ │ │ -deprecated and will be removed after release 2.10. │ │ │ │ │ -11 │ │ │ │ │ -12#include │ │ │ │ │ +10 │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ 13 │ │ │ │ │ -14namespace _D_u_n_e { │ │ │ │ │ -15namespace Functions { │ │ │ │ │ -16 │ │ │ │ │ -17 │ │ │ │ │ +14#include │ │ │ │ │ +15 │ │ │ │ │ +16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_i_n_d_e_x_a_c_c_e_s_s_._h_h> │ │ │ │ │ 18 │ │ │ │ │ -31template │ │ │ │ │ -_3_2class │ │ │ │ │ -33[[deprecated("SizeInfo is deprecated and will be removed after release │ │ │ │ │ -2.10.")]] │ │ │ │ │ -34_S_i_z_e_I_n_f_o │ │ │ │ │ -35{ │ │ │ │ │ -36public: │ │ │ │ │ -_3_7 using _B_a_s_i_s = B; │ │ │ │ │ -_3_8 using _s_i_z_e___t_y_p_e = typename Basis::size_type; │ │ │ │ │ -_3_9 using _S_i_z_e_P_r_e_f_i_x = typename Basis::SizePrefix; │ │ │ │ │ -40 │ │ │ │ │ -_4_4 _S_i_z_e_I_n_f_o(const _B_a_s_i_s& basis) : │ │ │ │ │ -45 basis_(&basis) │ │ │ │ │ -46 {} │ │ │ │ │ -47 │ │ │ │ │ -_5_1 _s_i_z_e___t_y_p_e _o_p_e_r_a_t_o_r_(_)(const _S_i_z_e_P_r_e_f_i_x& prefix) const │ │ │ │ │ -52 { │ │ │ │ │ -53 return basis_->size(prefix); │ │ │ │ │ -54 } │ │ │ │ │ +19namespace _D_u_n_e { │ │ │ │ │ +20namespace Functions { │ │ │ │ │ +21 │ │ │ │ │ +22 │ │ │ │ │ +23 │ │ │ │ │ +_3_3struct _H_i_e_r_a_r_c_h_i_c_N_o_d_e_T_o_R_a_n_g_e_M_a_p │ │ │ │ │ +34{ │ │ │ │ │ +35 template>(), int> = 0> │ │ │ │ │ +_3_7 decltype(auto) _o_p_e_r_a_t_o_r_(_)(const Node&, const TreePath& treePath, Range&& y) │ │ │ │ │ +const │ │ │ │ │ +38 { │ │ │ │ │ +39 return _r_e_s_o_l_v_e_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x(y, treePath); │ │ │ │ │ +40 } │ │ │ │ │ +41 │ │ │ │ │ +42 template>(), int> = 0> │ │ │ │ │ +_4_4 decltype(auto) _o_p_e_r_a_t_o_r_(_)(const Node&, const TreePath&, Range&& y) const │ │ │ │ │ +45 { │ │ │ │ │ +46 return std::forward(y); │ │ │ │ │ +47 } │ │ │ │ │ +48}; │ │ │ │ │ +49 │ │ │ │ │ +50 │ │ │ │ │ +51 │ │ │ │ │ +52} // namespace Dune::Functions │ │ │ │ │ +53} // namespace Dune │ │ │ │ │ +54 │ │ │ │ │ 55 │ │ │ │ │ -_6_2 _s_i_z_e___t_y_p_e _s_i_z_e(const _S_i_z_e_P_r_e_f_i_x& prefix) const │ │ │ │ │ -63 { │ │ │ │ │ -64 return basis_->size(prefix); │ │ │ │ │ -65 } │ │ │ │ │ -66 │ │ │ │ │ -_6_7 operator _s_i_z_e___t_y_p_e () const │ │ │ │ │ -68 { │ │ │ │ │ -69 return basis_->dimension(); │ │ │ │ │ -70 } │ │ │ │ │ -71 │ │ │ │ │ -72protected: │ │ │ │ │ -73 │ │ │ │ │ -_7_4 const _B_a_s_i_s* _b_a_s_i_s__; │ │ │ │ │ -75}; │ │ │ │ │ -76 │ │ │ │ │ -77 │ │ │ │ │ -81template │ │ │ │ │ -_8_2_S_i_z_e_I_n_f_o_<_B_a_s_i_s_> _s_i_z_e_I_n_f_o(const Basis& basis) │ │ │ │ │ -83{ │ │ │ │ │ -84 return _S_i_z_e_I_n_f_o_<_B_a_s_i_s_>(basis); │ │ │ │ │ -85} │ │ │ │ │ -86 │ │ │ │ │ -87 │ │ │ │ │ -88 │ │ │ │ │ -89} // end namespace Functions │ │ │ │ │ -90} // end namespace Dune │ │ │ │ │ -91 │ │ │ │ │ -92#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SIZEINFO_HH │ │ │ │ │ +56#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICNODETORANGEMAP_HH │ │ │ │ │ +_i_n_d_e_x_a_c_c_e_s_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_r_e_s_o_l_v_e_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x │ │ │ │ │ +constexpr decltype(auto) resolveStaticMultiIndex(C &&c, const MultiIndex │ │ │ │ │ +&multiIndex) │ │ │ │ │ +Provide multi-index access by chaining operator[]. │ │ │ │ │ +DDeeffiinniittiioonn indexaccess.hh:421 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_i_z_e_I_n_f_o │ │ │ │ │ -SizeInfo< Basis > sizeInfo(const Basis &basis) │ │ │ │ │ -DDeeffiinniittiioonn sizeinfo.hh:82 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_z_e_I_n_f_o │ │ │ │ │ -A class encapsulating size information. │ │ │ │ │ -DDeeffiinniittiioonn sizeinfo.hh:35 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_z_e_I_n_f_o_:_:_S_i_z_e_P_r_e_f_i_x │ │ │ │ │ -typename Basis::SizePrefix SizePrefix │ │ │ │ │ -DDeeffiinniittiioonn sizeinfo.hh:39 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_z_e_I_n_f_o_:_:_s_i_z_e │ │ │ │ │ -size_type size(const SizePrefix &prefix) const │ │ │ │ │ -Return number possible values for next position in multi index. │ │ │ │ │ -DDeeffiinniittiioonn sizeinfo.hh:62 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_z_e_I_n_f_o_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -size_type operator()(const SizePrefix &prefix) const │ │ │ │ │ -Return number possible values for next position in multi index. │ │ │ │ │ -DDeeffiinniittiioonn sizeinfo.hh:51 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_z_e_I_n_f_o_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -typename Basis::size_type size_type │ │ │ │ │ -DDeeffiinniittiioonn sizeinfo.hh:38 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_z_e_I_n_f_o_:_:_B_a_s_i_s │ │ │ │ │ -B Basis │ │ │ │ │ -DDeeffiinniittiioonn sizeinfo.hh:37 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_z_e_I_n_f_o_:_:_S_i_z_e_I_n_f_o │ │ │ │ │ -SizeInfo(const Basis &basis) │ │ │ │ │ -Construct from basis. │ │ │ │ │ -DDeeffiinniittiioonn sizeinfo.hh:44 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_i_z_e_I_n_f_o_:_:_b_a_s_i_s__ │ │ │ │ │ -const Basis * basis_ │ │ │ │ │ -DDeeffiinniittiioonn sizeinfo.hh:74 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_N_o_d_e_T_o_R_a_n_g_e_M_a_p │ │ │ │ │ +A simple node to range map using the nested tree indices. │ │ │ │ │ +DDeeffiinniittiioonn hierarchicnodetorangemap.hh:34 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_N_o_d_e_T_o_R_a_n_g_e_M_a_p_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +decltype(auto) operator()(const Node &, const TreePath &treePath, Range &&y) │ │ │ │ │ +const │ │ │ │ │ +DDeeffiinniittiioonn hierarchicnodetorangemap.hh:37 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_N_o_d_e_T_o_R_a_n_g_e_M_a_p_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +decltype(auto) operator()(const Node &, const TreePath &, Range &&y) const │ │ │ │ │ +DDeeffiinniittiioonn hierarchicnodetorangemap.hh:44 │ │ │ │ │ +_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00149.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: hierarchicvectorwrapper.hh File Reference │ │ │ │ +dune-functions: basistags.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -73,51 +73,77 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
hierarchicvectorwrapper.hh File Reference
│ │ │ │ +
basistags.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 <type_traits>
│ │ │ │ +#include <dune/common/concept.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::HierarchicVectorWrapper< V, CO >
 A wrapper providing multiindex access to vector entries. 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 V >
HierarchicVectorWrapper< V > Dune::Functions::hierarchicVector (V &v)
 
template<class MultiIndex , class V , std::enable_if_t< models< Concept::HasIndexAccess, V, MultiIndex >(), int > = 0>
V & Dune::Functions::makeHierarchicVectorForMultiIndex (V &v)
 
template<class MultiIndex , class V , std::enable_if_t< not models< Concept::HasIndexAccess, V, MultiIndex >(), int > = 0>
HierarchicVectorWrapper< V > Dune::Functions::makeHierarchicVectorForMultiIndex (V &v)
 
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.
 
constexpr FlatInterleaved Dune::Functions::BasisFactory::flatInterleaved ()
 Creates an interleaved merging of direct children without blocking.
 
constexpr BlockedLexicographic Dune::Functions::BasisFactory::blockedLexicographic ()
 Creates a lexicographic merging of direct children with blocking (i.e. creating one block per direct child).
 
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).
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -2,41 +2,79 @@ │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -hierarchicvectorwrapper.hh File Reference │ │ │ │ │ +basistags.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_i_n_d_e_x_a_c_c_e_s_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_u_t_i_l_i_t_y_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_<_ _V_,_ _C_O_ _> │ │ │ │ │ -  A wrapper providing multiindex access to vector entries. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ +  Base class for index merging strategies to simplify detection. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_F_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c │ │ │ │ │ +  Lexicographic merging of direct children without blocking. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_F_l_a_t_I_n_t_e_r_l_e_a_v_e_d │ │ │ │ │ +  Interleaved merging of direct children without blocking. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_B_l_o_c_k_e_d_L_e_x_i_c_o_g_r_a_p_h_i_c │ │ │ │ │ +  Lexicographic merging of direct children with blocking (i.e. creating │ │ │ │ │ + one block per direct child). _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_B_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d │ │ │ │ │ +  Interleaved merging of direct children with blocking (i.e. creating │ │ │ │ │ + blocks at the leaves containing one leaf per child each). _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r< V >  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_h_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r (V &v) │ │ │ │ │ +namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t │ │ │ │ │ +  │ │ │ │ │ +namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y │ │ │ │ │   │ │ │ │ │ -template(), int > = 0> │ │ │ │ │ - V &  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_: │ │ │ │ │ - _m_a_k_e_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_F_o_r_M_u_l_t_i_I_n_d_e_x (V &v) │ │ │ │ │ -  │ │ │ │ │ -template(), int > = 0> │ │ │ │ │ -_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r< V >  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_: │ │ │ │ │ - _m_a_k_e_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_F_o_r_M_u_l_t_i_I_n_d_e_x (V &v) │ │ │ │ │ +namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_B_u_i_l_d_e_r │ │ │ │ │ +  │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ + static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_: │ │ │ │ │ + _i_s_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y () │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_: │ │ │ │ │ + _i_s_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y (T &&t) │ │ │ │ │ +  │ │ │ │ │ + void  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_: │ │ │ │ │ + _r_e_g_i_s_t_e_r_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ + (_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y) │ │ │ │ │ +  │ │ │ │ │ + constexpr _F_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_: │ │ │ │ │ + _f_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c () │ │ │ │ │ +  Creates a lexicographic merging of direct │ │ │ │ │ + children without blocking. │ │ │ │ │ +  │ │ │ │ │ + constexpr _F_l_a_t_I_n_t_e_r_l_e_a_v_e_d  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_f_l_a_t_I_n_t_e_r_l_e_a_v_e_d │ │ │ │ │ + () │ │ │ │ │ +  Creates an interleaved merging of direct │ │ │ │ │ + children without blocking. │ │ │ │ │ +  │ │ │ │ │ +constexpr _B_l_o_c_k_e_d_L_e_x_i_c_o_g_r_a_p_h_i_c  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_: │ │ │ │ │ + _b_l_o_c_k_e_d_L_e_x_i_c_o_g_r_a_p_h_i_c () │ │ │ │ │ + Creates a lexicographic merging of direct │ │ │ │ │ +  children with blocking (i.e. creating one block │ │ │ │ │ + per direct child). │ │ │ │ │ +  │ │ │ │ │ + constexpr _B_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_: │ │ │ │ │ + _b_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d () │ │ │ │ │ + Creates an interleaved merging of direct │ │ │ │ │ +  children with blocking (i.e. creating blocks at │ │ │ │ │ + the leaves containing one leaf per child each). │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00149_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: hierarchicvectorwrapper.hh Source File │ │ │ │ +dune-functions: basistags.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,294 +74,150 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
hierarchicvectorwrapper.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICVECTORWRAPPER_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICVECTORWRAPPER_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BASISTAGS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BASISTAGS_HH
│ │ │ │
9
│ │ │ │ -
10#ifndef DUNE_FUNCTIONS_HIERARCHICVECTORWRAPPER_TEST_NO_DEPRECATION
│ │ │ │ -
11#warning The header dune/functions/functionspacebases/hierarchicvectorwrapper.hh is deprecated and will be removed after release 2.10.
│ │ │ │ -
12#endif
│ │ │ │ -
13
│ │ │ │ -
14#include <dune/common/concept.hh>
│ │ │ │ -
15#include <dune/common/hybridutilities.hh>
│ │ │ │ -
16#include <dune/common/indices.hh>
│ │ │ │ +
10#include <type_traits>
│ │ │ │ +
11#include <dune/common/concept.hh>
│ │ │ │ +
12
│ │ │ │ +
13namespace Dune {
│ │ │ │ +
14namespace Functions {
│ │ │ │ +
15
│ │ │ │ +
16 namespace Concept {
│ │ │ │
17
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
22
│ │ │ │ -
23
│ │ │ │ -
24namespace Dune {
│ │ │ │ -
25namespace Functions {
│ │ │ │ -
26
│ │ │ │ -
27
│ │ │ │ -
28
│ │ │ │ -
29namespace Imp {
│ │ │ │ -
30
│ │ │ │ -
31 // Construct default coefficient type from vector and multiindex type
│ │ │ │ -
32 // This requires that MultiIndex has a static size. Otherwise the
│ │ │ │ -
33 // vector type itself is returned.
│ │ │ │ -
34 template<class V, class MultiIndex>
│ │ │ │ -
35 struct CoefficientType
│ │ │ │ -
36 {
│ │ │ │ -
37 template<class E, std::size_t size>
│ │ │ │ -
38 struct DefaultCoefficientTypeHelper
│ │ │ │ -
39 {
│ │ │ │ -
40 using E0 = decltype(std::declval<E>()[Dune::Indices::_0]);
│ │ │ │ -
41 using type = typename DefaultCoefficientTypeHelper<E0, size-1>::type;
│ │ │ │ -
42 };
│ │ │ │ -
43
│ │ │ │ -
44 template<class E>
│ │ │ │ -
45 struct DefaultCoefficientTypeHelper<E, 0>
│ │ │ │ -
46 {
│ │ │ │ -
47 using type = E;
│ │ │ │ -
48 };
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
19 {
│ │ │ │ +
20 template<typename T>
│ │ │ │ +
21 auto require(T&& t) -> decltype(
│ │ │ │ +
22 registerIndexMergingStrategy(t)
│ │ │ │ +
23 );
│ │ │ │ +
24 };
│ │ │ │ +
│ │ │ │ +
25
│ │ │ │ +
26 template<typename T>
│ │ │ │ +
│ │ │ │ +
27 static constexpr bool isIndexMergingStrategy()
│ │ │ │ +
28 {
│ │ │ │ +
29 return models<Concept::IndexMergingStrategy,T>();
│ │ │ │ +
30 }
│ │ │ │ +
│ │ │ │ +
31
│ │ │ │ +
32 template<typename T>
│ │ │ │ +
│ │ │ │ +
33 static constexpr bool isIndexMergingStrategy(T&& t)
│ │ │ │ +
34 {
│ │ │ │ +
35 return models<Concept::IndexMergingStrategy,std::decay_t<T>>();
│ │ │ │ +
36 }
│ │ │ │ +
│ │ │ │ +
37
│ │ │ │ +
38 } // namespace Concept
│ │ │ │ +
39
│ │ │ │ +
40
│ │ │ │ +
│ │ │ │ +
41namespace BasisFactory {
│ │ │ │ +
42
│ │ │ │ + │ │ │ │
49
│ │ │ │ -
50 using type = typename DefaultCoefficientTypeHelper<V, StaticSizeOrZero<MultiIndex>::value>::type;
│ │ │ │ -
51 };
│ │ │ │ -
52
│ │ │ │ -
53
│ │ │ │ -
54
│ │ │ │ -
55 // This tag class is used as Coefficient template parameter
│ │ │ │ -
56 // for HierarchicVectorWrapper if the coefficient type should
│ │ │ │ -
57 // be deduced.
│ │ │ │ -
58 struct DeducedCoefficientTag {};
│ │ │ │ -
59
│ │ │ │ -
60} // namespace Imp
│ │ │ │ -
61
│ │ │ │ -
62
│ │ │ │ -
63
│ │ │ │ -
86template<class V, class CO=Imp::DeducedCoefficientTag>
│ │ │ │ -
│ │ │ │ -
87class
│ │ │ │ -
88[[deprecated("HierarchicVectorWrapper is deprecated and will be removed after release 2.10.")]]
│ │ │ │ - │ │ │ │ -
90{
│ │ │ │ -
91 template<class MultiIndex>
│ │ │ │ -
92 using Coefficient = std::conditional_t< std::is_same_v<Imp::DeducedCoefficientTag,CO> and HasStaticSize_v<MultiIndex>,
│ │ │ │ -
93 typename Imp::CoefficientType<V, MultiIndex>::type,
│ │ │ │ -
94 CO
│ │ │ │ -
95 >;
│ │ │ │ -
96
│ │ │ │ -
97
│ │ │ │ -
98 using size_type = std::size_t;
│ │ │ │ -
99
│ │ │ │ -
100 template<class C, class SizeProvider,
│ │ │ │ -
101 std::enable_if_t< not models<Concept::HasResize, C>(), int> = 0,
│ │ │ │ -
102 std::enable_if_t< not models<Concept::HasSizeMethod, C>(), int> = 0>
│ │ │ │ -
103 static void resizeHelper(C& c, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ -
104 {
│ │ │ │ -
105 auto size = sizeProvider.size(prefix);
│ │ │ │ -
106 if (size != 0)
│ │ │ │ -
107 DUNE_THROW(RangeError, "Can't resize scalar vector entry v[" << prefix << "] to size(" << prefix << ")=" << size);
│ │ │ │ -
108 }
│ │ │ │ -
109
│ │ │ │ -
110 struct StaticResizeHelper
│ │ │ │ -
111 {
│ │ │ │ -
112 template<class I, class C, class SizeProvider>
│ │ │ │ -
113 static void apply(I&& i, C& c, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ -
114 {
│ │ │ │ -
115 prefix.back() = i;
│ │ │ │ -
116 resizeHelper(c[i], sizeProvider, prefix);
│ │ │ │ -
117 }
│ │ │ │ -
118 };
│ │ │ │ + │ │ │ │ +
51
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
84 {};
│ │ │ │ +
│ │ │ │ +
85
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
117 : public IndexMergingStrategy
│ │ │ │ +
118 {};
│ │ │ │ +
│ │ │ │
119
│ │ │ │ -
120 template<class C, class SizeProvider,
│ │ │ │ -
121 std::enable_if_t< not models<Concept::HasResize, C>(), int> = 0,
│ │ │ │ -
122 std::enable_if_t< models<Concept::HasSizeMethod, C>(), int> = 0>
│ │ │ │ -
123 static void resizeHelper(C& c, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ -
124 {
│ │ │ │ -
125 auto size = sizeProvider.size(prefix);
│ │ │ │ -
126 if (size == 0)
│ │ │ │ -
127 return;
│ │ │ │ -
128
│ │ │ │ -
129 if (c.size() != size)
│ │ │ │ -
130 DUNE_THROW(RangeError, "Can't resize statically sized vector entry v[" << prefix << "] of size " << c.size() << " to size(" << prefix << ")=" << size);
│ │ │ │ -
131
│ │ │ │ -
132 using namespace Dune::Hybrid;
│ │ │ │ -
133 prefix.push_back(0);
│ │ │ │ -
134 forEach(integralRange(Hybrid::size(c)), [&](auto&& i) {
│ │ │ │ -
135 StaticResizeHelper::apply(i, c, sizeProvider, prefix);
│ │ │ │ -
136 });
│ │ │ │ -
137 }
│ │ │ │ -
138
│ │ │ │ -
139 template<class C, class SizeProvider,
│ │ │ │ -
140 std::enable_if_t< models<Concept::HasResize, C>(), int> = 0>
│ │ │ │ -
141 static void resizeHelper(C& c, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ -
142 {
│ │ │ │ -
143 auto size = sizeProvider.size(prefix);
│ │ │ │ -
144 if (size==0)
│ │ │ │ -
145 {
│ │ │ │ -
146 if (c.size()==0)
│ │ │ │ -
147 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.");
│ │ │ │ -
148 else
│ │ │ │ -
149 return;
│ │ │ │ -
150 }
│ │ │ │ -
151
│ │ │ │ -
152 c.resize(size);
│ │ │ │ -
153 prefix.push_back(0);
│ │ │ │ -
154 for(std::size_t i=0; i<size; ++i)
│ │ │ │ -
155 {
│ │ │ │ -
156 prefix.back() = i;
│ │ │ │ -
157 resizeHelper(c[i], sizeProvider, prefix);
│ │ │ │ -
158 }
│ │ │ │ -
159 }
│ │ │ │ -
160
│ │ │ │ -
161
│ │ │ │ -
162
│ │ │ │ -
163public:
│ │ │ │ -
164
│ │ │ │ -
165 using Vector = V;
│ │ │ │ -
166
│ │ │ │ -
167 template<class MultiIndex>
│ │ │ │ -
168 using Entry = Coefficient<MultiIndex>;
│ │ │ │ -
169
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
171 vector_(&vector)
│ │ │ │ -
172 {}
│ │ │ │ -
│ │ │ │ -
173
│ │ │ │ -
174 template<class SizeProvider>
│ │ │ │ -
│ │ │ │ -
175 void resize(const SizeProvider& sizeProvider)
│ │ │ │ -
176 {
│ │ │ │ -
177 typename SizeProvider::SizePrefix prefix;
│ │ │ │ -
178 prefix.resize(0);
│ │ │ │ -
179 resizeHelper(*vector_, sizeProvider, prefix);
│ │ │ │ -
180 }
│ │ │ │ -
│ │ │ │ -
181
│ │ │ │ -
182 template<class MultiIndex>
│ │ │ │ -
│ │ │ │ -
183 const Entry<MultiIndex>& operator[](const MultiIndex& index) const
│ │ │ │ -
184 {
│ │ │ │ -
185 static_assert(not std::is_same_v<Imp::DeducedCoefficientTag,Entry<MultiIndex>>, "Coefficient type for HierarchicVectorWrapper and given multi-index type cannot be determined automatically!");
│ │ │ │ -
186 return hybridMultiIndexAccess<const Entry<MultiIndex>&>(*vector_, index);
│ │ │ │ -
187 }
│ │ │ │ -
│ │ │ │ -
188
│ │ │ │ -
189 template<class MultiIndex>
│ │ │ │ -
│ │ │ │ -
190 Entry<MultiIndex>& operator[](const MultiIndex& index)
│ │ │ │ -
191 {
│ │ │ │ -
192 static_assert(not std::is_same_v<Imp::DeducedCoefficientTag,Entry<MultiIndex>>, "Coefficient type for HierarchicVectorWrapper and given multi-index type cannot be determined automatically!");
│ │ │ │ -
193 return hybridMultiIndexAccess<Entry<MultiIndex>&>(*vector_, index);
│ │ │ │ -
194 }
│ │ │ │ -
│ │ │ │ -
195
│ │ │ │ -
196 template<class MultiIndex>
│ │ │ │ -
│ │ │ │ -
197 const Entry<MultiIndex>& operator()(const MultiIndex& index) const
│ │ │ │ -
198 {
│ │ │ │ -
199 static_assert(not std::is_same_v<Imp::DeducedCoefficientTag,Entry<MultiIndex>>, "Coefficient type for HierarchicVectorWrapper and given multi-index type cannot be determined automatically!");
│ │ │ │ -
200 return (*this)[index];
│ │ │ │ -
201 }
│ │ │ │ -
│ │ │ │ -
202
│ │ │ │ -
203 template<class MultiIndex>
│ │ │ │ -
│ │ │ │ -
204 Entry<MultiIndex>& operator()(const MultiIndex& index)
│ │ │ │ -
205 {
│ │ │ │ -
206 static_assert(not std::is_same_v<Imp::DeducedCoefficientTag,Entry<MultiIndex>>, "Coefficient type for HierarchicVectorWrapper and given multi-index type cannot be determined automatically!");
│ │ │ │ -
207 return (*this)[index];
│ │ │ │ -
208 }
│ │ │ │ -
│ │ │ │ -
209
│ │ │ │ -
│ │ │ │ -
210 const Vector& vector() const
│ │ │ │ -
211 {
│ │ │ │ -
212 return *vector_;
│ │ │ │ -
213 }
│ │ │ │ -
│ │ │ │ -
214
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
216 {
│ │ │ │ -
217 return *vector_;
│ │ │ │ -
218 }
│ │ │ │ -
│ │ │ │ -
219
│ │ │ │ -
220private:
│ │ │ │ -
221
│ │ │ │ -
222 Vector* vector_;
│ │ │ │ -
223};
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
151 : public IndexMergingStrategy
│ │ │ │ +
152 {};
│ │ │ │ +
│ │ │ │ +
153
│ │ │ │ + │ │ │ │ +
185
│ │ │ │ +
186
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
193 {
│ │ │ │ +
194 return {};
│ │ │ │ +
195 }
│ │ │ │ +
│ │ │ │ +
196
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
203 {
│ │ │ │ +
204 return {};
│ │ │ │ +
205 }
│ │ │ │ +
│ │ │ │ +
206
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
213 {
│ │ │ │ +
214 return {};
│ │ │ │ +
215 }
│ │ │ │ +
│ │ │ │ +
216
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
223 {
│ │ │ │ +
224 return {};
│ │ │ │ +
225 }
│ │ │ │
│ │ │ │ -
224
│ │ │ │ -
225
│ │ │ │
226
│ │ │ │ -
230template<class V>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
232{
│ │ │ │ - │ │ │ │ +
227} // end namespace BasisFactory
│ │ │ │ +
│ │ │ │ +
228
│ │ │ │ +
229// Backward compatibility
│ │ │ │ +
│ │ │ │ +
230namespace [[deprecated("Will be removed after Dune 2.10")]] BasisBuilder {
│ │ │ │ +
231
│ │ │ │ +
232 using namespace BasisFactory;
│ │ │ │ +
233
│ │ │ │
234}
│ │ │ │
│ │ │ │
235
│ │ │ │ -
236
│ │ │ │ -
237
│ │ │ │ -
241template<class MultiIndex, class V,
│ │ │ │ -
242 std::enable_if_t< models<Concept::HasIndexAccess, V, MultiIndex>(), int> = 0>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
244{
│ │ │ │ -
245 return v;
│ │ │ │ -
246}
│ │ │ │ -
│ │ │ │ -
247
│ │ │ │ -
248
│ │ │ │ -
249
│ │ │ │ -
253template<class MultiIndex, class V,
│ │ │ │ -
254 std::enable_if_t< not models<Concept::HasIndexAccess, V, MultiIndex>(), int> = 0>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
256{
│ │ │ │ - │ │ │ │ -
258}
│ │ │ │ -
│ │ │ │ -
259
│ │ │ │ -
260
│ │ │ │ -
261
│ │ │ │ -
262} // namespace Dune::Functions
│ │ │ │ -
263} // namespace Dune
│ │ │ │ -
264
│ │ │ │ -
265
│ │ │ │ -
266#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICVECTORWRAPPER_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +
236} // end namespace Functions
│ │ │ │ +
237} // end namespace Dune
│ │ │ │ +
238
│ │ │ │ +
239
│ │ │ │ +
240#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BASISTAGS_HH
│ │ │ │ +
constexpr FlatLexicographic flatLexicographic()
Creates a lexicographic merging of direct children without blocking.
Definition basistags.hh:192
│ │ │ │ +
constexpr BlockedInterleaved blockedInterleaved()
Creates an interleaved merging of direct children with blocking (i.e. creating blocks at the leaves c...
Definition basistags.hh:222
│ │ │ │ +
constexpr FlatInterleaved flatInterleaved()
Creates an interleaved merging of direct children without blocking.
Definition basistags.hh:202
│ │ │ │ +
constexpr BlockedLexicographic blockedLexicographic()
Creates a lexicographic merging of direct children with blocking (i.e. creating one block per direct ...
Definition basistags.hh:212
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
V & makeHierarchicVectorForMultiIndex(V &v)
Definition hierarchicvectorwrapper.hh:243
│ │ │ │ -
HierarchicVectorWrapper< V > hierarchicVector(V &v)
Definition hierarchicvectorwrapper.hh:231
│ │ │ │ -
A wrapper providing multiindex access to vector entries.
Definition hierarchicvectorwrapper.hh:90
│ │ │ │ -
Entry< MultiIndex > & operator()(const MultiIndex &index)
Definition hierarchicvectorwrapper.hh:204
│ │ │ │ -
Entry< MultiIndex > & operator[](const MultiIndex &index)
Definition hierarchicvectorwrapper.hh:190
│ │ │ │ -
const Entry< MultiIndex > & operator[](const MultiIndex &index) const
Definition hierarchicvectorwrapper.hh:183
│ │ │ │ -
Vector & vector()
Definition hierarchicvectorwrapper.hh:215
│ │ │ │ -
V Vector
Definition hierarchicvectorwrapper.hh:165
│ │ │ │ -
Coefficient< MultiIndex > Entry
Definition hierarchicvectorwrapper.hh:168
│ │ │ │ -
const Vector & vector() const
Definition hierarchicvectorwrapper.hh:210
│ │ │ │ -
HierarchicVectorWrapper(Vector &vector)
Definition hierarchicvectorwrapper.hh:170
│ │ │ │ -
const Entry< MultiIndex > & operator()(const MultiIndex &index) const
Definition hierarchicvectorwrapper.hh:197
│ │ │ │ -
void resize(const SizeProvider &sizeProvider)
Definition hierarchicvectorwrapper.hh:175
│ │ │ │ - │ │ │ │ +
static constexpr bool isIndexMergingStrategy()
Definition basistags.hh:27
│ │ │ │ +
void registerIndexMergingStrategy(IndexMergingStrategy)
│ │ │ │ + │ │ │ │ +
auto require(T &&t) -> decltype(registerIndexMergingStrategy(t))
│ │ │ │ +
Base class for index merging strategies to simplify detection.
Definition basistags.hh:48
│ │ │ │ +
Lexicographic merging of direct children without blocking.
Definition basistags.hh:84
│ │ │ │ +
Interleaved merging of direct children without blocking.
Definition basistags.hh:118
│ │ │ │ +
Lexicographic merging of direct children with blocking (i.e. creating one block per direct child).
Definition basistags.hh:152
│ │ │ │ +
Interleaved merging of direct children with blocking (i.e. creating blocks at the leaves containing o...
Definition basistags.hh:184
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,320 +1,154 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -hierarchicvectorwrapper.hh │ │ │ │ │ +basistags.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICVECTORWRAPPER_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICVECTORWRAPPER_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BASISTAGS_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BASISTAGS_HH │ │ │ │ │ 9 │ │ │ │ │ -10#ifndef DUNE_FUNCTIONS_HIERARCHICVECTORWRAPPER_TEST_NO_DEPRECATION │ │ │ │ │ -11#warning The header dune/functions/functionspacebases/ │ │ │ │ │ -hierarchicvectorwrapper.hh is deprecated and will be removed after release │ │ │ │ │ -2.10. │ │ │ │ │ -12#endif │ │ │ │ │ -13 │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12 │ │ │ │ │ +13namespace _D_u_n_e { │ │ │ │ │ +14namespace Functions { │ │ │ │ │ +15 │ │ │ │ │ +16 namespace Concept { │ │ │ │ │ 17 │ │ │ │ │ -18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_i_n_d_e_x_a_c_c_e_s_s_._h_h> │ │ │ │ │ -19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_u_t_i_l_i_t_y_._h_h> │ │ │ │ │ -20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ -21#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ -22 │ │ │ │ │ -23 │ │ │ │ │ -24namespace _D_u_n_e { │ │ │ │ │ -25namespace Functions { │ │ │ │ │ -26 │ │ │ │ │ -27 │ │ │ │ │ -28 │ │ │ │ │ -29namespace Imp { │ │ │ │ │ -30 │ │ │ │ │ -31 // Construct default coefficient type from vector and multiindex type │ │ │ │ │ -32 // This requires that MultiIndex has a static size. Otherwise the │ │ │ │ │ -33 // vector type itself is returned. │ │ │ │ │ -34 template │ │ │ │ │ -35 struct CoefficientType │ │ │ │ │ -36 { │ │ │ │ │ -37 template │ │ │ │ │ -38 struct DefaultCoefficientTypeHelper │ │ │ │ │ -39 { │ │ │ │ │ -40 using E0 = decltype(std::declval()[Dune::Indices::_0]); │ │ │ │ │ -41 using type = typename DefaultCoefficientTypeHelper::type; │ │ │ │ │ -42 }; │ │ │ │ │ -43 │ │ │ │ │ -44 template │ │ │ │ │ -45 struct DefaultCoefficientTypeHelper │ │ │ │ │ -46 { │ │ │ │ │ -47 using type = E; │ │ │ │ │ -48 }; │ │ │ │ │ +_1_8 struct _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ +19 { │ │ │ │ │ +20 template │ │ │ │ │ +_2_1 auto _r_e_q_u_i_r_e(T&& t) -> decltype( │ │ │ │ │ +22 registerIndexMergingStrategy(t) │ │ │ │ │ +23 ); │ │ │ │ │ +24 }; │ │ │ │ │ +25 │ │ │ │ │ +26 template │ │ │ │ │ +_2_7 static constexpr bool _i_s_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y() │ │ │ │ │ +28 { │ │ │ │ │ +29 return models(); │ │ │ │ │ +30 } │ │ │ │ │ +31 │ │ │ │ │ +32 template │ │ │ │ │ +_3_3 static constexpr bool _i_s_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y(T&& t) │ │ │ │ │ +34 { │ │ │ │ │ +35 return models>(); │ │ │ │ │ +36 } │ │ │ │ │ +37 │ │ │ │ │ +38 } // namespace Concept │ │ │ │ │ +39 │ │ │ │ │ +40 │ │ │ │ │ +_4_1namespace BasisFactory { │ │ │ │ │ +42 │ │ │ │ │ +_4_8 struct _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y {}; │ │ │ │ │ 49 │ │ │ │ │ -50 using type = typename DefaultCoefficientTypeHelper::value>::type; │ │ │ │ │ -51 }; │ │ │ │ │ -52 │ │ │ │ │ -53 │ │ │ │ │ -54 │ │ │ │ │ -55 // This tag class is used as Coefficient template parameter │ │ │ │ │ -56 // for HierarchicVectorWrapper if the coefficient type should │ │ │ │ │ -57 // be deduced. │ │ │ │ │ -58 struct DeducedCoefficientTag {}; │ │ │ │ │ -59 │ │ │ │ │ -60} // namespace Imp │ │ │ │ │ -61 │ │ │ │ │ -62 │ │ │ │ │ -63 │ │ │ │ │ -86template │ │ │ │ │ -_8_7class │ │ │ │ │ -88[[deprecated("HierarchicVectorWrapper is deprecated and will be removed after │ │ │ │ │ -release 2.10.")]] │ │ │ │ │ -89_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r │ │ │ │ │ -90{ │ │ │ │ │ -91 template │ │ │ │ │ -92 using Coefficient = std::conditional_t< std::is_same_v and HasStaticSize_v, │ │ │ │ │ -93 typename Imp::CoefficientType::type, │ │ │ │ │ -94 CO │ │ │ │ │ -95 >; │ │ │ │ │ -96 │ │ │ │ │ -97 │ │ │ │ │ -98 using size_type = std::size_t; │ │ │ │ │ -99 │ │ │ │ │ -100 template(), int> = 0, │ │ │ │ │ -102 std::enable_if_t< not models(), int> = 0> │ │ │ │ │ -103 static void resizeHelper(C& c, const SizeProvider& sizeProvider, typename │ │ │ │ │ -SizeProvider::SizePrefix prefix) │ │ │ │ │ -104 { │ │ │ │ │ -105 auto size = sizeProvider.size(prefix); │ │ │ │ │ -106 if (size != 0) │ │ │ │ │ -107 DUNE_THROW(RangeError, "Can't resize scalar vector entry v[" << prefix << │ │ │ │ │ -"] to size(" << prefix << ")=" << size); │ │ │ │ │ -108 } │ │ │ │ │ -109 │ │ │ │ │ -110 struct StaticResizeHelper │ │ │ │ │ -111 { │ │ │ │ │ -112 template │ │ │ │ │ -113 static void apply(I&& i, C& c, const SizeProvider& sizeProvider, typename │ │ │ │ │ -SizeProvider::SizePrefix prefix) │ │ │ │ │ -114 { │ │ │ │ │ -115 prefix.back() = i; │ │ │ │ │ -116 resizeHelper(c[i], sizeProvider, prefix); │ │ │ │ │ -117 } │ │ │ │ │ -118 }; │ │ │ │ │ +_5_0 void _r_e_g_i_s_t_e_r_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y(_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y); │ │ │ │ │ +51 │ │ │ │ │ +_8_2 struct _F_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c │ │ │ │ │ +83 : public _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ +84 {}; │ │ │ │ │ +85 │ │ │ │ │ +_1_1_6 struct _F_l_a_t_I_n_t_e_r_l_e_a_v_e_d │ │ │ │ │ +117 : public _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ +118 {}; │ │ │ │ │ 119 │ │ │ │ │ -120 template(), int> = 0, │ │ │ │ │ -122 std::enable_if_t< models(), int> = 0> │ │ │ │ │ -123 static void resizeHelper(C& c, const SizeProvider& sizeProvider, typename │ │ │ │ │ -SizeProvider::SizePrefix prefix) │ │ │ │ │ -124 { │ │ │ │ │ -125 auto size = sizeProvider.size(prefix); │ │ │ │ │ -126 if (size == 0) │ │ │ │ │ -127 return; │ │ │ │ │ -128 │ │ │ │ │ -129 if (c.size() != size) │ │ │ │ │ -130 DUNE_THROW(RangeError, "Can't resize statically sized vector entry v[" << │ │ │ │ │ -prefix << "] of size " << c.size() << " to size(" << prefix << ")=" << size); │ │ │ │ │ -131 │ │ │ │ │ -132 using namespace Dune::Hybrid; │ │ │ │ │ -133 prefix.push_back(0); │ │ │ │ │ -134 forEach(integralRange(Hybrid::size(c)), [&](auto&& i) { │ │ │ │ │ -135 StaticResizeHelper::apply(i, c, sizeProvider, prefix); │ │ │ │ │ -136 }); │ │ │ │ │ -137 } │ │ │ │ │ -138 │ │ │ │ │ -139 template(), int> = 0> │ │ │ │ │ -141 static void resizeHelper(C& c, const SizeProvider& sizeProvider, typename │ │ │ │ │ -SizeProvider::SizePrefix prefix) │ │ │ │ │ -142 { │ │ │ │ │ -143 auto size = sizeProvider.size(prefix); │ │ │ │ │ -144 if (size==0) │ │ │ │ │ -145 { │ │ │ │ │ -146 if (c.size()==0) │ │ │ │ │ -147 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."); │ │ │ │ │ -148 else │ │ │ │ │ -149 return; │ │ │ │ │ -150 } │ │ │ │ │ -151 │ │ │ │ │ -152 c.resize(size); │ │ │ │ │ -153 prefix.push_back(0); │ │ │ │ │ -154 for(std::size_t i=0; i │ │ │ │ │ -_1_6_8 using _E_n_t_r_y = Coefficient; │ │ │ │ │ -169 │ │ │ │ │ -_1_7_0 _H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r(_V_e_c_t_o_r& vector) : │ │ │ │ │ -171 vector_(&vector) │ │ │ │ │ -172 {} │ │ │ │ │ -173 │ │ │ │ │ -174 template │ │ │ │ │ -_1_7_5 void _r_e_s_i_z_e(const SizeProvider& sizeProvider) │ │ │ │ │ -176 { │ │ │ │ │ -177 typename SizeProvider::SizePrefix prefix; │ │ │ │ │ -178 prefix.resize(0); │ │ │ │ │ -179 resizeHelper(*vector_, sizeProvider, prefix); │ │ │ │ │ -180 } │ │ │ │ │ -181 │ │ │ │ │ -182 template │ │ │ │ │ -_1_8_3 const _E_n_t_r_y_<_M_u_l_t_i_I_n_d_e_x_>& _o_p_e_r_a_t_o_r_[_](const MultiIndex& index) const │ │ │ │ │ -184 { │ │ │ │ │ -185 static_assert(not std::is_same_v>, "Coefficient type for │ │ │ │ │ -HierarchicVectorWrapper and given multi-index type cannot be determined │ │ │ │ │ -automatically!"); │ │ │ │ │ -186 return hybridMultiIndexAccess&>(*vector_, index); │ │ │ │ │ -187 } │ │ │ │ │ -188 │ │ │ │ │ -189 template │ │ │ │ │ -_1_9_0 _E_n_t_r_y_<_M_u_l_t_i_I_n_d_e_x_>& _o_p_e_r_a_t_o_r_[_](const MultiIndex& index) │ │ │ │ │ -191 { │ │ │ │ │ -192 static_assert(not std::is_same_v>, "Coefficient type for │ │ │ │ │ -HierarchicVectorWrapper and given multi-index type cannot be determined │ │ │ │ │ -automatically!"); │ │ │ │ │ -193 return hybridMultiIndexAccess&>(*vector_, index); │ │ │ │ │ -194 } │ │ │ │ │ -195 │ │ │ │ │ -196 template │ │ │ │ │ -_1_9_7 const _E_n_t_r_y_<_M_u_l_t_i_I_n_d_e_x_>& _o_p_e_r_a_t_o_r_(_)(const MultiIndex& index) const │ │ │ │ │ -198 { │ │ │ │ │ -199 static_assert(not std::is_same_v>, "Coefficient type for │ │ │ │ │ -HierarchicVectorWrapper and given multi-index type cannot be determined │ │ │ │ │ -automatically!"); │ │ │ │ │ -200 return (*this)[index]; │ │ │ │ │ -201 } │ │ │ │ │ -202 │ │ │ │ │ -203 template │ │ │ │ │ -_2_0_4 _E_n_t_r_y_<_M_u_l_t_i_I_n_d_e_x_>& _o_p_e_r_a_t_o_r_(_)(const MultiIndex& index) │ │ │ │ │ -205 { │ │ │ │ │ -206 static_assert(not std::is_same_v>, "Coefficient type for │ │ │ │ │ -HierarchicVectorWrapper and given multi-index type cannot be determined │ │ │ │ │ -automatically!"); │ │ │ │ │ -207 return (*this)[index]; │ │ │ │ │ -208 } │ │ │ │ │ -209 │ │ │ │ │ -_2_1_0 const _V_e_c_t_o_r& _v_e_c_t_o_r() const │ │ │ │ │ -211 { │ │ │ │ │ -212 return *vector_; │ │ │ │ │ -213 } │ │ │ │ │ -214 │ │ │ │ │ -_2_1_5 _V_e_c_t_o_r& _v_e_c_t_o_r() │ │ │ │ │ -216 { │ │ │ │ │ -217 return *vector_; │ │ │ │ │ -218 } │ │ │ │ │ -219 │ │ │ │ │ -220private: │ │ │ │ │ -221 │ │ │ │ │ -222 Vector* vector_; │ │ │ │ │ -223}; │ │ │ │ │ -224 │ │ │ │ │ -225 │ │ │ │ │ +_1_5_0 struct _B_l_o_c_k_e_d_L_e_x_i_c_o_g_r_a_p_h_i_c │ │ │ │ │ +151 : public _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ +152 {}; │ │ │ │ │ +153 │ │ │ │ │ +_1_8_4 struct _B_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d : public _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y {}; │ │ │ │ │ +185 │ │ │ │ │ +186 │ │ │ │ │ +_1_9_2 constexpr _F_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c _f_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c() │ │ │ │ │ +193 { │ │ │ │ │ +194 return {}; │ │ │ │ │ +195 } │ │ │ │ │ +196 │ │ │ │ │ +_2_0_2 constexpr _F_l_a_t_I_n_t_e_r_l_e_a_v_e_d _f_l_a_t_I_n_t_e_r_l_e_a_v_e_d() │ │ │ │ │ +203 { │ │ │ │ │ +204 return {}; │ │ │ │ │ +205 } │ │ │ │ │ +206 │ │ │ │ │ +_2_1_2 constexpr _B_l_o_c_k_e_d_L_e_x_i_c_o_g_r_a_p_h_i_c _b_l_o_c_k_e_d_L_e_x_i_c_o_g_r_a_p_h_i_c() │ │ │ │ │ +213 { │ │ │ │ │ +214 return {}; │ │ │ │ │ +215 } │ │ │ │ │ +216 │ │ │ │ │ +_2_2_2 constexpr _B_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d _b_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d() │ │ │ │ │ +223 { │ │ │ │ │ +224 return {}; │ │ │ │ │ +225 } │ │ │ │ │ 226 │ │ │ │ │ -230template │ │ │ │ │ -_2_3_1_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_<_ _V_ _> _h_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r(V& v) │ │ │ │ │ -232{ │ │ │ │ │ -233 return _H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_<_V_>(v); │ │ │ │ │ +227} // end namespace BasisFactory │ │ │ │ │ +228 │ │ │ │ │ +229// Backward compatibility │ │ │ │ │ +_2_3_0namespace [[deprecated("Will be removed after Dune 2.10")]] BasisBuilder { │ │ │ │ │ +231 │ │ │ │ │ +232 using namespace BasisFactory; │ │ │ │ │ +233 │ │ │ │ │ 234} │ │ │ │ │ 235 │ │ │ │ │ -236 │ │ │ │ │ -237 │ │ │ │ │ -241template(), int> = │ │ │ │ │ -0> │ │ │ │ │ -_2_4_3V& _m_a_k_e_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_F_o_r_M_u_l_t_i_I_n_d_e_x(V& v) │ │ │ │ │ -244{ │ │ │ │ │ -245 return v; │ │ │ │ │ -246} │ │ │ │ │ -247 │ │ │ │ │ -248 │ │ │ │ │ -249 │ │ │ │ │ -253template(), │ │ │ │ │ -int> = 0> │ │ │ │ │ -_2_5_5_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_<_ _V_ _> _m_a_k_e_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_F_o_r_M_u_l_t_i_I_n_d_e_x(V& v) │ │ │ │ │ -256{ │ │ │ │ │ -257 return _H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_<_V_>(v); │ │ │ │ │ -258} │ │ │ │ │ -259 │ │ │ │ │ -260 │ │ │ │ │ -261 │ │ │ │ │ -262} // namespace Dune::Functions │ │ │ │ │ -263} // namespace Dune │ │ │ │ │ -264 │ │ │ │ │ -265 │ │ │ │ │ -266#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICVECTORWRAPPER_HH │ │ │ │ │ -_i_n_d_e_x_a_c_c_e_s_s_._h_h │ │ │ │ │ -_u_t_i_l_i_t_y_._h_h │ │ │ │ │ -_t_y_p_e___t_r_a_i_t_s_._h_h │ │ │ │ │ +236} // end namespace Functions │ │ │ │ │ +237} // end namespace Dune │ │ │ │ │ +238 │ │ │ │ │ +239 │ │ │ │ │ +240#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BASISTAGS_HH │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_f_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c │ │ │ │ │ +constexpr FlatLexicographic flatLexicographic() │ │ │ │ │ +Creates a lexicographic merging of direct children without blocking. │ │ │ │ │ +DDeeffiinniittiioonn basistags.hh:192 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_b_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d │ │ │ │ │ +constexpr BlockedInterleaved blockedInterleaved() │ │ │ │ │ +Creates an interleaved merging of direct children with blocking (i.e. creating │ │ │ │ │ +blocks at the leaves c... │ │ │ │ │ +DDeeffiinniittiioonn basistags.hh:222 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_f_l_a_t_I_n_t_e_r_l_e_a_v_e_d │ │ │ │ │ +constexpr FlatInterleaved flatInterleaved() │ │ │ │ │ +Creates an interleaved merging of direct children without blocking. │ │ │ │ │ +DDeeffiinniittiioonn basistags.hh:202 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_b_l_o_c_k_e_d_L_e_x_i_c_o_g_r_a_p_h_i_c │ │ │ │ │ +constexpr BlockedLexicographic blockedLexicographic() │ │ │ │ │ +Creates a lexicographic merging of direct children with blocking (i.e. creating │ │ │ │ │ +one block per direct ... │ │ │ │ │ +DDeeffiinniittiioonn basistags.hh:212 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_F_o_r_M_u_l_t_i_I_n_d_e_x │ │ │ │ │ -V & makeHierarchicVectorForMultiIndex(V &v) │ │ │ │ │ -DDeeffiinniittiioonn hierarchicvectorwrapper.hh:243 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_h_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r │ │ │ │ │ -HierarchicVectorWrapper< V > hierarchicVector(V &v) │ │ │ │ │ -DDeeffiinniittiioonn hierarchicvectorwrapper.hh:231 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r │ │ │ │ │ -A wrapper providing multiindex access to vector entries. │ │ │ │ │ -DDeeffiinniittiioonn hierarchicvectorwrapper.hh:90 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -Entry< MultiIndex > & operator()(const MultiIndex &index) │ │ │ │ │ -DDeeffiinniittiioonn hierarchicvectorwrapper.hh:204 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -Entry< MultiIndex > & operator[](const MultiIndex &index) │ │ │ │ │ -DDeeffiinniittiioonn hierarchicvectorwrapper.hh:190 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -const Entry< MultiIndex > & operator[](const MultiIndex &index) const │ │ │ │ │ -DDeeffiinniittiioonn hierarchicvectorwrapper.hh:183 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_:_:_v_e_c_t_o_r │ │ │ │ │ -Vector & vector() │ │ │ │ │ -DDeeffiinniittiioonn hierarchicvectorwrapper.hh:215 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_:_:_V_e_c_t_o_r │ │ │ │ │ -V Vector │ │ │ │ │ -DDeeffiinniittiioonn hierarchicvectorwrapper.hh:165 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_:_:_E_n_t_r_y │ │ │ │ │ -Coefficient< MultiIndex > Entry │ │ │ │ │ -DDeeffiinniittiioonn hierarchicvectorwrapper.hh:168 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_:_:_v_e_c_t_o_r │ │ │ │ │ -const Vector & vector() const │ │ │ │ │ -DDeeffiinniittiioonn hierarchicvectorwrapper.hh:210 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r │ │ │ │ │ -HierarchicVectorWrapper(Vector &vector) │ │ │ │ │ -DDeeffiinniittiioonn hierarchicvectorwrapper.hh:170 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -const Entry< MultiIndex > & operator()(const MultiIndex &index) const │ │ │ │ │ -DDeeffiinniittiioonn hierarchicvectorwrapper.hh:197 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_:_:_r_e_s_i_z_e │ │ │ │ │ -void resize(const SizeProvider &sizeProvider) │ │ │ │ │ -DDeeffiinniittiioonn hierarchicvectorwrapper.hh:175 │ │ │ │ │ -_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ +static constexpr bool isIndexMergingStrategy() │ │ │ │ │ +DDeeffiinniittiioonn basistags.hh:27 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_r_e_g_i_s_t_e_r_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ +void registerIndexMergingStrategy(IndexMergingStrategy) │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ +DDeeffiinniittiioonn basistags.hh:19 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y_:_:_r_e_q_u_i_r_e │ │ │ │ │ +auto require(T &&t) -> decltype(registerIndexMergingStrategy(t)) │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ +Base class for index merging strategies to simplify detection. │ │ │ │ │ +DDeeffiinniittiioonn basistags.hh:48 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_F_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c │ │ │ │ │ +Lexicographic merging of direct children without blocking. │ │ │ │ │ +DDeeffiinniittiioonn basistags.hh:84 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_F_l_a_t_I_n_t_e_r_l_e_a_v_e_d │ │ │ │ │ +Interleaved merging of direct children without blocking. │ │ │ │ │ +DDeeffiinniittiioonn basistags.hh:118 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_B_l_o_c_k_e_d_L_e_x_i_c_o_g_r_a_p_h_i_c │ │ │ │ │ +Lexicographic merging of direct children with blocking (i.e. creating one block │ │ │ │ │ +per direct child). │ │ │ │ │ +DDeeffiinniittiioonn basistags.hh:152 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_B_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d │ │ │ │ │ +Interleaved merging of direct children with blocking (i.e. creating blocks at │ │ │ │ │ +the leaves containing o... │ │ │ │ │ +DDeeffiinniittiioonn basistags.hh:184 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00152.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: transformedindexbasis.hh File Reference │ │ │ │ +dune-functions: containerdescriptors.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -72,74 +72,96 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ +Typedefs | │ │ │ │ Functions
│ │ │ │ -
transformedindexbasis.hh File Reference
│ │ │ │ +
containerdescriptors.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <tuple>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ │ -#include <dune/common/reservedvector.hh>
│ │ │ │ +
#include <array>
│ │ │ │ +#include <cassert>
│ │ │ │ +#include <functional>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <vector>
│ │ │ │ +#include <dune/common/filledarray.hh>
│ │ │ │ +#include <dune/common/tuplevector.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>
│ │ │ │ +#include <dune/functions/common/type_traits.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/basistags.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::ContainerDescriptors::Unknown
 Fallback container descriptor if nothing else fits. More...
 
class  Dune::Functions::BasisFactory::Experimental::GenericIndexingTransformation< IndexTransformation, SizeImplementation, ContainerDescriptorImplementation, minIS, maxIS >
 A generic implementation of a transformation. More...
struct  Dune::Functions::ContainerDescriptors::Value
 The node in the descriptor tree representing a value placeholder. More...
 
struct  Dune::Functions::ContainerDescriptors::UniformArray< Child, n >
 Descriptor for arrays with all children identical and the number of children a static size. More...
 
struct  Dune::Functions::ContainerDescriptors::UniformVector< Child >
 Uniform descriptor with dynamic size. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ +Typedefs

template<class... Children>
using Dune::Functions::ContainerDescriptors::Tuple = Dune::TupleVector< Children... >
 Descriptor with all children of possibly different type.
 
template<class Child , std::size_t n>
using Dune::Functions::ContainerDescriptors::Array = std::array< Child, n >
 Descriptor for arrays with all children of the same type and static size.
 
template<class Child >
using Dune::Functions::ContainerDescriptors::Vector = std::vector< Child >
 Descriptor for vectors with all children of the same type and dynamic size.
 
template<std::size_t n>
using Dune::Functions::ContainerDescriptors::FlatArray = UniformArray< Value, n >
 Alias for a uniform array storing value placeholders.
 
using Dune::Functions::ContainerDescriptors::FlatVector = UniformVector< Value >
 Alias for a uniform vector storing value placeholders.
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ 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.
 
template<class IndexTransformation , class SizeImplementation , class ContainerDescriptorImplementation , std::size_t minIndexSize, std::size_t maxIndexSize>
auto Dune::Functions::BasisFactory::Experimental::indexTransformation (IndexTransformation &&indexTransformation, SizeImplementation &&sizeImplementation, ContainerDescriptorImplementation &&containerDescriptorImplementation, Dune::index_constant< minIndexSize >, Dune::index_constant< maxIndexSize >)
 A generic implementation of a transformation.
 
template<class IndexTransformation , class SizeImplementation , std::size_t minIndexSize, std::size_t maxIndexSize>
auto Dune::Functions::BasisFactory::Experimental::indexTransformation (IndexTransformation &&indexTrafo, SizeImplementation &&sizeImpl, Dune::index_constant< minIndexSize > minSize, Dune::index_constant< maxIndexSize > maxSize)
 Fallback implementation if no container descriptor argument is given.
 
template<class PreBasis >
auto Dune::Functions::containerDescriptor (const PreBasis &preBasis)
 Return the container descriptor of the pre-basis, if defined, otherwise ContainerDescriptor::Unknown.
 
template<class Child0 , class... Children, std::enable_if_t<(std::is_same_v< Child0, Children > &&...), int > = 0>
auto Dune::Functions::ContainerDescriptors::makeDescriptor (Child0 child, Children... children)
 Generate a descriptor in case the children are all of the same type.
 
template<class Child , std::size_t n>
auto Dune::Functions::ContainerDescriptors::makeUniformDescriptor (std::integral_constant< std::size_t, n >, Child child)
 Generate a uniform descriptor in case the size is a static constant.
 
template<class Child >
auto Dune::Functions::ContainerDescriptors::makeUniformDescriptor (std::size_t n, Child child)
 Generate a uniform descriptor in case the size is a dynamic value.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,74 +1,91 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -transformedindexbasis.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +containerdescriptors.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_s_t_a_t_i_c_f_o_r_l_o_o_p_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_u_t_i_l_i_t_y_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_b_a_s_i_s_t_a_g_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_<_ _R_P_B_,_ _T_ _> │ │ │ │ │ -  A pre-basis transforming multi-indices. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_k_n_o_w_n │ │ │ │ │ +  Fallback container descriptor if nothing else fits. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_: │ │ │ │ │ - _G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n_<_ _I_n_d_e_x_T_r_a_n_s_f_o_r_m_a_t_i_o_n_,_ _S_i_z_e_I_m_p_l_e_m_e_n_t_a_t_i_o_n_, │ │ │ │ │ - _C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_I_m_p_l_e_m_e_n_t_a_t_i_o_n_,_ _m_i_n_I_S_,_ _m_a_x_I_S_ _> │ │ │ │ │ -  A generic implementation of a transformation. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_V_a_l_u_e │ │ │ │ │ +  The node in the descriptor tree representing a value placeholder. │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_A_r_r_a_y_<_ _C_h_i_l_d_,_ _n_ _> │ │ │ │ │ +  Descriptor for arrays with all children identical and the number of │ │ │ │ │ + children a static size. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_V_e_c_t_o_r_<_ _C_h_i_l_d_ _> │ │ │ │ │ +  Uniform descriptor with dynamic size. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l │ │ │ │ │ -  │ │ │ │ │ -namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y │ │ │ │ │ +namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l │ │ │ │ │ +TTyyppeeddeeffss │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_T_u_p_l_e = Dune::TupleVector< │ │ │ │ │ + Children... > │ │ │ │ │ +  Descriptor with all children of possibly different type. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_A_r_r_a_y = std::array< Child, n > │ │ │ │ │ +  Descriptor for arrays with all children of the same type and static │ │ │ │ │ + size. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_V_e_c_t_o_r = std::vector< Child > │ │ │ │ │ +  Descriptor for vectors with all children of the same type and dynamic │ │ │ │ │ + size. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_F_l_a_t_A_r_r_a_y = _U_n_i_f_o_r_m_A_r_r_a_y< _V_a_l_u_e, │ │ │ │ │ + n > │ │ │ │ │ +  Alias for a uniform array storing value placeholders. │ │ │ │ │ +  │ │ │ │ │ +using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_F_l_a_t_V_e_c_t_o_r = _U_n_i_f_o_r_m_V_e_c_t_o_r< _V_a_l_u_e │ │ │ │ │ + > │ │ │ │ │ +  Alias for a uniform vector storing value placeholders. │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s (RPB &&, T &&) - │ │ │ │ │ - > _T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s< std::decay_t< RPB >, std::decay_t< T > > │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_t_r_a_n_s_f_o_r_m_I_n_d_i_c_e_s │ │ │ │ │ - (RawPreBasisFactory &&preBasisFactory, Transformation &&transformation) │ │ │ │ │ -  Create a TransformedIndexPreBasisFactory. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_i_n_d_e_x_T_r_a_n_s_f_o_r_m_a_t_i_o_n │ │ │ │ │ - (IndexTransformation &&indexTransformation, SizeImplementation │ │ │ │ │ - &&sizeImplementation, ContainerDescriptorImplementation │ │ │ │ │ - &&containerDescriptorImplementation, Dune::index_constant< minIndexSize │ │ │ │ │ - >, Dune::index_constant< maxIndexSize >) │ │ │ │ │ -  A generic implementation of a transformation. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_i_n_d_e_x_T_r_a_n_s_f_o_r_m_a_t_i_o_n │ │ │ │ │ - (IndexTransformation &&indexTrafo, SizeImplementation &&sizeImpl, Dune:: │ │ │ │ │ - index_constant< minIndexSize > minSize, Dune::index_constant< │ │ │ │ │ - maxIndexSize > maxSize) │ │ │ │ │ -  Fallback implementation if no container descriptor argument is given. │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r (const PreBasis &preBasis) │ │ │ │ │ +  Return the container descriptor of the pre-basis, if defined, otherwise │ │ │ │ │ + ContainerDescriptor::Unknown. │ │ │ │ │ +  │ │ │ │ │ +template &&...), int > = 0> │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_m_a_k_e_D_e_s_c_r_i_p_t_o_r (Child0 child, │ │ │ │ │ + Children... children) │ │ │ │ │ +  Generate a descriptor in case the children are all of the same type. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_m_a_k_e_U_n_i_f_o_r_m_D_e_s_c_r_i_p_t_o_r (std:: │ │ │ │ │ + integral_constant< std::size_t, n >, Child child) │ │ │ │ │ +  Generate a uniform descriptor in case the size is a static constant. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_m_a_k_e_U_n_i_f_o_r_m_D_e_s_c_r_i_p_t_o_r (std::size_t │ │ │ │ │ + n, Child child) │ │ │ │ │ +  Generate a uniform descriptor in case the size is a dynamic value. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00152_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: transformedindexbasis.hh Source File │ │ │ │ +dune-functions: containerdescriptors.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,360 +74,299 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
transformedindexbasis.hh
│ │ │ │ +
containerdescriptors.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_CONTAINERDESCRIPTORS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_CONTAINERDESCRIPTORS_HH
│ │ │ │
9
│ │ │ │ -
10#include <tuple>
│ │ │ │ -
11#include <utility>
│ │ │ │ -
12
│ │ │ │ -
13#include <dune/common/hybridutilities.hh>
│ │ │ │ -
14#include <dune/common/reservedvector.hh>
│ │ │ │ -
15#include <dune/common/typeutilities.hh>
│ │ │ │ -
16#include <dune/common/hybridutilities.hh>
│ │ │ │ -
17
│ │ │ │ -
18#include <dune/typetree/compositenode.hh>
│ │ │ │ -
19#include <dune/typetree/utility.hh>
│ │ │ │ -
20
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
28
│ │ │ │ -
29
│ │ │ │ -
30namespace Dune {
│ │ │ │ -
31namespace Functions {
│ │ │ │ -
│ │ │ │ -
32namespace Experimental {
│ │ │ │ -
33
│ │ │ │ -
34// *****************************************************************************
│ │ │ │ -
35// *****************************************************************************
│ │ │ │ -
36
│ │ │ │ -
53template<class RPB, class T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
55{
│ │ │ │ -
56 using Transformation = T;
│ │ │ │ -
57
│ │ │ │ - │ │ │ │ -
59
│ │ │ │ -
60public:
│ │ │ │ -
61
│ │ │ │ -
62 using RawPreBasis = RPB;
│ │ │ │ -
63
│ │ │ │ -
65 using GridView = typename RawPreBasis::GridView;
│ │ │ │ -
66
│ │ │ │ -
68 using size_type = std::size_t;
│ │ │ │ -
69
│ │ │ │ -
71 using Node = typename RawPreBasis::Node;
│ │ │ │ -
72
│ │ │ │ -
73 static constexpr size_type maxMultiIndexSize = Transformation::maxIndexSize;
│ │ │ │ -
74 static constexpr size_type minMultiIndexSize = Transformation::minIndexSize;
│ │ │ │ -
75 static constexpr size_type multiIndexBufferSize = std::max(RawPreBasis::multiIndexBufferSize, maxMultiIndexSize);
│ │ │ │ -
76
│ │ │ │ -
82 template<class RPB_R, class T_R>
│ │ │ │ -
│ │ │ │ -
83 TransformedIndexPreBasis(RPB_R&& rawPreBasis, T_R&& transformation) :
│ │ │ │ -
84 rawPreBasis_(std::forward<RPB_R>(rawPreBasis)),
│ │ │ │ -
85 transformation_(std::forward<T_R>(transformation))
│ │ │ │ -
86 {}
│ │ │ │ -
│ │ │ │ +
10#include <array>
│ │ │ │ +
11#include <cassert>
│ │ │ │ +
12#include <functional>
│ │ │ │ +
13#include <type_traits>
│ │ │ │ +
14#include <vector>
│ │ │ │ +
15
│ │ │ │ +
16#include <dune/common/filledarray.hh>
│ │ │ │ +
17#include <dune/common/tuplevector.hh>
│ │ │ │ +
18#include <dune/common/typeutilities.hh>
│ │ │ │ +
19
│ │ │ │ + │ │ │ │ + │ │ │ │ +
22
│ │ │ │ +
46namespace Dune::Functions {
│ │ │ │ +
│ │ │ │ +
47namespace ContainerDescriptors {
│ │ │ │ +
48
│ │ │ │ +
50struct Unknown {};
│ │ │ │ +
51
│ │ │ │ +
52} // end namespace ContainerDescriptors
│ │ │ │ +
│ │ │ │ +
53
│ │ │ │ +
54namespace Impl {
│ │ │ │ +
55
│ │ │ │ +
56template<class PreBasis>
│ │ │ │ +
57auto containerDescriptorImpl(const PreBasis& preBasis, Dune::PriorityTag<1>)
│ │ │ │ +
58 -> decltype(preBasis.containerDescriptor())
│ │ │ │ +
59{
│ │ │ │ +
60 return preBasis.containerDescriptor();
│ │ │ │ +
61}
│ │ │ │ +
62
│ │ │ │ +
63template<class PreBasis>
│ │ │ │ +
64auto containerDescriptorImpl(const PreBasis& preBasis, Dune::PriorityTag<0>)
│ │ │ │ +
65{
│ │ │ │ +
66 return ContainerDescriptors::Unknown{};
│ │ │ │ +
67}
│ │ │ │ +
68
│ │ │ │ +
69} // end namespace Impl
│ │ │ │ +
70
│ │ │ │ +
72template<class PreBasis>
│ │ │ │ +
│ │ │ │ +
73auto containerDescriptor(const PreBasis& preBasis)
│ │ │ │ +
74{
│ │ │ │ +
75 return Impl::containerDescriptorImpl(preBasis, Dune::PriorityTag<2>{});
│ │ │ │ +
76}
│ │ │ │ +
│ │ │ │ +
77
│ │ │ │ +
78
│ │ │ │ +
79namespace ContainerDescriptors {
│ │ │ │ +
80
│ │ │ │ +
│ │ │ │ +
82struct Value
│ │ │ │ +
83{
│ │ │ │ +
85 template<class Index>
│ │ │ │ +
86 Value operator[] (const Index&) const { return {}; }
│ │ │ │
87
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
90 {
│ │ │ │ -
91 rawPreBasis_.initializeIndices();
│ │ │ │ -
92 }
│ │ │ │ -
│ │ │ │ -
93
│ │ │ │ -
│ │ │ │ -
95 const GridView& gridView() const
│ │ │ │ -
96 {
│ │ │ │ -
97 return rawPreBasis_.gridView();
│ │ │ │ -
98 }
│ │ │ │ -
│ │ │ │ -
99
│ │ │ │ -
│ │ │ │ -
101 void update(const GridView& gv)
│ │ │ │ -
102 {
│ │ │ │ -
103 rawPreBasis_.update(gv);
│ │ │ │ -
104 }
│ │ │ │ -
│ │ │ │ -
105
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
117 {
│ │ │ │ -
118 return rawPreBasis_.makeNode();
│ │ │ │ -
119 }
│ │ │ │ +
89 static constexpr std::size_t size () { return 0; }
│ │ │ │ +
90};
│ │ │ │
│ │ │ │ -
120
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
123 {
│ │ │ │ -
124 return size(Dune::ReservedVector<size_type, multiIndexBufferSize>{});
│ │ │ │ -
125 }
│ │ │ │ -
│ │ │ │ -
126
│ │ │ │ -
128 template<class SizePrefix>
│ │ │ │ -
│ │ │ │ -
129 size_type size(const SizePrefix& prefix) const
│ │ │ │ -
130 {
│ │ │ │ -
131 return transformation_.size(prefix, rawPreBasis_);
│ │ │ │ -
132 }
│ │ │ │ -
│ │ │ │ -
133
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
136 {
│ │ │ │ -
137 return transformation_.containerDescriptor(rawPreBasis_);
│ │ │ │ -
138 }
│ │ │ │ -
│ │ │ │ -
139
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
142 {
│ │ │ │ -
143 return transformation_.dimension(rawPreBasis_);
│ │ │ │ -
144 }
│ │ │ │ +
91
│ │ │ │ +
93template<class... Children>
│ │ │ │ +
94using Tuple = Dune::TupleVector<Children...>;
│ │ │ │ +
95
│ │ │ │ +
98template<class Child0, class... Children,
│ │ │ │ +
99 std::enable_if_t<(sizeof...(Children) > 0), int> = 0,
│ │ │ │ +
100 std::enable_if_t<(...|| (not std::is_same_v<Child0, Children>)), int> = 0>
│ │ │ │ +
101auto makeDescriptor (Child0 child0, Children... children)
│ │ │ │ +
102{
│ │ │ │ +
103 using Descriptor = Tuple<Child0,Children...>;
│ │ │ │ +
104 return Descriptor{std::move(child0),std::move(children)...};
│ │ │ │ +
105}
│ │ │ │ +
106
│ │ │ │ +
107
│ │ │ │ +
109template<class Child, std::size_t n>
│ │ │ │ +
110using Array = std::array<Child, n>;
│ │ │ │ +
111
│ │ │ │ +
113template<class Child0, class... Children,
│ │ │ │ +
114 std::enable_if_t<(std::is_same_v<Child0, Children> &&...), int> = 0>
│ │ │ │ +
│ │ │ │ +
115auto makeDescriptor (Child0 child, Children... children)
│ │ │ │ +
116{
│ │ │ │ +
117 using Descriptor = Array<Child0,1+sizeof...(Children)>;
│ │ │ │ +
118 return Descriptor{std::move(child),std::move(children)...};
│ │ │ │ +
119}
│ │ │ │
│ │ │ │ +
120
│ │ │ │ +
121
│ │ │ │ +
123template<class Child>
│ │ │ │ +
124using Vector = std::vector<Child>;
│ │ │ │ +
125
│ │ │ │ +
127template<class Child, std::size_t n>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
129{
│ │ │ │ +
131 template<class C = Child,
│ │ │ │ +
132 std::enable_if_t<std::is_default_constructible_v<C>, int> = 0>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
134 : child_{}
│ │ │ │ +
135 {}
│ │ │ │ +
│ │ │ │ +
136
│ │ │ │ +
│ │ │ │ +
138 explicit UniformArray (Child child)
│ │ │ │ +
139 : child_{std::move(child)}
│ │ │ │ +
140 {}
│ │ │ │ +
│ │ │ │ +
141
│ │ │ │ +
143 template<class Index>
│ │ │ │ +
144 const Child& operator[] (const Index& /*i*/) const { return child_; }
│ │ │ │
145
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
148 {
│ │ │ │ -
149 return rawPreBasis_.maxNodeSize();
│ │ │ │ -
150 }
│ │ │ │ -
│ │ │ │ -
151
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
153 {
│ │ │ │ -
154 return rawPreBasis_;
│ │ │ │ -
155 }
│ │ │ │ -
│ │ │ │ +
147 static constexpr std::size_t size () { return n; }
│ │ │ │ +
148
│ │ │ │ +
149private:
│ │ │ │ +
150 Child child_;
│ │ │ │ +
151};
│ │ │ │ +
│ │ │ │ +
152
│ │ │ │ +
154template<std::size_t n>
│ │ │ │ + │ │ │ │
156
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
158 {
│ │ │ │ -
159 return rawPreBasis_;
│ │ │ │ -
160 }
│ │ │ │ -
│ │ │ │ -
161
│ │ │ │ -
162 template<class MultiIndex>
│ │ │ │ -
│ │ │ │ -
163 void transformIndex(MultiIndex& multiIndex) const
│ │ │ │ -
164 {
│ │ │ │ -
165 transformation_.transformIndex(multiIndex, rawPreBasis_);
│ │ │ │ -
166 }
│ │ │ │ -
│ │ │ │ -
167
│ │ │ │ -
168 template<typename It>
│ │ │ │ -
│ │ │ │ -
169 It indices(const Node& node, It it) const
│ │ │ │ -
170 {
│ │ │ │ -
171 rawPreBasis().indices(node, it);
│ │ │ │ -
172 for(std::size_t i=0; i<node.size(); ++i)
│ │ │ │ -
173 {
│ │ │ │ -
174 transformIndex(*it);
│ │ │ │ -
175 ++it;
│ │ │ │ -
176 }
│ │ │ │ -
177 return it;
│ │ │ │ -
178 }
│ │ │ │ -
│ │ │ │ -
179
│ │ │ │ -
180protected:
│ │ │ │ - │ │ │ │ -
182 Transformation transformation_;
│ │ │ │ -
183};
│ │ │ │ -
│ │ │ │ -
184
│ │ │ │ -
185template<class RPB, class T>
│ │ │ │ - │ │ │ │ -
187
│ │ │ │ -
188
│ │ │ │ -
189} // end namespace Experimental
│ │ │ │ -
│ │ │ │ -
190
│ │ │ │ -
191
│ │ │ │ -
192namespace BasisFactory {
│ │ │ │ -
193namespace Experimental {
│ │ │ │ -
194
│ │ │ │ -
206template<class RawPreBasisFactory, class Transformation>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
208 RawPreBasisFactory&& preBasisFactory,
│ │ │ │ -
209 Transformation&& transformation)
│ │ │ │ -
210{
│ │ │ │ -
211 return [
│ │ │ │ -
212 preBasisFactory=std::forward<RawPreBasisFactory>(preBasisFactory),
│ │ │ │ -
213 transformation =std::forward<Transformation>(transformation)
│ │ │ │ -
214 ](const auto& gridView) {
│ │ │ │ -
215 return Dune::Functions::Experimental::TransformedIndexPreBasis(preBasisFactory(gridView), std::move(transformation));
│ │ │ │ -
216 };
│ │ │ │ -
217}
│ │ │ │ +
158template<class Child, std::size_t n>
│ │ │ │ +
│ │ │ │ +
159auto makeUniformDescriptor (std::integral_constant<std::size_t,n>, Child child)
│ │ │ │ +
160{
│ │ │ │ +
161 return UniformArray<Child,n>{std::move(child)};
│ │ │ │ +
162}
│ │ │ │ +
│ │ │ │ +
163
│ │ │ │ +
164
│ │ │ │ +
166template<class Child>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
168{
│ │ │ │ +
170 template<class C = Child,
│ │ │ │ +
171 std::enable_if_t<std::is_default_constructible_v<C>, int> = 0>
│ │ │ │ +
│ │ │ │ +
172 explicit UniformVector (std::size_t size)
│ │ │ │ +
173 : size_{size}
│ │ │ │ +
174 , child_{}
│ │ │ │ +
175 {}
│ │ │ │ +
│ │ │ │ +
176
│ │ │ │ +
│ │ │ │ +
178 UniformVector (std::size_t size, Child child)
│ │ │ │ +
179 : size_{size}
│ │ │ │ +
180 , child_{std::move(child)}
│ │ │ │ +
181 {}
│ │ │ │ +
│ │ │ │ +
182
│ │ │ │ +
184 template<class Index>
│ │ │ │ +
185 const Child& operator[] (const Index& /*i*/) const { return child_; }
│ │ │ │ +
186
│ │ │ │ +
188 std::size_t size () const { return size_; }
│ │ │ │ +
189
│ │ │ │ +
190private:
│ │ │ │ +
191 std::size_t size_;
│ │ │ │ +
192 Child child_;
│ │ │ │ +
193};
│ │ │ │
│ │ │ │ -
218
│ │ │ │ +
194
│ │ │ │ + │ │ │ │ +
197
│ │ │ │ +
199template<class Child>
│ │ │ │ +
│ │ │ │ +
200auto makeUniformDescriptor (std::size_t n, Child child)
│ │ │ │ +
201{
│ │ │ │ +
202 return UniformVector<Child>{n,std::move(child)};
│ │ │ │ +
203}
│ │ │ │ +
│ │ │ │ +
204
│ │ │ │ +
205namespace Impl {
│ │ │ │ +
206
│ │ │ │ +
207template<class InnerFunc, class LeafFunc>
│ │ │ │ +
208struct TreeTransform
│ │ │ │ +
209{
│ │ │ │ +
210 TreeTransform (const InnerFunc& innerFunc, const LeafFunc& leafFunc)
│ │ │ │ +
211 : innerFunc_(innerFunc)
│ │ │ │ +
212 , leafFunc_(leafFunc)
│ │ │ │ +
213 {}
│ │ │ │ +
214
│ │ │ │ +
215 Unknown operator() (const Unknown& tree) const
│ │ │ │ +
216 {
│ │ │ │ +
217 return tree;
│ │ │ │ +
218 }
│ │ │ │
219
│ │ │ │ -
220
│ │ │ │ -
239template<class IndexTransformation, class SizeImplementation, class ContainerDescriptorImplementation, std::size_t minIS, std::size_t maxIS>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
241{
│ │ │ │ -
242public:
│ │ │ │ -
243
│ │ │ │ -
244 static constexpr std::size_t minIndexSize = minIS;
│ │ │ │ -
245 static constexpr std::size_t maxIndexSize = maxIS;
│ │ │ │ -
246
│ │ │ │ -
247 template<class IT_R, class SI_R, class CD_R>
│ │ │ │ -
│ │ │ │ -
248 GenericIndexingTransformation(IT_R&& indexTransformation, SI_R&& sizeImplementation, CD_R&& containerDescriptorImplementation) :
│ │ │ │ -
249 indexTransformation_(std::forward<IT_R>(indexTransformation)),
│ │ │ │ -
250 sizeImplementation_(std::forward<SI_R>(sizeImplementation)),
│ │ │ │ -
251 containerDescriptorImplementation_(std::forward<CD_R>(containerDescriptorImplementation))
│ │ │ │ -
252 {}
│ │ │ │ -
│ │ │ │ -
253
│ │ │ │ -
254 template<class MultiIndex, class PreBasis>
│ │ │ │ -
│ │ │ │ -
255 void transformIndex(MultiIndex& multiIndex, const PreBasis& preBasis) const
│ │ │ │ -
256 {
│ │ │ │ -
257 indexTransformation_(multiIndex, preBasis);
│ │ │ │ -
258 }
│ │ │ │ -
│ │ │ │ -
259
│ │ │ │ -
260 template<class Prefix, class PreBasis>
│ │ │ │ -
│ │ │ │ -
261 auto size(const Prefix& prefix, const PreBasis& preBasis) const
│ │ │ │ -
262 {
│ │ │ │ -
263 return sizeImplementation_(prefix, preBasis);
│ │ │ │ -
264 }
│ │ │ │ -
│ │ │ │ -
265
│ │ │ │ -
266 template<class PreBasis>
│ │ │ │ -
│ │ │ │ -
267 auto dimension(const PreBasis& preBasis) const
│ │ │ │ -
268 {
│ │ │ │ -
269 return preBasis.dimension();
│ │ │ │ -
270 }
│ │ │ │ -
│ │ │ │ -
271
│ │ │ │ -
272 template<class PreBasis>
│ │ │ │ -
│ │ │ │ -
273 auto containerDescriptor(const PreBasis& preBasis) const
│ │ │ │ -
274 {
│ │ │ │ -
275 return containerDescriptorImplementation_(preBasis);
│ │ │ │ -
276 }
│ │ │ │ -
│ │ │ │ -
277
│ │ │ │ -
278private:
│ │ │ │ -
279 IndexTransformation indexTransformation_;
│ │ │ │ -
280 SizeImplementation sizeImplementation_;
│ │ │ │ -
281 ContainerDescriptorImplementation containerDescriptorImplementation_;
│ │ │ │ -
282};
│ │ │ │ -
│ │ │ │ -
283
│ │ │ │ -
284
│ │ │ │ -
285
│ │ │ │ -
305template<class IndexTransformation, class SizeImplementation, class ContainerDescriptorImplementation, std::size_t minIndexSize, std::size_t maxIndexSize>
│ │ │ │ -
│ │ │ │ -
306auto indexTransformation(IndexTransformation&& indexTransformation,
│ │ │ │ -
307 SizeImplementation&& sizeImplementation,
│ │ │ │ -
308 ContainerDescriptorImplementation&& containerDescriptorImplementation,
│ │ │ │ -
309 Dune::index_constant<minIndexSize>,
│ │ │ │ -
310 Dune::index_constant<maxIndexSize>)
│ │ │ │ -
311{
│ │ │ │ - │ │ │ │ -
313 std::decay_t<IndexTransformation>,
│ │ │ │ -
314 std::decay_t<SizeImplementation>,
│ │ │ │ -
315 std::decay_t<ContainerDescriptorImplementation>,
│ │ │ │ -
316 minIndexSize, maxIndexSize>(
│ │ │ │ -
317 std::forward<IndexTransformation>(indexTransformation),
│ │ │ │ -
318 std::forward<SizeImplementation>(sizeImplementation),
│ │ │ │ -
319 std::forward<ContainerDescriptorImplementation>(containerDescriptorImplementation));
│ │ │ │ -
320}
│ │ │ │ -
│ │ │ │ -
321
│ │ │ │ -
323template<class IndexTransformation, class SizeImplementation,
│ │ │ │ -
324 std::size_t minIndexSize, std::size_t maxIndexSize>
│ │ │ │ -
│ │ │ │ -
325auto indexTransformation(IndexTransformation&& indexTrafo,
│ │ │ │ -
326 SizeImplementation&& sizeImpl,
│ │ │ │ -
327 Dune::index_constant<minIndexSize> minSize,
│ │ │ │ -
328 Dune::index_constant<maxIndexSize> maxSize)
│ │ │ │ -
329{
│ │ │ │ -
330 return indexTransformation(indexTrafo, sizeImpl,
│ │ │ │ -
331 [](auto&&) { return Dune::Functions::ContainerDescriptors::Unknown{}; },
│ │ │ │ -
332 minSize, maxSize);
│ │ │ │ -
333}
│ │ │ │ -
│ │ │ │ -
334
│ │ │ │ -
335} // end namespace Experimental
│ │ │ │ -
336} // end namespace BasisFactory
│ │ │ │ -
337} // end namespace Functions
│ │ │ │ -
338} // end namespace Dune
│ │ │ │ -
339
│ │ │ │ -
340
│ │ │ │ -
341#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
Definition polynomial.hh:17
│ │ │ │ -
auto indexTransformation(IndexTransformation &&indexTransformation, SizeImplementation &&sizeImplementation, ContainerDescriptorImplementation &&containerDescriptorImplementation, Dune::index_constant< minIndexSize >, Dune::index_constant< maxIndexSize >)
A generic implementation of a transformation.
Definition transformedindexbasis.hh:306
│ │ │ │ -
auto transformIndices(RawPreBasisFactory &&preBasisFactory, Transformation &&transformation)
Create a TransformedIndexPreBasisFactory.
Definition transformedindexbasis.hh:207
│ │ │ │ +
220 auto operator() (const Value& tree) const
│ │ │ │ +
221 {
│ │ │ │ +
222 return leafFunc_(tree);
│ │ │ │ +
223 }
│ │ │ │ +
224
│ │ │ │ +
225 template<class... V>
│ │ │ │ +
226 auto operator() (const Tuple<V...>& tree) const
│ │ │ │ +
227 {
│ │ │ │ +
228 return unpackIntegerSequence([&](auto... ii) {
│ │ │ │ +
229 return makeDescriptor(innerFunc_(tree[ii])...);
│ │ │ │ +
230 }, std::make_index_sequence<sizeof...(V)>());
│ │ │ │ +
231 }
│ │ │ │ +
232
│ │ │ │ +
233 template<class V, std::size_t n>
│ │ │ │ +
234 auto operator() (const Array<V,n>& tree) const
│ │ │ │ +
235 {
│ │ │ │ +
236 return unpackIntegerSequence([&](auto... ii) {
│ │ │ │ +
237 return makeDescriptor(innerFunc_(tree[ii])...);
│ │ │ │ +
238 }, std::make_index_sequence<n>());
│ │ │ │ +
239 }
│ │ │ │ +
240
│ │ │ │ +
241 template<class V>
│ │ │ │ +
242 auto operator() (const Vector<V>& tree) const
│ │ │ │ +
243 {
│ │ │ │ +
244 using W = decltype(innerFunc_(tree[0]));
│ │ │ │ +
245 Vector<W> result;
│ │ │ │ +
246 result.reserve(tree.size());
│ │ │ │ +
247 for (std::size_t i = 0; i < tree.size(); ++i)
│ │ │ │ +
248 result.emplace_back(innerFunc_(tree[i]));
│ │ │ │ +
249 return result;
│ │ │ │ +
250 }
│ │ │ │ +
251
│ │ │ │ +
252 template<class V, std::size_t n>
│ │ │ │ +
253 auto operator() (const UniformArray<V,n>& tree) const
│ │ │ │ +
254 {
│ │ │ │ +
255 return makeUniformDescriptor(Dune::index_constant<n>{}, innerFunc_(tree[0]));
│ │ │ │ +
256 }
│ │ │ │ +
257
│ │ │ │ +
258 template<class V>
│ │ │ │ +
259 auto operator() (const UniformVector<V>& tree) const
│ │ │ │ +
260 {
│ │ │ │ +
261 return makeUniformDescriptor(tree.size(), innerFunc_(tree[0]));
│ │ │ │ +
262 }
│ │ │ │ +
263
│ │ │ │ +
264private:
│ │ │ │ +
265 InnerFunc innerFunc_;
│ │ │ │ +
266 LeafFunc leafFunc_;
│ │ │ │ +
267};
│ │ │ │ +
268
│ │ │ │ +
269
│ │ │ │ +
280template<class Size, class T>
│ │ │ │ +
281auto appendToTree (Size s, const T& tree)
│ │ │ │ +
282{
│ │ │ │ +
283 auto transform = TreeTransform(
│ │ │ │ +
284 [s](auto&& node) { return appendToTree(s, node); },
│ │ │ │ +
285 [s](auto&& node) { return makeUniformDescriptor(s, node); });
│ │ │ │ +
286 return transform(tree);
│ │ │ │ +
287}
│ │ │ │ +
288
│ │ │ │ +
289} // end namespace Impl
│ │ │ │ +
290} // end namespace ContainerDescriptors
│ │ │ │ +
291} // end namespace Dune::Functions
│ │ │ │ +
292
│ │ │ │ +
293#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_CONTAINERDESCRIPTORS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ +
Definition polynomial.hh:18
│ │ │ │ +
auto containerDescriptor(const PreBasis &preBasis)
Return the container descriptor of the pre-basis, if defined, otherwise ContainerDescriptor::Unknown.
Definition containerdescriptors.hh:73
│ │ │ │ +
std::array< Child, n > Array
Descriptor for arrays with all children of the same type and static size.
Definition containerdescriptors.hh:110
│ │ │ │ +
auto makeUniformDescriptor(std::integral_constant< std::size_t, n >, Child child)
Generate a uniform descriptor in case the size is a static constant.
Definition containerdescriptors.hh:159
│ │ │ │ +
Dune::TupleVector< Children... > Tuple
Descriptor with all children of possibly different type.
Definition containerdescriptors.hh:94
│ │ │ │ +
auto makeDescriptor(Child0 child, Children... children)
Generate a descriptor in case the children are all of the same type.
Definition containerdescriptors.hh:115
│ │ │ │ +
std::vector< Child > Vector
Descriptor for vectors with all children of the same type and dynamic size.
Definition containerdescriptors.hh:124
│ │ │ │
Fallback container descriptor if nothing else fits.
Definition containerdescriptors.hh:50
│ │ │ │ -
A pre-basis transforming multi-indices.
Definition transformedindexbasis.hh:55
│ │ │ │ -
It indices(const Node &node, It it) const
Definition transformedindexbasis.hh:169
│ │ │ │ -
Transformation transformation_
Definition transformedindexbasis.hh:182
│ │ │ │ -
void initializeIndices()
Initialize the global indices.
Definition transformedindexbasis.hh:89
│ │ │ │ -
typename RawPreBasis::GridView GridView
The grid view that the FE basis is defined on.
Definition transformedindexbasis.hh:65
│ │ │ │ -
void transformIndex(MultiIndex &multiIndex) const
Definition transformedindexbasis.hh:163
│ │ │ │ -
RawPreBasis rawPreBasis_
Definition transformedindexbasis.hh:181
│ │ │ │ -
typename RawPreBasis::Node Node
Template mapping root tree path to type of created tree node.
Definition transformedindexbasis.hh:71
│ │ │ │ -
TransformedIndexPreBasis(RPB_R &&rawPreBasis, T_R &&transformation)
Constructor for given child pre-basis objects.
Definition transformedindexbasis.hh:83
│ │ │ │ -
RawPreBasis & rawPreBasis()
Definition transformedindexbasis.hh:157
│ │ │ │ -
static constexpr size_type maxMultiIndexSize
Definition transformedindexbasis.hh:73
│ │ │ │ -
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition transformedindexbasis.hh:101
│ │ │ │ -
Node makeNode() const
Create tree node with given root tree path.
Definition transformedindexbasis.hh:116
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition transformedindexbasis.hh:95
│ │ │ │ -
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition transformedindexbasis.hh:129
│ │ │ │ -
RPB RawPreBasis
Definition transformedindexbasis.hh:62
│ │ │ │ -
size_type size() const
Same as size(prefix) with empty prefix.
Definition transformedindexbasis.hh:122
│ │ │ │ -
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition transformedindexbasis.hh:147
│ │ │ │ -
std::size_t size_type
Type used for indices and size information.
Definition transformedindexbasis.hh:68
│ │ │ │ -
static constexpr size_type multiIndexBufferSize
Definition transformedindexbasis.hh:75
│ │ │ │ -
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition transformedindexbasis.hh:141
│ │ │ │ -
const RawPreBasis & rawPreBasis() const
Definition transformedindexbasis.hh:152
│ │ │ │ -
static constexpr size_type minMultiIndexSize
Definition transformedindexbasis.hh:74
│ │ │ │ -
auto containerDescriptor() const
Return the container descriptor of the transformed pre-basis.
Definition transformedindexbasis.hh:135
│ │ │ │ -
A generic implementation of a transformation.
Definition transformedindexbasis.hh:241
│ │ │ │ -
GenericIndexingTransformation(IT_R &&indexTransformation, SI_R &&sizeImplementation, CD_R &&containerDescriptorImplementation)
Definition transformedindexbasis.hh:248
│ │ │ │ -
static constexpr std::size_t maxIndexSize
Definition transformedindexbasis.hh:245
│ │ │ │ -
auto containerDescriptor(const PreBasis &preBasis) const
Definition transformedindexbasis.hh:273
│ │ │ │ -
auto dimension(const PreBasis &preBasis) const
Definition transformedindexbasis.hh:267
│ │ │ │ -
auto size(const Prefix &prefix, const PreBasis &preBasis) const
Definition transformedindexbasis.hh:261
│ │ │ │ -
static constexpr std::size_t minIndexSize
Definition transformedindexbasis.hh:244
│ │ │ │ -
void transformIndex(MultiIndex &multiIndex, const PreBasis &preBasis) const
Definition transformedindexbasis.hh:255
│ │ │ │ - │ │ │ │ +
The node in the descriptor tree representing a value placeholder.
Definition containerdescriptors.hh:83
│ │ │ │ +
static constexpr std::size_t size()
A value placeholder does not have any sub-descriptors, thus its size is zero.
Definition containerdescriptors.hh:89
│ │ │ │ +
Value operator[](const Index &) const
The child access method is only available for the interface, but should not be called.
Definition containerdescriptors.hh:86
│ │ │ │ +
Descriptor for arrays with all children identical and the number of children a static size.
Definition containerdescriptors.hh:129
│ │ │ │ +
static constexpr std::size_t size()
The static size information, i.e., number of children.
Definition containerdescriptors.hh:147
│ │ │ │ +
UniformArray()
Default constructor. Is enable if the child-type is default constructible.
Definition containerdescriptors.hh:133
│ │ │ │ +
UniformArray(Child child)
Constructor that stores a single child only.
Definition containerdescriptors.hh:138
│ │ │ │ +
const Child & operator[](const Index &) const
Access the i'th child that is always the same, i.e., child_.
Definition containerdescriptors.hh:144
│ │ │ │ +
Uniform descriptor with dynamic size.
Definition containerdescriptors.hh:168
│ │ │ │ +
UniformVector(std::size_t size, Child child)
Constructor that stores the size and a single child only.
Definition containerdescriptors.hh:178
│ │ │ │ +
std::size_t size() const
The dynamic size information, i.e., number of children.
Definition containerdescriptors.hh:188
│ │ │ │ +
UniformVector(std::size_t size)
Default constructor with size. Is enable if the child-type is default constructible.
Definition containerdescriptors.hh:172
│ │ │ │ +
const Child & operator[](const Index &) const
Access the i'th child that is always the same, i.e., child_.
Definition containerdescriptors.hh:185
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,416 +1,335 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -transformedindexbasis.hh │ │ │ │ │ +containerdescriptors.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_CONTAINERDESCRIPTORS_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_CONTAINERDESCRIPTORS_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12 │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17 │ │ │ │ │ -18#include │ │ │ │ │ -19#include │ │ │ │ │ -20 │ │ │ │ │ -21#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_s_t_a_t_i_c_f_o_r_l_o_o_p_._h_h> │ │ │ │ │ -22#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ -23#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_u_t_i_l_i_t_y_._h_h> │ │ │ │ │ -24#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_b_a_s_i_s_t_a_g_s_._h_h> │ │ │ │ │ -25#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ -26#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ -27#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ -28 │ │ │ │ │ -29 │ │ │ │ │ -30namespace _D_u_n_e { │ │ │ │ │ -31namespace Functions { │ │ │ │ │ -_3_2namespace Experimental { │ │ │ │ │ -33 │ │ │ │ │ -34/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ -35/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ -36 │ │ │ │ │ -53template │ │ │ │ │ -_5_4class _T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s │ │ │ │ │ -55{ │ │ │ │ │ -56 using Transformation = T; │ │ │ │ │ -57 │ │ │ │ │ -58 using _T_h_i_s = _T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_<_R_P_B_,_ _T_>; │ │ │ │ │ -59 │ │ │ │ │ -60public: │ │ │ │ │ -61 │ │ │ │ │ -_6_2 using _R_a_w_P_r_e_B_a_s_i_s = RPB; │ │ │ │ │ -63 │ │ │ │ │ -_6_5 using _G_r_i_d_V_i_e_w = typename RawPreBasis::GridView; │ │ │ │ │ -66 │ │ │ │ │ -_6_8 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ -69 │ │ │ │ │ -_7_1 using _N_o_d_e = typename RawPreBasis::Node; │ │ │ │ │ -72 │ │ │ │ │ -_7_3 static constexpr _s_i_z_e___t_y_p_e _m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e = Transformation::maxIndexSize; │ │ │ │ │ -_7_4 static constexpr _s_i_z_e___t_y_p_e _m_i_n_M_u_l_t_i_I_n_d_e_x_S_i_z_e = Transformation::minIndexSize; │ │ │ │ │ -_7_5 static constexpr _s_i_z_e___t_y_p_e _m_u_l_t_i_I_n_d_e_x_B_u_f_f_e_r_S_i_z_e = std::max(RawPreBasis:: │ │ │ │ │ -multiIndexBufferSize, _m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e); │ │ │ │ │ -76 │ │ │ │ │ -82 template │ │ │ │ │ -_8_3 _T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s(RPB_R&& _r_a_w_P_r_e_B_a_s_i_s, T_R&& transformation) : │ │ │ │ │ -84 _r_a_w_P_r_e_B_a_s_i_s__(std::forward(_r_a_w_P_r_e_B_a_s_i_s)), │ │ │ │ │ -85 _t_r_a_n_s_f_o_r_m_a_t_i_o_n__(std::forward(transformation)) │ │ │ │ │ -86 {} │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15 │ │ │ │ │ +16#include │ │ │ │ │ +17#include │ │ │ │ │ +18#include │ │ │ │ │ +19 │ │ │ │ │ +20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ +21#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_b_a_s_i_s_t_a_g_s_._h_h> │ │ │ │ │ +22 │ │ │ │ │ +46namespace _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s { │ │ │ │ │ +_4_7namespace ContainerDescriptors { │ │ │ │ │ +48 │ │ │ │ │ +_5_0struct _U_n_k_n_o_w_n {}; │ │ │ │ │ +51 │ │ │ │ │ +52} // end namespace ContainerDescriptors │ │ │ │ │ +53 │ │ │ │ │ +54namespace Impl { │ │ │ │ │ +55 │ │ │ │ │ +56template │ │ │ │ │ +57auto containerDescriptorImpl(const PreBasis& preBasis, Dune::PriorityTag<1>) │ │ │ │ │ +58 -> decltype(preBasis.containerDescriptor()) │ │ │ │ │ +59{ │ │ │ │ │ +60 return preBasis.containerDescriptor(); │ │ │ │ │ +61} │ │ │ │ │ +62 │ │ │ │ │ +63template │ │ │ │ │ +64auto containerDescriptorImpl(const PreBasis& preBasis, Dune::PriorityTag<0>) │ │ │ │ │ +65{ │ │ │ │ │ +66 return ContainerDescriptors::Unknown{}; │ │ │ │ │ +67} │ │ │ │ │ +68 │ │ │ │ │ +69} // end namespace Impl │ │ │ │ │ +70 │ │ │ │ │ +72template │ │ │ │ │ +_7_3auto _c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r(const PreBasis& preBasis) │ │ │ │ │ +74{ │ │ │ │ │ +75 return Impl::containerDescriptorImpl(preBasis, Dune::PriorityTag<2>{}); │ │ │ │ │ +76} │ │ │ │ │ +77 │ │ │ │ │ +78 │ │ │ │ │ +79namespace ContainerDescriptors { │ │ │ │ │ +80 │ │ │ │ │ +_8_2struct _V_a_l_u_e │ │ │ │ │ +83{ │ │ │ │ │ +85 template │ │ │ │ │ +_8_6 _V_a_l_u_e _o_p_e_r_a_t_o_r_[_]_ (const Index&) const { return {}; } │ │ │ │ │ 87 │ │ │ │ │ -_8_9 void _i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s() │ │ │ │ │ -90 { │ │ │ │ │ -91 _r_a_w_P_r_e_B_a_s_i_s__.initializeIndices(); │ │ │ │ │ -92 } │ │ │ │ │ -93 │ │ │ │ │ -_9_5 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ -96 { │ │ │ │ │ -97 return _r_a_w_P_r_e_B_a_s_i_s__.gridView(); │ │ │ │ │ -98 } │ │ │ │ │ -99 │ │ │ │ │ -_1_0_1 void _u_p_d_a_t_e(const _G_r_i_d_V_i_e_w& gv) │ │ │ │ │ -102 { │ │ │ │ │ -103 _r_a_w_P_r_e_B_a_s_i_s__.update(gv); │ │ │ │ │ -104 } │ │ │ │ │ -105 │ │ │ │ │ -_1_1_6 _N_o_d_e _m_a_k_e_N_o_d_e() const │ │ │ │ │ -117 { │ │ │ │ │ -118 return _r_a_w_P_r_e_B_a_s_i_s__.makeNode(); │ │ │ │ │ -119 } │ │ │ │ │ +_8_9 static constexpr std::size_t _s_i_z_e () { return 0; } │ │ │ │ │ +90}; │ │ │ │ │ +91 │ │ │ │ │ +93template │ │ │ │ │ +_9_4using _T_u_p_l_e = Dune::TupleVector; │ │ │ │ │ +95 │ │ │ │ │ +98template 0), int> = 0, │ │ │ │ │ +100 std::enable_if_t<(...|| (not std::is_same_v)), int> = 0> │ │ │ │ │ +101auto _m_a_k_e_D_e_s_c_r_i_p_t_o_r (Child0 child0, Children... children) │ │ │ │ │ +102{ │ │ │ │ │ +103 using Descriptor = _T_u_p_l_e; │ │ │ │ │ +104 return Descriptor{std::move(child0),std::move(children)...}; │ │ │ │ │ +105} │ │ │ │ │ +106 │ │ │ │ │ +107 │ │ │ │ │ +109template │ │ │ │ │ +_1_1_0using _A_r_r_a_y = std::array; │ │ │ │ │ +111 │ │ │ │ │ +113template &&...), int> = 0> │ │ │ │ │ +_1_1_5auto _m_a_k_e_D_e_s_c_r_i_p_t_o_r (Child0 child, Children... children) │ │ │ │ │ +116{ │ │ │ │ │ +117 using Descriptor = _A_r_r_a_y; │ │ │ │ │ +118 return Descriptor{std::move(child),std::move(children)...}; │ │ │ │ │ +119} │ │ │ │ │ 120 │ │ │ │ │ -_1_2_2 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ -123 { │ │ │ │ │ -124 return _s_i_z_e(Dune::ReservedVector{}); │ │ │ │ │ -125 } │ │ │ │ │ -126 │ │ │ │ │ -128 template │ │ │ │ │ -_1_2_9 _s_i_z_e___t_y_p_e _s_i_z_e(const SizePrefix& prefix) const │ │ │ │ │ -130 { │ │ │ │ │ -131 return _t_r_a_n_s_f_o_r_m_a_t_i_o_n__.size(prefix, _r_a_w_P_r_e_B_a_s_i_s__); │ │ │ │ │ -132 } │ │ │ │ │ -133 │ │ │ │ │ -_1_3_5 auto _c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r() const │ │ │ │ │ -136 { │ │ │ │ │ -137 return _t_r_a_n_s_f_o_r_m_a_t_i_o_n__.containerDescriptor(_r_a_w_P_r_e_B_a_s_i_s__); │ │ │ │ │ -138 } │ │ │ │ │ -139 │ │ │ │ │ -_1_4_1 _s_i_z_e___t_y_p_e _d_i_m_e_n_s_i_o_n() const │ │ │ │ │ -142 { │ │ │ │ │ -143 return _t_r_a_n_s_f_o_r_m_a_t_i_o_n__.dimension(_r_a_w_P_r_e_B_a_s_i_s__); │ │ │ │ │ -144 } │ │ │ │ │ +121 │ │ │ │ │ +123template │ │ │ │ │ +_1_2_4using _V_e_c_t_o_r = std::vector; │ │ │ │ │ +125 │ │ │ │ │ +127template │ │ │ │ │ +_1_2_8struct _U_n_i_f_o_r_m_A_r_r_a_y │ │ │ │ │ +129{ │ │ │ │ │ +131 template, int> = 0> │ │ │ │ │ +_1_3_3 _U_n_i_f_o_r_m_A_r_r_a_y () │ │ │ │ │ +134 : child_{} │ │ │ │ │ +135 {} │ │ │ │ │ +136 │ │ │ │ │ +_1_3_8 explicit _U_n_i_f_o_r_m_A_r_r_a_y (Child child) │ │ │ │ │ +139 : child_{std::move(child)} │ │ │ │ │ +140 {} │ │ │ │ │ +141 │ │ │ │ │ +143 template │ │ │ │ │ +_1_4_4 const Child& _o_p_e_r_a_t_o_r_[_]_ (const Index& /*i*/) const { return child_; } │ │ │ │ │ 145 │ │ │ │ │ -_1_4_7 _s_i_z_e___t_y_p_e _m_a_x_N_o_d_e_S_i_z_e() const │ │ │ │ │ -148 { │ │ │ │ │ -149 return _r_a_w_P_r_e_B_a_s_i_s__.maxNodeSize(); │ │ │ │ │ -150 } │ │ │ │ │ -151 │ │ │ │ │ -_1_5_2 const _R_a_w_P_r_e_B_a_s_i_s& _r_a_w_P_r_e_B_a_s_i_s() const │ │ │ │ │ -153 { │ │ │ │ │ -154 return _r_a_w_P_r_e_B_a_s_i_s__; │ │ │ │ │ -155 } │ │ │ │ │ +_1_4_7 static constexpr std::size_t _s_i_z_e () { return n; } │ │ │ │ │ +148 │ │ │ │ │ +149private: │ │ │ │ │ +150 Child child_; │ │ │ │ │ +151}; │ │ │ │ │ +152 │ │ │ │ │ +154template │ │ │ │ │ +_1_5_5using _F_l_a_t_A_r_r_a_y = _U_n_i_f_o_r_m_A_r_r_a_y_<_V_a_l_u_e_,_n_>; │ │ │ │ │ 156 │ │ │ │ │ -_1_5_7 _R_a_w_P_r_e_B_a_s_i_s& _r_a_w_P_r_e_B_a_s_i_s() │ │ │ │ │ -158 { │ │ │ │ │ -159 return _r_a_w_P_r_e_B_a_s_i_s__; │ │ │ │ │ -160 } │ │ │ │ │ -161 │ │ │ │ │ -162 template │ │ │ │ │ -_1_6_3 void _t_r_a_n_s_f_o_r_m_I_n_d_e_x(MultiIndex& multiIndex) const │ │ │ │ │ -164 { │ │ │ │ │ -165 _t_r_a_n_s_f_o_r_m_a_t_i_o_n__.transformIndex(multiIndex, _r_a_w_P_r_e_B_a_s_i_s__); │ │ │ │ │ -166 } │ │ │ │ │ -167 │ │ │ │ │ -168 template │ │ │ │ │ -_1_6_9 It _i_n_d_i_c_e_s(const _N_o_d_e& node, It it) const │ │ │ │ │ -170 { │ │ │ │ │ -171 _r_a_w_P_r_e_B_a_s_i_s().indices(node, it); │ │ │ │ │ -172 for(std::size_t i=0; i │ │ │ │ │ -_1_8_6_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s(RPB&&, T&&) -> _T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_<_s_t_d_:_: │ │ │ │ │ -_d_e_c_a_y___t_<_R_P_B_>, std::decay_t>; │ │ │ │ │ -187 │ │ │ │ │ -188 │ │ │ │ │ -189} // end namespace Experimental │ │ │ │ │ -190 │ │ │ │ │ -191 │ │ │ │ │ -192namespace BasisFactory { │ │ │ │ │ -193namespace Experimental { │ │ │ │ │ +158template │ │ │ │ │ +_1_5_9auto _m_a_k_e_U_n_i_f_o_r_m_D_e_s_c_r_i_p_t_o_r (std::integral_constant, Child │ │ │ │ │ +child) │ │ │ │ │ +160{ │ │ │ │ │ +161 return _U_n_i_f_o_r_m_A_r_r_a_y_<_C_h_i_l_d_,_n_>{std::move(child)}; │ │ │ │ │ +162} │ │ │ │ │ +163 │ │ │ │ │ +164 │ │ │ │ │ +166template │ │ │ │ │ +_1_6_7struct _U_n_i_f_o_r_m_V_e_c_t_o_r │ │ │ │ │ +168{ │ │ │ │ │ +170 template, int> = 0> │ │ │ │ │ +_1_7_2 explicit _U_n_i_f_o_r_m_V_e_c_t_o_r (std::size_t _s_i_z_e) │ │ │ │ │ +173 : size_{_s_i_z_e} │ │ │ │ │ +174 , child_{} │ │ │ │ │ +175 {} │ │ │ │ │ +176 │ │ │ │ │ +_1_7_8 _U_n_i_f_o_r_m_V_e_c_t_o_r (std::size_t _s_i_z_e, Child child) │ │ │ │ │ +179 : size_{_s_i_z_e} │ │ │ │ │ +180 , child_{std::move(child)} │ │ │ │ │ +181 {} │ │ │ │ │ +182 │ │ │ │ │ +184 template │ │ │ │ │ +_1_8_5 const Child& _o_p_e_r_a_t_o_r_[_]_ (const Index& /*i*/) const { return child_; } │ │ │ │ │ +186 │ │ │ │ │ +_1_8_8 std::size_t _s_i_z_e () const { return size_; } │ │ │ │ │ +189 │ │ │ │ │ +190private: │ │ │ │ │ +191 std::size_t size_; │ │ │ │ │ +192 Child child_; │ │ │ │ │ +193}; │ │ │ │ │ 194 │ │ │ │ │ -206template │ │ │ │ │ -_2_0_7auto _t_r_a_n_s_f_o_r_m_I_n_d_i_c_e_s( │ │ │ │ │ -208 RawPreBasisFactory&& preBasisFactory, │ │ │ │ │ -209 Transformation&& transformation) │ │ │ │ │ -210{ │ │ │ │ │ -211 return [ │ │ │ │ │ -212 preBasisFactory=std::forward(preBasisFactory), │ │ │ │ │ -213 transformation =std::forward(transformation) │ │ │ │ │ -214 ](const auto& gridView) { │ │ │ │ │ -215 return _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s │ │ │ │ │ -(preBasisFactory(gridView), std::move(transformation)); │ │ │ │ │ -216 }; │ │ │ │ │ -217} │ │ │ │ │ -218 │ │ │ │ │ +_1_9_6using _F_l_a_t_V_e_c_t_o_r = _U_n_i_f_o_r_m_V_e_c_t_o_r_<_V_a_l_u_e_>; │ │ │ │ │ +197 │ │ │ │ │ +199template │ │ │ │ │ +_2_0_0auto _m_a_k_e_U_n_i_f_o_r_m_D_e_s_c_r_i_p_t_o_r (std::size_t n, Child child) │ │ │ │ │ +201{ │ │ │ │ │ +202 return _U_n_i_f_o_r_m_V_e_c_t_o_r_<_C_h_i_l_d_>{n,std::move(child)}; │ │ │ │ │ +203} │ │ │ │ │ +204 │ │ │ │ │ +205namespace Impl { │ │ │ │ │ +206 │ │ │ │ │ +207template │ │ │ │ │ +208struct TreeTransform │ │ │ │ │ +209{ │ │ │ │ │ +210 TreeTransform (const InnerFunc& innerFunc, const LeafFunc& leafFunc) │ │ │ │ │ +211 : innerFunc_(innerFunc) │ │ │ │ │ +212 , leafFunc_(leafFunc) │ │ │ │ │ +213 {} │ │ │ │ │ +214 │ │ │ │ │ +215 Unknown operator() (const Unknown& tree) const │ │ │ │ │ +216 { │ │ │ │ │ +217 return tree; │ │ │ │ │ +218 } │ │ │ │ │ 219 │ │ │ │ │ -220 │ │ │ │ │ -239template │ │ │ │ │ -_2_4_0class _G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n │ │ │ │ │ -241{ │ │ │ │ │ -242public: │ │ │ │ │ -243 │ │ │ │ │ -_2_4_4 static constexpr std::size_t _m_i_n_I_n_d_e_x_S_i_z_e = minIS; │ │ │ │ │ -_2_4_5 static constexpr std::size_t _m_a_x_I_n_d_e_x_S_i_z_e = maxIS; │ │ │ │ │ -246 │ │ │ │ │ -247 template │ │ │ │ │ -_2_4_8 _G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n(IT_R&& _i_n_d_e_x_T_r_a_n_s_f_o_r_m_a_t_i_o_n, SI_R&& │ │ │ │ │ -sizeImplementation, CD_R&& containerDescriptorImplementation) : │ │ │ │ │ -249 indexTransformation_(std::forward(_i_n_d_e_x_T_r_a_n_s_f_o_r_m_a_t_i_o_n)), │ │ │ │ │ -250 sizeImplementation_(std::forward(sizeImplementation)), │ │ │ │ │ -251 containerDescriptorImplementation_(std::forward │ │ │ │ │ -(containerDescriptorImplementation)) │ │ │ │ │ -252 {} │ │ │ │ │ -253 │ │ │ │ │ -254 template │ │ │ │ │ -_2_5_5 void _t_r_a_n_s_f_o_r_m_I_n_d_e_x(MultiIndex& multiIndex, const PreBasis& preBasis) const │ │ │ │ │ -256 { │ │ │ │ │ -257 indexTransformation_(multiIndex, preBasis); │ │ │ │ │ -258 } │ │ │ │ │ -259 │ │ │ │ │ -260 template │ │ │ │ │ -_2_6_1 auto _s_i_z_e(const Prefix& prefix, const PreBasis& preBasis) const │ │ │ │ │ -262 { │ │ │ │ │ -263 return sizeImplementation_(prefix, preBasis); │ │ │ │ │ -264 } │ │ │ │ │ -265 │ │ │ │ │ -266 template │ │ │ │ │ -_2_6_7 auto _d_i_m_e_n_s_i_o_n(const PreBasis& preBasis) const │ │ │ │ │ -268 { │ │ │ │ │ -269 return preBasis.dimension(); │ │ │ │ │ -270 } │ │ │ │ │ -271 │ │ │ │ │ -272 template │ │ │ │ │ -_2_7_3 auto _c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r(const PreBasis& preBasis) const │ │ │ │ │ -274 { │ │ │ │ │ -275 return containerDescriptorImplementation_(preBasis); │ │ │ │ │ -276 } │ │ │ │ │ -277 │ │ │ │ │ -278private: │ │ │ │ │ -279 IndexTransformation indexTransformation_; │ │ │ │ │ -280 SizeImplementation sizeImplementation_; │ │ │ │ │ -281 ContainerDescriptorImplementation containerDescriptorImplementation_; │ │ │ │ │ -282}; │ │ │ │ │ -283 │ │ │ │ │ -284 │ │ │ │ │ -285 │ │ │ │ │ -305template │ │ │ │ │ -_3_0_6auto _i_n_d_e_x_T_r_a_n_s_f_o_r_m_a_t_i_o_n(IndexTransformation&& _i_n_d_e_x_T_r_a_n_s_f_o_r_m_a_t_i_o_n, │ │ │ │ │ -307 SizeImplementation&& sizeImplementation, │ │ │ │ │ -308 ContainerDescriptorImplementation&& containerDescriptorImplementation, │ │ │ │ │ -309 Dune::index_constant, │ │ │ │ │ -310 Dune::index_constant) │ │ │ │ │ -311{ │ │ │ │ │ -312 return _G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n< │ │ │ │ │ -313 std::decay_t, │ │ │ │ │ -314 std::decay_t, │ │ │ │ │ -315 std::decay_t, │ │ │ │ │ -316 minIndexSize, maxIndexSize>( │ │ │ │ │ -317 std::forward(_i_n_d_e_x_T_r_a_n_s_f_o_r_m_a_t_i_o_n), │ │ │ │ │ -318 std::forward(sizeImplementation), │ │ │ │ │ -319 std::forward │ │ │ │ │ -(containerDescriptorImplementation)); │ │ │ │ │ -320} │ │ │ │ │ -321 │ │ │ │ │ -323template │ │ │ │ │ -_3_2_5auto _i_n_d_e_x_T_r_a_n_s_f_o_r_m_a_t_i_o_n(IndexTransformation&& indexTrafo, │ │ │ │ │ -326 SizeImplementation&& sizeImpl, │ │ │ │ │ -327 Dune::index_constant minSize, │ │ │ │ │ -328 Dune::index_constant maxSize) │ │ │ │ │ -329{ │ │ │ │ │ -330 return _i_n_d_e_x_T_r_a_n_s_f_o_r_m_a_t_i_o_n(indexTrafo, sizeImpl, │ │ │ │ │ -331 [](auto&&) { return _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_k_n_o_w_n{}; }, │ │ │ │ │ -332 minSize, maxSize); │ │ │ │ │ -333} │ │ │ │ │ -334 │ │ │ │ │ -335} // end namespace Experimental │ │ │ │ │ -336} // end namespace BasisFactory │ │ │ │ │ -337} // end namespace Functions │ │ │ │ │ -338} // end namespace Dune │ │ │ │ │ -339 │ │ │ │ │ -340 │ │ │ │ │ -341#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH │ │ │ │ │ -_u_t_i_l_i_t_y_._h_h │ │ │ │ │ -_s_t_a_t_i_c_f_o_r_l_o_o_p_._h_h │ │ │ │ │ +220 auto operator() (const Value& tree) const │ │ │ │ │ +221 { │ │ │ │ │ +222 return leafFunc_(tree); │ │ │ │ │ +223 } │ │ │ │ │ +224 │ │ │ │ │ +225 template │ │ │ │ │ +226 auto operator() (const Tuple& tree) const │ │ │ │ │ +227 { │ │ │ │ │ +228 return unpackIntegerSequence([&](auto... ii) { │ │ │ │ │ +229 return _m_a_k_e_D_e_s_c_r_i_p_t_o_r(innerFunc_(tree[ii])...); │ │ │ │ │ +230 }, std::make_index_sequence()); │ │ │ │ │ +231 } │ │ │ │ │ +232 │ │ │ │ │ +233 template │ │ │ │ │ +234 auto operator() (const Array& tree) const │ │ │ │ │ +235 { │ │ │ │ │ +236 return unpackIntegerSequence([&](auto... ii) { │ │ │ │ │ +237 return _m_a_k_e_D_e_s_c_r_i_p_t_o_r(innerFunc_(tree[ii])...); │ │ │ │ │ +238 }, std::make_index_sequence()); │ │ │ │ │ +239 } │ │ │ │ │ +240 │ │ │ │ │ +241 template │ │ │ │ │ +242 auto operator() (const Vector& tree) const │ │ │ │ │ +243 { │ │ │ │ │ +244 using W = decltype(innerFunc_(tree[0])); │ │ │ │ │ +245 Vector result; │ │ │ │ │ +246 result.reserve(tree.size()); │ │ │ │ │ +247 for (std::size_t i = 0; i < tree.size(); ++i) │ │ │ │ │ +248 result.emplace_back(innerFunc_(tree[i])); │ │ │ │ │ +249 return result; │ │ │ │ │ +250 } │ │ │ │ │ +251 │ │ │ │ │ +252 template │ │ │ │ │ +253 auto operator() (const UniformArray& tree) const │ │ │ │ │ +254 { │ │ │ │ │ +255 return _m_a_k_e_U_n_i_f_o_r_m_D_e_s_c_r_i_p_t_o_r(Dune::index_constant{}, innerFunc_(tree │ │ │ │ │ +[0])); │ │ │ │ │ +256 } │ │ │ │ │ +257 │ │ │ │ │ +258 template │ │ │ │ │ +259 auto operator() (const UniformVector& tree) const │ │ │ │ │ +260 { │ │ │ │ │ +261 return _m_a_k_e_U_n_i_f_o_r_m_D_e_s_c_r_i_p_t_o_r(tree.size(), innerFunc_(tree[0])); │ │ │ │ │ +262 } │ │ │ │ │ +263 │ │ │ │ │ +264private: │ │ │ │ │ +265 InnerFunc innerFunc_; │ │ │ │ │ +266 LeafFunc leafFunc_; │ │ │ │ │ +267}; │ │ │ │ │ +268 │ │ │ │ │ +269 │ │ │ │ │ +280template │ │ │ │ │ +281auto appendToTree (Size s, const T& tree) │ │ │ │ │ +282{ │ │ │ │ │ +283 auto transform = TreeTransform( │ │ │ │ │ +284 [s](auto&& node) { return appendToTree(s, node); }, │ │ │ │ │ +285 [s](auto&& node) { return _m_a_k_e_U_n_i_f_o_r_m_D_e_s_c_r_i_p_t_o_r(s, node); }); │ │ │ │ │ +286 return transform(tree); │ │ │ │ │ +287} │ │ │ │ │ +288 │ │ │ │ │ +289} // end namespace Impl │ │ │ │ │ +290} // end namespace ContainerDescriptors │ │ │ │ │ +291} // end namespace Dune::Functions │ │ │ │ │ +292 │ │ │ │ │ +293#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_CONTAINERDESCRIPTORS_HH │ │ │ │ │ _t_y_p_e___t_r_a_i_t_s_._h_h │ │ │ │ │ -_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h │ │ │ │ │ _b_a_s_i_s_t_a_g_s_._h_h │ │ │ │ │ -_n_o_d_e_s_._h_h │ │ │ │ │ -_D_u_n_e │ │ │ │ │ -DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_i_n_d_e_x_T_r_a_n_s_f_o_r_m_a_t_i_o_n │ │ │ │ │ -auto indexTransformation(IndexTransformation &&indexTransformation, │ │ │ │ │ -SizeImplementation &&sizeImplementation, ContainerDescriptorImplementation │ │ │ │ │ -&&containerDescriptorImplementation, Dune::index_constant< minIndexSize >, │ │ │ │ │ -Dune::index_constant< maxIndexSize >) │ │ │ │ │ -A generic implementation of a transformation. │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:306 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_t_r_a_n_s_f_o_r_m_I_n_d_i_c_e_s │ │ │ │ │ -auto transformIndices(RawPreBasisFactory &&preBasisFactory, Transformation │ │ │ │ │ -&&transformation) │ │ │ │ │ -Create a TransformedIndexPreBasisFactory. │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:207 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │ +DDeeffiinniittiioonn polynomial.hh:18 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +auto containerDescriptor(const PreBasis &preBasis) │ │ │ │ │ +Return the container descriptor of the pre-basis, if defined, otherwise │ │ │ │ │ +ContainerDescriptor::Unknown. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_A_r_r_a_y │ │ │ │ │ +std::array< Child, n > Array │ │ │ │ │ +Descriptor for arrays with all children of the same type and static size. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:110 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_m_a_k_e_U_n_i_f_o_r_m_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +auto makeUniformDescriptor(std::integral_constant< std::size_t, n >, Child │ │ │ │ │ +child) │ │ │ │ │ +Generate a uniform descriptor in case the size is a static constant. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:159 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_T_u_p_l_e │ │ │ │ │ +Dune::TupleVector< Children... > Tuple │ │ │ │ │ +Descriptor with all children of possibly different type. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:94 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_m_a_k_e_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +auto makeDescriptor(Child0 child, Children... children) │ │ │ │ │ +Generate a descriptor in case the children are all of the same type. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:115 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_V_e_c_t_o_r │ │ │ │ │ +std::vector< Child > Vector │ │ │ │ │ +Descriptor for vectors with all children of the same type and dynamic size. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:124 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_k_n_o_w_n │ │ │ │ │ Fallback container descriptor if nothing else fits. │ │ │ │ │ DDeeffiinniittiioonn containerdescriptors.hh:50 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s │ │ │ │ │ -A pre-basis transforming multi-indices. │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:55 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s │ │ │ │ │ -It indices(const Node &node, It it) const │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:169 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_t_r_a_n_s_f_o_r_m_a_t_i_o_n__ │ │ │ │ │ -Transformation transformation_ │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:182 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s │ │ │ │ │ -void initializeIndices() │ │ │ │ │ -Initialize the global indices. │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:89 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ -typename RawPreBasis::GridView GridView │ │ │ │ │ -The grid view that the FE basis is defined on. │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:65 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_t_r_a_n_s_f_o_r_m_I_n_d_e_x │ │ │ │ │ -void transformIndex(MultiIndex &multiIndex) const │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:163 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_r_a_w_P_r_e_B_a_s_i_s__ │ │ │ │ │ -RawPreBasis rawPreBasis_ │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:181 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_N_o_d_e │ │ │ │ │ -typename RawPreBasis::Node Node │ │ │ │ │ -Template mapping root tree path to type of created tree node. │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:71 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_: │ │ │ │ │ -_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s │ │ │ │ │ -TransformedIndexPreBasis(RPB_R &&rawPreBasis, T_R &&transformation) │ │ │ │ │ -Constructor for given child pre-basis objects. │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:83 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_r_a_w_P_r_e_B_a_s_i_s │ │ │ │ │ -RawPreBasis & rawPreBasis() │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:157 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e │ │ │ │ │ -static constexpr size_type maxMultiIndexSize │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_u_p_d_a_t_e │ │ │ │ │ -void update(const GridView &gv) │ │ │ │ │ -Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:101 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ -Node makeNode() const │ │ │ │ │ -Create tree node with given root tree path. │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:116 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ -const GridView & gridView() const │ │ │ │ │ -Obtain the grid view that the basis is defined on. │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:95 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ -size_type size(const SizePrefix &prefix) const │ │ │ │ │ -Return number of possible values for next position in multi index. │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:129 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_R_a_w_P_r_e_B_a_s_i_s │ │ │ │ │ -RPB RawPreBasis │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:62 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ -size_type size() const │ │ │ │ │ -Same as size(prefix) with empty prefix. │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:122 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_m_a_x_N_o_d_e_S_i_z_e │ │ │ │ │ -size_type maxNodeSize() const │ │ │ │ │ -Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:147 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Type used for indices and size information. │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:68 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_m_u_l_t_i_I_n_d_e_x_B_u_f_f_e_r_S_i_z_e │ │ │ │ │ -static constexpr size_type multiIndexBufferSize │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ -size_type dimension() const │ │ │ │ │ -Get the total dimension of the space spanned by this basis. │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:141 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_r_a_w_P_r_e_B_a_s_i_s │ │ │ │ │ -const RawPreBasis & rawPreBasis() const │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:152 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_m_i_n_M_u_l_t_i_I_n_d_e_x_S_i_z_e │ │ │ │ │ -static constexpr size_type minMultiIndexSize │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:74 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -auto containerDescriptor() const │ │ │ │ │ -Return the container descriptor of the transformed pre-basis. │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:135 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n │ │ │ │ │ -A generic implementation of a transformation. │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:241 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n_:_: │ │ │ │ │ -_G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n │ │ │ │ │ -GenericIndexingTransformation(IT_R &&indexTransformation, SI_R │ │ │ │ │ -&&sizeImplementation, CD_R &&containerDescriptorImplementation) │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:248 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n_:_: │ │ │ │ │ -_m_a_x_I_n_d_e_x_S_i_z_e │ │ │ │ │ -static constexpr std::size_t maxIndexSize │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:245 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n_:_: │ │ │ │ │ -_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -auto containerDescriptor(const PreBasis &preBasis) const │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:273 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n_:_: │ │ │ │ │ -_d_i_m_e_n_s_i_o_n │ │ │ │ │ -auto dimension(const PreBasis &preBasis) const │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:267 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n_:_: │ │ │ │ │ -_s_i_z_e │ │ │ │ │ -auto size(const Prefix &prefix, const PreBasis &preBasis) const │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:261 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n_:_: │ │ │ │ │ -_m_i_n_I_n_d_e_x_S_i_z_e │ │ │ │ │ -static constexpr std::size_t minIndexSize │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:244 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n_:_: │ │ │ │ │ -_t_r_a_n_s_f_o_r_m_I_n_d_e_x │ │ │ │ │ -void transformIndex(MultiIndex &multiIndex, const PreBasis &preBasis) const │ │ │ │ │ -DDeeffiinniittiioonn transformedindexbasis.hh:255 │ │ │ │ │ -_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_V_a_l_u_e │ │ │ │ │ +The node in the descriptor tree representing a value placeholder. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:83 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_V_a_l_u_e_:_:_s_i_z_e │ │ │ │ │ +static constexpr std::size_t size() │ │ │ │ │ +A value placeholder does not have any sub-descriptors, thus its size is zero. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:89 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_V_a_l_u_e_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +Value operator[](const Index &) const │ │ │ │ │ +The child access method is only available for the interface, but should not be │ │ │ │ │ +called. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:86 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_A_r_r_a_y │ │ │ │ │ +Descriptor for arrays with all children identical and the number of children a │ │ │ │ │ +static size. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:129 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_A_r_r_a_y_:_:_s_i_z_e │ │ │ │ │ +static constexpr std::size_t size() │ │ │ │ │ +The static size information, i.e., number of children. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:147 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_A_r_r_a_y_:_:_U_n_i_f_o_r_m_A_r_r_a_y │ │ │ │ │ +UniformArray() │ │ │ │ │ +Default constructor. Is enable if the child-type is default constructible. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:133 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_A_r_r_a_y_:_:_U_n_i_f_o_r_m_A_r_r_a_y │ │ │ │ │ +UniformArray(Child child) │ │ │ │ │ +Constructor that stores a single child only. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:138 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_A_r_r_a_y_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +const Child & operator[](const Index &) const │ │ │ │ │ +Access the i'th child that is always the same, i.e., child_. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:144 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_V_e_c_t_o_r │ │ │ │ │ +Uniform descriptor with dynamic size. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:168 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_V_e_c_t_o_r_:_:_U_n_i_f_o_r_m_V_e_c_t_o_r │ │ │ │ │ +UniformVector(std::size_t size, Child child) │ │ │ │ │ +Constructor that stores the size and a single child only. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:178 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_V_e_c_t_o_r_:_:_s_i_z_e │ │ │ │ │ +std::size_t size() const │ │ │ │ │ +The dynamic size information, i.e., number of children. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:188 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_V_e_c_t_o_r_:_:_U_n_i_f_o_r_m_V_e_c_t_o_r │ │ │ │ │ +UniformVector(std::size_t size) │ │ │ │ │ +Default constructor with size. Is enable if the child-type is default │ │ │ │ │ +constructible. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:172 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +const Child & operator[](const Index &) const │ │ │ │ │ +Access the i'th child that is always the same, i.e., child_. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:185 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00155.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: hierarchicnodetorangemap.hh File Reference │ │ │ │ +dune-functions: hierarchicvectorwrapper.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,38 +71,53 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
hierarchicnodetorangemap.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
hierarchicvectorwrapper.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <utility>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <dune/common/concept.hh>
│ │ │ │ +
#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 <dune/functions/common/indexaccess.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::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 , std::enable_if_t< models< Concept::HasIndexAccess, V, MultiIndex >(), int > = 0>
V & Dune::Functions::makeHierarchicVectorForMultiIndex (V &v)
 
template<class MultiIndex , class V , std::enable_if_t< not models< Concept::HasIndexAccess, V, MultiIndex >(), int > = 0>
HierarchicVectorWrapper< V > Dune::Functions::makeHierarchicVectorForMultiIndex (V &v)
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,26 +1,42 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -hierarchicnodetorangemap.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +hierarchicvectorwrapper.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_i_n_d_e_x_a_c_c_e_s_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_u_t_i_l_i_t_y_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_N_o_d_e_T_o_R_a_n_g_e_M_a_p │ │ │ │ │ -  A simple node to range map using the nested tree indices. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_<_ _V_,_ _C_O_ _> │ │ │ │ │ +  A wrapper providing multiindex access to vector entries. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r< V >  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_h_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r (V &v) │ │ │ │ │ +  │ │ │ │ │ +template(), int > = 0> │ │ │ │ │ + V &  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_: │ │ │ │ │ + _m_a_k_e_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_F_o_r_M_u_l_t_i_I_n_d_e_x (V &v) │ │ │ │ │ +  │ │ │ │ │ +template(), int > = 0> │ │ │ │ │ +_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r< V >  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_: │ │ │ │ │ + _m_a_k_e_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_F_o_r_M_u_l_t_i_I_n_d_e_x (V &v) │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00155_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: hierarchicnodetorangemap.hh Source File │ │ │ │ +dune-functions: hierarchicvectorwrapper.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,76 +74,293 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
hierarchicnodetorangemap.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICNODETORANGEMAP_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICNODETORANGEMAP_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICVECTORWRAPPER_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICVECTORWRAPPER_HH
│ │ │ │
9
│ │ │ │ -
10
│ │ │ │ -
11#include <utility>
│ │ │ │ -
12#include <type_traits>
│ │ │ │ +
10#ifndef DUNE_FUNCTIONS_HIERARCHICVECTORWRAPPER_TEST_NO_DEPRECATION
│ │ │ │ +
11#warning The header dune/functions/functionspacebases/hierarchicvectorwrapper.hh is deprecated and will be removed after release 2.10.
│ │ │ │ +
12#endif
│ │ │ │
13
│ │ │ │
14#include <dune/common/concept.hh>
│ │ │ │ -
15
│ │ │ │ - │ │ │ │ - │ │ │ │ -
18
│ │ │ │ -
19namespace Dune {
│ │ │ │ -
20namespace Functions {
│ │ │ │ -
21
│ │ │ │ +
15#include <dune/common/hybridutilities.hh>
│ │ │ │ +
16#include <dune/common/indices.hh>
│ │ │ │ +
17
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
22
│ │ │ │
23
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
34{
│ │ │ │ -
35 template<class Node, class TreePath, class Range,
│ │ │ │ -
36 std::enable_if_t< models<Concept::HasIndexAccess, Range, Dune::index_constant<0>>(), int> = 0>
│ │ │ │ -
│ │ │ │ -
37 decltype(auto) operator()(const Node&, const TreePath& treePath, Range&& y) const
│ │ │ │ -
38 {
│ │ │ │ -
39 return resolveStaticMultiIndex(y, treePath);
│ │ │ │ -
40 }
│ │ │ │ -
│ │ │ │ -
41
│ │ │ │ -
42 template<class Node, class TreePath, class Range,
│ │ │ │ -
43 std::enable_if_t<not models<Concept::HasIndexAccess, Range, Dune::index_constant<0>>(), int> = 0>
│ │ │ │ -
│ │ │ │ -
44 decltype(auto) operator()(const Node&, const TreePath&, Range&& y) const
│ │ │ │ -
45 {
│ │ │ │ -
46 return std::forward<Range>(y);
│ │ │ │ -
47 }
│ │ │ │ -
│ │ │ │ -
48};
│ │ │ │ -
│ │ │ │ +
24namespace Dune {
│ │ │ │ +
25namespace Functions {
│ │ │ │ +
26
│ │ │ │ +
27
│ │ │ │ +
28
│ │ │ │ +
29namespace Imp {
│ │ │ │ +
30
│ │ │ │ +
31 // Construct default coefficient type from vector and multiindex type
│ │ │ │ +
32 // This requires that MultiIndex has a static size. Otherwise the
│ │ │ │ +
33 // vector type itself is returned.
│ │ │ │ +
34 template<class V, class MultiIndex>
│ │ │ │ +
35 struct CoefficientType
│ │ │ │ +
36 {
│ │ │ │ +
37 template<class E, std::size_t size>
│ │ │ │ +
38 struct DefaultCoefficientTypeHelper
│ │ │ │ +
39 {
│ │ │ │ +
40 using E0 = decltype(std::declval<E>()[Dune::Indices::_0]);
│ │ │ │ +
41 using type = typename DefaultCoefficientTypeHelper<E0, size-1>::type;
│ │ │ │ +
42 };
│ │ │ │ +
43
│ │ │ │ +
44 template<class E>
│ │ │ │ +
45 struct DefaultCoefficientTypeHelper<E, 0>
│ │ │ │ +
46 {
│ │ │ │ +
47 using type = E;
│ │ │ │ +
48 };
│ │ │ │
49
│ │ │ │ -
50
│ │ │ │ -
51
│ │ │ │ -
52} // namespace Dune::Functions
│ │ │ │ -
53} // namespace Dune
│ │ │ │ +
50 using type = typename DefaultCoefficientTypeHelper<V, StaticSizeOrZero<MultiIndex>::value>::type;
│ │ │ │ +
51 };
│ │ │ │ +
52
│ │ │ │ +
53
│ │ │ │
54
│ │ │ │ -
55
│ │ │ │ -
56#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:421
│ │ │ │ +
55 // This tag class is used as Coefficient template parameter
│ │ │ │ +
56 // for HierarchicVectorWrapper if the coefficient type should
│ │ │ │ +
57 // be deduced.
│ │ │ │ +
58 struct DeducedCoefficientTag {};
│ │ │ │ +
59
│ │ │ │ +
60} // namespace Imp
│ │ │ │ +
61
│ │ │ │ +
62
│ │ │ │ +
63
│ │ │ │ +
86template<class V, class CO=Imp::DeducedCoefficientTag>
│ │ │ │ +
│ │ │ │ +
87class
│ │ │ │ +
88[[deprecated("HierarchicVectorWrapper is deprecated and will be removed after release 2.10.")]]
│ │ │ │ + │ │ │ │ +
90{
│ │ │ │ +
91 template<class MultiIndex>
│ │ │ │ +
92 using Coefficient = std::conditional_t< std::is_same_v<Imp::DeducedCoefficientTag,CO> and HasStaticSize_v<MultiIndex>,
│ │ │ │ +
93 typename Imp::CoefficientType<V, MultiIndex>::type,
│ │ │ │ +
94 CO
│ │ │ │ +
95 >;
│ │ │ │ +
96
│ │ │ │ +
97
│ │ │ │ +
98 using size_type = std::size_t;
│ │ │ │ +
99
│ │ │ │ +
100 template<class C, class SizeProvider,
│ │ │ │ +
101 std::enable_if_t< not models<Concept::HasResize, C>(), int> = 0,
│ │ │ │ +
102 std::enable_if_t< not models<Concept::HasSizeMethod, C>(), int> = 0>
│ │ │ │ +
103 static void resizeHelper(C& c, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ +
104 {
│ │ │ │ +
105 auto size = sizeProvider.size(prefix);
│ │ │ │ +
106 if (size != 0)
│ │ │ │ +
107 DUNE_THROW(RangeError, "Can't resize scalar vector entry v[" << prefix << "] to size(" << prefix << ")=" << size);
│ │ │ │ +
108 }
│ │ │ │ +
109
│ │ │ │ +
110 struct StaticResizeHelper
│ │ │ │ +
111 {
│ │ │ │ +
112 template<class I, class C, class SizeProvider>
│ │ │ │ +
113 static void apply(I&& i, C& c, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ +
114 {
│ │ │ │ +
115 prefix.back() = i;
│ │ │ │ +
116 resizeHelper(c[i], sizeProvider, prefix);
│ │ │ │ +
117 }
│ │ │ │ +
118 };
│ │ │ │ +
119
│ │ │ │ +
120 template<class C, class SizeProvider,
│ │ │ │ +
121 std::enable_if_t< not models<Concept::HasResize, C>(), int> = 0,
│ │ │ │ +
122 std::enable_if_t< models<Concept::HasSizeMethod, C>(), int> = 0>
│ │ │ │ +
123 static void resizeHelper(C& c, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ +
124 {
│ │ │ │ +
125 auto size = sizeProvider.size(prefix);
│ │ │ │ +
126 if (size == 0)
│ │ │ │ +
127 return;
│ │ │ │ +
128
│ │ │ │ +
129 if (c.size() != size)
│ │ │ │ +
130 DUNE_THROW(RangeError, "Can't resize statically sized vector entry v[" << prefix << "] of size " << c.size() << " to size(" << prefix << ")=" << size);
│ │ │ │ +
131
│ │ │ │ +
132 using namespace Dune::Hybrid;
│ │ │ │ +
133 prefix.push_back(0);
│ │ │ │ +
134 forEach(integralRange(Hybrid::size(c)), [&](auto&& i) {
│ │ │ │ +
135 StaticResizeHelper::apply(i, c, sizeProvider, prefix);
│ │ │ │ +
136 });
│ │ │ │ +
137 }
│ │ │ │ +
138
│ │ │ │ +
139 template<class C, class SizeProvider,
│ │ │ │ +
140 std::enable_if_t< models<Concept::HasResize, C>(), int> = 0>
│ │ │ │ +
141 static void resizeHelper(C& c, const SizeProvider& sizeProvider, typename SizeProvider::SizePrefix prefix)
│ │ │ │ +
142 {
│ │ │ │ +
143 auto size = sizeProvider.size(prefix);
│ │ │ │ +
144 if (size==0)
│ │ │ │ +
145 {
│ │ │ │ +
146 if (c.size()==0)
│ │ │ │ +
147 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.");
│ │ │ │ +
148 else
│ │ │ │ +
149 return;
│ │ │ │ +
150 }
│ │ │ │ +
151
│ │ │ │ +
152 c.resize(size);
│ │ │ │ +
153 prefix.push_back(0);
│ │ │ │ +
154 for(std::size_t i=0; i<size; ++i)
│ │ │ │ +
155 {
│ │ │ │ +
156 prefix.back() = i;
│ │ │ │ +
157 resizeHelper(c[i], sizeProvider, prefix);
│ │ │ │ +
158 }
│ │ │ │ +
159 }
│ │ │ │ +
160
│ │ │ │ +
161
│ │ │ │ +
162
│ │ │ │ +
163public:
│ │ │ │ +
164
│ │ │ │ +
165 using Vector = V;
│ │ │ │ +
166
│ │ │ │ +
167 template<class MultiIndex>
│ │ │ │ +
168 using Entry = Coefficient<MultiIndex>;
│ │ │ │ +
169
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
171 vector_(&vector)
│ │ │ │ +
172 {}
│ │ │ │ +
│ │ │ │ +
173
│ │ │ │ +
174 template<class SizeProvider>
│ │ │ │ +
│ │ │ │ +
175 void resize(const SizeProvider& sizeProvider)
│ │ │ │ +
176 {
│ │ │ │ +
177 typename SizeProvider::SizePrefix prefix;
│ │ │ │ +
178 prefix.resize(0);
│ │ │ │ +
179 resizeHelper(*vector_, sizeProvider, prefix);
│ │ │ │ +
180 }
│ │ │ │ +
│ │ │ │ +
181
│ │ │ │ +
182 template<class MultiIndex>
│ │ │ │ +
│ │ │ │ +
183 const Entry<MultiIndex>& operator[](const MultiIndex& index) const
│ │ │ │ +
184 {
│ │ │ │ +
185 static_assert(not std::is_same_v<Imp::DeducedCoefficientTag,Entry<MultiIndex>>, "Coefficient type for HierarchicVectorWrapper and given multi-index type cannot be determined automatically!");
│ │ │ │ +
186 return hybridMultiIndexAccess<const Entry<MultiIndex>&>(*vector_, index);
│ │ │ │ +
187 }
│ │ │ │ +
│ │ │ │ +
188
│ │ │ │ +
189 template<class MultiIndex>
│ │ │ │ +
│ │ │ │ +
190 Entry<MultiIndex>& operator[](const MultiIndex& index)
│ │ │ │ +
191 {
│ │ │ │ +
192 static_assert(not std::is_same_v<Imp::DeducedCoefficientTag,Entry<MultiIndex>>, "Coefficient type for HierarchicVectorWrapper and given multi-index type cannot be determined automatically!");
│ │ │ │ +
193 return hybridMultiIndexAccess<Entry<MultiIndex>&>(*vector_, index);
│ │ │ │ +
194 }
│ │ │ │ +
│ │ │ │ +
195
│ │ │ │ +
196 template<class MultiIndex>
│ │ │ │ +
│ │ │ │ +
197 const Entry<MultiIndex>& operator()(const MultiIndex& index) const
│ │ │ │ +
198 {
│ │ │ │ +
199 static_assert(not std::is_same_v<Imp::DeducedCoefficientTag,Entry<MultiIndex>>, "Coefficient type for HierarchicVectorWrapper and given multi-index type cannot be determined automatically!");
│ │ │ │ +
200 return (*this)[index];
│ │ │ │ +
201 }
│ │ │ │ +
│ │ │ │ +
202
│ │ │ │ +
203 template<class MultiIndex>
│ │ │ │ +
│ │ │ │ +
204 Entry<MultiIndex>& operator()(const MultiIndex& index)
│ │ │ │ +
205 {
│ │ │ │ +
206 static_assert(not std::is_same_v<Imp::DeducedCoefficientTag,Entry<MultiIndex>>, "Coefficient type for HierarchicVectorWrapper and given multi-index type cannot be determined automatically!");
│ │ │ │ +
207 return (*this)[index];
│ │ │ │ +
208 }
│ │ │ │ +
│ │ │ │ +
209
│ │ │ │ +
│ │ │ │ +
210 const Vector& vector() const
│ │ │ │ +
211 {
│ │ │ │ +
212 return *vector_;
│ │ │ │ +
213 }
│ │ │ │ +
│ │ │ │ +
214
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
216 {
│ │ │ │ +
217 return *vector_;
│ │ │ │ +
218 }
│ │ │ │ +
│ │ │ │ +
219
│ │ │ │ +
220private:
│ │ │ │ +
221
│ │ │ │ +
222 Vector* vector_;
│ │ │ │ +
223};
│ │ │ │ +
│ │ │ │ +
224
│ │ │ │ +
225
│ │ │ │ +
226
│ │ │ │ +
230template<class V>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
232{
│ │ │ │ + │ │ │ │ +
234}
│ │ │ │ +
│ │ │ │ +
235
│ │ │ │ +
236
│ │ │ │ +
237
│ │ │ │ +
241template<class MultiIndex, class V,
│ │ │ │ +
242 std::enable_if_t< models<Concept::HasIndexAccess, V, MultiIndex>(), int> = 0>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
244{
│ │ │ │ +
245 return v;
│ │ │ │ +
246}
│ │ │ │ +
│ │ │ │ +
247
│ │ │ │ +
248
│ │ │ │ +
249
│ │ │ │ +
253template<class MultiIndex, class V,
│ │ │ │ +
254 std::enable_if_t< not models<Concept::HasIndexAccess, V, MultiIndex>(), int> = 0>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
256{
│ │ │ │ + │ │ │ │ +
258}
│ │ │ │ +
│ │ │ │ +
259
│ │ │ │ +
260
│ │ │ │ +
261
│ │ │ │ +
262} // namespace Dune::Functions
│ │ │ │ +
263} // namespace Dune
│ │ │ │ +
264
│ │ │ │ +
265
│ │ │ │ +
266#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICVECTORWRAPPER_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
A simple node to range map using the nested tree indices.
Definition hierarchicnodetorangemap.hh:34
│ │ │ │ -
decltype(auto) operator()(const Node &, const TreePath &treePath, Range &&y) const
Definition hierarchicnodetorangemap.hh:37
│ │ │ │ -
decltype(auto) operator()(const Node &, const TreePath &, Range &&y) const
Definition hierarchicnodetorangemap.hh:44
│ │ │ │ +
V & makeHierarchicVectorForMultiIndex(V &v)
Definition hierarchicvectorwrapper.hh:243
│ │ │ │ +
HierarchicVectorWrapper< V > hierarchicVector(V &v)
Definition hierarchicvectorwrapper.hh:231
│ │ │ │ +
A wrapper providing multiindex access to vector entries.
Definition hierarchicvectorwrapper.hh:90
│ │ │ │ +
Entry< MultiIndex > & operator()(const MultiIndex &index)
Definition hierarchicvectorwrapper.hh:204
│ │ │ │ +
Entry< MultiIndex > & operator[](const MultiIndex &index)
Definition hierarchicvectorwrapper.hh:190
│ │ │ │ +
const Entry< MultiIndex > & operator[](const MultiIndex &index) const
Definition hierarchicvectorwrapper.hh:183
│ │ │ │ +
Vector & vector()
Definition hierarchicvectorwrapper.hh:215
│ │ │ │ +
V Vector
Definition hierarchicvectorwrapper.hh:165
│ │ │ │ +
Coefficient< MultiIndex > Entry
Definition hierarchicvectorwrapper.hh:168
│ │ │ │ +
const Vector & vector() const
Definition hierarchicvectorwrapper.hh:210
│ │ │ │ +
HierarchicVectorWrapper(Vector &vector)
Definition hierarchicvectorwrapper.hh:170
│ │ │ │ +
const Entry< MultiIndex > & operator()(const MultiIndex &index) const
Definition hierarchicvectorwrapper.hh:197
│ │ │ │ +
void resize(const SizeProvider &sizeProvider)
Definition hierarchicvectorwrapper.hh:175
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,82 +1,320 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -hierarchicnodetorangemap.hh │ │ │ │ │ +hierarchicvectorwrapper.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICNODETORANGEMAP_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICNODETORANGEMAP_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICVECTORWRAPPER_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICVECTORWRAPPER_HH │ │ │ │ │ 9 │ │ │ │ │ -10 │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ +10#ifndef DUNE_FUNCTIONS_HIERARCHICVECTORWRAPPER_TEST_NO_DEPRECATION │ │ │ │ │ +11#warning The header dune/functions/functionspacebases/ │ │ │ │ │ +hierarchicvectorwrapper.hh is deprecated and will be removed after release │ │ │ │ │ +2.10. │ │ │ │ │ +12#endif │ │ │ │ │ 13 │ │ │ │ │ 14#include │ │ │ │ │ -15 │ │ │ │ │ -16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ -17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_i_n_d_e_x_a_c_c_e_s_s_._h_h> │ │ │ │ │ -18 │ │ │ │ │ -19namespace _D_u_n_e { │ │ │ │ │ -20namespace Functions { │ │ │ │ │ -21 │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17 │ │ │ │ │ +18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_i_n_d_e_x_a_c_c_e_s_s_._h_h> │ │ │ │ │ +19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_u_t_i_l_i_t_y_._h_h> │ │ │ │ │ +20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ +21#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ 22 │ │ │ │ │ 23 │ │ │ │ │ -_3_3struct _H_i_e_r_a_r_c_h_i_c_N_o_d_e_T_o_R_a_n_g_e_M_a_p │ │ │ │ │ -34{ │ │ │ │ │ -35 template>(), int> = 0> │ │ │ │ │ -_3_7 decltype(auto) _o_p_e_r_a_t_o_r_(_)(const Node&, const TreePath& treePath, Range&& y) │ │ │ │ │ -const │ │ │ │ │ -38 { │ │ │ │ │ -39 return _r_e_s_o_l_v_e_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x(y, treePath); │ │ │ │ │ -40 } │ │ │ │ │ -41 │ │ │ │ │ -42 template>(), int> = 0> │ │ │ │ │ -_4_4 decltype(auto) _o_p_e_r_a_t_o_r_(_)(const Node&, const TreePath&, Range&& y) const │ │ │ │ │ -45 { │ │ │ │ │ -46 return std::forward(y); │ │ │ │ │ -47 } │ │ │ │ │ -48}; │ │ │ │ │ +24namespace _D_u_n_e { │ │ │ │ │ +25namespace Functions { │ │ │ │ │ +26 │ │ │ │ │ +27 │ │ │ │ │ +28 │ │ │ │ │ +29namespace Imp { │ │ │ │ │ +30 │ │ │ │ │ +31 // Construct default coefficient type from vector and multiindex type │ │ │ │ │ +32 // This requires that MultiIndex has a static size. Otherwise the │ │ │ │ │ +33 // vector type itself is returned. │ │ │ │ │ +34 template │ │ │ │ │ +35 struct CoefficientType │ │ │ │ │ +36 { │ │ │ │ │ +37 template │ │ │ │ │ +38 struct DefaultCoefficientTypeHelper │ │ │ │ │ +39 { │ │ │ │ │ +40 using E0 = decltype(std::declval()[Dune::Indices::_0]); │ │ │ │ │ +41 using type = typename DefaultCoefficientTypeHelper::type; │ │ │ │ │ +42 }; │ │ │ │ │ +43 │ │ │ │ │ +44 template │ │ │ │ │ +45 struct DefaultCoefficientTypeHelper │ │ │ │ │ +46 { │ │ │ │ │ +47 using type = E; │ │ │ │ │ +48 }; │ │ │ │ │ 49 │ │ │ │ │ -50 │ │ │ │ │ -51 │ │ │ │ │ -52} // namespace Dune::Functions │ │ │ │ │ -53} // namespace Dune │ │ │ │ │ +50 using type = typename DefaultCoefficientTypeHelper::value>::type; │ │ │ │ │ +51 }; │ │ │ │ │ +52 │ │ │ │ │ +53 │ │ │ │ │ 54 │ │ │ │ │ -55 │ │ │ │ │ -56#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICNODETORANGEMAP_HH │ │ │ │ │ +55 // This tag class is used as Coefficient template parameter │ │ │ │ │ +56 // for HierarchicVectorWrapper if the coefficient type should │ │ │ │ │ +57 // be deduced. │ │ │ │ │ +58 struct DeducedCoefficientTag {}; │ │ │ │ │ +59 │ │ │ │ │ +60} // namespace Imp │ │ │ │ │ +61 │ │ │ │ │ +62 │ │ │ │ │ +63 │ │ │ │ │ +86template │ │ │ │ │ +_8_7class │ │ │ │ │ +88[[deprecated("HierarchicVectorWrapper is deprecated and will be removed after │ │ │ │ │ +release 2.10.")]] │ │ │ │ │ +89_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r │ │ │ │ │ +90{ │ │ │ │ │ +91 template │ │ │ │ │ +92 using Coefficient = std::conditional_t< std::is_same_v and HasStaticSize_v, │ │ │ │ │ +93 typename Imp::CoefficientType::type, │ │ │ │ │ +94 CO │ │ │ │ │ +95 >; │ │ │ │ │ +96 │ │ │ │ │ +97 │ │ │ │ │ +98 using size_type = std::size_t; │ │ │ │ │ +99 │ │ │ │ │ +100 template(), int> = 0, │ │ │ │ │ +102 std::enable_if_t< not models(), int> = 0> │ │ │ │ │ +103 static void resizeHelper(C& c, const SizeProvider& sizeProvider, typename │ │ │ │ │ +SizeProvider::SizePrefix prefix) │ │ │ │ │ +104 { │ │ │ │ │ +105 auto size = sizeProvider.size(prefix); │ │ │ │ │ +106 if (size != 0) │ │ │ │ │ +107 DUNE_THROW(RangeError, "Can't resize scalar vector entry v[" << prefix << │ │ │ │ │ +"] to size(" << prefix << ")=" << size); │ │ │ │ │ +108 } │ │ │ │ │ +109 │ │ │ │ │ +110 struct StaticResizeHelper │ │ │ │ │ +111 { │ │ │ │ │ +112 template │ │ │ │ │ +113 static void apply(I&& i, C& c, const SizeProvider& sizeProvider, typename │ │ │ │ │ +SizeProvider::SizePrefix prefix) │ │ │ │ │ +114 { │ │ │ │ │ +115 prefix.back() = i; │ │ │ │ │ +116 resizeHelper(c[i], sizeProvider, prefix); │ │ │ │ │ +117 } │ │ │ │ │ +118 }; │ │ │ │ │ +119 │ │ │ │ │ +120 template(), int> = 0, │ │ │ │ │ +122 std::enable_if_t< models(), int> = 0> │ │ │ │ │ +123 static void resizeHelper(C& c, const SizeProvider& sizeProvider, typename │ │ │ │ │ +SizeProvider::SizePrefix prefix) │ │ │ │ │ +124 { │ │ │ │ │ +125 auto size = sizeProvider.size(prefix); │ │ │ │ │ +126 if (size == 0) │ │ │ │ │ +127 return; │ │ │ │ │ +128 │ │ │ │ │ +129 if (c.size() != size) │ │ │ │ │ +130 DUNE_THROW(RangeError, "Can't resize statically sized vector entry v[" << │ │ │ │ │ +prefix << "] of size " << c.size() << " to size(" << prefix << ")=" << size); │ │ │ │ │ +131 │ │ │ │ │ +132 using namespace Dune::Hybrid; │ │ │ │ │ +133 prefix.push_back(0); │ │ │ │ │ +134 forEach(integralRange(Hybrid::size(c)), [&](auto&& i) { │ │ │ │ │ +135 StaticResizeHelper::apply(i, c, sizeProvider, prefix); │ │ │ │ │ +136 }); │ │ │ │ │ +137 } │ │ │ │ │ +138 │ │ │ │ │ +139 template(), int> = 0> │ │ │ │ │ +141 static void resizeHelper(C& c, const SizeProvider& sizeProvider, typename │ │ │ │ │ +SizeProvider::SizePrefix prefix) │ │ │ │ │ +142 { │ │ │ │ │ +143 auto size = sizeProvider.size(prefix); │ │ │ │ │ +144 if (size==0) │ │ │ │ │ +145 { │ │ │ │ │ +146 if (c.size()==0) │ │ │ │ │ +147 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."); │ │ │ │ │ +148 else │ │ │ │ │ +149 return; │ │ │ │ │ +150 } │ │ │ │ │ +151 │ │ │ │ │ +152 c.resize(size); │ │ │ │ │ +153 prefix.push_back(0); │ │ │ │ │ +154 for(std::size_t i=0; i │ │ │ │ │ +_1_6_8 using _E_n_t_r_y = Coefficient; │ │ │ │ │ +169 │ │ │ │ │ +_1_7_0 _H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r(_V_e_c_t_o_r& vector) : │ │ │ │ │ +171 vector_(&vector) │ │ │ │ │ +172 {} │ │ │ │ │ +173 │ │ │ │ │ +174 template │ │ │ │ │ +_1_7_5 void _r_e_s_i_z_e(const SizeProvider& sizeProvider) │ │ │ │ │ +176 { │ │ │ │ │ +177 typename SizeProvider::SizePrefix prefix; │ │ │ │ │ +178 prefix.resize(0); │ │ │ │ │ +179 resizeHelper(*vector_, sizeProvider, prefix); │ │ │ │ │ +180 } │ │ │ │ │ +181 │ │ │ │ │ +182 template │ │ │ │ │ +_1_8_3 const _E_n_t_r_y_<_M_u_l_t_i_I_n_d_e_x_>& _o_p_e_r_a_t_o_r_[_](const MultiIndex& index) const │ │ │ │ │ +184 { │ │ │ │ │ +185 static_assert(not std::is_same_v>, "Coefficient type for │ │ │ │ │ +HierarchicVectorWrapper and given multi-index type cannot be determined │ │ │ │ │ +automatically!"); │ │ │ │ │ +186 return hybridMultiIndexAccess&>(*vector_, index); │ │ │ │ │ +187 } │ │ │ │ │ +188 │ │ │ │ │ +189 template │ │ │ │ │ +_1_9_0 _E_n_t_r_y_<_M_u_l_t_i_I_n_d_e_x_>& _o_p_e_r_a_t_o_r_[_](const MultiIndex& index) │ │ │ │ │ +191 { │ │ │ │ │ +192 static_assert(not std::is_same_v>, "Coefficient type for │ │ │ │ │ +HierarchicVectorWrapper and given multi-index type cannot be determined │ │ │ │ │ +automatically!"); │ │ │ │ │ +193 return hybridMultiIndexAccess&>(*vector_, index); │ │ │ │ │ +194 } │ │ │ │ │ +195 │ │ │ │ │ +196 template │ │ │ │ │ +_1_9_7 const _E_n_t_r_y_<_M_u_l_t_i_I_n_d_e_x_>& _o_p_e_r_a_t_o_r_(_)(const MultiIndex& index) const │ │ │ │ │ +198 { │ │ │ │ │ +199 static_assert(not std::is_same_v>, "Coefficient type for │ │ │ │ │ +HierarchicVectorWrapper and given multi-index type cannot be determined │ │ │ │ │ +automatically!"); │ │ │ │ │ +200 return (*this)[index]; │ │ │ │ │ +201 } │ │ │ │ │ +202 │ │ │ │ │ +203 template │ │ │ │ │ +_2_0_4 _E_n_t_r_y_<_M_u_l_t_i_I_n_d_e_x_>& _o_p_e_r_a_t_o_r_(_)(const MultiIndex& index) │ │ │ │ │ +205 { │ │ │ │ │ +206 static_assert(not std::is_same_v>, "Coefficient type for │ │ │ │ │ +HierarchicVectorWrapper and given multi-index type cannot be determined │ │ │ │ │ +automatically!"); │ │ │ │ │ +207 return (*this)[index]; │ │ │ │ │ +208 } │ │ │ │ │ +209 │ │ │ │ │ +_2_1_0 const _V_e_c_t_o_r& _v_e_c_t_o_r() const │ │ │ │ │ +211 { │ │ │ │ │ +212 return *vector_; │ │ │ │ │ +213 } │ │ │ │ │ +214 │ │ │ │ │ +_2_1_5 _V_e_c_t_o_r& _v_e_c_t_o_r() │ │ │ │ │ +216 { │ │ │ │ │ +217 return *vector_; │ │ │ │ │ +218 } │ │ │ │ │ +219 │ │ │ │ │ +220private: │ │ │ │ │ +221 │ │ │ │ │ +222 Vector* vector_; │ │ │ │ │ +223}; │ │ │ │ │ +224 │ │ │ │ │ +225 │ │ │ │ │ +226 │ │ │ │ │ +230template │ │ │ │ │ +_2_3_1_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_<_ _V_ _> _h_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r(V& v) │ │ │ │ │ +232{ │ │ │ │ │ +233 return _H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_<_V_>(v); │ │ │ │ │ +234} │ │ │ │ │ +235 │ │ │ │ │ +236 │ │ │ │ │ +237 │ │ │ │ │ +241template(), int> = │ │ │ │ │ +0> │ │ │ │ │ +_2_4_3V& _m_a_k_e_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_F_o_r_M_u_l_t_i_I_n_d_e_x(V& v) │ │ │ │ │ +244{ │ │ │ │ │ +245 return v; │ │ │ │ │ +246} │ │ │ │ │ +247 │ │ │ │ │ +248 │ │ │ │ │ +249 │ │ │ │ │ +253template(), │ │ │ │ │ +int> = 0> │ │ │ │ │ +_2_5_5_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_<_ _V_ _> _m_a_k_e_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_F_o_r_M_u_l_t_i_I_n_d_e_x(V& v) │ │ │ │ │ +256{ │ │ │ │ │ +257 return _H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_<_V_>(v); │ │ │ │ │ +258} │ │ │ │ │ +259 │ │ │ │ │ +260 │ │ │ │ │ +261 │ │ │ │ │ +262} // namespace Dune::Functions │ │ │ │ │ +263} // namespace Dune │ │ │ │ │ +264 │ │ │ │ │ +265 │ │ │ │ │ +266#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_HIERARCHICVECTORWRAPPER_HH │ │ │ │ │ _i_n_d_e_x_a_c_c_e_s_s_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_r_e_s_o_l_v_e_S_t_a_t_i_c_M_u_l_t_i_I_n_d_e_x │ │ │ │ │ -constexpr decltype(auto) resolveStaticMultiIndex(C &&c, const MultiIndex │ │ │ │ │ -&multiIndex) │ │ │ │ │ -Provide multi-index access by chaining operator[]. │ │ │ │ │ -DDeeffiinniittiioonn indexaccess.hh:421 │ │ │ │ │ +_u_t_i_l_i_t_y_._h_h │ │ │ │ │ +_t_y_p_e___t_r_a_i_t_s_._h_h │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_N_o_d_e_T_o_R_a_n_g_e_M_a_p │ │ │ │ │ -A simple node to range map using the nested tree indices. │ │ │ │ │ -DDeeffiinniittiioonn hierarchicnodetorangemap.hh:34 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_N_o_d_e_T_o_R_a_n_g_e_M_a_p_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -decltype(auto) operator()(const Node &, const TreePath &treePath, Range &&y) │ │ │ │ │ -const │ │ │ │ │ -DDeeffiinniittiioonn hierarchicnodetorangemap.hh:37 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_N_o_d_e_T_o_R_a_n_g_e_M_a_p_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ -decltype(auto) operator()(const Node &, const TreePath &, Range &&y) const │ │ │ │ │ -DDeeffiinniittiioonn hierarchicnodetorangemap.hh:44 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_F_o_r_M_u_l_t_i_I_n_d_e_x │ │ │ │ │ +V & makeHierarchicVectorForMultiIndex(V &v) │ │ │ │ │ +DDeeffiinniittiioonn hierarchicvectorwrapper.hh:243 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_h_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r │ │ │ │ │ +HierarchicVectorWrapper< V > hierarchicVector(V &v) │ │ │ │ │ +DDeeffiinniittiioonn hierarchicvectorwrapper.hh:231 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r │ │ │ │ │ +A wrapper providing multiindex access to vector entries. │ │ │ │ │ +DDeeffiinniittiioonn hierarchicvectorwrapper.hh:90 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +Entry< MultiIndex > & operator()(const MultiIndex &index) │ │ │ │ │ +DDeeffiinniittiioonn hierarchicvectorwrapper.hh:204 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +Entry< MultiIndex > & operator[](const MultiIndex &index) │ │ │ │ │ +DDeeffiinniittiioonn hierarchicvectorwrapper.hh:190 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ +const Entry< MultiIndex > & operator[](const MultiIndex &index) const │ │ │ │ │ +DDeeffiinniittiioonn hierarchicvectorwrapper.hh:183 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_:_:_v_e_c_t_o_r │ │ │ │ │ +Vector & vector() │ │ │ │ │ +DDeeffiinniittiioonn hierarchicvectorwrapper.hh:215 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_:_:_V_e_c_t_o_r │ │ │ │ │ +V Vector │ │ │ │ │ +DDeeffiinniittiioonn hierarchicvectorwrapper.hh:165 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_:_:_E_n_t_r_y │ │ │ │ │ +Coefficient< MultiIndex > Entry │ │ │ │ │ +DDeeffiinniittiioonn hierarchicvectorwrapper.hh:168 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_:_:_v_e_c_t_o_r │ │ │ │ │ +const Vector & vector() const │ │ │ │ │ +DDeeffiinniittiioonn hierarchicvectorwrapper.hh:210 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r │ │ │ │ │ +HierarchicVectorWrapper(Vector &vector) │ │ │ │ │ +DDeeffiinniittiioonn hierarchicvectorwrapper.hh:170 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ │ +const Entry< MultiIndex > & operator()(const MultiIndex &index) const │ │ │ │ │ +DDeeffiinniittiioonn hierarchicvectorwrapper.hh:197 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_V_e_c_t_o_r_W_r_a_p_p_e_r_:_:_r_e_s_i_z_e │ │ │ │ │ +void resize(const SizeProvider &sizeProvider) │ │ │ │ │ +DDeeffiinniittiioonn hierarchicvectorwrapper.hh:175 │ │ │ │ │ _c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00158.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: rannacherturekbasis.hh File Reference │ │ │ │ +dune-functions: leafprebasismixin.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,61 +71,37 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Typedefs | │ │ │ │ -Functions
│ │ │ │ -
rannacherturekbasis.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
leafprebasismixin.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 <dune/functions/functionspacebases/leafprebasismixin.hh>
│ │ │ │ +
#include <cassert>
│ │ │ │ +#include <cstddef>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <dune/functions/functionspacebases/containerdescriptors.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 >
class  Dune::Functions::LeafPreBasisMixin< Derived >
 A generic MixIn class for PreBasis. 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.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<class Dummy = void>
auto Dune::Functions::BasisFactory::rannacherTurek ()
 Create a pre-basis factory that can create a Rannacher-Turek pre-basis.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,44 +1,25 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -rannacherturekbasis.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +leafprebasismixin.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_<_ _G_V_ _> │ │ │ │ │ -  Pre-basis for a Rannacher-Turek basis. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e_<_ _G_V_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n_<_ _D_e_r_i_v_e_d_ _> │ │ │ │ │ +  A generic MixIn class for PreBasis. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y │ │ │ │ │ -  │ │ │ │ │ -TTyyppeeddeeffss │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s< │ │ │ │ │ - _R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s< GV > > │ │ │ │ │ -  Rannacher-Turek basis. │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_r_a_n_n_a_c_h_e_r_T_u_r_e_k () │ │ │ │ │ -  Create a pre-basis factory that can create a Rannacher-Turek pre-basis. │ │ │ │ │ -  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00158_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: rannacherturekbasis.hh Source File │ │ │ │ +dune-functions: leafprebasismixin.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,268 +74,95 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
rannacherturekbasis.hh
│ │ │ │ +
leafprebasismixin.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LEAFPREBASISMIXIN_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LEAFPREBASISMIXIN_HH
│ │ │ │
9
│ │ │ │ -
10#include <dune/common/exceptions.hh>
│ │ │ │ -
11
│ │ │ │ -
12#include <dune/grid/common/capabilities.hh>
│ │ │ │ +
10#include <cassert>
│ │ │ │ +
11#include <cstddef>
│ │ │ │ +
12#include <type_traits>
│ │ │ │
13
│ │ │ │ -
14#include <dune/localfunctions/common/localfiniteelementvariant.hh>
│ │ │ │ -
15#include <dune/localfunctions/rannacherturek.hh>
│ │ │ │ -
16#include <dune/localfunctions/crouzeixraviart.hh>
│ │ │ │ + │ │ │ │ +
15
│ │ │ │ +
16namespace Dune::Functions {
│ │ │ │
17
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
21
│ │ │ │ -
22
│ │ │ │ -
23namespace Dune {
│ │ │ │ -
24namespace Functions {
│ │ │ │ -
25
│ │ │ │ -
26// *****************************************************************************
│ │ │ │ -
27// This is the reusable part of the basis. It contains
│ │ │ │ -
28//
│ │ │ │ -
29// RannacherTurekPreBasis
│ │ │ │ -
30// RannacherTurekNode
│ │ │ │ -
31//
│ │ │ │ -
32// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ -
33// state. These components do _not_ depend on the global basis and local view
│ │ │ │ -
34// and can be used without a global basis.
│ │ │ │ -
35// *****************************************************************************
│ │ │ │ -
36
│ │ │ │ -
37template<typename GV>
│ │ │ │ -
38class RannacherTurekNode;
│ │ │ │ -
39
│ │ │ │ -
40template<typename GV>
│ │ │ │ -
41class RannacherTurekPreBasis;
│ │ │ │ -
42
│ │ │ │ -
55template<typename GV>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
57 public LeafPreBasisMixin< RannacherTurekPreBasis<GV> >
│ │ │ │ -
58{
│ │ │ │ -
59 static const int dim = GV::dimension;
│ │ │ │ -
60
│ │ │ │ -
61public:
│ │ │ │ -
62
│ │ │ │ -
64 using GridView = GV;
│ │ │ │ -
65
│ │ │ │ -
67 using size_type = std::size_t;
│ │ │ │ -
68
│ │ │ │ - │ │ │ │ -
71
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
74 gridView_(gv)
│ │ │ │ -
75 {
│ │ │ │ -
76 for(auto type : gv.indexSet().types(0))
│ │ │ │ -
77 if (!type.isSimplex() && !type.isCube())
│ │ │ │ -
78 DUNE_THROW(Dune::NotImplemented, "Rannacher-Turek or Crouzeix-Raviart elements are only implemented for grids with simplex or cube elements.");
│ │ │ │ -
79 }
│ │ │ │ -
│ │ │ │ +
34template<class Derived>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
36{
│ │ │ │ +
37public:
│ │ │ │ +
39 using size_type = std::size_t;
│ │ │ │ +
40
│ │ │ │ +
42 static constexpr size_type maxMultiIndexSize = 1;
│ │ │ │ +
43
│ │ │ │ +
45 static constexpr size_type minMultiIndexSize = 1;
│ │ │ │ +
46
│ │ │ │ +
48 static constexpr size_type multiIndexBufferSize = 1;
│ │ │ │ +
49
│ │ │ │ +
51 template<class SizePrefix,
│ │ │ │ +
52 decltype(std::declval<SizePrefix>().size(), bool{}) = true>
│ │ │ │ +
│ │ │ │ +
53 size_type size(const SizePrefix& prefix) const
│ │ │ │ +
54 {
│ │ │ │ +
55 assert(prefix.size() == 0 || prefix.size() == 1);
│ │ │ │ +
56 return (prefix.size() == 0) ? derived().dimension() : 0;
│ │ │ │ +
57 }
│ │ │ │ +
│ │ │ │ +
58
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
61 {
│ │ │ │ +
62 return derived().dimension();
│ │ │ │ +
63 }
│ │ │ │ +
│ │ │ │ +
64
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
67 {
│ │ │ │ + │ │ │ │ +
69 }
│ │ │ │ +
│ │ │ │ +
70
│ │ │ │ +
71private:
│ │ │ │ +
72 const Derived& derived() const
│ │ │ │ +
73 {
│ │ │ │ +
74 return static_cast<const Derived&>(*this);
│ │ │ │ +
75 }
│ │ │ │ +
76};
│ │ │ │ +
│ │ │ │ +
77
│ │ │ │ +
78
│ │ │ │ +
79} // end namespace Dune::Functions
│ │ │ │
80
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
83 {}
│ │ │ │ -
│ │ │ │ -
84
│ │ │ │ -
│ │ │ │ -
86 const GridView& gridView() const
│ │ │ │ -
87 {
│ │ │ │ -
88 return gridView_;
│ │ │ │ -
89 }
│ │ │ │ -
│ │ │ │ -
90
│ │ │ │ -
│ │ │ │ -
92 void update (const GridView& gv)
│ │ │ │ -
93 {
│ │ │ │ -
94 gridView_ = gv;
│ │ │ │ -
95 }
│ │ │ │ -
│ │ │ │ -
96
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
101 {
│ │ │ │ -
102 return Node{};
│ │ │ │ -
103 }
│ │ │ │ -
│ │ │ │ -
104
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
107 {
│ │ │ │ -
108 return (size_type)(gridView_.size(1));
│ │ │ │ -
109 }
│ │ │ │ -
│ │ │ │ -
110
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
113 {
│ │ │ │ -
114 return 2*GV::dimension;
│ │ │ │ -
115 }
│ │ │ │ -
│ │ │ │ -
116
│ │ │ │ -
117 template<typename It>
│ │ │ │ -
│ │ │ │ -
118 It indices(const Node& node, It it) const
│ │ │ │ -
119 {
│ │ │ │ -
120 for (size_type i = 0, end = node.size() ; i < end ; ++i, ++it)
│ │ │ │ -
121 {
│ │ │ │ -
122 Dune::LocalKey localKey = node.finiteElement().localCoefficients().localKey(i);
│ │ │ │ -
123 const auto& gridIndexSet = gridView().indexSet();
│ │ │ │ -
124 const auto& element = node.element();
│ │ │ │ -
125
│ │ │ │ -
126 *it = {{ (size_type)(gridIndexSet.subIndex(element,localKey.subEntity(),1)) }};
│ │ │ │ -
127 }
│ │ │ │ -
128 return it;
│ │ │ │ -
129 }
│ │ │ │ -
│ │ │ │ -
130
│ │ │ │ -
131protected:
│ │ │ │ - │ │ │ │ -
133};
│ │ │ │ -
│ │ │ │ -
134
│ │ │ │ -
135
│ │ │ │ -
136
│ │ │ │ -
137template<typename GV>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
139 public LeafBasisNode
│ │ │ │ -
140{
│ │ │ │ -
141 static const int dim = GV::dimension;
│ │ │ │ -
142 static const int maxSize = 2*dim;
│ │ │ │ -
143
│ │ │ │ -
144 constexpr static bool hasFixedElementType = Capabilities::hasSingleGeometryType<typename GV::Grid>::v;
│ │ │ │ -
145
│ │ │ │ -
146 using CubeFiniteElement = RannacherTurekLocalFiniteElement<typename GV::ctype,double,dim>;
│ │ │ │ -
147 using SimplexFiniteElement = CrouzeixRaviartLocalFiniteElement<typename GV::ctype,double,dim>;
│ │ │ │ -
148
│ │ │ │ -
149 constexpr static unsigned int topologyId = Capabilities::hasSingleGeometryType<typename GV::Grid>::topologyId; // meaningless if hasFixedElementType is false
│ │ │ │ -
150 constexpr static GeometryType type = GeometryType(topologyId, GV::dimension);
│ │ │ │ -
151
│ │ │ │ -
152public:
│ │ │ │ -
153
│ │ │ │ -
154 using size_type = std::size_t;
│ │ │ │ -
155 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ -
156 using FiniteElement = std::conditional_t<hasFixedElementType,
│ │ │ │ -
157 std::conditional_t<type.isCube(),CubeFiniteElement,SimplexFiniteElement>,
│ │ │ │ -
158 LocalFiniteElementVariant<CubeFiniteElement, SimplexFiniteElement> >;
│ │ │ │ -
159
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
162 element_(nullptr)
│ │ │ │ -
163 {}
│ │ │ │ -
│ │ │ │ -
164
│ │ │ │ -
│ │ │ │ -
166 const Element& element() const
│ │ │ │ -
167 {
│ │ │ │ -
168 return *element_;
│ │ │ │ -
169 }
│ │ │ │ -
│ │ │ │ -
170
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
176 {
│ │ │ │ -
177 return finiteElement_;
│ │ │ │ -
178 }
│ │ │ │ -
│ │ │ │ -
179
│ │ │ │ -
│ │ │ │ -
181 void bind(const Element& e)
│ │ │ │ -
182 {
│ │ │ │ -
183 element_ = &e;
│ │ │ │ -
184 if constexpr (!hasFixedElementType)
│ │ │ │ -
185 finiteElement_ = e.type().isCube() ? static_cast<FiniteElement>(CubeFiniteElement())
│ │ │ │ -
186 : static_cast<FiniteElement>(SimplexFiniteElement()) ;
│ │ │ │ -
187 this->setSize(finiteElement_.size());
│ │ │ │ -
188 }
│ │ │ │ -
│ │ │ │ -
189
│ │ │ │ -
190protected:
│ │ │ │ -
191
│ │ │ │ - │ │ │ │ - │ │ │ │ -
194};
│ │ │ │ -
│ │ │ │ -
195
│ │ │ │ -
196
│ │ │ │ -
197
│ │ │ │ -
198namespace BasisFactory {
│ │ │ │ -
199
│ │ │ │ -
205template<class Dummy=void>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
207{
│ │ │ │ -
208 return [](const auto& gridView) {
│ │ │ │ -
209 return RannacherTurekPreBasis<std::decay_t<decltype(gridView)>>(gridView);
│ │ │ │ -
210 };
│ │ │ │ -
211}
│ │ │ │ -
│ │ │ │ -
212
│ │ │ │ -
213} // end namespace BasisFactory
│ │ │ │ -
214
│ │ │ │ -
215
│ │ │ │ -
216
│ │ │ │ -
217
│ │ │ │ -
229template<typename GV>
│ │ │ │ - │ │ │ │ -
231
│ │ │ │ -
232} // end namespace Functions
│ │ │ │ -
233} // end namespace Dune
│ │ │ │ -
234
│ │ │ │ -
235#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
auto rannacherTurek()
Create a pre-basis factory that can create a Rannacher-Turek pre-basis.
Definition rannacherturekbasis.hh:206
│ │ │ │ -
Definition polynomial.hh:17
│ │ │ │ -
Global basis for given pre-basis.
Definition defaultglobalbasis.hh:50
│ │ │ │ +
81
│ │ │ │ +
82#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LEAFPREBASISMIXIN_HH
│ │ │ │ + │ │ │ │ +
Definition polynomial.hh:18
│ │ │ │ +
Uniform descriptor with dynamic size.
Definition containerdescriptors.hh:168
│ │ │ │
A generic MixIn class for PreBasis.
Definition leafprebasismixin.hh:36
│ │ │ │ -
size_type size() const
Definition nodes.hh:147
│ │ │ │ -
void setSize(const size_type size)
Definition nodes.hh:169
│ │ │ │ -
Definition nodes.hh:191
│ │ │ │ -
Definition rannacherturekbasis.hh:140
│ │ │ │ -
std::conditional_t< hasFixedElementType, std::conditional_t< type.isCube(), CubeFiniteElement, SimplexFiniteElement >, LocalFiniteElementVariant< CubeFiniteElement, SimplexFiniteElement > > FiniteElement
Definition rannacherturekbasis.hh:158
│ │ │ │ -
void bind(const Element &e)
Bind to element.
Definition rannacherturekbasis.hh:181
│ │ │ │ -
FiniteElement finiteElement_
Definition rannacherturekbasis.hh:192
│ │ │ │ -
std::size_t size_type
Definition rannacherturekbasis.hh:154
│ │ │ │ -
typename GV::template Codim< 0 >::Entity Element
Definition rannacherturekbasis.hh:155
│ │ │ │ -
RannacherTurekNode()
Definition rannacherturekbasis.hh:160
│ │ │ │ -
const Element * element_
Definition rannacherturekbasis.hh:193
│ │ │ │ -
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition rannacherturekbasis.hh:175
│ │ │ │ -
const Element & element() const
Return current element, throw if unbound.
Definition rannacherturekbasis.hh:166
│ │ │ │ -
Pre-basis for a Rannacher-Turek basis.
Definition rannacherturekbasis.hh:58
│ │ │ │ -
void initializeIndices()
Initialize the global indices.
Definition rannacherturekbasis.hh:82
│ │ │ │ -
std::size_t size_type
Type used for indices and size information.
Definition rannacherturekbasis.hh:67
│ │ │ │ -
Node makeNode() const
Create tree node.
Definition rannacherturekbasis.hh:100
│ │ │ │ -
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition rannacherturekbasis.hh:92
│ │ │ │ -
It indices(const Node &node, It it) const
Definition rannacherturekbasis.hh:118
│ │ │ │ -
GV GridView
The grid view that the FE basis is defined on.
Definition rannacherturekbasis.hh:64
│ │ │ │ -
size_type dimension() const
Same as size(prefix) with empty prefix.
Definition rannacherturekbasis.hh:106
│ │ │ │ -
RannacherTurekPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition rannacherturekbasis.hh:73
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition rannacherturekbasis.hh:86
│ │ │ │ -
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition rannacherturekbasis.hh:112
│ │ │ │ -
GridView gridView_
Definition rannacherturekbasis.hh:132
│ │ │ │ +
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition leafprebasismixin.hh:53
│ │ │ │ +
static constexpr size_type minMultiIndexSize
Minimal length of global multi-indices.
Definition leafprebasismixin.hh:45
│ │ │ │ +
auto containerDescriptor() const
Return a flat container-descriptor.
Definition leafprebasismixin.hh:66
│ │ │ │ +
static constexpr size_type maxMultiIndexSize
Maximal length of global multi-indices.
Definition leafprebasismixin.hh:42
│ │ │ │ +
size_type size() const
Get the total dimension of the space spanned by this basis.
Definition leafprebasismixin.hh:60
│ │ │ │ +
std::size_t size_type
Type used for indices and size information.
Definition leafprebasismixin.hh:39
│ │ │ │ +
static constexpr size_type multiIndexBufferSize
Size required temporarily when constructing global multi-indices.
Definition leafprebasismixin.hh:48
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,317 +1,109 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -rannacherturekbasis.hh │ │ │ │ │ +leafprebasismixin.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LEAFPREBASISMIXIN_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LEAFPREBASISMIXIN_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11 │ │ │ │ │ -12#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ 13 │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ +14#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h> │ │ │ │ │ +15 │ │ │ │ │ +16namespace _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s { │ │ │ │ │ 17 │ │ │ │ │ -18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ -19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ -20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ -21 │ │ │ │ │ -22 │ │ │ │ │ -23namespace _D_u_n_e { │ │ │ │ │ -24namespace Functions { │ │ │ │ │ -25 │ │ │ │ │ -26/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ -27// This is the reusable part of the basis. It contains │ │ │ │ │ -28// │ │ │ │ │ -29// RannacherTurekPreBasis │ │ │ │ │ -30// RannacherTurekNode │ │ │ │ │ -31// │ │ │ │ │ -32// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ -shared │ │ │ │ │ -33// state. These components do _not_ depend on the global basis and local view │ │ │ │ │ -34// and can be used without a global basis. │ │ │ │ │ -35/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ -36 │ │ │ │ │ -37template │ │ │ │ │ -38class RannacherTurekNode; │ │ │ │ │ -39 │ │ │ │ │ -40template │ │ │ │ │ -41class RannacherTurekPreBasis; │ │ │ │ │ -42 │ │ │ │ │ -55template │ │ │ │ │ -_5_6class _R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s : │ │ │ │ │ -57 public _L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n< RannacherTurekPreBasis > │ │ │ │ │ -58{ │ │ │ │ │ -59 static const int dim = GV::dimension; │ │ │ │ │ -60 │ │ │ │ │ -61public: │ │ │ │ │ -62 │ │ │ │ │ -_6_4 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ -65 │ │ │ │ │ -_6_7 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ -68 │ │ │ │ │ -_7_0 using _N_o_d_e = _R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e_<_G_V_>; │ │ │ │ │ -71 │ │ │ │ │ -_7_3 _R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s(const _G_r_i_d_V_i_e_w& gv) : │ │ │ │ │ -74 _g_r_i_d_V_i_e_w__(gv) │ │ │ │ │ -75 { │ │ │ │ │ -76 for(auto type : gv.indexSet().types(0)) │ │ │ │ │ -77 if (!type.isSimplex() && !type.isCube()) │ │ │ │ │ -78 DUNE_THROW(Dune::NotImplemented, "Rannacher-Turek or Crouzeix-Raviart │ │ │ │ │ -elements are only implemented for grids with simplex or cube elements."); │ │ │ │ │ -79 } │ │ │ │ │ +34template │ │ │ │ │ +_3_5class _L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n │ │ │ │ │ +36{ │ │ │ │ │ +37public: │ │ │ │ │ +_3_9 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ +40 │ │ │ │ │ +_4_2 static constexpr _s_i_z_e___t_y_p_e _m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e = 1; │ │ │ │ │ +43 │ │ │ │ │ +_4_5 static constexpr _s_i_z_e___t_y_p_e _m_i_n_M_u_l_t_i_I_n_d_e_x_S_i_z_e = 1; │ │ │ │ │ +46 │ │ │ │ │ +_4_8 static constexpr _s_i_z_e___t_y_p_e _m_u_l_t_i_I_n_d_e_x_B_u_f_f_e_r_S_i_z_e = 1; │ │ │ │ │ +49 │ │ │ │ │ +51 template().size(), bool{}) = true> │ │ │ │ │ +_5_3 _s_i_z_e___t_y_p_e _s_i_z_e(const SizePrefix& prefix) const │ │ │ │ │ +54 { │ │ │ │ │ +55 assert(prefix.size() == 0 || prefix.size() == 1); │ │ │ │ │ +56 return (prefix.size() == 0) ? derived().dimension() : 0; │ │ │ │ │ +57 } │ │ │ │ │ +58 │ │ │ │ │ +_6_0 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ +61 { │ │ │ │ │ +62 return derived().dimension(); │ │ │ │ │ +63 } │ │ │ │ │ +64 │ │ │ │ │ +_6_6 auto _c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r() const │ │ │ │ │ +67 { │ │ │ │ │ +68 return _C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_F_l_a_t_V_e_c_t_o_r{_s_i_z_e()}; │ │ │ │ │ +69 } │ │ │ │ │ +70 │ │ │ │ │ +71private: │ │ │ │ │ +72 const Derived& derived() const │ │ │ │ │ +73 { │ │ │ │ │ +74 return static_cast(*this); │ │ │ │ │ +75 } │ │ │ │ │ +76}; │ │ │ │ │ +77 │ │ │ │ │ +78 │ │ │ │ │ +79} // end namespace Dune::Functions │ │ │ │ │ 80 │ │ │ │ │ -_8_2 void _i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s() │ │ │ │ │ -83 {} │ │ │ │ │ -84 │ │ │ │ │ -_8_6 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ -87 { │ │ │ │ │ -88 return _g_r_i_d_V_i_e_w__; │ │ │ │ │ -89 } │ │ │ │ │ -90 │ │ │ │ │ -_9_2 void _u_p_d_a_t_e (const _G_r_i_d_V_i_e_w& gv) │ │ │ │ │ -93 { │ │ │ │ │ -94 _g_r_i_d_V_i_e_w__ = gv; │ │ │ │ │ -95 } │ │ │ │ │ -96 │ │ │ │ │ -_1_0_0 _N_o_d_e _m_a_k_e_N_o_d_e() const │ │ │ │ │ -101 { │ │ │ │ │ -102 return _N_o_d_e{}; │ │ │ │ │ -103 } │ │ │ │ │ -104 │ │ │ │ │ -_1_0_6 _s_i_z_e___t_y_p_e _d_i_m_e_n_s_i_o_n() const │ │ │ │ │ -107 { │ │ │ │ │ -108 return (_s_i_z_e___t_y_p_e)(_g_r_i_d_V_i_e_w__.size(1)); │ │ │ │ │ -109 } │ │ │ │ │ -110 │ │ │ │ │ -_1_1_2 _s_i_z_e___t_y_p_e _m_a_x_N_o_d_e_S_i_z_e() const │ │ │ │ │ -113 { │ │ │ │ │ -114 return 2*GV::dimension; │ │ │ │ │ -115 } │ │ │ │ │ -116 │ │ │ │ │ -117 template │ │ │ │ │ -_1_1_8 It _i_n_d_i_c_e_s(const _N_o_d_e& node, It it) const │ │ │ │ │ -119 { │ │ │ │ │ -120 for (_s_i_z_e___t_y_p_e i = 0, end = node._s_i_z_e() ; i < end ; ++i, ++it) │ │ │ │ │ -121 { │ │ │ │ │ -122 Dune::LocalKey localKey = node._f_i_n_i_t_e_E_l_e_m_e_n_t().localCoefficients().localKey │ │ │ │ │ -(i); │ │ │ │ │ -123 const auto& gridIndexSet = _g_r_i_d_V_i_e_w().indexSet(); │ │ │ │ │ -124 const auto& element = node._e_l_e_m_e_n_t(); │ │ │ │ │ -125 │ │ │ │ │ -126 *it = {{ (_s_i_z_e___t_y_p_e)(gridIndexSet.subIndex(element,localKey.subEntity(),1)) │ │ │ │ │ -}}; │ │ │ │ │ -127 } │ │ │ │ │ -128 return it; │ │ │ │ │ -129 } │ │ │ │ │ -130 │ │ │ │ │ -131protected: │ │ │ │ │ -_1_3_2 _G_r_i_d_V_i_e_w _g_r_i_d_V_i_e_w__; │ │ │ │ │ -133}; │ │ │ │ │ -134 │ │ │ │ │ -135 │ │ │ │ │ -136 │ │ │ │ │ -137template │ │ │ │ │ -_1_3_8class _R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e : │ │ │ │ │ -139 public _L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ -140{ │ │ │ │ │ -141 static const int dim = GV::dimension; │ │ │ │ │ -142 static const int maxSize = 2*dim; │ │ │ │ │ -143 │ │ │ │ │ -144 constexpr static bool hasFixedElementType = Capabilities:: │ │ │ │ │ -hasSingleGeometryType::v; │ │ │ │ │ -145 │ │ │ │ │ -146 using CubeFiniteElement = RannacherTurekLocalFiniteElement; │ │ │ │ │ -147 using SimplexFiniteElement = CrouzeixRaviartLocalFiniteElement; │ │ │ │ │ -148 │ │ │ │ │ -149 constexpr static unsigned int topologyId = Capabilities:: │ │ │ │ │ -hasSingleGeometryType::topologyId; // meaningless if │ │ │ │ │ -hasFixedElementType is false │ │ │ │ │ -150 constexpr static GeometryType type = GeometryType(topologyId, GV:: │ │ │ │ │ -dimension); │ │ │ │ │ -151 │ │ │ │ │ -152public: │ │ │ │ │ -153 │ │ │ │ │ -_1_5_4 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ -_1_5_5 using _E_l_e_m_e_n_t = typename GV::template Codim<0>::Entity; │ │ │ │ │ -_1_5_6 using _F_i_n_i_t_e_E_l_e_m_e_n_t = std::conditional_t, │ │ │ │ │ -158 LocalFiniteElementVariant >; │ │ │ │ │ -159 │ │ │ │ │ -_1_6_0 _R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e() : │ │ │ │ │ -161 _f_i_n_i_t_e_E_l_e_m_e_n_t__(), │ │ │ │ │ -162 _e_l_e_m_e_n_t__(nullptr) │ │ │ │ │ -163 {} │ │ │ │ │ -164 │ │ │ │ │ -_1_6_6 const _E_l_e_m_e_n_t& _e_l_e_m_e_n_t() const │ │ │ │ │ -167 { │ │ │ │ │ -168 return *_e_l_e_m_e_n_t__; │ │ │ │ │ -169 } │ │ │ │ │ -170 │ │ │ │ │ -_1_7_5 const _F_i_n_i_t_e_E_l_e_m_e_n_t& _f_i_n_i_t_e_E_l_e_m_e_n_t() const │ │ │ │ │ -176 { │ │ │ │ │ -177 return _f_i_n_i_t_e_E_l_e_m_e_n_t__; │ │ │ │ │ -178 } │ │ │ │ │ -179 │ │ │ │ │ -_1_8_1 void _b_i_n_d(const _E_l_e_m_e_n_t& e) │ │ │ │ │ -182 { │ │ │ │ │ -183 _e_l_e_m_e_n_t__ = &e; │ │ │ │ │ -184 if constexpr (!hasFixedElementType) │ │ │ │ │ -185 _f_i_n_i_t_e_E_l_e_m_e_n_t__ = e.type().isCube() ? static_cast<_F_i_n_i_t_e_E_l_e_m_e_n_t> │ │ │ │ │ -(CubeFiniteElement()) │ │ │ │ │ -186 : static_cast<_F_i_n_i_t_e_E_l_e_m_e_n_t>(SimplexFiniteElement()) ; │ │ │ │ │ -187 this->_s_e_t_S_i_z_e(_f_i_n_i_t_e_E_l_e_m_e_n_t__.size()); │ │ │ │ │ -188 } │ │ │ │ │ -189 │ │ │ │ │ -190protected: │ │ │ │ │ -191 │ │ │ │ │ -_1_9_2 _F_i_n_i_t_e_E_l_e_m_e_n_t _f_i_n_i_t_e_E_l_e_m_e_n_t__; │ │ │ │ │ -_1_9_3 const _E_l_e_m_e_n_t* _e_l_e_m_e_n_t__; │ │ │ │ │ -194}; │ │ │ │ │ -195 │ │ │ │ │ -196 │ │ │ │ │ -197 │ │ │ │ │ -198namespace BasisFactory { │ │ │ │ │ -199 │ │ │ │ │ -205template │ │ │ │ │ -_2_0_6auto _r_a_n_n_a_c_h_e_r_T_u_r_e_k() │ │ │ │ │ -207{ │ │ │ │ │ -208 return [](const auto& gridView) { │ │ │ │ │ -209 return _R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s>(gridView); │ │ │ │ │ -210 }; │ │ │ │ │ -211} │ │ │ │ │ -212 │ │ │ │ │ -213} // end namespace BasisFactory │ │ │ │ │ -214 │ │ │ │ │ -215 │ │ │ │ │ -216 │ │ │ │ │ -217 │ │ │ │ │ -229template │ │ │ │ │ -_2_3_0using _R_a_n_n_a_c_h_e_r_T_u_r_e_k_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_<_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_<_G_V_> >; │ │ │ │ │ -231 │ │ │ │ │ -232} // end namespace Functions │ │ │ │ │ -233} // end namespace Dune │ │ │ │ │ -234 │ │ │ │ │ -235#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH │ │ │ │ │ -_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h │ │ │ │ │ -_n_o_d_e_s_._h_h │ │ │ │ │ -_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_r_a_n_n_a_c_h_e_r_T_u_r_e_k │ │ │ │ │ -auto rannacherTurek() │ │ │ │ │ -Create a pre-basis factory that can create a Rannacher-Turek pre-basis. │ │ │ │ │ -DDeeffiinniittiioonn rannacherturekbasis.hh:206 │ │ │ │ │ -_D_u_n_e │ │ │ │ │ -DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ -Global basis for given pre-basis. │ │ │ │ │ -DDeeffiinniittiioonn defaultglobalbasis.hh:50 │ │ │ │ │ +81 │ │ │ │ │ +82#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LEAFPREBASISMIXIN_HH │ │ │ │ │ +_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │ +DDeeffiinniittiioonn polynomial.hh:18 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_V_e_c_t_o_r │ │ │ │ │ +Uniform descriptor with dynamic size. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:168 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n │ │ │ │ │ A generic MixIn class for PreBasis. │ │ │ │ │ DDeeffiinniittiioonn leafprebasismixin.hh:36 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_i_z_e │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_s_i_z_e │ │ │ │ │ +size_type size(const SizePrefix &prefix) const │ │ │ │ │ +Return number of possible values for next position in multi index. │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismixin.hh:53 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_m_i_n_M_u_l_t_i_I_n_d_e_x_S_i_z_e │ │ │ │ │ +static constexpr size_type minMultiIndexSize │ │ │ │ │ +Minimal length of global multi-indices. │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismixin.hh:45 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +auto containerDescriptor() const │ │ │ │ │ +Return a flat container-descriptor. │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismixin.hh:66 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e │ │ │ │ │ +static constexpr size_type maxMultiIndexSize │ │ │ │ │ +Maximal length of global multi-indices. │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismixin.hh:42 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_s_i_z_e │ │ │ │ │ size_type size() const │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:147 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_e_t_S_i_z_e │ │ │ │ │ -void setSize(const size_type size) │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:169 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:191 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e │ │ │ │ │ -DDeeffiinniittiioonn rannacherturekbasis.hh:140 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e_:_:_F_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ -std::conditional_t< hasFixedElementType, std::conditional_t< type.isCube(), │ │ │ │ │ -CubeFiniteElement, SimplexFiniteElement >, LocalFiniteElementVariant< │ │ │ │ │ -CubeFiniteElement, SimplexFiniteElement > > FiniteElement │ │ │ │ │ -DDeeffiinniittiioonn rannacherturekbasis.hh:158 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e_:_:_b_i_n_d │ │ │ │ │ -void bind(const Element &e) │ │ │ │ │ -Bind to element. │ │ │ │ │ -DDeeffiinniittiioonn rannacherturekbasis.hh:181 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t__ │ │ │ │ │ -FiniteElement finiteElement_ │ │ │ │ │ -DDeeffiinniittiioonn rannacherturekbasis.hh:192 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -DDeeffiinniittiioonn rannacherturekbasis.hh:154 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e_:_:_E_l_e_m_e_n_t │ │ │ │ │ -typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ -DDeeffiinniittiioonn rannacherturekbasis.hh:155 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e │ │ │ │ │ -RannacherTurekNode() │ │ │ │ │ -DDeeffiinniittiioonn rannacherturekbasis.hh:160 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e_:_:_e_l_e_m_e_n_t__ │ │ │ │ │ -const Element * element_ │ │ │ │ │ -DDeeffiinniittiioonn rannacherturekbasis.hh:193 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ -const FiniteElement & finiteElement() const │ │ │ │ │ -Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ -DDeeffiinniittiioonn rannacherturekbasis.hh:175 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e_:_:_e_l_e_m_e_n_t │ │ │ │ │ -const Element & element() const │ │ │ │ │ -Return current element, throw if unbound. │ │ │ │ │ -DDeeffiinniittiioonn rannacherturekbasis.hh:166 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s │ │ │ │ │ -Pre-basis for a Rannacher-Turek basis. │ │ │ │ │ -DDeeffiinniittiioonn rannacherturekbasis.hh:58 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_:_:_i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s │ │ │ │ │ -void initializeIndices() │ │ │ │ │ -Initialize the global indices. │ │ │ │ │ -DDeeffiinniittiioonn rannacherturekbasis.hh:82 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +Get the total dimension of the space spanned by this basis. │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismixin.hh:60 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ std::size_t size_type │ │ │ │ │ Type used for indices and size information. │ │ │ │ │ -DDeeffiinniittiioonn rannacherturekbasis.hh:67 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ -Node makeNode() const │ │ │ │ │ -Create tree node. │ │ │ │ │ -DDeeffiinniittiioonn rannacherturekbasis.hh:100 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_:_:_u_p_d_a_t_e │ │ │ │ │ -void update(const GridView &gv) │ │ │ │ │ -Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ -DDeeffiinniittiioonn rannacherturekbasis.hh:92 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s │ │ │ │ │ -It indices(const Node &node, It it) const │ │ │ │ │ -DDeeffiinniittiioonn rannacherturekbasis.hh:118 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ -GV GridView │ │ │ │ │ -The grid view that the FE basis is defined on. │ │ │ │ │ -DDeeffiinniittiioonn rannacherturekbasis.hh:64 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ -size_type dimension() const │ │ │ │ │ -Same as size(prefix) with empty prefix. │ │ │ │ │ -DDeeffiinniittiioonn rannacherturekbasis.hh:106 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s │ │ │ │ │ -RannacherTurekPreBasis(const GridView &gv) │ │ │ │ │ -Constructor for a given grid view object. │ │ │ │ │ -DDeeffiinniittiioonn rannacherturekbasis.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ -const GridView & gridView() const │ │ │ │ │ -Obtain the grid view that the basis is defined on. │ │ │ │ │ -DDeeffiinniittiioonn rannacherturekbasis.hh:86 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_:_:_m_a_x_N_o_d_e_S_i_z_e │ │ │ │ │ -size_type maxNodeSize() const │ │ │ │ │ -Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ -DDeeffiinniittiioonn rannacherturekbasis.hh:112 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w__ │ │ │ │ │ -GridView gridView_ │ │ │ │ │ -DDeeffiinniittiioonn rannacherturekbasis.hh:132 │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismixin.hh:39 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_m_u_l_t_i_I_n_d_e_x_B_u_f_f_e_r_S_i_z_e │ │ │ │ │ +static constexpr size_type multiIndexBufferSize │ │ │ │ │ +Size required temporarily when constructing global multi-indices. │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismixin.hh:48 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00161.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: containerdescriptors.hh File Reference │ │ │ │ +dune-functions: nodes.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -72,96 +72,61 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Typedefs | │ │ │ │ Functions
│ │ │ │ -
containerdescriptors.hh File Reference
│ │ │ │ +
nodes.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <array>
│ │ │ │ -#include <cassert>
│ │ │ │ -#include <functional>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <dune/common/filledarray.hh>
│ │ │ │ -#include <dune/common/tuplevector.hh>
│ │ │ │ -#include <dune/common/typeutilities.hh>
│ │ │ │ -#include <dune/functions/common/type_traits.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/basistags.hh>
│ │ │ │ +
#include <cassert>
│ │ │ │ +#include <memory>
│ │ │ │ +#include <dune/common/indices.hh>
│ │ │ │ +#include <dune/typetree/leafnode.hh>
│ │ │ │ +#include <dune/typetree/powernode.hh>
│ │ │ │ +#include <dune/typetree/dynamicpowernode.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

struct  Dune::Functions::ContainerDescriptors::Unknown
 Fallback container descriptor if nothing else fits. More...
class  Dune::Functions::BasisNodeMixin
 
struct  Dune::Functions::ContainerDescriptors::Value
 The node in the descriptor tree representing a value placeholder. More...
class  Dune::Functions::LeafBasisNode
 
struct  Dune::Functions::ContainerDescriptors::UniformArray< Child, n >
 Descriptor for arrays with all children identical and the number of children a static size. More...
class  Dune::Functions::PowerBasisNode< T, n >
 
struct  Dune::Functions::ContainerDescriptors::UniformVector< Child >
 Uniform descriptor with dynamic size. More...
class  Dune::Functions::DynamicPowerBasisNode< T >
 
class  Dune::Functions::CompositeBasisNode< T >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Namespaces

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

│ │ │ │ -Typedefs

template<class... Children>
using Dune::Functions::ContainerDescriptors::Tuple = Dune::TupleVector< Children... >
 Descriptor with all children of possibly different type.
 
template<class Child , std::size_t n>
using Dune::Functions::ContainerDescriptors::Array = std::array< Child, n >
 Descriptor for arrays with all children of the same type and static size.
 
template<class Child >
using Dune::Functions::ContainerDescriptors::Vector = std::vector< Child >
 Descriptor for vectors with all children of the same type and dynamic size.
 
template<std::size_t n>
using Dune::Functions::ContainerDescriptors::FlatArray = UniformArray< Value, n >
 Alias for a uniform array storing value placeholders.
 
using Dune::Functions::ContainerDescriptors::FlatVector = UniformVector< Value >
 Alias for a uniform vector storing value placeholders.
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<class PreBasis >
auto Dune::Functions::containerDescriptor (const PreBasis &preBasis)
 Return the container descriptor of the pre-basis, if defined, otherwise ContainerDescriptor::Unknown.
 
template<class Child0 , class... Children, std::enable_if_t<(std::is_same_v< Child0, Children > &&...), int > = 0>
auto Dune::Functions::ContainerDescriptors::makeDescriptor (Child0 child, Children... children)
 Generate a descriptor in case the children are all of the same type.
 
template<class Child , std::size_t n>
auto Dune::Functions::ContainerDescriptors::makeUniformDescriptor (std::integral_constant< std::size_t, n >, Child child)
 Generate a uniform descriptor in case the size is a static constant.
 
template<class Child >
auto Dune::Functions::ContainerDescriptors::makeUniformDescriptor (std::size_t n, Child child)
 Generate a uniform descriptor in case the size is a dynamic value.
 
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 {} │ │ │ │ │ @@ -1,91 +1,49 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -containerdescriptors.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +nodes.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_b_a_s_i_s_t_a_g_s_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_k_n_o_w_n │ │ │ │ │ -  Fallback container descriptor if nothing else fits. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_V_a_l_u_e │ │ │ │ │ -  The node in the descriptor tree representing a value placeholder. │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_A_r_r_a_y_<_ _C_h_i_l_d_,_ _n_ _> │ │ │ │ │ -  Descriptor for arrays with all children identical and the number of │ │ │ │ │ - children a static size. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_V_e_c_t_o_r_<_ _C_h_i_l_d_ _> │ │ │ │ │ -  Uniform descriptor with dynamic size. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_B_a_s_i_s_N_o_d_e_<_ _T_,_ _n_ _> │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e_<_ _T_ _> │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e_<_ _T_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s │ │ │ │ │ -  │ │ │ │ │ -TTyyppeeddeeffss │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_T_u_p_l_e = Dune::TupleVector< │ │ │ │ │ - Children... > │ │ │ │ │ -  Descriptor with all children of possibly different type. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_A_r_r_a_y = std::array< Child, n > │ │ │ │ │ -  Descriptor for arrays with all children of the same type and static │ │ │ │ │ - size. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_V_e_c_t_o_r = std::vector< Child > │ │ │ │ │ -  Descriptor for vectors with all children of the same type and dynamic │ │ │ │ │ - size. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_F_l_a_t_A_r_r_a_y = _U_n_i_f_o_r_m_A_r_r_a_y< _V_a_l_u_e, │ │ │ │ │ - n > │ │ │ │ │ -  Alias for a uniform array storing value placeholders. │ │ │ │ │ -  │ │ │ │ │ -using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_F_l_a_t_V_e_c_t_o_r = _U_n_i_f_o_r_m_V_e_c_t_o_r< _V_a_l_u_e │ │ │ │ │ - > │ │ │ │ │ -  Alias for a uniform vector storing value placeholders. │ │ │ │ │ -  │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r (const PreBasis &preBasis) │ │ │ │ │ -  Return the container descriptor of the pre-basis, if defined, otherwise │ │ │ │ │ - ContainerDescriptor::Unknown. │ │ │ │ │ -  │ │ │ │ │ -template &&...), int > = 0> │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_m_a_k_e_D_e_s_c_r_i_p_t_o_r (Child0 child, │ │ │ │ │ - Children... children) │ │ │ │ │ -  Generate a descriptor in case the children are all of the same type. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_m_a_k_e_U_n_i_f_o_r_m_D_e_s_c_r_i_p_t_o_r (std:: │ │ │ │ │ - integral_constant< std::size_t, n >, Child child) │ │ │ │ │ -  Generate a uniform descriptor in case the size is a static constant. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_m_a_k_e_U_n_i_f_o_r_m_D_e_s_c_r_i_p_t_o_r (std::size_t │ │ │ │ │ - n, Child child) │ │ │ │ │ -  Generate a uniform descriptor in case the size is a dynamic value. │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_l_e_a_r_S_i_z_e (Tree &tree, std::size_t offset) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_b_i_n_d_T_r_e_e (Tree &tree, const Entity &entity, std::size_t │ │ │ │ │ + offset=0) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_n_i_t_i_a_l_i_z_e_T_r_e_e (Tree &tree, std::size_t │ │ │ │ │ + treeIndexOffset=0) │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00161_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: containerdescriptors.hh Source File │ │ │ │ +dune-functions: nodes.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,299 +74,400 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
containerdescriptors.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_CONTAINERDESCRIPTORS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_CONTAINERDESCRIPTORS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH
│ │ │ │
9
│ │ │ │ -
10#include <array>
│ │ │ │ -
11#include <cassert>
│ │ │ │ -
12#include <functional>
│ │ │ │ -
13#include <type_traits>
│ │ │ │ -
14#include <vector>
│ │ │ │ -
15
│ │ │ │ -
16#include <dune/common/filledarray.hh>
│ │ │ │ -
17#include <dune/common/tuplevector.hh>
│ │ │ │ -
18#include <dune/common/typeutilities.hh>
│ │ │ │ -
19
│ │ │ │ - │ │ │ │ - │ │ │ │ -
22
│ │ │ │ -
46namespace Dune::Functions {
│ │ │ │ -
│ │ │ │ -
47namespace ContainerDescriptors {
│ │ │ │ -
48
│ │ │ │ -
50struct Unknown {};
│ │ │ │ -
51
│ │ │ │ -
52} // end namespace ContainerDescriptors
│ │ │ │ -
│ │ │ │ -
53
│ │ │ │ -
54namespace Impl {
│ │ │ │ +
10#include <cassert>
│ │ │ │ +
11#include <memory>
│ │ │ │ +
12
│ │ │ │ +
13#include <dune/common/indices.hh>
│ │ │ │ +
14
│ │ │ │ +
15#include <dune/typetree/leafnode.hh>
│ │ │ │ +
16#include <dune/typetree/powernode.hh>
│ │ │ │ +
17#include <dune/typetree/dynamicpowernode.hh>
│ │ │ │ +
18#include <dune/typetree/compositenode.hh>
│ │ │ │ +
19#include <dune/typetree/traversal.hh>
│ │ │ │ +
20#include <dune/typetree/visitor.hh>
│ │ │ │ +
21
│ │ │ │ +
22namespace Dune {
│ │ │ │ +
23 namespace Functions {
│ │ │ │ +
24
│ │ │ │ +
25
│ │ │ │ +
26 namespace Impl {
│ │ │ │ +
27
│ │ │ │ +
28
│ │ │ │ +
29 struct ClearSizeVisitor
│ │ │ │ +
30 : public TypeTree::TreeVisitor
│ │ │ │ +
31 , public TypeTree::DynamicTraversal
│ │ │ │ +
32 {
│ │ │ │ +
33
│ │ │ │ +
34 template<typename Node, typename TreePath>
│ │ │ │ +
35 void pre(Node& node, TreePath treePath)
│ │ │ │ +
36 {
│ │ │ │ +
37 leaf(node,treePath);
│ │ │ │ +
38 node.setSize(0);
│ │ │ │ +
39 }
│ │ │ │ +
40
│ │ │ │ +
41 template<typename Node, typename TreePath>
│ │ │ │ +
42 void leaf(Node& node, TreePath treePath)
│ │ │ │ +
43 {
│ │ │ │ +
44 node.setOffset(offset_);
│ │ │ │ +
45 }
│ │ │ │ +
46
│ │ │ │ +
47 ClearSizeVisitor(std::size_t offset)
│ │ │ │ +
48 : offset_(offset)
│ │ │ │ +
49 {}
│ │ │ │ +
50
│ │ │ │ +
51 const std::size_t offset_;
│ │ │ │ +
52
│ │ │ │ +
53 };
│ │ │ │ +
54
│ │ │ │
55
│ │ │ │ -
56template<class PreBasis>
│ │ │ │ -
57auto containerDescriptorImpl(const PreBasis& preBasis, Dune::PriorityTag<1>)
│ │ │ │ -
58 -> decltype(preBasis.containerDescriptor())
│ │ │ │ -
59{
│ │ │ │ -
60 return preBasis.containerDescriptor();
│ │ │ │ -
61}
│ │ │ │ -
62
│ │ │ │ -
63template<class PreBasis>
│ │ │ │ -
64auto containerDescriptorImpl(const PreBasis& preBasis, Dune::PriorityTag<0>)
│ │ │ │ -
65{
│ │ │ │ -
66 return ContainerDescriptors::Unknown{};
│ │ │ │ -
67}
│ │ │ │ -
68
│ │ │ │ -
69} // end namespace Impl
│ │ │ │ -
70
│ │ │ │ -
72template<class PreBasis>
│ │ │ │ -
│ │ │ │ -
73auto containerDescriptor(const PreBasis& preBasis)
│ │ │ │ -
74{
│ │ │ │ -
75 return Impl::containerDescriptorImpl(preBasis, Dune::PriorityTag<2>{});
│ │ │ │ -
76}
│ │ │ │ -
│ │ │ │ -
77
│ │ │ │ -
78
│ │ │ │ -
79namespace ContainerDescriptors {
│ │ │ │ -
80
│ │ │ │ -
│ │ │ │ -
82struct Value
│ │ │ │ -
83{
│ │ │ │ -
85 template<class Index>
│ │ │ │ -
86 Value operator[] (const Index&) const { return {}; }
│ │ │ │ -
87
│ │ │ │ -
89 static constexpr std::size_t size () { return 0; }
│ │ │ │ -
90};
│ │ │ │ -
│ │ │ │ +
56 template<typename Entity>
│ │ │ │ +
57 struct BindVisitor
│ │ │ │ +
58 : public TypeTree::TreeVisitor
│ │ │ │ +
59 , public TypeTree::DynamicTraversal
│ │ │ │ +
60 {
│ │ │ │ +
61
│ │ │ │ +
62 template<typename Node, typename TreePath>
│ │ │ │ +
63 void pre(Node& node, TreePath)
│ │ │ │ +
64 {
│ │ │ │ +
65 node.setOffset(offset_);
│ │ │ │ +
66 }
│ │ │ │ +
67
│ │ │ │ +
68 template<typename Node, typename TreePath>
│ │ │ │ +
69 void post(Node& node, TreePath)
│ │ │ │ +
70 {
│ │ │ │ +
71 node.setSize(offset_ - node.offset());
│ │ │ │ +
72 }
│ │ │ │ +
73
│ │ │ │ +
74 template<typename Node, typename TreePath>
│ │ │ │ +
75 void leaf(Node& node, TreePath)
│ │ │ │ +
76 {
│ │ │ │ +
77 node.setOffset(offset_);
│ │ │ │ +
78 node.bind(entity_);
│ │ │ │ +
79 offset_ += node.size();
│ │ │ │ +
80 }
│ │ │ │ +
81
│ │ │ │ +
82 BindVisitor(const Entity& entity, std::size_t offset = 0)
│ │ │ │ +
83 : entity_(entity)
│ │ │ │ +
84 , offset_(offset)
│ │ │ │ +
85 {}
│ │ │ │ +
86
│ │ │ │ +
87 const Entity& entity_;
│ │ │ │ +
88 std::size_t offset_;
│ │ │ │ +
89
│ │ │ │ +
90 };
│ │ │ │
91
│ │ │ │ -
93template<class... Children>
│ │ │ │ -
94using Tuple = Dune::TupleVector<Children...>;
│ │ │ │ -
95
│ │ │ │ -
98template<class Child0, class... Children,
│ │ │ │ -
99 std::enable_if_t<(sizeof...(Children) > 0), int> = 0,
│ │ │ │ -
100 std::enable_if_t<(...|| (not std::is_same_v<Child0, Children>)), int> = 0>
│ │ │ │ -
101auto makeDescriptor (Child0 child0, Children... children)
│ │ │ │ -
102{
│ │ │ │ -
103 using Descriptor = Tuple<Child0,Children...>;
│ │ │ │ -
104 return Descriptor{std::move(child0),std::move(children)...};
│ │ │ │ -
105}
│ │ │ │ -
106
│ │ │ │ -
107
│ │ │ │ -
109template<class Child, std::size_t n>
│ │ │ │ -
110using Array = std::array<Child, n>;
│ │ │ │ -
111
│ │ │ │ -
113template<class Child0, class... Children,
│ │ │ │ -
114 std::enable_if_t<(std::is_same_v<Child0, Children> &&...), int> = 0>
│ │ │ │ -
│ │ │ │ -
115auto makeDescriptor (Child0 child, Children... children)
│ │ │ │ -
116{
│ │ │ │ -
117 using Descriptor = Array<Child0,1+sizeof...(Children)>;
│ │ │ │ -
118 return Descriptor{std::move(child),std::move(children)...};
│ │ │ │ -
119}
│ │ │ │ -
│ │ │ │ +
92
│ │ │ │ +
93 struct InitializeTreeVisitor :
│ │ │ │ +
94 public TypeTree::TreeVisitor,
│ │ │ │ +
95 public TypeTree::DynamicTraversal
│ │ │ │ +
96 {
│ │ │ │ +
97 template<typename Node, typename TreePath>
│ │ │ │ +
98 void pre(Node& node, TreePath)
│ │ │ │ +
99 {
│ │ │ │ +
100 node.setTreeIndex(treeIndex_);
│ │ │ │ +
101 ++treeIndex_;
│ │ │ │ +
102 }
│ │ │ │ +
103
│ │ │ │ +
104 template<typename Node, typename TreePath>
│ │ │ │ +
105 void leaf(Node& node, TreePath)
│ │ │ │ +
106 {
│ │ │ │ +
107 node.setTreeIndex(treeIndex_);
│ │ │ │ +
108 ++treeIndex_;
│ │ │ │ +
109 }
│ │ │ │ +
110
│ │ │ │ +
111 InitializeTreeVisitor(std::size_t treeIndexOffset = 0) :
│ │ │ │ +
112 treeIndex_(treeIndexOffset)
│ │ │ │ +
113 {}
│ │ │ │ +
114
│ │ │ │ +
115 std::size_t treeIndex_;
│ │ │ │ +
116 };
│ │ │ │ +
117
│ │ │ │ +
118 } // end namespace Impl
│ │ │ │ +
119
│ │ │ │
120
│ │ │ │ -
121
│ │ │ │ -
123template<class Child>
│ │ │ │ -
124using Vector = std::vector<Child>;
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
122 {
│ │ │ │ +
123
│ │ │ │ +
124 friend struct Impl::ClearSizeVisitor;
│ │ │ │
125
│ │ │ │ -
127template<class Child, std::size_t n>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
129{
│ │ │ │ -
131 template<class C = Child,
│ │ │ │ -
132 std::enable_if_t<std::is_default_constructible_v<C>, int> = 0>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
134 : child_{}
│ │ │ │ -
135 {}
│ │ │ │ -
│ │ │ │ -
136
│ │ │ │ -
│ │ │ │ -
138 explicit UniformArray (Child child)
│ │ │ │ -
139 : child_{std::move(child)}
│ │ │ │ -
140 {}
│ │ │ │ -
│ │ │ │ -
141
│ │ │ │ -
143 template<class Index>
│ │ │ │ -
144 const Child& operator[] (const Index& /*i*/) const { return child_; }
│ │ │ │ -
145
│ │ │ │ -
147 static constexpr std::size_t size () { return n; }
│ │ │ │ -
148
│ │ │ │ -
149private:
│ │ │ │ -
150 Child child_;
│ │ │ │ -
151};
│ │ │ │ -
│ │ │ │ -
152
│ │ │ │ -
154template<std::size_t n>
│ │ │ │ - │ │ │ │ +
126 template<typename>
│ │ │ │ +
127 friend struct Impl::BindVisitor;
│ │ │ │ +
128
│ │ │ │ +
129 friend struct Impl::InitializeTreeVisitor;
│ │ │ │ +
130
│ │ │ │ +
131 public:
│ │ │ │ +
132
│ │ │ │ +
133 using size_type = std::size_t;
│ │ │ │ +
134
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
136 offset_(0),
│ │ │ │ +
137 size_(0),
│ │ │ │ +
138 treeIndex_(0)
│ │ │ │ +
139 {}
│ │ │ │ +
│ │ │ │ +
140
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
142 {
│ │ │ │ +
143 assert(i < size_);
│ │ │ │ +
144 return offset_ + i;
│ │ │ │ +
145 }
│ │ │ │ +
│ │ │ │ +
146
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
148 {
│ │ │ │ +
149 return size_;
│ │ │ │ +
150 }
│ │ │ │ +
│ │ │ │ +
151
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
153 {
│ │ │ │ +
154 return treeIndex_;
│ │ │ │ +
155 }
│ │ │ │ +
│ │ │ │
156
│ │ │ │ -
158template<class Child, std::size_t n>
│ │ │ │ +
157 protected:
│ │ │ │ +
158
│ │ │ │
│ │ │ │ -
159auto makeUniformDescriptor (std::integral_constant<std::size_t,n>, Child child)
│ │ │ │ -
160{
│ │ │ │ -
161 return UniformArray<Child,n>{std::move(child)};
│ │ │ │ -
162}
│ │ │ │ + │ │ │ │ +
160 {
│ │ │ │ +
161 return offset_;
│ │ │ │ +
162 }
│ │ │ │
│ │ │ │
163
│ │ │ │ -
164
│ │ │ │ -
166template<class Child>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
168{
│ │ │ │ -
170 template<class C = Child,
│ │ │ │ -
171 std::enable_if_t<std::is_default_constructible_v<C>, int> = 0>
│ │ │ │ -
│ │ │ │ -
172 explicit UniformVector (std::size_t size)
│ │ │ │ -
173 : size_{size}
│ │ │ │ -
174 , child_{}
│ │ │ │ -
175 {}
│ │ │ │ -
│ │ │ │ -
176
│ │ │ │ -
│ │ │ │ -
178 UniformVector (std::size_t size, Child child)
│ │ │ │ -
179 : size_{size}
│ │ │ │ -
180 , child_{std::move(child)}
│ │ │ │ -
181 {}
│ │ │ │ -
│ │ │ │ -
182
│ │ │ │ -
184 template<class Index>
│ │ │ │ -
185 const Child& operator[] (const Index& /*i*/) const { return child_; }
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
165 {
│ │ │ │ +
166 offset_ = offset;
│ │ │ │ +
167 }
│ │ │ │ +
│ │ │ │ +
168
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
170 {
│ │ │ │ +
171 size_ = size;
│ │ │ │ +
172 }
│ │ │ │ +
│ │ │ │ +
173
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
175 {
│ │ │ │ +
176 treeIndex_ = treeIndex;
│ │ │ │ +
177 }
│ │ │ │ +
│ │ │ │ +
178
│ │ │ │ +
179 private:
│ │ │ │ +
180
│ │ │ │ +
181 size_type offset_;
│ │ │ │ +
182 size_type size_;
│ │ │ │ +
183 size_type treeIndex_;
│ │ │ │ +
184
│ │ │ │ +
185 };
│ │ │ │ +
│ │ │ │
186
│ │ │ │ -
188 std::size_t size () const { return size_; }
│ │ │ │ -
189
│ │ │ │ -
190private:
│ │ │ │ -
191 std::size_t size_;
│ │ │ │ -
192 Child child_;
│ │ │ │ -
193};
│ │ │ │ -
│ │ │ │ -
194
│ │ │ │ - │ │ │ │ -
197
│ │ │ │ -
199template<class Child>
│ │ │ │ -
│ │ │ │ -
200auto makeUniformDescriptor (std::size_t n, Child child)
│ │ │ │ -
201{
│ │ │ │ -
202 return UniformVector<Child>{n,std::move(child)};
│ │ │ │ -
203}
│ │ │ │ -
│ │ │ │ -
204
│ │ │ │ -
205namespace Impl {
│ │ │ │ -
206
│ │ │ │ -
207template<class InnerFunc, class LeafFunc>
│ │ │ │ -
208struct TreeTransform
│ │ │ │ -
209{
│ │ │ │ -
210 TreeTransform (const InnerFunc& innerFunc, const LeafFunc& leafFunc)
│ │ │ │ -
211 : innerFunc_(innerFunc)
│ │ │ │ -
212 , leafFunc_(leafFunc)
│ │ │ │ -
213 {}
│ │ │ │ -
214
│ │ │ │ -
215 Unknown operator() (const Unknown& tree) const
│ │ │ │ -
216 {
│ │ │ │ -
217 return tree;
│ │ │ │ -
218 }
│ │ │ │ +
187
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
189 public BasisNodeMixin,
│ │ │ │ +
190 public TypeTree::LeafNode
│ │ │ │ +
191 {};
│ │ │ │ +
│ │ │ │ +
192
│ │ │ │ +
193
│ │ │ │ +
194 template<typename T, std::size_t n>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
196 public BasisNodeMixin,
│ │ │ │ +
197 public TypeTree::PowerNode<T,n>
│ │ │ │ +
198 {
│ │ │ │ +
199
│ │ │ │ +
200 using Node = TypeTree::PowerNode<T,n>;
│ │ │ │ +
201
│ │ │ │ +
202 public:
│ │ │ │ +
203
│ │ │ │ +
204 using Element = typename T::Element;
│ │ │ │ +
205
│ │ │ │ +
206 PowerBasisNode() = default;
│ │ │ │ +
207
│ │ │ │ +
│ │ │ │ +
208 PowerBasisNode(const typename Node::NodeStorage& children) :
│ │ │ │ +
209 Node(children)
│ │ │ │ +
210 {}
│ │ │ │ +
│ │ │ │ +
211
│ │ │ │ +
│ │ │ │ +
212 const Element& element() const
│ │ │ │ +
213 {
│ │ │ │ +
214 return this->child(Dune::Indices::_0).element();
│ │ │ │ +
215 }
│ │ │ │ +
│ │ │ │ +
216
│ │ │ │ +
217 };
│ │ │ │ +
│ │ │ │ +
218
│ │ │ │
219
│ │ │ │ -
220 auto operator() (const Value& tree) const
│ │ │ │ -
221 {
│ │ │ │ -
222 return leafFunc_(tree);
│ │ │ │ -
223 }
│ │ │ │ -
224
│ │ │ │ -
225 template<class... V>
│ │ │ │ -
226 auto operator() (const Tuple<V...>& tree) const
│ │ │ │ -
227 {
│ │ │ │ -
228 return unpackIntegerSequence([&](auto... ii) {
│ │ │ │ -
229 return makeDescriptor(innerFunc_(tree[ii])...);
│ │ │ │ -
230 }, std::make_index_sequence<sizeof...(V)>());
│ │ │ │ -
231 }
│ │ │ │ -
232
│ │ │ │ -
233 template<class V, std::size_t n>
│ │ │ │ -
234 auto operator() (const Array<V,n>& tree) const
│ │ │ │ -
235 {
│ │ │ │ -
236 return unpackIntegerSequence([&](auto... ii) {
│ │ │ │ -
237 return makeDescriptor(innerFunc_(tree[ii])...);
│ │ │ │ -
238 }, std::make_index_sequence<n>());
│ │ │ │ -
239 }
│ │ │ │ -
240
│ │ │ │ -
241 template<class V>
│ │ │ │ -
242 auto operator() (const Vector<V>& tree) const
│ │ │ │ -
243 {
│ │ │ │ -
244 using W = decltype(innerFunc_(tree[0]));
│ │ │ │ -
245 Vector<W> result;
│ │ │ │ -
246 result.reserve(tree.size());
│ │ │ │ -
247 for (std::size_t i = 0; i < tree.size(); ++i)
│ │ │ │ -
248 result.emplace_back(innerFunc_(tree[i]));
│ │ │ │ -
249 return result;
│ │ │ │ -
250 }
│ │ │ │ -
251
│ │ │ │ -
252 template<class V, std::size_t n>
│ │ │ │ -
253 auto operator() (const UniformArray<V,n>& tree) const
│ │ │ │ -
254 {
│ │ │ │ -
255 return makeUniformDescriptor(Dune::index_constant<n>{}, innerFunc_(tree[0]));
│ │ │ │ -
256 }
│ │ │ │ +
220 template<typename T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
222 public BasisNodeMixin,
│ │ │ │ +
223 public TypeTree::DynamicPowerNode<T>
│ │ │ │ +
224 {
│ │ │ │ +
225
│ │ │ │ +
226 using Node = TypeTree::DynamicPowerNode<T>;
│ │ │ │ +
227
│ │ │ │ +
228 public:
│ │ │ │ +
229
│ │ │ │ +
230 using Element = typename T::Element;
│ │ │ │ +
231
│ │ │ │ +
│ │ │ │ +
232 DynamicPowerBasisNode (std::size_t children)
│ │ │ │ +
233 : Node(children)
│ │ │ │ +
234 {}
│ │ │ │ +
│ │ │ │ +
235
│ │ │ │ +
│ │ │ │ +
236 DynamicPowerBasisNode (typename Node::NodeStorage children)
│ │ │ │ +
237 : Node(std::move(children))
│ │ │ │ +
238 {}
│ │ │ │ +
│ │ │ │ +
239
│ │ │ │ +
│ │ │ │ +
240 const Element& element() const
│ │ │ │ +
241 {
│ │ │ │ +
242 return this->child(0).element();
│ │ │ │ +
243 }
│ │ │ │ +
│ │ │ │ +
244
│ │ │ │ +
245 };
│ │ │ │ +
│ │ │ │ +
246
│ │ │ │ +
247
│ │ │ │ +
248 template<typename... T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
250 public BasisNodeMixin,
│ │ │ │ +
251 public TypeTree::CompositeNode<T...>
│ │ │ │ +
252 {
│ │ │ │ +
253
│ │ │ │ +
254 using Node = TypeTree::CompositeNode<T...>;
│ │ │ │ +
255
│ │ │ │ +
256 public:
│ │ │ │
257
│ │ │ │ -
258 template<class V>
│ │ │ │ -
259 auto operator() (const UniformVector<V>& tree) const
│ │ │ │ -
260 {
│ │ │ │ -
261 return makeUniformDescriptor(tree.size(), innerFunc_(tree[0]));
│ │ │ │ -
262 }
│ │ │ │ -
263
│ │ │ │ -
264private:
│ │ │ │ -
265 InnerFunc innerFunc_;
│ │ │ │ -
266 LeafFunc leafFunc_;
│ │ │ │ -
267};
│ │ │ │ -
268
│ │ │ │ -
269
│ │ │ │ -
280template<class Size, class T>
│ │ │ │ -
281auto appendToTree (Size s, const T& tree)
│ │ │ │ -
282{
│ │ │ │ -
283 auto transform = TreeTransform(
│ │ │ │ -
284 [s](auto&& node) { return appendToTree(s, node); },
│ │ │ │ -
285 [s](auto&& node) { return makeUniformDescriptor(s, node); });
│ │ │ │ -
286 return transform(tree);
│ │ │ │ -
287}
│ │ │ │ -
288
│ │ │ │ -
289} // end namespace Impl
│ │ │ │ -
290} // end namespace ContainerDescriptors
│ │ │ │ -
291} // end namespace Dune::Functions
│ │ │ │ -
292
│ │ │ │ -
293#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_CONTAINERDESCRIPTORS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ -
Definition polynomial.hh:18
│ │ │ │ -
auto containerDescriptor(const PreBasis &preBasis)
Return the container descriptor of the pre-basis, if defined, otherwise ContainerDescriptor::Unknown.
Definition containerdescriptors.hh:73
│ │ │ │ -
std::array< Child, n > Array
Descriptor for arrays with all children of the same type and static size.
Definition containerdescriptors.hh:110
│ │ │ │ -
auto makeUniformDescriptor(std::integral_constant< std::size_t, n >, Child child)
Generate a uniform descriptor in case the size is a static constant.
Definition containerdescriptors.hh:159
│ │ │ │ -
Dune::TupleVector< Children... > Tuple
Descriptor with all children of possibly different type.
Definition containerdescriptors.hh:94
│ │ │ │ -
auto makeDescriptor(Child0 child, Children... children)
Generate a descriptor in case the children are all of the same type.
Definition containerdescriptors.hh:115
│ │ │ │ -
std::vector< Child > Vector
Descriptor for vectors with all children of the same type and dynamic size.
Definition containerdescriptors.hh:124
│ │ │ │ -
Fallback container descriptor if nothing else fits.
Definition containerdescriptors.hh:50
│ │ │ │ -
The node in the descriptor tree representing a value placeholder.
Definition containerdescriptors.hh:83
│ │ │ │ -
static constexpr std::size_t size()
A value placeholder does not have any sub-descriptors, thus its size is zero.
Definition containerdescriptors.hh:89
│ │ │ │ -
Value operator[](const Index &) const
The child access method is only available for the interface, but should not be called.
Definition containerdescriptors.hh:86
│ │ │ │ -
Descriptor for arrays with all children identical and the number of children a static size.
Definition containerdescriptors.hh:129
│ │ │ │ -
static constexpr std::size_t size()
The static size information, i.e., number of children.
Definition containerdescriptors.hh:147
│ │ │ │ -
UniformArray()
Default constructor. Is enable if the child-type is default constructible.
Definition containerdescriptors.hh:133
│ │ │ │ -
UniformArray(Child child)
Constructor that stores a single child only.
Definition containerdescriptors.hh:138
│ │ │ │ -
const Child & operator[](const Index &) const
Access the i'th child that is always the same, i.e., child_.
Definition containerdescriptors.hh:144
│ │ │ │ -
Uniform descriptor with dynamic size.
Definition containerdescriptors.hh:168
│ │ │ │ -
UniformVector(std::size_t size, Child child)
Constructor that stores the size and a single child only.
Definition containerdescriptors.hh:178
│ │ │ │ -
std::size_t size() const
The dynamic size information, i.e., number of children.
Definition containerdescriptors.hh:188
│ │ │ │ -
UniformVector(std::size_t size)
Default constructor with size. Is enable if the child-type is default constructible.
Definition containerdescriptors.hh:172
│ │ │ │ -
const Child & operator[](const Index &) const
Access the i'th child that is always the same, i.e., child_.
Definition containerdescriptors.hh:185
│ │ │ │ +
258 using Element = typename Node::template Child<0>::Type::Element;
│ │ │ │ +
259
│ │ │ │ + │ │ │ │ +
261
│ │ │ │ +
│ │ │ │ +
262 CompositeBasisNode(const typename Node::NodeStorage& children) :
│ │ │ │ +
263 Node(children)
│ │ │ │ +
264 {}
│ │ │ │ +
│ │ │ │ +
265
│ │ │ │ +
266 template<typename... Children>
│ │ │ │ +
│ │ │ │ +
267 CompositeBasisNode(const std::shared_ptr<Children>&... children) :
│ │ │ │ +
268 Node(children...)
│ │ │ │ +
269 {}
│ │ │ │ +
│ │ │ │ +
270
│ │ │ │ +
│ │ │ │ +
271 const Element& element() const
│ │ │ │ +
272 {
│ │ │ │ +
273 return this->child(Dune::Indices::_0).element();
│ │ │ │ +
274 }
│ │ │ │ +
│ │ │ │ +
275
│ │ │ │ +
276 };
│ │ │ │ +
│ │ │ │ +
277
│ │ │ │ +
278
│ │ │ │ +
279 template<typename Tree>
│ │ │ │ +
│ │ │ │ +
280 void clearSize(Tree& tree, std::size_t offset)
│ │ │ │ +
281 {
│ │ │ │ +
282 TypeTree::applyToTree(tree,Impl::ClearSizeVisitor(offset));
│ │ │ │ +
283 }
│ │ │ │ +
│ │ │ │ +
284
│ │ │ │ +
285 template<typename Tree, typename Entity>
│ │ │ │ +
│ │ │ │ +
286 void bindTree(Tree& tree, const Entity& entity, std::size_t offset = 0)
│ │ │ │ +
287 {
│ │ │ │ +
288 Impl::BindVisitor<Entity> visitor(entity,offset);
│ │ │ │ +
289 TypeTree::applyToTree(tree,visitor);
│ │ │ │ +
290 }
│ │ │ │ +
│ │ │ │ +
291
│ │ │ │ +
292 template<typename Tree>
│ │ │ │ +
│ │ │ │ +
293 void initializeTree(Tree& tree, std::size_t treeIndexOffset = 0)
│ │ │ │ +
294 {
│ │ │ │ +
295 Impl::InitializeTreeVisitor visitor(treeIndexOffset);
│ │ │ │ +
296 TypeTree::applyToTree(tree,visitor);
│ │ │ │ +
297 }
│ │ │ │ +
│ │ │ │ +
298
│ │ │ │ +
299
│ │ │ │ +
300 } // namespace Functions
│ │ │ │ +
301
│ │ │ │ +
302} // namespace Dune
│ │ │ │ +
303
│ │ │ │ +
304#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH
│ │ │ │ +
Definition polynomial.hh:17
│ │ │ │ +
void clearSize(Tree &tree, std::size_t offset)
Definition nodes.hh:280
│ │ │ │ +
void bindTree(Tree &tree, const Entity &entity, std::size_t offset=0)
Definition nodes.hh:286
│ │ │ │ +
void initializeTree(Tree &tree, std::size_t treeIndexOffset=0)
Definition nodes.hh:293
│ │ │ │ +
Definition nodes.hh:122
│ │ │ │ +
size_type treeIndex() const
Definition nodes.hh:152
│ │ │ │ +
size_type localIndex(size_type i) const
Definition nodes.hh:141
│ │ │ │ +
size_type offset() const
Definition nodes.hh:159
│ │ │ │ +
size_type size() const
Definition nodes.hh:147
│ │ │ │ +
void setOffset(const size_type offset)
Definition nodes.hh:164
│ │ │ │ +
std::size_t size_type
Definition nodes.hh:133
│ │ │ │ +
BasisNodeMixin()
Definition nodes.hh:135
│ │ │ │ +
void setSize(const size_type size)
Definition nodes.hh:169
│ │ │ │ +
void setTreeIndex(size_type treeIndex)
Definition nodes.hh:174
│ │ │ │ +
Definition nodes.hh:191
│ │ │ │ +
Definition nodes.hh:198
│ │ │ │ +
const Element & element() const
Definition nodes.hh:212
│ │ │ │ +
typename T::Element Element
Definition nodes.hh:204
│ │ │ │ +
PowerBasisNode(const typename Node::NodeStorage &children)
Definition nodes.hh:208
│ │ │ │ + │ │ │ │ + │ │ │ │ +
const Element & element() const
Definition nodes.hh:240
│ │ │ │ +
DynamicPowerBasisNode(typename Node::NodeStorage children)
Definition nodes.hh:236
│ │ │ │ +
DynamicPowerBasisNode(std::size_t children)
Definition nodes.hh:232
│ │ │ │ +
typename T::Element Element
Definition nodes.hh:230
│ │ │ │ + │ │ │ │ + │ │ │ │ +
CompositeBasisNode(const typename Node::NodeStorage &children)
Definition nodes.hh:262
│ │ │ │ +
const Element & element() const
Definition nodes.hh:271
│ │ │ │ +
typename Node::template Child< 0 >::Type::Element Element
Definition nodes.hh:258
│ │ │ │ +
CompositeBasisNode(const std::shared_ptr< Children > &... children)
Definition nodes.hh:267
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,335 +1,402 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -containerdescriptors.hh │ │ │ │ │ +nodes.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_CONTAINERDESCRIPTORS_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_CONTAINERDESCRIPTORS_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15 │ │ │ │ │ -16#include │ │ │ │ │ -17#include │ │ │ │ │ -18#include │ │ │ │ │ -19 │ │ │ │ │ -20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ -21#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_b_a_s_i_s_t_a_g_s_._h_h> │ │ │ │ │ -22 │ │ │ │ │ -46namespace _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s { │ │ │ │ │ -_4_7namespace ContainerDescriptors { │ │ │ │ │ -48 │ │ │ │ │ -_5_0struct _U_n_k_n_o_w_n {}; │ │ │ │ │ -51 │ │ │ │ │ -52} // end namespace ContainerDescriptors │ │ │ │ │ -53 │ │ │ │ │ -54namespace Impl { │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12 │ │ │ │ │ +13#include │ │ │ │ │ +14 │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17#include │ │ │ │ │ +18#include │ │ │ │ │ +19#include │ │ │ │ │ +20#include │ │ │ │ │ +21 │ │ │ │ │ +22namespace _D_u_n_e { │ │ │ │ │ +23 namespace Functions { │ │ │ │ │ +24 │ │ │ │ │ +25 │ │ │ │ │ +26 namespace Impl { │ │ │ │ │ +27 │ │ │ │ │ +28 │ │ │ │ │ +29 struct ClearSizeVisitor │ │ │ │ │ +30 : public TypeTree::TreeVisitor │ │ │ │ │ +31 , public TypeTree::DynamicTraversal │ │ │ │ │ +32 { │ │ │ │ │ +33 │ │ │ │ │ +34 template │ │ │ │ │ +35 void pre(Node& node, TreePath treePath) │ │ │ │ │ +36 { │ │ │ │ │ +37 leaf(node,treePath); │ │ │ │ │ +38 node.setSize(0); │ │ │ │ │ +39 } │ │ │ │ │ +40 │ │ │ │ │ +41 template │ │ │ │ │ +42 void leaf(Node& node, TreePath treePath) │ │ │ │ │ +43 { │ │ │ │ │ +44 node.setOffset(offset_); │ │ │ │ │ +45 } │ │ │ │ │ +46 │ │ │ │ │ +47 ClearSizeVisitor(std::size_t offset) │ │ │ │ │ +48 : offset_(offset) │ │ │ │ │ +49 {} │ │ │ │ │ +50 │ │ │ │ │ +51 const std::size_t offset_; │ │ │ │ │ +52 │ │ │ │ │ +53 }; │ │ │ │ │ +54 │ │ │ │ │ 55 │ │ │ │ │ -56template │ │ │ │ │ -57auto containerDescriptorImpl(const PreBasis& preBasis, Dune::PriorityTag<1>) │ │ │ │ │ -58 -> decltype(preBasis.containerDescriptor()) │ │ │ │ │ -59{ │ │ │ │ │ -60 return preBasis.containerDescriptor(); │ │ │ │ │ -61} │ │ │ │ │ -62 │ │ │ │ │ -63template │ │ │ │ │ -64auto containerDescriptorImpl(const PreBasis& preBasis, Dune::PriorityTag<0>) │ │ │ │ │ -65{ │ │ │ │ │ -66 return ContainerDescriptors::Unknown{}; │ │ │ │ │ -67} │ │ │ │ │ -68 │ │ │ │ │ -69} // end namespace Impl │ │ │ │ │ -70 │ │ │ │ │ -72template │ │ │ │ │ -_7_3auto _c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r(const PreBasis& preBasis) │ │ │ │ │ -74{ │ │ │ │ │ -75 return Impl::containerDescriptorImpl(preBasis, Dune::PriorityTag<2>{}); │ │ │ │ │ -76} │ │ │ │ │ -77 │ │ │ │ │ -78 │ │ │ │ │ -79namespace ContainerDescriptors { │ │ │ │ │ -80 │ │ │ │ │ -_8_2struct _V_a_l_u_e │ │ │ │ │ -83{ │ │ │ │ │ -85 template │ │ │ │ │ -_8_6 _V_a_l_u_e _o_p_e_r_a_t_o_r_[_]_ (const Index&) const { return {}; } │ │ │ │ │ -87 │ │ │ │ │ -_8_9 static constexpr std::size_t _s_i_z_e () { return 0; } │ │ │ │ │ -90}; │ │ │ │ │ +56 template │ │ │ │ │ +57 struct BindVisitor │ │ │ │ │ +58 : public TypeTree::TreeVisitor │ │ │ │ │ +59 , public TypeTree::DynamicTraversal │ │ │ │ │ +60 { │ │ │ │ │ +61 │ │ │ │ │ +62 template │ │ │ │ │ +63 void pre(Node& node, TreePath) │ │ │ │ │ +64 { │ │ │ │ │ +65 node.setOffset(offset_); │ │ │ │ │ +66 } │ │ │ │ │ +67 │ │ │ │ │ +68 template │ │ │ │ │ +69 void post(Node& node, TreePath) │ │ │ │ │ +70 { │ │ │ │ │ +71 node.setSize(offset_ - node.offset()); │ │ │ │ │ +72 } │ │ │ │ │ +73 │ │ │ │ │ +74 template │ │ │ │ │ +75 void leaf(Node& node, TreePath) │ │ │ │ │ +76 { │ │ │ │ │ +77 node.setOffset(offset_); │ │ │ │ │ +78 node.bind(entity_); │ │ │ │ │ +79 offset_ += node.size(); │ │ │ │ │ +80 } │ │ │ │ │ +81 │ │ │ │ │ +82 BindVisitor(const Entity& entity, std::size_t offset = 0) │ │ │ │ │ +83 : entity_(entity) │ │ │ │ │ +84 , offset_(offset) │ │ │ │ │ +85 {} │ │ │ │ │ +86 │ │ │ │ │ +87 const Entity& entity_; │ │ │ │ │ +88 std::size_t offset_; │ │ │ │ │ +89 │ │ │ │ │ +90 }; │ │ │ │ │ 91 │ │ │ │ │ -93template │ │ │ │ │ -_9_4using _T_u_p_l_e = Dune::TupleVector; │ │ │ │ │ -95 │ │ │ │ │ -98template 0), int> = 0, │ │ │ │ │ -100 std::enable_if_t<(...|| (not std::is_same_v)), int> = 0> │ │ │ │ │ -101auto _m_a_k_e_D_e_s_c_r_i_p_t_o_r (Child0 child0, Children... children) │ │ │ │ │ -102{ │ │ │ │ │ -103 using Descriptor = _T_u_p_l_e; │ │ │ │ │ -104 return Descriptor{std::move(child0),std::move(children)...}; │ │ │ │ │ -105} │ │ │ │ │ -106 │ │ │ │ │ -107 │ │ │ │ │ -109template │ │ │ │ │ -_1_1_0using _A_r_r_a_y = std::array; │ │ │ │ │ -111 │ │ │ │ │ -113template &&...), int> = 0> │ │ │ │ │ -_1_1_5auto _m_a_k_e_D_e_s_c_r_i_p_t_o_r (Child0 child, Children... children) │ │ │ │ │ -116{ │ │ │ │ │ -117 using Descriptor = _A_r_r_a_y; │ │ │ │ │ -118 return Descriptor{std::move(child),std::move(children)...}; │ │ │ │ │ -119} │ │ │ │ │ +92 │ │ │ │ │ +93 struct InitializeTreeVisitor : │ │ │ │ │ +94 public TypeTree::TreeVisitor, │ │ │ │ │ +95 public TypeTree::DynamicTraversal │ │ │ │ │ +96 { │ │ │ │ │ +97 template │ │ │ │ │ +98 void pre(Node& node, TreePath) │ │ │ │ │ +99 { │ │ │ │ │ +100 node.setTreeIndex(treeIndex_); │ │ │ │ │ +101 ++treeIndex_; │ │ │ │ │ +102 } │ │ │ │ │ +103 │ │ │ │ │ +104 template │ │ │ │ │ +105 void leaf(Node& node, TreePath) │ │ │ │ │ +106 { │ │ │ │ │ +107 node.setTreeIndex(treeIndex_); │ │ │ │ │ +108 ++treeIndex_; │ │ │ │ │ +109 } │ │ │ │ │ +110 │ │ │ │ │ +111 InitializeTreeVisitor(std::size_t treeIndexOffset = 0) : │ │ │ │ │ +112 treeIndex_(treeIndexOffset) │ │ │ │ │ +113 {} │ │ │ │ │ +114 │ │ │ │ │ +115 std::size_t treeIndex_; │ │ │ │ │ +116 }; │ │ │ │ │ +117 │ │ │ │ │ +118 } // end namespace Impl │ │ │ │ │ +119 │ │ │ │ │ 120 │ │ │ │ │ -121 │ │ │ │ │ -123template │ │ │ │ │ -_1_2_4using _V_e_c_t_o_r = std::vector; │ │ │ │ │ +_1_2_1 class _B_a_s_i_s_N_o_d_e_M_i_x_i_n │ │ │ │ │ +122 { │ │ │ │ │ +123 │ │ │ │ │ +124 friend struct Impl::ClearSizeVisitor; │ │ │ │ │ 125 │ │ │ │ │ -127template │ │ │ │ │ -_1_2_8struct _U_n_i_f_o_r_m_A_r_r_a_y │ │ │ │ │ -129{ │ │ │ │ │ -131 template, int> = 0> │ │ │ │ │ -_1_3_3 _U_n_i_f_o_r_m_A_r_r_a_y () │ │ │ │ │ -134 : child_{} │ │ │ │ │ -135 {} │ │ │ │ │ -136 │ │ │ │ │ -_1_3_8 explicit _U_n_i_f_o_r_m_A_r_r_a_y (Child child) │ │ │ │ │ -139 : child_{std::move(child)} │ │ │ │ │ -140 {} │ │ │ │ │ -141 │ │ │ │ │ -143 template │ │ │ │ │ -_1_4_4 const Child& _o_p_e_r_a_t_o_r_[_]_ (const Index& /*i*/) const { return child_; } │ │ │ │ │ -145 │ │ │ │ │ -_1_4_7 static constexpr std::size_t _s_i_z_e () { return n; } │ │ │ │ │ -148 │ │ │ │ │ -149private: │ │ │ │ │ -150 Child child_; │ │ │ │ │ -151}; │ │ │ │ │ -152 │ │ │ │ │ -154template │ │ │ │ │ -_1_5_5using _F_l_a_t_A_r_r_a_y = _U_n_i_f_o_r_m_A_r_r_a_y_<_V_a_l_u_e_,_n_>; │ │ │ │ │ +126 template │ │ │ │ │ +127 friend struct Impl::BindVisitor; │ │ │ │ │ +128 │ │ │ │ │ +129 friend struct Impl::InitializeTreeVisitor; │ │ │ │ │ +130 │ │ │ │ │ +131 public: │ │ │ │ │ +132 │ │ │ │ │ +_1_3_3 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ +134 │ │ │ │ │ +_1_3_5 _B_a_s_i_s_N_o_d_e_M_i_x_i_n() : │ │ │ │ │ +136 offset_(0), │ │ │ │ │ +137 size_(0), │ │ │ │ │ +138 treeIndex_(0) │ │ │ │ │ +139 {} │ │ │ │ │ +140 │ │ │ │ │ +_1_4_1 _s_i_z_e___t_y_p_e _l_o_c_a_l_I_n_d_e_x(_s_i_z_e___t_y_p_e i) const │ │ │ │ │ +142 { │ │ │ │ │ +143 assert(i < size_); │ │ │ │ │ +144 return offset_ + i; │ │ │ │ │ +145 } │ │ │ │ │ +146 │ │ │ │ │ +_1_4_7 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ +148 { │ │ │ │ │ +149 return size_; │ │ │ │ │ +150 } │ │ │ │ │ +151 │ │ │ │ │ +_1_5_2 _s_i_z_e___t_y_p_e _t_r_e_e_I_n_d_e_x() const │ │ │ │ │ +153 { │ │ │ │ │ +154 return treeIndex_; │ │ │ │ │ +155 } │ │ │ │ │ 156 │ │ │ │ │ -158template │ │ │ │ │ -_1_5_9auto _m_a_k_e_U_n_i_f_o_r_m_D_e_s_c_r_i_p_t_o_r (std::integral_constant, Child │ │ │ │ │ -child) │ │ │ │ │ -160{ │ │ │ │ │ -161 return _U_n_i_f_o_r_m_A_r_r_a_y_<_C_h_i_l_d_,_n_>{std::move(child)}; │ │ │ │ │ -162} │ │ │ │ │ +157 protected: │ │ │ │ │ +158 │ │ │ │ │ +_1_5_9 _s_i_z_e___t_y_p_e _o_f_f_s_e_t() const │ │ │ │ │ +160 { │ │ │ │ │ +161 return offset_; │ │ │ │ │ +162 } │ │ │ │ │ 163 │ │ │ │ │ -164 │ │ │ │ │ -166template │ │ │ │ │ -_1_6_7struct _U_n_i_f_o_r_m_V_e_c_t_o_r │ │ │ │ │ -168{ │ │ │ │ │ -170 template, int> = 0> │ │ │ │ │ -_1_7_2 explicit _U_n_i_f_o_r_m_V_e_c_t_o_r (std::size_t _s_i_z_e) │ │ │ │ │ -173 : size_{_s_i_z_e} │ │ │ │ │ -174 , child_{} │ │ │ │ │ -175 {} │ │ │ │ │ -176 │ │ │ │ │ -_1_7_8 _U_n_i_f_o_r_m_V_e_c_t_o_r (std::size_t _s_i_z_e, Child child) │ │ │ │ │ -179 : size_{_s_i_z_e} │ │ │ │ │ -180 , child_{std::move(child)} │ │ │ │ │ -181 {} │ │ │ │ │ -182 │ │ │ │ │ -184 template │ │ │ │ │ -_1_8_5 const Child& _o_p_e_r_a_t_o_r_[_]_ (const Index& /*i*/) const { return child_; } │ │ │ │ │ +_1_6_4 void _s_e_t_O_f_f_s_e_t(const _s_i_z_e___t_y_p_e _o_f_f_s_e_t) │ │ │ │ │ +165 { │ │ │ │ │ +166 offset_ = _o_f_f_s_e_t; │ │ │ │ │ +167 } │ │ │ │ │ +168 │ │ │ │ │ +_1_6_9 void _s_e_t_S_i_z_e(const _s_i_z_e___t_y_p_e _s_i_z_e) │ │ │ │ │ +170 { │ │ │ │ │ +171 size_ = _s_i_z_e; │ │ │ │ │ +172 } │ │ │ │ │ +173 │ │ │ │ │ +_1_7_4 void _s_e_t_T_r_e_e_I_n_d_e_x(_s_i_z_e___t_y_p_e _t_r_e_e_I_n_d_e_x) │ │ │ │ │ +175 { │ │ │ │ │ +176 treeIndex_ = _t_r_e_e_I_n_d_e_x; │ │ │ │ │ +177 } │ │ │ │ │ +178 │ │ │ │ │ +179 private: │ │ │ │ │ +180 │ │ │ │ │ +181 _s_i_z_e___t_y_p_e offset_; │ │ │ │ │ +182 _s_i_z_e___t_y_p_e size_; │ │ │ │ │ +183 _s_i_z_e___t_y_p_e treeIndex_; │ │ │ │ │ +184 │ │ │ │ │ +185 }; │ │ │ │ │ 186 │ │ │ │ │ -_1_8_8 std::size_t _s_i_z_e () const { return size_; } │ │ │ │ │ -189 │ │ │ │ │ -190private: │ │ │ │ │ -191 std::size_t size_; │ │ │ │ │ -192 Child child_; │ │ │ │ │ -193}; │ │ │ │ │ -194 │ │ │ │ │ -_1_9_6using _F_l_a_t_V_e_c_t_o_r = _U_n_i_f_o_r_m_V_e_c_t_o_r_<_V_a_l_u_e_>; │ │ │ │ │ -197 │ │ │ │ │ -199template │ │ │ │ │ -_2_0_0auto _m_a_k_e_U_n_i_f_o_r_m_D_e_s_c_r_i_p_t_o_r (std::size_t n, Child child) │ │ │ │ │ -201{ │ │ │ │ │ -202 return _U_n_i_f_o_r_m_V_e_c_t_o_r_<_C_h_i_l_d_>{n,std::move(child)}; │ │ │ │ │ -203} │ │ │ │ │ -204 │ │ │ │ │ -205namespace Impl { │ │ │ │ │ -206 │ │ │ │ │ -207template │ │ │ │ │ -208struct TreeTransform │ │ │ │ │ -209{ │ │ │ │ │ -210 TreeTransform (const InnerFunc& innerFunc, const LeafFunc& leafFunc) │ │ │ │ │ -211 : innerFunc_(innerFunc) │ │ │ │ │ -212 , leafFunc_(leafFunc) │ │ │ │ │ -213 {} │ │ │ │ │ -214 │ │ │ │ │ -215 Unknown operator() (const Unknown& tree) const │ │ │ │ │ -216 { │ │ │ │ │ -217 return tree; │ │ │ │ │ -218 } │ │ │ │ │ +187 │ │ │ │ │ +_1_8_8 class _L_e_a_f_B_a_s_i_s_N_o_d_e : │ │ │ │ │ +189 public _B_a_s_i_s_N_o_d_e_M_i_x_i_n, │ │ │ │ │ +190 public TypeTree::LeafNode │ │ │ │ │ +191 {}; │ │ │ │ │ +192 │ │ │ │ │ +193 │ │ │ │ │ +194 template │ │ │ │ │ +_1_9_5 class _P_o_w_e_r_B_a_s_i_s_N_o_d_e : │ │ │ │ │ +196 public _B_a_s_i_s_N_o_d_e_M_i_x_i_n, │ │ │ │ │ +197 public TypeTree::PowerNode │ │ │ │ │ +198 { │ │ │ │ │ +199 │ │ │ │ │ +200 using Node = TypeTree::PowerNode; │ │ │ │ │ +201 │ │ │ │ │ +202 public: │ │ │ │ │ +203 │ │ │ │ │ +_2_0_4 using _E_l_e_m_e_n_t = typename T::Element; │ │ │ │ │ +205 │ │ │ │ │ +_2_0_6 _P_o_w_e_r_B_a_s_i_s_N_o_d_e() = default; │ │ │ │ │ +207 │ │ │ │ │ +_2_0_8 _P_o_w_e_r_B_a_s_i_s_N_o_d_e(const typename Node::NodeStorage& children) : │ │ │ │ │ +209 Node(children) │ │ │ │ │ +210 {} │ │ │ │ │ +211 │ │ │ │ │ +_2_1_2 const _E_l_e_m_e_n_t& _e_l_e_m_e_n_t() const │ │ │ │ │ +213 { │ │ │ │ │ +214 return this->child(Dune::Indices::_0).element(); │ │ │ │ │ +215 } │ │ │ │ │ +216 │ │ │ │ │ +217 }; │ │ │ │ │ +218 │ │ │ │ │ 219 │ │ │ │ │ -220 auto operator() (const Value& tree) const │ │ │ │ │ -221 { │ │ │ │ │ -222 return leafFunc_(tree); │ │ │ │ │ -223 } │ │ │ │ │ -224 │ │ │ │ │ -225 template │ │ │ │ │ -226 auto operator() (const Tuple& tree) const │ │ │ │ │ -227 { │ │ │ │ │ -228 return unpackIntegerSequence([&](auto... ii) { │ │ │ │ │ -229 return _m_a_k_e_D_e_s_c_r_i_p_t_o_r(innerFunc_(tree[ii])...); │ │ │ │ │ -230 }, std::make_index_sequence()); │ │ │ │ │ -231 } │ │ │ │ │ -232 │ │ │ │ │ -233 template │ │ │ │ │ -234 auto operator() (const Array& tree) const │ │ │ │ │ -235 { │ │ │ │ │ -236 return unpackIntegerSequence([&](auto... ii) { │ │ │ │ │ -237 return _m_a_k_e_D_e_s_c_r_i_p_t_o_r(innerFunc_(tree[ii])...); │ │ │ │ │ -238 }, std::make_index_sequence()); │ │ │ │ │ -239 } │ │ │ │ │ -240 │ │ │ │ │ -241 template │ │ │ │ │ -242 auto operator() (const Vector& tree) const │ │ │ │ │ -243 { │ │ │ │ │ -244 using W = decltype(innerFunc_(tree[0])); │ │ │ │ │ -245 Vector result; │ │ │ │ │ -246 result.reserve(tree.size()); │ │ │ │ │ -247 for (std::size_t i = 0; i < tree.size(); ++i) │ │ │ │ │ -248 result.emplace_back(innerFunc_(tree[i])); │ │ │ │ │ -249 return result; │ │ │ │ │ -250 } │ │ │ │ │ -251 │ │ │ │ │ -252 template │ │ │ │ │ -253 auto operator() (const UniformArray& tree) const │ │ │ │ │ -254 { │ │ │ │ │ -255 return _m_a_k_e_U_n_i_f_o_r_m_D_e_s_c_r_i_p_t_o_r(Dune::index_constant{}, innerFunc_(tree │ │ │ │ │ -[0])); │ │ │ │ │ -256 } │ │ │ │ │ +220 template │ │ │ │ │ +_2_2_1 class _D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e : │ │ │ │ │ +222 public _B_a_s_i_s_N_o_d_e_M_i_x_i_n, │ │ │ │ │ +223 public TypeTree::DynamicPowerNode │ │ │ │ │ +224 { │ │ │ │ │ +225 │ │ │ │ │ +226 using Node = TypeTree::DynamicPowerNode; │ │ │ │ │ +227 │ │ │ │ │ +228 public: │ │ │ │ │ +229 │ │ │ │ │ +_2_3_0 using _E_l_e_m_e_n_t = typename T::Element; │ │ │ │ │ +231 │ │ │ │ │ +_2_3_2 _D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e (std::size_t children) │ │ │ │ │ +233 : Node(children) │ │ │ │ │ +234 {} │ │ │ │ │ +235 │ │ │ │ │ +_2_3_6 _D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e (typename Node::NodeStorage children) │ │ │ │ │ +237 : Node(std::move(children)) │ │ │ │ │ +238 {} │ │ │ │ │ +239 │ │ │ │ │ +_2_4_0 const _E_l_e_m_e_n_t& _e_l_e_m_e_n_t() const │ │ │ │ │ +241 { │ │ │ │ │ +242 return this->child(0).element(); │ │ │ │ │ +243 } │ │ │ │ │ +244 │ │ │ │ │ +245 }; │ │ │ │ │ +246 │ │ │ │ │ +247 │ │ │ │ │ +248 template │ │ │ │ │ +_2_4_9 class _C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e : │ │ │ │ │ +250 public _B_a_s_i_s_N_o_d_e_M_i_x_i_n, │ │ │ │ │ +251 public TypeTree::CompositeNode │ │ │ │ │ +252 { │ │ │ │ │ +253 │ │ │ │ │ +254 using Node = TypeTree::CompositeNode; │ │ │ │ │ +255 │ │ │ │ │ +256 public: │ │ │ │ │ 257 │ │ │ │ │ -258 template │ │ │ │ │ -259 auto operator() (const UniformVector& tree) const │ │ │ │ │ -260 { │ │ │ │ │ -261 return _m_a_k_e_U_n_i_f_o_r_m_D_e_s_c_r_i_p_t_o_r(tree.size(), innerFunc_(tree[0])); │ │ │ │ │ -262 } │ │ │ │ │ -263 │ │ │ │ │ -264private: │ │ │ │ │ -265 InnerFunc innerFunc_; │ │ │ │ │ -266 LeafFunc leafFunc_; │ │ │ │ │ -267}; │ │ │ │ │ -268 │ │ │ │ │ -269 │ │ │ │ │ -280template │ │ │ │ │ -281auto appendToTree (Size s, const T& tree) │ │ │ │ │ -282{ │ │ │ │ │ -283 auto transform = TreeTransform( │ │ │ │ │ -284 [s](auto&& node) { return appendToTree(s, node); }, │ │ │ │ │ -285 [s](auto&& node) { return _m_a_k_e_U_n_i_f_o_r_m_D_e_s_c_r_i_p_t_o_r(s, node); }); │ │ │ │ │ -286 return transform(tree); │ │ │ │ │ -287} │ │ │ │ │ -288 │ │ │ │ │ -289} // end namespace Impl │ │ │ │ │ -290} // end namespace ContainerDescriptors │ │ │ │ │ -291} // end namespace Dune::Functions │ │ │ │ │ -292 │ │ │ │ │ -293#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_CONTAINERDESCRIPTORS_HH │ │ │ │ │ -_t_y_p_e___t_r_a_i_t_s_._h_h │ │ │ │ │ -_b_a_s_i_s_t_a_g_s_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │ -DDeeffiinniittiioonn polynomial.hh:18 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -auto containerDescriptor(const PreBasis &preBasis) │ │ │ │ │ -Return the container descriptor of the pre-basis, if defined, otherwise │ │ │ │ │ -ContainerDescriptor::Unknown. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_A_r_r_a_y │ │ │ │ │ -std::array< Child, n > Array │ │ │ │ │ -Descriptor for arrays with all children of the same type and static size. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:110 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_m_a_k_e_U_n_i_f_o_r_m_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -auto makeUniformDescriptor(std::integral_constant< std::size_t, n >, Child │ │ │ │ │ -child) │ │ │ │ │ -Generate a uniform descriptor in case the size is a static constant. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:159 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_T_u_p_l_e │ │ │ │ │ -Dune::TupleVector< Children... > Tuple │ │ │ │ │ -Descriptor with all children of possibly different type. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:94 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_m_a_k_e_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -auto makeDescriptor(Child0 child, Children... children) │ │ │ │ │ -Generate a descriptor in case the children are all of the same type. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:115 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_V_e_c_t_o_r │ │ │ │ │ -std::vector< Child > Vector │ │ │ │ │ -Descriptor for vectors with all children of the same type and dynamic size. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:124 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_k_n_o_w_n │ │ │ │ │ -Fallback container descriptor if nothing else fits. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:50 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_V_a_l_u_e │ │ │ │ │ -The node in the descriptor tree representing a value placeholder. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:83 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_V_a_l_u_e_:_:_s_i_z_e │ │ │ │ │ -static constexpr std::size_t size() │ │ │ │ │ -A value placeholder does not have any sub-descriptors, thus its size is zero. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:89 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_V_a_l_u_e_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -Value operator[](const Index &) const │ │ │ │ │ -The child access method is only available for the interface, but should not be │ │ │ │ │ -called. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:86 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_A_r_r_a_y │ │ │ │ │ -Descriptor for arrays with all children identical and the number of children a │ │ │ │ │ -static size. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:129 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_A_r_r_a_y_:_:_s_i_z_e │ │ │ │ │ -static constexpr std::size_t size() │ │ │ │ │ -The static size information, i.e., number of children. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:147 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_A_r_r_a_y_:_:_U_n_i_f_o_r_m_A_r_r_a_y │ │ │ │ │ -UniformArray() │ │ │ │ │ -Default constructor. Is enable if the child-type is default constructible. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:133 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_A_r_r_a_y_:_:_U_n_i_f_o_r_m_A_r_r_a_y │ │ │ │ │ -UniformArray(Child child) │ │ │ │ │ -Constructor that stores a single child only. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:138 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_A_r_r_a_y_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -const Child & operator[](const Index &) const │ │ │ │ │ -Access the i'th child that is always the same, i.e., child_. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:144 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_V_e_c_t_o_r │ │ │ │ │ -Uniform descriptor with dynamic size. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:168 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_V_e_c_t_o_r_:_:_U_n_i_f_o_r_m_V_e_c_t_o_r │ │ │ │ │ -UniformVector(std::size_t size, Child child) │ │ │ │ │ -Constructor that stores the size and a single child only. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:178 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_V_e_c_t_o_r_:_:_s_i_z_e │ │ │ │ │ -std::size_t size() const │ │ │ │ │ -The dynamic size information, i.e., number of children. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:188 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_V_e_c_t_o_r_:_:_U_n_i_f_o_r_m_V_e_c_t_o_r │ │ │ │ │ -UniformVector(std::size_t size) │ │ │ │ │ -Default constructor with size. Is enable if the child-type is default │ │ │ │ │ -constructible. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:172 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_V_e_c_t_o_r_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ │ -const Child & operator[](const Index &) const │ │ │ │ │ -Access the i'th child that is always the same, i.e., child_. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:185 │ │ │ │ │ +_2_5_8 using _E_l_e_m_e_n_t = typename Node::template Child<0>::Type::Element; │ │ │ │ │ +259 │ │ │ │ │ +_2_6_0 _C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e() = default; │ │ │ │ │ +261 │ │ │ │ │ +_2_6_2 _C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e(const typename Node::NodeStorage& children) : │ │ │ │ │ +263 Node(children) │ │ │ │ │ +264 {} │ │ │ │ │ +265 │ │ │ │ │ +266 template │ │ │ │ │ +_2_6_7 _C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e(const std::shared_ptr&... children) : │ │ │ │ │ +268 Node(children...) │ │ │ │ │ +269 {} │ │ │ │ │ +270 │ │ │ │ │ +_2_7_1 const _E_l_e_m_e_n_t& _e_l_e_m_e_n_t() const │ │ │ │ │ +272 { │ │ │ │ │ +273 return this->child(Dune::Indices::_0).element(); │ │ │ │ │ +274 } │ │ │ │ │ +275 │ │ │ │ │ +276 }; │ │ │ │ │ +277 │ │ │ │ │ +278 │ │ │ │ │ +279 template │ │ │ │ │ +_2_8_0 void _c_l_e_a_r_S_i_z_e(Tree& tree, std::size_t offset) │ │ │ │ │ +281 { │ │ │ │ │ +282 TypeTree::applyToTree(tree,Impl::ClearSizeVisitor(offset)); │ │ │ │ │ +283 } │ │ │ │ │ +284 │ │ │ │ │ +285 template │ │ │ │ │ +_2_8_6 void _b_i_n_d_T_r_e_e(Tree& tree, const Entity& entity, std::size_t offset = 0) │ │ │ │ │ +287 { │ │ │ │ │ +288 Impl::BindVisitor visitor(entity,offset); │ │ │ │ │ +289 TypeTree::applyToTree(tree,visitor); │ │ │ │ │ +290 } │ │ │ │ │ +291 │ │ │ │ │ +292 template │ │ │ │ │ +_2_9_3 void _i_n_i_t_i_a_l_i_z_e_T_r_e_e(Tree& tree, std::size_t treeIndexOffset = 0) │ │ │ │ │ +294 { │ │ │ │ │ +295 Impl::InitializeTreeVisitor visitor(treeIndexOffset); │ │ │ │ │ +296 TypeTree::applyToTree(tree,visitor); │ │ │ │ │ +297 } │ │ │ │ │ +298 │ │ │ │ │ +299 │ │ │ │ │ +300 } // namespace Functions │ │ │ │ │ +301 │ │ │ │ │ +302} // namespace Dune │ │ │ │ │ +303 │ │ │ │ │ +304#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH │ │ │ │ │ +_D_u_n_e │ │ │ │ │ +DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_l_e_a_r_S_i_z_e │ │ │ │ │ +void clearSize(Tree &tree, std::size_t offset) │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:280 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_b_i_n_d_T_r_e_e │ │ │ │ │ +void bindTree(Tree &tree, const Entity &entity, std::size_t offset=0) │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:286 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_n_i_t_i_a_l_i_z_e_T_r_e_e │ │ │ │ │ +void initializeTree(Tree &tree, std::size_t treeIndexOffset=0) │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:293 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:122 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_t_r_e_e_I_n_d_e_x │ │ │ │ │ +size_type treeIndex() const │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:152 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_l_o_c_a_l_I_n_d_e_x │ │ │ │ │ +size_type localIndex(size_type i) const │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:141 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_o_f_f_s_e_t │ │ │ │ │ +size_type offset() const │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:159 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_i_z_e │ │ │ │ │ +size_type size() const │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:147 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_e_t_O_f_f_s_e_t │ │ │ │ │ +void setOffset(const size_type offset) │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:164 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:133 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n │ │ │ │ │ +BasisNodeMixin() │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:135 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_e_t_S_i_z_e │ │ │ │ │ +void setSize(const size_type size) │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:169 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_e_t_T_r_e_e_I_n_d_e_x │ │ │ │ │ +void setTreeIndex(size_type treeIndex) │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:174 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:191 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_B_a_s_i_s_N_o_d_e │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:198 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_B_a_s_i_s_N_o_d_e_:_:_e_l_e_m_e_n_t │ │ │ │ │ +const Element & element() const │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:212 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_B_a_s_i_s_N_o_d_e_:_:_E_l_e_m_e_n_t │ │ │ │ │ +typename T::Element Element │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:204 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_B_a_s_i_s_N_o_d_e_:_:_P_o_w_e_r_B_a_s_i_s_N_o_d_e │ │ │ │ │ +PowerBasisNode(const typename Node::NodeStorage &children) │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:208 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_B_a_s_i_s_N_o_d_e_:_:_P_o_w_e_r_B_a_s_i_s_N_o_d_e │ │ │ │ │ +PowerBasisNode()=default │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:224 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e_:_:_e_l_e_m_e_n_t │ │ │ │ │ +const Element & element() const │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:240 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e_:_:_D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e │ │ │ │ │ +DynamicPowerBasisNode(typename Node::NodeStorage children) │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:236 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e_:_:_D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e │ │ │ │ │ +DynamicPowerBasisNode(std::size_t children) │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:232 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e_:_:_E_l_e_m_e_n_t │ │ │ │ │ +typename T::Element Element │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:230 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:252 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e_:_:_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e │ │ │ │ │ +CompositeBasisNode()=default │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e_:_:_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e │ │ │ │ │ +CompositeBasisNode(const typename Node::NodeStorage &children) │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:262 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e_:_:_e_l_e_m_e_n_t │ │ │ │ │ +const Element & element() const │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:271 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e_:_:_E_l_e_m_e_n_t │ │ │ │ │ +typename Node::template Child< 0 >::Type::Element Element │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:258 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e_:_:_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e │ │ │ │ │ +CompositeBasisNode(const std::shared_ptr< Children > &... children) │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:267 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00164.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: interpolate.hh File Reference │ │ │ │ +dune-functions: boundarydofs.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -72,53 +72,35 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
interpolate.hh File Reference
│ │ │ │ +
boundarydofs.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <memory>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/common/bitsetvector.hh>
│ │ │ │ -#include <dune/common/referencehelper.hh>
│ │ │ │ -#include <dune/typetree/traversal.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/flatvectorview.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/hierarchicnodetorangemap.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 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.
 
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.
 
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.
 
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.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -2,43 +2,25 @@ │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -interpolate.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_v_i_e_w_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_b_a_c_k_e_n_d_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_b_a_c_k_e_n_d_s_/_i_s_t_l_v_e_c_t_o_r_b_a_c_k_e_n_d_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_f_l_a_t_v_e_c_t_o_r_v_i_e_w_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_h_i_e_r_a_r_c_h_i_c_n_o_d_e_t_o_r_a_n_g_e_m_a_p_._h_h> │ │ │ │ │ +boundarydofs.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_s_u_b_e_n_t_i_t_y_d_o_f_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_n_t_e_r_p_o_l_a_t_e (const B &basis, C &&coeff, const F &f, │ │ │ │ │ - const BV &bv, const NTRE &nodeToRangeEntry) │ │ │ │ │ -  Interpolate given function in discrete function space. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_n_t_e_r_p_o_l_a_t_e (const B &basis, C &&coeff, const F &f, │ │ │ │ │ - const BV &bitVector) │ │ │ │ │ -  Interpolate given function in discrete function space. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_n_t_e_r_p_o_l_a_t_e (const B &basis, C &&coeff, const F &f) │ │ │ │ │ -  Interpolate given function in discrete function space. │ │ │ │ │ +template >() │ │ │ │ │ +(0, std::declval< typename Basis::LocalView >(), std::declval< typename │ │ │ │ │ +Basis::GridView::Intersection >()), 0) = 0> │ │ │ │ │ +void  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_o_r_E_a_c_h_B_o_u_n_d_a_r_y_D_O_F (const Basis &basis, F &&f) │ │ │ │ │ +  Loop over all DOFs on the boundary. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00164_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: interpolate.hh Source File │ │ │ │ +dune-functions: boundarydofs.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,294 +74,105 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
interpolate.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_INTERPOLATE_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_INTERPOLATE_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BOUNDARYDOFS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BOUNDARYDOFS_HH
│ │ │ │
9
│ │ │ │ -
10#include <memory>
│ │ │ │ -
11#include <vector>
│ │ │ │ -
12
│ │ │ │ -
13#include <dune/common/exceptions.hh>
│ │ │ │ -
14#include <dune/common/bitsetvector.hh>
│ │ │ │ -
15#include <dune/common/referencehelper.hh>
│ │ │ │ +
10#include <utility>
│ │ │ │ +
11
│ │ │ │ + │ │ │ │ +
13
│ │ │ │ +
14namespace Dune {
│ │ │ │ +
15namespace Functions {
│ │ │ │
16
│ │ │ │ -
17#include <dune/typetree/traversal.hh>
│ │ │ │ +
17
│ │ │ │
18
│ │ │ │ - │ │ │ │ - │ │ │ │ -
21
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
26
│ │ │ │ -
27namespace Dune {
│ │ │ │ -
28namespace Functions {
│ │ │ │ -
29
│ │ │ │ -
30namespace Imp {
│ │ │ │ -
31
│ │ │ │ -
32struct AllTrueBitSetVector
│ │ │ │ -
33{
│ │ │ │ -
34 struct AllTrueBitSet
│ │ │ │ -
35 {
│ │ │ │ -
36 bool test(int) const { return true; }
│ │ │ │ -
37 } allTrue_;
│ │ │ │ -
38
│ │ │ │ -
39 operator bool() const
│ │ │ │ -
40 {
│ │ │ │ -
41 return true;
│ │ │ │ -
42 }
│ │ │ │ -
43
│ │ │ │ -
44 template<class I>
│ │ │ │ -
45 const AllTrueBitSetVector& operator[](const I&) const
│ │ │ │ -
46 {
│ │ │ │ -
47 return *this;
│ │ │ │ -
48 }
│ │ │ │ -
49
│ │ │ │ -
50 template<class SP>
│ │ │ │ -
51 void resize(const SP&) const
│ │ │ │ -
52 {}
│ │ │ │ -
53
│ │ │ │ -
54};
│ │ │ │ +
38template<class Basis, class F,
│ │ │ │ +
39 decltype(std::declval<std::decay_t<F>>()(0, std::declval<typename Basis::LocalView>(),std::declval<typename Basis::GridView::Intersection>()), 0) = 0>
│ │ │ │ +
│ │ │ │ +
40void forEachBoundaryDOF(const Basis& basis, F&& f)
│ │ │ │ +
41{
│ │ │ │ +
42 auto localView = basis.localView();
│ │ │ │ +
43 auto seDOFs = subEntityDOFs(basis);
│ │ │ │ +
44 const auto& gridView = basis.gridView();
│ │ │ │ +
45 for(auto&& element : elements(gridView))
│ │ │ │ +
46 if (element.hasBoundaryIntersections())
│ │ │ │ +
47 {
│ │ │ │ +
48 localView.bind(element);
│ │ │ │ +
49 for(const auto& intersection: intersections(gridView, element))
│ │ │ │ +
50 if (intersection.boundary())
│ │ │ │ +
51 for(auto localIndex: seDOFs.bind(localView,intersection))
│ │ │ │ +
52 f(localIndex, localView, intersection);
│ │ │ │ +
53 }
│ │ │ │ +
54}
│ │ │ │ +
│ │ │ │
55
│ │ │ │
56
│ │ │ │
57
│ │ │ │ -
58// This helper function implements the restriction of some given function of type F.
│ │ │ │ -
59// The restriction is a simple callback that is applied to the values of the
│ │ │ │ -
60// function and the values of its derivative.
│ │ │ │ -
61template<class F, class Restriction>
│ │ │ │ -
62class ComponentFunction
│ │ │ │ -
63{
│ │ │ │ -
64public:
│ │ │ │ -
65
│ │ │ │ -
66 ComponentFunction(F f, Restriction restriction) :
│ │ │ │ -
67 f_(std::move(f)),
│ │ │ │ -
68 restriction_(std::move(restriction))
│ │ │ │ -
69 {}
│ │ │ │ -
70
│ │ │ │ -
71 template<class Domain>
│ │ │ │ -
72 auto operator()(const Domain& x) const
│ │ │ │ -
73 {
│ │ │ │ -
74 return restriction_(f_(x));
│ │ │ │ -
75 }
│ │ │ │ -
76
│ │ │ │ -
77 friend auto derivative(const ComponentFunction& cf)
│ │ │ │ -
78 {
│ │ │ │ -
79 // This provides support for capturing the derivative of the function by reference
│ │ │ │ -
80 // using forwardCapture for perfect forwarding capture. If the function caches its
│ │ │ │ -
81 // derivative, this saves a potentially costly copy.
│ │ │ │ -
82 auto&& df = derivative(Dune::resolveRef(cf.f_));
│ │ │ │ -
83 return [&, df=forwardCapture(std::forward<decltype(df)>(df))](auto&& x) {
│ │ │ │ -
84 return cf.restriction_(df.forward()(x));
│ │ │ │ -
85 };
│ │ │ │ -
86 }
│ │ │ │ -
87
│ │ │ │ -
88private:
│ │ │ │ -
89 F f_;
│ │ │ │ -
90 Restriction restriction_;
│ │ │ │ -
91};
│ │ │ │ +
75template<class Basis, class F,
│ │ │ │ +
76 decltype(std::declval<std::decay_t<F>>()(0, std::declval<typename Basis::LocalView>()),0) = 0>
│ │ │ │ +
77void forEachBoundaryDOF(const Basis& basis, F&& f)
│ │ │ │ +
78{
│ │ │ │ +
79 auto localView = basis.localView();
│ │ │ │ +
80 auto seDOFs = subEntityDOFs(basis);
│ │ │ │ +
81 const auto& gridView = basis.gridView();
│ │ │ │ +
82 for(auto&& element : elements(gridView))
│ │ │ │ +
83 if (element.hasBoundaryIntersections())
│ │ │ │ +
84 {
│ │ │ │ +
85 localView.bind(element);
│ │ │ │ +
86 for(const auto& intersection: intersections(gridView, element))
│ │ │ │ +
87 if (intersection.boundary())
│ │ │ │ +
88 for(auto localIndex: seDOFs.bind(localView,intersection))
│ │ │ │ +
89 f(localIndex, localView);
│ │ │ │ +
90 }
│ │ │ │ +
91}
│ │ │ │
92
│ │ │ │
93
│ │ │ │
94
│ │ │ │ -
95
│ │ │ │ -
96// This helper function implements caching of the derivative for local functions.
│ │ │ │ -
97// When using an algorithm that gets a LocalFunction and calls its derivative
│ │ │ │ -
98// on each element, this leads to a costly call of derivative(f). E.g. for a
│ │ │ │ -
99// DiscreteGlobalBasisFunction, this will allocate several buffer.
│ │ │ │ -
100// To avoid this, this helper function caches the derivative and hands
│ │ │ │ -
101// out the cached derivative by reference. To ensure that the handed out
│ │ │ │ -
102// derivative is appropriately bound, binding the function will automatically
│ │ │ │ -
103// bind the cached derivative.
│ │ │ │ -
104//
│ │ │ │ -
105// Notice that we cannot simply create the derivative in the constructor,
│ │ │ │ -
106// because this may throw for functions that do not implement the derivative.
│ │ │ │ -
107template<class F>
│ │ │ │ -
108class CachedDerivativeLocalFunction
│ │ │ │ -
109{
│ │ │ │ -
110 using Derivative = std::decay_t<decltype(derivative(Dune::resolveRef(std::declval<const F&>())))>;
│ │ │ │ -
111
│ │ │ │ -
112public:
│ │ │ │ -
113
│ │ │ │ -
114 CachedDerivativeLocalFunction(F f) :
│ │ │ │ -
115 f_(f)
│ │ │ │ -
116 {}
│ │ │ │ -
117
│ │ │ │ -
118 template<class Element>
│ │ │ │ -
119 void bind(const Element& element)
│ │ │ │ -
120 {
│ │ │ │ -
121 Dune::resolveRef(f_).bind(element);
│ │ │ │ -
122 if (derivative_)
│ │ │ │ -
123 derivative_.value().bind(element);
│ │ │ │ -
124 }
│ │ │ │ -
125
│ │ │ │ -
126 template<class X>
│ │ │ │ -
127 auto operator()(const X& x) const
│ │ │ │ -
128 {
│ │ │ │ -
129 return f_(x);
│ │ │ │ -
130 }
│ │ │ │ -
131
│ │ │ │ -
132 friend const Derivative& derivative(const CachedDerivativeLocalFunction& cdlf)
│ │ │ │ -
133 {
│ │ │ │ -
134 if (not cdlf.derivative_)
│ │ │ │ -
135 {
│ │ │ │ -
136 auto&& lf = Dune::resolveRef(cdlf.f_);
│ │ │ │ -
137 cdlf.derivative_ = derivative(lf);
│ │ │ │ -
138 if (lf.bound())
│ │ │ │ -
139 cdlf.derivative_.value().bind(lf.localContext());
│ │ │ │ -
140 }
│ │ │ │ -
141 return cdlf.derivative_.value();
│ │ │ │ -
142 }
│ │ │ │ -
143
│ │ │ │ -
144private:
│ │ │ │ -
145 F f_;
│ │ │ │ -
146 mutable std::optional<Derivative> derivative_;
│ │ │ │ -
147};
│ │ │ │ -
148
│ │ │ │ -
149
│ │ │ │ -
150
│ │ │ │ -
151template<class VectorBackend, class BitVectorBackend, class LocalFunction, class LocalView, class NodeToRangeEntry>
│ │ │ │ -
152void interpolateLocal(VectorBackend& vector, const BitVectorBackend& bitVector, const LocalFunction& localF, const LocalView& localView, const NodeToRangeEntry& nodeToRangeEntry)
│ │ │ │ -
153{
│ │ │ │ -
154 Dune::TypeTree::forEachLeafNode(localView.tree(), [&](auto&& node, auto&& treePath) {
│ │ │ │ -
155 using Node = std::decay_t<decltype(node)>;
│ │ │ │ -
156 using FiniteElement = typename Node::FiniteElement;
│ │ │ │ -
157 using FiniteElementRangeField = typename FiniteElement::Traits::LocalBasisType::Traits::RangeFieldType;
│ │ │ │ -
158
│ │ │ │ -
159 auto interpolationCoefficients = std::vector<FiniteElementRangeField>();
│ │ │ │ -
160 auto&& fe = node.finiteElement();
│ │ │ │ -
161 auto localF_RE = ComponentFunction(std::cref(localF), [&](auto&& y) { return nodeToRangeEntry(node, treePath, y); });
│ │ │ │ -
162
│ │ │ │ -
163 fe.localInterpolation().interpolate(localF_RE, interpolationCoefficients);
│ │ │ │ -
164 for (size_t i=0; i<fe.localBasis().size(); ++i)
│ │ │ │ -
165 {
│ │ │ │ -
166 auto multiIndex = localView.index(node.localIndex(i));
│ │ │ │ -
167 if ( bitVector[multiIndex] )
│ │ │ │ -
168 vector[multiIndex] = interpolationCoefficients[i];
│ │ │ │ -
169 }
│ │ │ │ -
170 });
│ │ │ │ -
171}
│ │ │ │ -
172
│ │ │ │ -
173
│ │ │ │ -
174struct HasDerivative
│ │ │ │ -
175{
│ │ │ │ -
176 template<class F>
│ │ │ │ -
177 auto require(F&& f) -> decltype(derivative(f));
│ │ │ │ -
178};
│ │ │ │ -
179
│ │ │ │ -
180} // namespace Imp
│ │ │ │ -
181
│ │ │ │ -
182
│ │ │ │ -
183
│ │ │ │ -
184
│ │ │ │ -
202template <class B, class C, class F, class BV, class NTRE>
│ │ │ │ -
│ │ │ │ -
203void interpolate(const B& basis, C&& coeff, const F& f, const BV& bv, const NTRE& nodeToRangeEntry)
│ │ │ │ -
204{
│ │ │ │ -
205 using GridView = typename B::GridView;
│ │ │ │ -
206 using Element = typename GridView::template Codim<0>::Entity;
│ │ │ │ -
207 using GlobalDomain = typename Element::Geometry::GlobalCoordinate;
│ │ │ │ -
208
│ │ │ │ -
209 static_assert(Dune::Functions::Concept::isCallable<F, GlobalDomain>(), "Function passed to interpolate does not model the Callable<GlobalCoordinate> concept");
│ │ │ │ -
210
│ │ │ │ -
211 auto&& gridView = basis.gridView();
│ │ │ │ -
212
│ │ │ │ -
213 // Small helper functions to wrap vectors using istlVectorBackend
│ │ │ │ -
214 // if they do not already satisfy the VectorBackend interface.
│ │ │ │ -
215 auto toVectorBackend = [&](auto& v) -> decltype(auto) {
│ │ │ │ -
216 if constexpr (models<Concept::VectorBackend<B>, decltype(v)>()) {
│ │ │ │ -
217 return v;
│ │ │ │ -
218 } else {
│ │ │ │ -
219 return istlVectorBackend(v);
│ │ │ │ -
220 }
│ │ │ │ -
221 };
│ │ │ │ -
222
│ │ │ │ -
223 auto toConstVectorBackend = [&](auto& v) -> decltype(auto) {
│ │ │ │ -
224 if constexpr (models<Concept::ConstVectorBackend<B>, decltype(v)>()) {
│ │ │ │ -
225 return v;
│ │ │ │ -
226 } else {
│ │ │ │ -
227 return istlVectorBackend(v);
│ │ │ │ -
228 }
│ │ │ │ -
229 };
│ │ │ │ -
230
│ │ │ │ -
231 auto&& bitVector = toConstVectorBackend(bv);
│ │ │ │ -
232 auto&& vector = toVectorBackend(coeff);
│ │ │ │ -
233 vector.resize(basis);
│ │ │ │ -
234
│ │ │ │ -
235 // Make a grid function supporting local evaluation out of f
│ │ │ │ -
236 auto gf = makeGridViewFunction(f, gridView);
│ │ │ │ -
237
│ │ │ │ -
238 // Obtain a local view of f
│ │ │ │ -
239 // To avoid costly reconstruction of the derivative on each element,
│ │ │ │ -
240 // we use the CachedDerivativeLocalFunction wrapper if the function
│ │ │ │ -
241 // is differentiable. This wrapper will handout
│ │ │ │ -
242 // a reference to a single cached derivative object.
│ │ │ │ -
243 auto localF = [&](){
│ │ │ │ -
244 if constexpr (models<Imp::HasDerivative, decltype(localFunction(gf))>())
│ │ │ │ -
245 return Imp::CachedDerivativeLocalFunction(localFunction(gf));
│ │ │ │ -
246 else
│ │ │ │ -
247 return localFunction(gf);
│ │ │ │ -
248 }();
│ │ │ │ -
249
│ │ │ │ -
250 auto localView = basis.localView();
│ │ │ │ -
251
│ │ │ │ -
252 for (const auto& e : elements(gridView))
│ │ │ │ -
253 {
│ │ │ │ -
254 localView.bind(e);
│ │ │ │ -
255 localF.bind(e);
│ │ │ │ -
256 Imp::interpolateLocal(vector, bitVector, localF, localView, nodeToRangeEntry);
│ │ │ │ -
257 }
│ │ │ │ -
258}
│ │ │ │ -
│ │ │ │ -
259
│ │ │ │ -
276template <class B, class C, class F, class BV>
│ │ │ │ -
│ │ │ │ -
277void interpolate(const B& basis, C&& coeff, const F& f, const BV& bitVector)
│ │ │ │ -
278{
│ │ │ │ -
279 interpolate(basis, coeff, f, bitVector, HierarchicNodeToRangeMap());
│ │ │ │ -
280}
│ │ │ │ -
│ │ │ │ -
281
│ │ │ │ -
296template <class B, class C, class F>
│ │ │ │ -
│ │ │ │ -
297void interpolate(const B& basis, C&& coeff, const F& f)
│ │ │ │ -
298{
│ │ │ │ -
299 interpolate (basis, coeff, f, Imp::AllTrueBitSetVector(), HierarchicNodeToRangeMap());
│ │ │ │ -
300}
│ │ │ │ -
│ │ │ │ -
301
│ │ │ │ -
302} // namespace Functions
│ │ │ │ -
303} // namespace Dune
│ │ │ │ -
304
│ │ │ │ -
305#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_INTERPOLATE_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const TrigonometricFunction< K, sinFactor, cosFactor > &f)
Obtain derivative of TrigonometricFunction function.
Definition trigonometricfunction.hh:43
│ │ │ │ -
auto istlVectorBackend(Vector &v)
Return a vector backend wrapping non-const ISTL like containers.
Definition istlvectorbackend.hh:350
│ │ │ │ +
111template<class Basis, class F,
│ │ │ │ +
112 decltype(std::declval<std::decay_t<F>>()(std::declval<typename Basis::MultiIndex>()),0) = 0>
│ │ │ │ +
113void forEachBoundaryDOF(const Basis& basis, F&& f)
│ │ │ │ +
114{
│ │ │ │ +
115 auto localView = basis.localView();
│ │ │ │ +
116 auto seDOFs = subEntityDOFs(basis);
│ │ │ │ +
117 const auto& gridView = basis.gridView();
│ │ │ │ +
118 for(auto&& element : elements(gridView))
│ │ │ │ +
119 if (element.hasBoundaryIntersections())
│ │ │ │ +
120 {
│ │ │ │ +
121 localView.bind(element);
│ │ │ │ +
122 for(const auto& intersection: intersections(gridView, element))
│ │ │ │ +
123 if (intersection.boundary())
│ │ │ │ +
124 for(auto localIndex: seDOFs.bind(localView,intersection))
│ │ │ │ +
125 f(localView.index(localIndex));
│ │ │ │ +
126 }
│ │ │ │ +
127}
│ │ │ │ +
128
│ │ │ │ +
129
│ │ │ │ +
130
│ │ │ │ +
131} // namespace Functions
│ │ │ │ +
132} // namespace Dune
│ │ │ │ +
133
│ │ │ │ +
134#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BOUNDARYDOFS_HH
│ │ │ │ + │ │ │ │ +
auto subEntityDOFs(const T &)
Create SubEntityDOFs object.
Definition subentitydofs.hh:164
│ │ │ │ +
void forEachBoundaryDOF(const Basis &basis, F &&f)
Loop over all DOFs on the boundary.
Definition boundarydofs.hh:40
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
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:203
│ │ │ │ -
std::decay_t< F > makeGridViewFunction(F &&f, const GridView &gridView)
Construct a function modeling GridViewFunction from function and grid view.
Definition gridviewfunction.hh:72
│ │ │ │ -
auto forwardCapture(T &&t)
Create a capture object for perfect forwarding.
Definition utility.hh:376
│ │ │ │ -
A simple node to range map using the nested tree indices.
Definition hierarchicnodetorangemap.hh:34
│ │ │ │ - │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,323 +1,109 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -interpolate.hh │ │ │ │ │ +boundarydofs.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_INTERPOLATE_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_INTERPOLATE_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BOUNDARYDOFS_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BOUNDARYDOFS_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12 │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ +10#include │ │ │ │ │ +11 │ │ │ │ │ +12#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_s_u_b_e_n_t_i_t_y_d_o_f_s_._h_h> │ │ │ │ │ +13 │ │ │ │ │ +14namespace _D_u_n_e { │ │ │ │ │ +15namespace Functions { │ │ │ │ │ 16 │ │ │ │ │ -17#include │ │ │ │ │ +17 │ │ │ │ │ 18 │ │ │ │ │ -19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_v_i_e_w_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ -20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ -21 │ │ │ │ │ -22#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_b_a_c_k_e_n_d_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ -23#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_b_a_c_k_e_n_d_s_/_i_s_t_l_v_e_c_t_o_r_b_a_c_k_e_n_d_._h_h> │ │ │ │ │ -24#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_f_l_a_t_v_e_c_t_o_r_v_i_e_w_._h_h> │ │ │ │ │ -25#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_h_i_e_r_a_r_c_h_i_c_n_o_d_e_t_o_r_a_n_g_e_m_a_p_._h_h> │ │ │ │ │ -26 │ │ │ │ │ -27namespace _D_u_n_e { │ │ │ │ │ -28namespace Functions { │ │ │ │ │ -29 │ │ │ │ │ -30namespace Imp { │ │ │ │ │ -31 │ │ │ │ │ -32struct AllTrueBitSetVector │ │ │ │ │ -33{ │ │ │ │ │ -34 struct AllTrueBitSet │ │ │ │ │ -35 { │ │ │ │ │ -36 bool test(int) const { return true; } │ │ │ │ │ -37 } allTrue_; │ │ │ │ │ -38 │ │ │ │ │ -39 operator bool() const │ │ │ │ │ -40 { │ │ │ │ │ -41 return true; │ │ │ │ │ -42 } │ │ │ │ │ -43 │ │ │ │ │ -44 template │ │ │ │ │ -45 const AllTrueBitSetVector& operator[](const I&) const │ │ │ │ │ -46 { │ │ │ │ │ -47 return *this; │ │ │ │ │ -48 } │ │ │ │ │ -49 │ │ │ │ │ -50 template │ │ │ │ │ -51 void resize(const SP&) const │ │ │ │ │ -52 {} │ │ │ │ │ -53 │ │ │ │ │ -54}; │ │ │ │ │ +38template>()(0, std::declval(),std::declval()), 0) = 0> │ │ │ │ │ +_4_0void _f_o_r_E_a_c_h_B_o_u_n_d_a_r_y_D_O_F(const Basis& basis, F&& f) │ │ │ │ │ +41{ │ │ │ │ │ +42 auto localView = basis.localView(); │ │ │ │ │ +43 auto seDOFs = _s_u_b_E_n_t_i_t_y_D_O_F_s(basis); │ │ │ │ │ +44 const auto& gridView = basis.gridView(); │ │ │ │ │ +45 for(auto&& element : elements(gridView)) │ │ │ │ │ +46 if (element.hasBoundaryIntersections()) │ │ │ │ │ +47 { │ │ │ │ │ +48 localView.bind(element); │ │ │ │ │ +49 for(const auto& intersection: intersections(gridView, element)) │ │ │ │ │ +50 if (intersection.boundary()) │ │ │ │ │ +51 for(auto localIndex: seDOFs.bind(localView,intersection)) │ │ │ │ │ +52 f(localIndex, localView, intersection); │ │ │ │ │ +53 } │ │ │ │ │ +54} │ │ │ │ │ 55 │ │ │ │ │ 56 │ │ │ │ │ 57 │ │ │ │ │ -58// This helper function implements the restriction of some given function of │ │ │ │ │ -type F. │ │ │ │ │ -59// The restriction is a simple callback that is applied to the values of the │ │ │ │ │ -60// function and the values of its derivative. │ │ │ │ │ -61template │ │ │ │ │ -62class ComponentFunction │ │ │ │ │ -63{ │ │ │ │ │ -64public: │ │ │ │ │ -65 │ │ │ │ │ -66 ComponentFunction(F f, Restriction restriction) : │ │ │ │ │ -67 f_(std::move(f)), │ │ │ │ │ -68 restriction_(std::move(restriction)) │ │ │ │ │ -69 {} │ │ │ │ │ -70 │ │ │ │ │ -71 template │ │ │ │ │ -72 auto operator()(const Domain& x) const │ │ │ │ │ -73 { │ │ │ │ │ -74 return restriction_(f_(x)); │ │ │ │ │ -75 } │ │ │ │ │ -76 │ │ │ │ │ -77 friend auto _d_e_r_i_v_a_t_i_v_e(const ComponentFunction& cf) │ │ │ │ │ -78 { │ │ │ │ │ -79 // This provides support for capturing the derivative of the function by │ │ │ │ │ -reference │ │ │ │ │ -80 // using forwardCapture for perfect forwarding capture. If the function │ │ │ │ │ -caches its │ │ │ │ │ -81 // derivative, this saves a potentially costly copy. │ │ │ │ │ -82 auto&& df = _d_e_r_i_v_a_t_i_v_e(Dune::resolveRef(cf.f_)); │ │ │ │ │ -83 return [&, df=_f_o_r_w_a_r_d_C_a_p_t_u_r_e(std::forward(df))](auto&& x) { │ │ │ │ │ -84 return cf.restriction_(df.forward()(x)); │ │ │ │ │ -85 }; │ │ │ │ │ -86 } │ │ │ │ │ -87 │ │ │ │ │ -88private: │ │ │ │ │ -89 F f_; │ │ │ │ │ -90 Restriction restriction_; │ │ │ │ │ -91}; │ │ │ │ │ +75template>()(0, std::declval()),0) = 0> │ │ │ │ │ +77void _f_o_r_E_a_c_h_B_o_u_n_d_a_r_y_D_O_F(const Basis& basis, F&& f) │ │ │ │ │ +78{ │ │ │ │ │ +79 auto localView = basis.localView(); │ │ │ │ │ +80 auto seDOFs = _s_u_b_E_n_t_i_t_y_D_O_F_s(basis); │ │ │ │ │ +81 const auto& gridView = basis.gridView(); │ │ │ │ │ +82 for(auto&& element : elements(gridView)) │ │ │ │ │ +83 if (element.hasBoundaryIntersections()) │ │ │ │ │ +84 { │ │ │ │ │ +85 localView.bind(element); │ │ │ │ │ +86 for(const auto& intersection: intersections(gridView, element)) │ │ │ │ │ +87 if (intersection.boundary()) │ │ │ │ │ +88 for(auto localIndex: seDOFs.bind(localView,intersection)) │ │ │ │ │ +89 f(localIndex, localView); │ │ │ │ │ +90 } │ │ │ │ │ +91} │ │ │ │ │ 92 │ │ │ │ │ 93 │ │ │ │ │ 94 │ │ │ │ │ -95 │ │ │ │ │ -96// This helper function implements caching of the derivative for local │ │ │ │ │ -functions. │ │ │ │ │ -97// When using an algorithm that gets a LocalFunction and calls its derivative │ │ │ │ │ -98// on each element, this leads to a costly call of derivative(f). E.g. for a │ │ │ │ │ -99// DiscreteGlobalBasisFunction, this will allocate several buffer. │ │ │ │ │ -100// To avoid this, this helper function caches the derivative and hands │ │ │ │ │ -101// out the cached derivative by reference. To ensure that the handed out │ │ │ │ │ -102// derivative is appropriately bound, binding the function will │ │ │ │ │ -automatically │ │ │ │ │ -103// bind the cached derivative. │ │ │ │ │ -104// │ │ │ │ │ -105// Notice that we cannot simply create the derivative in the constructor, │ │ │ │ │ -106// because this may throw for functions that do not implement the │ │ │ │ │ -derivative. │ │ │ │ │ -107template │ │ │ │ │ -108class CachedDerivativeLocalFunction │ │ │ │ │ -109{ │ │ │ │ │ -110 using Derivative = std::decay_t())))>; │ │ │ │ │ -111 │ │ │ │ │ -112public: │ │ │ │ │ -113 │ │ │ │ │ -114 CachedDerivativeLocalFunction(F f) : │ │ │ │ │ -115 f_(f) │ │ │ │ │ -116 {} │ │ │ │ │ -117 │ │ │ │ │ -118 template │ │ │ │ │ -119 void bind(const Element& element) │ │ │ │ │ +111template>()(std::declval()),0) = 0> │ │ │ │ │ +113void _f_o_r_E_a_c_h_B_o_u_n_d_a_r_y_D_O_F(const Basis& basis, F&& f) │ │ │ │ │ +114{ │ │ │ │ │ +115 auto localView = basis.localView(); │ │ │ │ │ +116 auto seDOFs = _s_u_b_E_n_t_i_t_y_D_O_F_s(basis); │ │ │ │ │ +117 const auto& gridView = basis.gridView(); │ │ │ │ │ +118 for(auto&& element : elements(gridView)) │ │ │ │ │ +119 if (element.hasBoundaryIntersections()) │ │ │ │ │ 120 { │ │ │ │ │ -121 Dune::resolveRef(f_).bind(element); │ │ │ │ │ -122 if (derivative_) │ │ │ │ │ -123 derivative_.value().bind(element); │ │ │ │ │ -124 } │ │ │ │ │ -125 │ │ │ │ │ -126 template │ │ │ │ │ -127 auto operator()(const X& x) const │ │ │ │ │ -128 { │ │ │ │ │ -129 return f_(x); │ │ │ │ │ -130 } │ │ │ │ │ -131 │ │ │ │ │ -132 friend const Derivative& _d_e_r_i_v_a_t_i_v_e(const CachedDerivativeLocalFunction& │ │ │ │ │ -cdlf) │ │ │ │ │ -133 { │ │ │ │ │ -134 if (not cdlf.derivative_) │ │ │ │ │ -135 { │ │ │ │ │ -136 auto&& lf = Dune::resolveRef(cdlf.f_); │ │ │ │ │ -137 cdlf.derivative_ = _d_e_r_i_v_a_t_i_v_e(lf); │ │ │ │ │ -138 if (lf.bound()) │ │ │ │ │ -139 cdlf.derivative_.value().bind(lf.localContext()); │ │ │ │ │ -140 } │ │ │ │ │ -141 return cdlf.derivative_.value(); │ │ │ │ │ -142 } │ │ │ │ │ -143 │ │ │ │ │ -144private: │ │ │ │ │ -145 F f_; │ │ │ │ │ -146 mutable std::optional derivative_; │ │ │ │ │ -147}; │ │ │ │ │ -148 │ │ │ │ │ -149 │ │ │ │ │ -150 │ │ │ │ │ -151template │ │ │ │ │ -152void interpolateLocal(VectorBackend& vector, const BitVectorBackend& │ │ │ │ │ -bitVector, const LocalFunction& localF, const LocalView& localView, const │ │ │ │ │ -NodeToRangeEntry& nodeToRangeEntry) │ │ │ │ │ -153{ │ │ │ │ │ -154 Dune::TypeTree::forEachLeafNode(localView.tree(), [&](auto&& node, auto&& │ │ │ │ │ -treePath) { │ │ │ │ │ -155 using Node = std::decay_t; │ │ │ │ │ -156 using FiniteElement = typename Node::FiniteElement; │ │ │ │ │ -157 using FiniteElementRangeField = typename FiniteElement::Traits:: │ │ │ │ │ -LocalBasisType::Traits::RangeFieldType; │ │ │ │ │ -158 │ │ │ │ │ -159 auto interpolationCoefficients = std::vector(); │ │ │ │ │ -160 auto&& fe = node.finiteElement(); │ │ │ │ │ -161 auto localF_RE = ComponentFunction(std::cref(localF), [&](auto&& y) │ │ │ │ │ -{ return nodeToRangeEntry(node, treePath, y); }); │ │ │ │ │ -162 │ │ │ │ │ -163 fe.localInterpolation().interpolate(localF_RE, interpolationCoefficients); │ │ │ │ │ -164 for (size_t i=0; i │ │ │ │ │ -177 auto require(F&& f) -> decltype(_d_e_r_i_v_a_t_i_v_e(f)); │ │ │ │ │ -178}; │ │ │ │ │ -179 │ │ │ │ │ -180} // namespace Imp │ │ │ │ │ -181 │ │ │ │ │ -182 │ │ │ │ │ -183 │ │ │ │ │ -184 │ │ │ │ │ -202template │ │ │ │ │ -_2_0_3void _i_n_t_e_r_p_o_l_a_t_e(const B& basis, C&& coeff, const F& f, const BV& bv, const │ │ │ │ │ -NTRE& nodeToRangeEntry) │ │ │ │ │ -204{ │ │ │ │ │ -205 using GridView = typename B::GridView; │ │ │ │ │ -206 using Element = typename GridView::template Codim<0>::Entity; │ │ │ │ │ -207 using GlobalDomain = typename Element::Geometry::GlobalCoordinate; │ │ │ │ │ -208 │ │ │ │ │ -209 static_assert(Dune::Functions::Concept::isCallable(), │ │ │ │ │ -"Function passed to interpolate does not model the Callable │ │ │ │ │ -concept"); │ │ │ │ │ -210 │ │ │ │ │ -211 auto&& gridView = basis.gridView(); │ │ │ │ │ -212 │ │ │ │ │ -213 // Small helper functions to wrap vectors using istlVectorBackend │ │ │ │ │ -214 // if they do not already satisfy the VectorBackend interface. │ │ │ │ │ -215 auto toVectorBackend = [&](auto& v) -> decltype(auto) { │ │ │ │ │ -216 if constexpr (models, decltype(v)>()) { │ │ │ │ │ -217 return v; │ │ │ │ │ -218 } else { │ │ │ │ │ -219 return _i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d(v); │ │ │ │ │ -220 } │ │ │ │ │ -221 }; │ │ │ │ │ -222 │ │ │ │ │ -223 auto toConstVectorBackend = [&](auto& v) -> decltype(auto) { │ │ │ │ │ -224 if constexpr (models, decltype(v)>()) { │ │ │ │ │ -225 return v; │ │ │ │ │ -226 } else { │ │ │ │ │ -227 return _i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d(v); │ │ │ │ │ -228 } │ │ │ │ │ -229 }; │ │ │ │ │ -230 │ │ │ │ │ -231 auto&& bitVector = toConstVectorBackend(bv); │ │ │ │ │ -232 auto&& vector = toVectorBackend(coeff); │ │ │ │ │ -233 vector.resize(basis); │ │ │ │ │ -234 │ │ │ │ │ -235 // Make a grid function supporting local evaluation out of f │ │ │ │ │ -236 auto gf = _m_a_k_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n(f, gridView); │ │ │ │ │ -237 │ │ │ │ │ -238 // Obtain a local view of f │ │ │ │ │ -239 // To avoid costly reconstruction of the derivative on each element, │ │ │ │ │ -240 // we use the CachedDerivativeLocalFunction wrapper if the function │ │ │ │ │ -241 // is differentiable. This wrapper will handout │ │ │ │ │ -242 // a reference to a single cached derivative object. │ │ │ │ │ -243 auto localF = [&](){ │ │ │ │ │ -244 if constexpr (models()) │ │ │ │ │ -245 return Imp::CachedDerivativeLocalFunction(localFunction(gf)); │ │ │ │ │ -246 else │ │ │ │ │ -247 return localFunction(gf); │ │ │ │ │ -248 }(); │ │ │ │ │ -249 │ │ │ │ │ -250 auto localView = basis.localView(); │ │ │ │ │ -251 │ │ │ │ │ -252 for (const auto& e : elements(gridView)) │ │ │ │ │ -253 { │ │ │ │ │ -254 localView.bind(e); │ │ │ │ │ -255 localF.bind(e); │ │ │ │ │ -256 Imp::interpolateLocal(vector, bitVector, localF, localView, │ │ │ │ │ -nodeToRangeEntry); │ │ │ │ │ -257 } │ │ │ │ │ -258} │ │ │ │ │ -259 │ │ │ │ │ -276template │ │ │ │ │ -_2_7_7void _i_n_t_e_r_p_o_l_a_t_e(const B& basis, C&& coeff, const F& f, const BV& bitVector) │ │ │ │ │ -278{ │ │ │ │ │ -279 _i_n_t_e_r_p_o_l_a_t_e(basis, coeff, f, bitVector, _H_i_e_r_a_r_c_h_i_c_N_o_d_e_T_o_R_a_n_g_e_M_a_p()); │ │ │ │ │ -280} │ │ │ │ │ -281 │ │ │ │ │ -296template │ │ │ │ │ -_2_9_7void _i_n_t_e_r_p_o_l_a_t_e(const B& basis, C&& coeff, const F& f) │ │ │ │ │ -298{ │ │ │ │ │ -299 _i_n_t_e_r_p_o_l_a_t_e (basis, coeff, f, Imp::AllTrueBitSetVector(), │ │ │ │ │ -_H_i_e_r_a_r_c_h_i_c_N_o_d_e_T_o_R_a_n_g_e_M_a_p()); │ │ │ │ │ -300} │ │ │ │ │ -301 │ │ │ │ │ -302} // namespace Functions │ │ │ │ │ -303} // namespace Dune │ │ │ │ │ -304 │ │ │ │ │ -305#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_INTERPOLATE_HH │ │ │ │ │ -_i_s_t_l_v_e_c_t_o_r_b_a_c_k_e_n_d_._h_h │ │ │ │ │ -_g_r_i_d_v_i_e_w_f_u_n_c_t_i_o_n_._h_h │ │ │ │ │ -_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ -_f_l_a_t_v_e_c_t_o_r_v_i_e_w_._h_h │ │ │ │ │ -_h_i_e_r_a_r_c_h_i_c_n_o_d_e_t_o_r_a_n_g_e_m_a_p_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ -TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const │ │ │ │ │ -TrigonometricFunction< K, sinFactor, cosFactor > &f) │ │ │ │ │ -Obtain derivative of TrigonometricFunction function. │ │ │ │ │ -DDeeffiinniittiioonn trigonometricfunction.hh:43 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d │ │ │ │ │ -auto istlVectorBackend(Vector &v) │ │ │ │ │ -Return a vector backend wrapping non-const ISTL like containers. │ │ │ │ │ -DDeeffiinniittiioonn istlvectorbackend.hh:350 │ │ │ │ │ +121 localView.bind(element); │ │ │ │ │ +122 for(const auto& intersection: intersections(gridView, element)) │ │ │ │ │ +123 if (intersection.boundary()) │ │ │ │ │ +124 for(auto localIndex: seDOFs.bind(localView,intersection)) │ │ │ │ │ +125 f(localView.index(localIndex)); │ │ │ │ │ +126 } │ │ │ │ │ +127} │ │ │ │ │ +128 │ │ │ │ │ +129 │ │ │ │ │ +130 │ │ │ │ │ +131} // namespace Functions │ │ │ │ │ +132} // namespace Dune │ │ │ │ │ +133 │ │ │ │ │ +134#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BOUNDARYDOFS_HH │ │ │ │ │ +_s_u_b_e_n_t_i_t_y_d_o_f_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_u_b_E_n_t_i_t_y_D_O_F_s │ │ │ │ │ +auto subEntityDOFs(const T &) │ │ │ │ │ +Create SubEntityDOFs object. │ │ │ │ │ +DDeeffiinniittiioonn subentitydofs.hh:164 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_o_r_E_a_c_h_B_o_u_n_d_a_r_y_D_O_F │ │ │ │ │ +void forEachBoundaryDOF(const Basis &basis, F &&f) │ │ │ │ │ +Loop over all DOFs on the boundary. │ │ │ │ │ +DDeeffiinniittiioonn boundarydofs.hh:40 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_n_t_e_r_p_o_l_a_t_e │ │ │ │ │ -void interpolate(const B &basis, C &&coeff, const F &f, const BV &bv, const │ │ │ │ │ -NTRE &nodeToRangeEntry) │ │ │ │ │ -Interpolate given function in discrete function space. │ │ │ │ │ -DDeeffiinniittiioonn interpolate.hh:203 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ -std::decay_t< F > makeGridViewFunction(F &&f, const GridView &gridView) │ │ │ │ │ -Construct a function modeling GridViewFunction from function and grid view. │ │ │ │ │ -DDeeffiinniittiioonn gridviewfunction.hh:72 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_o_r_w_a_r_d_C_a_p_t_u_r_e │ │ │ │ │ -auto forwardCapture(T &&t) │ │ │ │ │ -Create a capture object for perfect forwarding. │ │ │ │ │ -DDeeffiinniittiioonn utility.hh:376 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_N_o_d_e_T_o_R_a_n_g_e_M_a_p │ │ │ │ │ -A simple node to range map using the nested tree indices. │ │ │ │ │ -DDeeffiinniittiioonn hierarchicnodetorangemap.hh:34 │ │ │ │ │ -_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00167.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: lfeprebasismixin.hh File Reference │ │ │ │ +dune-functions: interpolate.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,50 +70,55 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
lfeprebasismixin.hh File Reference
│ │ │ │ +
interpolate.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <cassert>
│ │ │ │ -#include <type_traits>
│ │ │ │ +
#include <memory>
│ │ │ │ +#include <vector>
│ │ │ │ #include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/leafprebasismappermixin.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ -#include <dune/grid/common/mcmgmapper.hh>
│ │ │ │ +#include <dune/common/bitsetvector.hh>
│ │ │ │ +#include <dune/common/referencehelper.hh>
│ │ │ │ +#include <dune/typetree/traversal.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/flatvectorview.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/hierarchicnodetorangemap.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::Functions::LFEPreBasisMixin< GV, LFE >
 A pre-basis mixin class parametrized with a local finite-element and a DOF layout. More...
 
class  Dune::Functions::LFEPreBasisMixin< GV, LFE >::Node
 Leaf basis node that encapsulates a local finite-element given from the LFEPreBasisMixin of type LFE. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ Functions

template<class GV , class LFE >
 Dune::Functions::LFEPreBasisMixin (const GV &, const LFE &, MCMGLayout) -> LFEPreBasisMixin< GV, LFE >
 
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.
 
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.
 
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.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,37 +1,44 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -lfeprebasismixin.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +interpolate.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_a_p_p_e_r_m_i_x_i_n_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_v_i_e_w_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_b_a_c_k_e_n_d_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_b_a_c_k_e_n_d_s_/_i_s_t_l_v_e_c_t_o_r_b_a_c_k_e_n_d_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_f_l_a_t_v_e_c_t_o_r_v_i_e_w_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_h_i_e_r_a_r_c_h_i_c_n_o_d_e_t_o_r_a_n_g_e_m_a_p_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_<_ _G_V_,_ _L_F_E_ _> │ │ │ │ │ -  A pre-basis mixin class parametrized with a local finite-element and a │ │ │ │ │ - DOF layout. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_<_ _G_V_,_ _L_F_E_ _>_:_:_N_o_d_e │ │ │ │ │ -  Leaf basis node that encapsulates a local finite-element given from the │ │ │ │ │ - _L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n of type LFE. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n (const GV &, const LFE &, MCMGLayout) - │ │ │ │ │ - > _L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n< GV, LFE > │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_n_t_e_r_p_o_l_a_t_e (const B &basis, C &&coeff, const F &f, │ │ │ │ │ + const BV &bv, const NTRE &nodeToRangeEntry) │ │ │ │ │ +  Interpolate given function in discrete function space. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_n_t_e_r_p_o_l_a_t_e (const B &basis, C &&coeff, const F &f, │ │ │ │ │ + const BV &bitVector) │ │ │ │ │ +  Interpolate given function in discrete function space. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_n_t_e_r_p_o_l_a_t_e (const B &basis, C &&coeff, const F &f) │ │ │ │ │ +  Interpolate given function in discrete function space. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00167_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: lfeprebasismixin.hh Source File │ │ │ │ +dune-functions: interpolate.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,161 +74,294 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
lfeprebasismixin.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LFEPREBASISMIXIN_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LFEPREBASISMIXIN_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_INTERPOLATE_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_INTERPOLATE_HH
│ │ │ │
9
│ │ │ │ -
10#include <cassert>
│ │ │ │ -
11#include <type_traits>
│ │ │ │ +
10#include <memory>
│ │ │ │ +
11#include <vector>
│ │ │ │
12
│ │ │ │
13#include <dune/common/exceptions.hh>
│ │ │ │ -
14
│ │ │ │ - │ │ │ │ - │ │ │ │ -
17
│ │ │ │ -
18#include <dune/grid/common/mcmgmapper.hh>
│ │ │ │ -
19
│ │ │ │ -
20namespace Dune::Functions {
│ │ │ │ +
14#include <dune/common/bitsetvector.hh>
│ │ │ │ +
15#include <dune/common/referencehelper.hh>
│ │ │ │ +
16
│ │ │ │ +
17#include <dune/typetree/traversal.hh>
│ │ │ │ +
18
│ │ │ │ + │ │ │ │ + │ │ │ │
21
│ │ │ │ -
54template <class GV, class LFE>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
56 public LeafPreBasisMapperMixin< GV >
│ │ │ │ -
57{
│ │ │ │ - │ │ │ │ -
59
│ │ │ │ -
60public:
│ │ │ │ -
61
│ │ │ │ -
63 using GridView = GV;
│ │ │ │ -
64
│ │ │ │ -
66 class Node;
│ │ │ │ -
67
│ │ │ │ -
73 template <class LFE_ = LFE,
│ │ │ │ -
74 std::enable_if_t<std::is_default_constructible_v<LFE_>, int> = 0>
│ │ │ │ -
│ │ │ │ -
75 LFEPreBasisMixin (const GridView& gv, MCMGLayout layout)
│ │ │ │ -
76 : Base(gv, layout)
│ │ │ │ -
77 , lfe_{}
│ │ │ │ -
78 {}
│ │ │ │ -
│ │ │ │ -
79
│ │ │ │ -
85 template <class LFE_>
│ │ │ │ -
│ │ │ │ -
86 LFEPreBasisMixin (const GridView& gv, LFE_&& lfe, MCMGLayout layout)
│ │ │ │ -
87 : Base(gv, layout)
│ │ │ │ -
88 , lfe_(std::forward<LFE_>(lfe))
│ │ │ │ -
89 {}
│ │ │ │ -
│ │ │ │ -
90
│ │ │ │ -
│ │ │ │ -
92 Node makeNode () const
│ │ │ │ -
93 {
│ │ │ │ -
94 return Node(lfe_);
│ │ │ │ -
95 }
│ │ │ │ -
│ │ │ │ -
96
│ │ │ │ -
97private:
│ │ │ │ -
98 LFE lfe_;
│ │ │ │ -
99};
│ │ │ │ -
│ │ │ │ -
100
│ │ │ │ -
101// deduction guide
│ │ │ │ -
102template <class GV, class LFE>
│ │ │ │ -
103LFEPreBasisMixin(const GV&, const LFE&, MCMGLayout)
│ │ │ │ - │ │ │ │ -
105
│ │ │ │ -
106
│ │ │ │ -
107
│ │ │ │ -
117template <class GV, class LFE>
│ │ │ │ -
│ │ │ │ -
118class LFEPreBasisMixin<GV,LFE>::Node
│ │ │ │ -
119 : public LeafBasisNode
│ │ │ │ -
120{
│ │ │ │ -
121 static constexpr int dim = GV::dimension;
│ │ │ │ -
122
│ │ │ │ -
123public:
│ │ │ │ -
124 using size_type = std::size_t;
│ │ │ │ -
125 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ -
126 using FiniteElement = LFE;
│ │ │ │ -
127
│ │ │ │ -
│ │ │ │ -
129 explicit Node (const LFE& lfe)
│ │ │ │ -
130 : lfe_{&lfe}
│ │ │ │ -
131 , element_{nullptr}
│ │ │ │ -
132 {}
│ │ │ │ -
│ │ │ │ -
133
│ │ │ │ -
│ │ │ │ -
135 const Element& element () const
│ │ │ │ -
136 {
│ │ │ │ -
137 assert(!!element_);
│ │ │ │ -
138 return *element_;
│ │ │ │ -
139 }
│ │ │ │ -
│ │ │ │ -
140
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
147 {
│ │ │ │ -
148 assert(!!lfe_);
│ │ │ │ -
149 return *lfe_;
│ │ │ │ -
150 }
│ │ │ │ -
│ │ │ │ -
151
│ │ │ │ -
│ │ │ │ -
153 void bind (const Element& e)
│ │ │ │ -
154 {
│ │ │ │ -
155 element_ = &e;
│ │ │ │ -
156 this->setSize(lfe_->size());
│ │ │ │ -
157 }
│ │ │ │ -
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
26
│ │ │ │ +
27namespace Dune {
│ │ │ │ +
28namespace Functions {
│ │ │ │ +
29
│ │ │ │ +
30namespace Imp {
│ │ │ │ +
31
│ │ │ │ +
32struct AllTrueBitSetVector
│ │ │ │ +
33{
│ │ │ │ +
34 struct AllTrueBitSet
│ │ │ │ +
35 {
│ │ │ │ +
36 bool test(int) const { return true; }
│ │ │ │ +
37 } allTrue_;
│ │ │ │ +
38
│ │ │ │ +
39 operator bool() const
│ │ │ │ +
40 {
│ │ │ │ +
41 return true;
│ │ │ │ +
42 }
│ │ │ │ +
43
│ │ │ │ +
44 template<class I>
│ │ │ │ +
45 const AllTrueBitSetVector& operator[](const I&) const
│ │ │ │ +
46 {
│ │ │ │ +
47 return *this;
│ │ │ │ +
48 }
│ │ │ │ +
49
│ │ │ │ +
50 template<class SP>
│ │ │ │ +
51 void resize(const SP&) const
│ │ │ │ +
52 {}
│ │ │ │ +
53
│ │ │ │ +
54};
│ │ │ │ +
55
│ │ │ │ +
56
│ │ │ │ +
57
│ │ │ │ +
58// This helper function implements the restriction of some given function of type F.
│ │ │ │ +
59// The restriction is a simple callback that is applied to the values of the
│ │ │ │ +
60// function and the values of its derivative.
│ │ │ │ +
61template<class F, class Restriction>
│ │ │ │ +
62class ComponentFunction
│ │ │ │ +
63{
│ │ │ │ +
64public:
│ │ │ │ +
65
│ │ │ │ +
66 ComponentFunction(F f, Restriction restriction) :
│ │ │ │ +
67 f_(std::move(f)),
│ │ │ │ +
68 restriction_(std::move(restriction))
│ │ │ │ +
69 {}
│ │ │ │ +
70
│ │ │ │ +
71 template<class Domain>
│ │ │ │ +
72 auto operator()(const Domain& x) const
│ │ │ │ +
73 {
│ │ │ │ +
74 return restriction_(f_(x));
│ │ │ │ +
75 }
│ │ │ │ +
76
│ │ │ │ +
77 friend auto derivative(const ComponentFunction& cf)
│ │ │ │ +
78 {
│ │ │ │ +
79 // This provides support for capturing the derivative of the function by reference
│ │ │ │ +
80 // using forwardCapture for perfect forwarding capture. If the function caches its
│ │ │ │ +
81 // derivative, this saves a potentially costly copy.
│ │ │ │ +
82 auto&& df = derivative(Dune::resolveRef(cf.f_));
│ │ │ │ +
83 return [&, df=forwardCapture(std::forward<decltype(df)>(df))](auto&& x) {
│ │ │ │ +
84 return cf.restriction_(df.forward()(x));
│ │ │ │ +
85 };
│ │ │ │ +
86 }
│ │ │ │ +
87
│ │ │ │ +
88private:
│ │ │ │ +
89 F f_;
│ │ │ │ +
90 Restriction restriction_;
│ │ │ │ +
91};
│ │ │ │ +
92
│ │ │ │ +
93
│ │ │ │ +
94
│ │ │ │ +
95
│ │ │ │ +
96// This helper function implements caching of the derivative for local functions.
│ │ │ │ +
97// When using an algorithm that gets a LocalFunction and calls its derivative
│ │ │ │ +
98// on each element, this leads to a costly call of derivative(f). E.g. for a
│ │ │ │ +
99// DiscreteGlobalBasisFunction, this will allocate several buffer.
│ │ │ │ +
100// To avoid this, this helper function caches the derivative and hands
│ │ │ │ +
101// out the cached derivative by reference. To ensure that the handed out
│ │ │ │ +
102// derivative is appropriately bound, binding the function will automatically
│ │ │ │ +
103// bind the cached derivative.
│ │ │ │ +
104//
│ │ │ │ +
105// Notice that we cannot simply create the derivative in the constructor,
│ │ │ │ +
106// because this may throw for functions that do not implement the derivative.
│ │ │ │ +
107template<class F>
│ │ │ │ +
108class CachedDerivativeLocalFunction
│ │ │ │ +
109{
│ │ │ │ +
110 using Derivative = std::decay_t<decltype(derivative(Dune::resolveRef(std::declval<const F&>())))>;
│ │ │ │ +
111
│ │ │ │ +
112public:
│ │ │ │ +
113
│ │ │ │ +
114 CachedDerivativeLocalFunction(F f) :
│ │ │ │ +
115 f_(f)
│ │ │ │ +
116 {}
│ │ │ │ +
117
│ │ │ │ +
118 template<class Element>
│ │ │ │ +
119 void bind(const Element& element)
│ │ │ │ +
120 {
│ │ │ │ +
121 Dune::resolveRef(f_).bind(element);
│ │ │ │ +
122 if (derivative_)
│ │ │ │ +
123 derivative_.value().bind(element);
│ │ │ │ +
124 }
│ │ │ │ +
125
│ │ │ │ +
126 template<class X>
│ │ │ │ +
127 auto operator()(const X& x) const
│ │ │ │ +
128 {
│ │ │ │ +
129 return f_(x);
│ │ │ │ +
130 }
│ │ │ │ +
131
│ │ │ │ +
132 friend const Derivative& derivative(const CachedDerivativeLocalFunction& cdlf)
│ │ │ │ +
133 {
│ │ │ │ +
134 if (not cdlf.derivative_)
│ │ │ │ +
135 {
│ │ │ │ +
136 auto&& lf = Dune::resolveRef(cdlf.f_);
│ │ │ │ +
137 cdlf.derivative_ = derivative(lf);
│ │ │ │ +
138 if (lf.bound())
│ │ │ │ +
139 cdlf.derivative_.value().bind(lf.localContext());
│ │ │ │ +
140 }
│ │ │ │ +
141 return cdlf.derivative_.value();
│ │ │ │ +
142 }
│ │ │ │ +
143
│ │ │ │ +
144private:
│ │ │ │ +
145 F f_;
│ │ │ │ +
146 mutable std::optional<Derivative> derivative_;
│ │ │ │ +
147};
│ │ │ │ +
148
│ │ │ │ +
149
│ │ │ │ +
150
│ │ │ │ +
151template<class VectorBackend, class BitVectorBackend, class LocalFunction, class LocalView, class NodeToRangeEntry>
│ │ │ │ +
152void interpolateLocal(VectorBackend& vector, const BitVectorBackend& bitVector, const LocalFunction& localF, const LocalView& localView, const NodeToRangeEntry& nodeToRangeEntry)
│ │ │ │ +
153{
│ │ │ │ +
154 Dune::TypeTree::forEachLeafNode(localView.tree(), [&](auto&& node, auto&& treePath) {
│ │ │ │ +
155 using Node = std::decay_t<decltype(node)>;
│ │ │ │ +
156 using FiniteElement = typename Node::FiniteElement;
│ │ │ │ +
157 using FiniteElementRangeField = typename FiniteElement::Traits::LocalBasisType::Traits::RangeFieldType;
│ │ │ │
158
│ │ │ │ -
159protected:
│ │ │ │ - │ │ │ │ - │ │ │ │ -
162};
│ │ │ │ -
│ │ │ │ -
163
│ │ │ │ -
164
│ │ │ │ -
165} // end namespace Dune::Functions
│ │ │ │ -
166
│ │ │ │ -
167
│ │ │ │ -
168#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LFEPREBASISMIXIN_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ -
Definition polynomial.hh:18
│ │ │ │ -
A generic MixIn class for PreBasis with flat indices computed from a mapper.
Definition leafprebasismappermixin.hh:62
│ │ │ │ -
A pre-basis mixin class parametrized with a local finite-element and a DOF layout.
Definition lfeprebasismixin.hh:57
│ │ │ │ -
LFEPreBasisMixin(const GridView &gv, LFE_ &&lfe, MCMGLayout layout)
Constructor for a given grid view object, local finite-element and layout.
Definition lfeprebasismixin.hh:86
│ │ │ │ -
LFEPreBasisMixin(const GridView &gv, MCMGLayout layout)
Constructor for a given grid view object and layout.
Definition lfeprebasismixin.hh:75
│ │ │ │ -
Node makeNode() const
Create tree node.
Definition lfeprebasismixin.hh:92
│ │ │ │ -
GV GridView
The grid view that the FE basis is defined on.
Definition lfeprebasismixin.hh:63
│ │ │ │ -
Leaf basis node that encapsulates a local finite-element given from the LFEPreBasisMixin of type LFE.
Definition lfeprebasismixin.hh:120
│ │ │ │ -
LFE FiniteElement
Definition lfeprebasismixin.hh:126
│ │ │ │ -
std::size_t size_type
Definition lfeprebasismixin.hh:124
│ │ │ │ -
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to; might raise an error if unbound.
Definition lfeprebasismixin.hh:146
│ │ │ │ -
const Element & element() const
Return current element; might raise an error if unbound.
Definition lfeprebasismixin.hh:135
│ │ │ │ -
const FiniteElement * lfe_
Definition lfeprebasismixin.hh:160
│ │ │ │ -
void bind(const Element &e)
Bind to element. Stores a pointer to the passed element reference.
Definition lfeprebasismixin.hh:153
│ │ │ │ -
Node(const LFE &lfe)
Constructor; stores a pointer to the passed local finite-element lfe.
Definition lfeprebasismixin.hh:129
│ │ │ │ -
typename GV::template Codim< 0 >::Entity Element
Definition lfeprebasismixin.hh:125
│ │ │ │ -
const Element * element_
Definition lfeprebasismixin.hh:161
│ │ │ │ -
Definition nodes.hh:191
│ │ │ │ +
159 auto interpolationCoefficients = std::vector<FiniteElementRangeField>();
│ │ │ │ +
160 auto&& fe = node.finiteElement();
│ │ │ │ +
161 auto localF_RE = ComponentFunction(std::cref(localF), [&](auto&& y) { return nodeToRangeEntry(node, treePath, y); });
│ │ │ │ +
162
│ │ │ │ +
163 fe.localInterpolation().interpolate(localF_RE, interpolationCoefficients);
│ │ │ │ +
164 for (size_t i=0; i<fe.localBasis().size(); ++i)
│ │ │ │ +
165 {
│ │ │ │ +
166 auto multiIndex = localView.index(node.localIndex(i));
│ │ │ │ +
167 if ( bitVector[multiIndex] )
│ │ │ │ +
168 vector[multiIndex] = interpolationCoefficients[i];
│ │ │ │ +
169 }
│ │ │ │ +
170 });
│ │ │ │ +
171}
│ │ │ │ +
172
│ │ │ │ +
173
│ │ │ │ +
174struct HasDerivative
│ │ │ │ +
175{
│ │ │ │ +
176 template<class F>
│ │ │ │ +
177 auto require(F&& f) -> decltype(derivative(f));
│ │ │ │ +
178};
│ │ │ │ +
179
│ │ │ │ +
180} // namespace Imp
│ │ │ │ +
181
│ │ │ │ +
182
│ │ │ │ +
183
│ │ │ │ +
184
│ │ │ │ +
202template <class B, class C, class F, class BV, class NTRE>
│ │ │ │ +
│ │ │ │ +
203void interpolate(const B& basis, C&& coeff, const F& f, const BV& bv, const NTRE& nodeToRangeEntry)
│ │ │ │ +
204{
│ │ │ │ +
205 using GridView = typename B::GridView;
│ │ │ │ +
206 using Element = typename GridView::template Codim<0>::Entity;
│ │ │ │ +
207 using GlobalDomain = typename Element::Geometry::GlobalCoordinate;
│ │ │ │ +
208
│ │ │ │ +
209 static_assert(Dune::Functions::Concept::isCallable<F, GlobalDomain>(), "Function passed to interpolate does not model the Callable<GlobalCoordinate> concept");
│ │ │ │ +
210
│ │ │ │ +
211 auto&& gridView = basis.gridView();
│ │ │ │ +
212
│ │ │ │ +
213 // Small helper functions to wrap vectors using istlVectorBackend
│ │ │ │ +
214 // if they do not already satisfy the VectorBackend interface.
│ │ │ │ +
215 auto toVectorBackend = [&](auto& v) -> decltype(auto) {
│ │ │ │ +
216 if constexpr (models<Concept::VectorBackend<B>, decltype(v)>()) {
│ │ │ │ +
217 return v;
│ │ │ │ +
218 } else {
│ │ │ │ +
219 return istlVectorBackend(v);
│ │ │ │ +
220 }
│ │ │ │ +
221 };
│ │ │ │ +
222
│ │ │ │ +
223 auto toConstVectorBackend = [&](auto& v) -> decltype(auto) {
│ │ │ │ +
224 if constexpr (models<Concept::ConstVectorBackend<B>, decltype(v)>()) {
│ │ │ │ +
225 return v;
│ │ │ │ +
226 } else {
│ │ │ │ +
227 return istlVectorBackend(v);
│ │ │ │ +
228 }
│ │ │ │ +
229 };
│ │ │ │ +
230
│ │ │ │ +
231 auto&& bitVector = toConstVectorBackend(bv);
│ │ │ │ +
232 auto&& vector = toVectorBackend(coeff);
│ │ │ │ +
233 vector.resize(basis);
│ │ │ │ +
234
│ │ │ │ +
235 // Make a grid function supporting local evaluation out of f
│ │ │ │ +
236 auto gf = makeGridViewFunction(f, gridView);
│ │ │ │ +
237
│ │ │ │ +
238 // Obtain a local view of f
│ │ │ │ +
239 // To avoid costly reconstruction of the derivative on each element,
│ │ │ │ +
240 // we use the CachedDerivativeLocalFunction wrapper if the function
│ │ │ │ +
241 // is differentiable. This wrapper will handout
│ │ │ │ +
242 // a reference to a single cached derivative object.
│ │ │ │ +
243 auto localF = [&](){
│ │ │ │ +
244 if constexpr (models<Imp::HasDerivative, decltype(localFunction(gf))>())
│ │ │ │ +
245 return Imp::CachedDerivativeLocalFunction(localFunction(gf));
│ │ │ │ +
246 else
│ │ │ │ +
247 return localFunction(gf);
│ │ │ │ +
248 }();
│ │ │ │ +
249
│ │ │ │ +
250 auto localView = basis.localView();
│ │ │ │ +
251
│ │ │ │ +
252 for (const auto& e : elements(gridView))
│ │ │ │ +
253 {
│ │ │ │ +
254 localView.bind(e);
│ │ │ │ +
255 localF.bind(e);
│ │ │ │ +
256 Imp::interpolateLocal(vector, bitVector, localF, localView, nodeToRangeEntry);
│ │ │ │ +
257 }
│ │ │ │ +
258}
│ │ │ │ +
│ │ │ │ +
259
│ │ │ │ +
276template <class B, class C, class F, class BV>
│ │ │ │ +
│ │ │ │ +
277void interpolate(const B& basis, C&& coeff, const F& f, const BV& bitVector)
│ │ │ │ +
278{
│ │ │ │ +
279 interpolate(basis, coeff, f, bitVector, HierarchicNodeToRangeMap());
│ │ │ │ +
280}
│ │ │ │ +
│ │ │ │ +
281
│ │ │ │ +
296template <class B, class C, class F>
│ │ │ │ +
│ │ │ │ +
297void interpolate(const B& basis, C&& coeff, const F& f)
│ │ │ │ +
298{
│ │ │ │ +
299 interpolate (basis, coeff, f, Imp::AllTrueBitSetVector(), HierarchicNodeToRangeMap());
│ │ │ │ +
300}
│ │ │ │ +
│ │ │ │ +
301
│ │ │ │ +
302} // namespace Functions
│ │ │ │ +
303} // namespace Dune
│ │ │ │ +
304
│ │ │ │ +
305#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_INTERPOLATE_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const TrigonometricFunction< K, sinFactor, cosFactor > &f)
Obtain derivative of TrigonometricFunction function.
Definition trigonometricfunction.hh:43
│ │ │ │ +
auto istlVectorBackend(Vector &v)
Return a vector backend wrapping non-const ISTL like containers.
Definition istlvectorbackend.hh:350
│ │ │ │ +
Definition polynomial.hh:17
│ │ │ │ +
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:203
│ │ │ │ +
std::decay_t< F > makeGridViewFunction(F &&f, const GridView &gridView)
Construct a function modeling GridViewFunction from function and grid view.
Definition gridviewfunction.hh:72
│ │ │ │ +
auto forwardCapture(T &&t)
Create a capture object for perfect forwarding.
Definition utility.hh:376
│ │ │ │ +
A simple node to range map using the nested tree indices.
Definition hierarchicnodetorangemap.hh:34
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,184 +1,323 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -lfeprebasismixin.hh │ │ │ │ │ +interpolate.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LFEPREBASISMIXIN_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LFEPREBASISMIXIN_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_INTERPOLATE_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_INTERPOLATE_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ 12 │ │ │ │ │ 13#include │ │ │ │ │ -14 │ │ │ │ │ -15#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_a_p_p_e_r_m_i_x_i_n_._h_h> │ │ │ │ │ -16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ -17 │ │ │ │ │ -18#include │ │ │ │ │ -19 │ │ │ │ │ -20namespace _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s { │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16 │ │ │ │ │ +17#include │ │ │ │ │ +18 │ │ │ │ │ +19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_g_r_i_d_f_u_n_c_t_i_o_n_s_/_g_r_i_d_v_i_e_w_f_u_n_c_t_i_o_n_._h_h> │ │ │ │ │ +20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ 21 │ │ │ │ │ -54template │ │ │ │ │ -_5_5class _L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n : │ │ │ │ │ -56 public _L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n< GV > │ │ │ │ │ -57{ │ │ │ │ │ -58 using _B_a_s_e = _L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_<_ _G_V_ _>; │ │ │ │ │ -59 │ │ │ │ │ -60public: │ │ │ │ │ -61 │ │ │ │ │ -_6_3 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ -64 │ │ │ │ │ -66 class _N_o_d_e; │ │ │ │ │ -67 │ │ │ │ │ -73 template , int> = 0> │ │ │ │ │ -_7_5 _L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n (const _G_r_i_d_V_i_e_w& gv, MCMGLayout layout) │ │ │ │ │ -76 : _B_a_s_e(gv, layout) │ │ │ │ │ -77 , lfe_{} │ │ │ │ │ -78 {} │ │ │ │ │ -79 │ │ │ │ │ -85 template │ │ │ │ │ -_8_6 _L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n (const _G_r_i_d_V_i_e_w& gv, LFE_&& lfe, MCMGLayout layout) │ │ │ │ │ -87 : _B_a_s_e(gv, layout) │ │ │ │ │ -88 , lfe_(std::forward(lfe)) │ │ │ │ │ -89 {} │ │ │ │ │ -90 │ │ │ │ │ -_9_2 _N_o_d_e _m_a_k_e_N_o_d_e () const │ │ │ │ │ -93 { │ │ │ │ │ -94 return _N_o_d_e(lfe_); │ │ │ │ │ -95 } │ │ │ │ │ -96 │ │ │ │ │ -97private: │ │ │ │ │ -98 LFE lfe_; │ │ │ │ │ -99}; │ │ │ │ │ -100 │ │ │ │ │ -101// deduction guide │ │ │ │ │ -102template │ │ │ │ │ -_1_0_3_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n(const GV&, const LFE&, MCMGLayout) │ │ │ │ │ -104 -> _L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_<_G_V_,_L_F_E_>; │ │ │ │ │ -105 │ │ │ │ │ -106 │ │ │ │ │ -107 │ │ │ │ │ -117template │ │ │ │ │ -_1_1_8class _L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n::_N_o_d_e │ │ │ │ │ -119 : public _L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ -120{ │ │ │ │ │ -121 static constexpr int dim = GV::dimension; │ │ │ │ │ -122 │ │ │ │ │ -123public: │ │ │ │ │ -_1_2_4 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ -_1_2_5 using _E_l_e_m_e_n_t = typename GV::template Codim<0>::Entity; │ │ │ │ │ -_1_2_6 using _F_i_n_i_t_e_E_l_e_m_e_n_t = LFE; │ │ │ │ │ -127 │ │ │ │ │ -_1_2_9 explicit _N_o_d_e (const LFE& lfe) │ │ │ │ │ -130 : lfe_{&lfe} │ │ │ │ │ -131 , element_{nullptr} │ │ │ │ │ -132 {} │ │ │ │ │ -133 │ │ │ │ │ -_1_3_5 const _E_l_e_m_e_n_t& _e_l_e_m_e_n_t () const │ │ │ │ │ -136 { │ │ │ │ │ -137 assert(!!element_); │ │ │ │ │ -138 return *element_; │ │ │ │ │ -139 } │ │ │ │ │ -140 │ │ │ │ │ -_1_4_6 const _F_i_n_i_t_e_E_l_e_m_e_n_t& _f_i_n_i_t_e_E_l_e_m_e_n_t () const │ │ │ │ │ -147 { │ │ │ │ │ -148 assert(!!lfe_); │ │ │ │ │ -149 return *lfe_; │ │ │ │ │ -150 } │ │ │ │ │ -151 │ │ │ │ │ -_1_5_3 void _b_i_n_d (const _E_l_e_m_e_n_t& e) │ │ │ │ │ -154 { │ │ │ │ │ -155 element_ = &e; │ │ │ │ │ -156 this->setSize(lfe_->size()); │ │ │ │ │ -157 } │ │ │ │ │ +22#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_b_a_c_k_e_n_d_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +23#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_b_a_c_k_e_n_d_s_/_i_s_t_l_v_e_c_t_o_r_b_a_c_k_e_n_d_._h_h> │ │ │ │ │ +24#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_f_l_a_t_v_e_c_t_o_r_v_i_e_w_._h_h> │ │ │ │ │ +25#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_h_i_e_r_a_r_c_h_i_c_n_o_d_e_t_o_r_a_n_g_e_m_a_p_._h_h> │ │ │ │ │ +26 │ │ │ │ │ +27namespace _D_u_n_e { │ │ │ │ │ +28namespace Functions { │ │ │ │ │ +29 │ │ │ │ │ +30namespace Imp { │ │ │ │ │ +31 │ │ │ │ │ +32struct AllTrueBitSetVector │ │ │ │ │ +33{ │ │ │ │ │ +34 struct AllTrueBitSet │ │ │ │ │ +35 { │ │ │ │ │ +36 bool test(int) const { return true; } │ │ │ │ │ +37 } allTrue_; │ │ │ │ │ +38 │ │ │ │ │ +39 operator bool() const │ │ │ │ │ +40 { │ │ │ │ │ +41 return true; │ │ │ │ │ +42 } │ │ │ │ │ +43 │ │ │ │ │ +44 template │ │ │ │ │ +45 const AllTrueBitSetVector& operator[](const I&) const │ │ │ │ │ +46 { │ │ │ │ │ +47 return *this; │ │ │ │ │ +48 } │ │ │ │ │ +49 │ │ │ │ │ +50 template │ │ │ │ │ +51 void resize(const SP&) const │ │ │ │ │ +52 {} │ │ │ │ │ +53 │ │ │ │ │ +54}; │ │ │ │ │ +55 │ │ │ │ │ +56 │ │ │ │ │ +57 │ │ │ │ │ +58// This helper function implements the restriction of some given function of │ │ │ │ │ +type F. │ │ │ │ │ +59// The restriction is a simple callback that is applied to the values of the │ │ │ │ │ +60// function and the values of its derivative. │ │ │ │ │ +61template │ │ │ │ │ +62class ComponentFunction │ │ │ │ │ +63{ │ │ │ │ │ +64public: │ │ │ │ │ +65 │ │ │ │ │ +66 ComponentFunction(F f, Restriction restriction) : │ │ │ │ │ +67 f_(std::move(f)), │ │ │ │ │ +68 restriction_(std::move(restriction)) │ │ │ │ │ +69 {} │ │ │ │ │ +70 │ │ │ │ │ +71 template │ │ │ │ │ +72 auto operator()(const Domain& x) const │ │ │ │ │ +73 { │ │ │ │ │ +74 return restriction_(f_(x)); │ │ │ │ │ +75 } │ │ │ │ │ +76 │ │ │ │ │ +77 friend auto _d_e_r_i_v_a_t_i_v_e(const ComponentFunction& cf) │ │ │ │ │ +78 { │ │ │ │ │ +79 // This provides support for capturing the derivative of the function by │ │ │ │ │ +reference │ │ │ │ │ +80 // using forwardCapture for perfect forwarding capture. If the function │ │ │ │ │ +caches its │ │ │ │ │ +81 // derivative, this saves a potentially costly copy. │ │ │ │ │ +82 auto&& df = _d_e_r_i_v_a_t_i_v_e(Dune::resolveRef(cf.f_)); │ │ │ │ │ +83 return [&, df=_f_o_r_w_a_r_d_C_a_p_t_u_r_e(std::forward(df))](auto&& x) { │ │ │ │ │ +84 return cf.restriction_(df.forward()(x)); │ │ │ │ │ +85 }; │ │ │ │ │ +86 } │ │ │ │ │ +87 │ │ │ │ │ +88private: │ │ │ │ │ +89 F f_; │ │ │ │ │ +90 Restriction restriction_; │ │ │ │ │ +91}; │ │ │ │ │ +92 │ │ │ │ │ +93 │ │ │ │ │ +94 │ │ │ │ │ +95 │ │ │ │ │ +96// This helper function implements caching of the derivative for local │ │ │ │ │ +functions. │ │ │ │ │ +97// When using an algorithm that gets a LocalFunction and calls its derivative │ │ │ │ │ +98// on each element, this leads to a costly call of derivative(f). E.g. for a │ │ │ │ │ +99// DiscreteGlobalBasisFunction, this will allocate several buffer. │ │ │ │ │ +100// To avoid this, this helper function caches the derivative and hands │ │ │ │ │ +101// out the cached derivative by reference. To ensure that the handed out │ │ │ │ │ +102// derivative is appropriately bound, binding the function will │ │ │ │ │ +automatically │ │ │ │ │ +103// bind the cached derivative. │ │ │ │ │ +104// │ │ │ │ │ +105// Notice that we cannot simply create the derivative in the constructor, │ │ │ │ │ +106// because this may throw for functions that do not implement the │ │ │ │ │ +derivative. │ │ │ │ │ +107template │ │ │ │ │ +108class CachedDerivativeLocalFunction │ │ │ │ │ +109{ │ │ │ │ │ +110 using Derivative = std::decay_t())))>; │ │ │ │ │ +111 │ │ │ │ │ +112public: │ │ │ │ │ +113 │ │ │ │ │ +114 CachedDerivativeLocalFunction(F f) : │ │ │ │ │ +115 f_(f) │ │ │ │ │ +116 {} │ │ │ │ │ +117 │ │ │ │ │ +118 template │ │ │ │ │ +119 void bind(const Element& element) │ │ │ │ │ +120 { │ │ │ │ │ +121 Dune::resolveRef(f_).bind(element); │ │ │ │ │ +122 if (derivative_) │ │ │ │ │ +123 derivative_.value().bind(element); │ │ │ │ │ +124 } │ │ │ │ │ +125 │ │ │ │ │ +126 template │ │ │ │ │ +127 auto operator()(const X& x) const │ │ │ │ │ +128 { │ │ │ │ │ +129 return f_(x); │ │ │ │ │ +130 } │ │ │ │ │ +131 │ │ │ │ │ +132 friend const Derivative& _d_e_r_i_v_a_t_i_v_e(const CachedDerivativeLocalFunction& │ │ │ │ │ +cdlf) │ │ │ │ │ +133 { │ │ │ │ │ +134 if (not cdlf.derivative_) │ │ │ │ │ +135 { │ │ │ │ │ +136 auto&& lf = Dune::resolveRef(cdlf.f_); │ │ │ │ │ +137 cdlf.derivative_ = _d_e_r_i_v_a_t_i_v_e(lf); │ │ │ │ │ +138 if (lf.bound()) │ │ │ │ │ +139 cdlf.derivative_.value().bind(lf.localContext()); │ │ │ │ │ +140 } │ │ │ │ │ +141 return cdlf.derivative_.value(); │ │ │ │ │ +142 } │ │ │ │ │ +143 │ │ │ │ │ +144private: │ │ │ │ │ +145 F f_; │ │ │ │ │ +146 mutable std::optional derivative_; │ │ │ │ │ +147}; │ │ │ │ │ +148 │ │ │ │ │ +149 │ │ │ │ │ +150 │ │ │ │ │ +151template │ │ │ │ │ +152void interpolateLocal(VectorBackend& vector, const BitVectorBackend& │ │ │ │ │ +bitVector, const LocalFunction& localF, const LocalView& localView, const │ │ │ │ │ +NodeToRangeEntry& nodeToRangeEntry) │ │ │ │ │ +153{ │ │ │ │ │ +154 Dune::TypeTree::forEachLeafNode(localView.tree(), [&](auto&& node, auto&& │ │ │ │ │ +treePath) { │ │ │ │ │ +155 using Node = std::decay_t; │ │ │ │ │ +156 using FiniteElement = typename Node::FiniteElement; │ │ │ │ │ +157 using FiniteElementRangeField = typename FiniteElement::Traits:: │ │ │ │ │ +LocalBasisType::Traits::RangeFieldType; │ │ │ │ │ 158 │ │ │ │ │ -159protected: │ │ │ │ │ -_1_6_0 const _F_i_n_i_t_e_E_l_e_m_e_n_t* _l_f_e__; │ │ │ │ │ -_1_6_1 const _E_l_e_m_e_n_t* _e_l_e_m_e_n_t__; │ │ │ │ │ -162}; │ │ │ │ │ -163 │ │ │ │ │ -164 │ │ │ │ │ -165} // end namespace Dune::Functions │ │ │ │ │ -166 │ │ │ │ │ -167 │ │ │ │ │ -168#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LFEPREBASISMIXIN_HH │ │ │ │ │ -_l_e_a_f_p_r_e_b_a_s_i_s_m_a_p_p_e_r_m_i_x_i_n_._h_h │ │ │ │ │ -_n_o_d_e_s_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │ -DDeeffiinniittiioonn polynomial.hh:18 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n │ │ │ │ │ -A generic MixIn class for PreBasis with flat indices computed from a mapper. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismappermixin.hh:62 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n │ │ │ │ │ -A pre-basis mixin class parametrized with a local finite-element and a DOF │ │ │ │ │ -layout. │ │ │ │ │ -DDeeffiinniittiioonn lfeprebasismixin.hh:57 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n │ │ │ │ │ -LFEPreBasisMixin(const GridView &gv, LFE_ &&lfe, MCMGLayout layout) │ │ │ │ │ -Constructor for a given grid view object, local finite-element and layout. │ │ │ │ │ -DDeeffiinniittiioonn lfeprebasismixin.hh:86 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n │ │ │ │ │ -LFEPreBasisMixin(const GridView &gv, MCMGLayout layout) │ │ │ │ │ -Constructor for a given grid view object and layout. │ │ │ │ │ -DDeeffiinniittiioonn lfeprebasismixin.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ -Node makeNode() const │ │ │ │ │ -Create tree node. │ │ │ │ │ -DDeeffiinniittiioonn lfeprebasismixin.hh:92 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ -GV GridView │ │ │ │ │ -The grid view that the FE basis is defined on. │ │ │ │ │ -DDeeffiinniittiioonn lfeprebasismixin.hh:63 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_N_o_d_e │ │ │ │ │ -Leaf basis node that encapsulates a local finite-element given from the │ │ │ │ │ -LFEPreBasisMixin of type LFE. │ │ │ │ │ -DDeeffiinniittiioonn lfeprebasismixin.hh:120 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_N_o_d_e_:_:_F_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ -LFE FiniteElement │ │ │ │ │ -DDeeffiinniittiioonn lfeprebasismixin.hh:126 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_N_o_d_e_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -DDeeffiinniittiioonn lfeprebasismixin.hh:124 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ -const FiniteElement & finiteElement() const │ │ │ │ │ -Return the LocalFiniteElement for the element we are bound to; might raise an │ │ │ │ │ -error if unbound. │ │ │ │ │ -DDeeffiinniittiioonn lfeprebasismixin.hh:146 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_N_o_d_e_:_:_e_l_e_m_e_n_t │ │ │ │ │ -const Element & element() const │ │ │ │ │ -Return current element; might raise an error if unbound. │ │ │ │ │ -DDeeffiinniittiioonn lfeprebasismixin.hh:135 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_N_o_d_e_:_:_l_f_e__ │ │ │ │ │ -const FiniteElement * lfe_ │ │ │ │ │ -DDeeffiinniittiioonn lfeprebasismixin.hh:160 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_N_o_d_e_:_:_b_i_n_d │ │ │ │ │ -void bind(const Element &e) │ │ │ │ │ -Bind to element. Stores a pointer to the passed element reference. │ │ │ │ │ -DDeeffiinniittiioonn lfeprebasismixin.hh:153 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_N_o_d_e_:_:_N_o_d_e │ │ │ │ │ -Node(const LFE &lfe) │ │ │ │ │ -Constructor; stores a pointer to the passed local finite-element lfe. │ │ │ │ │ -DDeeffiinniittiioonn lfeprebasismixin.hh:129 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_N_o_d_e_:_:_E_l_e_m_e_n_t │ │ │ │ │ -typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ -DDeeffiinniittiioonn lfeprebasismixin.hh:125 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_F_E_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_N_o_d_e_:_:_e_l_e_m_e_n_t__ │ │ │ │ │ -const Element * element_ │ │ │ │ │ -DDeeffiinniittiioonn lfeprebasismixin.hh:161 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:191 │ │ │ │ │ +159 auto interpolationCoefficients = std::vector(); │ │ │ │ │ +160 auto&& fe = node.finiteElement(); │ │ │ │ │ +161 auto localF_RE = ComponentFunction(std::cref(localF), [&](auto&& y) │ │ │ │ │ +{ return nodeToRangeEntry(node, treePath, y); }); │ │ │ │ │ +162 │ │ │ │ │ +163 fe.localInterpolation().interpolate(localF_RE, interpolationCoefficients); │ │ │ │ │ +164 for (size_t i=0; i │ │ │ │ │ +177 auto require(F&& f) -> decltype(_d_e_r_i_v_a_t_i_v_e(f)); │ │ │ │ │ +178}; │ │ │ │ │ +179 │ │ │ │ │ +180} // namespace Imp │ │ │ │ │ +181 │ │ │ │ │ +182 │ │ │ │ │ +183 │ │ │ │ │ +184 │ │ │ │ │ +202template │ │ │ │ │ +_2_0_3void _i_n_t_e_r_p_o_l_a_t_e(const B& basis, C&& coeff, const F& f, const BV& bv, const │ │ │ │ │ +NTRE& nodeToRangeEntry) │ │ │ │ │ +204{ │ │ │ │ │ +205 using GridView = typename B::GridView; │ │ │ │ │ +206 using Element = typename GridView::template Codim<0>::Entity; │ │ │ │ │ +207 using GlobalDomain = typename Element::Geometry::GlobalCoordinate; │ │ │ │ │ +208 │ │ │ │ │ +209 static_assert(Dune::Functions::Concept::isCallable(), │ │ │ │ │ +"Function passed to interpolate does not model the Callable │ │ │ │ │ +concept"); │ │ │ │ │ +210 │ │ │ │ │ +211 auto&& gridView = basis.gridView(); │ │ │ │ │ +212 │ │ │ │ │ +213 // Small helper functions to wrap vectors using istlVectorBackend │ │ │ │ │ +214 // if they do not already satisfy the VectorBackend interface. │ │ │ │ │ +215 auto toVectorBackend = [&](auto& v) -> decltype(auto) { │ │ │ │ │ +216 if constexpr (models, decltype(v)>()) { │ │ │ │ │ +217 return v; │ │ │ │ │ +218 } else { │ │ │ │ │ +219 return _i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d(v); │ │ │ │ │ +220 } │ │ │ │ │ +221 }; │ │ │ │ │ +222 │ │ │ │ │ +223 auto toConstVectorBackend = [&](auto& v) -> decltype(auto) { │ │ │ │ │ +224 if constexpr (models, decltype(v)>()) { │ │ │ │ │ +225 return v; │ │ │ │ │ +226 } else { │ │ │ │ │ +227 return _i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d(v); │ │ │ │ │ +228 } │ │ │ │ │ +229 }; │ │ │ │ │ +230 │ │ │ │ │ +231 auto&& bitVector = toConstVectorBackend(bv); │ │ │ │ │ +232 auto&& vector = toVectorBackend(coeff); │ │ │ │ │ +233 vector.resize(basis); │ │ │ │ │ +234 │ │ │ │ │ +235 // Make a grid function supporting local evaluation out of f │ │ │ │ │ +236 auto gf = _m_a_k_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n(f, gridView); │ │ │ │ │ +237 │ │ │ │ │ +238 // Obtain a local view of f │ │ │ │ │ +239 // To avoid costly reconstruction of the derivative on each element, │ │ │ │ │ +240 // we use the CachedDerivativeLocalFunction wrapper if the function │ │ │ │ │ +241 // is differentiable. This wrapper will handout │ │ │ │ │ +242 // a reference to a single cached derivative object. │ │ │ │ │ +243 auto localF = [&](){ │ │ │ │ │ +244 if constexpr (models()) │ │ │ │ │ +245 return Imp::CachedDerivativeLocalFunction(localFunction(gf)); │ │ │ │ │ +246 else │ │ │ │ │ +247 return localFunction(gf); │ │ │ │ │ +248 }(); │ │ │ │ │ +249 │ │ │ │ │ +250 auto localView = basis.localView(); │ │ │ │ │ +251 │ │ │ │ │ +252 for (const auto& e : elements(gridView)) │ │ │ │ │ +253 { │ │ │ │ │ +254 localView.bind(e); │ │ │ │ │ +255 localF.bind(e); │ │ │ │ │ +256 Imp::interpolateLocal(vector, bitVector, localF, localView, │ │ │ │ │ +nodeToRangeEntry); │ │ │ │ │ +257 } │ │ │ │ │ +258} │ │ │ │ │ +259 │ │ │ │ │ +276template │ │ │ │ │ +_2_7_7void _i_n_t_e_r_p_o_l_a_t_e(const B& basis, C&& coeff, const F& f, const BV& bitVector) │ │ │ │ │ +278{ │ │ │ │ │ +279 _i_n_t_e_r_p_o_l_a_t_e(basis, coeff, f, bitVector, _H_i_e_r_a_r_c_h_i_c_N_o_d_e_T_o_R_a_n_g_e_M_a_p()); │ │ │ │ │ +280} │ │ │ │ │ +281 │ │ │ │ │ +296template │ │ │ │ │ +_2_9_7void _i_n_t_e_r_p_o_l_a_t_e(const B& basis, C&& coeff, const F& f) │ │ │ │ │ +298{ │ │ │ │ │ +299 _i_n_t_e_r_p_o_l_a_t_e (basis, coeff, f, Imp::AllTrueBitSetVector(), │ │ │ │ │ +_H_i_e_r_a_r_c_h_i_c_N_o_d_e_T_o_R_a_n_g_e_M_a_p()); │ │ │ │ │ +300} │ │ │ │ │ +301 │ │ │ │ │ +302} // namespace Functions │ │ │ │ │ +303} // namespace Dune │ │ │ │ │ +304 │ │ │ │ │ +305#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_INTERPOLATE_HH │ │ │ │ │ +_f_u_n_c_t_i_o_n_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ +_g_r_i_d_v_i_e_w_f_u_n_c_t_i_o_n_._h_h │ │ │ │ │ +_i_s_t_l_v_e_c_t_o_r_b_a_c_k_e_n_d_._h_h │ │ │ │ │ +_f_l_a_t_v_e_c_t_o_r_v_i_e_w_._h_h │ │ │ │ │ +_h_i_e_r_a_r_c_h_i_c_n_o_d_e_t_o_r_a_n_g_e_m_a_p_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_d_e_r_i_v_a_t_i_v_e │ │ │ │ │ +TrigonometricFunction< K, -cosFactor, sinFactor > derivative(const │ │ │ │ │ +TrigonometricFunction< K, sinFactor, cosFactor > &f) │ │ │ │ │ +Obtain derivative of TrigonometricFunction function. │ │ │ │ │ +DDeeffiinniittiioonn trigonometricfunction.hh:43 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_s_t_l_V_e_c_t_o_r_B_a_c_k_e_n_d │ │ │ │ │ +auto istlVectorBackend(Vector &v) │ │ │ │ │ +Return a vector backend wrapping non-const ISTL like containers. │ │ │ │ │ +DDeeffiinniittiioonn istlvectorbackend.hh:350 │ │ │ │ │ +_D_u_n_e │ │ │ │ │ +DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_n_t_e_r_p_o_l_a_t_e │ │ │ │ │ +void interpolate(const B &basis, C &&coeff, const F &f, const BV &bv, const │ │ │ │ │ +NTRE &nodeToRangeEntry) │ │ │ │ │ +Interpolate given function in discrete function space. │ │ │ │ │ +DDeeffiinniittiioonn interpolate.hh:203 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_G_r_i_d_V_i_e_w_F_u_n_c_t_i_o_n │ │ │ │ │ +std::decay_t< F > makeGridViewFunction(F &&f, const GridView &gridView) │ │ │ │ │ +Construct a function modeling GridViewFunction from function and grid view. │ │ │ │ │ +DDeeffiinniittiioonn gridviewfunction.hh:72 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_o_r_w_a_r_d_C_a_p_t_u_r_e │ │ │ │ │ +auto forwardCapture(T &&t) │ │ │ │ │ +Create a capture object for perfect forwarding. │ │ │ │ │ +DDeeffiinniittiioonn utility.hh:376 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_H_i_e_r_a_r_c_h_i_c_N_o_d_e_T_o_R_a_n_g_e_M_a_p │ │ │ │ │ +A simple node to range map using the nested tree indices. │ │ │ │ │ +DDeeffiinniittiioonn hierarchicnodetorangemap.hh:34 │ │ │ │ │ +_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00170.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: defaultnodetorangemap.hh File Reference │ │ │ │ +dune-functions: globalvaluedlocalfiniteelement.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,50 +70,36 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
defaultnodetorangemap.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
globalvaluedlocalfiniteelement.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 <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>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

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 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 {} │ │ │ │ │ @@ -1,38 +1,26 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -defaultnodetorangemap.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +_N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +globalvaluedlocalfiniteelement.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p_<_ _T_r_e_e_ _> │ │ │ │ │ -  A simple node to range map using lexicographic ordering. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p_<_ _T_r_e_e_ _>_:_:_V_i_s_i_t_o_r │ │ │ │ │ -  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p< Tree >  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p │ │ │ │ │ - (const Tree &tree) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p │ │ │ │ │ - (const Basis &basis, TreePath &&treePath) - │ │ │ │ │ - > decltype(makeDefaultNodeToRangeMap(TypeTree:: │ │ │ │ │ - child(basis.localView().tree(), treePath))) │ │ │ │ │ -  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00170_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: defaultnodetorangemap.hh Source File │ │ │ │ +dune-functions: globalvaluedlocalfiniteelement.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,152 +74,327 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
defaultnodetorangemap.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTNODETORANGEMAP_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTNODETORANGEMAP_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_GLOBALVALUEDLOCALFINITEELEMENT_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_GLOBALVALUEDLOCALFINITEELEMENT_HH
│ │ │ │
9
│ │ │ │ -
10#warning The header dune/functions/common/defaultnodetorangemap.hh is deprecated and will be removed after release 2.10.
│ │ │ │ -
11
│ │ │ │ -
12#include <dune/common/concept.hh>
│ │ │ │ -
13
│ │ │ │ - │ │ │ │ -
15
│ │ │ │ -
16#include <dune/typetree/traversal.hh>
│ │ │ │ -
17#include <dune/typetree/visitor.hh>
│ │ │ │ -
18
│ │ │ │ +
10#include <array>
│ │ │ │ +
11#include <numeric>
│ │ │ │ +
12
│ │ │ │ +
13#include <dune/common/fmatrix.hh>
│ │ │ │ +
14#include <dune/common/fvector.hh>
│ │ │ │ +
15#include <dune/common/math.hh>
│ │ │ │ +
16#include <dune/common/rangeutilities.hh>
│ │ │ │ +
17
│ │ │ │ +
18#include <dune/geometry/referenceelements.hh>
│ │ │ │
19
│ │ │ │ -
20namespace Dune {
│ │ │ │ -
21namespace Functions {
│ │ │ │ +
20#include <dune/localfunctions/common/localbasis.hh>
│ │ │ │ +
21#include <dune/localfunctions/common/localfiniteelementtraits.hh>
│ │ │ │
22
│ │ │ │ -
23
│ │ │ │ -
24
│ │ │ │ -
44template<class Tree>
│ │ │ │ -
│ │ │ │ -
45struct
│ │ │ │ -
46[[deprecated("DefaultNodeToRangeMap is deprecated and will be removed after release 2.10.")]]
│ │ │ │ - │ │ │ │ -
48{
│ │ │ │ -
49
│ │ │ │ -
50 // A simple visitor for computing lexicographic
│ │ │ │ -
51 // subtree indices. To identify a leaf node
│ │ │ │ -
52 // we use its treeIndex() which is unique
│ │ │ │ -
53 // wrt the whole tree and store the computed
│ │ │ │ -
54 // index in a vector indexed by the tree indices.
│ │ │ │ -
│ │ │ │ -
55 struct Visitor
│ │ │ │ -
56 : public TypeTree::TreeVisitor
│ │ │ │ -
57 , public TypeTree::DynamicTraversal
│ │ │ │ -
58 {
│ │ │ │ -
│ │ │ │ -
59 Visitor(std::vector<std::size_t>& indices) :
│ │ │ │ -
60 indices_(indices),
│ │ │ │ -
61 counter_(0)
│ │ │ │ -
62 {}
│ │ │ │ -
│ │ │ │ -
63
│ │ │ │ -
64 template<typename Node, typename TreePath>
│ │ │ │ -
│ │ │ │ -
65 void leaf(Node& node, TreePath treePath)
│ │ │ │ -
66 {
│ │ │ │ -
67 if (indices_.size() < node.treeIndex()+1)
│ │ │ │ -
68 indices_.resize(node.treeIndex()+1);
│ │ │ │ -
69 indices_[node.treeIndex()] = counter_;
│ │ │ │ -
70 ++counter_;
│ │ │ │ -
71 }
│ │ │ │ -
│ │ │ │ -
72
│ │ │ │ -
73 std::vector<std::size_t>& indices_;
│ │ │ │ -
74 std::size_t counter_;
│ │ │ │ -
75 };
│ │ │ │ -
│ │ │ │ -
76
│ │ │ │ -
│ │ │ │ -
87 DefaultNodeToRangeMap(const Tree& tree)
│ │ │ │ -
88 {
│ │ │ │ -
89 TypeTree::applyToTree(tree, Visitor(indices_));
│ │ │ │ -
90 }
│ │ │ │ -
│ │ │ │ -
91
│ │ │ │ -
92 template<class Node, class TreePath, class Range,
│ │ │ │ -
93 std::enable_if_t<models<Concept::HasIndexAccess, Range, decltype(std::declval<Node>().treeIndex())>() and not Tree::isLeaf, int> = 0>
│ │ │ │ -
│ │ │ │ -
94 decltype(auto) operator()(const Node& node, const TreePath& treePath, Range&& y) const
│ │ │ │ -
95 {
│ │ │ │ -
96 return y[indices_[node.treeIndex()]];
│ │ │ │ -
97 }
│ │ │ │ -
│ │ │ │ -
98
│ │ │ │ -
99 template<class Node, class TreePath, class Range,
│ │ │ │ -
100 std::enable_if_t< not models<Concept::HasIndexAccess, Range, decltype(std::declval<Node>().treeIndex())>() or Tree::isLeaf, int> = 0>
│ │ │ │ -
│ │ │ │ -
101 decltype(auto) operator()(const Node& node, const TreePath& treePath, Range&& y) const
│ │ │ │ -
102 {
│ │ │ │ -
103 return std::forward<Range>(y);
│ │ │ │ -
104 }
│ │ │ │ -
│ │ │ │ -
105
│ │ │ │ -
106 std::vector<std::size_t> indices_;
│ │ │ │ -
107};
│ │ │ │ -
│ │ │ │ -
108
│ │ │ │ -
109
│ │ │ │ +
23namespace Dune::Functions::Impl
│ │ │ │ +
24{
│ │ │ │ +
25
│ │ │ │ +
39 struct ContravariantPiolaTransformator
│ │ │ │ +
40 {
│ │ │ │ +
45 template<typename Values, typename LocalCoordinate, typename Geometry>
│ │ │ │ +
46 static auto apply(Values& values,
│ │ │ │ +
47 const LocalCoordinate& xi,
│ │ │ │ +
48 const Geometry& geometry)
│ │ │ │ +
49 {
│ │ │ │ +
50 auto jacobianTransposed = geometry.jacobianTransposed(xi);
│ │ │ │ +
51 auto integrationElement = geometry.integrationElement(xi);
│ │ │ │ +
52
│ │ │ │ +
53 for (auto& value : values)
│ │ │ │ +
54 {
│ │ │ │ +
55 auto tmp = value;
│ │ │ │ +
56 jacobianTransposed.mtv(tmp, value);
│ │ │ │ +
57 value /= integrationElement;
│ │ │ │ +
58 }
│ │ │ │ +
59 }
│ │ │ │ +
60
│ │ │ │ +
70 template<typename Gradients, typename LocalCoordinate, typename Geometry>
│ │ │ │ +
71 static auto applyJacobian(Gradients& gradients,
│ │ │ │ +
72 const LocalCoordinate& xi,
│ │ │ │ +
73 const Geometry& geometry)
│ │ │ │ +
74 {
│ │ │ │ +
75 auto jacobianTransposed = geometry.jacobianTransposed(xi);
│ │ │ │ +
76 auto integrationElement = geometry.integrationElement(xi);
│ │ │ │ +
77 for (auto& gradient : gradients)
│ │ │ │ +
78 {
│ │ │ │ +
79 auto tmp = gradient;
│ │ │ │ +
80 gradient = 0;
│ │ │ │ +
81 for (size_t k=0; k<gradient.M(); k++)
│ │ │ │ +
82 for (size_t l=0; l<tmp.N(); l++)
│ │ │ │ +
83 // Use sparseRange because jacobianTransposed may be a sparse DiagonalMatrix
│ │ │ │ +
84 for(auto&& [jacobianTransposed_l_j, j] : sparseRange(jacobianTransposed[l]))
│ │ │ │ +
85 gradient[j][k] += jacobianTransposed_l_j * tmp[l][k];
│ │ │ │ +
86 gradient /= integrationElement;
│ │ │ │ +
87 }
│ │ │ │ +
88 }
│ │ │ │ +
89
│ │ │ │ +
97 template<class Function, class LocalCoordinate, class Element>
│ │ │ │ +
98 class LocalValuedFunction
│ │ │ │ +
99 {
│ │ │ │ +
100 const Function& f_;
│ │ │ │ +
101 const Element& element_;
│ │ │ │ +
102
│ │ │ │ +
103 using LocalValue = LocalCoordinate;
│ │ │ │ +
104
│ │ │ │ +
105 public:
│ │ │ │ +
106
│ │ │ │ +
107 LocalValuedFunction(const Function& f, const Element& element)
│ │ │ │ +
108 : f_(f), element_(element)
│ │ │ │ +
109 {}
│ │ │ │
110
│ │ │ │ -
111template<class Tree>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
113{
│ │ │ │ -
114 return DefaultNodeToRangeMap<Tree>(tree);
│ │ │ │ -
115}
│ │ │ │ -
│ │ │ │ -
116
│ │ │ │ -
117
│ │ │ │ +
111 auto operator()(const LocalCoordinate& xi) const
│ │ │ │ +
112 {
│ │ │ │ +
113 auto globalValue = f_(xi);
│ │ │ │ +
114
│ │ │ │ +
115 // Apply the inverse Piola transform
│ │ │ │ +
116 auto jacobianInverseTransposed = element_.geometry().jacobianInverseTransposed(xi);
│ │ │ │ +
117 auto integrationElement = element_.geometry().integrationElement(xi);
│ │ │ │
118
│ │ │ │ -
119template<class Basis, class TreePath>
│ │ │ │ -
│ │ │ │ -
120auto makeDefaultNodeToRangeMap(const Basis& basis, TreePath&& treePath)
│ │ │ │ -
121 -> decltype(makeDefaultNodeToRangeMap(TypeTree::child(basis.localView().tree(),treePath)))
│ │ │ │ -
122{
│ │ │ │ -
123 auto&& localView = basis.localView();
│ │ │ │ -
124 localView.bind(*basis.gridView().template begin<0>());
│ │ │ │ -
125 auto&& tree = TypeTree::child(localView.tree(),treePath);
│ │ │ │ -
126 return makeDefaultNodeToRangeMap(tree);
│ │ │ │ -
127}
│ │ │ │ -
│ │ │ │ -
128
│ │ │ │ -
129
│ │ │ │ -
130
│ │ │ │ -
131} // namespace Dune::Functions
│ │ │ │ -
132} // namespace Dune
│ │ │ │ -
133
│ │ │ │ -
134
│ │ │ │ -
135#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTNODETORANGEMAP_HH
│ │ │ │ -
Definition polynomial.hh:17
│ │ │ │ -
DefaultNodeToRangeMap< Tree > makeDefaultNodeToRangeMap(const Tree &tree)
Definition defaultnodetorangemap.hh:112
│ │ │ │ -
A simple node to range map using lexicographic ordering.
Definition defaultnodetorangemap.hh:48
│ │ │ │ -
std::vector< std::size_t > indices_
Definition defaultnodetorangemap.hh:106
│ │ │ │ -
DefaultNodeToRangeMap(const Tree &tree)
Construct DefaultNodeToRangeMap.
Definition defaultnodetorangemap.hh:87
│ │ │ │ -
Definition defaultnodetorangemap.hh:58
│ │ │ │ -
Visitor(std::vector< std::size_t > &indices)
Definition defaultnodetorangemap.hh:59
│ │ │ │ -
void leaf(Node &node, TreePath treePath)
Definition defaultnodetorangemap.hh:65
│ │ │ │ -
std::size_t counter_
Definition defaultnodetorangemap.hh:74
│ │ │ │ -
std::vector< std::size_t > & indices_
Definition defaultnodetorangemap.hh:73
│ │ │ │ - │ │ │ │ +
119 auto localValue = LocalValue{};
│ │ │ │ +
120 jacobianInverseTransposed.mtv(globalValue, localValue);
│ │ │ │ +
121 localValue *= integrationElement;
│ │ │ │ +
122
│ │ │ │ +
123 return localValue;
│ │ │ │ +
124 }
│ │ │ │ +
125 };
│ │ │ │ +
126 };
│ │ │ │ +
127
│ │ │ │ +
141 struct CovariantPiolaTransformator
│ │ │ │ +
142 {
│ │ │ │ +
147 template<typename Values, typename LocalCoordinate, typename Geometry>
│ │ │ │ +
148 static auto apply(Values& values,
│ │ │ │ +
149 const LocalCoordinate& xi,
│ │ │ │ +
150 const Geometry& geometry)
│ │ │ │ +
151 {
│ │ │ │ +
152 auto jacobianInverseTransposed = geometry.jacobianInverseTransposed(xi);
│ │ │ │ +
153
│ │ │ │ +
154 for (auto& value : values)
│ │ │ │ +
155 {
│ │ │ │ +
156 auto tmp = value;
│ │ │ │ +
157 jacobianInverseTransposed.mv(tmp, value);
│ │ │ │ +
158 }
│ │ │ │ +
159 }
│ │ │ │ +
160
│ │ │ │ +
170 template<typename Gradients, typename LocalCoordinate, typename Geometry>
│ │ │ │ +
171 static auto applyJacobian(Gradients& gradients,
│ │ │ │ +
172 const LocalCoordinate& xi,
│ │ │ │ +
173 const Geometry& geometry)
│ │ │ │ +
174 {
│ │ │ │ +
175 auto jacobianInverseTransposed = geometry.jacobianInverseTransposed(xi);
│ │ │ │ +
176
│ │ │ │ +
177 for (auto& gradient : gradients)
│ │ │ │ +
178 {
│ │ │ │ +
179 auto tmp = gradient;
│ │ │ │ +
180 gradient = 0;
│ │ │ │ +
181 for (size_t j=0; j<gradient.N(); j++)
│ │ │ │ +
182 for (size_t k=0; k<gradient.M(); k++)
│ │ │ │ +
183 // Use sparseRange because jacobianTransposed may be a sparse DiagonalMatrix
│ │ │ │ +
184 for(auto&& [jacobianInverseTransposed_j_l, l] : sparseRange(jacobianInverseTransposed[j]))
│ │ │ │ +
185 gradient[j][k] += jacobianInverseTransposed_j_l * tmp[l][k];
│ │ │ │ +
186 }
│ │ │ │ +
187 }
│ │ │ │ +
188
│ │ │ │ +
196 template<class Function, class LocalCoordinate, class Element>
│ │ │ │ +
197 class LocalValuedFunction
│ │ │ │ +
198 {
│ │ │ │ +
199 const Function& f_;
│ │ │ │ +
200 const Element& element_;
│ │ │ │ +
201
│ │ │ │ +
202 public:
│ │ │ │ +
203
│ │ │ │ +
204 LocalValuedFunction(const Function& f, const Element& element)
│ │ │ │ +
205 : f_(f), element_(element)
│ │ │ │ +
206 {}
│ │ │ │ +
207
│ │ │ │ +
208 auto operator()(const LocalCoordinate& xi) const
│ │ │ │ +
209 {
│ │ │ │ +
210 auto globalValue = f_(xi);
│ │ │ │ +
211
│ │ │ │ +
212 // Apply the inverse Piola transform
│ │ │ │ +
213 auto jacobianTransposed = element_.geometry().jacobianTransposed(xi);
│ │ │ │ +
214
│ │ │ │ +
215 auto localValue = globalValue;
│ │ │ │ +
216 jacobianTransposed.mv(globalValue, localValue);
│ │ │ │ +
217
│ │ │ │ +
218 return localValue;
│ │ │ │ +
219 }
│ │ │ │ +
220 };
│ │ │ │ +
221 };
│ │ │ │ +
222
│ │ │ │ +
229 template<class Transformator, class LocalValuedLocalBasis, class Element>
│ │ │ │ +
230 class GlobalValuedLocalBasis
│ │ │ │ +
231 {
│ │ │ │ +
232 public:
│ │ │ │ +
233 using Traits = typename LocalValuedLocalBasis::Traits;
│ │ │ │ +
234
│ │ │ │ +
237 void bind(const LocalValuedLocalBasis& localValuedLocalBasis, const Element& element)
│ │ │ │ +
238 {
│ │ │ │ +
239 localValuedLocalBasis_ = &localValuedLocalBasis;
│ │ │ │ +
240 element_ = &element;
│ │ │ │ +
241 }
│ │ │ │ +
242
│ │ │ │ +
245 auto size() const
│ │ │ │ +
246 {
│ │ │ │ +
247 return localValuedLocalBasis_->size();
│ │ │ │ +
248 }
│ │ │ │ +
249
│ │ │ │ +
251 void evaluateFunction(const typename Traits::DomainType& x,
│ │ │ │ +
252 std::vector<typename Traits::RangeType>& out) const
│ │ │ │ +
253 {
│ │ │ │ +
254 localValuedLocalBasis_->evaluateFunction(x,out);
│ │ │ │ +
255
│ │ │ │ +
256 Transformator::apply(out, x, element_->geometry());
│ │ │ │ +
257 }
│ │ │ │ +
258
│ │ │ │ +
264 void evaluateJacobian(const typename Traits::DomainType& x,
│ │ │ │ +
265 std::vector<typename Traits::JacobianType>& out) const
│ │ │ │ +
266 {
│ │ │ │ +
267 localValuedLocalBasis_->evaluateJacobian(x,out);
│ │ │ │ +
268
│ │ │ │ +
269 Transformator::applyJacobian(out, x, element_->geometry());
│ │ │ │ +
270 }
│ │ │ │ +
271
│ │ │ │ +
278 void partial(const std::array<unsigned int,2>& order,
│ │ │ │ +
279 const typename Traits::DomainType& x,
│ │ │ │ +
280 std::vector<typename Traits::RangeType>& out) const
│ │ │ │ +
281 {
│ │ │ │ +
282 auto totalOrder = std::accumulate(order.begin(), order.end(), 0);
│ │ │ │ +
283 if (totalOrder == 0) {
│ │ │ │ +
284 evaluateFunction(x, out);
│ │ │ │ +
285 } else if (totalOrder == 1) {
│ │ │ │ +
286 auto const direction = std::distance(order.begin(), std::find(order.begin(), order.end(), 1));
│ │ │ │ +
287 out.resize(size());
│ │ │ │ +
288
│ │ │ │ +
289 // TODO: The following is wasteful: We compute the full Jacobian and then return
│ │ │ │ +
290 // only a part of it. While we need the full Jacobian of the underlying local-valued LFE,
│ │ │ │ +
291 // it should be possible to compute only a partial Piola transform for the requested
│ │ │ │ +
292 // partial derivatives.
│ │ │ │ +
293 std::vector<typename Traits::JacobianType> fullJacobian;
│ │ │ │ +
294 localValuedLocalBasis_->evaluateJacobian(x,fullJacobian);
│ │ │ │ +
295
│ │ │ │ +
296 Transformator::applyJacobian(fullJacobian, x, element_->geometry());
│ │ │ │ +
297
│ │ │ │ +
298 for (std::size_t i=0; i<out.size(); i++)
│ │ │ │ +
299 for (std::size_t j=0; j<out[i].size(); j++)
│ │ │ │ +
300 out[i][j] = fullJacobian[i][j][direction];
│ │ │ │ +
301
│ │ │ │ +
302 } else
│ │ │ │ +
303 DUNE_THROW(NotImplemented, "Partial derivatives of order 2 or higher");
│ │ │ │ +
304 }
│ │ │ │ +
305
│ │ │ │ +
307 auto order() const
│ │ │ │ +
308 {
│ │ │ │ +
309 return localValuedLocalBasis_->order();
│ │ │ │ +
310 }
│ │ │ │ +
311
│ │ │ │ +
312 const LocalValuedLocalBasis* localValuedLocalBasis_;
│ │ │ │ +
313 const Element* element_;
│ │ │ │ +
314 };
│ │ │ │ +
315
│ │ │ │ +
324 template<class Transformator, class LocalValuedLocalInterpolation, class Element>
│ │ │ │ +
325 class GlobalValuedLocalInterpolation
│ │ │ │ +
326 {
│ │ │ │ +
327 public:
│ │ │ │ +
330 void bind(const LocalValuedLocalInterpolation& localValuedLocalInterpolation, const Element& element)
│ │ │ │ +
331 {
│ │ │ │ +
332 localValuedLocalInterpolation_ = &localValuedLocalInterpolation;
│ │ │ │ +
333 element_ = &element;
│ │ │ │ +
334 }
│ │ │ │ +
335
│ │ │ │ +
336 template<typename F, typename C>
│ │ │ │ +
337 void interpolate (const F& f, std::vector<C>& out) const
│ │ │ │ +
338 {
│ │ │ │ +
339 using LocalCoordinate = typename Element::Geometry::LocalCoordinate;
│ │ │ │ +
340 typename Transformator::template LocalValuedFunction<F,LocalCoordinate,Element> localValuedFunction(f, *element_);
│ │ │ │ +
341 localValuedLocalInterpolation_->interpolate(localValuedFunction, out);
│ │ │ │ +
342 }
│ │ │ │ +
343
│ │ │ │ +
344 private:
│ │ │ │ +
345 const LocalValuedLocalInterpolation* localValuedLocalInterpolation_;
│ │ │ │ +
346 const Element* element_;
│ │ │ │ +
347 };
│ │ │ │ +
348
│ │ │ │ +
349
│ │ │ │ +
356 template<class Transformator, class LocalValuedLFE, class Element>
│ │ │ │ +
357 class GlobalValuedLocalFiniteElement
│ │ │ │ +
358 {
│ │ │ │ +
359 using LocalBasis = GlobalValuedLocalBasis<Transformator,
│ │ │ │ +
360 typename LocalValuedLFE::Traits::LocalBasisType,
│ │ │ │ +
361 Element>;
│ │ │ │ +
362 using LocalInterpolation = GlobalValuedLocalInterpolation<Transformator,
│ │ │ │ +
363 typename LocalValuedLFE::Traits::LocalInterpolationType,
│ │ │ │ +
364 Element>;
│ │ │ │ +
365
│ │ │ │ +
366 public:
│ │ │ │ +
369 using Traits = LocalFiniteElementTraits<LocalBasis,
│ │ │ │ +
370 typename LocalValuedLFE::Traits::LocalCoefficientsType,
│ │ │ │ +
371 LocalInterpolation>;
│ │ │ │ +
372
│ │ │ │ +
373 GlobalValuedLocalFiniteElement() {}
│ │ │ │ +
374
│ │ │ │ +
375 void bind(const LocalValuedLFE& localValuedLFE, const Element& element)
│ │ │ │ +
376 {
│ │ │ │ +
377 globalValuedLocalBasis_.bind(localValuedLFE.localBasis(), element);
│ │ │ │ +
378 globalValuedLocalInterpolation_.bind(localValuedLFE.localInterpolation(), element);
│ │ │ │ +
379 localValuedLFE_ = &localValuedLFE;
│ │ │ │ +
380 }
│ │ │ │ +
381
│ │ │ │ +
384 const typename Traits::LocalBasisType& localBasis() const
│ │ │ │ +
385 {
│ │ │ │ +
386 return globalValuedLocalBasis_;
│ │ │ │ +
387 }
│ │ │ │ +
388
│ │ │ │ +
391 const typename Traits::LocalCoefficientsType& localCoefficients() const
│ │ │ │ +
392 {
│ │ │ │ +
393 return localValuedLFE_->localCoefficients();
│ │ │ │ +
394 }
│ │ │ │ +
395
│ │ │ │ +
398 const typename Traits::LocalInterpolationType& localInterpolation() const
│ │ │ │ +
399 {
│ │ │ │ +
400 return globalValuedLocalInterpolation_;
│ │ │ │ +
401 }
│ │ │ │ +
402
│ │ │ │ +
404 std::size_t size() const
│ │ │ │ +
405 {
│ │ │ │ +
406 return localValuedLFE_->size();
│ │ │ │ +
407 }
│ │ │ │ +
408
│ │ │ │ +
411 GeometryType type() const
│ │ │ │ +
412 {
│ │ │ │ +
413 return localValuedLFE_->type();
│ │ │ │ +
414 }
│ │ │ │ +
415
│ │ │ │ +
416 private:
│ │ │ │ +
417
│ │ │ │ +
418 typename Traits::LocalBasisType globalValuedLocalBasis_;
│ │ │ │ +
419 typename Traits::LocalInterpolationType globalValuedLocalInterpolation_;
│ │ │ │ +
420 const LocalValuedLFE* localValuedLFE_;
│ │ │ │ +
421 };
│ │ │ │ +
422
│ │ │ │ +
423} // namespace Dune::Functions::Impl
│ │ │ │ +
424
│ │ │ │ +
425#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:203
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,156 +1,341 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -defaultnodetorangemap.hh │ │ │ │ │ +globalvaluedlocalfiniteelement.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTNODETORANGEMAP_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTNODETORANGEMAP_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_GLOBALVALUEDLOCALFINITEELEMENT_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_GLOBALVALUEDLOCALFINITEELEMENT_HH │ │ │ │ │ 9 │ │ │ │ │ -10#warning The header dune/functions/common/defaultnodetorangemap.hh is │ │ │ │ │ -deprecated and will be removed after release 2.10. │ │ │ │ │ -11 │ │ │ │ │ -12#include │ │ │ │ │ -13 │ │ │ │ │ -14#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ -15 │ │ │ │ │ -16#include │ │ │ │ │ -17#include │ │ │ │ │ -18 │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12 │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17 │ │ │ │ │ +18#include │ │ │ │ │ 19 │ │ │ │ │ -20namespace _D_u_n_e { │ │ │ │ │ -21namespace Functions { │ │ │ │ │ +20#include │ │ │ │ │ +21#include │ │ │ │ │ 22 │ │ │ │ │ -23 │ │ │ │ │ -24 │ │ │ │ │ -44template │ │ │ │ │ -_4_5struct │ │ │ │ │ -46[[deprecated("DefaultNodeToRangeMap is deprecated and will be removed after │ │ │ │ │ -release 2.10.")]] │ │ │ │ │ -47_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p │ │ │ │ │ -48{ │ │ │ │ │ -49 │ │ │ │ │ -50 // A simple visitor for computing lexicographic │ │ │ │ │ -51 // subtree indices. To identify a leaf node │ │ │ │ │ -52 // we use its treeIndex() which is unique │ │ │ │ │ -53 // wrt the whole tree and store the computed │ │ │ │ │ -54 // index in a vector indexed by the tree indices. │ │ │ │ │ -_5_5 struct _V_i_s_i_t_o_r │ │ │ │ │ -56 : public TypeTree::TreeVisitor │ │ │ │ │ -57 , public TypeTree::DynamicTraversal │ │ │ │ │ -58 { │ │ │ │ │ -_5_9 _V_i_s_i_t_o_r(std::vector& indices) : │ │ │ │ │ -60 indices_(indices), │ │ │ │ │ -61 counter_(0) │ │ │ │ │ -62 {} │ │ │ │ │ -63 │ │ │ │ │ -64 template │ │ │ │ │ -_6_5 void _l_e_a_f(Node& node, TreePath treePath) │ │ │ │ │ -66 { │ │ │ │ │ -67 if (indices_.size() < node.treeIndex()+1) │ │ │ │ │ -68 indices_.resize(node.treeIndex()+1); │ │ │ │ │ -69 indices_[node.treeIndex()] = counter_; │ │ │ │ │ -70 ++counter_; │ │ │ │ │ -71 } │ │ │ │ │ -72 │ │ │ │ │ -_7_3 std::vector& _i_n_d_i_c_e_s__; │ │ │ │ │ -_7_4 std::size_t _c_o_u_n_t_e_r__; │ │ │ │ │ -75 }; │ │ │ │ │ -76 │ │ │ │ │ -_8_7 _D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p(const Tree& tree) │ │ │ │ │ -88 { │ │ │ │ │ -89 TypeTree::applyToTree(tree, _V_i_s_i_t_o_r(indices_)); │ │ │ │ │ -90 } │ │ │ │ │ -91 │ │ │ │ │ -92 template().treeIndex())>() and not Tree::isLeaf, int> = 0> │ │ │ │ │ -_9_4 decltype(auto) operator()(const Node& node, const TreePath& treePath, │ │ │ │ │ -Range&& y) const │ │ │ │ │ -95 { │ │ │ │ │ -96 return y[indices_[node.treeIndex()]]; │ │ │ │ │ -97 } │ │ │ │ │ -98 │ │ │ │ │ -99 template().treeIndex())>() or Tree::isLeaf, int> = 0> │ │ │ │ │ -_1_0_1 decltype(auto) operator()(const Node& node, const TreePath& treePath, │ │ │ │ │ -Range&& y) const │ │ │ │ │ -102 { │ │ │ │ │ -103 return std::forward(y); │ │ │ │ │ -104 } │ │ │ │ │ -105 │ │ │ │ │ -_1_0_6 std::vector _i_n_d_i_c_e_s__; │ │ │ │ │ -107}; │ │ │ │ │ -108 │ │ │ │ │ -109 │ │ │ │ │ +23namespace Dune::Functions::Impl │ │ │ │ │ +24{ │ │ │ │ │ +25 │ │ │ │ │ +39 struct ContravariantPiolaTransformator │ │ │ │ │ +40 { │ │ │ │ │ +45 template │ │ │ │ │ +46 static auto apply(Values& values, │ │ │ │ │ +47 const LocalCoordinate& xi, │ │ │ │ │ +48 const Geometry& geometry) │ │ │ │ │ +49 { │ │ │ │ │ +50 auto jacobianTransposed = geometry.jacobianTransposed(xi); │ │ │ │ │ +51 auto integrationElement = geometry.integrationElement(xi); │ │ │ │ │ +52 │ │ │ │ │ +53 for (auto& value : values) │ │ │ │ │ +54 { │ │ │ │ │ +55 auto tmp = value; │ │ │ │ │ +56 jacobianTransposed.mtv(tmp, value); │ │ │ │ │ +57 value /= integrationElement; │ │ │ │ │ +58 } │ │ │ │ │ +59 } │ │ │ │ │ +60 │ │ │ │ │ +70 template │ │ │ │ │ +71 static auto applyJacobian(Gradients& gradients, │ │ │ │ │ +72 const LocalCoordinate& xi, │ │ │ │ │ +73 const Geometry& geometry) │ │ │ │ │ +74 { │ │ │ │ │ +75 auto jacobianTransposed = geometry.jacobianTransposed(xi); │ │ │ │ │ +76 auto integrationElement = geometry.integrationElement(xi); │ │ │ │ │ +77 for (auto& gradient : gradients) │ │ │ │ │ +78 { │ │ │ │ │ +79 auto tmp = gradient; │ │ │ │ │ +80 gradient = 0; │ │ │ │ │ +81 for (size_t k=0; k │ │ │ │ │ +98 class LocalValuedFunction │ │ │ │ │ +99 { │ │ │ │ │ +100 const Function& f_; │ │ │ │ │ +101 const Element& element_; │ │ │ │ │ +102 │ │ │ │ │ +103 using LocalValue = LocalCoordinate; │ │ │ │ │ +104 │ │ │ │ │ +105 public: │ │ │ │ │ +106 │ │ │ │ │ +107 LocalValuedFunction(const Function& f, const Element& element) │ │ │ │ │ +108 : f_(f), element_(element) │ │ │ │ │ +109 {} │ │ │ │ │ 110 │ │ │ │ │ -111template │ │ │ │ │ -_1_1_2_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p_<_T_r_e_e_> _m_a_k_e_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p(const Tree& tree) │ │ │ │ │ -113{ │ │ │ │ │ -114 return _D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p_<_T_r_e_e_>(tree); │ │ │ │ │ -115} │ │ │ │ │ -116 │ │ │ │ │ -117 │ │ │ │ │ +111 auto operator()(const LocalCoordinate& xi) const │ │ │ │ │ +112 { │ │ │ │ │ +113 auto globalValue = f_(xi); │ │ │ │ │ +114 │ │ │ │ │ +115 // Apply the inverse Piola transform │ │ │ │ │ +116 auto jacobianInverseTransposed = element_.geometry │ │ │ │ │ +().jacobianInverseTransposed(xi); │ │ │ │ │ +117 auto integrationElement = element_.geometry().integrationElement(xi); │ │ │ │ │ 118 │ │ │ │ │ -119template │ │ │ │ │ -_1_2_0auto _m_a_k_e_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p(const Basis& basis, TreePath&& treePath) │ │ │ │ │ -121 -> decltype(_m_a_k_e_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p(TypeTree::child(basis.localView │ │ │ │ │ -().tree(),treePath))) │ │ │ │ │ -122{ │ │ │ │ │ -123 auto&& localView = basis.localView(); │ │ │ │ │ -124 localView.bind(*basis.gridView().template begin<0>()); │ │ │ │ │ -125 auto&& tree = TypeTree::child(localView.tree(),treePath); │ │ │ │ │ -126 return _m_a_k_e_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p(tree); │ │ │ │ │ -127} │ │ │ │ │ -128 │ │ │ │ │ -129 │ │ │ │ │ -130 │ │ │ │ │ -131} // namespace Dune::Functions │ │ │ │ │ -132} // namespace Dune │ │ │ │ │ -133 │ │ │ │ │ -134 │ │ │ │ │ -135#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTNODETORANGEMAP_HH │ │ │ │ │ -_D_u_n_e │ │ │ │ │ -DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_m_a_k_e_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p │ │ │ │ │ -DefaultNodeToRangeMap< Tree > makeDefaultNodeToRangeMap(const Tree &tree) │ │ │ │ │ -DDeeffiinniittiioonn defaultnodetorangemap.hh:112 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p │ │ │ │ │ -A simple node to range map using lexicographic ordering. │ │ │ │ │ -DDeeffiinniittiioonn defaultnodetorangemap.hh:48 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p_:_:_i_n_d_i_c_e_s__ │ │ │ │ │ -std::vector< std::size_t > indices_ │ │ │ │ │ -DDeeffiinniittiioonn defaultnodetorangemap.hh:106 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p_:_:_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p │ │ │ │ │ -DefaultNodeToRangeMap(const Tree &tree) │ │ │ │ │ -Construct DefaultNodeToRangeMap. │ │ │ │ │ -DDeeffiinniittiioonn defaultnodetorangemap.hh:87 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p_:_:_V_i_s_i_t_o_r │ │ │ │ │ -DDeeffiinniittiioonn defaultnodetorangemap.hh:58 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p_:_:_V_i_s_i_t_o_r_:_:_V_i_s_i_t_o_r │ │ │ │ │ -Visitor(std::vector< std::size_t > &indices) │ │ │ │ │ -DDeeffiinniittiioonn defaultnodetorangemap.hh:59 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p_:_:_V_i_s_i_t_o_r_:_:_l_e_a_f │ │ │ │ │ -void leaf(Node &node, TreePath treePath) │ │ │ │ │ -DDeeffiinniittiioonn defaultnodetorangemap.hh:65 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p_:_:_V_i_s_i_t_o_r_:_:_c_o_u_n_t_e_r__ │ │ │ │ │ -std::size_t counter_ │ │ │ │ │ -DDeeffiinniittiioonn defaultnodetorangemap.hh:74 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_N_o_d_e_T_o_R_a_n_g_e_M_a_p_:_:_V_i_s_i_t_o_r_:_:_i_n_d_i_c_e_s__ │ │ │ │ │ -std::vector< std::size_t > & indices_ │ │ │ │ │ -DDeeffiinniittiioonn defaultnodetorangemap.hh:73 │ │ │ │ │ -_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ +119 auto localValue = LocalValue{}; │ │ │ │ │ +120 jacobianInverseTransposed.mtv(globalValue, localValue); │ │ │ │ │ +121 localValue *= integrationElement; │ │ │ │ │ +122 │ │ │ │ │ +123 return localValue; │ │ │ │ │ +124 } │ │ │ │ │ +125 }; │ │ │ │ │ +126 }; │ │ │ │ │ +127 │ │ │ │ │ +141 struct CovariantPiolaTransformator │ │ │ │ │ +142 { │ │ │ │ │ +147 template │ │ │ │ │ +148 static auto apply(Values& values, │ │ │ │ │ +149 const LocalCoordinate& xi, │ │ │ │ │ +150 const Geometry& geometry) │ │ │ │ │ +151 { │ │ │ │ │ +152 auto jacobianInverseTransposed = geometry.jacobianInverseTransposed(xi); │ │ │ │ │ +153 │ │ │ │ │ +154 for (auto& value : values) │ │ │ │ │ +155 { │ │ │ │ │ +156 auto tmp = value; │ │ │ │ │ +157 jacobianInverseTransposed.mv(tmp, value); │ │ │ │ │ +158 } │ │ │ │ │ +159 } │ │ │ │ │ +160 │ │ │ │ │ +170 template │ │ │ │ │ +171 static auto applyJacobian(Gradients& gradients, │ │ │ │ │ +172 const LocalCoordinate& xi, │ │ │ │ │ +173 const Geometry& geometry) │ │ │ │ │ +174 { │ │ │ │ │ +175 auto jacobianInverseTransposed = geometry.jacobianInverseTransposed(xi); │ │ │ │ │ +176 │ │ │ │ │ +177 for (auto& gradient : gradients) │ │ │ │ │ +178 { │ │ │ │ │ +179 auto tmp = gradient; │ │ │ │ │ +180 gradient = 0; │ │ │ │ │ +181 for (size_t j=0; j │ │ │ │ │ +197 class LocalValuedFunction │ │ │ │ │ +198 { │ │ │ │ │ +199 const Function& f_; │ │ │ │ │ +200 const Element& element_; │ │ │ │ │ +201 │ │ │ │ │ +202 public: │ │ │ │ │ +203 │ │ │ │ │ +204 LocalValuedFunction(const Function& f, const Element& element) │ │ │ │ │ +205 : f_(f), element_(element) │ │ │ │ │ +206 {} │ │ │ │ │ +207 │ │ │ │ │ +208 auto operator()(const LocalCoordinate& xi) const │ │ │ │ │ +209 { │ │ │ │ │ +210 auto globalValue = f_(xi); │ │ │ │ │ +211 │ │ │ │ │ +212 // Apply the inverse Piola transform │ │ │ │ │ +213 auto jacobianTransposed = element_.geometry().jacobianTransposed(xi); │ │ │ │ │ +214 │ │ │ │ │ +215 auto localValue = globalValue; │ │ │ │ │ +216 jacobianTransposed.mv(globalValue, localValue); │ │ │ │ │ +217 │ │ │ │ │ +218 return localValue; │ │ │ │ │ +219 } │ │ │ │ │ +220 }; │ │ │ │ │ +221 }; │ │ │ │ │ +222 │ │ │ │ │ +229 template │ │ │ │ │ +230 class GlobalValuedLocalBasis │ │ │ │ │ +231 { │ │ │ │ │ +232 public: │ │ │ │ │ +233 using Traits = typename LocalValuedLocalBasis::Traits; │ │ │ │ │ +234 │ │ │ │ │ +237 void bind(const LocalValuedLocalBasis& localValuedLocalBasis, const │ │ │ │ │ +Element& element) │ │ │ │ │ +238 { │ │ │ │ │ +239 localValuedLocalBasis_ = &localValuedLocalBasis; │ │ │ │ │ +240 element_ = &element; │ │ │ │ │ +241 } │ │ │ │ │ +242 │ │ │ │ │ +245 auto size() const │ │ │ │ │ +246 { │ │ │ │ │ +247 return localValuedLocalBasis_->size(); │ │ │ │ │ +248 } │ │ │ │ │ +249 │ │ │ │ │ +251 void evaluateFunction(const typename Traits::DomainType& x, │ │ │ │ │ +252 std::vector& out) const │ │ │ │ │ +253 { │ │ │ │ │ +254 localValuedLocalBasis_->evaluateFunction(x,out); │ │ │ │ │ +255 │ │ │ │ │ +256 Transformator::apply(out, x, element_->geometry()); │ │ │ │ │ +257 } │ │ │ │ │ +258 │ │ │ │ │ +264 void evaluateJacobian(const typename Traits::DomainType& x, │ │ │ │ │ +265 std::vector& out) const │ │ │ │ │ +266 { │ │ │ │ │ +267 localValuedLocalBasis_->evaluateJacobian(x,out); │ │ │ │ │ +268 │ │ │ │ │ +269 Transformator::applyJacobian(out, x, element_->geometry()); │ │ │ │ │ +270 } │ │ │ │ │ +271 │ │ │ │ │ +278 void partial(const std::array& order, │ │ │ │ │ +279 const typename Traits::DomainType& x, │ │ │ │ │ +280 std::vector& out) const │ │ │ │ │ +281 { │ │ │ │ │ +282 auto totalOrder = std::accumulate(order.begin(), order.end(), 0); │ │ │ │ │ +283 if (totalOrder == 0) { │ │ │ │ │ +284 evaluateFunction(x, out); │ │ │ │ │ +285 } else if (totalOrder == 1) { │ │ │ │ │ +286 auto const direction = std::distance(order.begin(), std::find(order.begin │ │ │ │ │ +(), order.end(), 1)); │ │ │ │ │ +287 out.resize(size()); │ │ │ │ │ +288 │ │ │ │ │ +289 // TODO: The following is wasteful: We compute the full Jacobian and then │ │ │ │ │ +return │ │ │ │ │ +290 // only a part of it. While we need the full Jacobian of the underlying │ │ │ │ │ +local-valued LFE, │ │ │ │ │ +291 // it should be possible to compute only a partial Piola transform for the │ │ │ │ │ +requested │ │ │ │ │ +292 // partial derivatives. │ │ │ │ │ +293 std::vector fullJacobian; │ │ │ │ │ +294 localValuedLocalBasis_->evaluateJacobian(x,fullJacobian); │ │ │ │ │ +295 │ │ │ │ │ +296 Transformator::applyJacobian(fullJacobian, x, element_->geometry()); │ │ │ │ │ +297 │ │ │ │ │ +298 for (std::size_t i=0; iorder(); │ │ │ │ │ +310 } │ │ │ │ │ +311 │ │ │ │ │ +312 const LocalValuedLocalBasis* localValuedLocalBasis_; │ │ │ │ │ +313 const Element* element_; │ │ │ │ │ +314 }; │ │ │ │ │ +315 │ │ │ │ │ +324 template │ │ │ │ │ +325 class GlobalValuedLocalInterpolation │ │ │ │ │ +326 { │ │ │ │ │ +327 public: │ │ │ │ │ +330 void bind(const LocalValuedLocalInterpolation& │ │ │ │ │ +localValuedLocalInterpolation, const Element& element) │ │ │ │ │ +331 { │ │ │ │ │ +332 localValuedLocalInterpolation_ = &localValuedLocalInterpolation; │ │ │ │ │ +333 element_ = &element; │ │ │ │ │ +334 } │ │ │ │ │ +335 │ │ │ │ │ +336 template │ │ │ │ │ +337 void _i_n_t_e_r_p_o_l_a_t_e (const F& f, std::vector& out) const │ │ │ │ │ +338 { │ │ │ │ │ +339 using LocalCoordinate = typename Element::Geometry::LocalCoordinate; │ │ │ │ │ +340 typename Transformator::template │ │ │ │ │ +LocalValuedFunction localValuedFunction(f, │ │ │ │ │ +*element_); │ │ │ │ │ +341 localValuedLocalInterpolation_->interpolate(localValuedFunction, out); │ │ │ │ │ +342 } │ │ │ │ │ +343 │ │ │ │ │ +344 private: │ │ │ │ │ +345 const LocalValuedLocalInterpolation* localValuedLocalInterpolation_; │ │ │ │ │ +346 const Element* element_; │ │ │ │ │ +347 }; │ │ │ │ │ +348 │ │ │ │ │ +349 │ │ │ │ │ +356 template │ │ │ │ │ +357 class GlobalValuedLocalFiniteElement │ │ │ │ │ +358 { │ │ │ │ │ +359 using LocalBasis = GlobalValuedLocalBasis; │ │ │ │ │ +362 using LocalInterpolation = GlobalValuedLocalInterpolation; │ │ │ │ │ +365 │ │ │ │ │ +366 public: │ │ │ │ │ +369 using Traits = LocalFiniteElementTraits; │ │ │ │ │ +372 │ │ │ │ │ +373 GlobalValuedLocalFiniteElement() {} │ │ │ │ │ +374 │ │ │ │ │ +375 void bind(const LocalValuedLFE& localValuedLFE, const Element& element) │ │ │ │ │ +376 { │ │ │ │ │ +377 globalValuedLocalBasis_.bind(localValuedLFE.localBasis(), element); │ │ │ │ │ +378 globalValuedLocalInterpolation_.bind(localValuedLFE.localInterpolation(), │ │ │ │ │ +element); │ │ │ │ │ +379 localValuedLFE_ = &localValuedLFE; │ │ │ │ │ +380 } │ │ │ │ │ +381 │ │ │ │ │ +384 const typename Traits::LocalBasisType& localBasis() const │ │ │ │ │ +385 { │ │ │ │ │ +386 return globalValuedLocalBasis_; │ │ │ │ │ +387 } │ │ │ │ │ +388 │ │ │ │ │ +391 const typename Traits::LocalCoefficientsType& localCoefficients() const │ │ │ │ │ +392 { │ │ │ │ │ +393 return localValuedLFE_->localCoefficients(); │ │ │ │ │ +394 } │ │ │ │ │ +395 │ │ │ │ │ +398 const typename Traits::LocalInterpolationType& localInterpolation() const │ │ │ │ │ +399 { │ │ │ │ │ +400 return globalValuedLocalInterpolation_; │ │ │ │ │ +401 } │ │ │ │ │ +402 │ │ │ │ │ +404 std::size_t size() const │ │ │ │ │ +405 { │ │ │ │ │ +406 return localValuedLFE_->size(); │ │ │ │ │ +407 } │ │ │ │ │ +408 │ │ │ │ │ +411 GeometryType type() const │ │ │ │ │ +412 { │ │ │ │ │ +413 return localValuedLFE_->type(); │ │ │ │ │ +414 } │ │ │ │ │ +415 │ │ │ │ │ +416 private: │ │ │ │ │ +417 │ │ │ │ │ +418 typename Traits::LocalBasisType globalValuedLocalBasis_; │ │ │ │ │ +419 typename Traits::LocalInterpolationType globalValuedLocalInterpolation_; │ │ │ │ │ +420 const LocalValuedLFE* localValuedLFE_; │ │ │ │ │ +421 }; │ │ │ │ │ +422 │ │ │ │ │ +423} // namespace Dune::Functions::Impl │ │ │ │ │ +424 │ │ │ │ │ +425#endif / │ │ │ │ │ +/ DUNE_FUNCTIONS_FUNCTIONSPACEBASES_GLOBALVALUEDLOCALFINITEELEMENT_HH │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_n_t_e_r_p_o_l_a_t_e │ │ │ │ │ +void interpolate(const B &basis, C &&coeff, const F &f, const BV &bv, const │ │ │ │ │ +NTRE &nodeToRangeEntry) │ │ │ │ │ +Interpolate given function in discrete function space. │ │ │ │ │ +DDeeffiinniittiioonn interpolate.hh:203 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00173.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: subspacebasis.hh File Reference │ │ │ │ +dune-functions: refinedlagrangebasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -72,54 +72,61 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ +Typedefs | │ │ │ │ Functions
│ │ │ │ -
subspacebasis.hh File Reference
│ │ │ │ +
refinedlagrangebasis.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#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>
│ │ │ │ +
#include <type_traits>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/common/math.hh>
│ │ │ │ +#include <dune/localfunctions/refined.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/leafprebasismappermixin.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ +#include <dune/geometry/type.hh>
│ │ │ │ +#include <dune/grid/common/mcmgmapper.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::SubspaceBasis< RB, TP >
class  Dune::Functions::RefinedLagrangePreBasis< GV, k, R >
 A pre-basis for a refined Lagrange bases. More...
 
class  Dune::Functions::RefinedLagrangeNode< 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::RefinedLagrangeBasis = DefaultGlobalBasis< RefinedLagrangePreBasis< GV, k, R > >
 Nodal basis of a continuous Lagrange finite-element space on a uniformly refined simplex element.
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ 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.
 
template<class RootBasis , class... PrefixTreeIndices>
auto Dune::Functions::subspaceBasis (const RootBasis &rootBasis, const PrefixTreeIndices &... prefixTreeIndices)
 
template<int k, typename R = double>
auto Dune::Functions::BasisFactory::refinedLagrange ()
 Create a pre-basis factory that can create a RefinedLagrange pre-basis.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,46 +1,46 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -subspacebasis.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_s_u_b_s_p_a_c_e_l_o_c_a_l_v_i_e_w_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +refinedlagrangebasis.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_a_p_p_e_r_m_i_x_i_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_<_ _R_B_,_ _T_P_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_<_ _G_V_,_ _k_,_ _R_ _> │ │ │ │ │ +  A pre-basis for a refined Lagrange bases. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e_<_ _G_V_,_ _k_,_ _R_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ +namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y │ │ │ │ │ +  │ │ │ │ │ +TTyyppeeddeeffss │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s< │ │ │ │ │ + _R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s< GV, k, R > > │ │ │ │ │ +  Nodal basis of a continuous Lagrange finite-element space on a uniformly │ │ │ │ │ + refined simplex element. │ │ │ │ │ +  │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s (const RB &, const TP) -> _S_u_b_s_p_a_c_e_B_a_s_i_s< │ │ │ │ │ - RB, TP > │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s (const _S_u_b_s_p_a_c_e_B_a_s_i_s< RootRootBasis, │ │ │ │ │ - InnerTP > &rootBasis, const OuterTP &prefixPath) -> _S_u_b_s_p_a_c_e_B_a_s_i_s< std:: │ │ │ │ │ - decay_t< decltype(rootBasis.rootBasis())>, Impl::JoinTreePath_t< InnerTP, │ │ │ │ │ - OuterTP > > │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_u_b_s_p_a_c_e_B_a_s_i_s (const RootBasis &rootBasis, const │ │ │ │ │ - TypeTree::HybridTreePath< PrefixTreeIndices... > &prefixPath) │ │ │ │ │ -  Create _S_u_b_s_p_a_c_e_B_a_s_i_s from a root basis and a prefixPath. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_u_b_s_p_a_c_e_B_a_s_i_s (const RootBasis &rootBasis, const │ │ │ │ │ - PrefixTreeIndices &... prefixTreeIndices) │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_r_e_f_i_n_e_d_L_a_g_r_a_n_g_e () │ │ │ │ │ +  Create a pre-basis factory that can create a RefinedLagrange pre-basis. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00173_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: subspacebasis.hh Source File │ │ │ │ +dune-functions: refinedlagrangebasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,211 +74,222 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
subspacebasis.hh
│ │ │ │ +
refinedlagrangebasis.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACEBASIS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACEBASIS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_REFINEDLAGRANGEBASIS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_REFINEDLAGRANGEBASIS_HH
│ │ │ │
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 {
│ │ │ │ +
10#include <type_traits>
│ │ │ │ +
11
│ │ │ │ +
12#include <dune/common/exceptions.hh>
│ │ │ │ +
13#include <dune/common/math.hh>
│ │ │ │ +
14
│ │ │ │ +
15#include <dune/localfunctions/refined.hh>
│ │ │ │ +
16
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
20
│ │ │ │ +
21#include <dune/geometry/type.hh>
│ │ │ │
22
│ │ │ │ -
23
│ │ │ │ +
23#include <dune/grid/common/mcmgmapper.hh>
│ │ │ │
24
│ │ │ │ -
25namespace Impl {
│ │ │ │ -
26
│ │ │ │ -
27 template<class... Inner, class... Outer>
│ │ │ │ -
28 auto joinTreePaths(const TypeTree::HybridTreePath<Inner...>& inner, const TypeTree::HybridTreePath<Outer...> outer)
│ │ │ │ -
29 {
│ │ │ │ -
30 return TypeTree::HybridTreePath<Inner..., Outer...>(std::tuple_cat(inner._data, outer._data));
│ │ │ │ -
31 }
│ │ │ │ -
32
│ │ │ │ -
33 template<class InnerTP, class OuterTP>
│ │ │ │ -
34 using JoinTreePath_t = std::decay_t<decltype(joinTreePaths(std::declval<InnerTP>(), std::declval<OuterTP>()))>;
│ │ │ │ -
35
│ │ │ │ -
36}
│ │ │ │ -
37
│ │ │ │ -
38
│ │ │ │ -
39
│ │ │ │ -
40template<class RB, class TP>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
42{
│ │ │ │ -
43public:
│ │ │ │ -
44
│ │ │ │ -
45 using RootBasis = RB;
│ │ │ │ -
46
│ │ │ │ -
47 using RootLocalView = typename RootBasis::LocalView;
│ │ │ │ +
25
│ │ │ │ +
26namespace Dune {
│ │ │ │ +
27namespace Functions {
│ │ │ │ +
28
│ │ │ │ +
29template<typename GV, int k, typename R>
│ │ │ │ +
30class RefinedLagrangeNode;
│ │ │ │ +
31
│ │ │ │ +
43template <typename GV, int k, typename R = double>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
45 public LeafPreBasisMapperMixin< GV >
│ │ │ │ +
46{
│ │ │ │ + │ │ │ │
48
│ │ │ │ -
49 using PrefixPath = TP;
│ │ │ │ +
49 static const int dim = GV::dimension;
│ │ │ │
50
│ │ │ │ -
52 using GridView = typename RootBasis::GridView;
│ │ │ │ +
51 // refined basis only implemented for P0 and P1
│ │ │ │ +
52 static_assert(k == 0 || k == 1);
│ │ │ │
53
│ │ │ │ -
55 using MultiIndex = typename RootBasis::MultiIndex;
│ │ │ │ -
56
│ │ │ │ -
57 using size_type = std::size_t;
│ │ │ │ -
58
│ │ │ │ - │ │ │ │ -
61
│ │ │ │ -
62 using SizePrefix = typename RootBasis::SizePrefix;
│ │ │ │ -
63
│ │ │ │ -
64
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
69 {}
│ │ │ │ -
│ │ │ │ -
70
│ │ │ │ -
76 template<class RootRootBasis, class InnerTP, class OuterTP>
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
79 {}
│ │ │ │ -
│ │ │ │ -
80
│ │ │ │ -
81
│ │ │ │ -
│ │ │ │ -
84 const GridView& gridView() const
│ │ │ │ -
85 {
│ │ │ │ -
86 return rootBasis_->gridView();
│ │ │ │ -
87 }
│ │ │ │ -
│ │ │ │ -
88
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
93 {
│ │ │ │ -
94 return rootBasis_->dimension();
│ │ │ │ -
95 }
│ │ │ │ -
│ │ │ │ -
96
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
99 {
│ │ │ │ -
100 return rootBasis_->size();
│ │ │ │ -
101 }
│ │ │ │ -
│ │ │ │ -
102
│ │ │ │ -
│ │ │ │ -
104 size_type size(const SizePrefix& prefix) const
│ │ │ │ -
105 {
│ │ │ │ -
106 return rootBasis_->size(prefix);
│ │ │ │ -
107 }
│ │ │ │ -
│ │ │ │ -
108
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
113 {
│ │ │ │ -
114 return LocalView(*this, prefixPath_);
│ │ │ │ -
115 }
│ │ │ │ +
54 // the layout is defined in terms of a MCMGLayout specialized for k == 0 or 1
│ │ │ │ +
55 static MCMGLayout dofLayout()
│ │ │ │ +
56 {
│ │ │ │ +
57 if constexpr(k == 0)
│ │ │ │ +
58 // a refined P0 basis assigns each element 2^dim DOFs
│ │ │ │ +
59 return [](GeometryType gt, int) -> size_t {
│ │ │ │ +
60 return (gt.dim() == dim) ? (1 << dim) : 0;
│ │ │ │ +
61 };
│ │ │ │ +
62 else if constexpr(k == 1)
│ │ │ │ +
63 // a refined P1 basis has the same layout as a P2 basis
│ │ │ │ +
64 return [](GeometryType gt, int) -> size_t {
│ │ │ │ +
65 return Dune::binomial(int(k),int(gt.dim()));
│ │ │ │ +
66 };
│ │ │ │ +
67 else
│ │ │ │ +
68 DUNE_THROW(Dune::NotImplemented,
│ │ │ │ +
69 "Refined basis not implemented for higher-order Lagrange (k>=2) elements.");
│ │ │ │ +
70 }
│ │ │ │ +
71
│ │ │ │ +
72public:
│ │ │ │ +
73
│ │ │ │ +
75 using GridView = GV;
│ │ │ │ +
76
│ │ │ │ + │ │ │ │ +
79
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
87 : Base(gv, dofLayout())
│ │ │ │ +
88 {
│ │ │ │ +
89 for (auto gt : gv.indexSet().types(0)) {
│ │ │ │ +
90 if (!gt.isSimplex())
│ │ │ │ +
91 DUNE_THROW(Dune::NotImplemented,
│ │ │ │ +
92 "Refined Lagrange basis only implemented for simplex grids.");
│ │ │ │ +
93 }
│ │ │ │ +
94 }
│ │ │ │ +
│ │ │ │ +
95
│ │ │ │ +
│ │ │ │ +
97 Node makeNode () const
│ │ │ │ +
98 {
│ │ │ │ +
99 return Node{};
│ │ │ │ +
100 }
│ │ │ │ +
│ │ │ │ +
101
│ │ │ │ +
│ │ │ │ +
109 static constexpr unsigned int order()
│ │ │ │ +
110 {
│ │ │ │ +
111 return k;
│ │ │ │ +
112 }
│ │ │ │
│ │ │ │ +
113};
│ │ │ │ +
│ │ │ │ +
114
│ │ │ │ +
115
│ │ │ │
116
│ │ │ │ -
│ │ │ │ -
117 const RootBasis& rootBasis() const
│ │ │ │ -
118 {
│ │ │ │ -
119 return *rootBasis_;
│ │ │ │ -
120 }
│ │ │ │ -
│ │ │ │ -
121
│ │ │ │ -
│ │ │ │ -
122 const PrefixPath& prefixPath() const
│ │ │ │ -
123 {
│ │ │ │ -
124 return prefixPath_;
│ │ │ │ -
125 }
│ │ │ │ -
│ │ │ │ -
126
│ │ │ │ -
127protected:
│ │ │ │ - │ │ │ │ - │ │ │ │ -
130};
│ │ │ │ -
│ │ │ │ -
131
│ │ │ │ -
132
│ │ │ │ -
133// CTAD guide for a non-SubspaceBasis root basis
│ │ │ │ -
134template<class RB, class TP>
│ │ │ │ -
135SubspaceBasis(const RB&, const TP) -> SubspaceBasis<RB, TP>;
│ │ │ │ -
136
│ │ │ │ -
137// CTAD guide for a SubspaceBasis root basis
│ │ │ │ -
138template<class RootRootBasis, class InnerTP, class OuterTP>
│ │ │ │ -
139SubspaceBasis(const SubspaceBasis<RootRootBasis, InnerTP>& rootBasis, const OuterTP& prefixPath)
│ │ │ │ -
140 -> SubspaceBasis<std::decay_t<decltype(rootBasis.rootBasis())>, Impl::JoinTreePath_t<InnerTP, OuterTP>>;
│ │ │ │ -
141
│ │ │ │ -
142
│ │ │ │ -
143
│ │ │ │ -
154template<class RootBasis, class... PrefixTreeIndices>
│ │ │ │ -
│ │ │ │ -
155auto subspaceBasis(const RootBasis& rootBasis, const TypeTree::HybridTreePath<PrefixTreeIndices...>& prefixPath)
│ │ │ │ -
156{
│ │ │ │ -
157 return SubspaceBasis(rootBasis, prefixPath);
│ │ │ │ -
158}
│ │ │ │ -
│ │ │ │ -
159
│ │ │ │ -
160template<class RootBasis, class... PrefixTreeIndices>
│ │ │ │ -
│ │ │ │ -
161auto subspaceBasis(const RootBasis& rootBasis, const PrefixTreeIndices&... prefixTreeIndices)
│ │ │ │ -
162{
│ │ │ │ -
163 return subspaceBasis(rootBasis, TypeTree::hybridTreePath(prefixTreeIndices...));
│ │ │ │ -
164}
│ │ │ │ -
│ │ │ │ -
165
│ │ │ │ -
166
│ │ │ │ -
167
│ │ │ │ -
168} // end namespace Functions
│ │ │ │ -
169} // end namespace Dune
│ │ │ │ -
170
│ │ │ │ -
171
│ │ │ │ -
172
│ │ │ │ -
173#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ +
117template <typename GV, int k, typename R>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
119 : public LeafBasisNode
│ │ │ │ +
120{
│ │ │ │ +
121 static constexpr int dim = GV::dimension;
│ │ │ │ +
122
│ │ │ │ +
123 // refined basis only implemented for P0 and P1
│ │ │ │ +
124 static_assert(k == 0 || k == 1);
│ │ │ │ +
125
│ │ │ │ +
126public:
│ │ │ │ +
128 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ +
129
│ │ │ │ +
131 using FiniteElement = std::conditional_t<(k==0),
│ │ │ │ +
132 Dune::RefinedP0LocalFiniteElement<typename GV::ctype,R,dim>,
│ │ │ │ +
133 Dune::RefinedP1LocalFiniteElement<typename GV::ctype,R,dim>>;
│ │ │ │ +
134
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
146 , element_(nullptr)
│ │ │ │ +
147 {}
│ │ │ │ +
│ │ │ │ +
148
│ │ │ │ +
│ │ │ │ +
153 const Element& element () const
│ │ │ │ +
154 {
│ │ │ │ +
155 return *element_;
│ │ │ │ +
156 }
│ │ │ │ +
│ │ │ │ +
157
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
165 {
│ │ │ │ +
166 return finiteElement_;
│ │ │ │ +
167 }
│ │ │ │ +
│ │ │ │ +
168
│ │ │ │ +
│ │ │ │ +
170 void bind (const Element& e)
│ │ │ │ +
171 {
│ │ │ │ +
172 element_ = &e;
│ │ │ │ +
173 this->setSize(finiteElement_.size());
│ │ │ │ +
174 }
│ │ │ │ +
│ │ │ │ +
175
│ │ │ │ +
│ │ │ │ +
180 static constexpr unsigned int order()
│ │ │ │ +
181 {
│ │ │ │ +
182 return k;
│ │ │ │ +
183 }
│ │ │ │ +
│ │ │ │ +
184
│ │ │ │ +
185protected:
│ │ │ │ + │ │ │ │ + │ │ │ │ +
188};
│ │ │ │ +
│ │ │ │ +
189
│ │ │ │ +
190
│ │ │ │ +
191
│ │ │ │ +
192namespace BasisFactory {
│ │ │ │ +
193
│ │ │ │ +
201template <int k, typename R=double>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
203{
│ │ │ │ +
204 return [](const auto& gridView) {
│ │ │ │ +
205 return RefinedLagrangePreBasis<std::decay_t<decltype(gridView)>, k, R>(gridView);
│ │ │ │ +
206 };
│ │ │ │ +
207}
│ │ │ │ +
│ │ │ │ +
208
│ │ │ │ +
209} // end namespace BasisFactory
│ │ │ │ +
210
│ │ │ │ +
211
│ │ │ │ +
225template <typename GV, int k, typename R=double>
│ │ │ │ + │ │ │ │ +
227
│ │ │ │ +
228} // end namespace Functions
│ │ │ │ +
229} // end namespace Dune
│ │ │ │ +
230
│ │ │ │ +
231
│ │ │ │ +
232#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_REFINEDLAGRANGEBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
auto refinedLagrange()
Create a pre-basis factory that can create a RefinedLagrange pre-basis.
Definition refinedlagrangebasis.hh:202
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
auto subspaceBasis(const RootBasis &rootBasis, const TypeTree::HybridTreePath< PrefixTreeIndices... > &prefixPath)
Create SubspaceBasis from a root basis and a prefixPath.
Definition subspacebasis.hh:155
│ │ │ │ -
Definition subspacebasis.hh:42
│ │ │ │ -
typename RootBasis::LocalView RootLocalView
Definition subspacebasis.hh:47
│ │ │ │ -
LocalView localView() const
Return local view for basis.
Definition subspacebasis.hh:112
│ │ │ │ -
const RootBasis * rootBasis_
Definition subspacebasis.hh:128
│ │ │ │ -
typename RootBasis::SizePrefix SizePrefix
Definition subspacebasis.hh:62
│ │ │ │ -
TP PrefixPath
Definition subspacebasis.hh:49
│ │ │ │ -
SubspaceLocalView< RootLocalView, PrefixPath > LocalView
Type of the local view on the restriction of the basis to a single element.
Definition subspacebasis.hh:60
│ │ │ │ -
size_type size(const SizePrefix &prefix) const
Return number possible values for next position in multi index.
Definition subspacebasis.hh:104
│ │ │ │ -
typename RootBasis::GridView GridView
The grid view that the FE space is defined on.
Definition subspacebasis.hh:52
│ │ │ │ -
const PrefixPath & prefixPath() const
Definition subspacebasis.hh:122
│ │ │ │ -
SubspaceBasis(const SubspaceBasis< RootRootBasis, InnerTP > &rootBasis, const OuterTP &prefixPath)
Constructor from another SubspaceBasis.
Definition subspacebasis.hh:77
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition subspacebasis.hh:84
│ │ │ │ -
RB RootBasis
Definition subspacebasis.hh:45
│ │ │ │ -
PrefixPath prefixPath_
Definition subspacebasis.hh:129
│ │ │ │ -
size_type size() const
Return number of possible values for next position in empty multi index.
Definition subspacebasis.hh:98
│ │ │ │ -
const RootBasis & rootBasis() const
Definition subspacebasis.hh:117
│ │ │ │ -
typename RootBasis::MultiIndex MultiIndex
Type used for global numbering of the basis vectors.
Definition subspacebasis.hh:55
│ │ │ │ -
size_type dimension() const
Definition subspacebasis.hh:92
│ │ │ │ -
std::size_t size_type
Definition subspacebasis.hh:57
│ │ │ │ -
SubspaceBasis(const RootBasis &rootBasis, const PrefixPath &prefixPath)
Constructor for a given grid view object.
Definition subspacebasis.hh:66
│ │ │ │ -
The restriction of a finite element basis to a single element.
Definition subspacelocalview.hh:34
│ │ │ │ - │ │ │ │ +
Global basis for given pre-basis.
Definition defaultglobalbasis.hh:50
│ │ │ │ +
A generic MixIn class for PreBasis with flat indices computed from a mapper.
Definition leafprebasismappermixin.hh:62
│ │ │ │ +
void setSize(const size_type size)
Definition nodes.hh:169
│ │ │ │ +
Definition nodes.hh:191
│ │ │ │ +
Definition refinedlagrangebasis.hh:120
│ │ │ │ +
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition refinedlagrangebasis.hh:164
│ │ │ │ +
const Element * element_
Definition refinedlagrangebasis.hh:187
│ │ │ │ +
void bind(const Element &e)
Bind the node to the element e.
Definition refinedlagrangebasis.hh:170
│ │ │ │ +
const FiniteElement finiteElement_
Definition refinedlagrangebasis.hh:186
│ │ │ │ +
static constexpr unsigned int order()
Polynomial order used in the local Lagrange finite-elements in subdomains of the element.
Definition refinedlagrangebasis.hh:180
│ │ │ │ +
typename GV::template Codim< 0 >::Entity Element
Type of the element in the GridView.
Definition refinedlagrangebasis.hh:128
│ │ │ │ +
std::conditional_t<(k==0), Dune::RefinedP0LocalFiniteElement< typename GV::ctype, R, dim >, Dune::RefinedP1LocalFiniteElement< typename GV::ctype, R, dim > > FiniteElement
Type of the local finite-element.
Definition refinedlagrangebasis.hh:133
│ │ │ │ +
RefinedLagrangeNode()
The default constructor initializes all members to their default.
Definition refinedlagrangebasis.hh:144
│ │ │ │ +
const Element & element() const
Return current element. The behavior is undefined if the node is not bound to any element.
Definition refinedlagrangebasis.hh:153
│ │ │ │ +
A pre-basis for a refined Lagrange bases.
Definition refinedlagrangebasis.hh:46
│ │ │ │ +
static constexpr unsigned int order()
Polynomial order used in the local Lagrange finite-elements.
Definition refinedlagrangebasis.hh:109
│ │ │ │ +
Node makeNode() const
Create tree node.
Definition refinedlagrangebasis.hh:97
│ │ │ │ +
GV GridView
The grid view that the FE basis is defined on.
Definition refinedlagrangebasis.hh:75
│ │ │ │ +
RefinedLagrangePreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition refinedlagrangebasis.hh:86
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,249 +1,254 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -subspacebasis.hh │ │ │ │ │ +refinedlagrangebasis.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACEBASIS_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACEBASIS_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_REFINEDLAGRANGEBASIS_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_REFINEDLAGRANGEBASIS_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13 │ │ │ │ │ -14#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ -15#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_s_u_b_s_p_a_c_e_l_o_c_a_l_v_i_e_w_._h_h> │ │ │ │ │ -16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ -17 │ │ │ │ │ -18 │ │ │ │ │ -19 │ │ │ │ │ -20namespace _D_u_n_e { │ │ │ │ │ -21namespace Functions { │ │ │ │ │ +10#include │ │ │ │ │ +11 │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14 │ │ │ │ │ +15#include │ │ │ │ │ +16 │ │ │ │ │ +17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ +18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_a_p_p_e_r_m_i_x_i_n_._h_h> │ │ │ │ │ +19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ +20 │ │ │ │ │ +21#include │ │ │ │ │ 22 │ │ │ │ │ -23 │ │ │ │ │ +23#include │ │ │ │ │ 24 │ │ │ │ │ -25namespace Impl { │ │ │ │ │ -26 │ │ │ │ │ -27 template │ │ │ │ │ -28 auto joinTreePaths(const TypeTree::HybridTreePath& inner, const │ │ │ │ │ -TypeTree::HybridTreePath outer) │ │ │ │ │ -29 { │ │ │ │ │ -30 return TypeTree::HybridTreePath(std::tuple_cat │ │ │ │ │ -(inner._data, outer._data)); │ │ │ │ │ -31 } │ │ │ │ │ -32 │ │ │ │ │ -33 template │ │ │ │ │ -34 using JoinTreePath_t = std::decay_t(), std::declval()))>; │ │ │ │ │ -35 │ │ │ │ │ -36} │ │ │ │ │ -37 │ │ │ │ │ -38 │ │ │ │ │ -39 │ │ │ │ │ -40template │ │ │ │ │ -_4_1class _S_u_b_s_p_a_c_e_B_a_s_i_s │ │ │ │ │ -42{ │ │ │ │ │ -43public: │ │ │ │ │ -44 │ │ │ │ │ -_4_5 using _R_o_o_t_B_a_s_i_s = RB; │ │ │ │ │ -46 │ │ │ │ │ -_4_7 using _R_o_o_t_L_o_c_a_l_V_i_e_w = typename RootBasis::LocalView; │ │ │ │ │ +25 │ │ │ │ │ +26namespace _D_u_n_e { │ │ │ │ │ +27namespace Functions { │ │ │ │ │ +28 │ │ │ │ │ +29template │ │ │ │ │ +30class RefinedLagrangeNode; │ │ │ │ │ +31 │ │ │ │ │ +43template │ │ │ │ │ +_4_4class _R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s : │ │ │ │ │ +45 public _L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n< GV > │ │ │ │ │ +46{ │ │ │ │ │ +47 using _B_a_s_e = _L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_<_ _G_V_ _>; │ │ │ │ │ 48 │ │ │ │ │ -_4_9 using _P_r_e_f_i_x_P_a_t_h = TP; │ │ │ │ │ +49 static const int dim = GV::dimension; │ │ │ │ │ 50 │ │ │ │ │ -_5_2 using _G_r_i_d_V_i_e_w = typename RootBasis::GridView; │ │ │ │ │ +51 // refined basis only implemented for P0 and P1 │ │ │ │ │ +52 static_assert(k == 0 || k == 1); │ │ │ │ │ 53 │ │ │ │ │ -_5_5 using _M_u_l_t_i_I_n_d_e_x = typename RootBasis::MultiIndex; │ │ │ │ │ -56 │ │ │ │ │ -_5_7 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ -58 │ │ │ │ │ -_6_0 using _L_o_c_a_l_V_i_e_w = _S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_<_R_o_o_t_L_o_c_a_l_V_i_e_w_,_ _P_r_e_f_i_x_P_a_t_h_>; │ │ │ │ │ -61 │ │ │ │ │ -_6_2 using _S_i_z_e_P_r_e_f_i_x = typename RootBasis::SizePrefix; │ │ │ │ │ -63 │ │ │ │ │ -64 │ │ │ │ │ -_6_6 _S_u_b_s_p_a_c_e_B_a_s_i_s(const _R_o_o_t_B_a_s_i_s& _r_o_o_t_B_a_s_i_s, const _P_r_e_f_i_x_P_a_t_h& _p_r_e_f_i_x_P_a_t_h) : │ │ │ │ │ -67 _r_o_o_t_B_a_s_i_s__(&_r_o_o_t_B_a_s_i_s), │ │ │ │ │ -68 _p_r_e_f_i_x_P_a_t_h__(_p_r_e_f_i_x_P_a_t_h) │ │ │ │ │ -69 {} │ │ │ │ │ -70 │ │ │ │ │ -76 template │ │ │ │ │ -_7_7 _S_u_b_s_p_a_c_e_B_a_s_i_s(const _S_u_b_s_p_a_c_e_B_a_s_i_s_<_R_o_o_t_R_o_o_t_B_a_s_i_s_,_ _I_n_n_e_r_T_P_>& _r_o_o_t_B_a_s_i_s, const │ │ │ │ │ -OuterTP& _p_r_e_f_i_x_P_a_t_h) : │ │ │ │ │ -78 _S_u_b_s_p_a_c_e_B_a_s_i_s(_r_o_o_t_B_a_s_i_s._r_o_o_t_B_a_s_i_s(), Impl::joinTreePaths │ │ │ │ │ -(_r_o_o_t_B_a_s_i_s._p_r_e_f_i_x_P_a_t_h(), _p_r_e_f_i_x_P_a_t_h)) │ │ │ │ │ -79 {} │ │ │ │ │ -80 │ │ │ │ │ -81 │ │ │ │ │ -_8_4 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ -85 { │ │ │ │ │ -86 return _r_o_o_t_B_a_s_i_s__->gridView(); │ │ │ │ │ -87 } │ │ │ │ │ -88 │ │ │ │ │ -_9_2 _s_i_z_e___t_y_p_e _d_i_m_e_n_s_i_o_n() const │ │ │ │ │ -93 { │ │ │ │ │ -94 return _r_o_o_t_B_a_s_i_s__->dimension(); │ │ │ │ │ -95 } │ │ │ │ │ -96 │ │ │ │ │ -_9_8 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ -99 { │ │ │ │ │ -100 return _r_o_o_t_B_a_s_i_s__->size(); │ │ │ │ │ -101 } │ │ │ │ │ -102 │ │ │ │ │ -_1_0_4 _s_i_z_e___t_y_p_e _s_i_z_e(const _S_i_z_e_P_r_e_f_i_x& prefix) const │ │ │ │ │ -105 { │ │ │ │ │ -106 return _r_o_o_t_B_a_s_i_s__->size(prefix); │ │ │ │ │ -107 } │ │ │ │ │ -108 │ │ │ │ │ -_1_1_2 _L_o_c_a_l_V_i_e_w _l_o_c_a_l_V_i_e_w() const │ │ │ │ │ -113 { │ │ │ │ │ -114 return _L_o_c_a_l_V_i_e_w(*this, _p_r_e_f_i_x_P_a_t_h__); │ │ │ │ │ -115 } │ │ │ │ │ +54 // the layout is defined in terms of a MCMGLayout specialized for k == 0 or │ │ │ │ │ +1 │ │ │ │ │ +55 static MCMGLayout dofLayout() │ │ │ │ │ +56 { │ │ │ │ │ +57 if constexpr(k == 0) │ │ │ │ │ +58 // a refined P0 basis assigns each element 2^dim DOFs │ │ │ │ │ +59 return [](GeometryType gt, int) -> size_t { │ │ │ │ │ +60 return (gt.dim() == dim) ? (1 << dim) : 0; │ │ │ │ │ +61 }; │ │ │ │ │ +62 else if constexpr(k == 1) │ │ │ │ │ +63 // a refined P1 basis has the same layout as a P2 basis │ │ │ │ │ +64 return [](GeometryType gt, int) -> size_t { │ │ │ │ │ +65 return Dune::binomial(int(k),int(gt.dim())); │ │ │ │ │ +66 }; │ │ │ │ │ +67 else │ │ │ │ │ +68 DUNE_THROW(Dune::NotImplemented, │ │ │ │ │ +69 "Refined basis not implemented for higher-order Lagrange (k>=2) elements."); │ │ │ │ │ +70 } │ │ │ │ │ +71 │ │ │ │ │ +72public: │ │ │ │ │ +73 │ │ │ │ │ +_7_5 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ +76 │ │ │ │ │ +_7_8 using _N_o_d_e = _R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e_<_G_V_,_ _k_,_ _R_>; │ │ │ │ │ +79 │ │ │ │ │ +_8_6 _R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s (const _G_r_i_d_V_i_e_w& gv) │ │ │ │ │ +87 : _B_a_s_e(gv, dofLayout()) │ │ │ │ │ +88 { │ │ │ │ │ +89 for (auto gt : gv.indexSet().types(0)) { │ │ │ │ │ +90 if (!gt.isSimplex()) │ │ │ │ │ +91 DUNE_THROW(Dune::NotImplemented, │ │ │ │ │ +92 "Refined Lagrange basis only implemented for simplex grids."); │ │ │ │ │ +93 } │ │ │ │ │ +94 } │ │ │ │ │ +95 │ │ │ │ │ +_9_7 _N_o_d_e _m_a_k_e_N_o_d_e () const │ │ │ │ │ +98 { │ │ │ │ │ +99 return _N_o_d_e{}; │ │ │ │ │ +100 } │ │ │ │ │ +101 │ │ │ │ │ +_1_0_9 static constexpr unsigned int _o_r_d_e_r() │ │ │ │ │ +110 { │ │ │ │ │ +111 return k; │ │ │ │ │ +112 } │ │ │ │ │ +113}; │ │ │ │ │ +114 │ │ │ │ │ +115 │ │ │ │ │ 116 │ │ │ │ │ -_1_1_7 const _R_o_o_t_B_a_s_i_s& _r_o_o_t_B_a_s_i_s() const │ │ │ │ │ -118 { │ │ │ │ │ -119 return *_r_o_o_t_B_a_s_i_s__; │ │ │ │ │ -120 } │ │ │ │ │ -121 │ │ │ │ │ -_1_2_2 const _P_r_e_f_i_x_P_a_t_h& _p_r_e_f_i_x_P_a_t_h() const │ │ │ │ │ -123 { │ │ │ │ │ -124 return _p_r_e_f_i_x_P_a_t_h__; │ │ │ │ │ -125 } │ │ │ │ │ -126 │ │ │ │ │ -127protected: │ │ │ │ │ -_1_2_8 const _R_o_o_t_B_a_s_i_s* _r_o_o_t_B_a_s_i_s__; │ │ │ │ │ -_1_2_9 _P_r_e_f_i_x_P_a_t_h _p_r_e_f_i_x_P_a_t_h__; │ │ │ │ │ -130}; │ │ │ │ │ -131 │ │ │ │ │ -132 │ │ │ │ │ -133// CTAD guide for a non-SubspaceBasis root basis │ │ │ │ │ -134template │ │ │ │ │ -_1_3_5_S_u_b_s_p_a_c_e_B_a_s_i_s(const RB&, const TP) -> _S_u_b_s_p_a_c_e_B_a_s_i_s_<_R_B_,_ _T_P_>; │ │ │ │ │ -136 │ │ │ │ │ -137// CTAD guide for a SubspaceBasis root basis │ │ │ │ │ -138template │ │ │ │ │ -_1_3_9_S_u_b_s_p_a_c_e_B_a_s_i_s(const _S_u_b_s_p_a_c_e_B_a_s_i_s_<_R_o_o_t_R_o_o_t_B_a_s_i_s_,_ _I_n_n_e_r_T_P_>& rootBasis, const │ │ │ │ │ -OuterTP& prefixPath) │ │ │ │ │ -140 -> _S_u_b_s_p_a_c_e_B_a_s_i_s, Impl:: │ │ │ │ │ -JoinTreePath_t>; │ │ │ │ │ -141 │ │ │ │ │ -142 │ │ │ │ │ -143 │ │ │ │ │ -154template │ │ │ │ │ -_1_5_5auto _s_u_b_s_p_a_c_e_B_a_s_i_s(const RootBasis& rootBasis, const TypeTree:: │ │ │ │ │ -HybridTreePath& prefixPath) │ │ │ │ │ -156{ │ │ │ │ │ -157 return _S_u_b_s_p_a_c_e_B_a_s_i_s(rootBasis, prefixPath); │ │ │ │ │ -158} │ │ │ │ │ -159 │ │ │ │ │ -160template │ │ │ │ │ -_1_6_1auto _s_u_b_s_p_a_c_e_B_a_s_i_s(const RootBasis& rootBasis, const PrefixTreeIndices&... │ │ │ │ │ -prefixTreeIndices) │ │ │ │ │ -162{ │ │ │ │ │ -163 return _s_u_b_s_p_a_c_e_B_a_s_i_s(rootBasis, TypeTree::hybridTreePath │ │ │ │ │ -(prefixTreeIndices...)); │ │ │ │ │ -164} │ │ │ │ │ -165 │ │ │ │ │ -166 │ │ │ │ │ -167 │ │ │ │ │ -168} // end namespace Functions │ │ │ │ │ -169} // end namespace Dune │ │ │ │ │ -170 │ │ │ │ │ -171 │ │ │ │ │ -172 │ │ │ │ │ -173#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH │ │ │ │ │ -_t_y_p_e___t_r_a_i_t_s_._h_h │ │ │ │ │ -_s_u_b_s_p_a_c_e_l_o_c_a_l_v_i_e_w_._h_h │ │ │ │ │ +117template │ │ │ │ │ +_1_1_8class _R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e │ │ │ │ │ +119 : public _L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ +120{ │ │ │ │ │ +121 static constexpr int dim = GV::dimension; │ │ │ │ │ +122 │ │ │ │ │ +123 // refined basis only implemented for P0 and P1 │ │ │ │ │ +124 static_assert(k == 0 || k == 1); │ │ │ │ │ +125 │ │ │ │ │ +126public: │ │ │ │ │ +_1_2_8 using _E_l_e_m_e_n_t = typename GV::template Codim<0>::Entity; │ │ │ │ │ +129 │ │ │ │ │ +_1_3_1 using _F_i_n_i_t_e_E_l_e_m_e_n_t = std::conditional_t<(k==0), │ │ │ │ │ +132 Dune::RefinedP0LocalFiniteElement, │ │ │ │ │ +133 Dune::RefinedP1LocalFiniteElement>; │ │ │ │ │ +134 │ │ │ │ │ +_1_4_4 _R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e () │ │ │ │ │ +145 : _f_i_n_i_t_e_E_l_e_m_e_n_t__{} │ │ │ │ │ +146 , _e_l_e_m_e_n_t__(nullptr) │ │ │ │ │ +147 {} │ │ │ │ │ +148 │ │ │ │ │ +_1_5_3 const _E_l_e_m_e_n_t& _e_l_e_m_e_n_t () const │ │ │ │ │ +154 { │ │ │ │ │ +155 return *_e_l_e_m_e_n_t__; │ │ │ │ │ +156 } │ │ │ │ │ +157 │ │ │ │ │ +_1_6_4 const _F_i_n_i_t_e_E_l_e_m_e_n_t& _f_i_n_i_t_e_E_l_e_m_e_n_t () const │ │ │ │ │ +165 { │ │ │ │ │ +166 return _f_i_n_i_t_e_E_l_e_m_e_n_t__; │ │ │ │ │ +167 } │ │ │ │ │ +168 │ │ │ │ │ +_1_7_0 void _b_i_n_d (const _E_l_e_m_e_n_t& e) │ │ │ │ │ +171 { │ │ │ │ │ +172 _e_l_e_m_e_n_t__ = &e; │ │ │ │ │ +173 this->_s_e_t_S_i_z_e(_f_i_n_i_t_e_E_l_e_m_e_n_t__.size()); │ │ │ │ │ +174 } │ │ │ │ │ +175 │ │ │ │ │ +_1_8_0 static constexpr unsigned int _o_r_d_e_r() │ │ │ │ │ +181 { │ │ │ │ │ +182 return k; │ │ │ │ │ +183 } │ │ │ │ │ +184 │ │ │ │ │ +185protected: │ │ │ │ │ +_1_8_6 const _F_i_n_i_t_e_E_l_e_m_e_n_t _f_i_n_i_t_e_E_l_e_m_e_n_t__; │ │ │ │ │ +_1_8_7 const _E_l_e_m_e_n_t* _e_l_e_m_e_n_t__; │ │ │ │ │ +188}; │ │ │ │ │ +189 │ │ │ │ │ +190 │ │ │ │ │ +191 │ │ │ │ │ +192namespace BasisFactory { │ │ │ │ │ +193 │ │ │ │ │ +201template │ │ │ │ │ +_2_0_2auto _r_e_f_i_n_e_d_L_a_g_r_a_n_g_e () │ │ │ │ │ +203{ │ │ │ │ │ +204 return [](const auto& gridView) { │ │ │ │ │ +205 return _R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s, k, R> │ │ │ │ │ +(gridView); │ │ │ │ │ +206 }; │ │ │ │ │ +207} │ │ │ │ │ +208 │ │ │ │ │ +209} // end namespace BasisFactory │ │ │ │ │ +210 │ │ │ │ │ +211 │ │ │ │ │ +225template │ │ │ │ │ +_2_2_6using _R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_B_a_s_i_s = │ │ │ │ │ +_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_<_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_<_G_V_,_k_,_R_> >; │ │ │ │ │ +227 │ │ │ │ │ +228} // end namespace Functions │ │ │ │ │ +229} // end namespace Dune │ │ │ │ │ +230 │ │ │ │ │ +231 │ │ │ │ │ +232#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_REFINEDLAGRANGEBASIS_HH │ │ │ │ │ +_l_e_a_f_p_r_e_b_a_s_i_s_m_a_p_p_e_r_m_i_x_i_n_._h_h │ │ │ │ │ +_n_o_d_e_s_._h_h │ │ │ │ │ +_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_r_e_f_i_n_e_d_L_a_g_r_a_n_g_e │ │ │ │ │ +auto refinedLagrange() │ │ │ │ │ +Create a pre-basis factory that can create a RefinedLagrange pre-basis. │ │ │ │ │ +DDeeffiinniittiioonn refinedlagrangebasis.hh:202 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_u_b_s_p_a_c_e_B_a_s_i_s │ │ │ │ │ -auto subspaceBasis(const RootBasis &rootBasis, const TypeTree::HybridTreePath< │ │ │ │ │ -PrefixTreeIndices... > &prefixPath) │ │ │ │ │ -Create SubspaceBasis from a root basis and a prefixPath. │ │ │ │ │ -DDeeffiinniittiioonn subspacebasis.hh:155 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s │ │ │ │ │ -DDeeffiinniittiioonn subspacebasis.hh:42 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_R_o_o_t_L_o_c_a_l_V_i_e_w │ │ │ │ │ -typename RootBasis::LocalView RootLocalView │ │ │ │ │ -DDeeffiinniittiioonn subspacebasis.hh:47 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_l_o_c_a_l_V_i_e_w │ │ │ │ │ -LocalView localView() const │ │ │ │ │ -Return local view for basis. │ │ │ │ │ -DDeeffiinniittiioonn subspacebasis.hh:112 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_r_o_o_t_B_a_s_i_s__ │ │ │ │ │ -const RootBasis * rootBasis_ │ │ │ │ │ -DDeeffiinniittiioonn subspacebasis.hh:128 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_S_i_z_e_P_r_e_f_i_x │ │ │ │ │ -typename RootBasis::SizePrefix SizePrefix │ │ │ │ │ -DDeeffiinniittiioonn subspacebasis.hh:62 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_P_r_e_f_i_x_P_a_t_h │ │ │ │ │ -TP PrefixPath │ │ │ │ │ -DDeeffiinniittiioonn subspacebasis.hh:49 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_L_o_c_a_l_V_i_e_w │ │ │ │ │ -SubspaceLocalView< RootLocalView, PrefixPath > LocalView │ │ │ │ │ -Type of the local view on the restriction of the basis to a single element. │ │ │ │ │ -DDeeffiinniittiioonn subspacebasis.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ -size_type size(const SizePrefix &prefix) const │ │ │ │ │ -Return number possible values for next position in multi index. │ │ │ │ │ -DDeeffiinniittiioonn subspacebasis.hh:104 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ -typename RootBasis::GridView GridView │ │ │ │ │ -The grid view that the FE space is defined on. │ │ │ │ │ -DDeeffiinniittiioonn subspacebasis.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_p_r_e_f_i_x_P_a_t_h │ │ │ │ │ -const PrefixPath & prefixPath() const │ │ │ │ │ -DDeeffiinniittiioonn subspacebasis.hh:122 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s │ │ │ │ │ -SubspaceBasis(const SubspaceBasis< RootRootBasis, InnerTP > &rootBasis, const │ │ │ │ │ -OuterTP &prefixPath) │ │ │ │ │ -Constructor from another SubspaceBasis. │ │ │ │ │ -DDeeffiinniittiioonn subspacebasis.hh:77 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ -const GridView & gridView() const │ │ │ │ │ -Obtain the grid view that the basis is defined on. │ │ │ │ │ -DDeeffiinniittiioonn subspacebasis.hh:84 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_R_o_o_t_B_a_s_i_s │ │ │ │ │ -RB RootBasis │ │ │ │ │ -DDeeffiinniittiioonn subspacebasis.hh:45 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_p_r_e_f_i_x_P_a_t_h__ │ │ │ │ │ -PrefixPath prefixPath_ │ │ │ │ │ -DDeeffiinniittiioonn subspacebasis.hh:129 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ -size_type size() const │ │ │ │ │ -Return number of possible values for next position in empty multi index. │ │ │ │ │ -DDeeffiinniittiioonn subspacebasis.hh:98 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_r_o_o_t_B_a_s_i_s │ │ │ │ │ -const RootBasis & rootBasis() const │ │ │ │ │ -DDeeffiinniittiioonn subspacebasis.hh:117 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_M_u_l_t_i_I_n_d_e_x │ │ │ │ │ -typename RootBasis::MultiIndex MultiIndex │ │ │ │ │ -Type used for global numbering of the basis vectors. │ │ │ │ │ -DDeeffiinniittiioonn subspacebasis.hh:55 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ -size_type dimension() const │ │ │ │ │ -DDeeffiinniittiioonn subspacebasis.hh:92 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -DDeeffiinniittiioonn subspacebasis.hh:57 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s │ │ │ │ │ -SubspaceBasis(const RootBasis &rootBasis, const PrefixPath &prefixPath) │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ +Global basis for given pre-basis. │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:50 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n │ │ │ │ │ +A generic MixIn class for PreBasis with flat indices computed from a mapper. │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismappermixin.hh:62 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_e_t_S_i_z_e │ │ │ │ │ +void setSize(const size_type size) │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:169 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:191 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e │ │ │ │ │ +DDeeffiinniittiioonn refinedlagrangebasis.hh:120 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ +const FiniteElement & finiteElement() const │ │ │ │ │ +Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ +DDeeffiinniittiioonn refinedlagrangebasis.hh:164 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e_:_:_e_l_e_m_e_n_t__ │ │ │ │ │ +const Element * element_ │ │ │ │ │ +DDeeffiinniittiioonn refinedlagrangebasis.hh:187 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e_:_:_b_i_n_d │ │ │ │ │ +void bind(const Element &e) │ │ │ │ │ +Bind the node to the element e. │ │ │ │ │ +DDeeffiinniittiioonn refinedlagrangebasis.hh:170 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t__ │ │ │ │ │ +const FiniteElement finiteElement_ │ │ │ │ │ +DDeeffiinniittiioonn refinedlagrangebasis.hh:186 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e_:_:_o_r_d_e_r │ │ │ │ │ +static constexpr unsigned int order() │ │ │ │ │ +Polynomial order used in the local Lagrange finite-elements in subdomains of │ │ │ │ │ +the element. │ │ │ │ │ +DDeeffiinniittiioonn refinedlagrangebasis.hh:180 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e_:_:_E_l_e_m_e_n_t │ │ │ │ │ +typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ +Type of the element in the GridView. │ │ │ │ │ +DDeeffiinniittiioonn refinedlagrangebasis.hh:128 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e_:_:_F_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ +std::conditional_t<(k==0), Dune::RefinedP0LocalFiniteElement< typename GV:: │ │ │ │ │ +ctype, R, dim >, Dune::RefinedP1LocalFiniteElement< typename GV::ctype, R, dim │ │ │ │ │ +> > FiniteElement │ │ │ │ │ +Type of the local finite-element. │ │ │ │ │ +DDeeffiinniittiioonn refinedlagrangebasis.hh:133 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e │ │ │ │ │ +RefinedLagrangeNode() │ │ │ │ │ +The default constructor initializes all members to their default. │ │ │ │ │ +DDeeffiinniittiioonn refinedlagrangebasis.hh:144 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e_:_:_e_l_e_m_e_n_t │ │ │ │ │ +const Element & element() const │ │ │ │ │ +Return current element. The behavior is undefined if the node is not bound to │ │ │ │ │ +any element. │ │ │ │ │ +DDeeffiinniittiioonn refinedlagrangebasis.hh:153 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s │ │ │ │ │ +A pre-basis for a refined Lagrange bases. │ │ │ │ │ +DDeeffiinniittiioonn refinedlagrangebasis.hh:46 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_o_r_d_e_r │ │ │ │ │ +static constexpr unsigned int order() │ │ │ │ │ +Polynomial order used in the local Lagrange finite-elements. │ │ │ │ │ +DDeeffiinniittiioonn refinedlagrangebasis.hh:109 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ +Node makeNode() const │ │ │ │ │ +Create tree node. │ │ │ │ │ +DDeeffiinniittiioonn refinedlagrangebasis.hh:97 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ +GV GridView │ │ │ │ │ +The grid view that the FE basis is defined on. │ │ │ │ │ +DDeeffiinniittiioonn refinedlagrangebasis.hh:75 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s │ │ │ │ │ +RefinedLagrangePreBasis(const GridView &gv) │ │ │ │ │ Constructor for a given grid view object. │ │ │ │ │ -DDeeffiinniittiioonn subspacebasis.hh:66 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w │ │ │ │ │ -The restriction of a finite element basis to a single element. │ │ │ │ │ -DDeeffiinniittiioonn subspacelocalview.hh:34 │ │ │ │ │ -_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ +DDeeffiinniittiioonn refinedlagrangebasis.hh:86 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00176.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: refinedlagrangebasis.hh File Reference │ │ │ │ +dune-functions: raviartthomasbasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,59 +74,67 @@ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Typedefs | │ │ │ │ Functions
│ │ │ │ -
refinedlagrangebasis.hh File Reference
│ │ │ │ +
raviartthomasbasis.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ +
#include <array>
│ │ │ │ #include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/common/math.hh>
│ │ │ │ -#include <dune/localfunctions/refined.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/defaultglobalbasis.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/leafprebasismappermixin.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/nodes.hh>
│ │ │ │ -#include <dune/geometry/type.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 <dune/functions/functionspacebases/leafprebasismixin.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::RefinedLagrangePreBasis< GV, k, R >
 A pre-basis for a refined Lagrange bases. More...
class  Dune::Functions::RaviartThomasPreBasis< GV, k >
 
class  Dune::Functions::RefinedLagrangeNode< GV, k, R >
class  Dune::Functions::RaviartThomasNode< GV, k >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ Typedefs

template<typename GV , int k, typename R = double>
using Dune::Functions::RefinedLagrangeBasis = DefaultGlobalBasis< RefinedLagrangePreBasis< GV, k, R > >
 Nodal basis of a continuous Lagrange finite-element space on a uniformly refined simplex element.
 
template<typename GV , int k>
using Dune::Functions::RaviartThomasBasis = DefaultGlobalBasis< RaviartThomasPreBasis< GV, k > >
 Basis of a k-th-order Raviart Thomas finite element space.
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<int k, typename R = double>
auto Dune::Functions::BasisFactory::refinedLagrange ()
 Create a pre-basis factory that can create a RefinedLagrange pre-basis.
 
template<std::size_t k>
auto Dune::Functions::BasisFactory::raviartThomas ()
 Create a pre-basis factory that can create a Raviart-Thomas pre-basis.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -2,45 +2,52 @@ │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -refinedlagrangebasis.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +raviartthomasbasis.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_a_p_p_e_r_m_i_x_i_n_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_g_l_o_b_a_l_v_a_l_u_e_d_l_o_c_a_l_f_i_n_i_t_e_e_l_e_m_e_n_t_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_<_ _G_V_,_ _k_,_ _R_ _> │ │ │ │ │ -  A pre-basis for a refined Lagrange bases. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_<_ _G_V_,_ _k_ _> │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e_<_ _G_V_,_ _k_,_ _R_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_<_ _G_V_,_ _k_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y │ │ │ │ │   │ │ │ │ │ TTyyppeeddeeffss │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s< │ │ │ │ │ - _R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s< GV, k, R > > │ │ │ │ │ -  Nodal basis of a continuous Lagrange finite-element space on a uniformly │ │ │ │ │ - refined simplex element. │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s< │ │ │ │ │ + _R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s< GV, k > > │ │ │ │ │ +  Basis of a k-th-order Raviart Thomas finite element space. │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_r_e_f_i_n_e_d_L_a_g_r_a_n_g_e () │ │ │ │ │ -  Create a pre-basis factory that can create a RefinedLagrange pre-basis. │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_r_a_v_i_a_r_t_T_h_o_m_a_s () │ │ │ │ │ +  Create a pre-basis factory that can create a Raviart-Thomas pre-basis. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00176_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: refinedlagrangebasis.hh Source File │ │ │ │ +dune-functions: raviartthomasbasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,222 +74,462 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
refinedlagrangebasis.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_REFINEDLAGRANGEBASIS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_REFINEDLAGRANGEBASIS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH
│ │ │ │
9
│ │ │ │ -
10#include <type_traits>
│ │ │ │ -
11
│ │ │ │ -
12#include <dune/common/exceptions.hh>
│ │ │ │ -
13#include <dune/common/math.hh>
│ │ │ │ -
14
│ │ │ │ -
15#include <dune/localfunctions/refined.hh>
│ │ │ │ -
16
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
20
│ │ │ │ -
21#include <dune/geometry/type.hh>
│ │ │ │ -
22
│ │ │ │ -
23#include <dune/grid/common/mcmgmapper.hh>
│ │ │ │ -
24
│ │ │ │ -
25
│ │ │ │ -
26namespace Dune {
│ │ │ │ -
27namespace Functions {
│ │ │ │ -
28
│ │ │ │ -
29template<typename GV, int k, typename R>
│ │ │ │ -
30class RefinedLagrangeNode;
│ │ │ │ +
10#include <array>
│ │ │ │ +
11#include <dune/common/exceptions.hh>
│ │ │ │ +
12
│ │ │ │ +
13#include <dune/grid/common/capabilities.hh>
│ │ │ │ +
14#include <dune/grid/common/mcmgmapper.hh>
│ │ │ │ +
15
│ │ │ │ +
16#include <dune/localfunctions/common/localfiniteelementvariant.hh>
│ │ │ │ +
17#include <dune/localfunctions/raviartthomas.hh>
│ │ │ │ +
18#include <dune/localfunctions/raviartthomas/raviartthomas0cube2d.hh>
│ │ │ │ +
19#include <dune/localfunctions/raviartthomas/raviartthomas0cube3d.hh>
│ │ │ │ +
20#include <dune/localfunctions/raviartthomas/raviartthomas02d.hh>
│ │ │ │ +
21#include <dune/localfunctions/raviartthomas/raviartthomas03d.hh>
│ │ │ │ +
22#include <dune/localfunctions/raviartthomas/raviartthomas1cube2d.hh>
│ │ │ │ +
23#include <dune/localfunctions/raviartthomas/raviartthomas1cube3d.hh>
│ │ │ │ +
24#include <dune/localfunctions/raviartthomas/raviartthomas12d.hh>
│ │ │ │ +
25#include <dune/localfunctions/raviartthomas/raviartthomas2cube2d.hh>
│ │ │ │ +
26
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
31
│ │ │ │ -
43template <typename GV, int k, typename R = double>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
45 public LeafPreBasisMapperMixin< GV >
│ │ │ │ -
46{
│ │ │ │ - │ │ │ │ -
48
│ │ │ │ -
49 static const int dim = GV::dimension;
│ │ │ │ -
50
│ │ │ │ -
51 // refined basis only implemented for P0 and P1
│ │ │ │ -
52 static_assert(k == 0 || k == 1);
│ │ │ │ -
53
│ │ │ │ -
54 // the layout is defined in terms of a MCMGLayout specialized for k == 0 or 1
│ │ │ │ -
55 static MCMGLayout dofLayout()
│ │ │ │ -
56 {
│ │ │ │ -
57 if constexpr(k == 0)
│ │ │ │ -
58 // a refined P0 basis assigns each element 2^dim DOFs
│ │ │ │ -
59 return [](GeometryType gt, int) -> size_t {
│ │ │ │ -
60 return (gt.dim() == dim) ? (1 << dim) : 0;
│ │ │ │ -
61 };
│ │ │ │ -
62 else if constexpr(k == 1)
│ │ │ │ -
63 // a refined P1 basis has the same layout as a P2 basis
│ │ │ │ -
64 return [](GeometryType gt, int) -> size_t {
│ │ │ │ -
65 return Dune::binomial(int(k),int(gt.dim()));
│ │ │ │ -
66 };
│ │ │ │ -
67 else
│ │ │ │ -
68 DUNE_THROW(Dune::NotImplemented,
│ │ │ │ -
69 "Refined basis not implemented for higher-order Lagrange (k>=2) elements.");
│ │ │ │ -
70 }
│ │ │ │ -
71
│ │ │ │ -
72public:
│ │ │ │ -
73
│ │ │ │ -
75 using GridView = GV;
│ │ │ │ -
76
│ │ │ │ - │ │ │ │ -
79
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
87 : Base(gv, dofLayout())
│ │ │ │ -
88 {
│ │ │ │ -
89 for (auto gt : gv.indexSet().types(0)) {
│ │ │ │ -
90 if (!gt.isSimplex())
│ │ │ │ -
91 DUNE_THROW(Dune::NotImplemented,
│ │ │ │ -
92 "Refined Lagrange basis only implemented for simplex grids.");
│ │ │ │ -
93 }
│ │ │ │ -
94 }
│ │ │ │ -
│ │ │ │ -
95
│ │ │ │ -
│ │ │ │ -
97 Node makeNode () const
│ │ │ │ -
98 {
│ │ │ │ -
99 return Node{};
│ │ │ │ -
100 }
│ │ │ │ -
│ │ │ │ -
101
│ │ │ │ -
│ │ │ │ -
109 static constexpr unsigned int order()
│ │ │ │ -
110 {
│ │ │ │ -
111 return k;
│ │ │ │ -
112 }
│ │ │ │ -
│ │ │ │ -
113};
│ │ │ │ -
│ │ │ │ +
32namespace Dune {
│ │ │ │ +
33namespace Functions {
│ │ │ │ +
34
│ │ │ │ +
35namespace Impl {
│ │ │ │ +
36
│ │ │ │ +
37 template<int dim, typename D, typename R, std::size_t k>
│ │ │ │ +
38 struct RaviartThomasSimplexLocalInfo
│ │ │ │ +
39 {
│ │ │ │ +
40 // Dummy type, must be something that we can have a std::unique_ptr to
│ │ │ │ +
41 using FiniteElement = void*;
│ │ │ │ +
42 };
│ │ │ │ +
43
│ │ │ │ +
44 template<typename D, typename R>
│ │ │ │ +
45 struct RaviartThomasSimplexLocalInfo<2,D,R,0>
│ │ │ │ +
46 {
│ │ │ │ +
47 using FiniteElement = RT02DLocalFiniteElement<D,R>;
│ │ │ │ +
48 };
│ │ │ │ +
49
│ │ │ │ +
50 template<typename D, typename R>
│ │ │ │ +
51 struct RaviartThomasSimplexLocalInfo<2,D,R,1>
│ │ │ │ +
52 {
│ │ │ │ +
53 using FiniteElement = RT12DLocalFiniteElement<D,R>;
│ │ │ │ +
54 };
│ │ │ │ +
55
│ │ │ │ +
56 template<typename D, typename R>
│ │ │ │ +
57 struct RaviartThomasSimplexLocalInfo<3,D,R,0>
│ │ │ │ +
58 {
│ │ │ │ +
59 using FiniteElement = RT03DLocalFiniteElement<D,R>;
│ │ │ │ +
60 };
│ │ │ │ +
61
│ │ │ │ +
62 template<int dim, typename D, typename R, std::size_t k>
│ │ │ │ +
63 struct RaviartThomasCubeLocalInfo
│ │ │ │ +
64 {
│ │ │ │ +
65 // Dummy type, must be something that we can have a std::unique_ptr to
│ │ │ │ +
66 using FiniteElement = void*;
│ │ │ │ +
67 };
│ │ │ │ +
68
│ │ │ │ +
69 template<typename D, typename R>
│ │ │ │ +
70 struct RaviartThomasCubeLocalInfo<2,D,R,0>
│ │ │ │ +
71 {
│ │ │ │ +
72 using FiniteElement = RT0Cube2DLocalFiniteElement<D,R>;
│ │ │ │ +
73 };
│ │ │ │ +
74
│ │ │ │ +
75 template<typename D, typename R>
│ │ │ │ +
76 struct RaviartThomasCubeLocalInfo<2,D,R,1>
│ │ │ │ +
77 {
│ │ │ │ +
78 using FiniteElement = RT1Cube2DLocalFiniteElement<D,R>;
│ │ │ │ +
79 };
│ │ │ │ +
80
│ │ │ │ +
81 template<typename D, typename R>
│ │ │ │ +
82 struct RaviartThomasCubeLocalInfo<2,D,R,2>
│ │ │ │ +
83 {
│ │ │ │ +
84 using FiniteElement = RT2Cube2DLocalFiniteElement<D,R>;
│ │ │ │ +
85 };
│ │ │ │ +
86
│ │ │ │ +
87 template<typename D, typename R>
│ │ │ │ +
88 struct RaviartThomasCubeLocalInfo<3,D,R,0>
│ │ │ │ +
89 {
│ │ │ │ +
90 using FiniteElement = RT0Cube3DLocalFiniteElement<D,R>;
│ │ │ │ +
91 };
│ │ │ │ +
92
│ │ │ │ +
93 template<typename D, typename R>
│ │ │ │ +
94 struct RaviartThomasCubeLocalInfo<3,D,R,1>
│ │ │ │ +
95 {
│ │ │ │ +
96 using FiniteElement = RT1Cube3DLocalFiniteElement<D,R>;
│ │ │ │ +
97 };
│ │ │ │ +
98
│ │ │ │ +
99 template<typename GV, int dim, typename R, std::size_t k>
│ │ │ │ +
100 class RaviartThomasLocalFiniteElementMap
│ │ │ │ +
101 {
│ │ │ │ +
102 using D = typename GV::ctype;
│ │ │ │ +
103 constexpr static bool hasFixedElementType = Capabilities::hasSingleGeometryType<typename GV::Grid>::v;
│ │ │ │ +
104
│ │ │ │ +
105 using CubeFiniteElement = typename RaviartThomasCubeLocalInfo<dim, D, R, k>::FiniteElement;
│ │ │ │ +
106 using SimplexFiniteElement = typename RaviartThomasSimplexLocalInfo<dim, D, R, k>::FiniteElement;
│ │ │ │ +
107
│ │ │ │ +
108 public:
│ │ │ │ +
109
│ │ │ │ +
110 using T = LocalBasisTraits<D, dim, FieldVector<D,dim>, R, dim, FieldVector<R,dim>, FieldMatrix<D,dim,dim> >;
│ │ │ │ +
111
│ │ │ │ +
112 constexpr static unsigned int topologyId = Capabilities::hasSingleGeometryType<typename GV::Grid>::topologyId; // meaningless if hasFixedElementType is false
│ │ │ │ +
113 constexpr static GeometryType type = GeometryType(topologyId, GV::dimension);
│ │ │ │
114
│ │ │ │ -
115
│ │ │ │ -
116
│ │ │ │ -
117template <typename GV, int k, typename R>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
119 : public LeafBasisNode
│ │ │ │ -
120{
│ │ │ │ -
121 static constexpr int dim = GV::dimension;
│ │ │ │ -
122
│ │ │ │ -
123 // refined basis only implemented for P0 and P1
│ │ │ │ -
124 static_assert(k == 0 || k == 1);
│ │ │ │ -
125
│ │ │ │ -
126public:
│ │ │ │ -
128 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ -
129
│ │ │ │ -
131 using FiniteElement = std::conditional_t<(k==0),
│ │ │ │ -
132 Dune::RefinedP0LocalFiniteElement<typename GV::ctype,R,dim>,
│ │ │ │ -
133 Dune::RefinedP1LocalFiniteElement<typename GV::ctype,R,dim>>;
│ │ │ │ -
134
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
146 , element_(nullptr)
│ │ │ │ -
147 {}
│ │ │ │ -
│ │ │ │ -
148
│ │ │ │ -
│ │ │ │ -
153 const Element& element () const
│ │ │ │ -
154 {
│ │ │ │ -
155 return *element_;
│ │ │ │ -
156 }
│ │ │ │ -
│ │ │ │ +
115 using FiniteElement = std::conditional_t<hasFixedElementType,
│ │ │ │ +
116 std::conditional_t<type.isCube(),CubeFiniteElement,SimplexFiniteElement>,
│ │ │ │ +
117 LocalFiniteElementVariant<CubeFiniteElement, SimplexFiniteElement> >;
│ │ │ │ +
118
│ │ │ │ +
119 // Each element facet can have its orientation reversed, hence there are
│ │ │ │ +
120 // 2^#facets different variants.
│ │ │ │ +
121 static std::size_t numVariants(GeometryType type)
│ │ │ │ +
122 {
│ │ │ │ +
123 auto numFacets = referenceElement<D,dim>(type).size(1);
│ │ │ │ +
124 return power(2,numFacets);
│ │ │ │ +
125 }
│ │ │ │ +
126
│ │ │ │ +
127 RaviartThomasLocalFiniteElementMap(const GV& gv)
│ │ │ │ +
128 : elementMapper_(gv, mcmgElementLayout()),
│ │ │ │ +
129 orient_(gv.size(0))
│ │ │ │ +
130 {
│ │ │ │ +
131 if constexpr (hasFixedElementType)
│ │ │ │ +
132 {
│ │ │ │ +
133 variants_.resize(numVariants(type));
│ │ │ │ +
134 for (size_t i = 0; i < numVariants(type); i++)
│ │ │ │ +
135 variants_[i] = FiniteElement(i);
│ │ │ │ +
136 }
│ │ │ │ +
137 else
│ │ │ │ +
138 {
│ │ │ │ +
139 // for mixed grids add offset for cubes
│ │ │ │ +
140 variants_.resize(numVariants(GeometryTypes::simplex(dim)) + numVariants(GeometryTypes::cube(dim)));
│ │ │ │ +
141 for (size_t i = 0; i < numVariants(GeometryTypes::simplex(dim)); i++)
│ │ │ │ +
142 variants_[i] = SimplexFiniteElement(i);
│ │ │ │ +
143 for (size_t i = 0; i < numVariants(GeometryTypes::cube(dim)); i++)
│ │ │ │ +
144 variants_[i + numVariants(GeometryTypes::simplex(dim))] = CubeFiniteElement(i);
│ │ │ │ +
145 }
│ │ │ │ +
146
│ │ │ │ +
147 for(const auto& cell : elements(gv))
│ │ │ │ +
148 {
│ │ │ │ +
149 unsigned int myId = elementMapper_.index(cell);
│ │ │ │ +
150 orient_[myId] = 0;
│ │ │ │ +
151
│ │ │ │ +
152 for (const auto& intersection : intersections(gv,cell))
│ │ │ │ +
153 {
│ │ │ │ +
154 if (intersection.neighbor() && (elementMapper_.index(intersection.outside()) > myId))
│ │ │ │ +
155 orient_[myId] |= (1 << intersection.indexInInside());
│ │ │ │ +
156 }
│ │ │ │
157
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
165 {
│ │ │ │ -
166 return finiteElement_;
│ │ │ │ -
167 }
│ │ │ │ -
│ │ │ │ -
168
│ │ │ │ -
│ │ │ │ -
170 void bind (const Element& e)
│ │ │ │ -
171 {
│ │ │ │ -
172 element_ = &e;
│ │ │ │ -
173 this->setSize(finiteElement_.size());
│ │ │ │ -
174 }
│ │ │ │ -
│ │ │ │ -
175
│ │ │ │ -
│ │ │ │ -
180 static constexpr unsigned int order()
│ │ │ │ -
181 {
│ │ │ │ -
182 return k;
│ │ │ │ -
183 }
│ │ │ │ -
│ │ │ │ -
184
│ │ │ │ -
185protected:
│ │ │ │ - │ │ │ │ - │ │ │ │ -
188};
│ │ │ │ -
│ │ │ │ -
189
│ │ │ │ -
190
│ │ │ │ +
158 // for mixed grids add offset for cubes
│ │ │ │ +
159 if constexpr (!hasFixedElementType)
│ │ │ │ +
160 if (cell.type().isCube())
│ │ │ │ +
161 orient_[myId] += numVariants(GeometryTypes::simplex(dim));
│ │ │ │ +
162 }
│ │ │ │ +
163 }
│ │ │ │ +
164
│ │ │ │ +
165 template<class EntityType>
│ │ │ │ +
166 const FiniteElement& find(const EntityType& e) const
│ │ │ │ +
167 {
│ │ │ │ +
168 return variants_[orient_[elementMapper_.index(e)]];
│ │ │ │ +
169 }
│ │ │ │ +
170
│ │ │ │ +
171 private:
│ │ │ │ +
172 std::vector<FiniteElement> variants_;
│ │ │ │ +
173 Dune::MultipleCodimMultipleGeomTypeMapper<GV> elementMapper_;
│ │ │ │ +
174 std::vector<unsigned char> orient_;
│ │ │ │ +
175 };
│ │ │ │ +
176
│ │ │ │ +
177
│ │ │ │ +
178} // namespace Impl
│ │ │ │ +
179
│ │ │ │ +
180
│ │ │ │ +
181// *****************************************************************************
│ │ │ │ +
182// This is the reusable part of the basis. It contains
│ │ │ │ +
183//
│ │ │ │ +
184// RaviartThomasPreBasis
│ │ │ │ +
185// RaviartThomasNode
│ │ │ │ +
186//
│ │ │ │ +
187// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ +
188// state. These components do _not_ depend on the global basis and local view
│ │ │ │ +
189// and can be used without a global basis.
│ │ │ │ +
190// *****************************************************************************
│ │ │ │
191
│ │ │ │ -
192namespace BasisFactory {
│ │ │ │ -
193
│ │ │ │ -
201template <int k, typename R=double>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
203{
│ │ │ │ -
204 return [](const auto& gridView) {
│ │ │ │ -
205 return RefinedLagrangePreBasis<std::decay_t<decltype(gridView)>, k, R>(gridView);
│ │ │ │ -
206 };
│ │ │ │ -
207}
│ │ │ │ -
│ │ │ │ -
208
│ │ │ │ -
209} // end namespace BasisFactory
│ │ │ │ -
210
│ │ │ │ -
211
│ │ │ │ -
225template <typename GV, int k, typename R=double>
│ │ │ │ - │ │ │ │ -
227
│ │ │ │ -
228} // end namespace Functions
│ │ │ │ -
229} // end namespace Dune
│ │ │ │ -
230
│ │ │ │ -
231
│ │ │ │ -
232#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_REFINEDLAGRANGEBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
auto refinedLagrange()
Create a pre-basis factory that can create a RefinedLagrange pre-basis.
Definition refinedlagrangebasis.hh:202
│ │ │ │ +
192template<typename GV, int k>
│ │ │ │ +
193class RaviartThomasNode;
│ │ │ │ +
194
│ │ │ │ +
195template<typename GV, int k>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
197 public LeafPreBasisMixin< RaviartThomasPreBasis<GV,k> >
│ │ │ │ +
198{
│ │ │ │ +
199 static const int dim = GV::dimension;
│ │ │ │ +
200 using FiniteElementMap = typename Impl::RaviartThomasLocalFiniteElementMap<GV, dim, double, k>;
│ │ │ │ +
201
│ │ │ │ +
202public:
│ │ │ │ +
203
│ │ │ │ +
205 using GridView = GV;
│ │ │ │ +
206 using size_type = std::size_t;
│ │ │ │ +
207
│ │ │ │ + │ │ │ │ +
209
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
212 gridView_(gv),
│ │ │ │ + │ │ │ │ +
214 {
│ │ │ │ +
215 // Currently there are some unresolved bugs with hybrid grids and higher order Raviart-Thomas elements
│ │ │ │ +
216 if (gv.indexSet().types(0).size() > 1 and k>0)
│ │ │ │ +
217 DUNE_THROW(Dune::NotImplemented, "Raviart-Thomas basis with index k>0 is only implemented for grids with a single element type");
│ │ │ │ +
218
│ │ │ │ +
219 for(auto type : gv.indexSet().types(0))
│ │ │ │ +
220 if (!type.isSimplex() && !type.isCube())
│ │ │ │ +
221 DUNE_THROW(Dune::NotImplemented, "Raviart-Thomas elements are only implemented for grids with simplex or cube elements.");
│ │ │ │ +
222
│ │ │ │ +
223 GeometryType type = gv.template begin<0>()->type();
│ │ │ │ +
224 const static int dofsPerElement = type.isCube() ? ((dim == 2) ? k*(k+1)*dim : k*(k+1)*(k+1)*dim) : k*dim;
│ │ │ │ +
225 const static int dofsPerFace = type.isCube() ? (dim-2)*2*k+k+1 : (dim-1)*k+1 ;
│ │ │ │ +
226
│ │ │ │ +
227 dofsPerCodim_ = {{dofsPerElement, dofsPerFace}};
│ │ │ │ +
228 }
│ │ │ │ +
│ │ │ │ +
229
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
231 {
│ │ │ │ +
232 codimOffset_[0] = 0;
│ │ │ │ +
233 codimOffset_[1] = codimOffset_[0] + dofsPerCodim_[0] * gridView_.size(0);
│ │ │ │ +
234 }
│ │ │ │ +
│ │ │ │ +
235
│ │ │ │ +
│ │ │ │ +
238 const GridView& gridView() const
│ │ │ │ +
239 {
│ │ │ │ +
240 return gridView_;
│ │ │ │ +
241 }
│ │ │ │ +
│ │ │ │ +
242
│ │ │ │ +
243 /* \brief Update the stored grid view, to be called if the grid has changed */
│ │ │ │ +
│ │ │ │ +
244 void update (const GridView& gv)
│ │ │ │ +
245 {
│ │ │ │ +
246 gridView_ = gv;
│ │ │ │ +
247 }
│ │ │ │ +
│ │ │ │ +
248
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
253 {
│ │ │ │ +
254 return Node{&finiteElementMap_};
│ │ │ │ +
255 }
│ │ │ │ +
│ │ │ │ +
256
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
258 {
│ │ │ │ +
259 return dofsPerCodim_[0] * gridView_.size(0) + dofsPerCodim_[1] * gridView_.size(1);
│ │ │ │ +
260 }
│ │ │ │ +
│ │ │ │ +
261
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
263 {
│ │ │ │ +
264 size_type result = 0;
│ │ │ │ +
265 for (auto&& type : gridView_.indexSet().types(0))
│ │ │ │ +
266 {
│ │ │ │ +
267 size_t numFaces = ReferenceElements<double,dim>::general(type).size(1);
│ │ │ │ +
268 const static int dofsPerElement = type.isCube() ? ((dim == 2) ? k*(k+1)*dim : k*(k+1)*(k+1)*dim) : k*dim;
│ │ │ │ +
269 const static int dofsPerFace = type.isCube() ? (dim-2)*2*k+k+1 : (dim-1)*k+1 ;
│ │ │ │ +
270 result = std::max(result, dofsPerElement + dofsPerFace * numFaces);
│ │ │ │ +
271 }
│ │ │ │ +
272
│ │ │ │ +
273 return result;
│ │ │ │ +
274 }
│ │ │ │ +
│ │ │ │ +
275
│ │ │ │ +
281 template<typename It>
│ │ │ │ +
│ │ │ │ +
282 It indices(const Node& node, It it) const
│ │ │ │ +
283 {
│ │ │ │ +
284 const auto& gridIndexSet = gridView().indexSet();
│ │ │ │ +
285 const auto& element = node.element();
│ │ │ │ +
286
│ │ │ │ +
287 // throw if Element is not of predefined type
│ │ │ │ +
288 if (not(element.type().isCube()) and not(element.type().isSimplex()))
│ │ │ │ +
289 DUNE_THROW(Dune::NotImplemented, "RaviartThomasBasis only implemented for cube and simplex elements.");
│ │ │ │ +
290
│ │ │ │ +
291 for(std::size_t i=0, end=node.size(); i<end; ++i, ++it)
│ │ │ │ +
292 {
│ │ │ │ +
293 Dune::LocalKey localKey = node.finiteElement().localCoefficients().localKey(i);
│ │ │ │ +
294
│ │ │ │ +
295 // The dimension of the entity that the current dof is related to
│ │ │ │ +
296 size_t subentity = localKey.subEntity();
│ │ │ │ +
297 size_t codim = localKey.codim();
│ │ │ │ +
298
│ │ │ │ +
299 if (not(codim==0 or codim==1))
│ │ │ │ +
300 DUNE_THROW(Dune::NotImplemented, "Grid contains elements not supported for the RaviartThomasBasis");
│ │ │ │ +
301
│ │ │ │ +
302 *it = { codimOffset_[codim] +
│ │ │ │ +
303 dofsPerCodim_[codim] * gridIndexSet.subIndex(element, subentity, codim) + localKey.index() };
│ │ │ │ +
304 }
│ │ │ │ +
305
│ │ │ │ +
306 return it;
│ │ │ │ +
307 }
│ │ │ │ +
│ │ │ │ +
308
│ │ │ │ +
309protected:
│ │ │ │ + │ │ │ │ +
311 std::array<size_t,dim+1> codimOffset_;
│ │ │ │ +
312 FiniteElementMap finiteElementMap_;
│ │ │ │ +
313 // Number of dofs per entity type depending on the entity's codimension and type
│ │ │ │ +
314 std::array<int,dim+1> dofsPerCodim_;
│ │ │ │ +
315};
│ │ │ │ +
│ │ │ │ +
316
│ │ │ │ +
317
│ │ │ │ +
318
│ │ │ │ +
319template<typename GV, int k>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
321 public LeafBasisNode
│ │ │ │ +
322{
│ │ │ │ +
323 static const int dim = GV::dimension;
│ │ │ │ +
324
│ │ │ │ +
325public:
│ │ │ │ +
326
│ │ │ │ +
327 using size_type = std::size_t;
│ │ │ │ +
328 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ +
329 using FiniteElementMap = typename Impl::RaviartThomasLocalFiniteElementMap<GV, dim, double, k>;
│ │ │ │ +
330 using FiniteElement = Impl::GlobalValuedLocalFiniteElement<Impl::ContravariantPiolaTransformator,
│ │ │ │ +
331 typename FiniteElementMap::FiniteElement,
│ │ │ │ +
332 Element>;
│ │ │ │ +
333
│ │ │ │ +
│ │ │ │ +
334 RaviartThomasNode(const FiniteElementMap* finiteElementMap) :
│ │ │ │ +
335 element_(nullptr),
│ │ │ │ +
336 finiteElementMap_(finiteElementMap)
│ │ │ │ +
337 { }
│ │ │ │ +
│ │ │ │ +
338
│ │ │ │ +
│ │ │ │ +
340 const Element& element() const
│ │ │ │ +
341 {
│ │ │ │ +
342 return *element_;
│ │ │ │ +
343 }
│ │ │ │ +
│ │ │ │ +
344
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
350 {
│ │ │ │ +
351 return finiteElement_;
│ │ │ │ +
352 }
│ │ │ │ +
│ │ │ │ +
353
│ │ │ │ +
│ │ │ │ +
355 void bind(const Element& e)
│ │ │ │ +
356 {
│ │ │ │ +
357 element_ = &e;
│ │ │ │ +
358 finiteElement_.bind((finiteElementMap_->find(*element_)), e);
│ │ │ │ +
359 this->setSize(finiteElement_.size());
│ │ │ │ +
360 }
│ │ │ │ +
│ │ │ │ +
361
│ │ │ │ +
362protected:
│ │ │ │ +
363
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
367};
│ │ │ │ +
│ │ │ │ +
368
│ │ │ │ +
369namespace BasisFactory {
│ │ │ │ +
370
│ │ │ │ +
378template<std::size_t k>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
380{
│ │ │ │ +
381 return [](const auto& gridView) {
│ │ │ │ +
382 return RaviartThomasPreBasis<std::decay_t<decltype(gridView)>, k>(gridView);
│ │ │ │ +
383 };
│ │ │ │ +
384}
│ │ │ │ +
│ │ │ │ +
385
│ │ │ │ +
386} // end namespace BasisFactory
│ │ │ │ +
387
│ │ │ │ +
388
│ │ │ │ +
389
│ │ │ │ +
390// *****************************************************************************
│ │ │ │ +
391// This is the actual global basis implementation based on the reusable parts.
│ │ │ │ +
392// *****************************************************************************
│ │ │ │ +
393
│ │ │ │ +
401template<typename GV, int k>
│ │ │ │ + │ │ │ │ +
403
│ │ │ │ +
404} // end namespace Functions
│ │ │ │ +
405} // end namespace Dune
│ │ │ │ +
406
│ │ │ │ +
407
│ │ │ │ +
408#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
auto raviartThomas()
Create a pre-basis factory that can create a Raviart-Thomas pre-basis.
Definition raviartthomasbasis.hh:379
│ │ │ │ +
auto power(ChildPreBasisFactory &&childPreBasisFactory, std::size_t k, const IndexMergingStrategy &)
Create a pre-basis factory that can build a PowerPreBasis.
Definition dynamicpowerbasis.hh:409
│ │ │ │
Definition polynomial.hh:17
│ │ │ │
Global basis for given pre-basis.
Definition defaultglobalbasis.hh:50
│ │ │ │ -
A generic MixIn class for PreBasis with flat indices computed from a mapper.
Definition leafprebasismappermixin.hh:62
│ │ │ │ +
A generic MixIn class for PreBasis.
Definition leafprebasismixin.hh:36
│ │ │ │ +
size_type size() const
Definition nodes.hh:147
│ │ │ │
void setSize(const size_type size)
Definition nodes.hh:169
│ │ │ │
Definition nodes.hh:191
│ │ │ │ -
Definition refinedlagrangebasis.hh:120
│ │ │ │ -
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition refinedlagrangebasis.hh:164
│ │ │ │ -
const Element * element_
Definition refinedlagrangebasis.hh:187
│ │ │ │ -
void bind(const Element &e)
Bind the node to the element e.
Definition refinedlagrangebasis.hh:170
│ │ │ │ -
const FiniteElement finiteElement_
Definition refinedlagrangebasis.hh:186
│ │ │ │ -
static constexpr unsigned int order()
Polynomial order used in the local Lagrange finite-elements in subdomains of the element.
Definition refinedlagrangebasis.hh:180
│ │ │ │ -
typename GV::template Codim< 0 >::Entity Element
Type of the element in the GridView.
Definition refinedlagrangebasis.hh:128
│ │ │ │ -
std::conditional_t<(k==0), Dune::RefinedP0LocalFiniteElement< typename GV::ctype, R, dim >, Dune::RefinedP1LocalFiniteElement< typename GV::ctype, R, dim > > FiniteElement
Type of the local finite-element.
Definition refinedlagrangebasis.hh:133
│ │ │ │ -
RefinedLagrangeNode()
The default constructor initializes all members to their default.
Definition refinedlagrangebasis.hh:144
│ │ │ │ -
const Element & element() const
Return current element. The behavior is undefined if the node is not bound to any element.
Definition refinedlagrangebasis.hh:153
│ │ │ │ -
A pre-basis for a refined Lagrange bases.
Definition refinedlagrangebasis.hh:46
│ │ │ │ -
static constexpr unsigned int order()
Polynomial order used in the local Lagrange finite-elements.
Definition refinedlagrangebasis.hh:109
│ │ │ │ -
Node makeNode() const
Create tree node.
Definition refinedlagrangebasis.hh:97
│ │ │ │ -
GV GridView
The grid view that the FE basis is defined on.
Definition refinedlagrangebasis.hh:75
│ │ │ │ -
RefinedLagrangePreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition refinedlagrangebasis.hh:86
│ │ │ │ +
Definition raviartthomasbasis.hh:322
│ │ │ │ +
typename Impl::RaviartThomasLocalFiniteElementMap< GV, dim, double, k > FiniteElementMap
Definition raviartthomasbasis.hh:329
│ │ │ │ +
void bind(const Element &e)
Bind to element.
Definition raviartthomasbasis.hh:355
│ │ │ │ +
Impl::GlobalValuedLocalFiniteElement< Impl::ContravariantPiolaTransformator, typename FiniteElementMap::FiniteElement, Element > FiniteElement
Definition raviartthomasbasis.hh:332
│ │ │ │ +
typename GV::template Codim< 0 >::Entity Element
Definition raviartthomasbasis.hh:328
│ │ │ │ +
const Element * element_
Definition raviartthomasbasis.hh:365
│ │ │ │ +
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition raviartthomasbasis.hh:349
│ │ │ │ +
std::size_t size_type
Definition raviartthomasbasis.hh:327
│ │ │ │ +
RaviartThomasNode(const FiniteElementMap *finiteElementMap)
Definition raviartthomasbasis.hh:334
│ │ │ │ +
const Element & element() const
Return current element, throw if unbound.
Definition raviartthomasbasis.hh:340
│ │ │ │ +
FiniteElement finiteElement_
Definition raviartthomasbasis.hh:364
│ │ │ │ +
const FiniteElementMap * finiteElementMap_
Definition raviartthomasbasis.hh:366
│ │ │ │ +
Definition raviartthomasbasis.hh:198
│ │ │ │ +
Node makeNode() const
Create tree node.
Definition raviartthomasbasis.hh:252
│ │ │ │ +
std::array< int, dim+1 > dofsPerCodim_
Definition raviartthomasbasis.hh:314
│ │ │ │ +
void update(const GridView &gv)
Definition raviartthomasbasis.hh:244
│ │ │ │ +
RaviartThomasPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition raviartthomasbasis.hh:211
│ │ │ │ +
std::size_t size_type
Definition raviartthomasbasis.hh:206
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition raviartthomasbasis.hh:238
│ │ │ │ +
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:282
│ │ │ │ +
FiniteElementMap finiteElementMap_
Definition raviartthomasbasis.hh:312
│ │ │ │ +
size_type dimension() const
Definition raviartthomasbasis.hh:257
│ │ │ │ +
GV GridView
The grid view that the FE space is defined on.
Definition raviartthomasbasis.hh:205
│ │ │ │ +
size_type maxNodeSize() const
Definition raviartthomasbasis.hh:262
│ │ │ │ +
GridView gridView_
Definition raviartthomasbasis.hh:310
│ │ │ │ +
void initializeIndices()
Definition raviartthomasbasis.hh:230
│ │ │ │ +
std::array< size_t, dim+1 > codimOffset_
Definition raviartthomasbasis.hh:311
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,254 +1,545 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -refinedlagrangebasis.hh │ │ │ │ │ +raviartthomasbasis.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_REFINEDLAGRANGEBASIS_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_REFINEDLAGRANGEBASIS_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11 │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14 │ │ │ │ │ -15#include │ │ │ │ │ -16 │ │ │ │ │ -17#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ -18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_a_p_p_e_r_m_i_x_i_n_._h_h> │ │ │ │ │ -19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ -20 │ │ │ │ │ -21#include │ │ │ │ │ -22 │ │ │ │ │ -23#include │ │ │ │ │ -24 │ │ │ │ │ -25 │ │ │ │ │ -26namespace _D_u_n_e { │ │ │ │ │ -27namespace Functions { │ │ │ │ │ -28 │ │ │ │ │ -29template │ │ │ │ │ -30class RefinedLagrangeNode; │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12 │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15 │ │ │ │ │ +16#include │ │ │ │ │ +17#include │ │ │ │ │ +18#include │ │ │ │ │ +19#include │ │ │ │ │ +20#include │ │ │ │ │ +21#include │ │ │ │ │ +22#include │ │ │ │ │ +23#include │ │ │ │ │ +24#include │ │ │ │ │ +25#include │ │ │ │ │ +26 │ │ │ │ │ +27#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/ │ │ │ │ │ +_g_l_o_b_a_l_v_a_l_u_e_d_l_o_c_a_l_f_i_n_i_t_e_e_l_e_m_e_n_t_._h_h> │ │ │ │ │ +28#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ +29#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ +30#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ 31 │ │ │ │ │ -43template │ │ │ │ │ -_4_4class _R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s : │ │ │ │ │ -45 public _L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n< GV > │ │ │ │ │ -46{ │ │ │ │ │ -47 using _B_a_s_e = _L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_<_ _G_V_ _>; │ │ │ │ │ -48 │ │ │ │ │ -49 static const int dim = GV::dimension; │ │ │ │ │ -50 │ │ │ │ │ -51 // refined basis only implemented for P0 and P1 │ │ │ │ │ -52 static_assert(k == 0 || k == 1); │ │ │ │ │ -53 │ │ │ │ │ -54 // the layout is defined in terms of a MCMGLayout specialized for k == 0 or │ │ │ │ │ -1 │ │ │ │ │ -55 static MCMGLayout dofLayout() │ │ │ │ │ -56 { │ │ │ │ │ -57 if constexpr(k == 0) │ │ │ │ │ -58 // a refined P0 basis assigns each element 2^dim DOFs │ │ │ │ │ -59 return [](GeometryType gt, int) -> size_t { │ │ │ │ │ -60 return (gt.dim() == dim) ? (1 << dim) : 0; │ │ │ │ │ -61 }; │ │ │ │ │ -62 else if constexpr(k == 1) │ │ │ │ │ -63 // a refined P1 basis has the same layout as a P2 basis │ │ │ │ │ -64 return [](GeometryType gt, int) -> size_t { │ │ │ │ │ -65 return Dune::binomial(int(k),int(gt.dim())); │ │ │ │ │ -66 }; │ │ │ │ │ -67 else │ │ │ │ │ -68 DUNE_THROW(Dune::NotImplemented, │ │ │ │ │ -69 "Refined basis not implemented for higher-order Lagrange (k>=2) elements."); │ │ │ │ │ -70 } │ │ │ │ │ -71 │ │ │ │ │ -72public: │ │ │ │ │ -73 │ │ │ │ │ -_7_5 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ -76 │ │ │ │ │ -_7_8 using _N_o_d_e = _R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e_<_G_V_,_ _k_,_ _R_>; │ │ │ │ │ -79 │ │ │ │ │ -_8_6 _R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s (const _G_r_i_d_V_i_e_w& gv) │ │ │ │ │ -87 : _B_a_s_e(gv, dofLayout()) │ │ │ │ │ -88 { │ │ │ │ │ -89 for (auto gt : gv.indexSet().types(0)) { │ │ │ │ │ -90 if (!gt.isSimplex()) │ │ │ │ │ -91 DUNE_THROW(Dune::NotImplemented, │ │ │ │ │ -92 "Refined Lagrange basis only implemented for simplex grids."); │ │ │ │ │ -93 } │ │ │ │ │ -94 } │ │ │ │ │ -95 │ │ │ │ │ -_9_7 _N_o_d_e _m_a_k_e_N_o_d_e () const │ │ │ │ │ -98 { │ │ │ │ │ -99 return _N_o_d_e{}; │ │ │ │ │ -100 } │ │ │ │ │ -101 │ │ │ │ │ -_1_0_9 static constexpr unsigned int _o_r_d_e_r() │ │ │ │ │ -110 { │ │ │ │ │ -111 return k; │ │ │ │ │ -112 } │ │ │ │ │ -113}; │ │ │ │ │ +32namespace _D_u_n_e { │ │ │ │ │ +33namespace Functions { │ │ │ │ │ +34 │ │ │ │ │ +35namespace Impl { │ │ │ │ │ +36 │ │ │ │ │ +37 template │ │ │ │ │ +38 struct RaviartThomasSimplexLocalInfo │ │ │ │ │ +39 { │ │ │ │ │ +40 // Dummy type, must be something that we can have a std::unique_ptr to │ │ │ │ │ +41 using FiniteElement = void*; │ │ │ │ │ +42 }; │ │ │ │ │ +43 │ │ │ │ │ +44 template │ │ │ │ │ +45 struct RaviartThomasSimplexLocalInfo<2,D,R,0> │ │ │ │ │ +46 { │ │ │ │ │ +47 using FiniteElement = RT02DLocalFiniteElement; │ │ │ │ │ +48 }; │ │ │ │ │ +49 │ │ │ │ │ +50 template │ │ │ │ │ +51 struct RaviartThomasSimplexLocalInfo<2,D,R,1> │ │ │ │ │ +52 { │ │ │ │ │ +53 using FiniteElement = RT12DLocalFiniteElement; │ │ │ │ │ +54 }; │ │ │ │ │ +55 │ │ │ │ │ +56 template │ │ │ │ │ +57 struct RaviartThomasSimplexLocalInfo<3,D,R,0> │ │ │ │ │ +58 { │ │ │ │ │ +59 using FiniteElement = RT03DLocalFiniteElement; │ │ │ │ │ +60 }; │ │ │ │ │ +61 │ │ │ │ │ +62 template │ │ │ │ │ +63 struct RaviartThomasCubeLocalInfo │ │ │ │ │ +64 { │ │ │ │ │ +65 // Dummy type, must be something that we can have a std::unique_ptr to │ │ │ │ │ +66 using FiniteElement = void*; │ │ │ │ │ +67 }; │ │ │ │ │ +68 │ │ │ │ │ +69 template │ │ │ │ │ +70 struct RaviartThomasCubeLocalInfo<2,D,R,0> │ │ │ │ │ +71 { │ │ │ │ │ +72 using FiniteElement = RT0Cube2DLocalFiniteElement; │ │ │ │ │ +73 }; │ │ │ │ │ +74 │ │ │ │ │ +75 template │ │ │ │ │ +76 struct RaviartThomasCubeLocalInfo<2,D,R,1> │ │ │ │ │ +77 { │ │ │ │ │ +78 using FiniteElement = RT1Cube2DLocalFiniteElement; │ │ │ │ │ +79 }; │ │ │ │ │ +80 │ │ │ │ │ +81 template │ │ │ │ │ +82 struct RaviartThomasCubeLocalInfo<2,D,R,2> │ │ │ │ │ +83 { │ │ │ │ │ +84 using FiniteElement = RT2Cube2DLocalFiniteElement; │ │ │ │ │ +85 }; │ │ │ │ │ +86 │ │ │ │ │ +87 template │ │ │ │ │ +88 struct RaviartThomasCubeLocalInfo<3,D,R,0> │ │ │ │ │ +89 { │ │ │ │ │ +90 using FiniteElement = RT0Cube3DLocalFiniteElement; │ │ │ │ │ +91 }; │ │ │ │ │ +92 │ │ │ │ │ +93 template │ │ │ │ │ +94 struct RaviartThomasCubeLocalInfo<3,D,R,1> │ │ │ │ │ +95 { │ │ │ │ │ +96 using FiniteElement = RT1Cube3DLocalFiniteElement; │ │ │ │ │ +97 }; │ │ │ │ │ +98 │ │ │ │ │ +99 template │ │ │ │ │ +100 class RaviartThomasLocalFiniteElementMap │ │ │ │ │ +101 { │ │ │ │ │ +102 using D = typename GV::ctype; │ │ │ │ │ +103 constexpr static bool hasFixedElementType = Capabilities:: │ │ │ │ │ +hasSingleGeometryType::v; │ │ │ │ │ +104 │ │ │ │ │ +105 using CubeFiniteElement = typename RaviartThomasCubeLocalInfo::FiniteElement; │ │ │ │ │ +106 using SimplexFiniteElement = typename RaviartThomasSimplexLocalInfo::FiniteElement; │ │ │ │ │ +107 │ │ │ │ │ +108 public: │ │ │ │ │ +109 │ │ │ │ │ +110 using T = LocalBasisTraits, R, dim, │ │ │ │ │ +FieldVector, FieldMatrix >; │ │ │ │ │ +111 │ │ │ │ │ +112 constexpr static unsigned int topologyId = Capabilities:: │ │ │ │ │ +hasSingleGeometryType::topologyId; // meaningless if │ │ │ │ │ +hasFixedElementType is false │ │ │ │ │ +113 constexpr static GeometryType type = GeometryType(topologyId, GV:: │ │ │ │ │ +dimension); │ │ │ │ │ 114 │ │ │ │ │ -115 │ │ │ │ │ -116 │ │ │ │ │ -117template │ │ │ │ │ -_1_1_8class _R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e │ │ │ │ │ -119 : public _L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ -120{ │ │ │ │ │ -121 static constexpr int dim = GV::dimension; │ │ │ │ │ -122 │ │ │ │ │ -123 // refined basis only implemented for P0 and P1 │ │ │ │ │ -124 static_assert(k == 0 || k == 1); │ │ │ │ │ -125 │ │ │ │ │ -126public: │ │ │ │ │ -_1_2_8 using _E_l_e_m_e_n_t = typename GV::template Codim<0>::Entity; │ │ │ │ │ -129 │ │ │ │ │ -_1_3_1 using _F_i_n_i_t_e_E_l_e_m_e_n_t = std::conditional_t<(k==0), │ │ │ │ │ -132 Dune::RefinedP0LocalFiniteElement, │ │ │ │ │ -133 Dune::RefinedP1LocalFiniteElement>; │ │ │ │ │ -134 │ │ │ │ │ -_1_4_4 _R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e () │ │ │ │ │ -145 : _f_i_n_i_t_e_E_l_e_m_e_n_t__{} │ │ │ │ │ -146 , _e_l_e_m_e_n_t__(nullptr) │ │ │ │ │ -147 {} │ │ │ │ │ -148 │ │ │ │ │ -_1_5_3 const _E_l_e_m_e_n_t& _e_l_e_m_e_n_t () const │ │ │ │ │ -154 { │ │ │ │ │ -155 return *_e_l_e_m_e_n_t__; │ │ │ │ │ +115 using FiniteElement = std::conditional_t, │ │ │ │ │ +117 LocalFiniteElementVariant >; │ │ │ │ │ +118 │ │ │ │ │ +119 // Each element facet can have its orientation reversed, hence there are │ │ │ │ │ +120 // 2^#facets different variants. │ │ │ │ │ +121 static std::size_t numVariants(GeometryType type) │ │ │ │ │ +122 { │ │ │ │ │ +123 auto numFacets = referenceElement(type).size(1); │ │ │ │ │ +124 return _p_o_w_e_r(2,numFacets); │ │ │ │ │ +125 } │ │ │ │ │ +126 │ │ │ │ │ +127 RaviartThomasLocalFiniteElementMap(const GV& gv) │ │ │ │ │ +128 : elementMapper_(gv, mcmgElementLayout()), │ │ │ │ │ +129 orient_(gv.size(0)) │ │ │ │ │ +130 { │ │ │ │ │ +131 if constexpr (hasFixedElementType) │ │ │ │ │ +132 { │ │ │ │ │ +133 variants_.resize(numVariants(type)); │ │ │ │ │ +134 for (size_t i = 0; i < numVariants(type); i++) │ │ │ │ │ +135 variants_[i] = FiniteElement(i); │ │ │ │ │ +136 } │ │ │ │ │ +137 else │ │ │ │ │ +138 { │ │ │ │ │ +139 // for mixed grids add offset for cubes │ │ │ │ │ +140 variants_.resize(numVariants(GeometryTypes::simplex(dim)) + numVariants │ │ │ │ │ +(GeometryTypes::cube(dim))); │ │ │ │ │ +141 for (size_t i = 0; i < numVariants(GeometryTypes::simplex(dim)); i++) │ │ │ │ │ +142 variants_[i] = SimplexFiniteElement(i); │ │ │ │ │ +143 for (size_t i = 0; i < numVariants(GeometryTypes::cube(dim)); i++) │ │ │ │ │ +144 variants_[i + numVariants(GeometryTypes::simplex(dim))] = CubeFiniteElement │ │ │ │ │ +(i); │ │ │ │ │ +145 } │ │ │ │ │ +146 │ │ │ │ │ +147 for(const auto& cell : elements(gv)) │ │ │ │ │ +148 { │ │ │ │ │ +149 unsigned int myId = elementMapper_.index(cell); │ │ │ │ │ +150 orient_[myId] = 0; │ │ │ │ │ +151 │ │ │ │ │ +152 for (const auto& intersection : intersections(gv,cell)) │ │ │ │ │ +153 { │ │ │ │ │ +154 if (intersection.neighbor() && (elementMapper_.index(intersection.outside │ │ │ │ │ +()) > myId)) │ │ │ │ │ +155 orient_[myId] |= (1 << intersection.indexInInside()); │ │ │ │ │ 156 } │ │ │ │ │ 157 │ │ │ │ │ -_1_6_4 const _F_i_n_i_t_e_E_l_e_m_e_n_t& _f_i_n_i_t_e_E_l_e_m_e_n_t () const │ │ │ │ │ -165 { │ │ │ │ │ -166 return _f_i_n_i_t_e_E_l_e_m_e_n_t__; │ │ │ │ │ -167 } │ │ │ │ │ -168 │ │ │ │ │ -_1_7_0 void _b_i_n_d (const _E_l_e_m_e_n_t& e) │ │ │ │ │ -171 { │ │ │ │ │ -172 _e_l_e_m_e_n_t__ = &e; │ │ │ │ │ -173 this->_s_e_t_S_i_z_e(_f_i_n_i_t_e_E_l_e_m_e_n_t__.size()); │ │ │ │ │ -174 } │ │ │ │ │ -175 │ │ │ │ │ -_1_8_0 static constexpr unsigned int _o_r_d_e_r() │ │ │ │ │ -181 { │ │ │ │ │ -182 return k; │ │ │ │ │ -183 } │ │ │ │ │ -184 │ │ │ │ │ -185protected: │ │ │ │ │ -_1_8_6 const _F_i_n_i_t_e_E_l_e_m_e_n_t _f_i_n_i_t_e_E_l_e_m_e_n_t__; │ │ │ │ │ -_1_8_7 const _E_l_e_m_e_n_t* _e_l_e_m_e_n_t__; │ │ │ │ │ -188}; │ │ │ │ │ -189 │ │ │ │ │ -190 │ │ │ │ │ +158 // for mixed grids add offset for cubes │ │ │ │ │ +159 if constexpr (!hasFixedElementType) │ │ │ │ │ +160 if (cell.type().isCube()) │ │ │ │ │ +161 orient_[myId] += numVariants(GeometryTypes::simplex(dim)); │ │ │ │ │ +162 } │ │ │ │ │ +163 } │ │ │ │ │ +164 │ │ │ │ │ +165 template │ │ │ │ │ +166 const FiniteElement& find(const EntityType& e) const │ │ │ │ │ +167 { │ │ │ │ │ +168 return variants_[orient_[elementMapper_.index(e)]]; │ │ │ │ │ +169 } │ │ │ │ │ +170 │ │ │ │ │ +171 private: │ │ │ │ │ +172 std::vector variants_; │ │ │ │ │ +173 Dune::MultipleCodimMultipleGeomTypeMapper elementMapper_; │ │ │ │ │ +174 std::vector orient_; │ │ │ │ │ +175 }; │ │ │ │ │ +176 │ │ │ │ │ +177 │ │ │ │ │ +178} // namespace Impl │ │ │ │ │ +179 │ │ │ │ │ +180 │ │ │ │ │ +181/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ +182// This is the reusable part of the basis. It contains │ │ │ │ │ +183// │ │ │ │ │ +184// RaviartThomasPreBasis │ │ │ │ │ +185// RaviartThomasNode │ │ │ │ │ +186// │ │ │ │ │ +187// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ +shared │ │ │ │ │ +188// state. These components do _not_ depend on the global basis and local │ │ │ │ │ +view │ │ │ │ │ +189// and can be used without a global basis. │ │ │ │ │ +190/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ 191 │ │ │ │ │ -192namespace BasisFactory { │ │ │ │ │ -193 │ │ │ │ │ -201template │ │ │ │ │ -_2_0_2auto _r_e_f_i_n_e_d_L_a_g_r_a_n_g_e () │ │ │ │ │ -203{ │ │ │ │ │ -204 return [](const auto& gridView) { │ │ │ │ │ -205 return _R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s, k, R> │ │ │ │ │ +192template │ │ │ │ │ +193class RaviartThomasNode; │ │ │ │ │ +194 │ │ │ │ │ +195template │ │ │ │ │ +_1_9_6class _R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s : │ │ │ │ │ +197 public _L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n< RaviartThomasPreBasis > │ │ │ │ │ +198{ │ │ │ │ │ +199 static const int dim = GV::dimension; │ │ │ │ │ +200 using FiniteElementMap = typename Impl:: │ │ │ │ │ +RaviartThomasLocalFiniteElementMap; │ │ │ │ │ +201 │ │ │ │ │ +202public: │ │ │ │ │ +203 │ │ │ │ │ +_2_0_5 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ +_2_0_6 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ +207 │ │ │ │ │ +_2_0_8 using _N_o_d_e = _R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_<_G_V_,_ _k_>; │ │ │ │ │ +209 │ │ │ │ │ +_2_1_1 _R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s(const _G_r_i_d_V_i_e_w& gv) : │ │ │ │ │ +212 _g_r_i_d_V_i_e_w__(gv), │ │ │ │ │ +213 _f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__(gv) │ │ │ │ │ +214 { │ │ │ │ │ +215 // Currently there are some unresolved bugs with hybrid grids and higher │ │ │ │ │ +order Raviart-Thomas elements │ │ │ │ │ +216 if (gv.indexSet().types(0).size() > 1 and k>0) │ │ │ │ │ +217 DUNE_THROW(Dune::NotImplemented, "Raviart-Thomas basis with index k>0 is │ │ │ │ │ +only implemented for grids with a single element type"); │ │ │ │ │ +218 │ │ │ │ │ +219 for(auto type : gv.indexSet().types(0)) │ │ │ │ │ +220 if (!type.isSimplex() && !type.isCube()) │ │ │ │ │ +221 DUNE_THROW(Dune::NotImplemented, "Raviart-Thomas elements are only │ │ │ │ │ +implemented for grids with simplex or cube elements."); │ │ │ │ │ +222 │ │ │ │ │ +223 GeometryType type = gv.template begin<0>()->type(); │ │ │ │ │ +224 const static int dofsPerElement = type.isCube() ? ((dim == 2) ? k*(k+1)*dim │ │ │ │ │ +: k*(k+1)*(k+1)*dim) : k*dim; │ │ │ │ │ +225 const static int dofsPerFace = type.isCube() ? (dim-2)*2*k+k+1 : (dim- │ │ │ │ │ +1)*k+1 ; │ │ │ │ │ +226 │ │ │ │ │ +227 _d_o_f_s_P_e_r_C_o_d_i_m__ = {{dofsPerElement, dofsPerFace}}; │ │ │ │ │ +228 } │ │ │ │ │ +229 │ │ │ │ │ +_2_3_0 void _i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s() │ │ │ │ │ +231 { │ │ │ │ │ +232 _c_o_d_i_m_O_f_f_s_e_t__[0] = 0; │ │ │ │ │ +233 _c_o_d_i_m_O_f_f_s_e_t__[1] = _c_o_d_i_m_O_f_f_s_e_t__[0] + _d_o_f_s_P_e_r_C_o_d_i_m__[0] * _g_r_i_d_V_i_e_w__.size(0); │ │ │ │ │ +234 } │ │ │ │ │ +235 │ │ │ │ │ +_2_3_8 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ +239 { │ │ │ │ │ +240 return _g_r_i_d_V_i_e_w__; │ │ │ │ │ +241 } │ │ │ │ │ +242 │ │ │ │ │ +243 /* \brief Update the stored grid view, to be called if the grid has changed │ │ │ │ │ +*/ │ │ │ │ │ +_2_4_4 void _u_p_d_a_t_e (const _G_r_i_d_V_i_e_w& gv) │ │ │ │ │ +245 { │ │ │ │ │ +246 _g_r_i_d_V_i_e_w__ = gv; │ │ │ │ │ +247 } │ │ │ │ │ +248 │ │ │ │ │ +_2_5_2 _N_o_d_e _m_a_k_e_N_o_d_e() const │ │ │ │ │ +253 { │ │ │ │ │ +254 return _N_o_d_e{&_f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__}; │ │ │ │ │ +255 } │ │ │ │ │ +256 │ │ │ │ │ +_2_5_7 _s_i_z_e___t_y_p_e _d_i_m_e_n_s_i_o_n() const │ │ │ │ │ +258 { │ │ │ │ │ +259 return _d_o_f_s_P_e_r_C_o_d_i_m__[0] * _g_r_i_d_V_i_e_w__.size(0) + _d_o_f_s_P_e_r_C_o_d_i_m__[1] * │ │ │ │ │ +_g_r_i_d_V_i_e_w__.size(1); │ │ │ │ │ +260 } │ │ │ │ │ +261 │ │ │ │ │ +_2_6_2 _s_i_z_e___t_y_p_e _m_a_x_N_o_d_e_S_i_z_e() const │ │ │ │ │ +263 { │ │ │ │ │ +264 _s_i_z_e___t_y_p_e result = 0; │ │ │ │ │ +265 for (auto&& type : _g_r_i_d_V_i_e_w__.indexSet().types(0)) │ │ │ │ │ +266 { │ │ │ │ │ +267 size_t numFaces = ReferenceElements::general(type).size(1); │ │ │ │ │ +268 const static int dofsPerElement = type.isCube() ? ((dim == 2) ? k*(k+1)*dim │ │ │ │ │ +: k*(k+1)*(k+1)*dim) : k*dim; │ │ │ │ │ +269 const static int dofsPerFace = type.isCube() ? (dim-2)*2*k+k+1 : (dim- │ │ │ │ │ +1)*k+1 ; │ │ │ │ │ +270 result = std::max(result, dofsPerElement + dofsPerFace * numFaces); │ │ │ │ │ +271 } │ │ │ │ │ +272 │ │ │ │ │ +273 return result; │ │ │ │ │ +274 } │ │ │ │ │ +275 │ │ │ │ │ +281 template │ │ │ │ │ +_2_8_2 It _i_n_d_i_c_e_s(const _N_o_d_e& node, It it) const │ │ │ │ │ +283 { │ │ │ │ │ +284 const auto& gridIndexSet = _g_r_i_d_V_i_e_w().indexSet(); │ │ │ │ │ +285 const auto& element = node._e_l_e_m_e_n_t(); │ │ │ │ │ +286 │ │ │ │ │ +287 // throw if Element is not of predefined type │ │ │ │ │ +288 if (not(element.type().isCube()) and not(element.type().isSimplex())) │ │ │ │ │ +289 DUNE_THROW(Dune::NotImplemented, "RaviartThomasBasis only implemented for │ │ │ │ │ +cube and simplex elements."); │ │ │ │ │ +290 │ │ │ │ │ +291 for(std::size_t i=0, end=node._s_i_z_e(); i _c_o_d_i_m_O_f_f_s_e_t__; │ │ │ │ │ +_3_1_2 FiniteElementMap _f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__; │ │ │ │ │ +313 // Number of dofs per entity type depending on the entity's codimension and │ │ │ │ │ +type │ │ │ │ │ +_3_1_4 std::array _d_o_f_s_P_e_r_C_o_d_i_m__; │ │ │ │ │ +315}; │ │ │ │ │ +316 │ │ │ │ │ +317 │ │ │ │ │ +318 │ │ │ │ │ +319template │ │ │ │ │ +_3_2_0class _R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e : │ │ │ │ │ +321 public _L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ +322{ │ │ │ │ │ +323 static const int dim = GV::dimension; │ │ │ │ │ +324 │ │ │ │ │ +325public: │ │ │ │ │ +326 │ │ │ │ │ +_3_2_7 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ +_3_2_8 using _E_l_e_m_e_n_t = typename GV::template Codim<0>::Entity; │ │ │ │ │ +_3_2_9 using _F_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p = typename Impl:: │ │ │ │ │ +RaviartThomasLocalFiniteElementMap; │ │ │ │ │ +_3_3_0 using _F_i_n_i_t_e_E_l_e_m_e_n_t = Impl::GlobalValuedLocalFiniteElement; │ │ │ │ │ +333 │ │ │ │ │ +_3_3_4 _R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e(const _F_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p* finiteElementMap) : │ │ │ │ │ +335 _e_l_e_m_e_n_t__(nullptr), │ │ │ │ │ +336 _f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__(finiteElementMap) │ │ │ │ │ +337 { } │ │ │ │ │ +338 │ │ │ │ │ +_3_4_0 const _E_l_e_m_e_n_t& _e_l_e_m_e_n_t() const │ │ │ │ │ +341 { │ │ │ │ │ +342 return *_e_l_e_m_e_n_t__; │ │ │ │ │ +343 } │ │ │ │ │ +344 │ │ │ │ │ +_3_4_9 const _F_i_n_i_t_e_E_l_e_m_e_n_t& _f_i_n_i_t_e_E_l_e_m_e_n_t() const │ │ │ │ │ +350 { │ │ │ │ │ +351 return _f_i_n_i_t_e_E_l_e_m_e_n_t__; │ │ │ │ │ +352 } │ │ │ │ │ +353 │ │ │ │ │ +_3_5_5 void _b_i_n_d(const _E_l_e_m_e_n_t& e) │ │ │ │ │ +356 { │ │ │ │ │ +357 _e_l_e_m_e_n_t__ = &e; │ │ │ │ │ +358 _f_i_n_i_t_e_E_l_e_m_e_n_t__.bind((_f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__->find(*_e_l_e_m_e_n_t__)), e); │ │ │ │ │ +359 this->_s_e_t_S_i_z_e(_f_i_n_i_t_e_E_l_e_m_e_n_t__.size()); │ │ │ │ │ +360 } │ │ │ │ │ +361 │ │ │ │ │ +362protected: │ │ │ │ │ +363 │ │ │ │ │ +_3_6_4 _F_i_n_i_t_e_E_l_e_m_e_n_t _f_i_n_i_t_e_E_l_e_m_e_n_t__; │ │ │ │ │ +_3_6_5 const _E_l_e_m_e_n_t* _e_l_e_m_e_n_t__; │ │ │ │ │ +_3_6_6 const _F_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p* _f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__; │ │ │ │ │ +367}; │ │ │ │ │ +368 │ │ │ │ │ +369namespace BasisFactory { │ │ │ │ │ +370 │ │ │ │ │ +378template │ │ │ │ │ +_3_7_9auto _r_a_v_i_a_r_t_T_h_o_m_a_s() │ │ │ │ │ +380{ │ │ │ │ │ +381 return [](const auto& gridView) { │ │ │ │ │ +382 return _R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s, k> │ │ │ │ │ (gridView); │ │ │ │ │ -206 }; │ │ │ │ │ -207} │ │ │ │ │ -208 │ │ │ │ │ -209} // end namespace BasisFactory │ │ │ │ │ -210 │ │ │ │ │ -211 │ │ │ │ │ -225template │ │ │ │ │ -_2_2_6using _R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_B_a_s_i_s = │ │ │ │ │ -_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_<_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_<_G_V_,_k_,_R_> >; │ │ │ │ │ -227 │ │ │ │ │ -228} // end namespace Functions │ │ │ │ │ -229} // end namespace Dune │ │ │ │ │ -230 │ │ │ │ │ -231 │ │ │ │ │ -232#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_REFINEDLAGRANGEBASIS_HH │ │ │ │ │ -_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h │ │ │ │ │ -_l_e_a_f_p_r_e_b_a_s_i_s_m_a_p_p_e_r_m_i_x_i_n_._h_h │ │ │ │ │ +383 }; │ │ │ │ │ +384} │ │ │ │ │ +385 │ │ │ │ │ +386} // end namespace BasisFactory │ │ │ │ │ +387 │ │ │ │ │ +388 │ │ │ │ │ +389 │ │ │ │ │ +390/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ +391// This is the actual global basis implementation based on the reusable │ │ │ │ │ +parts. │ │ │ │ │ +392/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ +393 │ │ │ │ │ +401template │ │ │ │ │ +_4_0_2using _R_a_v_i_a_r_t_T_h_o_m_a_s_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_<_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_<_G_V_,_ _k_> │ │ │ │ │ +>; │ │ │ │ │ +403 │ │ │ │ │ +404} // end namespace Functions │ │ │ │ │ +405} // end namespace Dune │ │ │ │ │ +406 │ │ │ │ │ +407 │ │ │ │ │ +408#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH │ │ │ │ │ +_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h │ │ │ │ │ _n_o_d_e_s_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_r_e_f_i_n_e_d_L_a_g_r_a_n_g_e │ │ │ │ │ -auto refinedLagrange() │ │ │ │ │ -Create a pre-basis factory that can create a RefinedLagrange pre-basis. │ │ │ │ │ -DDeeffiinniittiioonn refinedlagrangebasis.hh:202 │ │ │ │ │ +_g_l_o_b_a_l_v_a_l_u_e_d_l_o_c_a_l_f_i_n_i_t_e_e_l_e_m_e_n_t_._h_h │ │ │ │ │ +_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_r_a_v_i_a_r_t_T_h_o_m_a_s │ │ │ │ │ +auto raviartThomas() │ │ │ │ │ +Create a pre-basis factory that can create a Raviart-Thomas pre-basis. │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:379 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_p_o_w_e_r │ │ │ │ │ +auto power(ChildPreBasisFactory &&childPreBasisFactory, std::size_t k, const │ │ │ │ │ +IndexMergingStrategy &) │ │ │ │ │ +Create a pre-basis factory that can build a PowerPreBasis. │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:409 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ Global basis for given pre-basis. │ │ │ │ │ DDeeffiinniittiioonn defaultglobalbasis.hh:50 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n │ │ │ │ │ -A generic MixIn class for PreBasis with flat indices computed from a mapper. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismappermixin.hh:62 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n │ │ │ │ │ +A generic MixIn class for PreBasis. │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismixin.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_i_z_e │ │ │ │ │ +size_type size() const │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:147 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_e_t_S_i_z_e │ │ │ │ │ void setSize(const size_type size) │ │ │ │ │ DDeeffiinniittiioonn nodes.hh:169 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ DDeeffiinniittiioonn nodes.hh:191 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e │ │ │ │ │ -DDeeffiinniittiioonn refinedlagrangebasis.hh:120 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ -const FiniteElement & finiteElement() const │ │ │ │ │ -Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ -DDeeffiinniittiioonn refinedlagrangebasis.hh:164 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e_:_:_e_l_e_m_e_n_t__ │ │ │ │ │ -const Element * element_ │ │ │ │ │ -DDeeffiinniittiioonn refinedlagrangebasis.hh:187 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e_:_:_b_i_n_d │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:322 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_:_:_F_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p │ │ │ │ │ +typename Impl::RaviartThomasLocalFiniteElementMap< GV, dim, double, k > │ │ │ │ │ +FiniteElementMap │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:329 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_:_:_b_i_n_d │ │ │ │ │ void bind(const Element &e) │ │ │ │ │ -Bind the node to the element e. │ │ │ │ │ -DDeeffiinniittiioonn refinedlagrangebasis.hh:170 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t__ │ │ │ │ │ -const FiniteElement finiteElement_ │ │ │ │ │ -DDeeffiinniittiioonn refinedlagrangebasis.hh:186 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e_:_:_o_r_d_e_r │ │ │ │ │ -static constexpr unsigned int order() │ │ │ │ │ -Polynomial order used in the local Lagrange finite-elements in subdomains of │ │ │ │ │ -the element. │ │ │ │ │ -DDeeffiinniittiioonn refinedlagrangebasis.hh:180 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e_:_:_E_l_e_m_e_n_t │ │ │ │ │ +Bind to element. │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:355 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_:_:_F_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ +Impl::GlobalValuedLocalFiniteElement< Impl::ContravariantPiolaTransformator, │ │ │ │ │ +typename FiniteElementMap::FiniteElement, Element > FiniteElement │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:332 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_:_:_E_l_e_m_e_n_t │ │ │ │ │ typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ -Type of the element in the GridView. │ │ │ │ │ -DDeeffiinniittiioonn refinedlagrangebasis.hh:128 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e_:_:_F_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ -std::conditional_t<(k==0), Dune::RefinedP0LocalFiniteElement< typename GV:: │ │ │ │ │ -ctype, R, dim >, Dune::RefinedP1LocalFiniteElement< typename GV::ctype, R, dim │ │ │ │ │ -> > FiniteElement │ │ │ │ │ -Type of the local finite-element. │ │ │ │ │ -DDeeffiinniittiioonn refinedlagrangebasis.hh:133 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e │ │ │ │ │ -RefinedLagrangeNode() │ │ │ │ │ -The default constructor initializes all members to their default. │ │ │ │ │ -DDeeffiinniittiioonn refinedlagrangebasis.hh:144 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_N_o_d_e_:_:_e_l_e_m_e_n_t │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:328 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_:_:_e_l_e_m_e_n_t__ │ │ │ │ │ +const Element * element_ │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:365 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ +const FiniteElement & finiteElement() const │ │ │ │ │ +Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:349 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:327 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e │ │ │ │ │ +RaviartThomasNode(const FiniteElementMap *finiteElementMap) │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:334 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_:_:_e_l_e_m_e_n_t │ │ │ │ │ const Element & element() const │ │ │ │ │ -Return current element. The behavior is undefined if the node is not bound to │ │ │ │ │ -any element. │ │ │ │ │ -DDeeffiinniittiioonn refinedlagrangebasis.hh:153 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s │ │ │ │ │ -A pre-basis for a refined Lagrange bases. │ │ │ │ │ -DDeeffiinniittiioonn refinedlagrangebasis.hh:46 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_o_r_d_e_r │ │ │ │ │ -static constexpr unsigned int order() │ │ │ │ │ -Polynomial order used in the local Lagrange finite-elements. │ │ │ │ │ -DDeeffiinniittiioonn refinedlagrangebasis.hh:109 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ +Return current element, throw if unbound. │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:340 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t__ │ │ │ │ │ +FiniteElement finiteElement_ │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:364 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__ │ │ │ │ │ +const FiniteElementMap * finiteElementMap_ │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:366 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:198 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ Node makeNode() const │ │ │ │ │ Create tree node. │ │ │ │ │ -DDeeffiinniittiioonn refinedlagrangebasis.hh:97 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ -GV GridView │ │ │ │ │ -The grid view that the FE basis is defined on. │ │ │ │ │ -DDeeffiinniittiioonn refinedlagrangebasis.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s_:_:_R_e_f_i_n_e_d_L_a_g_r_a_n_g_e_P_r_e_B_a_s_i_s │ │ │ │ │ -RefinedLagrangePreBasis(const GridView &gv) │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:252 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_d_o_f_s_P_e_r_C_o_d_i_m__ │ │ │ │ │ +std::array< int, dim+1 > dofsPerCodim_ │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:314 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_u_p_d_a_t_e │ │ │ │ │ +void update(const GridView &gv) │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:244 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s │ │ │ │ │ +RaviartThomasPreBasis(const GridView &gv) │ │ │ │ │ Constructor for a given grid view object. │ │ │ │ │ -DDeeffiinniittiioonn refinedlagrangebasis.hh:86 │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:211 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:206 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ +const GridView & gridView() const │ │ │ │ │ +Obtain the grid view that the basis is defined on. │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:238 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s │ │ │ │ │ +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. │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:282 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__ │ │ │ │ │ +FiniteElementMap finiteElementMap_ │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:312 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ +size_type dimension() const │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:257 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ +GV GridView │ │ │ │ │ +The grid view that the FE space is defined on. │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:205 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_m_a_x_N_o_d_e_S_i_z_e │ │ │ │ │ +size_type maxNodeSize() const │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:262 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w__ │ │ │ │ │ +GridView gridView_ │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:310 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s │ │ │ │ │ +void initializeIndices() │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:230 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_v_i_a_r_t_T_h_o_m_a_s_P_r_e_B_a_s_i_s_:_:_c_o_d_i_m_O_f_f_s_e_t__ │ │ │ │ │ +std::array< size_t, dim+1 > codimOffset_ │ │ │ │ │ +DDeeffiinniittiioonn raviartthomasbasis.hh:311 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00179.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: basistags.hh File Reference │ │ │ │ +dune-functions: transformedindexbasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -73,77 +73,73 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
basistags.hh File Reference
│ │ │ │ +
transformedindexbasis.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ -#include <dune/common/concept.hh>
│ │ │ │ +
#include <tuple>
│ │ │ │ +#include <utility>
│ │ │ │ +#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

struct  Dune::Functions::Concept::IndexMergingStrategy
class  Dune::Functions::Experimental::TransformedIndexPreBasis< RPB, T >
 A pre-basis transforming multi-indices. More...
 
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::BasisFactory::Experimental::GenericIndexingTransformation< IndexTransformation, SizeImplementation, ContainerDescriptorImplementation, minIS, maxIS >
 A generic implementation of a transformation. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ 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.
 
constexpr FlatInterleaved Dune::Functions::BasisFactory::flatInterleaved ()
 Creates an interleaved merging of direct children without blocking.
 
constexpr BlockedLexicographic Dune::Functions::BasisFactory::blockedLexicographic ()
 Creates a lexicographic merging of direct children with blocking (i.e. creating one block per direct child).
 
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).
 
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.
 
template<class IndexTransformation , class SizeImplementation , class ContainerDescriptorImplementation , std::size_t minIndexSize, std::size_t maxIndexSize>
auto Dune::Functions::BasisFactory::Experimental::indexTransformation (IndexTransformation &&indexTransformation, SizeImplementation &&sizeImplementation, ContainerDescriptorImplementation &&containerDescriptorImplementation, Dune::index_constant< minIndexSize >, Dune::index_constant< maxIndexSize >)
 A generic implementation of a transformation.
 
template<class IndexTransformation , class SizeImplementation , std::size_t minIndexSize, std::size_t maxIndexSize>
auto Dune::Functions::BasisFactory::Experimental::indexTransformation (IndexTransformation &&indexTrafo, SizeImplementation &&sizeImpl, Dune::index_constant< minIndexSize > minSize, Dune::index_constant< maxIndexSize > maxSize)
 Fallback implementation if no container descriptor argument is given.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -2,79 +2,73 @@ │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -basistags.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +transformedindexbasis.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_s_t_a_t_i_c_f_o_r_l_o_o_p_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_u_t_i_l_i_t_y_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_b_a_s_i_s_t_a_g_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_<_ _R_P_B_,_ _T_ _> │ │ │ │ │ +  A pre-basis transforming multi-indices. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ -  Base class for index merging strategies to simplify detection. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_F_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c │ │ │ │ │ -  Lexicographic merging of direct children without blocking. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_F_l_a_t_I_n_t_e_r_l_e_a_v_e_d │ │ │ │ │ -  Interleaved merging of direct children without blocking. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_B_l_o_c_k_e_d_L_e_x_i_c_o_g_r_a_p_h_i_c │ │ │ │ │ -  Lexicographic merging of direct children with blocking (i.e. creating │ │ │ │ │ - one block per direct child). _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_B_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d │ │ │ │ │ -  Interleaved merging of direct children with blocking (i.e. creating │ │ │ │ │ - blocks at the leaves containing one leaf per child each). _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_: │ │ │ │ │ + _G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n_<_ _I_n_d_e_x_T_r_a_n_s_f_o_r_m_a_t_i_o_n_,_ _S_i_z_e_I_m_p_l_e_m_e_n_t_a_t_i_o_n_, │ │ │ │ │ + _C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_I_m_p_l_e_m_e_n_t_a_t_i_o_n_,_ _m_i_n_I_S_,_ _m_a_x_I_S_ _> │ │ │ │ │ +  A generic implementation of a transformation. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t │ │ │ │ │ +namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_B_u_i_l_d_e_r │ │ │ │ │ +namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ - static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_: │ │ │ │ │ - _i_s_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y () │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - static constexpr bool  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_: │ │ │ │ │ - _i_s_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y (T &&t) │ │ │ │ │ -  │ │ │ │ │ - void  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_: │ │ │ │ │ - _r_e_g_i_s_t_e_r_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ - (_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y) │ │ │ │ │ -  │ │ │ │ │ - constexpr _F_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_: │ │ │ │ │ - _f_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c () │ │ │ │ │ -  Creates a lexicographic merging of direct │ │ │ │ │ - children without blocking. │ │ │ │ │ -  │ │ │ │ │ - constexpr _F_l_a_t_I_n_t_e_r_l_e_a_v_e_d  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_f_l_a_t_I_n_t_e_r_l_e_a_v_e_d │ │ │ │ │ - () │ │ │ │ │ -  Creates an interleaved merging of direct │ │ │ │ │ - children without blocking. │ │ │ │ │ -  │ │ │ │ │ -constexpr _B_l_o_c_k_e_d_L_e_x_i_c_o_g_r_a_p_h_i_c  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_: │ │ │ │ │ - _b_l_o_c_k_e_d_L_e_x_i_c_o_g_r_a_p_h_i_c () │ │ │ │ │ - Creates a lexicographic merging of direct │ │ │ │ │ -  children with blocking (i.e. creating one block │ │ │ │ │ - per direct child). │ │ │ │ │ -  │ │ │ │ │ - constexpr _B_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_: │ │ │ │ │ - _b_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d () │ │ │ │ │ - Creates an interleaved merging of direct │ │ │ │ │ -  children with blocking (i.e. creating blocks at │ │ │ │ │ - the leaves containing one leaf per child each). │ │ │ │ │ +template │ │ │ │ │ +   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s (RPB &&, T &&) - │ │ │ │ │ + > _T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s< std::decay_t< RPB >, std::decay_t< T > > │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_t_r_a_n_s_f_o_r_m_I_n_d_i_c_e_s │ │ │ │ │ + (RawPreBasisFactory &&preBasisFactory, Transformation &&transformation) │ │ │ │ │ +  Create a TransformedIndexPreBasisFactory. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_i_n_d_e_x_T_r_a_n_s_f_o_r_m_a_t_i_o_n │ │ │ │ │ + (IndexTransformation &&indexTransformation, SizeImplementation │ │ │ │ │ + &&sizeImplementation, ContainerDescriptorImplementation │ │ │ │ │ + &&containerDescriptorImplementation, Dune::index_constant< minIndexSize │ │ │ │ │ + >, Dune::index_constant< maxIndexSize >) │ │ │ │ │ +  A generic implementation of a transformation. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_i_n_d_e_x_T_r_a_n_s_f_o_r_m_a_t_i_o_n │ │ │ │ │ + (IndexTransformation &&indexTrafo, SizeImplementation &&sizeImpl, Dune:: │ │ │ │ │ + index_constant< minIndexSize > minSize, Dune::index_constant< │ │ │ │ │ + maxIndexSize > maxSize) │ │ │ │ │ +  Fallback implementation if no container descriptor argument is given. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00179_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: basistags.hh Source File │ │ │ │ +dune-functions: transformedindexbasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,150 +74,360 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
basistags.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BASISTAGS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BASISTAGS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH
│ │ │ │
9
│ │ │ │ -
10#include <type_traits>
│ │ │ │ -
11#include <dune/common/concept.hh>
│ │ │ │ +
10#include <tuple>
│ │ │ │ +
11#include <utility>
│ │ │ │
12
│ │ │ │ -
13namespace Dune {
│ │ │ │ -
14namespace Functions {
│ │ │ │ -
15
│ │ │ │ -
16 namespace Concept {
│ │ │ │ +
13#include <dune/common/hybridutilities.hh>
│ │ │ │ +
14#include <dune/common/reservedvector.hh>
│ │ │ │ +
15#include <dune/common/typeutilities.hh>
│ │ │ │ +
16#include <dune/common/hybridutilities.hh>
│ │ │ │
17
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
19 {
│ │ │ │ -
20 template<typename T>
│ │ │ │ -
21 auto require(T&& t) -> decltype(
│ │ │ │ -
22 registerIndexMergingStrategy(t)
│ │ │ │ -
23 );
│ │ │ │ -
24 };
│ │ │ │ -
│ │ │ │ -
25
│ │ │ │ -
26 template<typename T>
│ │ │ │ -
│ │ │ │ -
27 static constexpr bool isIndexMergingStrategy()
│ │ │ │ -
28 {
│ │ │ │ -
29 return models<Concept::IndexMergingStrategy,T>();
│ │ │ │ -
30 }
│ │ │ │ -
│ │ │ │ -
31
│ │ │ │ -
32 template<typename T>
│ │ │ │ -
│ │ │ │ -
33 static constexpr bool isIndexMergingStrategy(T&& t)
│ │ │ │ -
34 {
│ │ │ │ -
35 return models<Concept::IndexMergingStrategy,std::decay_t<T>>();
│ │ │ │ -
36 }
│ │ │ │ -
│ │ │ │ -
37
│ │ │ │ -
38 } // namespace Concept
│ │ │ │ -
39
│ │ │ │ -
40
│ │ │ │ -
│ │ │ │ -
41namespace BasisFactory {
│ │ │ │ -
42
│ │ │ │ - │ │ │ │ -
49
│ │ │ │ - │ │ │ │ -
51
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
84 {};
│ │ │ │ -
│ │ │ │ -
85
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
117 : public IndexMergingStrategy
│ │ │ │ -
118 {};
│ │ │ │ -
│ │ │ │ -
119
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
151 : public IndexMergingStrategy
│ │ │ │ -
152 {};
│ │ │ │ -
│ │ │ │ -
153
│ │ │ │ - │ │ │ │ -
185
│ │ │ │ -
186
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
193 {
│ │ │ │ -
194 return {};
│ │ │ │ -
195 }
│ │ │ │ -
│ │ │ │ -
196
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
203 {
│ │ │ │ -
204 return {};
│ │ │ │ -
205 }
│ │ │ │ -
│ │ │ │ -
206
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
213 {
│ │ │ │ -
214 return {};
│ │ │ │ -
215 }
│ │ │ │ -
│ │ │ │ -
216
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
223 {
│ │ │ │ -
224 return {};
│ │ │ │ -
225 }
│ │ │ │ -
│ │ │ │ -
226
│ │ │ │ -
227} // end namespace BasisFactory
│ │ │ │ -
│ │ │ │ -
228
│ │ │ │ -
229// Backward compatibility
│ │ │ │ -
│ │ │ │ -
230namespace [[deprecated("Will be removed after Dune 2.10")]] BasisBuilder {
│ │ │ │ -
231
│ │ │ │ -
232 using namespace BasisFactory;
│ │ │ │ -
233
│ │ │ │ -
234}
│ │ │ │ -
│ │ │ │ -
235
│ │ │ │ -
236} // end namespace Functions
│ │ │ │ -
237} // end namespace Dune
│ │ │ │ -
238
│ │ │ │ -
239
│ │ │ │ -
240#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BASISTAGS_HH
│ │ │ │ -
constexpr FlatLexicographic flatLexicographic()
Creates a lexicographic merging of direct children without blocking.
Definition basistags.hh:192
│ │ │ │ -
constexpr BlockedInterleaved blockedInterleaved()
Creates an interleaved merging of direct children with blocking (i.e. creating blocks at the leaves c...
Definition basistags.hh:222
│ │ │ │ -
constexpr FlatInterleaved flatInterleaved()
Creates an interleaved merging of direct children without blocking.
Definition basistags.hh:202
│ │ │ │ -
constexpr BlockedLexicographic blockedLexicographic()
Creates a lexicographic merging of direct children with blocking (i.e. creating one block per direct ...
Definition basistags.hh:212
│ │ │ │ +
18#include <dune/typetree/compositenode.hh>
│ │ │ │ +
19#include <dune/typetree/utility.hh>
│ │ │ │ +
20
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
28
│ │ │ │ +
29
│ │ │ │ +
30namespace Dune {
│ │ │ │ +
31namespace Functions {
│ │ │ │ +
│ │ │ │ +
32namespace Experimental {
│ │ │ │ +
33
│ │ │ │ +
34// *****************************************************************************
│ │ │ │ +
35// *****************************************************************************
│ │ │ │ +
36
│ │ │ │ +
53template<class RPB, class T>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
55{
│ │ │ │ +
56 using Transformation = T;
│ │ │ │ +
57
│ │ │ │ + │ │ │ │ +
59
│ │ │ │ +
60public:
│ │ │ │ +
61
│ │ │ │ +
62 using RawPreBasis = RPB;
│ │ │ │ +
63
│ │ │ │ +
65 using GridView = typename RawPreBasis::GridView;
│ │ │ │ +
66
│ │ │ │ +
68 using size_type = std::size_t;
│ │ │ │ +
69
│ │ │ │ +
71 using Node = typename RawPreBasis::Node;
│ │ │ │ +
72
│ │ │ │ +
73 static constexpr size_type maxMultiIndexSize = Transformation::maxIndexSize;
│ │ │ │ +
74 static constexpr size_type minMultiIndexSize = Transformation::minIndexSize;
│ │ │ │ +
75 static constexpr size_type multiIndexBufferSize = std::max(RawPreBasis::multiIndexBufferSize, maxMultiIndexSize);
│ │ │ │ +
76
│ │ │ │ +
82 template<class RPB_R, class T_R>
│ │ │ │ +
│ │ │ │ +
83 TransformedIndexPreBasis(RPB_R&& rawPreBasis, T_R&& transformation) :
│ │ │ │ +
84 rawPreBasis_(std::forward<RPB_R>(rawPreBasis)),
│ │ │ │ +
85 transformation_(std::forward<T_R>(transformation))
│ │ │ │ +
86 {}
│ │ │ │ +
│ │ │ │ +
87
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
90 {
│ │ │ │ +
91 rawPreBasis_.initializeIndices();
│ │ │ │ +
92 }
│ │ │ │ +
│ │ │ │ +
93
│ │ │ │ +
│ │ │ │ +
95 const GridView& gridView() const
│ │ │ │ +
96 {
│ │ │ │ +
97 return rawPreBasis_.gridView();
│ │ │ │ +
98 }
│ │ │ │ +
│ │ │ │ +
99
│ │ │ │ +
│ │ │ │ +
101 void update(const GridView& gv)
│ │ │ │ +
102 {
│ │ │ │ +
103 rawPreBasis_.update(gv);
│ │ │ │ +
104 }
│ │ │ │ +
│ │ │ │ +
105
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
117 {
│ │ │ │ +
118 return rawPreBasis_.makeNode();
│ │ │ │ +
119 }
│ │ │ │ +
│ │ │ │ +
120
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
123 {
│ │ │ │ +
124 return size(Dune::ReservedVector<size_type, multiIndexBufferSize>{});
│ │ │ │ +
125 }
│ │ │ │ +
│ │ │ │ +
126
│ │ │ │ +
128 template<class SizePrefix>
│ │ │ │ +
│ │ │ │ +
129 size_type size(const SizePrefix& prefix) const
│ │ │ │ +
130 {
│ │ │ │ +
131 return transformation_.size(prefix, rawPreBasis_);
│ │ │ │ +
132 }
│ │ │ │ +
│ │ │ │ +
133
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
136 {
│ │ │ │ +
137 return transformation_.containerDescriptor(rawPreBasis_);
│ │ │ │ +
138 }
│ │ │ │ +
│ │ │ │ +
139
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
142 {
│ │ │ │ +
143 return transformation_.dimension(rawPreBasis_);
│ │ │ │ +
144 }
│ │ │ │ +
│ │ │ │ +
145
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
148 {
│ │ │ │ +
149 return rawPreBasis_.maxNodeSize();
│ │ │ │ +
150 }
│ │ │ │ +
│ │ │ │ +
151
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
153 {
│ │ │ │ +
154 return rawPreBasis_;
│ │ │ │ +
155 }
│ │ │ │ +
│ │ │ │ +
156
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
158 {
│ │ │ │ +
159 return rawPreBasis_;
│ │ │ │ +
160 }
│ │ │ │ +
│ │ │ │ +
161
│ │ │ │ +
162 template<class MultiIndex>
│ │ │ │ +
│ │ │ │ +
163 void transformIndex(MultiIndex& multiIndex) const
│ │ │ │ +
164 {
│ │ │ │ +
165 transformation_.transformIndex(multiIndex, rawPreBasis_);
│ │ │ │ +
166 }
│ │ │ │ +
│ │ │ │ +
167
│ │ │ │ +
168 template<typename It>
│ │ │ │ +
│ │ │ │ +
169 It indices(const Node& node, It it) const
│ │ │ │ +
170 {
│ │ │ │ +
171 rawPreBasis().indices(node, it);
│ │ │ │ +
172 for(std::size_t i=0; i<node.size(); ++i)
│ │ │ │ +
173 {
│ │ │ │ +
174 transformIndex(*it);
│ │ │ │ +
175 ++it;
│ │ │ │ +
176 }
│ │ │ │ +
177 return it;
│ │ │ │ +
178 }
│ │ │ │ +
│ │ │ │ +
179
│ │ │ │ +
180protected:
│ │ │ │ + │ │ │ │ +
182 Transformation transformation_;
│ │ │ │ +
183};
│ │ │ │ +
│ │ │ │ +
184
│ │ │ │ +
185template<class RPB, class T>
│ │ │ │ + │ │ │ │ +
187
│ │ │ │ +
188
│ │ │ │ +
189} // end namespace Experimental
│ │ │ │ +
│ │ │ │ +
190
│ │ │ │ +
191
│ │ │ │ +
192namespace BasisFactory {
│ │ │ │ +
193namespace Experimental {
│ │ │ │ +
194
│ │ │ │ +
206template<class RawPreBasisFactory, class Transformation>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
208 RawPreBasisFactory&& preBasisFactory,
│ │ │ │ +
209 Transformation&& transformation)
│ │ │ │ +
210{
│ │ │ │ +
211 return [
│ │ │ │ +
212 preBasisFactory=std::forward<RawPreBasisFactory>(preBasisFactory),
│ │ │ │ +
213 transformation =std::forward<Transformation>(transformation)
│ │ │ │ +
214 ](const auto& gridView) {
│ │ │ │ +
215 return Dune::Functions::Experimental::TransformedIndexPreBasis(preBasisFactory(gridView), std::move(transformation));
│ │ │ │ +
216 };
│ │ │ │ +
217}
│ │ │ │ +
│ │ │ │ +
218
│ │ │ │ +
219
│ │ │ │ +
220
│ │ │ │ +
239template<class IndexTransformation, class SizeImplementation, class ContainerDescriptorImplementation, std::size_t minIS, std::size_t maxIS>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
241{
│ │ │ │ +
242public:
│ │ │ │ +
243
│ │ │ │ +
244 static constexpr std::size_t minIndexSize = minIS;
│ │ │ │ +
245 static constexpr std::size_t maxIndexSize = maxIS;
│ │ │ │ +
246
│ │ │ │ +
247 template<class IT_R, class SI_R, class CD_R>
│ │ │ │ +
│ │ │ │ +
248 GenericIndexingTransformation(IT_R&& indexTransformation, SI_R&& sizeImplementation, CD_R&& containerDescriptorImplementation) :
│ │ │ │ +
249 indexTransformation_(std::forward<IT_R>(indexTransformation)),
│ │ │ │ +
250 sizeImplementation_(std::forward<SI_R>(sizeImplementation)),
│ │ │ │ +
251 containerDescriptorImplementation_(std::forward<CD_R>(containerDescriptorImplementation))
│ │ │ │ +
252 {}
│ │ │ │ +
│ │ │ │ +
253
│ │ │ │ +
254 template<class MultiIndex, class PreBasis>
│ │ │ │ +
│ │ │ │ +
255 void transformIndex(MultiIndex& multiIndex, const PreBasis& preBasis) const
│ │ │ │ +
256 {
│ │ │ │ +
257 indexTransformation_(multiIndex, preBasis);
│ │ │ │ +
258 }
│ │ │ │ +
│ │ │ │ +
259
│ │ │ │ +
260 template<class Prefix, class PreBasis>
│ │ │ │ +
│ │ │ │ +
261 auto size(const Prefix& prefix, const PreBasis& preBasis) const
│ │ │ │ +
262 {
│ │ │ │ +
263 return sizeImplementation_(prefix, preBasis);
│ │ │ │ +
264 }
│ │ │ │ +
│ │ │ │ +
265
│ │ │ │ +
266 template<class PreBasis>
│ │ │ │ +
│ │ │ │ +
267 auto dimension(const PreBasis& preBasis) const
│ │ │ │ +
268 {
│ │ │ │ +
269 return preBasis.dimension();
│ │ │ │ +
270 }
│ │ │ │ +
│ │ │ │ +
271
│ │ │ │ +
272 template<class PreBasis>
│ │ │ │ +
│ │ │ │ +
273 auto containerDescriptor(const PreBasis& preBasis) const
│ │ │ │ +
274 {
│ │ │ │ +
275 return containerDescriptorImplementation_(preBasis);
│ │ │ │ +
276 }
│ │ │ │ +
│ │ │ │ +
277
│ │ │ │ +
278private:
│ │ │ │ +
279 IndexTransformation indexTransformation_;
│ │ │ │ +
280 SizeImplementation sizeImplementation_;
│ │ │ │ +
281 ContainerDescriptorImplementation containerDescriptorImplementation_;
│ │ │ │ +
282};
│ │ │ │ +
│ │ │ │ +
283
│ │ │ │ +
284
│ │ │ │ +
285
│ │ │ │ +
305template<class IndexTransformation, class SizeImplementation, class ContainerDescriptorImplementation, std::size_t minIndexSize, std::size_t maxIndexSize>
│ │ │ │ +
│ │ │ │ +
306auto indexTransformation(IndexTransformation&& indexTransformation,
│ │ │ │ +
307 SizeImplementation&& sizeImplementation,
│ │ │ │ +
308 ContainerDescriptorImplementation&& containerDescriptorImplementation,
│ │ │ │ +
309 Dune::index_constant<minIndexSize>,
│ │ │ │ +
310 Dune::index_constant<maxIndexSize>)
│ │ │ │ +
311{
│ │ │ │ + │ │ │ │ +
313 std::decay_t<IndexTransformation>,
│ │ │ │ +
314 std::decay_t<SizeImplementation>,
│ │ │ │ +
315 std::decay_t<ContainerDescriptorImplementation>,
│ │ │ │ +
316 minIndexSize, maxIndexSize>(
│ │ │ │ +
317 std::forward<IndexTransformation>(indexTransformation),
│ │ │ │ +
318 std::forward<SizeImplementation>(sizeImplementation),
│ │ │ │ +
319 std::forward<ContainerDescriptorImplementation>(containerDescriptorImplementation));
│ │ │ │ +
320}
│ │ │ │ +
│ │ │ │ +
321
│ │ │ │ +
323template<class IndexTransformation, class SizeImplementation,
│ │ │ │ +
324 std::size_t minIndexSize, std::size_t maxIndexSize>
│ │ │ │ +
│ │ │ │ +
325auto indexTransformation(IndexTransformation&& indexTrafo,
│ │ │ │ +
326 SizeImplementation&& sizeImpl,
│ │ │ │ +
327 Dune::index_constant<minIndexSize> minSize,
│ │ │ │ +
328 Dune::index_constant<maxIndexSize> maxSize)
│ │ │ │ +
329{
│ │ │ │ +
330 return indexTransformation(indexTrafo, sizeImpl,
│ │ │ │ +
331 [](auto&&) { return Dune::Functions::ContainerDescriptors::Unknown{}; },
│ │ │ │ +
332 minSize, maxSize);
│ │ │ │ +
333}
│ │ │ │ +
│ │ │ │ +
334
│ │ │ │ +
335} // end namespace Experimental
│ │ │ │ +
336} // end namespace BasisFactory
│ │ │ │ +
337} // end namespace Functions
│ │ │ │ +
338} // end namespace Dune
│ │ │ │ +
339
│ │ │ │ +
340
│ │ │ │ +
341#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
static constexpr bool isIndexMergingStrategy()
Definition basistags.hh:27
│ │ │ │ -
void registerIndexMergingStrategy(IndexMergingStrategy)
│ │ │ │ - │ │ │ │ -
auto require(T &&t) -> decltype(registerIndexMergingStrategy(t))
│ │ │ │ -
Base class for index merging strategies to simplify detection.
Definition basistags.hh:48
│ │ │ │ -
Lexicographic merging of direct children without blocking.
Definition basistags.hh:84
│ │ │ │ -
Interleaved merging of direct children without blocking.
Definition basistags.hh:118
│ │ │ │ -
Lexicographic merging of direct children with blocking (i.e. creating one block per direct child).
Definition basistags.hh:152
│ │ │ │ -
Interleaved merging of direct children with blocking (i.e. creating blocks at the leaves containing o...
Definition basistags.hh:184
│ │ │ │ +
auto indexTransformation(IndexTransformation &&indexTransformation, SizeImplementation &&sizeImplementation, ContainerDescriptorImplementation &&containerDescriptorImplementation, Dune::index_constant< minIndexSize >, Dune::index_constant< maxIndexSize >)
A generic implementation of a transformation.
Definition transformedindexbasis.hh:306
│ │ │ │ +
auto transformIndices(RawPreBasisFactory &&preBasisFactory, Transformation &&transformation)
Create a TransformedIndexPreBasisFactory.
Definition transformedindexbasis.hh:207
│ │ │ │ +
Fallback container descriptor if nothing else fits.
Definition containerdescriptors.hh:50
│ │ │ │ +
A pre-basis transforming multi-indices.
Definition transformedindexbasis.hh:55
│ │ │ │ +
It indices(const Node &node, It it) const
Definition transformedindexbasis.hh:169
│ │ │ │ +
Transformation transformation_
Definition transformedindexbasis.hh:182
│ │ │ │ +
void initializeIndices()
Initialize the global indices.
Definition transformedindexbasis.hh:89
│ │ │ │ +
typename RawPreBasis::GridView GridView
The grid view that the FE basis is defined on.
Definition transformedindexbasis.hh:65
│ │ │ │ +
void transformIndex(MultiIndex &multiIndex) const
Definition transformedindexbasis.hh:163
│ │ │ │ +
RawPreBasis rawPreBasis_
Definition transformedindexbasis.hh:181
│ │ │ │ +
typename RawPreBasis::Node Node
Template mapping root tree path to type of created tree node.
Definition transformedindexbasis.hh:71
│ │ │ │ +
TransformedIndexPreBasis(RPB_R &&rawPreBasis, T_R &&transformation)
Constructor for given child pre-basis objects.
Definition transformedindexbasis.hh:83
│ │ │ │ +
RawPreBasis & rawPreBasis()
Definition transformedindexbasis.hh:157
│ │ │ │ +
static constexpr size_type maxMultiIndexSize
Definition transformedindexbasis.hh:73
│ │ │ │ +
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition transformedindexbasis.hh:101
│ │ │ │ +
Node makeNode() const
Create tree node with given root tree path.
Definition transformedindexbasis.hh:116
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition transformedindexbasis.hh:95
│ │ │ │ +
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition transformedindexbasis.hh:129
│ │ │ │ +
RPB RawPreBasis
Definition transformedindexbasis.hh:62
│ │ │ │ +
size_type size() const
Same as size(prefix) with empty prefix.
Definition transformedindexbasis.hh:122
│ │ │ │ +
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition transformedindexbasis.hh:147
│ │ │ │ +
std::size_t size_type
Type used for indices and size information.
Definition transformedindexbasis.hh:68
│ │ │ │ +
static constexpr size_type multiIndexBufferSize
Definition transformedindexbasis.hh:75
│ │ │ │ +
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition transformedindexbasis.hh:141
│ │ │ │ +
const RawPreBasis & rawPreBasis() const
Definition transformedindexbasis.hh:152
│ │ │ │ +
static constexpr size_type minMultiIndexSize
Definition transformedindexbasis.hh:74
│ │ │ │ +
auto containerDescriptor() const
Return the container descriptor of the transformed pre-basis.
Definition transformedindexbasis.hh:135
│ │ │ │ +
A generic implementation of a transformation.
Definition transformedindexbasis.hh:241
│ │ │ │ +
GenericIndexingTransformation(IT_R &&indexTransformation, SI_R &&sizeImplementation, CD_R &&containerDescriptorImplementation)
Definition transformedindexbasis.hh:248
│ │ │ │ +
static constexpr std::size_t maxIndexSize
Definition transformedindexbasis.hh:245
│ │ │ │ +
auto containerDescriptor(const PreBasis &preBasis) const
Definition transformedindexbasis.hh:273
│ │ │ │ +
auto dimension(const PreBasis &preBasis) const
Definition transformedindexbasis.hh:267
│ │ │ │ +
auto size(const Prefix &prefix, const PreBasis &preBasis) const
Definition transformedindexbasis.hh:261
│ │ │ │ +
static constexpr std::size_t minIndexSize
Definition transformedindexbasis.hh:244
│ │ │ │ +
void transformIndex(MultiIndex &multiIndex, const PreBasis &preBasis) const
Definition transformedindexbasis.hh:255
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,154 +1,416 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -basistags.hh │ │ │ │ │ +transformedindexbasis.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BASISTAGS_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BASISTAGS_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ 12 │ │ │ │ │ -13namespace _D_u_n_e { │ │ │ │ │ -14namespace Functions { │ │ │ │ │ -15 │ │ │ │ │ -16 namespace Concept { │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ 17 │ │ │ │ │ -_1_8 struct _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ -19 { │ │ │ │ │ -20 template │ │ │ │ │ -_2_1 auto _r_e_q_u_i_r_e(T&& t) -> decltype( │ │ │ │ │ -22 registerIndexMergingStrategy(t) │ │ │ │ │ -23 ); │ │ │ │ │ -24 }; │ │ │ │ │ -25 │ │ │ │ │ -26 template │ │ │ │ │ -_2_7 static constexpr bool _i_s_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y() │ │ │ │ │ -28 { │ │ │ │ │ -29 return models(); │ │ │ │ │ -30 } │ │ │ │ │ -31 │ │ │ │ │ -32 template │ │ │ │ │ -_3_3 static constexpr bool _i_s_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y(T&& t) │ │ │ │ │ -34 { │ │ │ │ │ -35 return models>(); │ │ │ │ │ -36 } │ │ │ │ │ -37 │ │ │ │ │ -38 } // namespace Concept │ │ │ │ │ -39 │ │ │ │ │ -40 │ │ │ │ │ -_4_1namespace BasisFactory { │ │ │ │ │ -42 │ │ │ │ │ -_4_8 struct _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y {}; │ │ │ │ │ -49 │ │ │ │ │ -_5_0 void _r_e_g_i_s_t_e_r_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y(_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y); │ │ │ │ │ -51 │ │ │ │ │ -_8_2 struct _F_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c │ │ │ │ │ -83 : public _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ -84 {}; │ │ │ │ │ -85 │ │ │ │ │ -_1_1_6 struct _F_l_a_t_I_n_t_e_r_l_e_a_v_e_d │ │ │ │ │ -117 : public _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ -118 {}; │ │ │ │ │ -119 │ │ │ │ │ -_1_5_0 struct _B_l_o_c_k_e_d_L_e_x_i_c_o_g_r_a_p_h_i_c │ │ │ │ │ -151 : public _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ -152 {}; │ │ │ │ │ -153 │ │ │ │ │ -_1_8_4 struct _B_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d : public _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y {}; │ │ │ │ │ -185 │ │ │ │ │ -186 │ │ │ │ │ -_1_9_2 constexpr _F_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c _f_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c() │ │ │ │ │ -193 { │ │ │ │ │ -194 return {}; │ │ │ │ │ -195 } │ │ │ │ │ -196 │ │ │ │ │ -_2_0_2 constexpr _F_l_a_t_I_n_t_e_r_l_e_a_v_e_d _f_l_a_t_I_n_t_e_r_l_e_a_v_e_d() │ │ │ │ │ -203 { │ │ │ │ │ -204 return {}; │ │ │ │ │ -205 } │ │ │ │ │ -206 │ │ │ │ │ -_2_1_2 constexpr _B_l_o_c_k_e_d_L_e_x_i_c_o_g_r_a_p_h_i_c _b_l_o_c_k_e_d_L_e_x_i_c_o_g_r_a_p_h_i_c() │ │ │ │ │ -213 { │ │ │ │ │ -214 return {}; │ │ │ │ │ -215 } │ │ │ │ │ -216 │ │ │ │ │ -_2_2_2 constexpr _B_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d _b_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d() │ │ │ │ │ -223 { │ │ │ │ │ -224 return {}; │ │ │ │ │ -225 } │ │ │ │ │ -226 │ │ │ │ │ -227} // end namespace BasisFactory │ │ │ │ │ -228 │ │ │ │ │ -229// Backward compatibility │ │ │ │ │ -_2_3_0namespace [[deprecated("Will be removed after Dune 2.10")]] BasisBuilder { │ │ │ │ │ -231 │ │ │ │ │ -232 using namespace BasisFactory; │ │ │ │ │ -233 │ │ │ │ │ -234} │ │ │ │ │ -235 │ │ │ │ │ -236} // end namespace Functions │ │ │ │ │ -237} // end namespace Dune │ │ │ │ │ -238 │ │ │ │ │ -239 │ │ │ │ │ -240#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BASISTAGS_HH │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_f_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c │ │ │ │ │ -constexpr FlatLexicographic flatLexicographic() │ │ │ │ │ -Creates a lexicographic merging of direct children without blocking. │ │ │ │ │ -DDeeffiinniittiioonn basistags.hh:192 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_b_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d │ │ │ │ │ -constexpr BlockedInterleaved blockedInterleaved() │ │ │ │ │ -Creates an interleaved merging of direct children with blocking (i.e. creating │ │ │ │ │ -blocks at the leaves c... │ │ │ │ │ -DDeeffiinniittiioonn basistags.hh:222 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_f_l_a_t_I_n_t_e_r_l_e_a_v_e_d │ │ │ │ │ -constexpr FlatInterleaved flatInterleaved() │ │ │ │ │ -Creates an interleaved merging of direct children without blocking. │ │ │ │ │ -DDeeffiinniittiioonn basistags.hh:202 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_b_l_o_c_k_e_d_L_e_x_i_c_o_g_r_a_p_h_i_c │ │ │ │ │ -constexpr BlockedLexicographic blockedLexicographic() │ │ │ │ │ -Creates a lexicographic merging of direct children with blocking (i.e. creating │ │ │ │ │ -one block per direct ... │ │ │ │ │ -DDeeffiinniittiioonn basistags.hh:212 │ │ │ │ │ +18#include │ │ │ │ │ +19#include │ │ │ │ │ +20 │ │ │ │ │ +21#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_s_t_a_t_i_c_f_o_r_l_o_o_p_._h_h> │ │ │ │ │ +22#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ +23#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_u_t_i_l_i_t_y_._h_h> │ │ │ │ │ +24#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_b_a_s_i_s_t_a_g_s_._h_h> │ │ │ │ │ +25#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ +26#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +27#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ +28 │ │ │ │ │ +29 │ │ │ │ │ +30namespace _D_u_n_e { │ │ │ │ │ +31namespace Functions { │ │ │ │ │ +_3_2namespace Experimental { │ │ │ │ │ +33 │ │ │ │ │ +34/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ +35/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ +36 │ │ │ │ │ +53template │ │ │ │ │ +_5_4class _T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s │ │ │ │ │ +55{ │ │ │ │ │ +56 using Transformation = T; │ │ │ │ │ +57 │ │ │ │ │ +58 using _T_h_i_s = _T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_<_R_P_B_,_ _T_>; │ │ │ │ │ +59 │ │ │ │ │ +60public: │ │ │ │ │ +61 │ │ │ │ │ +_6_2 using _R_a_w_P_r_e_B_a_s_i_s = RPB; │ │ │ │ │ +63 │ │ │ │ │ +_6_5 using _G_r_i_d_V_i_e_w = typename RawPreBasis::GridView; │ │ │ │ │ +66 │ │ │ │ │ +_6_8 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ +69 │ │ │ │ │ +_7_1 using _N_o_d_e = typename RawPreBasis::Node; │ │ │ │ │ +72 │ │ │ │ │ +_7_3 static constexpr _s_i_z_e___t_y_p_e _m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e = Transformation::maxIndexSize; │ │ │ │ │ +_7_4 static constexpr _s_i_z_e___t_y_p_e _m_i_n_M_u_l_t_i_I_n_d_e_x_S_i_z_e = Transformation::minIndexSize; │ │ │ │ │ +_7_5 static constexpr _s_i_z_e___t_y_p_e _m_u_l_t_i_I_n_d_e_x_B_u_f_f_e_r_S_i_z_e = std::max(RawPreBasis:: │ │ │ │ │ +multiIndexBufferSize, _m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e); │ │ │ │ │ +76 │ │ │ │ │ +82 template │ │ │ │ │ +_8_3 _T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s(RPB_R&& _r_a_w_P_r_e_B_a_s_i_s, T_R&& transformation) : │ │ │ │ │ +84 _r_a_w_P_r_e_B_a_s_i_s__(std::forward(_r_a_w_P_r_e_B_a_s_i_s)), │ │ │ │ │ +85 _t_r_a_n_s_f_o_r_m_a_t_i_o_n__(std::forward(transformation)) │ │ │ │ │ +86 {} │ │ │ │ │ +87 │ │ │ │ │ +_8_9 void _i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s() │ │ │ │ │ +90 { │ │ │ │ │ +91 _r_a_w_P_r_e_B_a_s_i_s__.initializeIndices(); │ │ │ │ │ +92 } │ │ │ │ │ +93 │ │ │ │ │ +_9_5 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ +96 { │ │ │ │ │ +97 return _r_a_w_P_r_e_B_a_s_i_s__.gridView(); │ │ │ │ │ +98 } │ │ │ │ │ +99 │ │ │ │ │ +_1_0_1 void _u_p_d_a_t_e(const _G_r_i_d_V_i_e_w& gv) │ │ │ │ │ +102 { │ │ │ │ │ +103 _r_a_w_P_r_e_B_a_s_i_s__.update(gv); │ │ │ │ │ +104 } │ │ │ │ │ +105 │ │ │ │ │ +_1_1_6 _N_o_d_e _m_a_k_e_N_o_d_e() const │ │ │ │ │ +117 { │ │ │ │ │ +118 return _r_a_w_P_r_e_B_a_s_i_s__.makeNode(); │ │ │ │ │ +119 } │ │ │ │ │ +120 │ │ │ │ │ +_1_2_2 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ +123 { │ │ │ │ │ +124 return _s_i_z_e(Dune::ReservedVector{}); │ │ │ │ │ +125 } │ │ │ │ │ +126 │ │ │ │ │ +128 template │ │ │ │ │ +_1_2_9 _s_i_z_e___t_y_p_e _s_i_z_e(const SizePrefix& prefix) const │ │ │ │ │ +130 { │ │ │ │ │ +131 return _t_r_a_n_s_f_o_r_m_a_t_i_o_n__.size(prefix, _r_a_w_P_r_e_B_a_s_i_s__); │ │ │ │ │ +132 } │ │ │ │ │ +133 │ │ │ │ │ +_1_3_5 auto _c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r() const │ │ │ │ │ +136 { │ │ │ │ │ +137 return _t_r_a_n_s_f_o_r_m_a_t_i_o_n__.containerDescriptor(_r_a_w_P_r_e_B_a_s_i_s__); │ │ │ │ │ +138 } │ │ │ │ │ +139 │ │ │ │ │ +_1_4_1 _s_i_z_e___t_y_p_e _d_i_m_e_n_s_i_o_n() const │ │ │ │ │ +142 { │ │ │ │ │ +143 return _t_r_a_n_s_f_o_r_m_a_t_i_o_n__.dimension(_r_a_w_P_r_e_B_a_s_i_s__); │ │ │ │ │ +144 } │ │ │ │ │ +145 │ │ │ │ │ +_1_4_7 _s_i_z_e___t_y_p_e _m_a_x_N_o_d_e_S_i_z_e() const │ │ │ │ │ +148 { │ │ │ │ │ +149 return _r_a_w_P_r_e_B_a_s_i_s__.maxNodeSize(); │ │ │ │ │ +150 } │ │ │ │ │ +151 │ │ │ │ │ +_1_5_2 const _R_a_w_P_r_e_B_a_s_i_s& _r_a_w_P_r_e_B_a_s_i_s() const │ │ │ │ │ +153 { │ │ │ │ │ +154 return _r_a_w_P_r_e_B_a_s_i_s__; │ │ │ │ │ +155 } │ │ │ │ │ +156 │ │ │ │ │ +_1_5_7 _R_a_w_P_r_e_B_a_s_i_s& _r_a_w_P_r_e_B_a_s_i_s() │ │ │ │ │ +158 { │ │ │ │ │ +159 return _r_a_w_P_r_e_B_a_s_i_s__; │ │ │ │ │ +160 } │ │ │ │ │ +161 │ │ │ │ │ +162 template │ │ │ │ │ +_1_6_3 void _t_r_a_n_s_f_o_r_m_I_n_d_e_x(MultiIndex& multiIndex) const │ │ │ │ │ +164 { │ │ │ │ │ +165 _t_r_a_n_s_f_o_r_m_a_t_i_o_n__.transformIndex(multiIndex, _r_a_w_P_r_e_B_a_s_i_s__); │ │ │ │ │ +166 } │ │ │ │ │ +167 │ │ │ │ │ +168 template │ │ │ │ │ +_1_6_9 It _i_n_d_i_c_e_s(const _N_o_d_e& node, It it) const │ │ │ │ │ +170 { │ │ │ │ │ +171 _r_a_w_P_r_e_B_a_s_i_s().indices(node, it); │ │ │ │ │ +172 for(std::size_t i=0; i │ │ │ │ │ +_1_8_6_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s(RPB&&, T&&) -> _T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_<_s_t_d_:_: │ │ │ │ │ +_d_e_c_a_y___t_<_R_P_B_>, std::decay_t>; │ │ │ │ │ +187 │ │ │ │ │ +188 │ │ │ │ │ +189} // end namespace Experimental │ │ │ │ │ +190 │ │ │ │ │ +191 │ │ │ │ │ +192namespace BasisFactory { │ │ │ │ │ +193namespace Experimental { │ │ │ │ │ +194 │ │ │ │ │ +206template │ │ │ │ │ +_2_0_7auto _t_r_a_n_s_f_o_r_m_I_n_d_i_c_e_s( │ │ │ │ │ +208 RawPreBasisFactory&& preBasisFactory, │ │ │ │ │ +209 Transformation&& transformation) │ │ │ │ │ +210{ │ │ │ │ │ +211 return [ │ │ │ │ │ +212 preBasisFactory=std::forward(preBasisFactory), │ │ │ │ │ +213 transformation =std::forward(transformation) │ │ │ │ │ +214 ](const auto& gridView) { │ │ │ │ │ +215 return _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s │ │ │ │ │ +(preBasisFactory(gridView), std::move(transformation)); │ │ │ │ │ +216 }; │ │ │ │ │ +217} │ │ │ │ │ +218 │ │ │ │ │ +219 │ │ │ │ │ +220 │ │ │ │ │ +239template │ │ │ │ │ +_2_4_0class _G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n │ │ │ │ │ +241{ │ │ │ │ │ +242public: │ │ │ │ │ +243 │ │ │ │ │ +_2_4_4 static constexpr std::size_t _m_i_n_I_n_d_e_x_S_i_z_e = minIS; │ │ │ │ │ +_2_4_5 static constexpr std::size_t _m_a_x_I_n_d_e_x_S_i_z_e = maxIS; │ │ │ │ │ +246 │ │ │ │ │ +247 template │ │ │ │ │ +_2_4_8 _G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n(IT_R&& _i_n_d_e_x_T_r_a_n_s_f_o_r_m_a_t_i_o_n, SI_R&& │ │ │ │ │ +sizeImplementation, CD_R&& containerDescriptorImplementation) : │ │ │ │ │ +249 indexTransformation_(std::forward(_i_n_d_e_x_T_r_a_n_s_f_o_r_m_a_t_i_o_n)), │ │ │ │ │ +250 sizeImplementation_(std::forward(sizeImplementation)), │ │ │ │ │ +251 containerDescriptorImplementation_(std::forward │ │ │ │ │ +(containerDescriptorImplementation)) │ │ │ │ │ +252 {} │ │ │ │ │ +253 │ │ │ │ │ +254 template │ │ │ │ │ +_2_5_5 void _t_r_a_n_s_f_o_r_m_I_n_d_e_x(MultiIndex& multiIndex, const PreBasis& preBasis) const │ │ │ │ │ +256 { │ │ │ │ │ +257 indexTransformation_(multiIndex, preBasis); │ │ │ │ │ +258 } │ │ │ │ │ +259 │ │ │ │ │ +260 template │ │ │ │ │ +_2_6_1 auto _s_i_z_e(const Prefix& prefix, const PreBasis& preBasis) const │ │ │ │ │ +262 { │ │ │ │ │ +263 return sizeImplementation_(prefix, preBasis); │ │ │ │ │ +264 } │ │ │ │ │ +265 │ │ │ │ │ +266 template │ │ │ │ │ +_2_6_7 auto _d_i_m_e_n_s_i_o_n(const PreBasis& preBasis) const │ │ │ │ │ +268 { │ │ │ │ │ +269 return preBasis.dimension(); │ │ │ │ │ +270 } │ │ │ │ │ +271 │ │ │ │ │ +272 template │ │ │ │ │ +_2_7_3 auto _c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r(const PreBasis& preBasis) const │ │ │ │ │ +274 { │ │ │ │ │ +275 return containerDescriptorImplementation_(preBasis); │ │ │ │ │ +276 } │ │ │ │ │ +277 │ │ │ │ │ +278private: │ │ │ │ │ +279 IndexTransformation indexTransformation_; │ │ │ │ │ +280 SizeImplementation sizeImplementation_; │ │ │ │ │ +281 ContainerDescriptorImplementation containerDescriptorImplementation_; │ │ │ │ │ +282}; │ │ │ │ │ +283 │ │ │ │ │ +284 │ │ │ │ │ +285 │ │ │ │ │ +305template │ │ │ │ │ +_3_0_6auto _i_n_d_e_x_T_r_a_n_s_f_o_r_m_a_t_i_o_n(IndexTransformation&& _i_n_d_e_x_T_r_a_n_s_f_o_r_m_a_t_i_o_n, │ │ │ │ │ +307 SizeImplementation&& sizeImplementation, │ │ │ │ │ +308 ContainerDescriptorImplementation&& containerDescriptorImplementation, │ │ │ │ │ +309 Dune::index_constant, │ │ │ │ │ +310 Dune::index_constant) │ │ │ │ │ +311{ │ │ │ │ │ +312 return _G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n< │ │ │ │ │ +313 std::decay_t, │ │ │ │ │ +314 std::decay_t, │ │ │ │ │ +315 std::decay_t, │ │ │ │ │ +316 minIndexSize, maxIndexSize>( │ │ │ │ │ +317 std::forward(_i_n_d_e_x_T_r_a_n_s_f_o_r_m_a_t_i_o_n), │ │ │ │ │ +318 std::forward(sizeImplementation), │ │ │ │ │ +319 std::forward │ │ │ │ │ +(containerDescriptorImplementation)); │ │ │ │ │ +320} │ │ │ │ │ +321 │ │ │ │ │ +323template │ │ │ │ │ +_3_2_5auto _i_n_d_e_x_T_r_a_n_s_f_o_r_m_a_t_i_o_n(IndexTransformation&& indexTrafo, │ │ │ │ │ +326 SizeImplementation&& sizeImpl, │ │ │ │ │ +327 Dune::index_constant minSize, │ │ │ │ │ +328 Dune::index_constant maxSize) │ │ │ │ │ +329{ │ │ │ │ │ +330 return _i_n_d_e_x_T_r_a_n_s_f_o_r_m_a_t_i_o_n(indexTrafo, sizeImpl, │ │ │ │ │ +331 [](auto&&) { return _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_k_n_o_w_n{}; }, │ │ │ │ │ +332 minSize, maxSize); │ │ │ │ │ +333} │ │ │ │ │ +334 │ │ │ │ │ +335} // end namespace Experimental │ │ │ │ │ +336} // end namespace BasisFactory │ │ │ │ │ +337} // end namespace Functions │ │ │ │ │ +338} // end namespace Dune │ │ │ │ │ +339 │ │ │ │ │ +340 │ │ │ │ │ +341#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH │ │ │ │ │ +_u_t_i_l_i_t_y_._h_h │ │ │ │ │ +_t_y_p_e___t_r_a_i_t_s_._h_h │ │ │ │ │ +_s_t_a_t_i_c_f_o_r_l_o_o_p_._h_h │ │ │ │ │ +_b_a_s_i_s_t_a_g_s_._h_h │ │ │ │ │ +_n_o_d_e_s_._h_h │ │ │ │ │ +_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ -static constexpr bool isIndexMergingStrategy() │ │ │ │ │ -DDeeffiinniittiioonn basistags.hh:27 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_r_e_g_i_s_t_e_r_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ -void registerIndexMergingStrategy(IndexMergingStrategy) │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ -DDeeffiinniittiioonn basistags.hh:19 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y_:_:_r_e_q_u_i_r_e │ │ │ │ │ -auto require(T &&t) -> decltype(registerIndexMergingStrategy(t)) │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ -Base class for index merging strategies to simplify detection. │ │ │ │ │ -DDeeffiinniittiioonn basistags.hh:48 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_F_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c │ │ │ │ │ -Lexicographic merging of direct children without blocking. │ │ │ │ │ -DDeeffiinniittiioonn basistags.hh:84 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_F_l_a_t_I_n_t_e_r_l_e_a_v_e_d │ │ │ │ │ -Interleaved merging of direct children without blocking. │ │ │ │ │ -DDeeffiinniittiioonn basistags.hh:118 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_B_l_o_c_k_e_d_L_e_x_i_c_o_g_r_a_p_h_i_c │ │ │ │ │ -Lexicographic merging of direct children with blocking (i.e. creating one block │ │ │ │ │ -per direct child). │ │ │ │ │ -DDeeffiinniittiioonn basistags.hh:152 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_B_l_o_c_k_e_d_I_n_t_e_r_l_e_a_v_e_d │ │ │ │ │ -Interleaved merging of direct children with blocking (i.e. creating blocks at │ │ │ │ │ -the leaves containing o... │ │ │ │ │ -DDeeffiinniittiioonn basistags.hh:184 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_i_n_d_e_x_T_r_a_n_s_f_o_r_m_a_t_i_o_n │ │ │ │ │ +auto indexTransformation(IndexTransformation &&indexTransformation, │ │ │ │ │ +SizeImplementation &&sizeImplementation, ContainerDescriptorImplementation │ │ │ │ │ +&&containerDescriptorImplementation, Dune::index_constant< minIndexSize >, │ │ │ │ │ +Dune::index_constant< maxIndexSize >) │ │ │ │ │ +A generic implementation of a transformation. │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:306 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_t_r_a_n_s_f_o_r_m_I_n_d_i_c_e_s │ │ │ │ │ +auto transformIndices(RawPreBasisFactory &&preBasisFactory, Transformation │ │ │ │ │ +&&transformation) │ │ │ │ │ +Create a TransformedIndexPreBasisFactory. │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:207 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_k_n_o_w_n │ │ │ │ │ +Fallback container descriptor if nothing else fits. │ │ │ │ │ +DDeeffiinniittiioonn containerdescriptors.hh:50 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s │ │ │ │ │ +A pre-basis transforming multi-indices. │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:55 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s │ │ │ │ │ +It indices(const Node &node, It it) const │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:169 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_t_r_a_n_s_f_o_r_m_a_t_i_o_n__ │ │ │ │ │ +Transformation transformation_ │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:182 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s │ │ │ │ │ +void initializeIndices() │ │ │ │ │ +Initialize the global indices. │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:89 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ +typename RawPreBasis::GridView GridView │ │ │ │ │ +The grid view that the FE basis is defined on. │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:65 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_t_r_a_n_s_f_o_r_m_I_n_d_e_x │ │ │ │ │ +void transformIndex(MultiIndex &multiIndex) const │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:163 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_r_a_w_P_r_e_B_a_s_i_s__ │ │ │ │ │ +RawPreBasis rawPreBasis_ │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:181 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_N_o_d_e │ │ │ │ │ +typename RawPreBasis::Node Node │ │ │ │ │ +Template mapping root tree path to type of created tree node. │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:71 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_: │ │ │ │ │ +_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s │ │ │ │ │ +TransformedIndexPreBasis(RPB_R &&rawPreBasis, T_R &&transformation) │ │ │ │ │ +Constructor for given child pre-basis objects. │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:83 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_r_a_w_P_r_e_B_a_s_i_s │ │ │ │ │ +RawPreBasis & rawPreBasis() │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:157 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e │ │ │ │ │ +static constexpr size_type maxMultiIndexSize │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_u_p_d_a_t_e │ │ │ │ │ +void update(const GridView &gv) │ │ │ │ │ +Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:101 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ +Node makeNode() const │ │ │ │ │ +Create tree node with given root tree path. │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:116 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ +const GridView & gridView() const │ │ │ │ │ +Obtain the grid view that the basis is defined on. │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:95 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ +size_type size(const SizePrefix &prefix) const │ │ │ │ │ +Return number of possible values for next position in multi index. │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:129 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_R_a_w_P_r_e_B_a_s_i_s │ │ │ │ │ +RPB RawPreBasis │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:62 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ +size_type size() const │ │ │ │ │ +Same as size(prefix) with empty prefix. │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:122 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_m_a_x_N_o_d_e_S_i_z_e │ │ │ │ │ +size_type maxNodeSize() const │ │ │ │ │ +Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:147 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +Type used for indices and size information. │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:68 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_m_u_l_t_i_I_n_d_e_x_B_u_f_f_e_r_S_i_z_e │ │ │ │ │ +static constexpr size_type multiIndexBufferSize │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:75 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ +size_type dimension() const │ │ │ │ │ +Get the total dimension of the space spanned by this basis. │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:141 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_r_a_w_P_r_e_B_a_s_i_s │ │ │ │ │ +const RawPreBasis & rawPreBasis() const │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:152 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_m_i_n_M_u_l_t_i_I_n_d_e_x_S_i_z_e │ │ │ │ │ +static constexpr size_type minMultiIndexSize │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:74 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_T_r_a_n_s_f_o_r_m_e_d_I_n_d_e_x_P_r_e_B_a_s_i_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +auto containerDescriptor() const │ │ │ │ │ +Return the container descriptor of the transformed pre-basis. │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:135 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n │ │ │ │ │ +A generic implementation of a transformation. │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:241 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n_:_: │ │ │ │ │ +_G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n │ │ │ │ │ +GenericIndexingTransformation(IT_R &&indexTransformation, SI_R │ │ │ │ │ +&&sizeImplementation, CD_R &&containerDescriptorImplementation) │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:248 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n_:_: │ │ │ │ │ +_m_a_x_I_n_d_e_x_S_i_z_e │ │ │ │ │ +static constexpr std::size_t maxIndexSize │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:245 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n_:_: │ │ │ │ │ +_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ +auto containerDescriptor(const PreBasis &preBasis) const │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:273 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n_:_: │ │ │ │ │ +_d_i_m_e_n_s_i_o_n │ │ │ │ │ +auto dimension(const PreBasis &preBasis) const │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:267 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n_:_: │ │ │ │ │ +_s_i_z_e │ │ │ │ │ +auto size(const Prefix &prefix, const PreBasis &preBasis) const │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:261 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n_:_: │ │ │ │ │ +_m_i_n_I_n_d_e_x_S_i_z_e │ │ │ │ │ +static constexpr std::size_t minIndexSize │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:244 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_E_x_p_e_r_i_m_e_n_t_a_l_:_:_G_e_n_e_r_i_c_I_n_d_e_x_i_n_g_T_r_a_n_s_f_o_r_m_a_t_i_o_n_:_: │ │ │ │ │ +_t_r_a_n_s_f_o_r_m_I_n_d_e_x │ │ │ │ │ +void transformIndex(MultiIndex &multiIndex, const PreBasis &preBasis) const │ │ │ │ │ +DDeeffiinniittiioonn transformedindexbasis.hh:255 │ │ │ │ │ +_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00182.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: brezzidouglasmarinibasis.hh File Reference │ │ │ │ +dune-functions: bsplinebasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,64 +74,78 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Typedefs | │ │ │ │ Functions
│ │ │ │ -
brezzidouglasmarinibasis.hh File Reference
│ │ │ │ +
bsplinebasis.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ + │ │ │ │ +

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

│ │ │ │
#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/functions/functionspacebases/leafprebasismixin.hh>
│ │ │ │ +#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 <dune/functions/functionspacebases/leafprebasismixin.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::BrezziDouglasMariniPreBasis< GV, k >
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::BrezziDouglasMariniNode< GV, k >
class  Dune::Functions::BSplineNode< GV >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ 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.
 
template<typename GV >
using Dune::Functions::BSplineBasis = DefaultGlobalBasis< BSplinePreBasis< GV > >
 A global B-spline basis.
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

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

Detailed Description

│ │ │ │ +

The B-spline global function space basis.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -2,55 +2,64 @@ │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -brezzidouglasmarinibasis.hh File Reference │ │ │ │ │ +bsplinebasis.hh File Reference │ │ │ │ │ +The B-spline global function space basis. _M_o_r_e_._._. │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_g_l_o_b_a_l_v_a_l_u_e_d_l_o_c_a_l_f_i_n_i_t_e_e_l_e_m_e_n_t_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_P_r_e_B_a_s_i_s_<_ _G_V_,_ _k_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_B_a_s_i_s_<_ _G_V_,_ _R_ _> │ │ │ │ │ +  LocalBasis class in the sense of dune-localfunctions, presenting the │ │ │ │ │ + restriction of a B-spline patch to a knot span. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_N_o_d_e_<_ _G_V_,_ _k_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_C_o_e_f_f_i_c_i_e_n_t_s_<_ _d_i_m_ _> │ │ │ │ │ +  Attaches a shape function to an entity. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_I_n_t_e_r_p_o_l_a_t_i_o_n_<_ _d_i_m_,_ _L_B_ _> │ │ │ │ │ +  Local interpolation in the sense of dune-localfunctions, for the B- │ │ │ │ │ + spline basis on tensor-product grids. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_<_ _G_V_,_ _R_ _> │ │ │ │ │ +  LocalFiniteElement in the sense of dune-localfunctions, for the B- │ │ │ │ │ + spline basis on tensor-product grids. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_P_r_e_B_a_s_i_s_<_ _G_V_ _> │ │ │ │ │ +  Pre-basis for B-spline basis. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_N_o_d_e_<_ _G_V_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y │ │ │ │ │   │ │ │ │ │ TTyyppeeddeeffss │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s< │ │ │ │ │ - _B_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i_P_r_e_B_a_s_i_s< GV, k > > │ │ │ │ │ -  Basis of a scalar k-th-order BDM finite element space on simplex and │ │ │ │ │ - cube grids. │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_S_p_l_i_n_e_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s< _B_S_p_l_i_n_e_P_r_e_B_a_s_i_s< GV │ │ │ │ │ + > > │ │ │ │ │ +  A global B-spline basis. │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_b_r_e_z_z_i_D_o_u_g_l_a_s_M_a_r_i_n_i () │ │ │ │ │ -  Create a pre-basis factory that can create a Brezzi-Douglas-Marini pre- │ │ │ │ │ - basis. │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_b_S_p_l_i_n_e (const std::vector< double > │ │ │ │ │ + &knotVector, unsigned int order, bool makeOpen=true) │ │ │ │ │ +  Create a pre-basis factory that can create a B-spline pre-basis. │ │ │ │ │   │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +The B-spline global function space basis. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00182_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: brezzidouglasmarinibasis.hh Source File │ │ │ │ +dune-functions: bsplinebasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,403 +74,1281 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
brezzidouglasmarinibasis.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BREZZIDOUGLASMARINIBASIS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BREZZIDOUGLASMARINIBASIS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BSPLINEBASIS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BSPLINEBASIS_HH
│ │ │ │
9
│ │ │ │ -
10#include <array>
│ │ │ │ -
11#include <dune/common/exceptions.hh>
│ │ │ │ -
12#include <dune/geometry/referenceelements.hh>
│ │ │ │ -
13
│ │ │ │ -
14#include <dune/localfunctions/common/virtualinterface.hh>
│ │ │ │ -
15#include <dune/localfunctions/common/virtualwrappers.hh>
│ │ │ │ +
14#include <array>
│ │ │ │ +
15#include <numeric>
│ │ │ │
16
│ │ │ │ -
17#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini1cube2d.hh>
│ │ │ │ -
18#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini1cube3d.hh>
│ │ │ │ -
19#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini1simplex2d.hh>
│ │ │ │ -
20#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini2cube2d.hh>
│ │ │ │ -
21#include <dune/localfunctions/brezzidouglasmarini/brezzidouglasmarini2simplex2d.hh>
│ │ │ │ -
22
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
27
│ │ │ │ -
28namespace Dune {
│ │ │ │ -
29namespace Functions {
│ │ │ │ -
30
│ │ │ │ -
31namespace Impl {
│ │ │ │ +
18#include <dune/common/dynmatrix.hh>
│ │ │ │ +
19
│ │ │ │ +
20#include <dune/localfunctions/common/localbasis.hh>
│ │ │ │ +
21#include <dune/common/diagonalmatrix.hh>
│ │ │ │ +
22#include <dune/localfunctions/common/localkey.hh>
│ │ │ │ +
23#include <dune/localfunctions/common/localfiniteelementtraits.hh>
│ │ │ │ +
24#include <dune/geometry/type.hh>
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
28
│ │ │ │ +
29namespace Dune
│ │ │ │ +
30{
│ │ │ │ +
31namespace Functions {
│ │ │ │
32
│ │ │ │ -
33 template<int dim, typename D, typename R, std::size_t k>
│ │ │ │ -
34 struct BDMSimplexLocalInfo
│ │ │ │ -
35 {
│ │ │ │ -
36 static_assert((AlwaysFalse<D>::value),"The requested type of BDM element is not implemented, sorry!");
│ │ │ │ -
37 };
│ │ │ │ -
38
│ │ │ │ -
39 template<typename D, typename R>
│ │ │ │ -
40 struct BDMSimplexLocalInfo<2,D,R,1>
│ │ │ │ -
41 {
│ │ │ │ -
42 using FiniteElement = BDM1Simplex2DLocalFiniteElement<D,R>;
│ │ │ │ -
43 static const std::size_t Variants = 8;
│ │ │ │ -
44 };
│ │ │ │ -
45
│ │ │ │ -
46 template<typename D, typename R>
│ │ │ │ -
47 struct BDMSimplexLocalInfo<2,D,R,2>
│ │ │ │ -
48 {
│ │ │ │ -
49 using FiniteElement = BDM2Simplex2DLocalFiniteElement<D,R>;
│ │ │ │ -
50 static const std::size_t Variants = 8;
│ │ │ │ -
51 };
│ │ │ │ -
52
│ │ │ │ -
53 template<int dim, typename D, typename R, std::size_t k>
│ │ │ │ -
54 struct BDMCubeLocalInfo
│ │ │ │ -
55 {
│ │ │ │ -
56 static_assert((AlwaysFalse<D>::value),"The requested type of BDM element is not implemented, sorry!");
│ │ │ │ -
57 };
│ │ │ │ -
58
│ │ │ │ -
59 template<typename D, typename R>
│ │ │ │ -
60 struct BDMCubeLocalInfo<2,D,R,1>
│ │ │ │ -
61 {
│ │ │ │ -
62 using FiniteElement = BDM1Cube2DLocalFiniteElement<D,R>;
│ │ │ │ -
63 static const std::size_t Variants = 16;
│ │ │ │ -
64 };
│ │ │ │ -
65
│ │ │ │ -
66 template<typename D, typename R>
│ │ │ │ -
67 struct BDMCubeLocalInfo<2,D,R,2>
│ │ │ │ -
68 {
│ │ │ │ -
69 using FiniteElement = BDM2Cube2DLocalFiniteElement<D,R>;
│ │ │ │ -
70 static const std::size_t Variants = 16;
│ │ │ │ -
71 };
│ │ │ │ -
72
│ │ │ │ -
73 template<typename D, typename R>
│ │ │ │ -
74 struct BDMCubeLocalInfo<3,D,R,1>
│ │ │ │ -
75 {
│ │ │ │ -
76 using FiniteElement = BDM1Cube3DLocalFiniteElement<D,R>;
│ │ │ │ -
77 static const std::size_t Variants = 64;
│ │ │ │ -
78 };
│ │ │ │ -
79
│ │ │ │ -
80 template<typename GV, int dim, typename R, std::size_t k>
│ │ │ │ -
81 class BDMLocalFiniteElementMap
│ │ │ │ -
82 {
│ │ │ │ -
83 using D = typename GV::ctype;
│ │ │ │ -
84 using CubeFiniteElement = typename BDMCubeLocalInfo<dim, D, R, k>::FiniteElement;
│ │ │ │ -
85 using SimplexFiniteElement = typename BDMSimplexLocalInfo<dim, D, R, k>::FiniteElement;
│ │ │ │ -
86
│ │ │ │ -
87 public:
│ │ │ │ -
88
│ │ │ │ -
89 using T = LocalBasisTraits<D, dim, FieldVector<D,dim>, R, dim, FieldVector<R,dim>, FieldMatrix<D,dim,dim> >;
│ │ │ │ -
90 using FiniteElement = LocalFiniteElementVirtualInterface<T>;
│ │ │ │ -
91
│ │ │ │ -
92 BDMLocalFiniteElementMap(const GV& gv)
│ │ │ │ -
93 : is_(&(gv.indexSet())), orient_(gv.size(0))
│ │ │ │ -
94 {
│ │ │ │ -
95 cubeVariant_.resize(BDMCubeLocalInfo<dim, D, R, k>::Variants);
│ │ │ │ -
96 simplexVariant_.resize(BDMSimplexLocalInfo<dim, D, R, k>::Variants);
│ │ │ │ -
97
│ │ │ │ -
98 // create all variants
│ │ │ │ -
99 for (size_t i = 0; i < cubeVariant_.size(); i++)
│ │ │ │ -
100 cubeVariant_[i] = std::make_shared<LocalFiniteElementVirtualImp<CubeFiniteElement> >(CubeFiniteElement(i));
│ │ │ │ -
101
│ │ │ │ -
102 for (size_t i = 0; i < simplexVariant_.size(); i++)
│ │ │ │ -
103 simplexVariant_[i] = std::make_shared<LocalFiniteElementVirtualImp<SimplexFiniteElement> >(SimplexFiniteElement(i));
│ │ │ │ -
104
│ │ │ │ -
105 // compute orientation for all elements
│ │ │ │ -
106 // loop once over the grid
│ │ │ │ -
107 for(const auto& cell : elements(gv))
│ │ │ │ -
108 {
│ │ │ │ -
109 unsigned int myId = is_->index(cell);
│ │ │ │ -
110 orient_[myId] = 0;
│ │ │ │ -
111
│ │ │ │ -
112 for (const auto& intersection : intersections(gv,cell))
│ │ │ │ -
113 {
│ │ │ │ -
114 if (intersection.neighbor() && (is_->index(intersection.outside()) > myId))
│ │ │ │ -
115 orient_[myId] |= (1 << intersection.indexInInside());
│ │ │ │ -
116 }
│ │ │ │ -
117 }
│ │ │ │ -
118 }
│ │ │ │ -
119
│ │ │ │ -
121 template<class EntityType>
│ │ │ │ -
122 const FiniteElement& find(const EntityType& e) const
│ │ │ │ -
123 {
│ │ │ │ -
124 if (e.type().isCube())
│ │ │ │ -
125 return *cubeVariant_[orient_[is_->index(e)]];
│ │ │ │ -
126 else
│ │ │ │ -
127 return *simplexVariant_[orient_[is_->index(e)]];
│ │ │ │ -
128 }
│ │ │ │ -
129
│ │ │ │ -
130 private:
│ │ │ │ -
131 std::vector<std::shared_ptr<LocalFiniteElementVirtualImp<CubeFiniteElement> > > cubeVariant_;
│ │ │ │ -
132 std::vector<std::shared_ptr<LocalFiniteElementVirtualImp<SimplexFiniteElement> > > simplexVariant_;
│ │ │ │ -
133 const typename GV::IndexSet* is_;
│ │ │ │ -
134 std::vector<unsigned char> orient_;
│ │ │ │ -
135 };
│ │ │ │ -
136
│ │ │ │ +
33// A maze of dependencies between the different parts of this. We need a few forward declarations
│ │ │ │ +
34template<typename GV, typename R>
│ │ │ │ + │ │ │ │ +
36
│ │ │ │ +
37template<typename GV>
│ │ │ │ +
38class BSplinePreBasis;
│ │ │ │ +
39
│ │ │ │ +
40
│ │ │ │ +
49template<class GV, class R>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
51{
│ │ │ │ +
52 friend class BSplineLocalFiniteElement<GV,R>;
│ │ │ │ +
53
│ │ │ │ +
54 typedef typename GV::ctype D;
│ │ │ │ +
55 enum {dim = GV::dimension};
│ │ │ │ +
56public:
│ │ │ │ +
57
│ │ │ │ +
59 typedef LocalBasisTraits<D,dim,FieldVector<D,dim>,R,1,FieldVector<R,1>,
│ │ │ │ +
60 FieldMatrix<R,1,dim> > Traits;
│ │ │ │ +
61
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
68 : preBasis_(preBasis),
│ │ │ │ +
69 lFE_(lFE)
│ │ │ │ +
70 {}
│ │ │ │ +
│ │ │ │ +
71
│ │ │ │ +
│ │ │ │ +
75 void evaluateFunction (const FieldVector<D,dim>& in,
│ │ │ │ +
76 std::vector<FieldVector<R,1> >& out) const
│ │ │ │ +
77 {
│ │ │ │ +
78 FieldVector<D,dim> globalIn = offset_;
│ │ │ │ +
79 scaling_.umv(in,globalIn);
│ │ │ │ +
80
│ │ │ │ +
81 preBasis_.evaluateFunction(globalIn, out, lFE_.currentKnotSpan_);
│ │ │ │ +
82 }
│ │ │ │ +
│ │ │ │ +
83
│ │ │ │ +
│ │ │ │ +
87 void evaluateJacobian (const FieldVector<D,dim>& in,
│ │ │ │ +
88 std::vector<FieldMatrix<D,1,dim> >& out) const
│ │ │ │ +
89 {
│ │ │ │ +
90 FieldVector<D,dim> globalIn = offset_;
│ │ │ │ +
91 scaling_.umv(in,globalIn);
│ │ │ │ +
92
│ │ │ │ +
93 preBasis_.evaluateJacobian(globalIn, out, lFE_.currentKnotSpan_);
│ │ │ │ +
94
│ │ │ │ +
95 for (size_t i=0; i<out.size(); i++)
│ │ │ │ +
96 for (int j=0; j<dim; j++)
│ │ │ │ +
97 out[i][0][j] *= scaling_[j][j];
│ │ │ │ +
98 }
│ │ │ │ +
│ │ │ │ +
99
│ │ │ │ +
101 template<size_t k>
│ │ │ │ +
│ │ │ │ +
102 inline void evaluate (const typename std::array<int,k>& directions,
│ │ │ │ +
103 const typename Traits::DomainType& in,
│ │ │ │ +
104 std::vector<typename Traits::RangeType>& out) const
│ │ │ │ +
105 {
│ │ │ │ +
106 switch(k)
│ │ │ │ +
107 {
│ │ │ │ +
108 case 0:
│ │ │ │ +
109 evaluateFunction(in, out);
│ │ │ │ +
110 break;
│ │ │ │ +
111 case 1:
│ │ │ │ +
112 {
│ │ │ │ +
113 FieldVector<D,dim> globalIn = offset_;
│ │ │ │ +
114 scaling_.umv(in,globalIn);
│ │ │ │ +
115
│ │ │ │ +
116 preBasis_.evaluate(directions, globalIn, out, lFE_.currentKnotSpan_);
│ │ │ │ +
117
│ │ │ │ +
118 for (size_t i=0; i<out.size(); i++)
│ │ │ │ +
119 out[i][0] *= scaling_[directions[0]][directions[0]];
│ │ │ │ +
120 break;
│ │ │ │ +
121 }
│ │ │ │ +
122 case 2:
│ │ │ │ +
123 {
│ │ │ │ +
124 FieldVector<D,dim> globalIn = offset_;
│ │ │ │ +
125 scaling_.umv(in,globalIn);
│ │ │ │ +
126
│ │ │ │ +
127 preBasis_.evaluate(directions, globalIn, out, lFE_.currentKnotSpan_);
│ │ │ │ +
128
│ │ │ │ +
129 for (size_t i=0; i<out.size(); i++)
│ │ │ │ +
130 out[i][0] *= scaling_[directions[0]][directions[0]]*scaling_[directions[1]][directions[1]];
│ │ │ │ +
131 break;
│ │ │ │ +
132 }
│ │ │ │ +
133 default:
│ │ │ │ +
134 DUNE_THROW(NotImplemented, "B-Spline derivatives of order " << k << " not implemented yet!");
│ │ │ │ +
135 }
│ │ │ │ +
136 }
│ │ │ │ +
│ │ │ │
137
│ │ │ │ -
138} // namespace Impl
│ │ │ │ -
139
│ │ │ │ -
140
│ │ │ │ -
141// *****************************************************************************
│ │ │ │ -
142// This is the reusable part of the basis. It contains
│ │ │ │ -
143//
│ │ │ │ -
144// BrezziDouglasMariniPreBasis
│ │ │ │ -
145// BrezziDouglasMariniNode
│ │ │ │ -
146//
│ │ │ │ -
147// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ -
148// state. These components do _not_ depend on the global basis and local view
│ │ │ │ -
149// and can be used without a global basis.
│ │ │ │ -
150// *****************************************************************************
│ │ │ │ -
151
│ │ │ │ -
152template<typename GV, int k>
│ │ │ │ -
153class BrezziDouglasMariniNode;
│ │ │ │ -
154
│ │ │ │ -
155template<typename GV, int k>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
157 public LeafPreBasisMixin< BrezziDouglasMariniPreBasis<GV,k> >
│ │ │ │ -
158{
│ │ │ │ -
159 static const int dim = GV::dimension;
│ │ │ │ -
160 using FiniteElementMap = typename Impl::BDMLocalFiniteElementMap<GV, dim, double, k>;
│ │ │ │ +
│ │ │ │ +
145 unsigned int order () const
│ │ │ │ +
146 {
│ │ │ │ +
147 return *std::max_element(preBasis_.order_.begin(), preBasis_.order_.end());
│ │ │ │ +
148 }
│ │ │ │ +
│ │ │ │ +
149
│ │ │ │ +
│ │ │ │ +
152 std::size_t size() const
│ │ │ │ +
153 {
│ │ │ │ +
154 return lFE_.size();
│ │ │ │ +
155 }
│ │ │ │ +
│ │ │ │ +
156
│ │ │ │ +
157private:
│ │ │ │ +
158 const BSplinePreBasis<GV>& preBasis_;
│ │ │ │ +
159
│ │ │ │ + │ │ │ │
161
│ │ │ │ -
162public:
│ │ │ │ -
163
│ │ │ │ -
165 using GridView = GV;
│ │ │ │ -
166 using size_type = std::size_t;
│ │ │ │ +
162 // Coordinates in a single knot span differ from coordinates on the B-spline patch
│ │ │ │ +
163 // by an affine transformation. This transformation is stored in offset_ and scaling_.
│ │ │ │ +
164 FieldVector<D,dim> offset_;
│ │ │ │ +
165 DiagonalMatrix<D,dim> scaling_;
│ │ │ │ +
166};
│ │ │ │ +
│ │ │ │
167
│ │ │ │ - │ │ │ │ -
169
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
172 gridView_(gv),
│ │ │ │ - │ │ │ │ -
174 {
│ │ │ │ -
175 // There is no inherent reason why the basis shouldn't work for grids with more than one
│ │ │ │ -
176 // element types. Somebody simply has to sit down and implement the missing bits.
│ │ │ │ -
177 if (gv.indexSet().types(0).size() > 1)
│ │ │ │ -
178 DUNE_THROW(Dune::NotImplemented, "Brezzi-Douglas-Marini basis is only implemented for grids with a single element type");
│ │ │ │ -
179 }
│ │ │ │ -
│ │ │ │ -
180
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
182 {
│ │ │ │ -
183 codimOffset_[0] = 0;
│ │ │ │ -
184 codimOffset_[1] = codimOffset_[0] + dofsPerCodim_[0] * gridView_.size(0);
│ │ │ │ -
185 //if (dim==3) codimOffset_[2] = codimOffset_[1] + dofsPerCodim[1] * gridView_.size(1);
│ │ │ │ -
186 }
│ │ │ │ -
│ │ │ │ -
187
│ │ │ │ -
│ │ │ │ -
190 const GridView& gridView() const
│ │ │ │ -
191 {
│ │ │ │ -
192 return gridView_;
│ │ │ │ -
193 }
│ │ │ │ -
│ │ │ │ -
194
│ │ │ │ -
195 /* \brief Update the stored grid view, to be called if the grid has changed */
│ │ │ │ -
│ │ │ │ -
196 void update (const GridView& gv)
│ │ │ │ -
197 {
│ │ │ │ -
198 gridView_ = gv;
│ │ │ │ -
199 }
│ │ │ │ -
│ │ │ │ -
200
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
205 {
│ │ │ │ -
206 return Node{&finiteElementMap_};
│ │ │ │ -
207 }
│ │ │ │ -
│ │ │ │ -
208
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
210 {
│ │ │ │ -
211 return dofsPerCodim_[0] * gridView_.size(0) + dofsPerCodim_[1] * gridView_.size(1); // only 2d
│ │ │ │ -
212 }
│ │ │ │ -
│ │ │ │ -
213
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
215 {
│ │ │ │ -
216 // The implementation currently only supports grids with a single element type.
│ │ │ │ -
217 // We can therefore return the actual number of dofs here.
│ │ │ │ -
218 GeometryType elementType = *(gridView_.indexSet().types(0).begin());
│ │ │ │ -
219 size_t numFaces = ReferenceElements<double,dim>::general(elementType).size(1);
│ │ │ │ -
220 return dofsPerCodim_[0] + dofsPerCodim_[1] * numFaces;
│ │ │ │ -
221 }
│ │ │ │ -
│ │ │ │ -
222
│ │ │ │ -
228 template<typename It>
│ │ │ │ -
│ │ │ │ -
229 It indices(const Node& node, It it) const
│ │ │ │ -
230 {
│ │ │ │ -
231 const auto& gridIndexSet = gridView().indexSet();
│ │ │ │ -
232 const auto& element = node.element();
│ │ │ │ -
233
│ │ │ │ -
234 // throw if element is not of predefined type
│ │ │ │ -
235 if (not(element.type().isCube()) and not(element.type().isSimplex()))
│ │ │ │ -
236 DUNE_THROW(Dune::NotImplemented, "BrezziDouglasMariniBasis only implemented for cube and simplex elements.");
│ │ │ │ +
181template<int dim>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
183{
│ │ │ │ +
184 // Return i as a d-digit number in the (k+1)-nary system
│ │ │ │ +
185 std::array<unsigned int,dim> multiindex (unsigned int i) const
│ │ │ │ +
186 {
│ │ │ │ +
187 std::array<unsigned int,dim> alpha;
│ │ │ │ +
188 for (int j=0; j<dim; j++)
│ │ │ │ +
189 {
│ │ │ │ +
190 alpha[j] = i % sizes_[j];
│ │ │ │ +
191 i = i/sizes_[j];
│ │ │ │ +
192 }
│ │ │ │ +
193 return alpha;
│ │ │ │ +
194 }
│ │ │ │ +
195
│ │ │ │ +
197 void setup1d(std::vector<unsigned int>& subEntity)
│ │ │ │ +
198 {
│ │ │ │ +
199 if (sizes_[0]==1)
│ │ │ │ +
200 {
│ │ │ │ +
201 subEntity[0] = 0;
│ │ │ │ +
202 return;
│ │ │ │ +
203 }
│ │ │ │ +
204
│ │ │ │ +
205 /* edge and vertex numbering
│ │ │ │ +
206 0----0----1
│ │ │ │ +
207 */
│ │ │ │ +
208 unsigned lastIndex=0;
│ │ │ │ +
209 subEntity[lastIndex++] = 0; // corner 0
│ │ │ │ +
210 for (unsigned i = 0; i < sizes_[0] - 2; ++i)
│ │ │ │ +
211 subEntity[lastIndex++] = 0; // inner dofs of element (0)
│ │ │ │ +
212
│ │ │ │ +
213 subEntity[lastIndex++] = 1; // corner 1
│ │ │ │ +
214
│ │ │ │ +
215 assert(size()==lastIndex);
│ │ │ │ +
216 }
│ │ │ │ +
217
│ │ │ │ +
218 void setup2d(std::vector<unsigned int>& subEntity)
│ │ │ │ +
219 {
│ │ │ │ +
220 unsigned lastIndex=0;
│ │ │ │ +
221
│ │ │ │ +
222 // LocalKey: entity number , entity codim, dof indices within each entity
│ │ │ │ +
223 /* edge and vertex numbering
│ │ │ │ +
224 2----3----3
│ │ │ │ +
225 | |
│ │ │ │ +
226 | |
│ │ │ │ +
227 0 1
│ │ │ │ +
228 | |
│ │ │ │ +
229 | |
│ │ │ │ +
230 0----2----1
│ │ │ │ +
231 */
│ │ │ │ +
232
│ │ │ │ +
233 // lower edge (2)
│ │ │ │ +
234 subEntity[lastIndex++] = 0; // corner 0
│ │ │ │ +
235 for (unsigned i = 0; i < sizes_[0]-2; ++i)
│ │ │ │ +
236 subEntity[lastIndex++] = 2; // inner dofs of lower edge (2)
│ │ │ │
237
│ │ │ │ -
238 for(std::size_t i=0, end=node.size(); i<end; ++i, ++it)
│ │ │ │ -
239 {
│ │ │ │ -
240 Dune::LocalKey localKey = node.finiteElement().localCoefficients().localKey(i);
│ │ │ │ -
241
│ │ │ │ -
242 // The dimension of the entity that the current dof is related to
│ │ │ │ -
243 size_t subentity = localKey.subEntity();
│ │ │ │ -
244 size_t codim = localKey.codim();
│ │ │ │ -
245
│ │ │ │ -
246 *it = { codimOffset_[codim] +
│ │ │ │ -
247 dofsPerCodim_[codim] * gridIndexSet.subIndex(element, subentity, codim) + localKey.index() };
│ │ │ │ -
248 }
│ │ │ │ -
249
│ │ │ │ -
250 return it;
│ │ │ │ -
251 }
│ │ │ │ -
│ │ │ │ -
252
│ │ │ │ -
253protected:
│ │ │ │ - │ │ │ │ -
255 std::array<size_t,dim+1> codimOffset_;
│ │ │ │ -
256 FiniteElementMap finiteElementMap_;
│ │ │ │ -
257 // Number of dofs per entity type depending on the entity's codimension and type
│ │ │ │ -
258 std::array<int,2> dofsPerCodim_ {{dim*(k-1)*3, dim+(k-1)}};
│ │ │ │ -
259};
│ │ │ │ -
│ │ │ │ -
260
│ │ │ │ -
261
│ │ │ │ -
262
│ │ │ │ -
263template<typename GV, int k>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
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 using FiniteElementMap = typename Impl::BDMLocalFiniteElementMap<GV, dim, double, k>;
│ │ │ │ -
274 using FiniteElement = Impl::GlobalValuedLocalFiniteElement<Impl::ContravariantPiolaTransformator,
│ │ │ │ -
275 typename FiniteElementMap::FiniteElement,
│ │ │ │ -
276 Element>;
│ │ │ │ -
277
│ │ │ │ -
│ │ │ │ -
278 BrezziDouglasMariniNode(const FiniteElementMap* finiteElementMap) :
│ │ │ │ -
279 element_(nullptr),
│ │ │ │ -
280 finiteElementMap_(finiteElementMap)
│ │ │ │ -
281 {}
│ │ │ │ -
│ │ │ │ -
282
│ │ │ │ -
│ │ │ │ -
284 const Element& element() const
│ │ │ │ -
285 {
│ │ │ │ -
286 return *element_;
│ │ │ │ -
287 }
│ │ │ │ -
│ │ │ │ -
288
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
294 {
│ │ │ │ -
295 return finiteElement_;
│ │ │ │ -
296 }
│ │ │ │ -
│ │ │ │ -
297
│ │ │ │ -
│ │ │ │ -
299 void bind(const Element& e)
│ │ │ │ -
300 {
│ │ │ │ -
301 element_ = &e;
│ │ │ │ -
302 finiteElement_.bind((finiteElementMap_->find(*element_)), e);
│ │ │ │ -
303 this->setSize(finiteElement_.size());
│ │ │ │ -
304 }
│ │ │ │ -
│ │ │ │ +
238 subEntity[lastIndex++] = 1; // corner 1
│ │ │ │ +
239
│ │ │ │ +
240 // iterate from bottom to top over inner edge dofs
│ │ │ │ +
241 for (unsigned e = 0; e < sizes_[1]-2; ++e)
│ │ │ │ +
242 {
│ │ │ │ +
243 subEntity[lastIndex++] = 0; // left edge (0)
│ │ │ │ +
244 for (unsigned i = 0; i < sizes_[0]-2; ++i)
│ │ │ │ +
245 subEntity[lastIndex++] = 0; // face dofs
│ │ │ │ +
246 subEntity[lastIndex++] = 1; // right edge (1)
│ │ │ │ +
247 }
│ │ │ │ +
248
│ │ │ │ +
249 // upper edge (3)
│ │ │ │ +
250 subEntity[lastIndex++] = 2; // corner 2
│ │ │ │ +
251 for (unsigned i = 0; i < sizes_[0]-2; ++i)
│ │ │ │ +
252 subEntity[lastIndex++] = 3; // inner dofs of upper edge (3)
│ │ │ │ +
253
│ │ │ │ +
254 subEntity[lastIndex++] = 3; // corner 3
│ │ │ │ +
255
│ │ │ │ +
256 assert(size()==lastIndex);
│ │ │ │ +
257 }
│ │ │ │ +
258
│ │ │ │ +
259
│ │ │ │ +
260public:
│ │ │ │ +
│ │ │ │ +
261 void init(const std::array<unsigned,dim>& sizes)
│ │ │ │ +
262 {
│ │ │ │ +
263 sizes_ = sizes;
│ │ │ │ +
264
│ │ │ │ +
265 li_.resize(size());
│ │ │ │ +
266
│ │ │ │ +
267 // Set up array of codimension-per-dof-number
│ │ │ │ +
268 std::vector<unsigned int> codim(li_.size());
│ │ │ │ +
269
│ │ │ │ +
270 for (std::size_t i=0; i<codim.size(); i++)
│ │ │ │ +
271 {
│ │ │ │ +
272 codim[i] = 0;
│ │ │ │ +
273 // Codimension gets increased by 1 for each coordinate direction
│ │ │ │ +
274 // where dof is on boundary
│ │ │ │ +
275 std::array<unsigned int,dim> mIdx = multiindex(i);
│ │ │ │ +
276 for (int j=0; j<dim; j++)
│ │ │ │ +
277 if (mIdx[j]==0 or mIdx[j]==sizes[j]-1)
│ │ │ │ +
278 codim[i]++;
│ │ │ │ +
279 }
│ │ │ │ +
280
│ │ │ │ +
281 // Set up index vector (the index of the dof in the set of dofs of a given subentity)
│ │ │ │ +
282 // Algorithm: the 'index' has the same ordering as the dof number 'i'.
│ │ │ │ +
283 // To make it consecutive we interpret 'i' in the (k+1)-adic system, omit all digits
│ │ │ │ +
284 // that correspond to axes where the dof is on the element boundary, and transform the
│ │ │ │ +
285 // rest to the (k-1)-adic system.
│ │ │ │ +
286 std::vector<unsigned int> index(size());
│ │ │ │ +
287
│ │ │ │ +
288 for (std::size_t i=0; i<index.size(); i++)
│ │ │ │ +
289 {
│ │ │ │ +
290 index[i] = 0;
│ │ │ │ +
291
│ │ │ │ +
292 std::array<unsigned int,dim> mIdx = multiindex(i);
│ │ │ │ +
293
│ │ │ │ +
294 for (int j=dim-1; j>=0; j--)
│ │ │ │ +
295 if (mIdx[j]>0 and mIdx[j]<sizes[j]-1)
│ │ │ │ +
296 index[i] = (sizes[j]-1)*index[i] + (mIdx[j]-1);
│ │ │ │ +
297 }
│ │ │ │ +
298
│ │ │ │ +
299 // Set up entity and dof numbers for each (supported) dimension separately
│ │ │ │ +
300 std::vector<unsigned int> subEntity(li_.size());
│ │ │ │ +
301
│ │ │ │ +
302 if (subEntity.size() > 0)
│ │ │ │ +
303 {
│ │ │ │ +
304 if (dim==1) {
│ │ │ │
305
│ │ │ │ -
306protected:
│ │ │ │ +
306 setup1d(subEntity);
│ │ │ │
307
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
311};
│ │ │ │ -
│ │ │ │ -
312
│ │ │ │ -
313
│ │ │ │ +
308 } else if (dim==2 and sizes_[0]>1 and sizes_[1]>1) {
│ │ │ │ +
309
│ │ │ │ +
310 setup2d(subEntity);
│ │ │ │ +
311
│ │ │ │ +
312 }
│ │ │ │ +
313 }
│ │ │ │
314
│ │ │ │ -
315namespace BasisFactory {
│ │ │ │ -
316
│ │ │ │ -
324template<std::size_t k>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
326{
│ │ │ │ -
327 return [](const auto& gridView) {
│ │ │ │ -
328 return BrezziDouglasMariniPreBasis<std::decay_t<decltype(gridView)>, k>(gridView);
│ │ │ │ -
329 };
│ │ │ │ -
330}
│ │ │ │ -
│ │ │ │ -
331
│ │ │ │ -
332} // end namespace BasisFactory
│ │ │ │ -
333
│ │ │ │ -
334
│ │ │ │ +
315 for (size_t i=0; i<li_.size(); i++)
│ │ │ │ +
316 li_[i] = LocalKey(subEntity[i], codim[i], index[i]);
│ │ │ │ +
317 }
│ │ │ │ +
│ │ │ │ +
318
│ │ │ │ +
│ │ │ │ +
320 std::size_t size () const
│ │ │ │ +
321 {
│ │ │ │ +
322 return std::accumulate(sizes_.begin(), sizes_.end(), 1, std::multiplies<unsigned int>());
│ │ │ │ +
323 }
│ │ │ │ +
│ │ │ │ +
324
│ │ │ │ +
│ │ │ │ +
326 const LocalKey& localKey (std::size_t i) const
│ │ │ │ +
327 {
│ │ │ │ +
328 return li_[i];
│ │ │ │ +
329 }
│ │ │ │ +
│ │ │ │ +
330
│ │ │ │ +
331private:
│ │ │ │ +
332
│ │ │ │ +
333 // Number of shape functions on this element per coordinate direction
│ │ │ │ +
334 std::array<unsigned, dim> sizes_;
│ │ │ │
335
│ │ │ │ -
336// *****************************************************************************
│ │ │ │ -
337// This is the actual global basis implementation based on the reusable parts.
│ │ │ │ -
338// *****************************************************************************
│ │ │ │ -
339
│ │ │ │ -
347template<typename GV, int k>
│ │ │ │ - │ │ │ │ -
349
│ │ │ │ -
350} // end namespace Functions
│ │ │ │ -
351} // end namespace Dune
│ │ │ │ -
352
│ │ │ │ +
336 std::vector<LocalKey> li_;
│ │ │ │ +
337};
│ │ │ │ +
│ │ │ │ +
338
│ │ │ │ +
343template<int dim, class LB>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
345{
│ │ │ │ +
346public:
│ │ │ │ +
348 template<typename F, typename C>
│ │ │ │ +
│ │ │ │ +
349 void interpolate (const F& f, std::vector<C>& out) const
│ │ │ │ +
350 {
│ │ │ │ +
351 DUNE_THROW(NotImplemented, "BSplineLocalInterpolation::interpolate");
│ │ │ │ +
352 }
│ │ │ │ +
│ │ │ │
353
│ │ │ │ -
354#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:325
│ │ │ │ +
354};
│ │ │ │ +
│ │ │ │ +
355
│ │ │ │ +
365template<class GV, class R>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
367{
│ │ │ │ +
368 typedef typename GV::ctype D;
│ │ │ │ +
369 enum {dim = GV::dimension};
│ │ │ │ +
370 friend class BSplineLocalBasis<GV,R>;
│ │ │ │ +
371public:
│ │ │ │ +
372
│ │ │ │ +
375 typedef LocalFiniteElementTraits<BSplineLocalBasis<GV,R>,
│ │ │ │ + │ │ │ │ + │ │ │ │ +
378
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
382 : preBasis_(preBasis),
│ │ │ │ +
383 localBasis_(preBasis,*this)
│ │ │ │ +
384 {}
│ │ │ │ +
│ │ │ │ +
385
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
389 : preBasis_(other.preBasis_),
│ │ │ │ + │ │ │ │ +
391 {}
│ │ │ │ +
│ │ │ │ +
392
│ │ │ │ +
│ │ │ │ +
399 void bind(const std::array<unsigned,dim>& elementIdx)
│ │ │ │ +
400 {
│ │ │ │ +
401 /* \todo In the long run we need to precompute a table for this */
│ │ │ │ +
402 for (size_t i=0; i<elementIdx.size(); i++)
│ │ │ │ +
403 {
│ │ │ │ +
404 currentKnotSpan_[i] = 0;
│ │ │ │ +
405
│ │ │ │ +
406 // Skip over degenerate knot spans
│ │ │ │ +
407 while (preBasis_.knotVectors_[i][currentKnotSpan_[i]+1] < preBasis_.knotVectors_[i][currentKnotSpan_[i]]+1e-8)
│ │ │ │ +
408 currentKnotSpan_[i]++;
│ │ │ │ +
409
│ │ │ │ +
410 for (size_t j=0; j<elementIdx[i]; j++)
│ │ │ │ +
411 {
│ │ │ │ +
412 currentKnotSpan_[i]++;
│ │ │ │ +
413
│ │ │ │ +
414 // Skip over degenerate knot spans
│ │ │ │ +
415 while (preBasis_.knotVectors_[i][currentKnotSpan_[i]+1] < preBasis_.knotVectors_[i][currentKnotSpan_[i]]+1e-8)
│ │ │ │ +
416 currentKnotSpan_[i]++;
│ │ │ │ +
417 }
│ │ │ │ +
418
│ │ │ │ +
419 // Compute the geometric transformation from knotspan-local to global coordinates
│ │ │ │ +
420 localBasis_.offset_[i] = preBasis_.knotVectors_[i][currentKnotSpan_[i]];
│ │ │ │ +
421 localBasis_.scaling_[i][i] = preBasis_.knotVectors_[i][currentKnotSpan_[i]+1] - preBasis_.knotVectors_[i][currentKnotSpan_[i]];
│ │ │ │ +
422 }
│ │ │ │ +
423
│ │ │ │ +
424 // Set up the LocalCoefficients object
│ │ │ │ +
425 std::array<unsigned int, dim> sizes;
│ │ │ │ +
426 for (size_t i=0; i<dim; i++)
│ │ │ │ +
427 sizes[i] = size(i);
│ │ │ │ +
428 localCoefficients_.init(sizes);
│ │ │ │ +
429 }
│ │ │ │ +
│ │ │ │ +
430
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
433 {
│ │ │ │ +
434 return localBasis_;
│ │ │ │ +
435 }
│ │ │ │ +
│ │ │ │ +
436
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
439 {
│ │ │ │ +
440 return localCoefficients_;
│ │ │ │ +
441 }
│ │ │ │ +
│ │ │ │ +
442
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
445 {
│ │ │ │ +
446 return localInterpolation_;
│ │ │ │ +
447 }
│ │ │ │ +
│ │ │ │ +
448
│ │ │ │ +
│ │ │ │ +
450 unsigned size () const
│ │ │ │ +
451 {
│ │ │ │ +
452 std::size_t r = 1;
│ │ │ │ +
453 for (int i=0; i<dim; i++)
│ │ │ │ +
454 r *= size(i);
│ │ │ │ +
455 return r;
│ │ │ │ +
456 }
│ │ │ │ +
│ │ │ │ +
457
│ │ │ │ +
│ │ │ │ +
460 GeometryType type () const
│ │ │ │ +
461 {
│ │ │ │ +
462 return GeometryTypes::cube(dim);
│ │ │ │ +
463 }
│ │ │ │ +
│ │ │ │ +
464
│ │ │ │ +
465//private:
│ │ │ │ +
466
│ │ │ │ +
│ │ │ │ +
468 unsigned int size(int i) const
│ │ │ │ +
469 {
│ │ │ │ +
470 const auto& order = preBasis_.order_;
│ │ │ │ +
471 unsigned int r = order[i]+1; // The 'normal' value
│ │ │ │ +
472 if (currentKnotSpan_[i]<order[i]) // Less near the left end of the knot vector
│ │ │ │ +
473 r -= (order[i] - currentKnotSpan_[i]);
│ │ │ │ +
474 if ( order[i] > (preBasis_.knotVectors_[i].size() - currentKnotSpan_[i] - 2) )
│ │ │ │ +
475 r -= order[i] - (preBasis_.knotVectors_[i].size() - currentKnotSpan_[i] - 2);
│ │ │ │ +
476 return r;
│ │ │ │ +
477 }
│ │ │ │ +
│ │ │ │ +
478
│ │ │ │ + │ │ │ │ +
480
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
484
│ │ │ │ +
485 // The knot span we are bound to
│ │ │ │ +
486 std::array<unsigned,dim> currentKnotSpan_;
│ │ │ │ +
487};
│ │ │ │ +
│ │ │ │ +
488
│ │ │ │ +
489
│ │ │ │ +
490template<typename GV>
│ │ │ │ +
491class BSplineNode;
│ │ │ │ +
492
│ │ │ │ +
502template<typename GV>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
504 public LeafPreBasisMixin< BSplinePreBasis<GV> >
│ │ │ │ +
505{
│ │ │ │ + │ │ │ │ +
507
│ │ │ │ +
508 static const int dim = GV::dimension;
│ │ │ │ +
509
│ │ │ │ +
511 class MultiDigitCounter
│ │ │ │ +
512 {
│ │ │ │ +
513 public:
│ │ │ │ +
514
│ │ │ │ +
518 MultiDigitCounter(const std::array<unsigned int,dim>& limits)
│ │ │ │ +
519 : limits_(limits)
│ │ │ │ +
520 {
│ │ │ │ +
521 std::fill(counter_.begin(), counter_.end(), 0);
│ │ │ │ +
522 }
│ │ │ │ +
523
│ │ │ │ +
525 MultiDigitCounter& operator++()
│ │ │ │ +
526 {
│ │ │ │ +
527 for (int i=0; i<dim; i++)
│ │ │ │ +
528 {
│ │ │ │ +
529 ++counter_[i];
│ │ │ │ +
530
│ │ │ │ +
531 // no overflow?
│ │ │ │ +
532 if (counter_[i] < limits_[i])
│ │ │ │ +
533 break;
│ │ │ │ +
534
│ │ │ │ +
535 counter_[i] = 0;
│ │ │ │ +
536 }
│ │ │ │ +
537 return *this;
│ │ │ │ +
538 }
│ │ │ │ +
539
│ │ │ │ +
541 const unsigned int& operator[](int i) const
│ │ │ │ +
542 {
│ │ │ │ +
543 return counter_[i];
│ │ │ │ +
544 }
│ │ │ │ +
545
│ │ │ │ +
547 unsigned int cycle() const
│ │ │ │ +
548 {
│ │ │ │ +
549 unsigned int r = 1;
│ │ │ │ +
550 for (int i=0; i<dim; i++)
│ │ │ │ +
551 r *= limits_[i];
│ │ │ │ +
552 return r;
│ │ │ │ +
553 }
│ │ │ │ +
554
│ │ │ │ +
555 private:
│ │ │ │ +
556
│ │ │ │ +
558 const std::array<unsigned int,dim> limits_;
│ │ │ │ +
559
│ │ │ │ +
561 std::array<unsigned int,dim> counter_;
│ │ │ │ +
562
│ │ │ │ +
563 };
│ │ │ │ +
564
│ │ │ │ +
565public:
│ │ │ │ +
566
│ │ │ │ +
568 using GridView = GV;
│ │ │ │ +
569 using size_type = std::size_t;
│ │ │ │ +
570
│ │ │ │ + │ │ │ │ +
572
│ │ │ │ +
573 // Type used for function values
│ │ │ │ +
574 using R = double;
│ │ │ │ +
575
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
595 const std::vector<double>& knotVector,
│ │ │ │ +
596 unsigned int order,
│ │ │ │ +
597 bool makeOpen = true)
│ │ │ │ + │ │ │ │ +
599 {
│ │ │ │ +
600 // \todo Detection of duplicate knots
│ │ │ │ +
601 std::fill(elements_.begin(), elements_.end(), knotVector.size()-1);
│ │ │ │ +
602
│ │ │ │ +
603 // Mediocre sanity check: we don't know the number of grid elements in each direction.
│ │ │ │ +
604 // but at least we know the total number of elements.
│ │ │ │ +
605 assert( std::accumulate(elements_.begin(), elements_.end(), 1, std::multiplies<unsigned>()) == gridView_.size(0) );
│ │ │ │ +
606
│ │ │ │ +
607 for (int i=0; i<dim; i++)
│ │ │ │ +
608 {
│ │ │ │ +
609 // Prepend the correct number of additional knots to open the knot vector
│ │ │ │ +
611 if (makeOpen)
│ │ │ │ +
612 for (unsigned int j=0; j<order; j++)
│ │ │ │ +
613 knotVectors_[i].push_back(knotVector[0]);
│ │ │ │ +
614
│ │ │ │ +
615 knotVectors_[i].insert(knotVectors_[i].end(), knotVector.begin(), knotVector.end());
│ │ │ │ +
616
│ │ │ │ +
617 if (makeOpen)
│ │ │ │ +
618 for (unsigned int j=0; j<order; j++)
│ │ │ │ +
619 knotVectors_[i].push_back(knotVector.back());
│ │ │ │ +
620 }
│ │ │ │ +
621
│ │ │ │ +
622 std::fill(order_.begin(), order_.end(), order);
│ │ │ │ +
623 }
│ │ │ │ +
│ │ │ │ +
624
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
647 const FieldVector<double,dim>& lowerLeft,
│ │ │ │ +
648 const FieldVector<double,dim>& upperRight,
│ │ │ │ +
649 const std::array<unsigned int,dim>& elements,
│ │ │ │ +
650 unsigned int order,
│ │ │ │ +
651 bool makeOpen = true)
│ │ │ │ +
652 : elements_(elements),
│ │ │ │ + │ │ │ │ +
654 {
│ │ │ │ +
655 // Mediocre sanity check: we don't know the number of grid elements in each direction.
│ │ │ │ +
656 // but at least we know the total number of elements.
│ │ │ │ +
657 assert( std::accumulate(elements_.begin(), elements_.end(), 1, std::multiplies<unsigned>()) == gridView_.size(0) );
│ │ │ │ +
658
│ │ │ │ +
659 for (int i=0; i<dim; i++)
│ │ │ │ +
660 {
│ │ │ │ +
661 // Prepend the correct number of additional knots to open the knot vector
│ │ │ │ +
663 if (makeOpen)
│ │ │ │ +
664 for (unsigned int j=0; j<order; j++)
│ │ │ │ +
665 knotVectors_[i].push_back(lowerLeft[i]);
│ │ │ │ +
666
│ │ │ │ +
667 // Construct the actual knot vector
│ │ │ │ +
668 for (size_t j=0; j<elements[i]+1; j++)
│ │ │ │ +
669 knotVectors_[i].push_back(lowerLeft[i] + j*(upperRight[i]-lowerLeft[i]) / elements[i]);
│ │ │ │ +
670
│ │ │ │ +
671 if (makeOpen)
│ │ │ │ +
672 for (unsigned int j=0; j<order; j++)
│ │ │ │ +
673 knotVectors_[i].push_back(upperRight[i]);
│ │ │ │ +
674 }
│ │ │ │ +
675
│ │ │ │ +
676 std::fill(order_.begin(), order_.end(), order);
│ │ │ │ +
677 }
│ │ │ │ +
│ │ │ │ +
678
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
681 {}
│ │ │ │ +
│ │ │ │ +
682
│ │ │ │ +
│ │ │ │ +
684 const GridView& gridView() const
│ │ │ │ +
685 {
│ │ │ │ +
686 return gridView_;
│ │ │ │ +
687 }
│ │ │ │ +
│ │ │ │ +
688
│ │ │ │ +
│ │ │ │ +
690 void update(const GridView& gv)
│ │ │ │ +
691 {
│ │ │ │ +
692 gridView_ = gv;
│ │ │ │ +
693 }
│ │ │ │ +
│ │ │ │ +
694
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
699 {
│ │ │ │ +
700 return Node{this};
│ │ │ │ +
701 }
│ │ │ │ +
│ │ │ │ +
702
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
705 {
│ │ │ │ +
706 size_type result = 1;
│ │ │ │ +
707 for (int i=0; i<dim; i++)
│ │ │ │ +
708 result *= order_[i]+1;
│ │ │ │ +
709 return result;
│ │ │ │ +
710 }
│ │ │ │ +
│ │ │ │ +
711
│ │ │ │ +
713 template<typename It>
│ │ │ │ +
│ │ │ │ +
714 It indices(const Node& node, It it) const
│ │ │ │ +
715 {
│ │ │ │ +
716 // Local degrees of freedom are arranged in a lattice.
│ │ │ │ +
717 // We need the lattice dimensions to be able to compute lattice coordinates from a local index
│ │ │ │ +
718 std::array<unsigned int, dim> localSizes;
│ │ │ │ +
719 for (int i=0; i<dim; i++)
│ │ │ │ +
720 localSizes[i] = node.finiteElement().size(i);
│ │ │ │ +
721 for (size_type i = 0, end = node.size() ; i < end ; ++i, ++it)
│ │ │ │ +
722 {
│ │ │ │ +
723 std::array<unsigned int,dim> localIJK = getIJK(i, localSizes);
│ │ │ │ +
724
│ │ │ │ +
725 const auto currentKnotSpan = node.finiteElement().currentKnotSpan_;
│ │ │ │ +
726 const auto order = order_;
│ │ │ │ +
727
│ │ │ │ +
728 std::array<unsigned int,dim> globalIJK;
│ │ │ │ +
729 for (int i=0; i<dim; i++)
│ │ │ │ +
730 globalIJK[i] = std::max((int)currentKnotSpan[i] - (int)order[i], 0) + localIJK[i]; // needs to be a signed type!
│ │ │ │ +
731
│ │ │ │ +
732 // Make one global flat index from the globalIJK tuple
│ │ │ │ +
733 size_type globalIdx = globalIJK[dim-1];
│ │ │ │ +
734
│ │ │ │ +
735 for (int i=dim-2; i>=0; i--)
│ │ │ │ +
736 globalIdx = globalIdx * size(i) + globalIJK[i];
│ │ │ │ +
737
│ │ │ │ +
738 *it = {{globalIdx}};
│ │ │ │ +
739 }
│ │ │ │ +
740 return it;
│ │ │ │ +
741 }
│ │ │ │ +
│ │ │ │ +
742
│ │ │ │ +
│ │ │ │ +
744 unsigned int dimension () const
│ │ │ │ +
745 {
│ │ │ │ +
746 unsigned int result = 1;
│ │ │ │ +
747 for (size_t i=0; i<dim; i++)
│ │ │ │ +
748 result *= size(i);
│ │ │ │ +
749 return result;
│ │ │ │ +
750 }
│ │ │ │ +
│ │ │ │ +
751
│ │ │ │ +
│ │ │ │ +
753 unsigned int size (size_t d) const
│ │ │ │ +
754 {
│ │ │ │ +
755 return knotVectors_[d].size() - order_[d] - 1;
│ │ │ │ +
756 }
│ │ │ │ +
│ │ │ │ +
757
│ │ │ │ +
758 using Base::size;
│ │ │ │ +
759
│ │ │ │ +
│ │ │ │ +
762 void evaluateFunction (const FieldVector<typename GV::ctype,dim>& in,
│ │ │ │ +
763 std::vector<FieldVector<R,1> >& out,
│ │ │ │ +
764 const std::array<unsigned,dim>& currentKnotSpan) const
│ │ │ │ +
765 {
│ │ │ │ +
766 // Evaluate
│ │ │ │ +
767 std::array<std::vector<R>, dim> oneDValues;
│ │ │ │ +
768
│ │ │ │ +
769 for (size_t i=0; i<dim; i++)
│ │ │ │ +
770 evaluateFunction(in[i], oneDValues[i], knotVectors_[i], order_[i], currentKnotSpan[i]);
│ │ │ │ +
771
│ │ │ │ +
772 std::array<unsigned int, dim> limits;
│ │ │ │ +
773 for (int i=0; i<dim; i++)
│ │ │ │ +
774 limits[i] = oneDValues[i].size();
│ │ │ │ +
775
│ │ │ │ +
776 MultiDigitCounter ijkCounter(limits);
│ │ │ │ +
777
│ │ │ │ +
778 out.resize(ijkCounter.cycle());
│ │ │ │ +
779
│ │ │ │ +
780 for (size_t i=0; i<out.size(); i++, ++ijkCounter)
│ │ │ │ +
781 {
│ │ │ │ +
782 out[i] = R(1.0);
│ │ │ │ +
783 for (size_t j=0; j<dim; j++)
│ │ │ │ +
784 out[i] *= oneDValues[j][ijkCounter[j]];
│ │ │ │ +
785 }
│ │ │ │ +
786 }
│ │ │ │ +
│ │ │ │ +
787
│ │ │ │ +
│ │ │ │ +
793 void evaluateJacobian (const FieldVector<typename GV::ctype,dim>& in,
│ │ │ │ +
794 std::vector<FieldMatrix<R,1,dim> >& out,
│ │ │ │ +
795 const std::array<unsigned,dim>& currentKnotSpan) const
│ │ │ │ +
796 {
│ │ │ │ +
797 // How many shape functions to we have in each coordinate direction?
│ │ │ │ +
798 std::array<unsigned int, dim> limits;
│ │ │ │ +
799 for (int i=0; i<dim; i++)
│ │ │ │ +
800 {
│ │ │ │ +
801 limits[i] = order_[i]+1; // The 'standard' value away from the boundaries of the knot vector
│ │ │ │ +
802 if (currentKnotSpan[i]<order_[i])
│ │ │ │ +
803 limits[i] -= (order_[i] - currentKnotSpan[i]);
│ │ │ │ +
804 if ( order_[i] > (knotVectors_[i].size() - currentKnotSpan[i] - 2) )
│ │ │ │ +
805 limits[i] -= order_[i] - (knotVectors_[i].size() - currentKnotSpan[i] - 2);
│ │ │ │ +
806 }
│ │ │ │ +
807
│ │ │ │ +
808 // The lowest knot spans that we need values from
│ │ │ │ +
809 std::array<unsigned int, dim> offset;
│ │ │ │ +
810 for (int i=0; i<dim; i++)
│ │ │ │ +
811 offset[i] = std::max((int)(currentKnotSpan[i] - order_[i]),0);
│ │ │ │ +
812
│ │ │ │ +
813 // Evaluate 1d function values (needed for the product rule)
│ │ │ │ +
814 std::array<std::vector<R>, dim> oneDValues;
│ │ │ │ +
815
│ │ │ │ +
816 // Evaluate 1d function values of one order lower (needed for the derivative formula)
│ │ │ │ +
817 std::array<std::vector<R>, dim> lowOrderOneDValues;
│ │ │ │ +
818
│ │ │ │ +
819 std::array<DynamicMatrix<R>, dim> values;
│ │ │ │ +
820
│ │ │ │ +
821 for (size_t i=0; i<dim; i++)
│ │ │ │ +
822 {
│ │ │ │ +
823 evaluateFunctionFull(in[i], values[i], knotVectors_[i], order_[i], currentKnotSpan[i]);
│ │ │ │ +
824 oneDValues[i].resize(knotVectors_[i].size()-order_[i]-1);
│ │ │ │ +
825 for (size_t j=0; j<oneDValues[i].size(); j++)
│ │ │ │ +
826 oneDValues[i][j] = values[i][order_[i]][j];
│ │ │ │ +
827
│ │ │ │ +
828 if (order_[i]!=0)
│ │ │ │ +
829 {
│ │ │ │ +
830 lowOrderOneDValues[i].resize(knotVectors_[i].size()-(order_[i]-1)-1);
│ │ │ │ +
831 for (size_t j=0; j<lowOrderOneDValues[i].size(); j++)
│ │ │ │ +
832 lowOrderOneDValues[i][j] = values[i][order_[i]-1][j];
│ │ │ │ +
833 }
│ │ │ │ +
834 }
│ │ │ │ +
835
│ │ │ │ +
836
│ │ │ │ +
837 // Evaluate 1d function derivatives
│ │ │ │ +
838 std::array<std::vector<R>, dim> oneDDerivatives;
│ │ │ │ +
839 for (size_t i=0; i<dim; i++)
│ │ │ │ +
840 {
│ │ │ │ +
841 oneDDerivatives[i].resize(limits[i]);
│ │ │ │ +
842
│ │ │ │ +
843 if (order_[i]==0) // order-zero functions are piecewise constant, hence all derivatives are zero
│ │ │ │ +
844 std::fill(oneDDerivatives[i].begin(), oneDDerivatives[i].end(), R(0.0));
│ │ │ │ +
845 else
│ │ │ │ +
846 {
│ │ │ │ +
847 for (size_t j=offset[i]; j<offset[i]+limits[i]; j++)
│ │ │ │ +
848 {
│ │ │ │ +
849 R derivativeAddend1 = lowOrderOneDValues[i][j] / (knotVectors_[i][j+order_[i]]-knotVectors_[i][j]);
│ │ │ │ +
850 R derivativeAddend2 = lowOrderOneDValues[i][j+1] / (knotVectors_[i][j+order_[i]+1]-knotVectors_[i][j+1]);
│ │ │ │ +
851 // The two previous terms may evaluate as 0/0. This is to be interpreted as 0.
│ │ │ │ +
852 if (std::isnan(derivativeAddend1))
│ │ │ │ +
853 derivativeAddend1 = 0;
│ │ │ │ +
854 if (std::isnan(derivativeAddend2))
│ │ │ │ +
855 derivativeAddend2 = 0;
│ │ │ │ +
856 oneDDerivatives[i][j-offset[i]] = order_[i] * ( derivativeAddend1 - derivativeAddend2 );
│ │ │ │ +
857 }
│ │ │ │ +
858 }
│ │ │ │ +
859 }
│ │ │ │ +
860
│ │ │ │ +
861 // Working towards computing only the parts that we really need:
│ │ │ │ +
862 // Let's copy them out into a separate array
│ │ │ │ +
863 std::array<std::vector<R>, dim> oneDValuesShort;
│ │ │ │ +
864
│ │ │ │ +
865 for (int i=0; i<dim; i++)
│ │ │ │ +
866 {
│ │ │ │ +
867 oneDValuesShort[i].resize(limits[i]);
│ │ │ │ +
868
│ │ │ │ +
869 for (size_t j=0; j<limits[i]; j++)
│ │ │ │ +
870 oneDValuesShort[i][j] = oneDValues[i][offset[i] + j];
│ │ │ │ +
871 }
│ │ │ │ +
872
│ │ │ │ +
873
│ │ │ │ +
874
│ │ │ │ +
875 // Set up a multi-index to go from consecutive indices to integer coordinates
│ │ │ │ +
876 MultiDigitCounter ijkCounter(limits);
│ │ │ │ +
877
│ │ │ │ +
878 out.resize(ijkCounter.cycle());
│ │ │ │ +
879
│ │ │ │ +
880 // Complete Jacobian is given by the product rule
│ │ │ │ +
881 for (size_t i=0; i<out.size(); i++, ++ijkCounter)
│ │ │ │ +
882 for (int j=0; j<dim; j++)
│ │ │ │ +
883 {
│ │ │ │ +
884 out[i][0][j] = 1.0;
│ │ │ │ +
885 for (int k=0; k<dim; k++)
│ │ │ │ +
886 out[i][0][j] *= (j==k) ? oneDDerivatives[k][ijkCounter[k]]
│ │ │ │ +
887 : oneDValuesShort[k][ijkCounter[k]];
│ │ │ │ +
888 }
│ │ │ │ +
889
│ │ │ │ +
890 }
│ │ │ │ +
│ │ │ │ +
891
│ │ │ │ +
893 template <size_type k>
│ │ │ │ +
│ │ │ │ +
894 void evaluate(const typename std::array<int,k>& directions,
│ │ │ │ +
895 const FieldVector<typename GV::ctype,dim>& in,
│ │ │ │ +
896 std::vector<FieldVector<R,1> >& out,
│ │ │ │ +
897 const std::array<unsigned,dim>& currentKnotSpan) const
│ │ │ │ +
898 {
│ │ │ │ +
899 if (k != 1 && k != 2)
│ │ │ │ +
900 DUNE_THROW(RangeError, "Differentiation order greater than 2 is not supported!");
│ │ │ │ +
901
│ │ │ │ +
902 // Evaluate 1d function values (needed for the product rule)
│ │ │ │ +
903 std::array<std::vector<R>, dim> oneDValues;
│ │ │ │ +
904 std::array<std::vector<R>, dim> oneDDerivatives;
│ │ │ │ +
905 std::array<std::vector<R>, dim> oneDSecondDerivatives;
│ │ │ │ +
906
│ │ │ │ +
907 // Evaluate 1d function derivatives
│ │ │ │ +
908 if (k==1)
│ │ │ │ +
909 for (size_t i=0; i<dim; i++)
│ │ │ │ +
910 evaluateAll(in[i], oneDValues[i], true, oneDDerivatives[i], false, oneDSecondDerivatives[i], knotVectors_[i], order_[i], currentKnotSpan[i]);
│ │ │ │ +
911 else
│ │ │ │ +
912 for (size_t i=0; i<dim; i++)
│ │ │ │ +
913 evaluateAll(in[i], oneDValues[i], true, oneDDerivatives[i], true, oneDSecondDerivatives[i], knotVectors_[i], order_[i], currentKnotSpan[i]);
│ │ │ │ +
914
│ │ │ │ +
915 // The lowest knot spans that we need values from
│ │ │ │ +
916 std::array<unsigned int, dim> offset;
│ │ │ │ +
917 for (int i=0; i<dim; i++)
│ │ │ │ +
918 offset[i] = std::max((int)(currentKnotSpan[i] - order_[i]),0);
│ │ │ │ +
919
│ │ │ │ +
920 // Set up a multi-index to go from consecutive indices to integer coordinates
│ │ │ │ +
921 std::array<unsigned int, dim> limits;
│ │ │ │ +
922 for (int i=0; i<dim; i++)
│ │ │ │ +
923 {
│ │ │ │ +
924 // In a proper implementation, the following line would do
│ │ │ │ +
925 //limits[i] = oneDValues[i].size();
│ │ │ │ +
926 limits[i] = order_[i]+1; // The 'standard' value away from the boundaries of the knot vector
│ │ │ │ +
927 if (currentKnotSpan[i]<order_[i])
│ │ │ │ +
928 limits[i] -= (order_[i] - currentKnotSpan[i]);
│ │ │ │ +
929 if ( order_[i] > (knotVectors_[i].size() - currentKnotSpan[i] - 2) )
│ │ │ │ +
930 limits[i] -= order_[i] - (knotVectors_[i].size() - currentKnotSpan[i] - 2);
│ │ │ │ +
931 }
│ │ │ │ +
932
│ │ │ │ +
933 // Working towards computing only the parts that we really need:
│ │ │ │ +
934 // Let's copy them out into a separate array
│ │ │ │ +
935 std::array<std::vector<R>, dim> oneDValuesShort;
│ │ │ │ +
936
│ │ │ │ +
937 for (int i=0; i<dim; i++)
│ │ │ │ +
938 {
│ │ │ │ +
939 oneDValuesShort[i].resize(limits[i]);
│ │ │ │ +
940
│ │ │ │ +
941 for (size_t j=0; j<limits[i]; j++)
│ │ │ │ +
942 oneDValuesShort[i][j] = oneDValues[i][offset[i] + j];
│ │ │ │ +
943 }
│ │ │ │ +
944
│ │ │ │ +
945
│ │ │ │ +
946 MultiDigitCounter ijkCounter(limits);
│ │ │ │ +
947
│ │ │ │ +
948 out.resize(ijkCounter.cycle());
│ │ │ │ +
949
│ │ │ │ +
950 if (k == 1)
│ │ │ │ +
951 {
│ │ │ │ +
952 // Complete Jacobian is given by the product rule
│ │ │ │ +
953 for (size_t i=0; i<out.size(); i++, ++ijkCounter)
│ │ │ │ +
954 {
│ │ │ │ +
955 out[i][0] = 1.0;
│ │ │ │ +
956 for (int l=0; l<dim; l++)
│ │ │ │ +
957 out[i][0] *= (directions[0]==l) ? oneDDerivatives[l][ijkCounter[l]]
│ │ │ │ +
958 : oneDValuesShort[l][ijkCounter[l]];
│ │ │ │ +
959 }
│ │ │ │ +
960 }
│ │ │ │ +
961
│ │ │ │ +
962 if (k == 2)
│ │ │ │ +
963 {
│ │ │ │ +
964 // Complete derivation by deriving the tensor product
│ │ │ │ +
965 for (size_t i=0; i<out.size(); i++, ++ijkCounter)
│ │ │ │ +
966 {
│ │ │ │ +
967 out[i][0] = 1.0;
│ │ │ │ +
968 for (int j=0; j<dim; j++)
│ │ │ │ +
969 {
│ │ │ │ +
970 if (directions[0] != directions[1]) //derivation in two different variables
│ │ │ │ +
971 if (directions[0] == j || directions[1] == j) //the spline has to be derived (once) in this direction
│ │ │ │ +
972 out[i][0] *= oneDDerivatives[j][ijkCounter[j]];
│ │ │ │ +
973 else //no derivation in this direction
│ │ │ │ +
974 out[i][0] *= oneDValuesShort[j][ijkCounter[j]];
│ │ │ │ +
975 else //spline is derived two times in the same direction
│ │ │ │ +
976 if (directions[0] == j) //the spline is derived two times in this direction
│ │ │ │ +
977 out[i][0] *= oneDSecondDerivatives[j][ijkCounter[j]];
│ │ │ │ +
978 else //no derivation in this direction
│ │ │ │ +
979 out[i][0] *= oneDValuesShort[j][ijkCounter[j]];
│ │ │ │ +
980 }
│ │ │ │ +
981 }
│ │ │ │ +
982 }
│ │ │ │ +
983 }
│ │ │ │ +
│ │ │ │ +
984
│ │ │ │ +
985
│ │ │ │ +
│ │ │ │ +
990 static std::array<unsigned int,dim> getIJK(typename GridView::IndexSet::IndexType idx, std::array<unsigned int,dim> elements)
│ │ │ │ +
991 {
│ │ │ │ +
992 std::array<unsigned,dim> result;
│ │ │ │ +
993 for (int i=0; i<dim; i++)
│ │ │ │ +
994 {
│ │ │ │ +
995 result[i] = idx%elements[i];
│ │ │ │ +
996 idx /= elements[i];
│ │ │ │ +
997 }
│ │ │ │ +
998 return result;
│ │ │ │ +
999 }
│ │ │ │ +
│ │ │ │ +
1000
│ │ │ │ +
│ │ │ │ +
1009 static void evaluateFunction (const typename GV::ctype& in, std::vector<R>& out,
│ │ │ │ +
1010 const std::vector<R>& knotVector,
│ │ │ │ +
1011 unsigned int order,
│ │ │ │ +
1012 unsigned int currentKnotSpan)
│ │ │ │ +
1013 {
│ │ │ │ +
1014 std::size_t outSize = order+1; // The 'standard' value away from the boundaries of the knot vector
│ │ │ │ +
1015 if (currentKnotSpan<order) // Less near the left end of the knot vector
│ │ │ │ +
1016 outSize -= (order - currentKnotSpan);
│ │ │ │ +
1017 if ( order > (knotVector.size() - currentKnotSpan - 2) )
│ │ │ │ +
1018 outSize -= order - (knotVector.size() - currentKnotSpan - 2);
│ │ │ │ +
1019 out.resize(outSize);
│ │ │ │ +
1020
│ │ │ │ +
1021 // It's not really a matrix that is needed here, a plain 2d array would do
│ │ │ │ +
1022 DynamicMatrix<R> N(order+1, knotVector.size()-1);
│ │ │ │ +
1023
│ │ │ │ +
1024 // The text books on splines use the following geometric condition here to fill the array N
│ │ │ │ +
1025 // (see for example Cottrell, Hughes, Bazilevs, Formula (2.1). However, this condition
│ │ │ │ +
1026 // only works if splines are never evaluated exactly on the knots.
│ │ │ │ +
1027 //
│ │ │ │ +
1028 // for (size_t i=0; i<knotVector.size()-1; i++)
│ │ │ │ +
1029 // N[0][i] = (knotVector[i] <= in) and (in < knotVector[i+1]);
│ │ │ │ +
1030 for (size_t i=0; i<knotVector.size()-1; i++)
│ │ │ │ +
1031 N[0][i] = (i == currentKnotSpan);
│ │ │ │ +
1032
│ │ │ │ +
1033 for (size_t r=1; r<=order; r++)
│ │ │ │ +
1034 for (size_t i=0; i<knotVector.size()-r-1; i++)
│ │ │ │ +
1035 {
│ │ │ │ +
1036 R factor1 = ((knotVector[i+r] - knotVector[i]) > 1e-10)
│ │ │ │ +
1037 ? (in - knotVector[i]) / (knotVector[i+r] - knotVector[i])
│ │ │ │ +
1038 : 0;
│ │ │ │ +
1039 R factor2 = ((knotVector[i+r+1] - knotVector[i+1]) > 1e-10)
│ │ │ │ +
1040 ? (knotVector[i+r+1] - in) / (knotVector[i+r+1] - knotVector[i+1])
│ │ │ │ +
1041 : 0;
│ │ │ │ +
1042 N[r][i] = factor1 * N[r-1][i] + factor2 * N[r-1][i+1];
│ │ │ │ +
1043 }
│ │ │ │ +
1044
│ │ │ │ +
1049 for (size_t i=0; i<out.size(); i++) {
│ │ │ │ +
1050 out[i] = N[order][std::max((int)(currentKnotSpan - order),0) + i];
│ │ │ │ +
1051 }
│ │ │ │ +
1052 }
│ │ │ │ +
│ │ │ │ +
1053
│ │ │ │ +
│ │ │ │ +
1066 static void evaluateFunctionFull(const typename GV::ctype& in,
│ │ │ │ +
1067 DynamicMatrix<R>& out,
│ │ │ │ +
1068 const std::vector<R>& knotVector,
│ │ │ │ +
1069 unsigned int order,
│ │ │ │ +
1070 unsigned int currentKnotSpan)
│ │ │ │ +
1071 {
│ │ │ │ +
1072 // It's not really a matrix that is needed here, a plain 2d array would do
│ │ │ │ +
1073 DynamicMatrix<R>& N = out;
│ │ │ │ +
1074
│ │ │ │ +
1075 N.resize(order+1, knotVector.size()-1);
│ │ │ │ +
1076
│ │ │ │ +
1077 // The text books on splines use the following geometric condition here to fill the array N
│ │ │ │ +
1078 // (see for example Cottrell, Hughes, Bazilevs, Formula (2.1). However, this condition
│ │ │ │ +
1079 // only works if splines are never evaluated exactly on the knots.
│ │ │ │ +
1080 //
│ │ │ │ +
1081 // for (size_t i=0; i<knotVector.size()-1; i++)
│ │ │ │ +
1082 // N[0][i] = (knotVector[i] <= in) and (in < knotVector[i+1]);
│ │ │ │ +
1083 for (size_t i=0; i<knotVector.size()-1; i++)
│ │ │ │ +
1084 N[0][i] = (i == currentKnotSpan);
│ │ │ │ +
1085
│ │ │ │ +
1086 for (size_t r=1; r<=order; r++)
│ │ │ │ +
1087 for (size_t i=0; i<knotVector.size()-r-1; i++)
│ │ │ │ +
1088 {
│ │ │ │ +
1089 R factor1 = ((knotVector[i+r] - knotVector[i]) > 1e-10)
│ │ │ │ +
1090 ? (in - knotVector[i]) / (knotVector[i+r] - knotVector[i])
│ │ │ │ +
1091 : 0;
│ │ │ │ +
1092 R factor2 = ((knotVector[i+r+1] - knotVector[i+1]) > 1e-10)
│ │ │ │ +
1093 ? (knotVector[i+r+1] - in) / (knotVector[i+r+1] - knotVector[i+1])
│ │ │ │ +
1094 : 0;
│ │ │ │ +
1095 N[r][i] = factor1 * N[r-1][i] + factor2 * N[r-1][i+1];
│ │ │ │ +
1096 }
│ │ │ │ +
1097 }
│ │ │ │ +
│ │ │ │ +
1098
│ │ │ │ +
1099
│ │ │ │ +
│ │ │ │ +
1109 static void evaluateAll(const typename GV::ctype& in,
│ │ │ │ +
1110 std::vector<R>& out,
│ │ │ │ +
1111 bool evaluateJacobian, std::vector<R>& outJac,
│ │ │ │ +
1112 bool evaluateHessian, std::vector<R>& outHess,
│ │ │ │ +
1113 const std::vector<R>& knotVector,
│ │ │ │ +
1114 unsigned int order,
│ │ │ │ +
1115 unsigned int currentKnotSpan)
│ │ │ │ +
1116 {
│ │ │ │ +
1117 // How many shape functions to we have in each coordinate direction?
│ │ │ │ +
1118 unsigned int limit;
│ │ │ │ +
1119 limit = order+1; // The 'standard' value away from the boundaries of the knot vector
│ │ │ │ +
1120 if (currentKnotSpan<order)
│ │ │ │ +
1121 limit -= (order - currentKnotSpan);
│ │ │ │ +
1122 if ( order > (knotVector.size() - currentKnotSpan - 2) )
│ │ │ │ +
1123 limit -= order - (knotVector.size() - currentKnotSpan - 2);
│ │ │ │ +
1124
│ │ │ │ +
1125 // The lowest knot spans that we need values from
│ │ │ │ +
1126 unsigned int offset;
│ │ │ │ +
1127 offset = std::max((int)(currentKnotSpan - order),0);
│ │ │ │ +
1128
│ │ │ │ +
1129 // Evaluate 1d function values (needed for the product rule)
│ │ │ │ +
1130 DynamicMatrix<R> values;
│ │ │ │ +
1131
│ │ │ │ +
1132 evaluateFunctionFull(in, values, knotVector, order, currentKnotSpan);
│ │ │ │ +
1133
│ │ │ │ +
1134 out.resize(knotVector.size()-order-1);
│ │ │ │ +
1135 for (size_t j=0; j<out.size(); j++)
│ │ │ │ +
1136 out[j] = values[order][j];
│ │ │ │ +
1137
│ │ │ │ +
1138 // Evaluate 1d function values of one order lower (needed for the derivative formula)
│ │ │ │ +
1139 std::vector<R> lowOrderOneDValues;
│ │ │ │ +
1140
│ │ │ │ +
1141 if (order!=0)
│ │ │ │ +
1142 {
│ │ │ │ +
1143 lowOrderOneDValues.resize(knotVector.size()-(order-1)-1);
│ │ │ │ +
1144 for (size_t j=0; j<lowOrderOneDValues.size(); j++)
│ │ │ │ +
1145 lowOrderOneDValues[j] = values[order-1][j];
│ │ │ │ +
1146 }
│ │ │ │ +
1147
│ │ │ │ +
1148 // Evaluate 1d function values of two order lower (needed for the (second) derivative formula)
│ │ │ │ +
1149 std::vector<R> lowOrderTwoDValues;
│ │ │ │ +
1150
│ │ │ │ +
1151 if (order>1 && evaluateHessian)
│ │ │ │ +
1152 {
│ │ │ │ +
1153 lowOrderTwoDValues.resize(knotVector.size()-(order-2)-1);
│ │ │ │ +
1154 for (size_t j=0; j<lowOrderTwoDValues.size(); j++)
│ │ │ │ +
1155 lowOrderTwoDValues[j] = values[order-2][j];
│ │ │ │ +
1156 }
│ │ │ │ +
1157
│ │ │ │ +
1158 // Evaluate 1d function derivatives
│ │ │ │ +
1159 if (evaluateJacobian)
│ │ │ │ +
1160 {
│ │ │ │ +
1161 outJac.resize(limit);
│ │ │ │ +
1162
│ │ │ │ +
1163 if (order==0) // order-zero functions are piecewise constant, hence all derivatives are zero
│ │ │ │ +
1164 std::fill(outJac.begin(), outJac.end(), R(0.0));
│ │ │ │ +
1165 else
│ │ │ │ +
1166 {
│ │ │ │ +
1167 for (size_t j=offset; j<offset+limit; j++)
│ │ │ │ +
1168 {
│ │ │ │ +
1169 R derivativeAddend1 = lowOrderOneDValues[j] / (knotVector[j+order]-knotVector[j]);
│ │ │ │ +
1170 R derivativeAddend2 = lowOrderOneDValues[j+1] / (knotVector[j+order+1]-knotVector[j+1]);
│ │ │ │ +
1171 // The two previous terms may evaluate as 0/0. This is to be interpreted as 0.
│ │ │ │ +
1172 if (std::isnan(derivativeAddend1))
│ │ │ │ +
1173 derivativeAddend1 = 0;
│ │ │ │ +
1174 if (std::isnan(derivativeAddend2))
│ │ │ │ +
1175 derivativeAddend2 = 0;
│ │ │ │ +
1176 outJac[j-offset] = order * ( derivativeAddend1 - derivativeAddend2 );
│ │ │ │ +
1177 }
│ │ │ │ +
1178 }
│ │ │ │ +
1179 }
│ │ │ │ +
1180
│ │ │ │ +
1181 // Evaluate 1d function second derivatives
│ │ │ │ +
1182 if (evaluateHessian)
│ │ │ │ +
1183 {
│ │ │ │ +
1184 outHess.resize(limit);
│ │ │ │ +
1185
│ │ │ │ +
1186 if (order<2) // order-zero functions are piecewise constant, hence all derivatives are zero
│ │ │ │ +
1187 std::fill(outHess.begin(), outHess.end(), R(0.0));
│ │ │ │ +
1188 else
│ │ │ │ +
1189 {
│ │ │ │ +
1190 for (size_t j=offset; j<offset+limit; j++)
│ │ │ │ +
1191 {
│ │ │ │ +
1192 assert(j+2 < lowOrderTwoDValues.size());
│ │ │ │ +
1193 R derivativeAddend1 = lowOrderTwoDValues[j] / (knotVector[j+order]-knotVector[j]) / (knotVector[j+order-1]-knotVector[j]);
│ │ │ │ +
1194 R derivativeAddend2 = lowOrderTwoDValues[j+1] / (knotVector[j+order]-knotVector[j]) / (knotVector[j+order]-knotVector[j+1]);
│ │ │ │ +
1195 R derivativeAddend3 = lowOrderTwoDValues[j+1] / (knotVector[j+order+1]-knotVector[j+1]) / (knotVector[j+order]-knotVector[j+1]);
│ │ │ │ +
1196 R derivativeAddend4 = lowOrderTwoDValues[j+2] / (knotVector[j+order+1]-knotVector[j+1]) / (knotVector[j+1+order]-knotVector[j+2]);
│ │ │ │ +
1197 // The two previous terms may evaluate as 0/0. This is to be interpreted as 0.
│ │ │ │ +
1198
│ │ │ │ +
1199 if (std::isnan(derivativeAddend1))
│ │ │ │ +
1200 derivativeAddend1 = 0;
│ │ │ │ +
1201 if (std::isnan(derivativeAddend2))
│ │ │ │ +
1202 derivativeAddend2 = 0;
│ │ │ │ +
1203 if (std::isnan(derivativeAddend3))
│ │ │ │ +
1204 derivativeAddend3 = 0;
│ │ │ │ +
1205 if (std::isnan(derivativeAddend4))
│ │ │ │ +
1206 derivativeAddend4 = 0;
│ │ │ │ +
1207 outHess[j-offset] = order * (order-1) * ( derivativeAddend1 - derivativeAddend2 -derivativeAddend3 + derivativeAddend4 );
│ │ │ │ +
1208 }
│ │ │ │ +
1209 }
│ │ │ │ +
1210 }
│ │ │ │ +
1211 }
│ │ │ │ +
│ │ │ │ +
1212
│ │ │ │ +
1213
│ │ │ │ +
1215 std::array<unsigned int, dim> order_;
│ │ │ │ +
1216
│ │ │ │ +
1218 std::array<std::vector<double>, dim> knotVectors_;
│ │ │ │ +
1219
│ │ │ │ +
1221 std::array<unsigned,dim> elements_;
│ │ │ │ +
1222
│ │ │ │ + │ │ │ │ +
1224};
│ │ │ │ +
│ │ │ │ +
1225
│ │ │ │ +
1226
│ │ │ │ +
1227
│ │ │ │ +
1228template<typename GV>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1230 public LeafBasisNode
│ │ │ │ +
1231{
│ │ │ │ +
1232 static const int dim = GV::dimension;
│ │ │ │ +
1233
│ │ │ │ +
1234public:
│ │ │ │ +
1235
│ │ │ │ +
1236 using size_type = std::size_t;
│ │ │ │ +
1237 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ + │ │ │ │ +
1239
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1241 preBasis_(preBasis),
│ │ │ │ +
1242 finiteElement_(*preBasis)
│ │ │ │ +
1243 {}
│ │ │ │ +
│ │ │ │ +
1244
│ │ │ │ +
│ │ │ │ +
1246 const Element& element() const
│ │ │ │ +
1247 {
│ │ │ │ +
1248 return element_;
│ │ │ │ +
1249 }
│ │ │ │ +
│ │ │ │ +
1250
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
1256 {
│ │ │ │ +
1257 return finiteElement_;
│ │ │ │ +
1258 }
│ │ │ │ +
│ │ │ │ +
1259
│ │ │ │ +
│ │ │ │ +
1261 void bind(const Element& e)
│ │ │ │ +
1262 {
│ │ │ │ +
1263 element_ = e;
│ │ │ │ +
1264 auto elementIndex = preBasis_->gridView().indexSet().index(e);
│ │ │ │ +
1265 finiteElement_.bind(preBasis_->getIJK(elementIndex,preBasis_->elements_));
│ │ │ │ +
1266 this->setSize(finiteElement_.size());
│ │ │ │ +
1267 }
│ │ │ │ +
│ │ │ │ +
1268
│ │ │ │ +
1269protected:
│ │ │ │ +
1270
│ │ │ │ + │ │ │ │ +
1272
│ │ │ │ + │ │ │ │ + │ │ │ │ +
1275};
│ │ │ │ +
│ │ │ │ +
1276
│ │ │ │ +
1277
│ │ │ │ +
1278
│ │ │ │ +
1279namespace BasisFactory {
│ │ │ │ +
1280
│ │ │ │ +
│ │ │ │ +
1287inline auto bSpline(const std::vector<double>& knotVector,
│ │ │ │ +
1288 unsigned int order,
│ │ │ │ +
1289 bool makeOpen = true)
│ │ │ │ +
1290{
│ │ │ │ +
1291 return [&knotVector, order, makeOpen](const auto& gridView) {
│ │ │ │ +
1292 return BSplinePreBasis<std::decay_t<decltype(gridView)>>(gridView, knotVector, order, makeOpen);
│ │ │ │ +
1293 };
│ │ │ │ +
1294}
│ │ │ │ +
│ │ │ │ +
1295
│ │ │ │ +
1296} // end namespace BasisFactory
│ │ │ │ +
1297
│ │ │ │ +
1298// *****************************************************************************
│ │ │ │ +
1299// This is the actual global basis implementation based on the reusable parts.
│ │ │ │ +
1300// *****************************************************************************
│ │ │ │ +
1301
│ │ │ │ +
1308template<typename GV>
│ │ │ │ + │ │ │ │ +
1310
│ │ │ │ +
1311
│ │ │ │ +
1312} // namespace Functions
│ │ │ │ +
1313
│ │ │ │ +
1314} // namespace Dune
│ │ │ │ +
1315
│ │ │ │ +
1316#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:1287
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
Definition brezzidouglasmarinibasis.hh:266
│ │ │ │ -
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition brezzidouglasmarinibasis.hh:293
│ │ │ │ -
typename GV::template Codim< 0 >::Entity Element
Definition brezzidouglasmarinibasis.hh:272
│ │ │ │ -
const FiniteElementMap * finiteElementMap_
Definition brezzidouglasmarinibasis.hh:310
│ │ │ │ -
std::size_t size_type
Definition brezzidouglasmarinibasis.hh:271
│ │ │ │ -
FiniteElement finiteElement_
Definition brezzidouglasmarinibasis.hh:308
│ │ │ │ -
typename Impl::BDMLocalFiniteElementMap< GV, dim, double, k > FiniteElementMap
Definition brezzidouglasmarinibasis.hh:273
│ │ │ │ -
const Element * element_
Definition brezzidouglasmarinibasis.hh:309
│ │ │ │ -
Impl::GlobalValuedLocalFiniteElement< Impl::ContravariantPiolaTransformator, typename FiniteElementMap::FiniteElement, Element > FiniteElement
Definition brezzidouglasmarinibasis.hh:276
│ │ │ │ -
void bind(const Element &e)
Bind to element.
Definition brezzidouglasmarinibasis.hh:299
│ │ │ │ -
BrezziDouglasMariniNode(const FiniteElementMap *finiteElementMap)
Definition brezzidouglasmarinibasis.hh:278
│ │ │ │ -
const Element & element() const
Return current element, throw if unbound.
Definition brezzidouglasmarinibasis.hh:284
│ │ │ │ -
Definition brezzidouglasmarinibasis.hh:158
│ │ │ │ -
std::size_t size_type
Definition brezzidouglasmarinibasis.hh:166
│ │ │ │ -
std::array< int, 2 > dofsPerCodim_
Definition brezzidouglasmarinibasis.hh:258
│ │ │ │ -
size_type dimension() const
Definition brezzidouglasmarinibasis.hh:209
│ │ │ │ -
std::array< size_t, dim+1 > codimOffset_
Definition brezzidouglasmarinibasis.hh:255
│ │ │ │ -
Node makeNode() const
Create tree node.
Definition brezzidouglasmarinibasis.hh:204
│ │ │ │ -
GV GridView
The grid view that the FE space is defined on.
Definition brezzidouglasmarinibasis.hh:165
│ │ │ │ -
BrezziDouglasMariniPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition brezzidouglasmarinibasis.hh:171
│ │ │ │ -
FiniteElementMap finiteElementMap_
Definition brezzidouglasmarinibasis.hh:256
│ │ │ │ -
void update(const GridView &gv)
Definition brezzidouglasmarinibasis.hh:196
│ │ │ │ -
void initializeIndices()
Definition brezzidouglasmarinibasis.hh:181
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition brezzidouglasmarinibasis.hh:190
│ │ │ │ -
size_type maxNodeSize() const
Definition brezzidouglasmarinibasis.hh:214
│ │ │ │ -
GridView gridView_
Definition brezzidouglasmarinibasis.hh:254
│ │ │ │ -
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:229
│ │ │ │ +
LocalFiniteElement in the sense of dune-localfunctions, for the B-spline basis on tensor-product grid...
Definition bsplinebasis.hh:367
│ │ │ │ +
BSplineLocalFiniteElement(const BSplineLocalFiniteElement &other)
Copy constructor.
Definition bsplinebasis.hh:388
│ │ │ │ +
const BSplinePreBasis< GV > & preBasis_
Definition bsplinebasis.hh:479
│ │ │ │ +
const BSplineLocalInterpolation< dim, BSplineLocalBasis< GV, R > > & localInterpolation() const
Hand out a LocalInterpolation object.
Definition bsplinebasis.hh:444
│ │ │ │ +
LocalFiniteElementTraits< BSplineLocalBasis< GV, R >, BSplineLocalCoefficients< dim >, BSplineLocalInterpolation< dim, BSplineLocalBasis< GV, R > > > Traits
Export various types related to this LocalFiniteElement.
Definition bsplinebasis.hh:377
│ │ │ │ +
std::array< unsigned, dim > currentKnotSpan_
Definition bsplinebasis.hh:486
│ │ │ │ +
BSplineLocalFiniteElement(const BSplinePreBasis< GV > &preBasis)
Constructor with a given B-spline basis.
Definition bsplinebasis.hh:381
│ │ │ │ +
const BSplineLocalCoefficients< dim > & localCoefficients() const
Hand out a LocalCoefficients object.
Definition bsplinebasis.hh:438
│ │ │ │ +
void bind(const std::array< unsigned, dim > &elementIdx)
Bind LocalFiniteElement to a specific knot span of the spline patch.
Definition bsplinebasis.hh:399
│ │ │ │ +
BSplineLocalInterpolation< dim, BSplineLocalBasis< GV, R > > localInterpolation_
Definition bsplinebasis.hh:483
│ │ │ │ +
GeometryType type() const
Return the reference element that the local finite element is defined on (here, a hypercube)
Definition bsplinebasis.hh:460
│ │ │ │ +
unsigned size() const
Number of shape functions in this finite element.
Definition bsplinebasis.hh:450
│ │ │ │ +
BSplineLocalCoefficients< dim > localCoefficients_
Definition bsplinebasis.hh:482
│ │ │ │ +
unsigned int size(int i) const
Number of degrees of freedom for one coordinate direction.
Definition bsplinebasis.hh:468
│ │ │ │ +
BSplineLocalBasis< GV, R > localBasis_
Definition bsplinebasis.hh:481
│ │ │ │ +
const BSplineLocalBasis< GV, R > & localBasis() const
Hand out a LocalBasis object.
Definition bsplinebasis.hh:432
│ │ │ │ +
Pre-basis for B-spline basis.
Definition bsplinebasis.hh:505
│ │ │ │ +
std::array< unsigned, dim > elements_
Number of grid elements in the different coordinate directions.
Definition bsplinebasis.hh:1221
│ │ │ │ +
GridView gridView_
Definition bsplinebasis.hh:1223
│ │ │ │ +
double R
Definition bsplinebasis.hh:574
│ │ │ │ +
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:1066
│ │ │ │ +
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:762
│ │ │ │ +
std::array< unsigned int, dim > order_
Order of the B-spline for each space dimension.
Definition bsplinebasis.hh:1215
│ │ │ │ +
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:1109
│ │ │ │ +
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:1009
│ │ │ │ +
unsigned int size(size_t d) const
Number of shape functions in one direction.
Definition bsplinebasis.hh:753
│ │ │ │ +
GV GridView
The grid view that the FE space is defined on.
Definition bsplinebasis.hh:568
│ │ │ │ +
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:714
│ │ │ │ +
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:894
│ │ │ │ +
std::size_t size_type
Definition bsplinebasis.hh:569
│ │ │ │ +
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition bsplinebasis.hh:690
│ │ │ │ +
unsigned int dimension() const
Total number of B-spline basis functions.
Definition bsplinebasis.hh:744
│ │ │ │ +
void initializeIndices()
Initialize the global indices.
Definition bsplinebasis.hh:680
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition bsplinebasis.hh:684
│ │ │ │ +
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:990
│ │ │ │ +
Node makeNode() const
Create tree node.
Definition bsplinebasis.hh:698
│ │ │ │ +
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:594
│ │ │ │ +
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:793
│ │ │ │ +
std::array< std::vector< double >, dim > knotVectors_
The knot vectors, one for each space dimension.
Definition bsplinebasis.hh:1218
│ │ │ │ +
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition bsplinebasis.hh:704
│ │ │ │ +
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:646
│ │ │ │ +
LocalBasis class in the sense of dune-localfunctions, presenting the restriction of a B-spline patch ...
Definition bsplinebasis.hh:51
│ │ │ │ +
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:60
│ │ │ │ +
unsigned int order() const
Polynomial order of the shape functions.
Definition bsplinebasis.hh:145
│ │ │ │ +
std::size_t size() const
Return the number of basis functions on the current knot span.
Definition bsplinebasis.hh:152
│ │ │ │ +
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:102
│ │ │ │ +
void evaluateFunction(const FieldVector< D, dim > &in, std::vector< FieldVector< R, 1 > > &out) const
Evaluate all shape functions.
Definition bsplinebasis.hh:75
│ │ │ │ +
void evaluateJacobian(const FieldVector< D, dim > &in, std::vector< FieldMatrix< D, 1, dim > > &out) const
Evaluate Jacobian of all shape functions.
Definition bsplinebasis.hh:87
│ │ │ │ +
BSplineLocalBasis(const BSplinePreBasis< GV > &preBasis, const BSplineLocalFiniteElement< GV, R > &lFE)
Constructor with a given B-spline patch.
Definition bsplinebasis.hh:66
│ │ │ │ +
Attaches a shape function to an entity.
Definition bsplinebasis.hh:183
│ │ │ │ +
const LocalKey & localKey(std::size_t i) const
get i'th index
Definition bsplinebasis.hh:326
│ │ │ │ +
void init(const std::array< unsigned, dim > &sizes)
Definition bsplinebasis.hh:261
│ │ │ │ +
std::size_t size() const
number of coefficients
Definition bsplinebasis.hh:320
│ │ │ │ +
Local interpolation in the sense of dune-localfunctions, for the B-spline basis on tensor-product gri...
Definition bsplinebasis.hh:345
│ │ │ │ +
void interpolate(const F &f, std::vector< C > &out) const
Local interpolation of a function.
Definition bsplinebasis.hh:349
│ │ │ │ +
Definition bsplinebasis.hh:1231
│ │ │ │ +
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition bsplinebasis.hh:1255
│ │ │ │ +
typename GV::template Codim< 0 >::Entity Element
Definition bsplinebasis.hh:1237
│ │ │ │ +
const BSplinePreBasis< GV > * preBasis_
Definition bsplinebasis.hh:1271
│ │ │ │ +
Element element_
Definition bsplinebasis.hh:1274
│ │ │ │ +
void bind(const Element &e)
Bind to element.
Definition bsplinebasis.hh:1261
│ │ │ │ +
BSplineNode(const BSplinePreBasis< GV > *preBasis)
Definition bsplinebasis.hh:1240
│ │ │ │ +
const Element & element() const
Return current element, throw if unbound.
Definition bsplinebasis.hh:1246
│ │ │ │ +
FiniteElement finiteElement_
Definition bsplinebasis.hh:1273
│ │ │ │ +
std::size_t size_type
Definition bsplinebasis.hh:1236
│ │ │ │
Global basis for given pre-basis.
Definition defaultglobalbasis.hh:50
│ │ │ │
A generic MixIn class for PreBasis.
Definition leafprebasismixin.hh:36
│ │ │ │ +
size_type size() const
Get the total dimension of the space spanned by this basis.
Definition leafprebasismixin.hh:60
│ │ │ │
size_type size() const
Definition nodes.hh:147
│ │ │ │
void setSize(const size_type size)
Definition nodes.hh:169
│ │ │ │
Definition nodes.hh:191
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces | │ │ │ │ +Typedefs | │ │ │ │ Functions
│ │ │ │ -
boundarydofs.hh File Reference
│ │ │ │ +
nedelecbasis.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <utility>
│ │ │ │ -#include <dune/functions/functionspacebases/subentitydofs.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/leafprebasismixin.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/nodes.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 >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ +

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

│ │ │ │ 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.
 
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.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -us-ascii │ │ │ │ │ +utf-8 │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,26 +1,46 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -boundarydofs.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_s_u_b_e_n_t_i_t_y_d_o_f_s_._h_h> │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +nedelecbasis.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_g_l_o_b_a_l_v_a_l_u_e_d_l_o_c_a_l_f_i_n_i_t_e_e_l_e_m_e_n_t_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_<_ _G_V_,_ _R_a_n_g_e_,_ _k_i_n_d_,_ _o_r_d_e_r_ _> │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e_<_ _G_V_,_ _R_a_n_g_e_,_ _k_i_n_d_,_ _o_r_d_e_r_ _> │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ +namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y │ │ │ │ │ +  │ │ │ │ │ +TTyyppeeddeeffss │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s< _N_e_d_e_l_e_c_P_r_e_B_a_s_i_s< GV, │ │ │ │ │ + Range, kind, order > > │ │ │ │ │ +  Basis of a k-th-order Nédélec finite element space. │ │ │ │ │ +  │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template >() │ │ │ │ │ -(0, std::declval< typename Basis::LocalView >(), std::declval< typename │ │ │ │ │ -Basis::GridView::Intersection >()), 0) = 0> │ │ │ │ │ -void  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_o_r_E_a_c_h_B_o_u_n_d_a_r_y_D_O_F (const Basis &basis, F &&f) │ │ │ │ │ -  Loop over all DOFs on the boundary. │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_n_e_d_e_l_e_c () │ │ │ │ │ +  Create a pre-basis factory that can create a Nédélec pre-basis. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00185_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: boundarydofs.hh Source File │ │ │ │ +dune-functions: nedelecbasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,105 +74,398 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
boundarydofs.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BOUNDARYDOFS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BOUNDARYDOFS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NEDELECBASIS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NEDELECBASIS_HH
│ │ │ │
9
│ │ │ │ -
10#include <utility>
│ │ │ │ -
11
│ │ │ │ - │ │ │ │ -
13
│ │ │ │ -
14namespace Dune {
│ │ │ │ -
15namespace Functions {
│ │ │ │ -
16
│ │ │ │ -
17
│ │ │ │ +
10#include <array>
│ │ │ │ +
11#include <dune/common/exceptions.hh>
│ │ │ │ +
12
│ │ │ │ +
13#include <dune/grid/common/capabilities.hh>
│ │ │ │ +
14#include <dune/grid/common/mcmgmapper.hh>
│ │ │ │ +
15
│ │ │ │ +
16#include <dune/localfunctions/common/localfiniteelementvariant.hh>
│ │ │ │ +
17#include <dune/localfunctions/nedelec.hh>
│ │ │ │
18
│ │ │ │ -
38template<class Basis, class F,
│ │ │ │ -
39 decltype(std::declval<std::decay_t<F>>()(0, std::declval<typename Basis::LocalView>(),std::declval<typename Basis::GridView::Intersection>()), 0) = 0>
│ │ │ │ -
│ │ │ │ -
40void forEachBoundaryDOF(const Basis& basis, F&& f)
│ │ │ │ -
41{
│ │ │ │ -
42 auto localView = basis.localView();
│ │ │ │ -
43 auto seDOFs = subEntityDOFs(basis);
│ │ │ │ -
44 const auto& gridView = basis.gridView();
│ │ │ │ -
45 for(auto&& element : elements(gridView))
│ │ │ │ -
46 if (element.hasBoundaryIntersections())
│ │ │ │ -
47 {
│ │ │ │ -
48 localView.bind(element);
│ │ │ │ -
49 for(const auto& intersection: intersections(gridView, element))
│ │ │ │ -
50 if (intersection.boundary())
│ │ │ │ -
51 for(auto localIndex: seDOFs.bind(localView,intersection))
│ │ │ │ -
52 f(localIndex, localView, intersection);
│ │ │ │ -
53 }
│ │ │ │ -
54}
│ │ │ │ -
│ │ │ │ -
55
│ │ │ │ -
56
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
23
│ │ │ │ +
24namespace Dune::Functions
│ │ │ │ +
25{
│ │ │ │ +
26
│ │ │ │ +
27namespace Impl
│ │ │ │ +
28{
│ │ │ │ +
29 template<typename GV, int dim, typename R, std::size_t order>
│ │ │ │ +
30 class Nedelec1stKindLocalFiniteElementMap
│ │ │ │ +
31 {
│ │ │ │ +
32 using D = typename GV::ctype;
│ │ │ │ +
33 constexpr static bool hasFixedElementType = Capabilities::hasSingleGeometryType<typename GV::Grid>::v;
│ │ │ │ +
34
│ │ │ │ +
35 using CubeFiniteElement = Nedelec1stKindCubeLocalFiniteElement<D,R,dim,order>;
│ │ │ │ +
36 using SimplexFiniteElement = Nedelec1stKindSimplexLocalFiniteElement<D,R,dim,order>;
│ │ │ │ +
37
│ │ │ │ +
38 public:
│ │ │ │ +
39
│ │ │ │ +
40 using T = LocalBasisTraits<D, dim, FieldVector<D,dim>, R, dim, FieldVector<R,dim>, FieldMatrix<D,dim,dim> >;
│ │ │ │ +
41
│ │ │ │ +
42 constexpr static unsigned int topologyId = Capabilities::hasSingleGeometryType<typename GV::Grid>::topologyId; // meaningless if hasFixedElementType is false
│ │ │ │ +
43 constexpr static GeometryType type = GeometryType(topologyId, GV::dimension);
│ │ │ │ +
44
│ │ │ │ +
45 using FiniteElement = std::conditional_t<hasFixedElementType,
│ │ │ │ +
46 std::conditional_t<type.isCube(),CubeFiniteElement,SimplexFiniteElement>,
│ │ │ │ +
47 LocalFiniteElementVariant<CubeFiniteElement, SimplexFiniteElement> >;
│ │ │ │ +
48
│ │ │ │ +
49 static std::size_t numVariants(GeometryType type)
│ │ │ │ +
50 {
│ │ │ │ +
51 if (order!=1) // I am not sure whether the formula below is correct for all orders.
│ │ │ │ +
52 DUNE_THROW(NotImplemented, "Only Nedelec elements of order 1 are implemented!");
│ │ │ │ +
53
│ │ │ │ +
54 auto numEdges = referenceElement<D,dim>(type).size(dim-1);
│ │ │ │ +
55 return power(2,numEdges);
│ │ │ │ +
56 }
│ │ │ │
57
│ │ │ │ -
75template<class Basis, class F,
│ │ │ │ -
76 decltype(std::declval<std::decay_t<F>>()(0, std::declval<typename Basis::LocalView>()),0) = 0>
│ │ │ │ -
77void forEachBoundaryDOF(const Basis& basis, F&& f)
│ │ │ │ -
78{
│ │ │ │ -
79 auto localView = basis.localView();
│ │ │ │ -
80 auto seDOFs = subEntityDOFs(basis);
│ │ │ │ -
81 const auto& gridView = basis.gridView();
│ │ │ │ -
82 for(auto&& element : elements(gridView))
│ │ │ │ -
83 if (element.hasBoundaryIntersections())
│ │ │ │ -
84 {
│ │ │ │ -
85 localView.bind(element);
│ │ │ │ -
86 for(const auto& intersection: intersections(gridView, element))
│ │ │ │ -
87 if (intersection.boundary())
│ │ │ │ -
88 for(auto localIndex: seDOFs.bind(localView,intersection))
│ │ │ │ -
89 f(localIndex, localView);
│ │ │ │ -
90 }
│ │ │ │ -
91}
│ │ │ │ -
92
│ │ │ │ -
93
│ │ │ │ +
58 Nedelec1stKindLocalFiniteElementMap(const GV& gv)
│ │ │ │ +
59 : elementMapper_(gv, mcmgElementLayout()),
│ │ │ │ +
60 orientation_(gv.size(0))
│ │ │ │ +
61 {
│ │ │ │ +
62 // create all variants
│ │ │ │ +
63 if constexpr (hasFixedElementType)
│ │ │ │ +
64 {
│ │ │ │ +
65 variants_.resize(numVariants(type));
│ │ │ │ +
66 for (size_t i = 0; i < numVariants(type); i++)
│ │ │ │ +
67 variants_[i] = FiniteElement(i);
│ │ │ │ +
68 }
│ │ │ │ +
69 else
│ │ │ │ +
70 {
│ │ │ │ +
71 // for mixed grids add offset for cubes
│ │ │ │ +
72 variants_.resize(numVariants(GeometryTypes::simplex(dim)) + numVariants(GeometryTypes::cube(dim)));
│ │ │ │ +
73 for (size_t i = 0; i < numVariants(GeometryTypes::simplex(dim)); i++)
│ │ │ │ +
74 variants_[i] = SimplexFiniteElement(i);
│ │ │ │ +
75 for (size_t i = 0; i < numVariants(GeometryTypes::cube(dim)); i++)
│ │ │ │ +
76 variants_[i + numVariants(GeometryTypes::simplex(dim))] = CubeFiniteElement(i);
│ │ │ │ +
77 }
│ │ │ │ +
78
│ │ │ │ +
79
│ │ │ │ +
80 // compute orientation for all elements
│ │ │ │ +
81 const auto& indexSet = gv.indexSet();
│ │ │ │ +
82
│ │ │ │ +
83 for(const auto& element : elements(gv))
│ │ │ │ +
84 {
│ │ │ │ +
85 const auto& refElement = referenceElement(element);
│ │ │ │ +
86 auto elementIndex = elementMapper_.index(element);
│ │ │ │ +
87 orientation_[elementIndex] = 0;
│ │ │ │ +
88
│ │ │ │ +
89 for (std::size_t i=0; i<element.subEntities(dim-1); i++)
│ │ │ │ +
90 {
│ │ │ │ +
91 // Local vertex indices within the element
│ │ │ │ +
92 auto localV0 = refElement.subEntity(i,dim-1, 0,dim);
│ │ │ │ +
93 auto localV1 = refElement.subEntity(i,dim-1, 1,dim);
│ │ │ │
94
│ │ │ │ -
111template<class Basis, class F,
│ │ │ │ -
112 decltype(std::declval<std::decay_t<F>>()(std::declval<typename Basis::MultiIndex>()),0) = 0>
│ │ │ │ -
113void forEachBoundaryDOF(const Basis& basis, F&& f)
│ │ │ │ -
114{
│ │ │ │ -
115 auto localView = basis.localView();
│ │ │ │ -
116 auto seDOFs = subEntityDOFs(basis);
│ │ │ │ -
117 const auto& gridView = basis.gridView();
│ │ │ │ -
118 for(auto&& element : elements(gridView))
│ │ │ │ -
119 if (element.hasBoundaryIntersections())
│ │ │ │ -
120 {
│ │ │ │ -
121 localView.bind(element);
│ │ │ │ -
122 for(const auto& intersection: intersections(gridView, element))
│ │ │ │ -
123 if (intersection.boundary())
│ │ │ │ -
124 for(auto localIndex: seDOFs.bind(localView,intersection))
│ │ │ │ -
125 f(localView.index(localIndex));
│ │ │ │ -
126 }
│ │ │ │ -
127}
│ │ │ │ -
128
│ │ │ │ -
129
│ │ │ │ -
130
│ │ │ │ -
131} // namespace Functions
│ │ │ │ -
132} // namespace Dune
│ │ │ │ -
133
│ │ │ │ -
134#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BOUNDARYDOFS_HH
│ │ │ │ - │ │ │ │ -
auto subEntityDOFs(const T &)
Create SubEntityDOFs object.
Definition subentitydofs.hh:164
│ │ │ │ -
void forEachBoundaryDOF(const Basis &basis, F &&f)
Loop over all DOFs on the boundary.
Definition boundarydofs.hh:40
│ │ │ │ -
Definition polynomial.hh:17
│ │ │ │ +
95 // Global vertex indices within the grid
│ │ │ │ +
96 auto globalV0 = indexSet.subIndex(element,localV0,dim);
│ │ │ │ +
97 auto globalV1 = indexSet.subIndex(element,localV1,dim);
│ │ │ │ +
98
│ │ │ │ +
99 if ( (localV0<localV1 && globalV0>globalV1) || (localV0>localV1 && globalV0<globalV1) )
│ │ │ │ +
100 orientation_[elementIndex] |= (1 << i);
│ │ │ │ +
101 }
│ │ │ │ +
102 // for mixed grids add offset for cubes
│ │ │ │ +
103 if constexpr (!hasFixedElementType)
│ │ │ │ +
104 if (element.type().isCube())
│ │ │ │ +
105 orientation_[elementIndex] += numVariants(GeometryTypes::simplex(dim));
│ │ │ │ +
106 }
│ │ │ │ +
107 }
│ │ │ │ +
108
│ │ │ │ +
109 template<class Element>
│ │ │ │ +
110 const auto& find(const Element& element) const
│ │ │ │ +
111 {
│ │ │ │ +
112 return variants_[orientation_[elementMapper_.index(element)]];
│ │ │ │ +
113 }
│ │ │ │ +
114
│ │ │ │ +
115 private:
│ │ │ │ +
116 std::vector<FiniteElement> variants_;
│ │ │ │ +
117 Dune::MultipleCodimMultipleGeomTypeMapper<GV> elementMapper_;
│ │ │ │ +
118 std::vector<unsigned short> orientation_;
│ │ │ │ +
119 };
│ │ │ │ +
120
│ │ │ │ +
121
│ │ │ │ +
122} // namespace Impl
│ │ │ │ +
123
│ │ │ │ +
124
│ │ │ │ +
125// *****************************************************************************
│ │ │ │ +
126// This is the reusable part of the basis. It contains
│ │ │ │ +
127//
│ │ │ │ +
128// NedelecPreBasis
│ │ │ │ +
129// NedelecNode
│ │ │ │ +
130//
│ │ │ │ +
131// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ +
132// state. These components do _not_ depend on the global basis and local view
│ │ │ │ +
133// and can be used without a global basis.
│ │ │ │ +
134// *****************************************************************************
│ │ │ │ +
135
│ │ │ │ +
136template<typename GV, typename Range, std::size_t kind, int order>
│ │ │ │ +
137class NedelecNode;
│ │ │ │ +
138
│ │ │ │ +
139template<typename GV, typename Range, std::size_t kind, int order>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
141 public LeafPreBasisMixin< NedelecPreBasis<GV,Range,kind,order> >
│ │ │ │ +
142{
│ │ │ │ +
143 static const int dim = GV::dimension;
│ │ │ │ +
144 static_assert(kind==1, "Only the Nedelec basis of the first kind is currently implemented!");
│ │ │ │ +
145 using FiniteElementMap = typename Impl::Nedelec1stKindLocalFiniteElementMap<GV, dim, Range, order>;
│ │ │ │ +
146
│ │ │ │ +
147 using Mapper = Dune::MultipleCodimMultipleGeomTypeMapper<GV>;
│ │ │ │ +
148public:
│ │ │ │ +
149
│ │ │ │ +
151 using GridView = GV;
│ │ │ │ +
152 using size_type = std::size_t;
│ │ │ │ +
153
│ │ │ │ + │ │ │ │ +
155
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
158 gridView_(gv),
│ │ │ │ + │ │ │ │ +
160 mapper_(gridView_, mcmgLayout(Dim<1>{}))
│ │ │ │ +
161 {
│ │ │ │ +
162 if (kind!=1)
│ │ │ │ +
163 DUNE_THROW(NotImplemented, "Only Nedelec elements of the first kind are implemented!");
│ │ │ │ +
164
│ │ │ │ +
165 // There is no inherent reason why the basis shouldn't work for grids with more than two
│ │ │ │ +
166 // element types. Somebody simply has to sit down and implement the missing bits.
│ │ │ │ +
167 if (gv.indexSet().types(0).size() > 2)
│ │ │ │ +
168 DUNE_THROW(NotImplemented, "Nédélec basis is only implemented for grids with simplex and cube elements");
│ │ │ │ +
169
│ │ │ │ +
170 for(auto type : gv.indexSet().types(0))
│ │ │ │ +
171 if (!type.isSimplex() && !type.isCube())
│ │ │ │ +
172 DUNE_THROW(NotImplemented, "Nédélec basis is only implemented for grids with simplex or cube elements.");
│ │ │ │ +
173
│ │ │ │ +
174 if (order>1)
│ │ │ │ +
175 DUNE_THROW(NotImplemented, "Only first-order elements are implemented");
│ │ │ │ +
176
│ │ │ │ +
177 if (dim!=2 && dim!=3)
│ │ │ │ +
178 DUNE_THROW(NotImplemented, "Only 2d and 3d Nédélec elements are implemented");
│ │ │ │ +
179 }
│ │ │ │ +
│ │ │ │ +
180
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
182 {}
│ │ │ │ +
│ │ │ │ +
183
│ │ │ │ +
│ │ │ │ +
186 const GridView& gridView() const
│ │ │ │ +
187 {
│ │ │ │ +
188 return gridView_;
│ │ │ │ +
189 }
│ │ │ │ +
│ │ │ │ +
190
│ │ │ │ +
191 /* \brief Update the stored grid view, to be called if the grid has changed */
│ │ │ │ +
│ │ │ │ +
192 void update (const GridView& gv)
│ │ │ │ +
193 {
│ │ │ │ +
194 gridView_ = gv;
│ │ │ │ +
195 mapper_.update(gridView_);
│ │ │ │ +
196 }
│ │ │ │ +
│ │ │ │ +
197
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
202 {
│ │ │ │ +
203 return Node{&finiteElementMap_};
│ │ │ │ +
204 }
│ │ │ │ +
│ │ │ │ +
205
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
207 {
│ │ │ │ +
208 return mapper_.size();
│ │ │ │ +
209 }
│ │ │ │ +
│ │ │ │ +
210
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
212 {
│ │ │ │ +
213 size_type result = 0;
│ │ │ │ +
214 for (auto&& type : gridView_.indexSet().types(0))
│ │ │ │ +
215 {
│ │ │ │ +
216 size_type numEdges = referenceElement<typename GV::ctype,dim>(type).size(dim-1);
│ │ │ │ +
217 result = std::max(result, numEdges);
│ │ │ │ +
218 }
│ │ │ │ +
219
│ │ │ │ +
220 return result;
│ │ │ │ +
221 }
│ │ │ │ +
│ │ │ │ +
222
│ │ │ │ +
226 template<typename It>
│ │ │ │ +
│ │ │ │ +
227 It indices(const Node& node, It it) const
│ │ │ │ +
228 {
│ │ │ │ +
229 const auto& element = node.element();
│ │ │ │ +
230
│ │ │ │ +
231 // throw if Element is not of predefined type
│ │ │ │ +
232 if (not(element.type().isCube()) and not(element.type().isSimplex()))
│ │ │ │ +
233 DUNE_THROW(NotImplemented, "NedelecBasis only implemented for cube and simplex elements.");
│ │ │ │ +
234
│ │ │ │ +
235 for(std::size_t i=0, end=node.size(); i<end; ++i, ++it)
│ │ │ │ +
236 {
│ │ │ │ +
237 Dune::LocalKey localKey = node.finiteElement().localCoefficients().localKey(i);
│ │ │ │ +
238 *it = { mapper_.subIndex(element, localKey.subEntity(), localKey.codim()) + localKey.index() };
│ │ │ │ +
239 }
│ │ │ │ +
240
│ │ │ │ +
241 return it;
│ │ │ │ +
242 }
│ │ │ │ +
│ │ │ │ +
243
│ │ │ │ +
244protected:
│ │ │ │ + │ │ │ │ +
246 FiniteElementMap finiteElementMap_;
│ │ │ │ +
247 Mapper mapper_;
│ │ │ │ +
248};
│ │ │ │ +
│ │ │ │ +
249
│ │ │ │ +
250
│ │ │ │ +
251
│ │ │ │ +
252template<typename GV, typename Range, size_t kind, int order>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
254 public LeafBasisNode
│ │ │ │ +
255{
│ │ │ │ +
256 static const int dim = GV::dimension;
│ │ │ │ +
257
│ │ │ │ +
258public:
│ │ │ │ +
259
│ │ │ │ +
260 using size_type = std::size_t;
│ │ │ │ +
261 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ +
262 static_assert(kind==1, "Only Nedelec elements of the first kind are implemented!");
│ │ │ │ +
263 using FiniteElementMap = typename Impl::Nedelec1stKindLocalFiniteElementMap<GV, dim, Range, order>;
│ │ │ │ +
264 using FiniteElement = Impl::GlobalValuedLocalFiniteElement<Impl::CovariantPiolaTransformator,
│ │ │ │ +
265 typename FiniteElementMap::FiniteElement,
│ │ │ │ +
266 Element>;
│ │ │ │ +
267
│ │ │ │ +
│ │ │ │ +
268 NedelecNode(const FiniteElementMap* finiteElementMap) :
│ │ │ │ +
269 element_(nullptr),
│ │ │ │ +
270 finiteElementMap_(finiteElementMap)
│ │ │ │ +
271 { }
│ │ │ │ +
│ │ │ │ +
272
│ │ │ │ +
│ │ │ │ +
274 const Element& element() const
│ │ │ │ +
275 {
│ │ │ │ +
276 return *element_;
│ │ │ │ +
277 }
│ │ │ │ +
│ │ │ │ +
278
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
284 {
│ │ │ │ +
285 return finiteElement_;
│ │ │ │ +
286 }
│ │ │ │ +
│ │ │ │ +
287
│ │ │ │ +
│ │ │ │ +
289 void bind(const Element& e)
│ │ │ │ +
290 {
│ │ │ │ +
291 element_ = &e;
│ │ │ │ +
292 finiteElement_.bind((finiteElementMap_->find(*element_)), e);
│ │ │ │ +
293 this->setSize(finiteElement_.size());
│ │ │ │ +
294 }
│ │ │ │ +
│ │ │ │ +
295
│ │ │ │ +
296protected:
│ │ │ │ +
297
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
301};
│ │ │ │ +
│ │ │ │ +
302
│ │ │ │ +
303
│ │ │ │ +
304
│ │ │ │ +
305namespace BasisFactory {
│ │ │ │ +
306
│ │ │ │ +
316template<std::size_t kind, std::size_t order, typename Range=double>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
318{
│ │ │ │ +
319 return [](const auto& gridView) {
│ │ │ │ +
320 return NedelecPreBasis<std::decay_t<decltype(gridView)>, Range, kind, order>(gridView);
│ │ │ │ +
321 };
│ │ │ │ +
322}
│ │ │ │ +
│ │ │ │ +
323
│ │ │ │ +
324} // end namespace BasisFactory
│ │ │ │ +
325
│ │ │ │ +
326
│ │ │ │ +
327
│ │ │ │ +
328// *****************************************************************************
│ │ │ │ +
329// This is the actual global basis implementation based on the reusable parts.
│ │ │ │ +
330// *****************************************************************************
│ │ │ │ +
331
│ │ │ │ +
339template<typename GV, std::size_t kind, std::size_t order, typename Range=double>
│ │ │ │ + │ │ │ │ +
341
│ │ │ │ +
342} // end namespace Dune::Functions
│ │ │ │ +
343
│ │ │ │ +
344
│ │ │ │ +
345#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NEDELECBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
auto power(ChildPreBasisFactory &&childPreBasisFactory, std::size_t k, const IndexMergingStrategy &)
Create a pre-basis factory that can build a PowerPreBasis.
Definition dynamicpowerbasis.hh:409
│ │ │ │ +
auto nedelec()
Create a pre-basis factory that can create a Nédélec pre-basis.
Definition nedelecbasis.hh:317
│ │ │ │ +
Definition polynomial.hh:18
│ │ │ │ +
Global basis for given pre-basis.
Definition defaultglobalbasis.hh:50
│ │ │ │ +
A generic MixIn class for PreBasis.
Definition leafprebasismixin.hh:36
│ │ │ │ +
Definition nedelecbasis.hh:255
│ │ │ │ +
const FiniteElementMap * finiteElementMap_
Definition nedelecbasis.hh:300
│ │ │ │ +
FiniteElement finiteElement_
Definition nedelecbasis.hh:298
│ │ │ │ +
Impl::GlobalValuedLocalFiniteElement< Impl::CovariantPiolaTransformator, typename FiniteElementMap::FiniteElement, Element > FiniteElement
Definition nedelecbasis.hh:266
│ │ │ │ +
void bind(const Element &e)
Bind to element.
Definition nedelecbasis.hh:289
│ │ │ │ +
const Element & element() const
Return current element, throw if unbound.
Definition nedelecbasis.hh:274
│ │ │ │ +
typename GV::template Codim< 0 >::Entity Element
Definition nedelecbasis.hh:261
│ │ │ │ +
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition nedelecbasis.hh:283
│ │ │ │ +
NedelecNode(const FiniteElementMap *finiteElementMap)
Definition nedelecbasis.hh:268
│ │ │ │ +
typename Impl::Nedelec1stKindLocalFiniteElementMap< GV, dim, Range, order > FiniteElementMap
Definition nedelecbasis.hh:263
│ │ │ │ +
const Element * element_
Definition nedelecbasis.hh:299
│ │ │ │ +
std::size_t size_type
Definition nedelecbasis.hh:260
│ │ │ │ +
Definition nedelecbasis.hh:142
│ │ │ │ +
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:227
│ │ │ │ +
std::size_t size_type
Definition nedelecbasis.hh:152
│ │ │ │ +
NedelecPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition nedelecbasis.hh:157
│ │ │ │ +
GV GridView
The grid view that the FE space is defined on.
Definition nedelecbasis.hh:151
│ │ │ │ +
size_type dimension() const
Definition nedelecbasis.hh:206
│ │ │ │ +
GridView gridView_
Definition nedelecbasis.hh:245
│ │ │ │ +
FiniteElementMap finiteElementMap_
Definition nedelecbasis.hh:246
│ │ │ │ +
void initializeIndices()
Definition nedelecbasis.hh:181
│ │ │ │ +
void update(const GridView &gv)
Definition nedelecbasis.hh:192
│ │ │ │ +
size_type maxNodeSize() const
Definition nedelecbasis.hh:211
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition nedelecbasis.hh:186
│ │ │ │ +
Node makeNode() const
Create tree node.
Definition nedelecbasis.hh:201
│ │ │ │ +
Mapper mapper_
Definition nedelecbasis.hh:247
│ │ │ │ +
size_type size() const
Definition nodes.hh:147
│ │ │ │ +
void setSize(const size_type size)
Definition nodes.hh:169
│ │ │ │ +
Definition nodes.hh:191
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,109 +1,481 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -boundarydofs.hh │ │ │ │ │ +nedelecbasis.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BOUNDARYDOFS_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BOUNDARYDOFS_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NEDELECBASIS_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NEDELECBASIS_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11 │ │ │ │ │ -12#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_s_u_b_e_n_t_i_t_y_d_o_f_s_._h_h> │ │ │ │ │ -13 │ │ │ │ │ -14namespace _D_u_n_e { │ │ │ │ │ -15namespace Functions { │ │ │ │ │ -16 │ │ │ │ │ -17 │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12 │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15 │ │ │ │ │ +16#include │ │ │ │ │ +17#include │ │ │ │ │ 18 │ │ │ │ │ -38template>()(0, std::declval(),std::declval()), 0) = 0> │ │ │ │ │ -_4_0void _f_o_r_E_a_c_h_B_o_u_n_d_a_r_y_D_O_F(const Basis& basis, F&& f) │ │ │ │ │ -41{ │ │ │ │ │ -42 auto localView = basis.localView(); │ │ │ │ │ -43 auto seDOFs = _s_u_b_E_n_t_i_t_y_D_O_F_s(basis); │ │ │ │ │ -44 const auto& gridView = basis.gridView(); │ │ │ │ │ -45 for(auto&& element : elements(gridView)) │ │ │ │ │ -46 if (element.hasBoundaryIntersections()) │ │ │ │ │ -47 { │ │ │ │ │ -48 localView.bind(element); │ │ │ │ │ -49 for(const auto& intersection: intersections(gridView, element)) │ │ │ │ │ -50 if (intersection.boundary()) │ │ │ │ │ -51 for(auto localIndex: seDOFs.bind(localView,intersection)) │ │ │ │ │ -52 f(localIndex, localView, intersection); │ │ │ │ │ -53 } │ │ │ │ │ -54} │ │ │ │ │ -55 │ │ │ │ │ -56 │ │ │ │ │ +19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ +20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/ │ │ │ │ │ +_g_l_o_b_a_l_v_a_l_u_e_d_l_o_c_a_l_f_i_n_i_t_e_e_l_e_m_e_n_t_._h_h> │ │ │ │ │ +21#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ +22#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ +23 │ │ │ │ │ +24namespace _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │ +25{ │ │ │ │ │ +26 │ │ │ │ │ +27namespace Impl │ │ │ │ │ +28{ │ │ │ │ │ +29 template │ │ │ │ │ +30 class Nedelec1stKindLocalFiniteElementMap │ │ │ │ │ +31 { │ │ │ │ │ +32 using D = typename GV::ctype; │ │ │ │ │ +33 constexpr static bool hasFixedElementType = Capabilities:: │ │ │ │ │ +hasSingleGeometryType::v; │ │ │ │ │ +34 │ │ │ │ │ +35 using CubeFiniteElement = │ │ │ │ │ +Nedelec1stKindCubeLocalFiniteElement; │ │ │ │ │ +36 using SimplexFiniteElement = │ │ │ │ │ +Nedelec1stKindSimplexLocalFiniteElement; │ │ │ │ │ +37 │ │ │ │ │ +38 public: │ │ │ │ │ +39 │ │ │ │ │ +40 using T = LocalBasisTraits, R, dim, │ │ │ │ │ +FieldVector, FieldMatrix >; │ │ │ │ │ +41 │ │ │ │ │ +42 constexpr static unsigned int topologyId = Capabilities:: │ │ │ │ │ +hasSingleGeometryType::topologyId; // meaningless if │ │ │ │ │ +hasFixedElementType is false │ │ │ │ │ +43 constexpr static GeometryType type = GeometryType(topologyId, GV:: │ │ │ │ │ +dimension); │ │ │ │ │ +44 │ │ │ │ │ +45 using FiniteElement = std::conditional_t, │ │ │ │ │ +47 LocalFiniteElementVariant >; │ │ │ │ │ +48 │ │ │ │ │ +49 static std::size_t numVariants(GeometryType type) │ │ │ │ │ +50 { │ │ │ │ │ +51 if (order!=1) // I am not sure whether the formula below is correct for all │ │ │ │ │ +orders. │ │ │ │ │ +52 DUNE_THROW(NotImplemented, "Only Nedelec elements of order 1 are │ │ │ │ │ +implemented!"); │ │ │ │ │ +53 │ │ │ │ │ +54 auto numEdges = referenceElement(type).size(dim-1); │ │ │ │ │ +55 return _p_o_w_e_r(2,numEdges); │ │ │ │ │ +56 } │ │ │ │ │ 57 │ │ │ │ │ -75template>()(0, std::declval()),0) = 0> │ │ │ │ │ -77void _f_o_r_E_a_c_h_B_o_u_n_d_a_r_y_D_O_F(const Basis& basis, F&& f) │ │ │ │ │ -78{ │ │ │ │ │ -79 auto localView = basis.localView(); │ │ │ │ │ -80 auto seDOFs = _s_u_b_E_n_t_i_t_y_D_O_F_s(basis); │ │ │ │ │ -81 const auto& gridView = basis.gridView(); │ │ │ │ │ -82 for(auto&& element : elements(gridView)) │ │ │ │ │ -83 if (element.hasBoundaryIntersections()) │ │ │ │ │ +58 Nedelec1stKindLocalFiniteElementMap(const GV& gv) │ │ │ │ │ +59 : elementMapper_(gv, mcmgElementLayout()), │ │ │ │ │ +60 orientation_(gv.size(0)) │ │ │ │ │ +61 { │ │ │ │ │ +62 // create all variants │ │ │ │ │ +63 if constexpr (hasFixedElementType) │ │ │ │ │ +64 { │ │ │ │ │ +65 variants_.resize(numVariants(type)); │ │ │ │ │ +66 for (size_t i = 0; i < numVariants(type); i++) │ │ │ │ │ +67 variants_[i] = FiniteElement(i); │ │ │ │ │ +68 } │ │ │ │ │ +69 else │ │ │ │ │ +70 { │ │ │ │ │ +71 // for mixed grids add offset for cubes │ │ │ │ │ +72 variants_.resize(numVariants(GeometryTypes::simplex(dim)) + numVariants │ │ │ │ │ +(GeometryTypes::cube(dim))); │ │ │ │ │ +73 for (size_t i = 0; i < numVariants(GeometryTypes::simplex(dim)); i++) │ │ │ │ │ +74 variants_[i] = SimplexFiniteElement(i); │ │ │ │ │ +75 for (size_t i = 0; i < numVariants(GeometryTypes::cube(dim)); i++) │ │ │ │ │ +76 variants_[i + numVariants(GeometryTypes::simplex(dim))] = CubeFiniteElement │ │ │ │ │ +(i); │ │ │ │ │ +77 } │ │ │ │ │ +78 │ │ │ │ │ +79 │ │ │ │ │ +80 // compute orientation for all elements │ │ │ │ │ +81 const auto& indexSet = gv.indexSet(); │ │ │ │ │ +82 │ │ │ │ │ +83 for(const auto& element : elements(gv)) │ │ │ │ │ 84 { │ │ │ │ │ -85 localView.bind(element); │ │ │ │ │ -86 for(const auto& intersection: intersections(gridView, element)) │ │ │ │ │ -87 if (intersection.boundary()) │ │ │ │ │ -88 for(auto localIndex: seDOFs.bind(localView,intersection)) │ │ │ │ │ -89 f(localIndex, localView); │ │ │ │ │ -90 } │ │ │ │ │ -91} │ │ │ │ │ -92 │ │ │ │ │ -93 │ │ │ │ │ +85 const auto& refElement = referenceElement(element); │ │ │ │ │ +86 auto elementIndex = elementMapper_.index(element); │ │ │ │ │ +87 orientation_[elementIndex] = 0; │ │ │ │ │ +88 │ │ │ │ │ +89 for (std::size_t i=0; i>()(std::declval()),0) = 0> │ │ │ │ │ -113void _f_o_r_E_a_c_h_B_o_u_n_d_a_r_y_D_O_F(const Basis& basis, F&& f) │ │ │ │ │ -114{ │ │ │ │ │ -115 auto localView = basis.localView(); │ │ │ │ │ -116 auto seDOFs = _s_u_b_E_n_t_i_t_y_D_O_F_s(basis); │ │ │ │ │ -117 const auto& gridView = basis.gridView(); │ │ │ │ │ -118 for(auto&& element : elements(gridView)) │ │ │ │ │ -119 if (element.hasBoundaryIntersections()) │ │ │ │ │ -120 { │ │ │ │ │ -121 localView.bind(element); │ │ │ │ │ -122 for(const auto& intersection: intersections(gridView, element)) │ │ │ │ │ -123 if (intersection.boundary()) │ │ │ │ │ -124 for(auto localIndex: seDOFs.bind(localView,intersection)) │ │ │ │ │ -125 f(localView.index(localIndex)); │ │ │ │ │ -126 } │ │ │ │ │ -127} │ │ │ │ │ -128 │ │ │ │ │ -129 │ │ │ │ │ -130 │ │ │ │ │ -131} // namespace Functions │ │ │ │ │ -132} // namespace Dune │ │ │ │ │ -133 │ │ │ │ │ -134#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_BOUNDARYDOFS_HH │ │ │ │ │ -_s_u_b_e_n_t_i_t_y_d_o_f_s_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_u_b_E_n_t_i_t_y_D_O_F_s │ │ │ │ │ -auto subEntityDOFs(const T &) │ │ │ │ │ -Create SubEntityDOFs object. │ │ │ │ │ -DDeeffiinniittiioonn subentitydofs.hh:164 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_f_o_r_E_a_c_h_B_o_u_n_d_a_r_y_D_O_F │ │ │ │ │ -void forEachBoundaryDOF(const Basis &basis, F &&f) │ │ │ │ │ -Loop over all DOFs on the boundary. │ │ │ │ │ -DDeeffiinniittiioonn boundarydofs.hh:40 │ │ │ │ │ -_D_u_n_e │ │ │ │ │ -DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ +95 // Global vertex indices within the grid │ │ │ │ │ +96 auto globalV0 = indexSet.subIndex(element,localV0,dim); │ │ │ │ │ +97 auto globalV1 = indexSet.subIndex(element,localV1,dim); │ │ │ │ │ +98 │ │ │ │ │ +99 if ( (localV0globalV1) || (localV0>localV1 && │ │ │ │ │ +globalV0 │ │ │ │ │ +110 const auto& find(const Element& element) const │ │ │ │ │ +111 { │ │ │ │ │ +112 return variants_[orientation_[elementMapper_.index(element)]]; │ │ │ │ │ +113 } │ │ │ │ │ +114 │ │ │ │ │ +115 private: │ │ │ │ │ +116 std::vector variants_; │ │ │ │ │ +117 Dune::MultipleCodimMultipleGeomTypeMapper elementMapper_; │ │ │ │ │ +118 std::vector orientation_; │ │ │ │ │ +119 }; │ │ │ │ │ +120 │ │ │ │ │ +121 │ │ │ │ │ +122} // namespace Impl │ │ │ │ │ +123 │ │ │ │ │ +124 │ │ │ │ │ +125/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ +126// This is the reusable part of the basis. It contains │ │ │ │ │ +127// │ │ │ │ │ +128// NedelecPreBasis │ │ │ │ │ +129// NedelecNode │ │ │ │ │ +130// │ │ │ │ │ +131// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ +shared │ │ │ │ │ +132// state. These components do _not_ depend on the global basis and local │ │ │ │ │ +view │ │ │ │ │ +133// and can be used without a global basis. │ │ │ │ │ +134/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ +135 │ │ │ │ │ +136template │ │ │ │ │ +137class NedelecNode; │ │ │ │ │ +138 │ │ │ │ │ +139template │ │ │ │ │ +_1_4_0class _N_e_d_e_l_e_c_P_r_e_B_a_s_i_s : │ │ │ │ │ +141 public _L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n< NedelecPreBasis > │ │ │ │ │ +142{ │ │ │ │ │ +143 static const int dim = GV::dimension; │ │ │ │ │ +144 static_assert(kind==1, "Only the Nedelec basis of the first kind is │ │ │ │ │ +currently implemented!"); │ │ │ │ │ +145 using FiniteElementMap = typename Impl:: │ │ │ │ │ +Nedelec1stKindLocalFiniteElementMap; │ │ │ │ │ +146 │ │ │ │ │ +147 using Mapper = Dune::MultipleCodimMultipleGeomTypeMapper; │ │ │ │ │ +148public: │ │ │ │ │ +149 │ │ │ │ │ +_1_5_1 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ +_1_5_2 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ +153 │ │ │ │ │ +_1_5_4 using _N_o_d_e = _N_e_d_e_l_e_c_N_o_d_e_<_G_V_,_ _R_a_n_g_e_,_ _k_i_n_d_,_ _o_r_d_e_r_>; │ │ │ │ │ +155 │ │ │ │ │ +_1_5_7 _N_e_d_e_l_e_c_P_r_e_B_a_s_i_s(const _G_r_i_d_V_i_e_w& gv) : │ │ │ │ │ +158 _g_r_i_d_V_i_e_w__(gv), │ │ │ │ │ +159 _f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__(gv), │ │ │ │ │ +160 _m_a_p_p_e_r__(_g_r_i_d_V_i_e_w__, mcmgLayout(Dim<1>{})) │ │ │ │ │ +161 { │ │ │ │ │ +162 if (kind!=1) │ │ │ │ │ +163 DUNE_THROW(NotImplemented, "Only Nedelec elements of the first kind are │ │ │ │ │ +implemented!"); │ │ │ │ │ +164 │ │ │ │ │ +165 // There is no inherent reason why the basis shouldn't work for grids with │ │ │ │ │ +more than two │ │ │ │ │ +166 // element types. Somebody simply has to sit down and implement the missing │ │ │ │ │ +bits. │ │ │ │ │ +167 if (gv.indexSet().types(0).size() > 2) │ │ │ │ │ +168 DUNE_THROW(NotImplemented, "Nédélec basis is only implemented for grids │ │ │ │ │ +with simplex and cube elements"); │ │ │ │ │ +169 │ │ │ │ │ +170 for(auto type : gv.indexSet().types(0)) │ │ │ │ │ +171 if (!type.isSimplex() && !type.isCube()) │ │ │ │ │ +172 DUNE_THROW(NotImplemented, "Nédélec basis is only implemented for grids │ │ │ │ │ +with simplex or cube elements."); │ │ │ │ │ +173 │ │ │ │ │ +174 if (order>1) │ │ │ │ │ +175 DUNE_THROW(NotImplemented, "Only first-order elements are implemented"); │ │ │ │ │ +176 │ │ │ │ │ +177 if (dim!=2 && dim!=3) │ │ │ │ │ +178 DUNE_THROW(NotImplemented, "Only 2d and 3d Nédélec elements are │ │ │ │ │ +implemented"); │ │ │ │ │ +179 } │ │ │ │ │ +180 │ │ │ │ │ +_1_8_1 void _i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s() │ │ │ │ │ +182 {} │ │ │ │ │ +183 │ │ │ │ │ +_1_8_6 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ +187 { │ │ │ │ │ +188 return _g_r_i_d_V_i_e_w__; │ │ │ │ │ +189 } │ │ │ │ │ +190 │ │ │ │ │ +191 /* \brief Update the stored grid view, to be called if the grid has changed │ │ │ │ │ +*/ │ │ │ │ │ +_1_9_2 void _u_p_d_a_t_e (const _G_r_i_d_V_i_e_w& gv) │ │ │ │ │ +193 { │ │ │ │ │ +194 _g_r_i_d_V_i_e_w__ = gv; │ │ │ │ │ +195 _m_a_p_p_e_r__.update(_g_r_i_d_V_i_e_w__); │ │ │ │ │ +196 } │ │ │ │ │ +197 │ │ │ │ │ +_2_0_1 _N_o_d_e _m_a_k_e_N_o_d_e() const │ │ │ │ │ +202 { │ │ │ │ │ +203 return _N_o_d_e{&_f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__}; │ │ │ │ │ +204 } │ │ │ │ │ +205 │ │ │ │ │ +_2_0_6 _s_i_z_e___t_y_p_e _d_i_m_e_n_s_i_o_n() const │ │ │ │ │ +207 { │ │ │ │ │ +208 return _m_a_p_p_e_r__.size(); │ │ │ │ │ +209 } │ │ │ │ │ +210 │ │ │ │ │ +_2_1_1 _s_i_z_e___t_y_p_e _m_a_x_N_o_d_e_S_i_z_e() const │ │ │ │ │ +212 { │ │ │ │ │ +213 _s_i_z_e___t_y_p_e result = 0; │ │ │ │ │ +214 for (auto&& type : _g_r_i_d_V_i_e_w__.indexSet().types(0)) │ │ │ │ │ +215 { │ │ │ │ │ +216 _s_i_z_e___t_y_p_e numEdges = referenceElement(type).size │ │ │ │ │ +(dim-1); │ │ │ │ │ +217 result = std::max(result, numEdges); │ │ │ │ │ +218 } │ │ │ │ │ +219 │ │ │ │ │ +220 return result; │ │ │ │ │ +221 } │ │ │ │ │ +222 │ │ │ │ │ +226 template │ │ │ │ │ +_2_2_7 It _i_n_d_i_c_e_s(const _N_o_d_e& node, It it) const │ │ │ │ │ +228 { │ │ │ │ │ +229 const auto& element = node._e_l_e_m_e_n_t(); │ │ │ │ │ +230 │ │ │ │ │ +231 // throw if Element is not of predefined type │ │ │ │ │ +232 if (not(element.type().isCube()) and not(element.type().isSimplex())) │ │ │ │ │ +233 DUNE_THROW(NotImplemented, "NedelecBasis only implemented for cube and │ │ │ │ │ +simplex elements."); │ │ │ │ │ +234 │ │ │ │ │ +235 for(std::size_t i=0, end=node._s_i_z_e(); i │ │ │ │ │ +_2_5_3class _N_e_d_e_l_e_c_N_o_d_e : │ │ │ │ │ +254 public _L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ +255{ │ │ │ │ │ +256 static const int dim = GV::dimension; │ │ │ │ │ +257 │ │ │ │ │ +258public: │ │ │ │ │ +259 │ │ │ │ │ +_2_6_0 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ +_2_6_1 using _E_l_e_m_e_n_t = typename GV::template Codim<0>::Entity; │ │ │ │ │ +262 static_assert(kind==1, "Only Nedelec elements of the first kind are │ │ │ │ │ +implemented!"); │ │ │ │ │ +_2_6_3 using _F_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p = typename Impl:: │ │ │ │ │ +Nedelec1stKindLocalFiniteElementMap; │ │ │ │ │ +_2_6_4 using _F_i_n_i_t_e_E_l_e_m_e_n_t = Impl::GlobalValuedLocalFiniteElement; │ │ │ │ │ +267 │ │ │ │ │ +_2_6_8 _N_e_d_e_l_e_c_N_o_d_e(const _F_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p* finiteElementMap) : │ │ │ │ │ +269 _e_l_e_m_e_n_t__(nullptr), │ │ │ │ │ +270 _f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__(finiteElementMap) │ │ │ │ │ +271 { } │ │ │ │ │ +272 │ │ │ │ │ +_2_7_4 const _E_l_e_m_e_n_t& _e_l_e_m_e_n_t() const │ │ │ │ │ +275 { │ │ │ │ │ +276 return *_e_l_e_m_e_n_t__; │ │ │ │ │ +277 } │ │ │ │ │ +278 │ │ │ │ │ +_2_8_3 const _F_i_n_i_t_e_E_l_e_m_e_n_t& _f_i_n_i_t_e_E_l_e_m_e_n_t() const │ │ │ │ │ +284 { │ │ │ │ │ +285 return _f_i_n_i_t_e_E_l_e_m_e_n_t__; │ │ │ │ │ +286 } │ │ │ │ │ +287 │ │ │ │ │ +_2_8_9 void _b_i_n_d(const _E_l_e_m_e_n_t& e) │ │ │ │ │ +290 { │ │ │ │ │ +291 _e_l_e_m_e_n_t__ = &e; │ │ │ │ │ +292 _f_i_n_i_t_e_E_l_e_m_e_n_t__.bind((_f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__->find(*_e_l_e_m_e_n_t__)), e); │ │ │ │ │ +293 this->_s_e_t_S_i_z_e(_f_i_n_i_t_e_E_l_e_m_e_n_t__.size()); │ │ │ │ │ +294 } │ │ │ │ │ +295 │ │ │ │ │ +296protected: │ │ │ │ │ +297 │ │ │ │ │ +_2_9_8 _F_i_n_i_t_e_E_l_e_m_e_n_t _f_i_n_i_t_e_E_l_e_m_e_n_t__; │ │ │ │ │ +_2_9_9 const _E_l_e_m_e_n_t* _e_l_e_m_e_n_t__; │ │ │ │ │ +_3_0_0 const _F_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p* _f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__; │ │ │ │ │ +301}; │ │ │ │ │ +302 │ │ │ │ │ +303 │ │ │ │ │ +304 │ │ │ │ │ +305namespace BasisFactory { │ │ │ │ │ +306 │ │ │ │ │ +316template │ │ │ │ │ +_3_1_7auto _n_e_d_e_l_e_c() │ │ │ │ │ +318{ │ │ │ │ │ +319 return [](const auto& gridView) { │ │ │ │ │ +320 return _N_e_d_e_l_e_c_P_r_e_B_a_s_i_s, Range, kind, │ │ │ │ │ +order>(gridView); │ │ │ │ │ +321 }; │ │ │ │ │ +322} │ │ │ │ │ +323 │ │ │ │ │ +324} // end namespace BasisFactory │ │ │ │ │ +325 │ │ │ │ │ +326 │ │ │ │ │ +327 │ │ │ │ │ +328/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ +329// This is the actual global basis implementation based on the reusable │ │ │ │ │ +parts. │ │ │ │ │ +330/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ +331 │ │ │ │ │ +339template │ │ │ │ │ +_3_4_0using _N_e_d_e_l_e_c_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_<_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_<_G_V_,_ _R_a_n_g_e_,_ _k_i_n_d_, │ │ │ │ │ +_o_r_d_e_r_ _> >; │ │ │ │ │ +341 │ │ │ │ │ +342} // end namespace Dune::Functions │ │ │ │ │ +343 │ │ │ │ │ +344 │ │ │ │ │ +345#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NEDELECBASIS_HH │ │ │ │ │ +_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h │ │ │ │ │ +_n_o_d_e_s_._h_h │ │ │ │ │ +_g_l_o_b_a_l_v_a_l_u_e_d_l_o_c_a_l_f_i_n_i_t_e_e_l_e_m_e_n_t_._h_h │ │ │ │ │ +_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_p_o_w_e_r │ │ │ │ │ +auto power(ChildPreBasisFactory &&childPreBasisFactory, std::size_t k, const │ │ │ │ │ +IndexMergingStrategy &) │ │ │ │ │ +Create a pre-basis factory that can build a PowerPreBasis. │ │ │ │ │ +DDeeffiinniittiioonn dynamicpowerbasis.hh:409 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_n_e_d_e_l_e_c │ │ │ │ │ +auto nedelec() │ │ │ │ │ +Create a pre-basis factory that can create a Nédélec pre-basis. │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:317 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │ +DDeeffiinniittiioonn polynomial.hh:18 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ +Global basis for given pre-basis. │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:50 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n │ │ │ │ │ +A generic MixIn class for PreBasis. │ │ │ │ │ +DDeeffiinniittiioonn leafprebasismixin.hh:36 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:255 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__ │ │ │ │ │ +const FiniteElementMap * finiteElementMap_ │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:300 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t__ │ │ │ │ │ +FiniteElement finiteElement_ │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:298 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e_:_:_F_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ +Impl::GlobalValuedLocalFiniteElement< Impl::CovariantPiolaTransformator, │ │ │ │ │ +typename FiniteElementMap::FiniteElement, Element > FiniteElement │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:266 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e_:_:_b_i_n_d │ │ │ │ │ +void bind(const Element &e) │ │ │ │ │ +Bind to element. │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:289 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e_:_:_e_l_e_m_e_n_t │ │ │ │ │ +const Element & element() const │ │ │ │ │ +Return current element, throw if unbound. │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:274 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e_:_:_E_l_e_m_e_n_t │ │ │ │ │ +typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:261 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ +const FiniteElement & finiteElement() const │ │ │ │ │ +Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:283 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e_:_:_N_e_d_e_l_e_c_N_o_d_e │ │ │ │ │ +NedelecNode(const FiniteElementMap *finiteElementMap) │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:268 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e_:_:_F_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p │ │ │ │ │ +typename Impl::Nedelec1stKindLocalFiniteElementMap< GV, dim, Range, order > │ │ │ │ │ +FiniteElementMap │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:263 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e_:_:_e_l_e_m_e_n_t__ │ │ │ │ │ +const Element * element_ │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:299 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_N_o_d_e_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:260 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:142 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s │ │ │ │ │ +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. │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:227 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:152 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s │ │ │ │ │ +NedelecPreBasis(const GridView &gv) │ │ │ │ │ +Constructor for a given grid view object. │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:157 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ +GV GridView │ │ │ │ │ +The grid view that the FE space is defined on. │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:151 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ +size_type dimension() const │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:206 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w__ │ │ │ │ │ +GridView gridView_ │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:245 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t_M_a_p__ │ │ │ │ │ +FiniteElementMap finiteElementMap_ │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:246 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s │ │ │ │ │ +void initializeIndices() │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:181 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_u_p_d_a_t_e │ │ │ │ │ +void update(const GridView &gv) │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:192 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_m_a_x_N_o_d_e_S_i_z_e │ │ │ │ │ +size_type maxNodeSize() const │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:211 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ +const GridView & gridView() const │ │ │ │ │ +Obtain the grid view that the basis is defined on. │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:186 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ +Node makeNode() const │ │ │ │ │ +Create tree node. │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:201 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_N_e_d_e_l_e_c_P_r_e_B_a_s_i_s_:_:_m_a_p_p_e_r__ │ │ │ │ │ +Mapper mapper_ │ │ │ │ │ +DDeeffiinniittiioonn nedelecbasis.hh:247 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_i_z_e │ │ │ │ │ +size_type size() const │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:147 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_e_t_S_i_z_e │ │ │ │ │ +void setSize(const size_type size) │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:169 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:191 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00188.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: leafprebasismappermixin.hh File Reference │ │ │ │ +dune-functions: subentitydofs.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -73,42 +73,50 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
leafprebasismappermixin.hh File Reference
│ │ │ │ +
subentitydofs.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <dune/common/rangeutilities.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/leafprebasismixin.hh>
│ │ │ │ +
#include <vector>
│ │ │ │ #include <dune/geometry/referenceelements.hh>
│ │ │ │ -#include <dune/grid/common/mcmgmapper.hh>
│ │ │ │ +#include <dune/typetree/traversal.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::LeafPreBasisMapperMixin< GV >
 A generic MixIn class for PreBasis with flat indices computed from a mapper. More...
class  Dune::Functions::SubEntityDOFs< GridView >
 Range of DOFs associated to sub-entity. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ Functions

template<class GridView , class LocalCoefficients >
auto Dune::Functions::subIndexRange (const Dune::MultipleCodimMultipleGeomTypeMapper< GridView > &mapper, const typename GridView::template Codim< 0 >::Entity &element, const LocalCoefficients &localCoefficients)
 
template<class T >
auto Dune::Functions::subEntityDOFs (const T &)
 Create SubEntityDOFs object.
 
template<class LocalView >
auto Dune::Functions::subEntityDOFs (const LocalView &localView, std::size_t subEntityIndex, std::size_t subEntityCodim)
 Create bound SubEntityDOFs object.
 
template<class LocalView , class Intersection >
auto Dune::Functions::subEntityDOFs (const LocalView &localView, const Intersection &intersection)
 Create bound SubEntityDOFs object.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -2,32 +2,38 @@ │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -leafprebasismappermixin.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ +subentitydofs.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_<_ _G_V_ _> │ │ │ │ │ -  A generic MixIn class for PreBasis with flat indices computed from a │ │ │ │ │ - mapper. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_E_n_t_i_t_y_D_O_F_s_<_ _G_r_i_d_V_i_e_w_ _> │ │ │ │ │ +  Range of DOFs associated to sub-entity. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_u_b_I_n_d_e_x_R_a_n_g_e (const Dune:: │ │ │ │ │ - MultipleCodimMultipleGeomTypeMapper< GridView > &mapper, const typename │ │ │ │ │ - GridView::template Codim< 0 >::Entity &element, const LocalCoefficients │ │ │ │ │ - &localCoefficients) │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_u_b_E_n_t_i_t_y_D_O_F_s (const T &) │ │ │ │ │ +  Create _S_u_b_E_n_t_i_t_y_D_O_F_s object. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_u_b_E_n_t_i_t_y_D_O_F_s (const LocalView &localView, std::size_t │ │ │ │ │ + subEntityIndex, std::size_t subEntityCodim) │ │ │ │ │ +  Create bound _S_u_b_E_n_t_i_t_y_D_O_F_s object. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_u_b_E_n_t_i_t_y_D_O_F_s (const LocalView &localView, const │ │ │ │ │ + Intersection &intersection) │ │ │ │ │ +  Create bound _S_u_b_E_n_t_i_t_y_D_O_F_s object. │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00188_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: leafprebasismappermixin.hh Source File │ │ │ │ +dune-functions: subentitydofs.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,168 +74,174 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
leafprebasismappermixin.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LEAFPREBASISMAPPERMIXIN_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LEAFPREBASISMAPPERMIXIN_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBENTITYDOFS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBENTITYDOFS_HH
│ │ │ │
9
│ │ │ │ -
10#include <dune/common/rangeutilities.hh>
│ │ │ │ +
10#include <vector>
│ │ │ │
11
│ │ │ │ - │ │ │ │ -
13
│ │ │ │ -
14#include <dune/geometry/referenceelements.hh>
│ │ │ │ +
12#include <dune/geometry/referenceelements.hh>
│ │ │ │ +
13#include <dune/typetree/traversal.hh>
│ │ │ │ +
14
│ │ │ │
15
│ │ │ │ -
16#include <dune/grid/common/mcmgmapper.hh>
│ │ │ │ -
17
│ │ │ │ -
18
│ │ │ │ +
16
│ │ │ │ +
17namespace Dune {
│ │ │ │ +
18namespace Functions {
│ │ │ │
19
│ │ │ │ -
20namespace Dune::Functions {
│ │ │ │ +
20
│ │ │ │
21
│ │ │ │ -
22
│ │ │ │ -
23
│ │ │ │ -
24// Helper function returning a random access range
│ │ │ │ -
25// of global indices associated to the element. The ordering
│ │ │ │ -
26// is derived from the LocalCoefficients object.
│ │ │ │ -
27// Having this as a member of MCMGMapper would be nice.
│ │ │ │ -
28// But this would introduce the LocalCoefficient in dune-grid.
│ │ │ │ -
29// This would introduce at least a weak 'conceptual' dependency problem.
│ │ │ │ -
30template<class GridView, class LocalCoefficients>
│ │ │ │ -
│ │ │ │ -
31auto subIndexRange(const Dune::MultipleCodimMultipleGeomTypeMapper<GridView>& mapper, const typename GridView::template Codim<0>::Entity& element, const LocalCoefficients& localCoefficients)
│ │ │ │ -
32{
│ │ │ │ -
33 // Here we make use of the 'hidden' (poorly documented) MCMGMapper feature to support
│ │ │ │ -
34 // multiple DOFs per subentity. However, we do not take care for any reordering.
│ │ │ │ -
35 return Dune::transformedRangeView(Dune::range(localCoefficients.size()), [&](auto localIndex) {
│ │ │ │ -
36 auto localKey = localCoefficients.localKey(localIndex);
│ │ │ │ -
37 return mapper.subIndex(element, localKey.subEntity(), localKey.codim()) + localKey.index();
│ │ │ │ -
38 });
│ │ │ │ -
39}
│ │ │ │ -
│ │ │ │ -
40
│ │ │ │ -
41
│ │ │ │ -
42
│ │ │ │ -
59template<typename GV>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
61 : public LeafPreBasisMixin<LeafPreBasisMapperMixin<GV>>
│ │ │ │ -
62{
│ │ │ │ -
63 static const int gridDim = GV::dimension;
│ │ │ │ -
64
│ │ │ │ -
65public:
│ │ │ │ -
66
│ │ │ │ -
68 using GridView = GV;
│ │ │ │ -
69
│ │ │ │ -
71 using size_type = std::size_t;
│ │ │ │ -
72
│ │ │ │ -
│ │ │ │ -
74 LeafPreBasisMapperMixin(const GridView& gv, Dune::MCMGLayout layout) :
│ │ │ │ -
75 gridView_(gv),
│ │ │ │ -
76 mapper_(gridView_, std::move(layout))
│ │ │ │ -
77 {}
│ │ │ │ -
│ │ │ │ -
78
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
81 {
│ │ │ │ -
82 // Determine upper bound for node size by traversing
│ │ │ │ -
83 // the layout for all element types in the grid
│ │ │ │ -
84 maxNodeSize_ = 0;
│ │ │ │ -
85 for(const GeometryType& elementType : gridView_.indexSet().types(0))
│ │ │ │ -
86 {
│ │ │ │ -
87 auto referenceElement = Dune::referenceElement<double, gridDim>(elementType);
│ │ │ │ -
88 for(auto codim : Dune::range(gridDim+1))
│ │ │ │ -
89 for(auto i : Dune::range(referenceElement.size(codim)))
│ │ │ │ -
90 maxNodeSize_ += mapper_.layout()(referenceElement.type(i, codim), gridDim);
│ │ │ │ -
91 }
│ │ │ │ -
92 }
│ │ │ │ -
│ │ │ │ -
93
│ │ │ │ -
│ │ │ │ -
95 const GridView& gridView() const
│ │ │ │ -
96 {
│ │ │ │ -
97 return gridView_;
│ │ │ │ -
98 }
│ │ │ │ -
│ │ │ │ -
99
│ │ │ │ -
│ │ │ │ -
101 void update(const GridView& gv)
│ │ │ │ -
102 {
│ │ │ │ -
103 gridView_ = gv;
│ │ │ │ -
104 mapper_.update(gridView_);
│ │ │ │ -
105 }
│ │ │ │ +
44template<class GridView>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
46{
│ │ │ │ +
47 static const int dim = GridView::dimension;
│ │ │ │ +
48
│ │ │ │ +
49public:
│ │ │ │ +
50
│ │ │ │ +
67 template<class LocalView>
│ │ │ │ +
│ │ │ │ +
68 SubEntityDOFs& bind(const LocalView& localView, std::size_t subEntityIndex, std::size_t subEntityCodim)
│ │ │ │ +
69 {
│ │ │ │ +
70 // fill vector with local indices of all DOFs contained in subentity
│ │ │ │ +
71 containedDOFs_.clear();
│ │ │ │ +
72 dofIsContained_.assign(localView.size(), false);
│ │ │ │ +
73
│ │ │ │ +
74 auto re = Dune::referenceElement<double,dim>(localView.element().type());
│ │ │ │ +
75
│ │ │ │ +
76 Dune::TypeTree::forEachLeafNode(localView.tree(), [&](auto&& node, auto&& /*treePath*/) {
│ │ │ │ +
77 const auto& localCoefficients = node.finiteElement().localCoefficients();
│ │ │ │ +
78 std::size_t localSize = localCoefficients.size();
│ │ │ │ +
79 for(std::size_t i=0; i<localSize; ++i)
│ │ │ │ +
80 {
│ │ │ │ +
81 auto localKey = localCoefficients.localKey(i);
│ │ │ │ +
82 if (re.subEntities(subEntityIndex, subEntityCodim, localKey.codim()).contains(localKey.subEntity()))
│ │ │ │ +
83 {
│ │ │ │ +
84 containedDOFs_.push_back(node.localIndex(i));
│ │ │ │ +
85 dofIsContained_[node.localIndex(i)] = true;
│ │ │ │ +
86 }
│ │ │ │ +
87 }
│ │ │ │ +
88 });
│ │ │ │ +
89 return *this;
│ │ │ │ +
90 }
│ │ │ │
│ │ │ │ -
106
│ │ │ │ +
91
│ │ │ │ +
107 template<class LocalView, class Intersection>
│ │ │ │
│ │ │ │ - │ │ │ │ -
109 {
│ │ │ │ -
110 return mapper_.size();
│ │ │ │ +
108 SubEntityDOFs& bind(const LocalView& localView, const Intersection& intersection)
│ │ │ │ +
109 {
│ │ │ │ +
110 return bind(localView, intersection.indexInInside(), 1);
│ │ │ │
111 }
│ │ │ │
│ │ │ │
112
│ │ │ │
│ │ │ │ - │ │ │ │ +
114 auto begin() const
│ │ │ │
115 {
│ │ │ │ -
116 return maxNodeSize_;
│ │ │ │ +
116 return containedDOFs_.cbegin();
│ │ │ │
117 }
│ │ │ │
│ │ │ │
118
│ │ │ │ -
120 template<class Node, class It>
│ │ │ │ -
│ │ │ │ -
121 It indices(const Node& node, It it) const
│ │ │ │ -
122 {
│ │ │ │ -
123 for(const auto& globalIndex : subIndexRange(mapper_, node.element(), node.finiteElement().localCoefficients()))
│ │ │ │ -
124 {
│ │ │ │ -
125 *it = {{ (size_type)globalIndex }};
│ │ │ │ -
126 ++it;
│ │ │ │ -
127 }
│ │ │ │ -
128 return it;
│ │ │ │ +
│ │ │ │ +
120 auto end() const
│ │ │ │ +
121 {
│ │ │ │ +
122 return containedDOFs_.cend();
│ │ │ │ +
123 }
│ │ │ │ +
│ │ │ │ +
124
│ │ │ │ +
│ │ │ │ +
126 auto size() const
│ │ │ │ +
127 {
│ │ │ │ +
128 return containedDOFs_.size();
│ │ │ │
129 }
│ │ │ │
│ │ │ │
130
│ │ │ │ -
131protected:
│ │ │ │ - │ │ │ │ -
133 Dune::MultipleCodimMultipleGeomTypeMapper<GridView> mapper_;
│ │ │ │ -
134 std::size_t maxNodeSize_;
│ │ │ │ -
135};
│ │ │ │ +
│ │ │ │ +
132 decltype(auto) operator[](std::size_t i) const
│ │ │ │ +
133 {
│ │ │ │ +
134 return containedDOFs_[i];
│ │ │ │ +
135 }
│ │ │ │
│ │ │ │
136
│ │ │ │ -
137
│ │ │ │ -
138
│ │ │ │ -
139} // end namespace Dune::Functions
│ │ │ │ -
140
│ │ │ │ -
141#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LEAFPREBASISMAPPERMIXIN_HH
│ │ │ │ - │ │ │ │ -
Definition polynomial.hh:18
│ │ │ │ -
auto subIndexRange(const Dune::MultipleCodimMultipleGeomTypeMapper< GridView > &mapper, const typename GridView::template Codim< 0 >::Entity &element, const LocalCoefficients &localCoefficients)
Definition leafprebasismappermixin.hh:31
│ │ │ │ -
A generic MixIn class for PreBasis with flat indices computed from a mapper.
Definition leafprebasismappermixin.hh:62
│ │ │ │ -
const GridView & gridView() const
Export the stored GridView.
Definition leafprebasismappermixin.hh:95
│ │ │ │ -
size_type dimension() const
Return total number of basis functions.
Definition leafprebasismappermixin.hh:108
│ │ │ │ -
std::size_t maxNodeSize_
Definition leafprebasismappermixin.hh:134
│ │ │ │ -
Dune::MultipleCodimMultipleGeomTypeMapper< GridView > mapper_
Definition leafprebasismappermixin.hh:133
│ │ │ │ -
std::size_t size_type
Type used for index digits.
Definition leafprebasismappermixin.hh:71
│ │ │ │ -
void update(const GridView &gv)
Update the stored GridView.
Definition leafprebasismappermixin.hh:101
│ │ │ │ -
LeafPreBasisMapperMixin(const GridView &gv, Dune::MCMGLayout layout)
Construct from GridView and local DOF layout.
Definition leafprebasismappermixin.hh:74
│ │ │ │ -
GV GridView
Type of the associated GridView.
Definition leafprebasismappermixin.hh:68
│ │ │ │ -
size_type maxNodeSize() const
Return maximal number of basis functions per element.
Definition leafprebasismappermixin.hh:114
│ │ │ │ -
GridView gridView_
Definition leafprebasismappermixin.hh:132
│ │ │ │ -
void initializeIndices()
Initialize the global index information.
Definition leafprebasismappermixin.hh:80
│ │ │ │ -
It indices(const Node &node, It it) const
Fill cache with global indices of DOFs associated to the given bound node.
Definition leafprebasismappermixin.hh:121
│ │ │ │ -
A generic MixIn class for PreBasis.
Definition leafprebasismixin.hh:36
│ │ │ │ +
│ │ │ │ +
138 bool contains(std::size_t localIndex) const
│ │ │ │ +
139 {
│ │ │ │ +
140 return dofIsContained_[localIndex];
│ │ │ │ +
141 }
│ │ │ │ +
│ │ │ │ +
142
│ │ │ │ +
143private:
│ │ │ │ +
144
│ │ │ │ +
145 std::vector<std::size_t> containedDOFs_;
│ │ │ │ +
146 std::vector<bool> dofIsContained_;
│ │ │ │ +
147};
│ │ │ │ +
│ │ │ │ +
148
│ │ │ │ +
149
│ │ │ │ +
150
│ │ │ │ +
163template<class T>
│ │ │ │ +
│ │ │ │ +
164auto subEntityDOFs(const T&)
│ │ │ │ +
165{
│ │ │ │ + │ │ │ │ +
167}
│ │ │ │ +
│ │ │ │ +
168
│ │ │ │ +
169
│ │ │ │ +
170
│ │ │ │ +
190template<class LocalView>
│ │ │ │ +
│ │ │ │ +
191auto subEntityDOFs(const LocalView& localView, std::size_t subEntityIndex, std::size_t subEntityCodim)
│ │ │ │ +
192{
│ │ │ │ +
193 using GridView = typename LocalView::GridView;
│ │ │ │ + │ │ │ │ +
195 subEntityDOFs.bind(localView, subEntityIndex, subEntityCodim);
│ │ │ │ +
196 return subEntityDOFs;
│ │ │ │ +
197}
│ │ │ │ +
│ │ │ │ +
198
│ │ │ │ +
199
│ │ │ │ +
200
│ │ │ │ +
219template<class LocalView, class Intersection>
│ │ │ │ +
│ │ │ │ +
220auto subEntityDOFs(const LocalView& localView, const Intersection& intersection)
│ │ │ │ +
221{
│ │ │ │ +
222 using GridView = typename LocalView::GridView;
│ │ │ │ + │ │ │ │ +
224 subEntityDOFs.bind(localView, intersection);
│ │ │ │ +
225 return subEntityDOFs;
│ │ │ │ +
226}
│ │ │ │ +
│ │ │ │ +
227
│ │ │ │ +
228
│ │ │ │ +
229
│ │ │ │ +
230} // namespace Functions
│ │ │ │ +
231} // namespace Dune
│ │ │ │ +
232
│ │ │ │ +
233#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBENTITYDOFS_HH
│ │ │ │ +
auto subEntityDOFs(const T &)
Create SubEntityDOFs object.
Definition subentitydofs.hh:164
│ │ │ │ +
Definition polynomial.hh:17
│ │ │ │ +
Range of DOFs associated to sub-entity.
Definition subentitydofs.hh:46
│ │ │ │ +
auto begin() const
Create begin iterator for access to range of contained local indices.
Definition subentitydofs.hh:114
│ │ │ │ +
auto size() const
Return number of contained DOFs.
Definition subentitydofs.hh:126
│ │ │ │ +
SubEntityDOFs & bind(const LocalView &localView, const Intersection &intersection)
Bind SubEntityDOFs object to LocalView and sub-entity.
Definition subentitydofs.hh:108
│ │ │ │ +
bool contains(std::size_t localIndex) const
Check if given local index is contained in this range of DOFs.
Definition subentitydofs.hh:138
│ │ │ │ +
auto end() const
Create end iterator for access to range of contained local indices.
Definition subentitydofs.hh:120
│ │ │ │ +
SubEntityDOFs & bind(const LocalView &localView, std::size_t subEntityIndex, std::size_t subEntityCodim)
Bind SubEntityDOFs object to LocalView and sub-entity.
Definition subentitydofs.hh:68
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,196 +1,180 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -leafprebasismappermixin.hh │ │ │ │ │ +subentitydofs.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LEAFPREBASISMAPPERMIXIN_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LEAFPREBASISMAPPERMIXIN_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBENTITYDOFS_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBENTITYDOFS_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ +10#include │ │ │ │ │ 11 │ │ │ │ │ -12#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ -13 │ │ │ │ │ -14#include │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14 │ │ │ │ │ 15 │ │ │ │ │ -16#include │ │ │ │ │ -17 │ │ │ │ │ -18 │ │ │ │ │ +16 │ │ │ │ │ +17namespace _D_u_n_e { │ │ │ │ │ +18namespace Functions { │ │ │ │ │ 19 │ │ │ │ │ -20namespace _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s { │ │ │ │ │ +20 │ │ │ │ │ 21 │ │ │ │ │ -22 │ │ │ │ │ -23 │ │ │ │ │ -24// Helper function returning a random access range │ │ │ │ │ -25// of global indices associated to the element. The ordering │ │ │ │ │ -26// is derived from the LocalCoefficients object. │ │ │ │ │ -27// Having this as a member of MCMGMapper would be nice. │ │ │ │ │ -28// But this would introduce the LocalCoefficient in dune-grid. │ │ │ │ │ -29// This would introduce at least a weak 'conceptual' dependency problem. │ │ │ │ │ -30template │ │ │ │ │ -_3_1auto _s_u_b_I_n_d_e_x_R_a_n_g_e(const Dune::MultipleCodimMultipleGeomTypeMapper& │ │ │ │ │ -mapper, const typename GridView::template Codim<0>::Entity& element, const │ │ │ │ │ -LocalCoefficients& localCoefficients) │ │ │ │ │ -32{ │ │ │ │ │ -33 // Here we make use of the 'hidden' (poorly documented) MCMGMapper feature │ │ │ │ │ -to support │ │ │ │ │ -34 // multiple DOFs per subentity. However, we do not take care for any │ │ │ │ │ -reordering. │ │ │ │ │ -35 return Dune::transformedRangeView(Dune::range(localCoefficients.size()), [&] │ │ │ │ │ -(auto localIndex) { │ │ │ │ │ -36 auto localKey = localCoefficients.localKey(localIndex); │ │ │ │ │ -37 return mapper.subIndex(element, localKey.subEntity(), localKey.codim()) + │ │ │ │ │ -localKey.index(); │ │ │ │ │ -38 }); │ │ │ │ │ -39} │ │ │ │ │ -40 │ │ │ │ │ -41 │ │ │ │ │ -42 │ │ │ │ │ -59template │ │ │ │ │ -_6_0class _L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n │ │ │ │ │ -61 : public _L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n> │ │ │ │ │ -62{ │ │ │ │ │ -63 static const int gridDim = GV::dimension; │ │ │ │ │ -64 │ │ │ │ │ -65public: │ │ │ │ │ -66 │ │ │ │ │ -_6_8 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ -69 │ │ │ │ │ -_7_1 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ -72 │ │ │ │ │ -_7_4 _L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n(const _G_r_i_d_V_i_e_w& gv, Dune::MCMGLayout layout) : │ │ │ │ │ -75 _g_r_i_d_V_i_e_w__(gv), │ │ │ │ │ -76 _m_a_p_p_e_r__(_g_r_i_d_V_i_e_w__, std::move(layout)) │ │ │ │ │ -77 {} │ │ │ │ │ -78 │ │ │ │ │ -_8_0 void _i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s() │ │ │ │ │ -81 { │ │ │ │ │ -82 // Determine upper bound for node size by traversing │ │ │ │ │ -83 // the layout for all element types in the grid │ │ │ │ │ -84 _m_a_x_N_o_d_e_S_i_z_e__ = 0; │ │ │ │ │ -85 for(const GeometryType& elementType : _g_r_i_d_V_i_e_w__.indexSet().types(0)) │ │ │ │ │ -86 { │ │ │ │ │ -87 auto referenceElement = Dune::referenceElement │ │ │ │ │ -(elementType); │ │ │ │ │ -88 for(auto codim : Dune::range(gridDim+1)) │ │ │ │ │ -89 for(auto i : Dune::range(referenceElement.size(codim))) │ │ │ │ │ -90 _m_a_x_N_o_d_e_S_i_z_e__ += _m_a_p_p_e_r__.layout()(referenceElement.type(i, codim), gridDim); │ │ │ │ │ -91 } │ │ │ │ │ -92 } │ │ │ │ │ -93 │ │ │ │ │ -_9_5 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ -96 { │ │ │ │ │ -97 return _g_r_i_d_V_i_e_w__; │ │ │ │ │ -98 } │ │ │ │ │ -99 │ │ │ │ │ -_1_0_1 void _u_p_d_a_t_e(const _G_r_i_d_V_i_e_w& gv) │ │ │ │ │ -102 { │ │ │ │ │ -103 _g_r_i_d_V_i_e_w__ = gv; │ │ │ │ │ -104 _m_a_p_p_e_r__.update(_g_r_i_d_V_i_e_w__); │ │ │ │ │ -105 } │ │ │ │ │ -106 │ │ │ │ │ -_1_0_8 _s_i_z_e___t_y_p_e _d_i_m_e_n_s_i_o_n() const │ │ │ │ │ +44template │ │ │ │ │ +_4_5class _S_u_b_E_n_t_i_t_y_D_O_F_s │ │ │ │ │ +46{ │ │ │ │ │ +47 static const int dim = GridView::dimension; │ │ │ │ │ +48 │ │ │ │ │ +49public: │ │ │ │ │ +50 │ │ │ │ │ +67 template │ │ │ │ │ +_6_8 _S_u_b_E_n_t_i_t_y_D_O_F_s& _b_i_n_d(const LocalView& localView, std::size_t subEntityIndex, │ │ │ │ │ +std::size_t subEntityCodim) │ │ │ │ │ +69 { │ │ │ │ │ +70 // fill vector with local indices of all DOFs contained in subentity │ │ │ │ │ +71 containedDOFs_.clear(); │ │ │ │ │ +72 dofIsContained_.assign(localView.size(), false); │ │ │ │ │ +73 │ │ │ │ │ +74 auto re = Dune::referenceElement(localView.element().type()); │ │ │ │ │ +75 │ │ │ │ │ +76 Dune::TypeTree::forEachLeafNode(localView.tree(), [&](auto&& node, auto&& / │ │ │ │ │ +*treePath*/) { │ │ │ │ │ +77 const auto& localCoefficients = node.finiteElement().localCoefficients(); │ │ │ │ │ +78 std::size_t localSize = localCoefficients.size(); │ │ │ │ │ +79 for(std::size_t i=0; i │ │ │ │ │ +_1_0_8 _S_u_b_E_n_t_i_t_y_D_O_F_s& _b_i_n_d(const LocalView& localView, const Intersection& │ │ │ │ │ +intersection) │ │ │ │ │ 109 { │ │ │ │ │ -110 return _m_a_p_p_e_r__.size(); │ │ │ │ │ +110 return bind(localView, intersection.indexInInside(), 1); │ │ │ │ │ 111 } │ │ │ │ │ 112 │ │ │ │ │ -_1_1_4 _s_i_z_e___t_y_p_e _m_a_x_N_o_d_e_S_i_z_e() const │ │ │ │ │ +_1_1_4 auto _b_e_g_i_n() const │ │ │ │ │ 115 { │ │ │ │ │ -116 return _m_a_x_N_o_d_e_S_i_z_e__; │ │ │ │ │ +116 return containedDOFs_.cbegin(); │ │ │ │ │ 117 } │ │ │ │ │ 118 │ │ │ │ │ -120 template │ │ │ │ │ -_1_2_1 It _i_n_d_i_c_e_s(const Node& node, It it) const │ │ │ │ │ -122 { │ │ │ │ │ -123 for(const auto& globalIndex : _s_u_b_I_n_d_e_x_R_a_n_g_e(_m_a_p_p_e_r__, node.element(), │ │ │ │ │ -node.finiteElement().localCoefficients())) │ │ │ │ │ -124 { │ │ │ │ │ -125 *it = {{ (_s_i_z_e___t_y_p_e)globalIndex }}; │ │ │ │ │ -126 ++it; │ │ │ │ │ -127 } │ │ │ │ │ -128 return it; │ │ │ │ │ +_1_2_0 auto _e_n_d() const │ │ │ │ │ +121 { │ │ │ │ │ +122 return containedDOFs_.cend(); │ │ │ │ │ +123 } │ │ │ │ │ +124 │ │ │ │ │ +_1_2_6 auto _s_i_z_e() const │ │ │ │ │ +127 { │ │ │ │ │ +128 return containedDOFs_.size(); │ │ │ │ │ 129 } │ │ │ │ │ 130 │ │ │ │ │ -131protected: │ │ │ │ │ -_1_3_2 _G_r_i_d_V_i_e_w _g_r_i_d_V_i_e_w__; │ │ │ │ │ -_1_3_3 Dune::MultipleCodimMultipleGeomTypeMapper _m_a_p_p_e_r__; │ │ │ │ │ -_1_3_4 std::size_t _m_a_x_N_o_d_e_S_i_z_e__; │ │ │ │ │ -135}; │ │ │ │ │ +_1_3_2 decltype(auto) operator[](std::size_t i) const │ │ │ │ │ +133 { │ │ │ │ │ +134 return containedDOFs_[i]; │ │ │ │ │ +135 } │ │ │ │ │ 136 │ │ │ │ │ -137 │ │ │ │ │ -138 │ │ │ │ │ -139} // end namespace Dune::Functions │ │ │ │ │ -140 │ │ │ │ │ -141#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LEAFPREBASISMAPPERMIXIN_HH │ │ │ │ │ -_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │ -DDeeffiinniittiioonn polynomial.hh:18 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_u_b_I_n_d_e_x_R_a_n_g_e │ │ │ │ │ -auto subIndexRange(const Dune::MultipleCodimMultipleGeomTypeMapper< GridView > │ │ │ │ │ -&mapper, const typename GridView::template Codim< 0 >::Entity &element, const │ │ │ │ │ -LocalCoefficients &localCoefficients) │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismappermixin.hh:31 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n │ │ │ │ │ -A generic MixIn class for PreBasis with flat indices computed from a mapper. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismappermixin.hh:62 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ -const GridView & gridView() const │ │ │ │ │ -Export the stored GridView. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismappermixin.hh:95 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ -size_type dimension() const │ │ │ │ │ -Return total number of basis functions. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismappermixin.hh:108 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_:_:_m_a_x_N_o_d_e_S_i_z_e__ │ │ │ │ │ -std::size_t maxNodeSize_ │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismappermixin.hh:134 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_:_:_m_a_p_p_e_r__ │ │ │ │ │ -Dune::MultipleCodimMultipleGeomTypeMapper< GridView > mapper_ │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismappermixin.hh:133 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Type used for index digits. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismappermixin.hh:71 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_:_:_u_p_d_a_t_e │ │ │ │ │ -void update(const GridView &gv) │ │ │ │ │ -Update the stored GridView. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismappermixin.hh:101 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n │ │ │ │ │ -LeafPreBasisMapperMixin(const GridView &gv, Dune::MCMGLayout layout) │ │ │ │ │ -Construct from GridView and local DOF layout. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismappermixin.hh:74 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ -GV GridView │ │ │ │ │ -Type of the associated GridView. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismappermixin.hh:68 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_:_:_m_a_x_N_o_d_e_S_i_z_e │ │ │ │ │ -size_type maxNodeSize() const │ │ │ │ │ -Return maximal number of basis functions per element. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismappermixin.hh:114 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_:_:_g_r_i_d_V_i_e_w__ │ │ │ │ │ -GridView gridView_ │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismappermixin.hh:132 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_:_:_i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s │ │ │ │ │ -void initializeIndices() │ │ │ │ │ -Initialize the global index information. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismappermixin.hh:80 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_a_p_p_e_r_M_i_x_i_n_:_:_i_n_d_i_c_e_s │ │ │ │ │ -It indices(const Node &node, It it) const │ │ │ │ │ -Fill cache with global indices of DOFs associated to the given bound node. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismappermixin.hh:121 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n │ │ │ │ │ -A generic MixIn class for PreBasis. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismixin.hh:36 │ │ │ │ │ +_1_3_8 bool _c_o_n_t_a_i_n_s(std::size_t localIndex) const │ │ │ │ │ +139 { │ │ │ │ │ +140 return dofIsContained_[localIndex]; │ │ │ │ │ +141 } │ │ │ │ │ +142 │ │ │ │ │ +143private: │ │ │ │ │ +144 │ │ │ │ │ +145 std::vector containedDOFs_; │ │ │ │ │ +146 std::vector dofIsContained_; │ │ │ │ │ +147}; │ │ │ │ │ +148 │ │ │ │ │ +149 │ │ │ │ │ +150 │ │ │ │ │ +163template │ │ │ │ │ +_1_6_4auto _s_u_b_E_n_t_i_t_y_D_O_F_s(const T&) │ │ │ │ │ +165{ │ │ │ │ │ +166 return _S_u_b_E_n_t_i_t_y_D_O_F_s_<_t_y_p_e_n_a_m_e_ _T_:_:_G_r_i_d_V_i_e_w_>{}; │ │ │ │ │ +167} │ │ │ │ │ +168 │ │ │ │ │ +169 │ │ │ │ │ +170 │ │ │ │ │ +190template │ │ │ │ │ +_1_9_1auto _s_u_b_E_n_t_i_t_y_D_O_F_s(const LocalView& localView, std::size_t subEntityIndex, │ │ │ │ │ +std::size_t subEntityCodim) │ │ │ │ │ +192{ │ │ │ │ │ +193 using GridView = typename LocalView::GridView; │ │ │ │ │ +194 _S_u_b_E_n_t_i_t_y_D_O_F_s_<_G_r_i_d_V_i_e_w_> _s_u_b_E_n_t_i_t_y_D_O_F_s; │ │ │ │ │ +195 _s_u_b_E_n_t_i_t_y_D_O_F_s.bind(localView, subEntityIndex, subEntityCodim); │ │ │ │ │ +196 return _s_u_b_E_n_t_i_t_y_D_O_F_s; │ │ │ │ │ +197} │ │ │ │ │ +198 │ │ │ │ │ +199 │ │ │ │ │ +200 │ │ │ │ │ +219template │ │ │ │ │ +_2_2_0auto _s_u_b_E_n_t_i_t_y_D_O_F_s(const LocalView& localView, const Intersection& │ │ │ │ │ +intersection) │ │ │ │ │ +221{ │ │ │ │ │ +222 using GridView = typename LocalView::GridView; │ │ │ │ │ +223 _S_u_b_E_n_t_i_t_y_D_O_F_s_<_G_r_i_d_V_i_e_w_> _s_u_b_E_n_t_i_t_y_D_O_F_s; │ │ │ │ │ +224 _s_u_b_E_n_t_i_t_y_D_O_F_s.bind(localView, intersection); │ │ │ │ │ +225 return _s_u_b_E_n_t_i_t_y_D_O_F_s; │ │ │ │ │ +226} │ │ │ │ │ +227 │ │ │ │ │ +228 │ │ │ │ │ +229 │ │ │ │ │ +230} // namespace Functions │ │ │ │ │ +231} // namespace Dune │ │ │ │ │ +232 │ │ │ │ │ +233#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBENTITYDOFS_HH │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_u_b_E_n_t_i_t_y_D_O_F_s │ │ │ │ │ +auto subEntityDOFs(const T &) │ │ │ │ │ +Create SubEntityDOFs object. │ │ │ │ │ +DDeeffiinniittiioonn subentitydofs.hh:164 │ │ │ │ │ +_D_u_n_e │ │ │ │ │ +DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_E_n_t_i_t_y_D_O_F_s │ │ │ │ │ +Range of DOFs associated to sub-entity. │ │ │ │ │ +DDeeffiinniittiioonn subentitydofs.hh:46 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_E_n_t_i_t_y_D_O_F_s_:_:_b_e_g_i_n │ │ │ │ │ +auto begin() const │ │ │ │ │ +Create begin iterator for access to range of contained local indices. │ │ │ │ │ +DDeeffiinniittiioonn subentitydofs.hh:114 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_E_n_t_i_t_y_D_O_F_s_:_:_s_i_z_e │ │ │ │ │ +auto size() const │ │ │ │ │ +Return number of contained DOFs. │ │ │ │ │ +DDeeffiinniittiioonn subentitydofs.hh:126 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_E_n_t_i_t_y_D_O_F_s_:_:_b_i_n_d │ │ │ │ │ +SubEntityDOFs & bind(const LocalView &localView, const Intersection │ │ │ │ │ +&intersection) │ │ │ │ │ +Bind SubEntityDOFs object to LocalView and sub-entity. │ │ │ │ │ +DDeeffiinniittiioonn subentitydofs.hh:108 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_E_n_t_i_t_y_D_O_F_s_:_:_c_o_n_t_a_i_n_s │ │ │ │ │ +bool contains(std::size_t localIndex) const │ │ │ │ │ +Check if given local index is contained in this range of DOFs. │ │ │ │ │ +DDeeffiinniittiioonn subentitydofs.hh:138 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_E_n_t_i_t_y_D_O_F_s_:_:_e_n_d │ │ │ │ │ +auto end() const │ │ │ │ │ +Create end iterator for access to range of contained local indices. │ │ │ │ │ +DDeeffiinniittiioonn subentitydofs.hh:120 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_E_n_t_i_t_y_D_O_F_s_:_:_b_i_n_d │ │ │ │ │ +SubEntityDOFs & bind(const LocalView &localView, std::size_t subEntityIndex, │ │ │ │ │ +std::size_t subEntityCodim) │ │ │ │ │ +Bind SubEntityDOFs object to LocalView and sub-entity. │ │ │ │ │ +DDeeffiinniittiioonn subentitydofs.hh:68 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00191.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: compositebasis.hh File Reference │ │ │ │ +dune-functions: subspacebasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,52 +71,55 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
compositebasis.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
subspacebasis.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <tuple>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ │ -#include <dune/common/reservedvector.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 <dune/common/concept.hh>
│ │ │ │ +#include <dune/functions/common/type_traits.hh>
│ │ │ │ +#include <dune/functions/functionspacebases/subspacelocalview.hh>
│ │ │ │ #include <dune/functions/functionspacebases/concepts.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/containerdescriptors.hh>
│ │ │ │ -#include <dune/functions/functionspacebases/defaultglobalbasis.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::SubspaceBasis< RB, TP >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +

│ │ │ │ Namespaces

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

│ │ │ │ +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.
 
template<class RootBasis , class... PrefixTreeIndices>
auto Dune::Functions::subspaceBasis (const RootBasis &rootBasis, const PrefixTreeIndices &... prefixTreeIndices)
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,40 +1,46 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -compositebasis.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +subspacebasis.hh File Reference │ │ │ │ │ #include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_s_t_a_t_i_c_f_o_r_l_o_o_p_._h_h> │ │ │ │ │ +#include │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_u_t_i_l_i_t_y_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_b_a_s_i_s_t_a_g_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_s_u_b_s_p_a_c_e_l_o_c_a_l_v_i_e_w_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_<_ _I_M_S_,_ _S_P_B_ _> │ │ │ │ │ -  A pre-basis for composite bases. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_<_ _R_B_,_ _T_P_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s (const RB &, const TP) -> _S_u_b_s_p_a_c_e_B_a_s_i_s< │ │ │ │ │ + RB, TP > │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_B_u_i_l_d_e_r │ │ │ │ │ +template │ │ │ │ │ +   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s (const _S_u_b_s_p_a_c_e_B_a_s_i_s< RootRootBasis, │ │ │ │ │ + InnerTP > &rootBasis, const OuterTP &prefixPath) -> _S_u_b_s_p_a_c_e_B_a_s_i_s< std:: │ │ │ │ │ + decay_t< decltype(rootBasis.rootBasis())>, Impl::JoinTreePath_t< InnerTP, │ │ │ │ │ + OuterTP > > │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_u_b_s_p_a_c_e_B_a_s_i_s (const RootBasis &rootBasis, const │ │ │ │ │ + TypeTree::HybridTreePath< PrefixTreeIndices... > &prefixPath) │ │ │ │ │ +  Create _S_u_b_s_p_a_c_e_B_a_s_i_s from a root basis and a prefixPath. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_u_b_s_p_a_c_e_B_a_s_i_s (const RootBasis &rootBasis, const │ │ │ │ │ + PrefixTreeIndices &... prefixTreeIndices) │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00191_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: compositebasis.hh Source File │ │ │ │ +dune-functions: subspacebasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,481 +74,210 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
compositebasis.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_COMPOSITEBASIS_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_COMPOSITEBASIS_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACEBASIS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACEBASIS_HH
│ │ │ │
9
│ │ │ │ -
10#include <tuple>
│ │ │ │ -
11#include <utility>
│ │ │ │ -
12
│ │ │ │ -
13#include <dune/common/hybridutilities.hh>
│ │ │ │ -
14#include <dune/common/reservedvector.hh>
│ │ │ │ -
15#include <dune/common/typeutilities.hh>
│ │ │ │ -
16#include <dune/common/hybridutilities.hh>
│ │ │ │ -
17#include <dune/common/tupleutility.hh>
│ │ │ │ -
18#include <dune/common/tuplevector.hh>
│ │ │ │ +
10#include <dune/common/reservedvector.hh>
│ │ │ │ +
11#include <dune/common/typeutilities.hh>
│ │ │ │ +
12#include <dune/common/concept.hh>
│ │ │ │ +
13
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
17
│ │ │ │ +
18
│ │ │ │
19
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
28
│ │ │ │ -
29
│ │ │ │ -
30namespace Dune {
│ │ │ │ -
31namespace Functions {
│ │ │ │ +
20namespace Dune {
│ │ │ │ +
21namespace Functions {
│ │ │ │ +
22
│ │ │ │ +
23
│ │ │ │ +
24
│ │ │ │ +
25namespace Impl {
│ │ │ │ +
26
│ │ │ │ +
27 template<class... Inner, class... Outer>
│ │ │ │ +
28 auto joinTreePaths(const TypeTree::HybridTreePath<Inner...>& inner, const TypeTree::HybridTreePath<Outer...> outer)
│ │ │ │ +
29 {
│ │ │ │ +
30 return TypeTree::HybridTreePath<Inner..., Outer...>(std::tuple_cat(inner._data, outer._data));
│ │ │ │ +
31 }
│ │ │ │
32
│ │ │ │ -
33// *****************************************************************************
│ │ │ │ -
34// This is the reusable part of the composite bases. It contains
│ │ │ │ -
35//
│ │ │ │ -
36// CompositePreBasis
│ │ │ │ -
37//
│ │ │ │ -
38// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ -
39// state. These components do _not_ depend on the global basis and local view
│ │ │ │ -
40// and can be used without a global basis.
│ │ │ │ -
41// *****************************************************************************
│ │ │ │ -
42
│ │ │ │ -
43
│ │ │ │ -
55template<class IMS, class... SPB>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
57{
│ │ │ │ -
58 static const bool isBlocked = std::is_same_v<IMS,BasisFactory::BlockedLexicographic> or std::is_same_v<IMS,BasisFactory::BlockedInterleaved>;
│ │ │ │ -
59public:
│ │ │ │ -
60
│ │ │ │ -
62 using SubPreBases = std::tuple<SPB...>;
│ │ │ │ +
33 template<class InnerTP, class OuterTP>
│ │ │ │ +
34 using JoinTreePath_t = std::decay_t<decltype(joinTreePaths(std::declval<InnerTP>(), std::declval<OuterTP>()))>;
│ │ │ │ +
35
│ │ │ │ +
36}
│ │ │ │ +
37
│ │ │ │ +
38
│ │ │ │ +
39
│ │ │ │ +
40template<class RB, class TP>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
42{
│ │ │ │ +
43public:
│ │ │ │ +
44
│ │ │ │ +
45 using RootBasis = RB;
│ │ │ │ +
46
│ │ │ │ +
47 using RootLocalView = typename RootBasis::LocalView;
│ │ │ │ +
48
│ │ │ │ +
49 using PrefixPath = TP;
│ │ │ │ +
50
│ │ │ │ +
52 using GridView = typename RootBasis::GridView;
│ │ │ │ +
53
│ │ │ │ +
55 using MultiIndex = typename RootBasis::MultiIndex;
│ │ │ │ +
56
│ │ │ │ +
57 using size_type = std::size_t;
│ │ │ │ +
58
│ │ │ │ + │ │ │ │ +
61
│ │ │ │ +
62 using SizePrefix = typename RootBasis::SizePrefix;
│ │ │ │
63
│ │ │ │ -
65 template<std::size_t i>
│ │ │ │ -
66 using SubPreBasis = std::tuple_element_t<i, SubPreBases>;
│ │ │ │ -
67
│ │ │ │ -
69 using GridView = typename std::tuple_element_t<0, SubPreBases>::GridView;
│ │ │ │ +
64
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
69 {}
│ │ │ │ +
│ │ │ │
70
│ │ │ │ -
72 using size_type = std::size_t;
│ │ │ │ -
73
│ │ │ │ - │ │ │ │ -
76
│ │ │ │ -
77protected:
│ │ │ │ -
78 static const std::size_t children = sizeof...(SPB);
│ │ │ │ -
79
│ │ │ │ -
80 using ChildIndices = std::make_index_sequence<children>;
│ │ │ │ +
76 template<class RootRootBasis, class InnerTP, class OuterTP>
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
79 {}
│ │ │ │ +
│ │ │ │ +
80
│ │ │ │
81
│ │ │ │ -
82public:
│ │ │ │ -
83
│ │ │ │ -
85 using Node = CompositeBasisNode<typename SPB::Node...>;
│ │ │ │ -
86
│ │ │ │ -
87 static constexpr size_type maxMultiIndexSize = std::max({SPB::maxMultiIndexSize...}) + isBlocked;
│ │ │ │ -
88 static constexpr size_type minMultiIndexSize = std::min({SPB::minMultiIndexSize...}) + isBlocked;
│ │ │ │ -
89 static constexpr size_type multiIndexBufferSize = std::max({SPB::multiIndexBufferSize...}) + isBlocked;
│ │ │ │ -
90
│ │ │ │ -
96 template<class... SFArgs,
│ │ │ │ -
97 disableCopyMove<CompositePreBasis, SFArgs...> = 0,
│ │ │ │ -
98 enableIfConstructible<std::tuple<SPB...>, SFArgs...> = 0>
│ │ │ │ -
│ │ │ │ -
99 CompositePreBasis(SFArgs&&... sfArgs) :
│ │ │ │ -
100 subPreBases_(std::forward<SFArgs>(sfArgs)...)
│ │ │ │ -
101 {
│ │ │ │ -
102 Hybrid::forEach(subPreBases_, [&](const auto& subPreBasis){
│ │ │ │ -
103 static_assert(models<Concept::PreBasis<GridView>, std::decay_t<decltype(subPreBasis)>>(), "Subprebases passed to CompositePreBasis does not model the PreBasis concept.");
│ │ │ │ -
104 });
│ │ │ │ -
105 }
│ │ │ │ -
│ │ │ │ -
106
│ │ │ │ -
113 template<class GV,
│ │ │ │ -
114 std::enable_if_t<std::conjunction_v<
│ │ │ │ -
115 std::bool_constant<(children > 1)>, // Avoid ambiguous constructor if there's only one child
│ │ │ │ -
116 std::is_same<GV, GridView>,
│ │ │ │ -
117 std::is_constructible<SPB, GridView>...
│ │ │ │ -
118 >, int> = 0>
│ │ │ │ -
│ │ │ │ -
119 CompositePreBasis(const GV& gv) :
│ │ │ │ -
120 subPreBases_(SPB(gv)...)
│ │ │ │ -
121 {
│ │ │ │ -
122 Hybrid::forEach(subPreBases_, [&](const auto& subPreBasis){
│ │ │ │ -
123 static_assert(models<Concept::PreBasis<GridView>, std::decay_t<decltype(subPreBasis)>>(), "Subprebases passed to CompositePreBasis does not model the PreBasis concept.");
│ │ │ │ -
124 });
│ │ │ │ +
│ │ │ │ +
84 const GridView& gridView() const
│ │ │ │ +
85 {
│ │ │ │ +
86 return rootBasis_->gridView();
│ │ │ │ +
87 }
│ │ │ │ +
│ │ │ │ +
88
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
93 {
│ │ │ │ +
94 return rootBasis_->dimension();
│ │ │ │ +
95 }
│ │ │ │ +
│ │ │ │ +
96
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
99 {
│ │ │ │ +
100 return rootBasis_->size();
│ │ │ │ +
101 }
│ │ │ │ +
│ │ │ │ +
102
│ │ │ │ +
│ │ │ │ +
104 size_type size(const SizePrefix& prefix) const
│ │ │ │ +
105 {
│ │ │ │ +
106 return rootBasis_->size(prefix);
│ │ │ │ +
107 }
│ │ │ │ +
│ │ │ │ +
108
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
113 {
│ │ │ │ +
114 return LocalView(*this, prefixPath_);
│ │ │ │ +
115 }
│ │ │ │ +
│ │ │ │ +
116
│ │ │ │ +
│ │ │ │ +
117 const RootBasis& rootBasis() const
│ │ │ │ +
118 {
│ │ │ │ +
119 return *rootBasis_;
│ │ │ │ +
120 }
│ │ │ │ +
│ │ │ │ +
121
│ │ │ │ +
│ │ │ │ +
122 const PrefixPath& prefixPath() const
│ │ │ │ +
123 {
│ │ │ │ +
124 return prefixPath_;
│ │ │ │
125 }
│ │ │ │
│ │ │ │
126
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
129 {
│ │ │ │ -
130 Hybrid::forEach(ChildIndices(), [&](auto i) {
│ │ │ │ -
131 this->subPreBasis(i).initializeIndices();
│ │ │ │ -
132 });
│ │ │ │ -
133 }
│ │ │ │ -
│ │ │ │ -
134
│ │ │ │ -
│ │ │ │ -
136 const GridView& gridView() const
│ │ │ │ -
137 {
│ │ │ │ -
138 return std::get<0>(subPreBases_).gridView();
│ │ │ │ -
139 }
│ │ │ │ -
│ │ │ │ -
140
│ │ │ │ -
│ │ │ │ -
142 void update(const GridView& gv)
│ │ │ │ -
143 {
│ │ │ │ -
144 Hybrid::forEach(ChildIndices(), [&](auto i) {
│ │ │ │ -
145 this->subPreBasis(i).update(gv);
│ │ │ │ -
146 });
│ │ │ │ -
147 }
│ │ │ │ -
│ │ │ │ -
148
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
153 {
│ │ │ │ -
154 auto node = Node{};
│ │ │ │ -
155 Hybrid::forEach(ChildIndices(), [&](auto i) {
│ │ │ │ -
156 node.setChild(this->subPreBasis(i).makeNode(), i);
│ │ │ │ -
157 });
│ │ │ │ -
158 return node;
│ │ │ │ -
159 }
│ │ │ │ -
│ │ │ │ -
160
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
163 {
│ │ │ │ -
164 return size(Dune::ReservedVector<size_type, multiIndexBufferSize>{});
│ │ │ │ -
165 }
│ │ │ │ +
127protected:
│ │ │ │ + │ │ │ │ + │ │ │ │ +
130};
│ │ │ │ +
│ │ │ │ +
131
│ │ │ │ +
132
│ │ │ │ +
133// CTAD guide for a non-SubspaceBasis root basis
│ │ │ │ +
134template<class RB, class TP>
│ │ │ │ +
135SubspaceBasis(const RB&, const TP) -> SubspaceBasis<RB, TP>;
│ │ │ │ +
136
│ │ │ │ +
137// CTAD guide for a SubspaceBasis root basis
│ │ │ │ +
138template<class RootRootBasis, class InnerTP, class OuterTP>
│ │ │ │ +
139SubspaceBasis(const SubspaceBasis<RootRootBasis, InnerTP>& rootBasis, const OuterTP& prefixPath)
│ │ │ │ +
140 -> SubspaceBasis<std::decay_t<decltype(rootBasis.rootBasis())>, Impl::JoinTreePath_t<InnerTP, OuterTP>>;
│ │ │ │ +
141
│ │ │ │ +
142
│ │ │ │ +
143
│ │ │ │ +
154template<class RootBasis, class... PrefixTreeIndices>
│ │ │ │ +
│ │ │ │ +
155auto subspaceBasis(const RootBasis& rootBasis, const TypeTree::HybridTreePath<PrefixTreeIndices...>& prefixPath)
│ │ │ │ +
156{
│ │ │ │ +
157 return SubspaceBasis(rootBasis, prefixPath);
│ │ │ │ +
158}
│ │ │ │ +
│ │ │ │ +
159
│ │ │ │ +
160template<class RootBasis, class... PrefixTreeIndices>
│ │ │ │ +
│ │ │ │ +
161auto subspaceBasis(const RootBasis& rootBasis, const PrefixTreeIndices&... prefixTreeIndices)
│ │ │ │ +
162{
│ │ │ │ +
163 return subspaceBasis(rootBasis, TypeTree::hybridTreePath(prefixTreeIndices...));
│ │ │ │ +
164}
│ │ │ │
│ │ │ │ +
165
│ │ │ │
166
│ │ │ │ -
168 template<class SizePrefix>
│ │ │ │ -
│ │ │ │ -
169 size_type size(const SizePrefix& prefix) const
│ │ │ │ -
170 {
│ │ │ │ -
171 return size(prefix, IndexMergingStrategy{});
│ │ │ │ -
172 }
│ │ │ │ -
│ │ │ │ -
173
│ │ │ │ -
174private:
│ │ │ │ -
175
│ │ │ │ -
176 template<class MultiIndex>
│ │ │ │ -
177 static void multiIndexPopFront(MultiIndex& M)
│ │ │ │ -
178 {
│ │ │ │ -
179 for(std::size_t i=0; i<M.size()-1; ++i)
│ │ │ │ -
180 M[i] = M[i+1];
│ │ │ │ -
181 M.resize(M.size()-1);
│ │ │ │ -
182 }
│ │ │ │ -
183
│ │ │ │ -
184 template<class SizePrefix>
│ │ │ │ -
185 size_type size(SizePrefix prefix, BasisFactory::BlockedLexicographic) const
│ │ │ │ -
186 {
│ │ │ │ -
187 if (prefix.size() == 0)
│ │ │ │ -
188 return children;
│ │ │ │ -
189
│ │ │ │ -
190 auto front = prefix.front();
│ │ │ │ -
191 multiIndexPopFront(prefix);
│ │ │ │ -
192 return Hybrid::switchCases(ChildIndices(), front, [&] (auto i) {
│ │ │ │ -
193 return this->subPreBasis(i).size(prefix);
│ │ │ │ -
194 }, []() {
│ │ │ │ -
195 return size_type(0);
│ │ │ │ -
196 });
│ │ │ │ -
197 }
│ │ │ │ -
198
│ │ │ │ -
199 template<class SizePrefix>
│ │ │ │ -
200 size_type size(SizePrefix prefix, BasisFactory::FlatLexicographic) const
│ │ │ │ -
201 {
│ │ │ │ -
202 size_type result = 0;
│ │ │ │ -
203 if (prefix.size() == 0)
│ │ │ │ -
204 Hybrid::forEach(ChildIndices(), [&](auto i) {
│ │ │ │ -
205 result += this->subPreBasis(i).size();
│ │ │ │ -
206 });
│ │ │ │ -
207 else {
│ │ │ │ -
208 staticFindInRange<0, children>([&](auto i) {
│ │ │ │ -
209 auto firstDigitSize = this->subPreBasis(i).size();
│ │ │ │ -
210 if (prefix[0] < firstDigitSize)
│ │ │ │ -
211 {
│ │ │ │ -
212 result = this->subPreBasis(i).size(prefix);
│ │ │ │ -
213 return true;
│ │ │ │ -
214 }
│ │ │ │ -
215 prefix[0] -= firstDigitSize;
│ │ │ │ -
216 return false;
│ │ │ │ -
217 });
│ │ │ │ -
218 }
│ │ │ │ -
219 return result;
│ │ │ │ -
220 }
│ │ │ │ -
221
│ │ │ │ -
222public:
│ │ │ │ -
223
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
226 {
│ │ │ │ -
227 size_type r=0;
│ │ │ │ -
228 // Accumulate dimension() for all subprebases
│ │ │ │ -
229 Hybrid::forEach(ChildIndices(), [&](auto i) {
│ │ │ │ -
230 r += this->subPreBasis(i).dimension();
│ │ │ │ -
231 });
│ │ │ │ -
232 return r;
│ │ │ │ -
233 }
│ │ │ │ -
│ │ │ │ -
234
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
237 {
│ │ │ │ -
238 size_type r=0;
│ │ │ │ -
239 // Accumulate maxNodeSize() for all subprebases
│ │ │ │ -
240 Hybrid::forEach(ChildIndices(), [&](auto i) {
│ │ │ │ -
241 r += this->subPreBasis(i).maxNodeSize();
│ │ │ │ -
242 });
│ │ │ │ -
243 return r;
│ │ │ │ -
244 }
│ │ │ │ -
│ │ │ │ -
245
│ │ │ │ -
247 template<std::size_t i>
│ │ │ │ -
│ │ │ │ -
248 const SubPreBasis<i>& subPreBasis(Dune::index_constant<i> = {}) const
│ │ │ │ -
249 {
│ │ │ │ -
250 return std::get<i>(subPreBases_);
│ │ │ │ -
251 }
│ │ │ │ -
│ │ │ │ -
252
│ │ │ │ -
254 template<std::size_t i>
│ │ │ │ -
│ │ │ │ -
255 SubPreBasis<i>& subPreBasis(Dune::index_constant<i> = {})
│ │ │ │ -
256 {
│ │ │ │ -
257 return std::get<i>(subPreBases_);
│ │ │ │ -
258 }
│ │ │ │ -
│ │ │ │ -
259
│ │ │ │ -
│ │ │ │ -
261 const auto& subPreBases() const
│ │ │ │ -
262 {
│ │ │ │ -
263 return subPreBases_;
│ │ │ │ -
264 }
│ │ │ │ -
│ │ │ │ -
265
│ │ │ │ -
267 template<typename It>
│ │ │ │ -
│ │ │ │ -
268 It indices(const Node& node, It it) const
│ │ │ │ -
269 {
│ │ │ │ -
270 return indices(node, it, IndexMergingStrategy{});
│ │ │ │ -
271 }
│ │ │ │ -
│ │ │ │ -
272
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
275 {
│ │ │ │ - │ │ │ │ -
277 if constexpr(std::is_same_v<IMS, BasisFactory::BlockedLexicographic>) {
│ │ │ │ -
278 return std::apply([&](auto const&... spb) {
│ │ │ │ -
279 return CD::makeDescriptor(Dune::Functions::containerDescriptor(spb)...);
│ │ │ │ -
280 }, subPreBases_);
│ │ │ │ -
281 }
│ │ │ │ -
282 else if constexpr(std::is_same_v<IMS, BasisFactory::FlatLexicographic>) {
│ │ │ │ -
283 return CD::Unknown{}; // Not yet implemented
│ │ │ │ -
284 }
│ │ │ │ -
285 else
│ │ │ │ -
286 return CD::Unknown{};
│ │ │ │ -
287 }
│ │ │ │ -
│ │ │ │ -
288
│ │ │ │ -
289private:
│ │ │ │ -
290
│ │ │ │ -
291 template<typename It>
│ │ │ │ -
292 It indices(const Node& node, It multiIndices, BasisFactory::FlatLexicographic) const
│ │ │ │ -
293 {
│ │ │ │ -
294 size_type firstComponentOffset = 0;
│ │ │ │ -
295 // Loop over all children
│ │ │ │ -
296 Hybrid::forEach(ChildIndices(), [&](auto child){
│ │ │ │ -
297 size_type subTreeSize = node.child(child).size();
│ │ │ │ -
298 // Fill indices for current child into index buffer starting from current
│ │ │ │ -
299 // buffer position and shift first index component of any index for current
│ │ │ │ -
300 // child by suitable offset to get lexicographic indices.
│ │ │ │ -
301 subPreBasis(child).indices(node.child(child), multiIndices);
│ │ │ │ -
302 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
303 multiIndices[i][0] += firstComponentOffset;
│ │ │ │ -
304 // Increment offset by the size for first index component of the current child
│ │ │ │ -
305 firstComponentOffset += subPreBasis(child).size();
│ │ │ │ -
306 // Increment buffer iterator by the number of indices processed for current child
│ │ │ │ -
307 multiIndices += subTreeSize;
│ │ │ │ -
308 });
│ │ │ │ -
309 return multiIndices;
│ │ │ │ -
310 }
│ │ │ │ -
311
│ │ │ │ -
312 template<class MultiIndex>
│ │ │ │ -
313 static void multiIndexPushFront(MultiIndex& M, size_type M0)
│ │ │ │ -
314 {
│ │ │ │ -
315 M.resize(M.size()+1);
│ │ │ │ -
316 for(std::size_t i=M.size()-1; i>0; --i)
│ │ │ │ -
317 M[i] = M[i-1];
│ │ │ │ -
318 M[0] = M0;
│ │ │ │ -
319 }
│ │ │ │ -
320
│ │ │ │ -
321 template<typename It>
│ │ │ │ -
322 It indices(const Node& node, It multiIndices, BasisFactory::BlockedLexicographic) const
│ │ │ │ -
323 {
│ │ │ │ -
324 // Loop over all children
│ │ │ │ -
325 Hybrid::forEach(ChildIndices(), [&](auto child){
│ │ │ │ -
326 size_type subTreeSize = node.child(child).size();
│ │ │ │ -
327 // Fill indices for current child into index buffer starting from current position
│ │ │ │ -
328 subPreBasis(child).indices(node.child(child), multiIndices);
│ │ │ │ -
329 // Insert child index before first component of all indices of current child.
│ │ │ │ -
330 for (std::size_t i = 0; i<subTreeSize; ++i)
│ │ │ │ -
331 this->multiIndexPushFront(multiIndices[i], child);
│ │ │ │ -
332 // Increment buffer iterator by the number of indices processed for current child
│ │ │ │ -
333 multiIndices += subTreeSize;
│ │ │ │ -
334 });
│ │ │ │ -
335 return multiIndices;
│ │ │ │ -
336 }
│ │ │ │ -
337
│ │ │ │ -
338 std::tuple<SPB...> subPreBases_;
│ │ │ │ -
339};
│ │ │ │ -
│ │ │ │ -
340
│ │ │ │ -
341
│ │ │ │ -
342
│ │ │ │ -
343namespace BasisFactory {
│ │ │ │ -
344
│ │ │ │ -
345namespace Imp {
│ │ │ │ -
346
│ │ │ │ -
347template<class IndexMergingStrategy, class... ChildPreBasisFactory>
│ │ │ │ -
348class CompositePreBasisFactory
│ │ │ │ -
349{
│ │ │ │ -
350
│ │ │ │ -
351 template<class GridView, class... ChildPreBasis>
│ │ │ │ -
352 auto makePreBasisFromChildPreBases(const GridView&, ChildPreBasis&&... childPreBasis) const
│ │ │ │ -
353 {
│ │ │ │ -
354 return CompositePreBasis<IndexMergingStrategy, std::decay_t<ChildPreBasis>...>(std::forward<ChildPreBasis>(childPreBasis)...);
│ │ │ │ -
355 }
│ │ │ │ -
356
│ │ │ │ -
357public:
│ │ │ │ -
358
│ │ │ │ -
359 CompositePreBasisFactory(const ChildPreBasisFactory&... childPreBasisFactory) :
│ │ │ │ -
360 childPreBasisFactories_(childPreBasisFactory...)
│ │ │ │ -
361 {}
│ │ │ │ -
362
│ │ │ │ -
363 CompositePreBasisFactory(ChildPreBasisFactory&&... childPreBasisFactory) :
│ │ │ │ -
364 childPreBasisFactories_(std::move(childPreBasisFactory)...)
│ │ │ │ -
365 {}
│ │ │ │ -
366
│ │ │ │ -
367 template<class GridView>
│ │ │ │ -
368 auto operator()(const GridView& gridView) const
│ │ │ │ -
369 {
│ │ │ │ -
370 // Use std::apply to unpack the tuple childPreBasisFactories_
│ │ │ │ -
371 return std::apply([&](const auto&... childPreBasisFactory) {
│ │ │ │ -
372 return this->makePreBasisFromChildPreBases(gridView, childPreBasisFactory(gridView)...);
│ │ │ │ -
373 }, childPreBasisFactories_);
│ │ │ │ -
374 }
│ │ │ │ -
375
│ │ │ │ -
376private:
│ │ │ │ -
377 std::tuple<ChildPreBasisFactory...> childPreBasisFactories_;
│ │ │ │ -
378};
│ │ │ │ -
379
│ │ │ │ -
380} // end namespace BasisFactory::Imp
│ │ │ │ -
381
│ │ │ │ -
382
│ │ │ │ -
383
│ │ │ │ -
394template<
│ │ │ │ -
395 typename... Args,
│ │ │ │ -
396 std::enable_if_t<Concept::isIndexMergingStrategy<typename LastType<Args...>::type>(),int> = 0>
│ │ │ │ -
397auto composite(Args&&... args)
│ │ │ │ -
398{
│ │ │ │ -
399 // We have to separate the last entry which is the IndexMergingStrategy
│ │ │ │ -
400 // and the preceding ones, which are the ChildPreBasisFactories
│ │ │ │ -
401
│ │ │ │ -
402 using ArgTuple = std::tuple<std::decay_t<Args>...>;
│ │ │ │ -
403
│ │ │ │ -
404 // Compute number of children and index of the IndexMergingStrategy argument
│ │ │ │ -
405 constexpr std::size_t children = sizeof...(Args) - 1;
│ │ │ │ -
406
│ │ │ │ -
407 // Use last type as IndexMergingStrategy
│ │ │ │ -
408 using IndexMergingStrategy = std::tuple_element_t<children, ArgTuple>;
│ │ │ │ -
409
│ │ │ │ -
410 // Index sequence for all but the last entry for partial tuple unpacking
│ │ │ │ -
411 auto childIndices = std::make_index_sequence<children>{};
│ │ │ │ -
412
│ │ │ │ -
413 // Unpack tuple only for those entries related to children
│ │ │ │ -
414 return applyPartial([](auto&&... childPreBasisFactory){
│ │ │ │ -
415 return Imp::CompositePreBasisFactory<IndexMergingStrategy, std::decay_t<decltype(childPreBasisFactory)>...>(std::forward<decltype(childPreBasisFactory)>(childPreBasisFactory)...);
│ │ │ │ -
416 },
│ │ │ │ -
417 std::forward_as_tuple(std::forward<Args>(args)...),
│ │ │ │ -
418 childIndices);
│ │ │ │ -
419}
│ │ │ │ -
420
│ │ │ │ -
432template<
│ │ │ │ -
433 typename... Args,
│ │ │ │ -
434 std::enable_if_t<not Concept::isIndexMergingStrategy<typename LastType<Args...>::type>(),int> = 0>
│ │ │ │ -
435auto composite(Args&&... args)
│ │ │ │ -
436{
│ │ │ │ -
437 return Imp::CompositePreBasisFactory<BasisFactory::BlockedLexicographic, std::decay_t<Args>...>(std::forward<Args>(args)...);
│ │ │ │ -
438}
│ │ │ │ -
439
│ │ │ │ -
440} // end namespace BasisFactory
│ │ │ │ -
441
│ │ │ │ -
442// Backward compatibility
│ │ │ │ -
443namespace [[deprecated("Will be removed after Dune 2.10")]] BasisBuilder {
│ │ │ │ -
444
│ │ │ │ -
445 using namespace BasisFactory;
│ │ │ │ -
446
│ │ │ │ -
447}
│ │ │ │ -
448
│ │ │ │ -
449
│ │ │ │ -
450
│ │ │ │ -
451} // end namespace Functions
│ │ │ │ -
452} // end namespace Dune
│ │ │ │ -
453
│ │ │ │ -
454
│ │ │ │ -
455#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_COMPOSITEBASIS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
std::enable_if_t< std::is_constructible_v< T, Args... >, int > enableIfConstructible
Helper to constrain forwarding constructors.
Definition type_traits.hh:31
│ │ │ │ +
167
│ │ │ │ +
168} // end namespace Functions
│ │ │ │ +
169} // end namespace Dune
│ │ │ │ +
170
│ │ │ │ +
171
│ │ │ │ +
172
│ │ │ │ +
173#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
auto containerDescriptor(const PreBasis &preBasis)
Return the container descriptor of the pre-basis, if defined, otherwise ContainerDescriptor::Unknown.
Definition containerdescriptors.hh:73
│ │ │ │ -
static constexpr bool isIndexMergingStrategy()
Definition basistags.hh:27
│ │ │ │ -
Definition containerdescriptors.hh:47
│ │ │ │ -
Lexicographic merging of direct children without blocking.
Definition basistags.hh:84
│ │ │ │ -
A pre-basis for composite bases.
Definition compositebasis.hh:57
│ │ │ │ -
SubPreBasis< i > & subPreBasis(Dune::index_constant< i >={})
Mutable access to the stored prebasis of the factor in the power space.
Definition compositebasis.hh:255
│ │ │ │ -
IMS IndexMergingStrategy
Strategy used to merge the global indices of the child pre-bases.
Definition compositebasis.hh:75
│ │ │ │ -
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition compositebasis.hh:236
│ │ │ │ -
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:248
│ │ │ │ -
std::size_t size_type
Type used for indices and size information.
Definition compositebasis.hh:72
│ │ │ │ -
CompositeBasisNode< typename SPB::Node... > Node
Template mapping root tree path to type of created tree node.
Definition compositebasis.hh:85
│ │ │ │ -
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition compositebasis.hh:169
│ │ │ │ -
CompositePreBasis(SFArgs &&... sfArgs)
Constructor for given child pre-basis objects.
Definition compositebasis.hh:99
│ │ │ │ -
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition compositebasis.hh:225
│ │ │ │ -
CompositePreBasis(const GV &gv)
Constructor for given GridView.
Definition compositebasis.hh:119
│ │ │ │ -
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:268
│ │ │ │ -
size_type size() const
Same as size(prefix) with empty prefix.
Definition compositebasis.hh:162
│ │ │ │ -
typename std::tuple_element_t< 0, SubPreBases >::GridView GridView
The grid view that the FE basis is defined on.
Definition compositebasis.hh:69
│ │ │ │ -
static const std::size_t children
Definition compositebasis.hh:78
│ │ │ │ -
std::tuple< SPB... > SubPreBases
Tuple of child pre-bases.
Definition compositebasis.hh:62
│ │ │ │ -
Node makeNode() const
Create tree node.
Definition compositebasis.hh:152
│ │ │ │ -
void initializeIndices()
Initialize the global indices.
Definition compositebasis.hh:128
│ │ │ │ -
std::tuple_element_t< i, SubPreBases > SubPreBasis
Export individual child pre-bases by index.
Definition compositebasis.hh:66
│ │ │ │ -
std::make_index_sequence< children > ChildIndices
Definition compositebasis.hh:80
│ │ │ │ -
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition compositebasis.hh:142
│ │ │ │ -
static constexpr size_type multiIndexBufferSize
Definition compositebasis.hh:89
│ │ │ │ -
const auto & subPreBases() const
Const access to the stored prebases tuple.
Definition compositebasis.hh:261
│ │ │ │ -
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition compositebasis.hh:136
│ │ │ │ -
static constexpr size_type minMultiIndexSize
Definition compositebasis.hh:88
│ │ │ │ -
auto containerDescriptor() const
Return the associated container descriptor.
Definition compositebasis.hh:274
│ │ │ │ -
static constexpr size_type maxMultiIndexSize
Definition compositebasis.hh:87
│ │ │ │ - │ │ │ │ +
auto subspaceBasis(const RootBasis &rootBasis, const TypeTree::HybridTreePath< PrefixTreeIndices... > &prefixPath)
Create SubspaceBasis from a root basis and a prefixPath.
Definition subspacebasis.hh:155
│ │ │ │ +
Definition subspacebasis.hh:42
│ │ │ │ +
typename RootBasis::LocalView RootLocalView
Definition subspacebasis.hh:47
│ │ │ │ +
LocalView localView() const
Return local view for basis.
Definition subspacebasis.hh:112
│ │ │ │ +
const RootBasis * rootBasis_
Definition subspacebasis.hh:128
│ │ │ │ +
typename RootBasis::SizePrefix SizePrefix
Definition subspacebasis.hh:62
│ │ │ │ +
TP PrefixPath
Definition subspacebasis.hh:49
│ │ │ │ +
SubspaceLocalView< RootLocalView, PrefixPath > LocalView
Type of the local view on the restriction of the basis to a single element.
Definition subspacebasis.hh:60
│ │ │ │ +
size_type size(const SizePrefix &prefix) const
Return number possible values for next position in multi index.
Definition subspacebasis.hh:104
│ │ │ │ +
typename RootBasis::GridView GridView
The grid view that the FE space is defined on.
Definition subspacebasis.hh:52
│ │ │ │ +
const PrefixPath & prefixPath() const
Definition subspacebasis.hh:122
│ │ │ │ +
SubspaceBasis(const SubspaceBasis< RootRootBasis, InnerTP > &rootBasis, const OuterTP &prefixPath)
Constructor from another SubspaceBasis.
Definition subspacebasis.hh:77
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition subspacebasis.hh:84
│ │ │ │ +
RB RootBasis
Definition subspacebasis.hh:45
│ │ │ │ +
PrefixPath prefixPath_
Definition subspacebasis.hh:129
│ │ │ │ +
size_type size() const
Return number of possible values for next position in empty multi index.
Definition subspacebasis.hh:98
│ │ │ │ +
const RootBasis & rootBasis() const
Definition subspacebasis.hh:117
│ │ │ │ +
typename RootBasis::MultiIndex MultiIndex
Type used for global numbering of the basis vectors.
Definition subspacebasis.hh:55
│ │ │ │ +
size_type dimension() const
Definition subspacebasis.hh:92
│ │ │ │ +
std::size_t size_type
Definition subspacebasis.hh:57
│ │ │ │ +
SubspaceBasis(const RootBasis &rootBasis, const PrefixPath &prefixPath)
Constructor for a given grid view object.
Definition subspacebasis.hh:66
│ │ │ │ +
The restriction of a finite element basis to a single element.
Definition subspacelocalview.hh:34
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,566 +1,249 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -compositebasis.hh │ │ │ │ │ +subspacebasis.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_COMPOSITEBASIS_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_COMPOSITEBASIS_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACEBASIS_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_SUBSPACEBASIS_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12 │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17#include │ │ │ │ │ -18#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13 │ │ │ │ │ +14#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ +15#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_s_u_b_s_p_a_c_e_l_o_c_a_l_v_i_e_w_._h_h> │ │ │ │ │ +16#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ +17 │ │ │ │ │ +18 │ │ │ │ │ 19 │ │ │ │ │ -20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_s_t_a_t_i_c_f_o_r_l_o_o_p_._h_h> │ │ │ │ │ -21#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ -22#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_u_t_i_l_i_t_y_._h_h> │ │ │ │ │ -23#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_b_a_s_i_s_t_a_g_s_._h_h> │ │ │ │ │ -24#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ -25#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ -26#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h> │ │ │ │ │ -27#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ -28 │ │ │ │ │ -29 │ │ │ │ │ -30namespace _D_u_n_e { │ │ │ │ │ -31namespace Functions { │ │ │ │ │ +20namespace _D_u_n_e { │ │ │ │ │ +21namespace Functions { │ │ │ │ │ +22 │ │ │ │ │ +23 │ │ │ │ │ +24 │ │ │ │ │ +25namespace Impl { │ │ │ │ │ +26 │ │ │ │ │ +27 template │ │ │ │ │ +28 auto joinTreePaths(const TypeTree::HybridTreePath& inner, const │ │ │ │ │ +TypeTree::HybridTreePath outer) │ │ │ │ │ +29 { │ │ │ │ │ +30 return TypeTree::HybridTreePath(std::tuple_cat │ │ │ │ │ +(inner._data, outer._data)); │ │ │ │ │ +31 } │ │ │ │ │ 32 │ │ │ │ │ -33/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ -34// This is the reusable part of the composite bases. It contains │ │ │ │ │ -35// │ │ │ │ │ -36// CompositePreBasis │ │ │ │ │ -37// │ │ │ │ │ -38// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ -shared │ │ │ │ │ -39// state. These components do _not_ depend on the global basis and local view │ │ │ │ │ -40// and can be used without a global basis. │ │ │ │ │ -41/ │ │ │ │ │ -/ ***************************************************************************** │ │ │ │ │ -42 │ │ │ │ │ -43 │ │ │ │ │ -55template │ │ │ │ │ -_5_6class _C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s │ │ │ │ │ -57{ │ │ │ │ │ -58 static const bool isBlocked = std::is_same_v or std::is_same_v; │ │ │ │ │ -59public: │ │ │ │ │ -60 │ │ │ │ │ -_6_2 using _S_u_b_P_r_e_B_a_s_e_s = std::tuple; │ │ │ │ │ +33 template │ │ │ │ │ +34 using JoinTreePath_t = std::decay_t(), std::declval()))>; │ │ │ │ │ +35 │ │ │ │ │ +36} │ │ │ │ │ +37 │ │ │ │ │ +38 │ │ │ │ │ +39 │ │ │ │ │ +40template │ │ │ │ │ +_4_1class _S_u_b_s_p_a_c_e_B_a_s_i_s │ │ │ │ │ +42{ │ │ │ │ │ +43public: │ │ │ │ │ +44 │ │ │ │ │ +_4_5 using _R_o_o_t_B_a_s_i_s = RB; │ │ │ │ │ +46 │ │ │ │ │ +_4_7 using _R_o_o_t_L_o_c_a_l_V_i_e_w = typename RootBasis::LocalView; │ │ │ │ │ +48 │ │ │ │ │ +_4_9 using _P_r_e_f_i_x_P_a_t_h = TP; │ │ │ │ │ +50 │ │ │ │ │ +_5_2 using _G_r_i_d_V_i_e_w = typename RootBasis::GridView; │ │ │ │ │ +53 │ │ │ │ │ +_5_5 using _M_u_l_t_i_I_n_d_e_x = typename RootBasis::MultiIndex; │ │ │ │ │ +56 │ │ │ │ │ +_5_7 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ +58 │ │ │ │ │ +_6_0 using _L_o_c_a_l_V_i_e_w = _S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w_<_R_o_o_t_L_o_c_a_l_V_i_e_w_,_ _P_r_e_f_i_x_P_a_t_h_>; │ │ │ │ │ +61 │ │ │ │ │ +_6_2 using _S_i_z_e_P_r_e_f_i_x = typename RootBasis::SizePrefix; │ │ │ │ │ 63 │ │ │ │ │ -65 template │ │ │ │ │ -_6_6 using _S_u_b_P_r_e_B_a_s_i_s = std::tuple_element_t; │ │ │ │ │ -67 │ │ │ │ │ -_6_9 using _G_r_i_d_V_i_e_w = typename std::tuple_element_t<0, SubPreBases>::GridView; │ │ │ │ │ +64 │ │ │ │ │ +_6_6 _S_u_b_s_p_a_c_e_B_a_s_i_s(const _R_o_o_t_B_a_s_i_s& _r_o_o_t_B_a_s_i_s, const _P_r_e_f_i_x_P_a_t_h& _p_r_e_f_i_x_P_a_t_h) : │ │ │ │ │ +67 _r_o_o_t_B_a_s_i_s__(&_r_o_o_t_B_a_s_i_s), │ │ │ │ │ +68 _p_r_e_f_i_x_P_a_t_h__(_p_r_e_f_i_x_P_a_t_h) │ │ │ │ │ +69 {} │ │ │ │ │ 70 │ │ │ │ │ -_7_2 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ -73 │ │ │ │ │ -_7_5 using _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y = IMS; │ │ │ │ │ -76 │ │ │ │ │ -77protected: │ │ │ │ │ -_7_8 static const std::size_t _c_h_i_l_d_r_e_n = sizeof...(SPB); │ │ │ │ │ -79 │ │ │ │ │ -_8_0 using _C_h_i_l_d_I_n_d_i_c_e_s = std::make_index_sequence; │ │ │ │ │ +76 template │ │ │ │ │ +_7_7 _S_u_b_s_p_a_c_e_B_a_s_i_s(const _S_u_b_s_p_a_c_e_B_a_s_i_s_<_R_o_o_t_R_o_o_t_B_a_s_i_s_,_ _I_n_n_e_r_T_P_>& _r_o_o_t_B_a_s_i_s, const │ │ │ │ │ +OuterTP& _p_r_e_f_i_x_P_a_t_h) : │ │ │ │ │ +78 _S_u_b_s_p_a_c_e_B_a_s_i_s(_r_o_o_t_B_a_s_i_s._r_o_o_t_B_a_s_i_s(), Impl::joinTreePaths │ │ │ │ │ +(_r_o_o_t_B_a_s_i_s._p_r_e_f_i_x_P_a_t_h(), _p_r_e_f_i_x_P_a_t_h)) │ │ │ │ │ +79 {} │ │ │ │ │ +80 │ │ │ │ │ 81 │ │ │ │ │ -82public: │ │ │ │ │ -83 │ │ │ │ │ -_8_5 using _N_o_d_e = _C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e; │ │ │ │ │ -86 │ │ │ │ │ -_8_7 static constexpr _s_i_z_e___t_y_p_e _m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e = std::max({SPB:: │ │ │ │ │ -maxMultiIndexSize...}) + isBlocked; │ │ │ │ │ -_8_8 static constexpr _s_i_z_e___t_y_p_e _m_i_n_M_u_l_t_i_I_n_d_e_x_S_i_z_e = std::min({SPB:: │ │ │ │ │ -minMultiIndexSize...}) + isBlocked; │ │ │ │ │ -_8_9 static constexpr _s_i_z_e___t_y_p_e _m_u_l_t_i_I_n_d_e_x_B_u_f_f_e_r_S_i_z_e = std::max({SPB:: │ │ │ │ │ -multiIndexBufferSize...}) + isBlocked; │ │ │ │ │ -90 │ │ │ │ │ -96 template = 0, │ │ │ │ │ -98 _e_n_a_b_l_e_I_f_C_o_n_s_t_r_u_c_t_i_b_l_e, SFArgs...> = 0> │ │ │ │ │ -_9_9 _C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s(SFArgs&&... sfArgs) : │ │ │ │ │ -100 subPreBases_(std::forward(sfArgs)...) │ │ │ │ │ -101 { │ │ │ │ │ -102 Hybrid::forEach(subPreBases_, [&](const auto& _s_u_b_P_r_e_B_a_s_i_s){ │ │ │ │ │ -103 static_assert(models, std::decay_t>(), "Subprebases passed to CompositePreBasis does not model the │ │ │ │ │ -PreBasis concept."); │ │ │ │ │ -104 }); │ │ │ │ │ -105 } │ │ │ │ │ -106 │ │ │ │ │ -113 template 1)>, // Avoid ambiguous constructor if │ │ │ │ │ -there's only one child │ │ │ │ │ -116 std::is_same, │ │ │ │ │ -117 std::is_constructible... │ │ │ │ │ -118 >, int> = 0> │ │ │ │ │ -_1_1_9 _C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s(const GV& gv) : │ │ │ │ │ -120 subPreBases_(SPB(gv)...) │ │ │ │ │ -121 { │ │ │ │ │ -122 Hybrid::forEach(subPreBases_, [&](const auto& _s_u_b_P_r_e_B_a_s_i_s){ │ │ │ │ │ -123 static_assert(models, std::decay_t>(), "Subprebases passed to CompositePreBasis does not model the │ │ │ │ │ -PreBasis concept."); │ │ │ │ │ -124 }); │ │ │ │ │ +_8_4 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ +85 { │ │ │ │ │ +86 return _r_o_o_t_B_a_s_i_s__->gridView(); │ │ │ │ │ +87 } │ │ │ │ │ +88 │ │ │ │ │ +_9_2 _s_i_z_e___t_y_p_e _d_i_m_e_n_s_i_o_n() const │ │ │ │ │ +93 { │ │ │ │ │ +94 return _r_o_o_t_B_a_s_i_s__->dimension(); │ │ │ │ │ +95 } │ │ │ │ │ +96 │ │ │ │ │ +_9_8 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ +99 { │ │ │ │ │ +100 return _r_o_o_t_B_a_s_i_s__->size(); │ │ │ │ │ +101 } │ │ │ │ │ +102 │ │ │ │ │ +_1_0_4 _s_i_z_e___t_y_p_e _s_i_z_e(const _S_i_z_e_P_r_e_f_i_x& prefix) const │ │ │ │ │ +105 { │ │ │ │ │ +106 return _r_o_o_t_B_a_s_i_s__->size(prefix); │ │ │ │ │ +107 } │ │ │ │ │ +108 │ │ │ │ │ +_1_1_2 _L_o_c_a_l_V_i_e_w _l_o_c_a_l_V_i_e_w() const │ │ │ │ │ +113 { │ │ │ │ │ +114 return _L_o_c_a_l_V_i_e_w(*this, _p_r_e_f_i_x_P_a_t_h__); │ │ │ │ │ +115 } │ │ │ │ │ +116 │ │ │ │ │ +_1_1_7 const _R_o_o_t_B_a_s_i_s& _r_o_o_t_B_a_s_i_s() const │ │ │ │ │ +118 { │ │ │ │ │ +119 return *_r_o_o_t_B_a_s_i_s__; │ │ │ │ │ +120 } │ │ │ │ │ +121 │ │ │ │ │ +_1_2_2 const _P_r_e_f_i_x_P_a_t_h& _p_r_e_f_i_x_P_a_t_h() const │ │ │ │ │ +123 { │ │ │ │ │ +124 return _p_r_e_f_i_x_P_a_t_h__; │ │ │ │ │ 125 } │ │ │ │ │ 126 │ │ │ │ │ -_1_2_8 void _i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s() │ │ │ │ │ -129 { │ │ │ │ │ -130 Hybrid::forEach(_C_h_i_l_d_I_n_d_i_c_e_s(), [&](auto i) { │ │ │ │ │ -131 this->_s_u_b_P_r_e_B_a_s_i_s(i).initializeIndices(); │ │ │ │ │ -132 }); │ │ │ │ │ -133 } │ │ │ │ │ -134 │ │ │ │ │ -_1_3_6 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ -137 { │ │ │ │ │ -138 return std::get<0>(subPreBases_).gridView(); │ │ │ │ │ -139 } │ │ │ │ │ -140 │ │ │ │ │ -_1_4_2 void _u_p_d_a_t_e(const _G_r_i_d_V_i_e_w& gv) │ │ │ │ │ -143 { │ │ │ │ │ -144 Hybrid::forEach(_C_h_i_l_d_I_n_d_i_c_e_s(), [&](auto i) { │ │ │ │ │ -145 this->_s_u_b_P_r_e_B_a_s_i_s(i).update(gv); │ │ │ │ │ -146 }); │ │ │ │ │ -147 } │ │ │ │ │ -148 │ │ │ │ │ -_1_5_2 _N_o_d_e _m_a_k_e_N_o_d_e() const │ │ │ │ │ -153 { │ │ │ │ │ -154 auto node = _N_o_d_e{}; │ │ │ │ │ -155 Hybrid::forEach(_C_h_i_l_d_I_n_d_i_c_e_s(), [&](auto i) { │ │ │ │ │ -156 node.setChild(this->_s_u_b_P_r_e_B_a_s_i_s(i)._m_a_k_e_N_o_d_e(), i); │ │ │ │ │ -157 }); │ │ │ │ │ -158 return node; │ │ │ │ │ -159 } │ │ │ │ │ -160 │ │ │ │ │ -_1_6_2 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ -163 { │ │ │ │ │ -164 return _s_i_z_e(Dune::ReservedVector{}); │ │ │ │ │ -165 } │ │ │ │ │ +127protected: │ │ │ │ │ +_1_2_8 const _R_o_o_t_B_a_s_i_s* _r_o_o_t_B_a_s_i_s__; │ │ │ │ │ +_1_2_9 _P_r_e_f_i_x_P_a_t_h _p_r_e_f_i_x_P_a_t_h__; │ │ │ │ │ +130}; │ │ │ │ │ +131 │ │ │ │ │ +132 │ │ │ │ │ +133// CTAD guide for a non-SubspaceBasis root basis │ │ │ │ │ +134template │ │ │ │ │ +_1_3_5_S_u_b_s_p_a_c_e_B_a_s_i_s(const RB&, const TP) -> _S_u_b_s_p_a_c_e_B_a_s_i_s_<_R_B_,_ _T_P_>; │ │ │ │ │ +136 │ │ │ │ │ +137// CTAD guide for a SubspaceBasis root basis │ │ │ │ │ +138template │ │ │ │ │ +_1_3_9_S_u_b_s_p_a_c_e_B_a_s_i_s(const _S_u_b_s_p_a_c_e_B_a_s_i_s_<_R_o_o_t_R_o_o_t_B_a_s_i_s_,_ _I_n_n_e_r_T_P_>& rootBasis, const │ │ │ │ │ +OuterTP& prefixPath) │ │ │ │ │ +140 -> _S_u_b_s_p_a_c_e_B_a_s_i_s, Impl:: │ │ │ │ │ +JoinTreePath_t>; │ │ │ │ │ +141 │ │ │ │ │ +142 │ │ │ │ │ +143 │ │ │ │ │ +154template │ │ │ │ │ +_1_5_5auto _s_u_b_s_p_a_c_e_B_a_s_i_s(const RootBasis& rootBasis, const TypeTree:: │ │ │ │ │ +HybridTreePath& prefixPath) │ │ │ │ │ +156{ │ │ │ │ │ +157 return _S_u_b_s_p_a_c_e_B_a_s_i_s(rootBasis, prefixPath); │ │ │ │ │ +158} │ │ │ │ │ +159 │ │ │ │ │ +160template │ │ │ │ │ +_1_6_1auto _s_u_b_s_p_a_c_e_B_a_s_i_s(const RootBasis& rootBasis, const PrefixTreeIndices&... │ │ │ │ │ +prefixTreeIndices) │ │ │ │ │ +162{ │ │ │ │ │ +163 return _s_u_b_s_p_a_c_e_B_a_s_i_s(rootBasis, TypeTree::hybridTreePath │ │ │ │ │ +(prefixTreeIndices...)); │ │ │ │ │ +164} │ │ │ │ │ +165 │ │ │ │ │ 166 │ │ │ │ │ -168 template │ │ │ │ │ -_1_6_9 _s_i_z_e___t_y_p_e _s_i_z_e(const SizePrefix& prefix) const │ │ │ │ │ -170 { │ │ │ │ │ -171 return _s_i_z_e(prefix, _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y{}); │ │ │ │ │ -172 } │ │ │ │ │ -173 │ │ │ │ │ -174private: │ │ │ │ │ -175 │ │ │ │ │ -176 template │ │ │ │ │ -177 static void multiIndexPopFront(MultiIndex& M) │ │ │ │ │ -178 { │ │ │ │ │ -179 for(std::size_t i=0; i │ │ │ │ │ -185 _s_i_z_e___t_y_p_e _s_i_z_e(SizePrefix prefix, BasisFactory::BlockedLexicographic) const │ │ │ │ │ -186 { │ │ │ │ │ -187 if (prefix.size() == 0) │ │ │ │ │ -188 return _c_h_i_l_d_r_e_n; │ │ │ │ │ -189 │ │ │ │ │ -190 auto front = prefix.front(); │ │ │ │ │ -191 multiIndexPopFront(prefix); │ │ │ │ │ -192 return Hybrid::switchCases(_C_h_i_l_d_I_n_d_i_c_e_s(), front, [&] (auto i) { │ │ │ │ │ -193 return this->_s_u_b_P_r_e_B_a_s_i_s(i).size(prefix); │ │ │ │ │ -194 }, []() { │ │ │ │ │ -195 return _s_i_z_e___t_y_p_e(0); │ │ │ │ │ -196 }); │ │ │ │ │ -197 } │ │ │ │ │ -198 │ │ │ │ │ -199 template │ │ │ │ │ -200 _s_i_z_e___t_y_p_e _s_i_z_e(SizePrefix prefix, BasisFactory::FlatLexicographic) const │ │ │ │ │ -201 { │ │ │ │ │ -202 _s_i_z_e___t_y_p_e result = 0; │ │ │ │ │ -203 if (prefix.size() == 0) │ │ │ │ │ -204 Hybrid::forEach(_C_h_i_l_d_I_n_d_i_c_e_s(), [&](auto i) { │ │ │ │ │ -205 result += this->_s_u_b_P_r_e_B_a_s_i_s(i).size(); │ │ │ │ │ -206 }); │ │ │ │ │ -207 else { │ │ │ │ │ -208 staticFindInRange<0, children>([&](auto i) { │ │ │ │ │ -209 auto firstDigitSize = this->_s_u_b_P_r_e_B_a_s_i_s(i).size(); │ │ │ │ │ -210 if (prefix[0] < firstDigitSize) │ │ │ │ │ -211 { │ │ │ │ │ -212 result = this->_s_u_b_P_r_e_B_a_s_i_s(i).size(prefix); │ │ │ │ │ -213 return true; │ │ │ │ │ -214 } │ │ │ │ │ -215 prefix[0] -= firstDigitSize; │ │ │ │ │ -216 return false; │ │ │ │ │ -217 }); │ │ │ │ │ -218 } │ │ │ │ │ -219 return result; │ │ │ │ │ -220 } │ │ │ │ │ -221 │ │ │ │ │ -222public: │ │ │ │ │ -223 │ │ │ │ │ -_2_2_5 _s_i_z_e___t_y_p_e _d_i_m_e_n_s_i_o_n() const │ │ │ │ │ -226 { │ │ │ │ │ -227 _s_i_z_e___t_y_p_e r=0; │ │ │ │ │ -228 // Accumulate dimension() for all subprebases │ │ │ │ │ -229 Hybrid::forEach(_C_h_i_l_d_I_n_d_i_c_e_s(), [&](auto i) { │ │ │ │ │ -230 r += this->_s_u_b_P_r_e_B_a_s_i_s(i).dimension(); │ │ │ │ │ -231 }); │ │ │ │ │ -232 return r; │ │ │ │ │ -233 } │ │ │ │ │ -234 │ │ │ │ │ -_2_3_6 _s_i_z_e___t_y_p_e _m_a_x_N_o_d_e_S_i_z_e() const │ │ │ │ │ -237 { │ │ │ │ │ -238 _s_i_z_e___t_y_p_e r=0; │ │ │ │ │ -239 // Accumulate maxNodeSize() for all subprebases │ │ │ │ │ -240 Hybrid::forEach(_C_h_i_l_d_I_n_d_i_c_e_s(), [&](auto i) { │ │ │ │ │ -241 r += this->_s_u_b_P_r_e_B_a_s_i_s(i).maxNodeSize(); │ │ │ │ │ -242 }); │ │ │ │ │ -243 return r; │ │ │ │ │ -244 } │ │ │ │ │ -245 │ │ │ │ │ -247 template │ │ │ │ │ -_2_4_8 const _S_u_b_P_r_e_B_a_s_i_s_<_i_>& _s_u_b_P_r_e_B_a_s_i_s(Dune::index_constant = {}) const │ │ │ │ │ -249 { │ │ │ │ │ -250 return std::get(subPreBases_); │ │ │ │ │ -251 } │ │ │ │ │ -252 │ │ │ │ │ -254 template │ │ │ │ │ -_2_5_5 _S_u_b_P_r_e_B_a_s_i_s_<_i_>& _s_u_b_P_r_e_B_a_s_i_s(Dune::index_constant = {}) │ │ │ │ │ -256 { │ │ │ │ │ -257 return std::get(subPreBases_); │ │ │ │ │ -258 } │ │ │ │ │ -259 │ │ │ │ │ -_2_6_1 const auto& _s_u_b_P_r_e_B_a_s_e_s() const │ │ │ │ │ -262 { │ │ │ │ │ -263 return subPreBases_; │ │ │ │ │ -264 } │ │ │ │ │ -265 │ │ │ │ │ -267 template │ │ │ │ │ -_2_6_8 It _i_n_d_i_c_e_s(const _N_o_d_e& node, It it) const │ │ │ │ │ -269 { │ │ │ │ │ -270 return _i_n_d_i_c_e_s(node, it, _I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y{}); │ │ │ │ │ -271 } │ │ │ │ │ -272 │ │ │ │ │ -_2_7_4 auto _c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r() const │ │ │ │ │ -275 { │ │ │ │ │ -276 namespace CD = _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s; │ │ │ │ │ -277 if constexpr(std::is_same_v) { │ │ │ │ │ -278 return std::apply([&](auto const&... spb) { │ │ │ │ │ -279 return CD::makeDescriptor(_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r(spb)...); │ │ │ │ │ -280 }, subPreBases_); │ │ │ │ │ -281 } │ │ │ │ │ -282 else if constexpr(std::is_same_v) { │ │ │ │ │ -283 return CD::Unknown{}; // Not yet implemented │ │ │ │ │ -284 } │ │ │ │ │ -285 else │ │ │ │ │ -286 return CD::Unknown{}; │ │ │ │ │ -287 } │ │ │ │ │ -288 │ │ │ │ │ -289private: │ │ │ │ │ -290 │ │ │ │ │ -291 template │ │ │ │ │ -292 It _i_n_d_i_c_e_s(const _N_o_d_e& node, It multiIndices, _B_a_s_i_s_F_a_c_t_o_r_y_:_: │ │ │ │ │ -_F_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c) const │ │ │ │ │ -293 { │ │ │ │ │ -294 _s_i_z_e___t_y_p_e firstComponentOffset = 0; │ │ │ │ │ -295 // Loop over all children │ │ │ │ │ -296 Hybrid::forEach(_C_h_i_l_d_I_n_d_i_c_e_s(), [&](auto child){ │ │ │ │ │ -297 _s_i_z_e___t_y_p_e subTreeSize = node.child(child)._s_i_z_e(); │ │ │ │ │ -298 // Fill indices for current child into index buffer starting from current │ │ │ │ │ -299 // buffer position and shift first index component of any index for current │ │ │ │ │ -300 // child by suitable offset to get lexicographic indices. │ │ │ │ │ -301 _s_u_b_P_r_e_B_a_s_i_s(child).indices(node.child(child), multiIndices); │ │ │ │ │ -302 for (std::size_t i = 0; i │ │ │ │ │ -313 static void multiIndexPushFront(MultiIndex& M, _s_i_z_e___t_y_p_e M0) │ │ │ │ │ -314 { │ │ │ │ │ -315 M.resize(M.size()+1); │ │ │ │ │ -316 for(std::size_t i=M.size()-1; i>0; --i) │ │ │ │ │ -317 M[i] = M[i-1]; │ │ │ │ │ -318 M[0] = M0; │ │ │ │ │ -319 } │ │ │ │ │ -320 │ │ │ │ │ -321 template │ │ │ │ │ -322 It _i_n_d_i_c_e_s(const _N_o_d_e& node, It multiIndices, BasisFactory:: │ │ │ │ │ -BlockedLexicographic) const │ │ │ │ │ -323 { │ │ │ │ │ -324 // Loop over all children │ │ │ │ │ -325 Hybrid::forEach(_C_h_i_l_d_I_n_d_i_c_e_s(), [&](auto child){ │ │ │ │ │ -326 _s_i_z_e___t_y_p_e subTreeSize = node.child(child)._s_i_z_e(); │ │ │ │ │ -327 // Fill indices for current child into index buffer starting from current │ │ │ │ │ -position │ │ │ │ │ -328 _s_u_b_P_r_e_B_a_s_i_s(child).indices(node.child(child), multiIndices); │ │ │ │ │ -329 // Insert child index before first component of all indices of current │ │ │ │ │ -child. │ │ │ │ │ -330 for (std::size_t i = 0; imultiIndexPushFront(multiIndices[i], child); │ │ │ │ │ -332 // Increment buffer iterator by the number of indices processed for current │ │ │ │ │ -child │ │ │ │ │ -333 multiIndices += subTreeSize; │ │ │ │ │ -334 }); │ │ │ │ │ -335 return multiIndices; │ │ │ │ │ -336 } │ │ │ │ │ -337 │ │ │ │ │ -338 std::tuple subPreBases_; │ │ │ │ │ -339}; │ │ │ │ │ -340 │ │ │ │ │ -341 │ │ │ │ │ -342 │ │ │ │ │ -343namespace BasisFactory { │ │ │ │ │ -344 │ │ │ │ │ -345namespace Imp { │ │ │ │ │ -346 │ │ │ │ │ -347template │ │ │ │ │ -348class CompositePreBasisFactory │ │ │ │ │ -349{ │ │ │ │ │ -350 │ │ │ │ │ -351 template │ │ │ │ │ -352 auto makePreBasisFromChildPreBases(const GridView&, ChildPreBasis&&... │ │ │ │ │ -childPreBasis) const │ │ │ │ │ -353 { │ │ │ │ │ -354 return CompositePreBasis...>(std::forward(childPreBasis)...); │ │ │ │ │ -355 } │ │ │ │ │ -356 │ │ │ │ │ -357public: │ │ │ │ │ -358 │ │ │ │ │ -359 CompositePreBasisFactory(const ChildPreBasisFactory&... │ │ │ │ │ -childPreBasisFactory) : │ │ │ │ │ -360 childPreBasisFactories_(childPreBasisFactory...) │ │ │ │ │ -361 {} │ │ │ │ │ -362 │ │ │ │ │ -363 CompositePreBasisFactory(ChildPreBasisFactory&&... childPreBasisFactory) : │ │ │ │ │ -364 childPreBasisFactories_(std::move(childPreBasisFactory)...) │ │ │ │ │ -365 {} │ │ │ │ │ -366 │ │ │ │ │ -367 template │ │ │ │ │ -368 auto operator()(const GridView& gridView) const │ │ │ │ │ -369 { │ │ │ │ │ -370 // Use std::apply to unpack the tuple childPreBasisFactories_ │ │ │ │ │ -371 return std::apply([&](const auto&... childPreBasisFactory) { │ │ │ │ │ -372 return this->makePreBasisFromChildPreBases(gridView, childPreBasisFactory │ │ │ │ │ -(gridView)...); │ │ │ │ │ -373 }, childPreBasisFactories_); │ │ │ │ │ -374 } │ │ │ │ │ -375 │ │ │ │ │ -376private: │ │ │ │ │ -377 std::tuple childPreBasisFactories_; │ │ │ │ │ -378}; │ │ │ │ │ -379 │ │ │ │ │ -380} // end namespace BasisFactory::Imp │ │ │ │ │ -381 │ │ │ │ │ -382 │ │ │ │ │ -383 │ │ │ │ │ -394template< │ │ │ │ │ -395 typename... Args, │ │ │ │ │ -396 std::enable_if_t<_C_o_n_c_e_p_t_:_:_i_s_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y::type>(),int> = 0> │ │ │ │ │ -397auto composite(Args&&... args) │ │ │ │ │ -398{ │ │ │ │ │ -399 // We have to separate the last entry which is the IndexMergingStrategy │ │ │ │ │ -400 // and the preceding ones, which are the ChildPreBasisFactories │ │ │ │ │ -401 │ │ │ │ │ -402 using ArgTuple = std::tuple...>; │ │ │ │ │ -403 │ │ │ │ │ -404 // Compute number of children and index of the IndexMergingStrategy │ │ │ │ │ -argument │ │ │ │ │ -405 constexpr std::size_t children = sizeof...(Args) - 1; │ │ │ │ │ -406 │ │ │ │ │ -407 // Use last type as IndexMergingStrategy │ │ │ │ │ -408 using IndexMergingStrategy = std::tuple_element_t; │ │ │ │ │ -409 │ │ │ │ │ -410 // Index sequence for all but the last entry for partial tuple unpacking │ │ │ │ │ -411 auto childIndices = std::make_index_sequence{}; │ │ │ │ │ -412 │ │ │ │ │ -413 // Unpack tuple only for those entries related to children │ │ │ │ │ -414 return applyPartial([](auto&&... childPreBasisFactory){ │ │ │ │ │ -415 return Imp::CompositePreBasisFactory...>(std::forward(childPreBasisFactory)...); │ │ │ │ │ -416 }, │ │ │ │ │ -417 std::forward_as_tuple(std::forward(args)...), │ │ │ │ │ -418 childIndices); │ │ │ │ │ -419} │ │ │ │ │ -420 │ │ │ │ │ -432template< │ │ │ │ │ -433 typename... Args, │ │ │ │ │ -434 std::enable_if_t::type>(),int> = 0> │ │ │ │ │ -435auto composite(Args&&... args) │ │ │ │ │ -436{ │ │ │ │ │ -437 return Imp::CompositePreBasisFactory...>(std::forward(args)...); │ │ │ │ │ -438} │ │ │ │ │ -439 │ │ │ │ │ -440} // end namespace BasisFactory │ │ │ │ │ -441 │ │ │ │ │ -442// Backward compatibility │ │ │ │ │ -443namespace [[deprecated("Will be removed after Dune 2.10")]] BasisBuilder { │ │ │ │ │ -444 │ │ │ │ │ -445 using namespace BasisFactory; │ │ │ │ │ -446 │ │ │ │ │ -447} │ │ │ │ │ -448 │ │ │ │ │ -449 │ │ │ │ │ -450 │ │ │ │ │ -451} // end namespace Functions │ │ │ │ │ -452} // end namespace Dune │ │ │ │ │ -453 │ │ │ │ │ -454 │ │ │ │ │ -455#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_COMPOSITEBASIS_HH │ │ │ │ │ -_u_t_i_l_i_t_y_._h_h │ │ │ │ │ -_s_t_a_t_i_c_f_o_r_l_o_o_p_._h_h │ │ │ │ │ +167 │ │ │ │ │ +168} // end namespace Functions │ │ │ │ │ +169} // end namespace Dune │ │ │ │ │ +170 │ │ │ │ │ +171 │ │ │ │ │ +172 │ │ │ │ │ +173#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH │ │ │ │ │ _t_y_p_e___t_r_a_i_t_s_._h_h │ │ │ │ │ -_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h │ │ │ │ │ -_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h │ │ │ │ │ -_b_a_s_i_s_t_a_g_s_._h_h │ │ │ │ │ -_n_o_d_e_s_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_e_n_a_b_l_e_I_f_C_o_n_s_t_r_u_c_t_i_b_l_e │ │ │ │ │ -std::enable_if_t< std::is_constructible_v< T, Args... >, int > │ │ │ │ │ -enableIfConstructible │ │ │ │ │ -Helper to constrain forwarding constructors. │ │ │ │ │ -DDeeffiinniittiioonn type_traits.hh:31 │ │ │ │ │ +_s_u_b_s_p_a_c_e_l_o_c_a_l_v_i_e_w_._h_h │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -auto containerDescriptor(const PreBasis &preBasis) │ │ │ │ │ -Return the container descriptor of the pre-basis, if defined, otherwise │ │ │ │ │ -ContainerDescriptor::Unknown. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_c_e_p_t_:_:_i_s_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ -static constexpr bool isIndexMergingStrategy() │ │ │ │ │ -DDeeffiinniittiioonn basistags.hh:27 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:47 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_F_l_a_t_L_e_x_i_c_o_g_r_a_p_h_i_c │ │ │ │ │ -Lexicographic merging of direct children without blocking. │ │ │ │ │ -DDeeffiinniittiioonn basistags.hh:84 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s │ │ │ │ │ -A pre-basis for composite bases. │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:57 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_s_u_b_P_r_e_B_a_s_i_s │ │ │ │ │ -SubPreBasis< i > & subPreBasis(Dune::index_constant< i >={}) │ │ │ │ │ -Mutable access to the stored prebasis of the factor in the power space. │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:255 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_I_n_d_e_x_M_e_r_g_i_n_g_S_t_r_a_t_e_g_y │ │ │ │ │ -IMS IndexMergingStrategy │ │ │ │ │ -Strategy used to merge the global indices of the child pre-bases. │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_m_a_x_N_o_d_e_S_i_z_e │ │ │ │ │ -size_type maxNodeSize() const │ │ │ │ │ -Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:236 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_s_u_b_P_r_e_B_a_s_i_s │ │ │ │ │ -const SubPreBasis< i > & subPreBasis(Dune::index_constant< i >={}) const │ │ │ │ │ -Const access to the stored prebasis of the factor in the power space. │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:248 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ -std::size_t size_type │ │ │ │ │ -Type used for indices and size information. │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:72 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_N_o_d_e │ │ │ │ │ -CompositeBasisNode< typename SPB::Node... > Node │ │ │ │ │ -Template mapping root tree path to type of created tree node. │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:85 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_s_u_b_s_p_a_c_e_B_a_s_i_s │ │ │ │ │ +auto subspaceBasis(const RootBasis &rootBasis, const TypeTree::HybridTreePath< │ │ │ │ │ +PrefixTreeIndices... > &prefixPath) │ │ │ │ │ +Create SubspaceBasis from a root basis and a prefixPath. │ │ │ │ │ +DDeeffiinniittiioonn subspacebasis.hh:155 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s │ │ │ │ │ +DDeeffiinniittiioonn subspacebasis.hh:42 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_R_o_o_t_L_o_c_a_l_V_i_e_w │ │ │ │ │ +typename RootBasis::LocalView RootLocalView │ │ │ │ │ +DDeeffiinniittiioonn subspacebasis.hh:47 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_l_o_c_a_l_V_i_e_w │ │ │ │ │ +LocalView localView() const │ │ │ │ │ +Return local view for basis. │ │ │ │ │ +DDeeffiinniittiioonn subspacebasis.hh:112 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_r_o_o_t_B_a_s_i_s__ │ │ │ │ │ +const RootBasis * rootBasis_ │ │ │ │ │ +DDeeffiinniittiioonn subspacebasis.hh:128 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_S_i_z_e_P_r_e_f_i_x │ │ │ │ │ +typename RootBasis::SizePrefix SizePrefix │ │ │ │ │ +DDeeffiinniittiioonn subspacebasis.hh:62 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_P_r_e_f_i_x_P_a_t_h │ │ │ │ │ +TP PrefixPath │ │ │ │ │ +DDeeffiinniittiioonn subspacebasis.hh:49 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_L_o_c_a_l_V_i_e_w │ │ │ │ │ +SubspaceLocalView< RootLocalView, PrefixPath > LocalView │ │ │ │ │ +Type of the local view on the restriction of the basis to a single element. │ │ │ │ │ +DDeeffiinniittiioonn subspacebasis.hh:60 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ size_type size(const SizePrefix &prefix) const │ │ │ │ │ -Return number of possible values for next position in multi index. │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:169 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s │ │ │ │ │ -CompositePreBasis(SFArgs &&... sfArgs) │ │ │ │ │ -Constructor for given child pre-basis objects. │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:99 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ -size_type dimension() const │ │ │ │ │ -Get the total dimension of the space spanned by this basis. │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:225 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s │ │ │ │ │ -CompositePreBasis(const GV &gv) │ │ │ │ │ -Constructor for given GridView. │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:119 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s │ │ │ │ │ -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. │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:268 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ -size_type size() const │ │ │ │ │ -Same as size(prefix) with empty prefix. │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:162 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ -typename std::tuple_element_t< 0, SubPreBases >::GridView GridView │ │ │ │ │ -The grid view that the FE basis is defined on. │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:69 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_c_h_i_l_d_r_e_n │ │ │ │ │ -static const std::size_t children │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:78 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_S_u_b_P_r_e_B_a_s_e_s │ │ │ │ │ -std::tuple< SPB... > SubPreBases │ │ │ │ │ -Tuple of child pre-bases. │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:62 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ -Node makeNode() const │ │ │ │ │ -Create tree node. │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:152 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s │ │ │ │ │ -void initializeIndices() │ │ │ │ │ -Initialize the global indices. │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:128 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_S_u_b_P_r_e_B_a_s_i_s │ │ │ │ │ -std::tuple_element_t< i, SubPreBases > SubPreBasis │ │ │ │ │ -Export individual child pre-bases by index. │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:66 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_C_h_i_l_d_I_n_d_i_c_e_s │ │ │ │ │ -std::make_index_sequence< children > ChildIndices │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:80 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_u_p_d_a_t_e │ │ │ │ │ -void update(const GridView &gv) │ │ │ │ │ -Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:142 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_m_u_l_t_i_I_n_d_e_x_B_u_f_f_e_r_S_i_z_e │ │ │ │ │ -static constexpr size_type multiIndexBufferSize │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:89 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_s_u_b_P_r_e_B_a_s_e_s │ │ │ │ │ -const auto & subPreBases() const │ │ │ │ │ -Const access to the stored prebases tuple. │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:261 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ +Return number possible values for next position in multi index. │ │ │ │ │ +DDeeffiinniittiioonn subspacebasis.hh:104 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ +typename RootBasis::GridView GridView │ │ │ │ │ +The grid view that the FE space is defined on. │ │ │ │ │ +DDeeffiinniittiioonn subspacebasis.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_p_r_e_f_i_x_P_a_t_h │ │ │ │ │ +const PrefixPath & prefixPath() const │ │ │ │ │ +DDeeffiinniittiioonn subspacebasis.hh:122 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s │ │ │ │ │ +SubspaceBasis(const SubspaceBasis< RootRootBasis, InnerTP > &rootBasis, const │ │ │ │ │ +OuterTP &prefixPath) │ │ │ │ │ +Constructor from another SubspaceBasis. │ │ │ │ │ +DDeeffiinniittiioonn subspacebasis.hh:77 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ const GridView & gridView() const │ │ │ │ │ Obtain the grid view that the basis is defined on. │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:136 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_m_i_n_M_u_l_t_i_I_n_d_e_x_S_i_z_e │ │ │ │ │ -static constexpr size_type minMultiIndexSize │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:88 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -auto containerDescriptor() const │ │ │ │ │ -Return the associated container descriptor. │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:274 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_P_r_e_B_a_s_i_s_:_:_m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e │ │ │ │ │ -static constexpr size_type maxMultiIndexSize │ │ │ │ │ -DDeeffiinniittiioonn compositebasis.hh:87 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:252 │ │ │ │ │ +DDeeffiinniittiioonn subspacebasis.hh:84 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_R_o_o_t_B_a_s_i_s │ │ │ │ │ +RB RootBasis │ │ │ │ │ +DDeeffiinniittiioonn subspacebasis.hh:45 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_p_r_e_f_i_x_P_a_t_h__ │ │ │ │ │ +PrefixPath prefixPath_ │ │ │ │ │ +DDeeffiinniittiioonn subspacebasis.hh:129 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ +size_type size() const │ │ │ │ │ +Return number of possible values for next position in empty multi index. │ │ │ │ │ +DDeeffiinniittiioonn subspacebasis.hh:98 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_r_o_o_t_B_a_s_i_s │ │ │ │ │ +const RootBasis & rootBasis() const │ │ │ │ │ +DDeeffiinniittiioonn subspacebasis.hh:117 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_M_u_l_t_i_I_n_d_e_x │ │ │ │ │ +typename RootBasis::MultiIndex MultiIndex │ │ │ │ │ +Type used for global numbering of the basis vectors. │ │ │ │ │ +DDeeffiinniittiioonn subspacebasis.hh:55 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ +size_type dimension() const │ │ │ │ │ +DDeeffiinniittiioonn subspacebasis.hh:92 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +DDeeffiinniittiioonn subspacebasis.hh:57 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s_:_:_S_u_b_s_p_a_c_e_B_a_s_i_s │ │ │ │ │ +SubspaceBasis(const RootBasis &rootBasis, const PrefixPath &prefixPath) │ │ │ │ │ +Constructor for a given grid view object. │ │ │ │ │ +DDeeffiinniittiioonn subspacebasis.hh:66 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_S_u_b_s_p_a_c_e_L_o_c_a_l_V_i_e_w │ │ │ │ │ +The restriction of a finite element basis to a single element. │ │ │ │ │ +DDeeffiinniittiioonn subspacelocalview.hh:34 │ │ │ │ │ _c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00194.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: nodes.hh File Reference │ │ │ │ +dune-functions: defaultglobalbasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -73,60 +73,57 @@ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
nodes.hh File Reference
│ │ │ │ +
defaultglobalbasis.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/dynamicpowernode.hh>
│ │ │ │ -#include <dune/typetree/compositenode.hh>
│ │ │ │ -#include <dune/typetree/traversal.hh>
│ │ │ │ -#include <dune/typetree/visitor.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::BasisNodeMixin
 
class  Dune::Functions::LeafBasisNode
 
class  Dune::Functions::PowerBasisNode< T, n >
 
class  Dune::Functions::DynamicPowerBasisNode< T >
 
class  Dune::Functions::CompositeBasisNode< T >
class  Dune::Functions::DefaultGlobalBasis< PB >
 Global basis for given pre-basis. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ 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 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 {} │ │ │ │ │ @@ -2,48 +2,46 @@ │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -nodes.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +defaultglobalbasis.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_l_o_c_a_l_v_i_e_w_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_B_a_s_i_s_N_o_d_e_<_ _T_,_ _n_ _> │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e_<_ _T_ _> │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e_<_ _T_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_<_ _P_B_ _> │ │ │ │ │ +  Global basis for given pre-basis. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_l_e_a_r_S_i_z_e (Tree &tree, std::size_t offset) │ │ │ │ │ +namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y │ │ │ │ │ +  │ │ │ │ │ +namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_B_u_i_l_d_e_r │ │ │ │ │   │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_b_i_n_d_T_r_e_e (Tree &tree, const Entity &entity, std::size_t │ │ │ │ │ - offset=0) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_n_i_t_i_a_l_i_z_e_T_r_e_e (Tree &tree, std::size_t │ │ │ │ │ - treeIndexOffset=0) │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s (PreBasis &&) -> _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s< │ │ │ │ │ + std::decay_t< PreBasis > > │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s (const GridView &gv, PreBasisFactory │ │ │ │ │ + &&f) -> _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s< std::decay_t< decltype(f(gv))> > │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_m_a_k_e_B_a_s_i_s (const GridView &gridView, │ │ │ │ │ + PreBasisFactory &&preBasisFactory) │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00194_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: nodes.hh Source File │ │ │ │ +dune-functions: defaultglobalbasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,400 +74,234 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
nodes.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH
│ │ │ │
9
│ │ │ │ -
10#include <cassert>
│ │ │ │ -
11#include <memory>
│ │ │ │ -
12
│ │ │ │ -
13#include <dune/common/indices.hh>
│ │ │ │ -
14
│ │ │ │ -
15#include <dune/typetree/leafnode.hh>
│ │ │ │ -
16#include <dune/typetree/powernode.hh>
│ │ │ │ -
17#include <dune/typetree/dynamicpowernode.hh>
│ │ │ │ -
18#include <dune/typetree/compositenode.hh>
│ │ │ │ -
19#include <dune/typetree/traversal.hh>
│ │ │ │ -
20#include <dune/typetree/visitor.hh>
│ │ │ │ +
10#include <cstddef>
│ │ │ │ +
11#include <type_traits>
│ │ │ │ +
12#include <utility>
│ │ │ │ +
13
│ │ │ │ +
14#include <dune/common/reservedvector.hh>
│ │ │ │ +
15#include <dune/common/typeutilities.hh>
│ │ │ │ +
16#include <dune/common/concept.hh>
│ │ │ │ +
17
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
21
│ │ │ │ -
22namespace Dune {
│ │ │ │ -
23 namespace Functions {
│ │ │ │ -
24
│ │ │ │ -
25
│ │ │ │ -
26 namespace Impl {
│ │ │ │ +
22
│ │ │ │ +
23
│ │ │ │ +
24namespace Dune {
│ │ │ │ +
25namespace Functions {
│ │ │ │ +
26
│ │ │ │
27
│ │ │ │
28
│ │ │ │ -
29 struct ClearSizeVisitor
│ │ │ │ -
30 : public TypeTree::TreeVisitor
│ │ │ │ -
31 , public TypeTree::DynamicTraversal
│ │ │ │ -
32 {
│ │ │ │ -
33
│ │ │ │ -
34 template<typename Node, typename TreePath>
│ │ │ │ -
35 void pre(Node& node, TreePath treePath)
│ │ │ │ -
36 {
│ │ │ │ -
37 leaf(node,treePath);
│ │ │ │ -
38 node.setSize(0);
│ │ │ │ -
39 }
│ │ │ │ -
40
│ │ │ │ -
41 template<typename Node, typename TreePath>
│ │ │ │ -
42 void leaf(Node& node, TreePath treePath)
│ │ │ │ -
43 {
│ │ │ │ -
44 node.setOffset(offset_);
│ │ │ │ -
45 }
│ │ │ │ -
46
│ │ │ │ -
47 ClearSizeVisitor(std::size_t offset)
│ │ │ │ -
48 : offset_(offset)
│ │ │ │ -
49 {}
│ │ │ │ -
50
│ │ │ │ -
51 const std::size_t offset_;
│ │ │ │ -
52
│ │ │ │ -
53 };
│ │ │ │ -
54
│ │ │ │ -
55
│ │ │ │ -
56 template<typename Entity>
│ │ │ │ -
57 struct BindVisitor
│ │ │ │ -
58 : public TypeTree::TreeVisitor
│ │ │ │ -
59 , public TypeTree::DynamicTraversal
│ │ │ │ -
60 {
│ │ │ │ -
61
│ │ │ │ -
62 template<typename Node, typename TreePath>
│ │ │ │ -
63 void pre(Node& node, TreePath)
│ │ │ │ -
64 {
│ │ │ │ -
65 node.setOffset(offset_);
│ │ │ │ -
66 }
│ │ │ │ -
67
│ │ │ │ -
68 template<typename Node, typename TreePath>
│ │ │ │ -
69 void post(Node& node, TreePath)
│ │ │ │ -
70 {
│ │ │ │ -
71 node.setSize(offset_ - node.offset());
│ │ │ │ -
72 }
│ │ │ │ -
73
│ │ │ │ -
74 template<typename Node, typename TreePath>
│ │ │ │ -
75 void leaf(Node& node, TreePath)
│ │ │ │ -
76 {
│ │ │ │ -
77 node.setOffset(offset_);
│ │ │ │ -
78 node.bind(entity_);
│ │ │ │ -
79 offset_ += node.size();
│ │ │ │ -
80 }
│ │ │ │ -
81
│ │ │ │ -
82 BindVisitor(const Entity& entity, std::size_t offset = 0)
│ │ │ │ -
83 : entity_(entity)
│ │ │ │ -
84 , offset_(offset)
│ │ │ │ -
85 {}
│ │ │ │ -
86
│ │ │ │ -
87 const Entity& entity_;
│ │ │ │ -
88 std::size_t offset_;
│ │ │ │ -
89
│ │ │ │ -
90 };
│ │ │ │ -
91
│ │ │ │ -
92
│ │ │ │ -
93 struct InitializeTreeVisitor :
│ │ │ │ -
94 public TypeTree::TreeVisitor,
│ │ │ │ -
95 public TypeTree::DynamicTraversal
│ │ │ │ -
96 {
│ │ │ │ -
97 template<typename Node, typename TreePath>
│ │ │ │ -
98 void pre(Node& node, TreePath)
│ │ │ │ -
99 {
│ │ │ │ -
100 node.setTreeIndex(treeIndex_);
│ │ │ │ -
101 ++treeIndex_;
│ │ │ │ -
102 }
│ │ │ │ -
103
│ │ │ │ -
104 template<typename Node, typename TreePath>
│ │ │ │ -
105 void leaf(Node& node, TreePath)
│ │ │ │ -
106 {
│ │ │ │ -
107 node.setTreeIndex(treeIndex_);
│ │ │ │ -
108 ++treeIndex_;
│ │ │ │ -
109 }
│ │ │ │ -
110
│ │ │ │ -
111 InitializeTreeVisitor(std::size_t treeIndexOffset = 0) :
│ │ │ │ -
112 treeIndex_(treeIndexOffset)
│ │ │ │ -
113 {}
│ │ │ │ -
114
│ │ │ │ -
115 std::size_t treeIndex_;
│ │ │ │ -
116 };
│ │ │ │ -
117
│ │ │ │ -
118 } // end namespace Impl
│ │ │ │ -
119
│ │ │ │ -
120
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
122 {
│ │ │ │ -
123
│ │ │ │ -
124 friend struct Impl::ClearSizeVisitor;
│ │ │ │ -
125
│ │ │ │ -
126 template<typename>
│ │ │ │ -
127 friend struct Impl::BindVisitor;
│ │ │ │ -
128
│ │ │ │ -
129 friend struct Impl::InitializeTreeVisitor;
│ │ │ │ -
130
│ │ │ │ -
131 public:
│ │ │ │ -
132
│ │ │ │ -
133 using size_type = std::size_t;
│ │ │ │ -
134
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
136 offset_(0),
│ │ │ │ -
137 size_(0),
│ │ │ │ -
138 treeIndex_(0)
│ │ │ │ -
139 {}
│ │ │ │ +
48template<class PB>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
50{
│ │ │ │ +
51
│ │ │ │ +
52public:
│ │ │ │ +
53
│ │ │ │ +
55 using PreBasis = PB;
│ │ │ │ +
56
│ │ │ │ +
58 using PrefixPath = TypeTree::HybridTreePath<>;
│ │ │ │ +
59
│ │ │ │ +
61 using GridView = typename PreBasis::GridView;
│ │ │ │ +
62
│ │ │ │ +
64 using size_type = std::size_t;
│ │ │ │ +
65
│ │ │ │ + │ │ │ │ +
68
│ │ │ │ + │ │ │ │ +
71
│ │ │ │ +
73 using SizePrefix = Dune::ReservedVector<std::size_t, PreBasis::multiIndexBufferSize>;
│ │ │ │ +
74
│ │ │ │ +
83 template<class... T,
│ │ │ │ +
84 disableCopyMove<DefaultGlobalBasis, T...> = 0,
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
87 preBasis_(std::forward<T>(t)...),
│ │ │ │ + │ │ │ │ +
89 {
│ │ │ │ +
90 static_assert(models<Concept::PreBasis<GridView>, PreBasis>(), "Type passed to DefaultGlobalBasis does not model the PreBasis concept.");
│ │ │ │ +
91 preBasis_.initializeIndices();
│ │ │ │ +
92 }
│ │ │ │ +
│ │ │ │ +
93
│ │ │ │ +
100 template<class PreBasisFactory,
│ │ │ │ +
101 std::enable_if_t<Dune::IsCallable<PreBasisFactory(GridView), PreBasis>::value, int> = 0>
│ │ │ │ +
│ │ │ │ +
102 DefaultGlobalBasis(const GridView& gridView, PreBasisFactory&& factory) :
│ │ │ │ +
103 preBasis_(factory(gridView)),
│ │ │ │ + │ │ │ │ +
105 {
│ │ │ │ +
106 static_assert(models<Concept::PreBasis<GridView>, PreBasis>(), "Type passed to DefaultGlobalBasis does not model the PreBasis concept.");
│ │ │ │ +
107 preBasis_.initializeIndices();
│ │ │ │ +
108 }
│ │ │ │ +
│ │ │ │ +
109
│ │ │ │ +
│ │ │ │ +
111 const GridView& gridView() const
│ │ │ │ +
112 {
│ │ │ │ +
113 return preBasis_.gridView();
│ │ │ │ +
114 }
│ │ │ │ +
│ │ │ │ +
115
│ │ │ │ +
│ │ │ │ +
117 const PreBasis& preBasis() const
│ │ │ │ +
118 {
│ │ │ │ +
119 return preBasis_;
│ │ │ │ +
120 }
│ │ │ │ +
│ │ │ │ +
121
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
124 {
│ │ │ │ +
125 return preBasis_;
│ │ │ │ +
126 }
│ │ │ │ +
│ │ │ │ +
127
│ │ │ │ +
│ │ │ │ +
134 void update(const GridView & gv)
│ │ │ │ +
135 {
│ │ │ │ +
136 preBasis_.update(gv);
│ │ │ │ +
137 preBasis_.initializeIndices();
│ │ │ │ +
138 }
│ │ │ │
│ │ │ │ -
140
│ │ │ │ +
139
│ │ │ │
│ │ │ │ - │ │ │ │ -
142 {
│ │ │ │ -
143 assert(i < size_);
│ │ │ │ -
144 return offset_ + i;
│ │ │ │ -
145 }
│ │ │ │ + │ │ │ │ +
142 {
│ │ │ │ +
143 return preBasis_.dimension();
│ │ │ │ +
144 }
│ │ │ │
│ │ │ │ -
146
│ │ │ │ +
145
│ │ │ │
│ │ │ │ - │ │ │ │ -
148 {
│ │ │ │ -
149 return size_;
│ │ │ │ -
150 }
│ │ │ │ + │ │ │ │ +
148 {
│ │ │ │ +
149 return preBasis_.size();
│ │ │ │ +
150 }
│ │ │ │
│ │ │ │
151
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
153 {
│ │ │ │ -
154 return treeIndex_;
│ │ │ │ -
155 }
│ │ │ │ -
│ │ │ │ -
156
│ │ │ │ -
157 protected:
│ │ │ │ -
158
│ │ │ │ +
│ │ │ │ +
153 size_type size(const SizePrefix& prefix) const
│ │ │ │ +
154 {
│ │ │ │ +
155 return preBasis_.size(prefix);
│ │ │ │ +
156 }
│ │ │ │ +
│ │ │ │ +
157
│ │ │ │
│ │ │ │ - │ │ │ │ -
160 {
│ │ │ │ -
161 return offset_;
│ │ │ │ -
162 }
│ │ │ │ + │ │ │ │ +
160 {
│ │ │ │ +
161 return LocalView(*this);
│ │ │ │ +
162 }
│ │ │ │
│ │ │ │
163
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
165 {
│ │ │ │ -
166 offset_ = offset;
│ │ │ │ -
167 }
│ │ │ │ -
│ │ │ │ -
168
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
170 {
│ │ │ │ -
171 size_ = size;
│ │ │ │ -
172 }
│ │ │ │ -
│ │ │ │ -
173
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
175 {
│ │ │ │ -
176 treeIndex_ = treeIndex;
│ │ │ │ -
177 }
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
166 {
│ │ │ │ +
167 return *this;
│ │ │ │ +
168 }
│ │ │ │ +
│ │ │ │ +
169
│ │ │ │ +
│ │ │ │ +
171 const PrefixPath& prefixPath() const
│ │ │ │ +
172 {
│ │ │ │ +
173 return prefixPath_;
│ │ │ │ +
174 }
│ │ │ │ +
│ │ │ │ +
175
│ │ │ │ +
176protected:
│ │ │ │ + │ │ │ │ + │ │ │ │ +
179};
│ │ │ │
│ │ │ │ -
178
│ │ │ │ -
179 private:
│ │ │ │
180
│ │ │ │ -
181 size_type offset_;
│ │ │ │ -
182 size_type size_;
│ │ │ │ -
183 size_type treeIndex_;
│ │ │ │ -
184
│ │ │ │ -
185 };
│ │ │ │ -
│ │ │ │ -
186
│ │ │ │ -
187
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
189 public BasisNodeMixin,
│ │ │ │ -
190 public TypeTree::LeafNode
│ │ │ │ -
191 {};
│ │ │ │ -
│ │ │ │ +
181
│ │ │ │ +
182
│ │ │ │ +
183template<class PreBasis>
│ │ │ │ + │ │ │ │ +
185
│ │ │ │ +
186template<class GridView, class PreBasisFactory>
│ │ │ │ +
187DefaultGlobalBasis(const GridView& gv, PreBasisFactory&& f) -> DefaultGlobalBasis<std::decay_t<decltype(f(gv))>>;
│ │ │ │ +
188
│ │ │ │ +
189
│ │ │ │ +
190
│ │ │ │ +
191namespace BasisFactory {
│ │ │ │
192
│ │ │ │ -
193
│ │ │ │ -
194 template<typename T, std::size_t n>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
196 public BasisNodeMixin,
│ │ │ │ -
197 public TypeTree::PowerNode<T,n>
│ │ │ │ -
198 {
│ │ │ │ -
199
│ │ │ │ -
200 using Node = TypeTree::PowerNode<T,n>;
│ │ │ │ -
201
│ │ │ │ -
202 public:
│ │ │ │ +
193template<class GridView, class PreBasisFactory>
│ │ │ │ +
│ │ │ │ +
194auto makeBasis(const GridView& gridView, PreBasisFactory&& preBasisFactory)
│ │ │ │ +
195{
│ │ │ │ +
196 return DefaultGlobalBasis(preBasisFactory(gridView));
│ │ │ │ +
197}
│ │ │ │ +
│ │ │ │ +
198
│ │ │ │ +
199} // end namespace BasisFactory
│ │ │ │ +
200
│ │ │ │ +
201// Backward compatibility
│ │ │ │ +
202namespace [[deprecated("Will be removed after Dune 2.10")]] BasisBuilder {
│ │ │ │
203
│ │ │ │ -
204 using Element = typename T::Element;
│ │ │ │ +
204 using namespace BasisFactory;
│ │ │ │
205
│ │ │ │ -
206 PowerBasisNode() = default;
│ │ │ │ +
206}
│ │ │ │
207
│ │ │ │ -
│ │ │ │ -
208 PowerBasisNode(const typename Node::NodeStorage& children) :
│ │ │ │ -
209 Node(children)
│ │ │ │ -
210 {}
│ │ │ │ -
│ │ │ │ +
208
│ │ │ │ +
209} // end namespace Functions
│ │ │ │ +
210} // end namespace Dune
│ │ │ │
211
│ │ │ │ -
│ │ │ │ -
212 const Element& element() const
│ │ │ │ -
213 {
│ │ │ │ -
214 return this->child(Dune::Indices::_0).element();
│ │ │ │ -
215 }
│ │ │ │ -
│ │ │ │ -
216
│ │ │ │ -
217 };
│ │ │ │ -
│ │ │ │ -
218
│ │ │ │ -
219
│ │ │ │ -
220 template<typename T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
222 public BasisNodeMixin,
│ │ │ │ -
223 public TypeTree::DynamicPowerNode<T>
│ │ │ │ -
224 {
│ │ │ │ -
225
│ │ │ │ -
226 using Node = TypeTree::DynamicPowerNode<T>;
│ │ │ │ -
227
│ │ │ │ -
228 public:
│ │ │ │ -
229
│ │ │ │ -
230 using Element = typename T::Element;
│ │ │ │ -
231
│ │ │ │ -
│ │ │ │ -
232 DynamicPowerBasisNode (std::size_t children)
│ │ │ │ -
233 : Node(children)
│ │ │ │ -
234 {}
│ │ │ │ -
│ │ │ │ -
235
│ │ │ │ -
│ │ │ │ -
236 DynamicPowerBasisNode (typename Node::NodeStorage children)
│ │ │ │ -
237 : Node(std::move(children))
│ │ │ │ -
238 {}
│ │ │ │ -
│ │ │ │ -
239
│ │ │ │ -
│ │ │ │ -
240 const Element& element() const
│ │ │ │ -
241 {
│ │ │ │ -
242 return this->child(0).element();
│ │ │ │ -
243 }
│ │ │ │ -
│ │ │ │ -
244
│ │ │ │ -
245 };
│ │ │ │ -
│ │ │ │ -
246
│ │ │ │ -
247
│ │ │ │ -
248 template<typename... T>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
250 public BasisNodeMixin,
│ │ │ │ -
251 public TypeTree::CompositeNode<T...>
│ │ │ │ -
252 {
│ │ │ │ -
253
│ │ │ │ -
254 using Node = TypeTree::CompositeNode<T...>;
│ │ │ │ -
255
│ │ │ │ -
256 public:
│ │ │ │ -
257
│ │ │ │ -
258 using Element = typename Node::template Child<0>::Type::Element;
│ │ │ │ -
259
│ │ │ │ - │ │ │ │ -
261
│ │ │ │ -
│ │ │ │ -
262 CompositeBasisNode(const typename Node::NodeStorage& children) :
│ │ │ │ -
263 Node(children)
│ │ │ │ -
264 {}
│ │ │ │ -
│ │ │ │ -
265
│ │ │ │ -
266 template<typename... Children>
│ │ │ │ -
│ │ │ │ -
267 CompositeBasisNode(const std::shared_ptr<Children>&... children) :
│ │ │ │ -
268 Node(children...)
│ │ │ │ -
269 {}
│ │ │ │ -
│ │ │ │ -
270
│ │ │ │ -
│ │ │ │ -
271 const Element& element() const
│ │ │ │ -
272 {
│ │ │ │ -
273 return this->child(Dune::Indices::_0).element();
│ │ │ │ -
274 }
│ │ │ │ -
│ │ │ │ -
275
│ │ │ │ -
276 };
│ │ │ │ -
│ │ │ │ -
277
│ │ │ │ -
278
│ │ │ │ -
279 template<typename Tree>
│ │ │ │ -
│ │ │ │ -
280 void clearSize(Tree& tree, std::size_t offset)
│ │ │ │ -
281 {
│ │ │ │ -
282 TypeTree::applyToTree(tree,Impl::ClearSizeVisitor(offset));
│ │ │ │ -
283 }
│ │ │ │ -
│ │ │ │ -
284
│ │ │ │ -
285 template<typename Tree, typename Entity>
│ │ │ │ -
│ │ │ │ -
286 void bindTree(Tree& tree, const Entity& entity, std::size_t offset = 0)
│ │ │ │ -
287 {
│ │ │ │ -
288 Impl::BindVisitor<Entity> visitor(entity,offset);
│ │ │ │ -
289 TypeTree::applyToTree(tree,visitor);
│ │ │ │ -
290 }
│ │ │ │ -
│ │ │ │ -
291
│ │ │ │ -
292 template<typename Tree>
│ │ │ │ -
│ │ │ │ -
293 void initializeTree(Tree& tree, std::size_t treeIndexOffset = 0)
│ │ │ │ -
294 {
│ │ │ │ -
295 Impl::InitializeTreeVisitor visitor(treeIndexOffset);
│ │ │ │ -
296 TypeTree::applyToTree(tree,visitor);
│ │ │ │ -
297 }
│ │ │ │ -
│ │ │ │ -
298
│ │ │ │ -
299
│ │ │ │ -
300 } // namespace Functions
│ │ │ │ -
301
│ │ │ │ -
302} // namespace Dune
│ │ │ │ -
303
│ │ │ │ -
304#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH
│ │ │ │ +
212
│ │ │ │ +
213
│ │ │ │ +
214#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ +
std::enable_if_t< std::is_constructible_v< T, Args... >, int > enableIfConstructible
Helper to constrain forwarding constructors.
Definition type_traits.hh:31
│ │ │ │
Definition polynomial.hh:17
│ │ │ │ -
void clearSize(Tree &tree, std::size_t offset)
Definition nodes.hh:280
│ │ │ │ -
void bindTree(Tree &tree, const Entity &entity, std::size_t offset=0)
Definition nodes.hh:286
│ │ │ │ -
void initializeTree(Tree &tree, std::size_t treeIndexOffset=0)
Definition nodes.hh:293
│ │ │ │ -
Definition nodes.hh:122
│ │ │ │ -
size_type treeIndex() const
Definition nodes.hh:152
│ │ │ │ -
size_type localIndex(size_type i) const
Definition nodes.hh:141
│ │ │ │ -
size_type offset() const
Definition nodes.hh:159
│ │ │ │ -
size_type size() const
Definition nodes.hh:147
│ │ │ │ -
void setOffset(const size_type offset)
Definition nodes.hh:164
│ │ │ │ -
std::size_t size_type
Definition nodes.hh:133
│ │ │ │ -
BasisNodeMixin()
Definition nodes.hh:135
│ │ │ │ -
void setSize(const size_type size)
Definition nodes.hh:169
│ │ │ │ -
void setTreeIndex(size_type treeIndex)
Definition nodes.hh:174
│ │ │ │ -
Definition nodes.hh:191
│ │ │ │ -
Definition nodes.hh:198
│ │ │ │ -
const Element & element() const
Definition nodes.hh:212
│ │ │ │ -
typename T::Element Element
Definition nodes.hh:204
│ │ │ │ -
PowerBasisNode(const typename Node::NodeStorage &children)
Definition nodes.hh:208
│ │ │ │ - │ │ │ │ - │ │ │ │ -
const Element & element() const
Definition nodes.hh:240
│ │ │ │ -
DynamicPowerBasisNode(typename Node::NodeStorage children)
Definition nodes.hh:236
│ │ │ │ -
DynamicPowerBasisNode(std::size_t children)
Definition nodes.hh:232
│ │ │ │ -
typename T::Element Element
Definition nodes.hh:230
│ │ │ │ - │ │ │ │ - │ │ │ │ -
CompositeBasisNode(const typename Node::NodeStorage &children)
Definition nodes.hh:262
│ │ │ │ -
const Element & element() const
Definition nodes.hh:271
│ │ │ │ -
typename Node::template Child< 0 >::Type::Element Element
Definition nodes.hh:258
│ │ │ │ -
CompositeBasisNode(const std::shared_ptr< Children > &... children)
Definition nodes.hh:267
│ │ │ │ +
auto makeBasis(const GridView &gridView, PreBasisFactory &&preBasisFactory)
Definition defaultglobalbasis.hh:194
│ │ │ │ +
Global basis for given pre-basis.
Definition defaultglobalbasis.hh:50
│ │ │ │ +
Dune::ReservedVector< std::size_t, PreBasis::multiIndexBufferSize > SizePrefix
Type used for prefixes handed to the size() method.
Definition defaultglobalbasis.hh:73
│ │ │ │ +
std::size_t size_type
Type used for indices and size information.
Definition defaultglobalbasis.hh:64
│ │ │ │ +
typename PreBasis::GridView GridView
The grid view that the FE space is defined on.
Definition defaultglobalbasis.hh:61
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition defaultglobalbasis.hh:111
│ │ │ │ +
PB PreBasis
Pre-basis providing the implementation details.
Definition defaultglobalbasis.hh:55
│ │ │ │ +
PreBasis & preBasis()
Obtain the pre-basis providing the implementation details.
Definition defaultglobalbasis.hh:123
│ │ │ │ +
void update(const GridView &gv)
Update the stored grid view.
Definition defaultglobalbasis.hh:134
│ │ │ │ +
DefaultLocalView< DefaultGlobalBasis< PreBasis > > LocalView
Type of the local view on the restriction of the basis to a single element.
Definition defaultglobalbasis.hh:67
│ │ │ │ +
typename LocalView::MultiIndex MultiIndex
Type used for global numbering of the basis vectors.
Definition defaultglobalbasis.hh:70
│ │ │ │ +
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition defaultglobalbasis.hh:153
│ │ │ │ +
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition defaultglobalbasis.hh:141
│ │ │ │ +
PreBasis preBasis_
Definition defaultglobalbasis.hh:177
│ │ │ │ +
LocalView localView() const
Return local view for basis.
Definition defaultglobalbasis.hh:159
│ │ │ │ +
TypeTree::HybridTreePath<> PrefixPath
The empty prefix path that identifies the root in the local ansatz tree.
Definition defaultglobalbasis.hh:58
│ │ │ │ +
DefaultGlobalBasis(T &&... t)
Constructor.
Definition defaultglobalbasis.hh:86
│ │ │ │ +
DefaultGlobalBasis(const GridView &gridView, PreBasisFactory &&factory)
Constructor from a PreBasis factory.
Definition defaultglobalbasis.hh:102
│ │ │ │ +
size_type size() const
Return number of possible values for next position in empty multi index.
Definition defaultglobalbasis.hh:147
│ │ │ │ +
const PreBasis & preBasis() const
Obtain the pre-basis providing the implementation details.
Definition defaultglobalbasis.hh:117
│ │ │ │ +
PrefixPath prefixPath_
Definition defaultglobalbasis.hh:178
│ │ │ │ +
const DefaultGlobalBasis & rootBasis() const
Return *this because we are not embedded in a larger basis.
Definition defaultglobalbasis.hh:165
│ │ │ │ +
const PrefixPath & prefixPath() const
Return empty path, because this is the root in the local ansatz tree.
Definition defaultglobalbasis.hh:171
│ │ │ │ +
The restriction of a finite element basis to a single element.
Definition defaultlocalview.hh:32
│ │ │ │ +
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:68
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,402 +1,285 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -nodes.hh │ │ │ │ │ +defaultglobalbasis.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12 │ │ │ │ │ -13#include │ │ │ │ │ -14 │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17#include │ │ │ │ │ -18#include │ │ │ │ │ -19#include │ │ │ │ │ -20#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13 │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17 │ │ │ │ │ +18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_c_o_m_m_o_n_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ │ +19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_l_o_c_a_l_v_i_e_w_._h_h> │ │ │ │ │ +20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_c_e_p_t_s_._h_h> │ │ │ │ │ 21 │ │ │ │ │ -22namespace _D_u_n_e { │ │ │ │ │ -23 namespace Functions { │ │ │ │ │ -24 │ │ │ │ │ -25 │ │ │ │ │ -26 namespace Impl { │ │ │ │ │ +22 │ │ │ │ │ +23 │ │ │ │ │ +24namespace _D_u_n_e { │ │ │ │ │ +25namespace Functions { │ │ │ │ │ +26 │ │ │ │ │ 27 │ │ │ │ │ 28 │ │ │ │ │ -29 struct ClearSizeVisitor │ │ │ │ │ -30 : public TypeTree::TreeVisitor │ │ │ │ │ -31 , public TypeTree::DynamicTraversal │ │ │ │ │ -32 { │ │ │ │ │ -33 │ │ │ │ │ -34 template │ │ │ │ │ -35 void pre(Node& node, TreePath treePath) │ │ │ │ │ -36 { │ │ │ │ │ -37 leaf(node,treePath); │ │ │ │ │ -38 node.setSize(0); │ │ │ │ │ -39 } │ │ │ │ │ -40 │ │ │ │ │ -41 template │ │ │ │ │ -42 void leaf(Node& node, TreePath treePath) │ │ │ │ │ -43 { │ │ │ │ │ -44 node.setOffset(offset_); │ │ │ │ │ -45 } │ │ │ │ │ -46 │ │ │ │ │ -47 ClearSizeVisitor(std::size_t offset) │ │ │ │ │ -48 : offset_(offset) │ │ │ │ │ -49 {} │ │ │ │ │ -50 │ │ │ │ │ -51 const std::size_t offset_; │ │ │ │ │ -52 │ │ │ │ │ -53 }; │ │ │ │ │ -54 │ │ │ │ │ -55 │ │ │ │ │ -56 template │ │ │ │ │ -57 struct BindVisitor │ │ │ │ │ -58 : public TypeTree::TreeVisitor │ │ │ │ │ -59 , public TypeTree::DynamicTraversal │ │ │ │ │ -60 { │ │ │ │ │ -61 │ │ │ │ │ -62 template │ │ │ │ │ -63 void pre(Node& node, TreePath) │ │ │ │ │ -64 { │ │ │ │ │ -65 node.setOffset(offset_); │ │ │ │ │ -66 } │ │ │ │ │ -67 │ │ │ │ │ -68 template │ │ │ │ │ -69 void post(Node& node, TreePath) │ │ │ │ │ -70 { │ │ │ │ │ -71 node.setSize(offset_ - node.offset()); │ │ │ │ │ -72 } │ │ │ │ │ -73 │ │ │ │ │ -74 template │ │ │ │ │ -75 void leaf(Node& node, TreePath) │ │ │ │ │ -76 { │ │ │ │ │ -77 node.setOffset(offset_); │ │ │ │ │ -78 node.bind(entity_); │ │ │ │ │ -79 offset_ += node.size(); │ │ │ │ │ -80 } │ │ │ │ │ -81 │ │ │ │ │ -82 BindVisitor(const Entity& entity, std::size_t offset = 0) │ │ │ │ │ -83 : entity_(entity) │ │ │ │ │ -84 , offset_(offset) │ │ │ │ │ -85 {} │ │ │ │ │ -86 │ │ │ │ │ -87 const Entity& entity_; │ │ │ │ │ -88 std::size_t offset_; │ │ │ │ │ -89 │ │ │ │ │ -90 }; │ │ │ │ │ -91 │ │ │ │ │ -92 │ │ │ │ │ -93 struct InitializeTreeVisitor : │ │ │ │ │ -94 public TypeTree::TreeVisitor, │ │ │ │ │ -95 public TypeTree::DynamicTraversal │ │ │ │ │ -96 { │ │ │ │ │ -97 template │ │ │ │ │ -98 void pre(Node& node, TreePath) │ │ │ │ │ -99 { │ │ │ │ │ -100 node.setTreeIndex(treeIndex_); │ │ │ │ │ -101 ++treeIndex_; │ │ │ │ │ -102 } │ │ │ │ │ -103 │ │ │ │ │ -104 template │ │ │ │ │ -105 void leaf(Node& node, TreePath) │ │ │ │ │ -106 { │ │ │ │ │ -107 node.setTreeIndex(treeIndex_); │ │ │ │ │ -108 ++treeIndex_; │ │ │ │ │ -109 } │ │ │ │ │ -110 │ │ │ │ │ -111 InitializeTreeVisitor(std::size_t treeIndexOffset = 0) : │ │ │ │ │ -112 treeIndex_(treeIndexOffset) │ │ │ │ │ -113 {} │ │ │ │ │ -114 │ │ │ │ │ -115 std::size_t treeIndex_; │ │ │ │ │ -116 }; │ │ │ │ │ -117 │ │ │ │ │ -118 } // end namespace Impl │ │ │ │ │ -119 │ │ │ │ │ -120 │ │ │ │ │ -_1_2_1 class _B_a_s_i_s_N_o_d_e_M_i_x_i_n │ │ │ │ │ -122 { │ │ │ │ │ -123 │ │ │ │ │ -124 friend struct Impl::ClearSizeVisitor; │ │ │ │ │ -125 │ │ │ │ │ -126 template │ │ │ │ │ -127 friend struct Impl::BindVisitor; │ │ │ │ │ -128 │ │ │ │ │ -129 friend struct Impl::InitializeTreeVisitor; │ │ │ │ │ -130 │ │ │ │ │ -131 public: │ │ │ │ │ -132 │ │ │ │ │ -_1_3_3 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ -134 │ │ │ │ │ -_1_3_5 _B_a_s_i_s_N_o_d_e_M_i_x_i_n() : │ │ │ │ │ -136 offset_(0), │ │ │ │ │ -137 size_(0), │ │ │ │ │ -138 treeIndex_(0) │ │ │ │ │ -139 {} │ │ │ │ │ -140 │ │ │ │ │ -_1_4_1 _s_i_z_e___t_y_p_e _l_o_c_a_l_I_n_d_e_x(_s_i_z_e___t_y_p_e i) const │ │ │ │ │ +48template │ │ │ │ │ +_4_9class _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ +50{ │ │ │ │ │ +51 │ │ │ │ │ +52public: │ │ │ │ │ +53 │ │ │ │ │ +_5_5 using _P_r_e_B_a_s_i_s = PB; │ │ │ │ │ +56 │ │ │ │ │ +_5_8 using _P_r_e_f_i_x_P_a_t_h = TypeTree::HybridTreePath<>; │ │ │ │ │ +59 │ │ │ │ │ +_6_1 using _G_r_i_d_V_i_e_w = typename PreBasis::GridView; │ │ │ │ │ +62 │ │ │ │ │ +_6_4 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ +65 │ │ │ │ │ +_6_7 using _L_o_c_a_l_V_i_e_w = _D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_<_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_<_P_r_e_B_a_s_i_s_>>; │ │ │ │ │ +68 │ │ │ │ │ +_7_0 using _M_u_l_t_i_I_n_d_e_x = typename _L_o_c_a_l_V_i_e_w_:_:_M_u_l_t_i_I_n_d_e_x; │ │ │ │ │ +71 │ │ │ │ │ +_7_3 using _S_i_z_e_P_r_e_f_i_x = Dune::ReservedVector; │ │ │ │ │ +74 │ │ │ │ │ +83 template = 0, │ │ │ │ │ +85 _e_n_a_b_l_e_I_f_C_o_n_s_t_r_u_c_t_i_b_l_e<_P_r_e_B_a_s_i_s, T...> = 0> │ │ │ │ │ +_8_6 _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s(T&&... t) : │ │ │ │ │ +87 _p_r_e_B_a_s_i_s__(std::forward(t)...), │ │ │ │ │ +88 _p_r_e_f_i_x_P_a_t_h__() │ │ │ │ │ +89 { │ │ │ │ │ +90 static_assert(models, _P_r_e_B_a_s_i_s>(), "Type passed │ │ │ │ │ +to DefaultGlobalBasis does not model the PreBasis concept."); │ │ │ │ │ +91 _p_r_e_B_a_s_i_s__.initializeIndices(); │ │ │ │ │ +92 } │ │ │ │ │ +93 │ │ │ │ │ +100 template:: │ │ │ │ │ +value, int> = 0> │ │ │ │ │ +_1_0_2 _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s(const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w, PreBasisFactory&& factory) : │ │ │ │ │ +103 _p_r_e_B_a_s_i_s__(factory(_g_r_i_d_V_i_e_w)), │ │ │ │ │ +104 _p_r_e_f_i_x_P_a_t_h__() │ │ │ │ │ +105 { │ │ │ │ │ +106 static_assert(models, _P_r_e_B_a_s_i_s>(), "Type passed │ │ │ │ │ +to DefaultGlobalBasis does not model the PreBasis concept."); │ │ │ │ │ +107 _p_r_e_B_a_s_i_s__.initializeIndices(); │ │ │ │ │ +108 } │ │ │ │ │ +109 │ │ │ │ │ +_1_1_1 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ +112 { │ │ │ │ │ +113 return _p_r_e_B_a_s_i_s__.gridView(); │ │ │ │ │ +114 } │ │ │ │ │ +115 │ │ │ │ │ +_1_1_7 const _P_r_e_B_a_s_i_s& _p_r_e_B_a_s_i_s() const │ │ │ │ │ +118 { │ │ │ │ │ +119 return _p_r_e_B_a_s_i_s__; │ │ │ │ │ +120 } │ │ │ │ │ +121 │ │ │ │ │ +_1_2_3 _P_r_e_B_a_s_i_s& _p_r_e_B_a_s_i_s() │ │ │ │ │ +124 { │ │ │ │ │ +125 return _p_r_e_B_a_s_i_s__; │ │ │ │ │ +126 } │ │ │ │ │ +127 │ │ │ │ │ +_1_3_4 void _u_p_d_a_t_e(const _G_r_i_d_V_i_e_w & gv) │ │ │ │ │ +135 { │ │ │ │ │ +136 _p_r_e_B_a_s_i_s__.update(gv); │ │ │ │ │ +137 _p_r_e_B_a_s_i_s__.initializeIndices(); │ │ │ │ │ +138 } │ │ │ │ │ +139 │ │ │ │ │ +_1_4_1 _s_i_z_e___t_y_p_e _d_i_m_e_n_s_i_o_n() const │ │ │ │ │ 142 { │ │ │ │ │ -143 assert(i < size_); │ │ │ │ │ -144 return offset_ + i; │ │ │ │ │ -145 } │ │ │ │ │ -146 │ │ │ │ │ +143 return _p_r_e_B_a_s_i_s__.dimension(); │ │ │ │ │ +144 } │ │ │ │ │ +145 │ │ │ │ │ _1_4_7 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ 148 { │ │ │ │ │ -149 return size_; │ │ │ │ │ +149 return _p_r_e_B_a_s_i_s__.size(); │ │ │ │ │ 150 } │ │ │ │ │ 151 │ │ │ │ │ -_1_5_2 _s_i_z_e___t_y_p_e _t_r_e_e_I_n_d_e_x() const │ │ │ │ │ -153 { │ │ │ │ │ -154 return treeIndex_; │ │ │ │ │ -155 } │ │ │ │ │ -156 │ │ │ │ │ -157 protected: │ │ │ │ │ -158 │ │ │ │ │ -_1_5_9 _s_i_z_e___t_y_p_e _o_f_f_s_e_t() const │ │ │ │ │ +_1_5_3 _s_i_z_e___t_y_p_e _s_i_z_e(const _S_i_z_e_P_r_e_f_i_x& prefix) const │ │ │ │ │ +154 { │ │ │ │ │ +155 return _p_r_e_B_a_s_i_s__.size(prefix); │ │ │ │ │ +156 } │ │ │ │ │ +157 │ │ │ │ │ +_1_5_9 _L_o_c_a_l_V_i_e_w _l_o_c_a_l_V_i_e_w() const │ │ │ │ │ 160 { │ │ │ │ │ -161 return offset_; │ │ │ │ │ +161 return _L_o_c_a_l_V_i_e_w(*this); │ │ │ │ │ 162 } │ │ │ │ │ 163 │ │ │ │ │ -_1_6_4 void _s_e_t_O_f_f_s_e_t(const _s_i_z_e___t_y_p_e _o_f_f_s_e_t) │ │ │ │ │ -165 { │ │ │ │ │ -166 offset_ = _o_f_f_s_e_t; │ │ │ │ │ -167 } │ │ │ │ │ -168 │ │ │ │ │ -_1_6_9 void _s_e_t_S_i_z_e(const _s_i_z_e___t_y_p_e _s_i_z_e) │ │ │ │ │ -170 { │ │ │ │ │ -171 size_ = _s_i_z_e; │ │ │ │ │ -172 } │ │ │ │ │ -173 │ │ │ │ │ -_1_7_4 void _s_e_t_T_r_e_e_I_n_d_e_x(_s_i_z_e___t_y_p_e _t_r_e_e_I_n_d_e_x) │ │ │ │ │ -175 { │ │ │ │ │ -176 treeIndex_ = _t_r_e_e_I_n_d_e_x; │ │ │ │ │ -177 } │ │ │ │ │ -178 │ │ │ │ │ -179 private: │ │ │ │ │ +_1_6_5 const _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s& _r_o_o_t_B_a_s_i_s() const │ │ │ │ │ +166 { │ │ │ │ │ +167 return *this; │ │ │ │ │ +168 } │ │ │ │ │ +169 │ │ │ │ │ +_1_7_1 const _P_r_e_f_i_x_P_a_t_h& _p_r_e_f_i_x_P_a_t_h() const │ │ │ │ │ +172 { │ │ │ │ │ +173 return _p_r_e_f_i_x_P_a_t_h__; │ │ │ │ │ +174 } │ │ │ │ │ +175 │ │ │ │ │ +176protected: │ │ │ │ │ +_1_7_7 _P_r_e_B_a_s_i_s _p_r_e_B_a_s_i_s__; │ │ │ │ │ +_1_7_8 _P_r_e_f_i_x_P_a_t_h _p_r_e_f_i_x_P_a_t_h__; │ │ │ │ │ +179}; │ │ │ │ │ 180 │ │ │ │ │ -181 _s_i_z_e___t_y_p_e offset_; │ │ │ │ │ -182 _s_i_z_e___t_y_p_e size_; │ │ │ │ │ -183 _s_i_z_e___t_y_p_e treeIndex_; │ │ │ │ │ -184 │ │ │ │ │ -185 }; │ │ │ │ │ -186 │ │ │ │ │ -187 │ │ │ │ │ -_1_8_8 class _L_e_a_f_B_a_s_i_s_N_o_d_e : │ │ │ │ │ -189 public _B_a_s_i_s_N_o_d_e_M_i_x_i_n, │ │ │ │ │ -190 public TypeTree::LeafNode │ │ │ │ │ -191 {}; │ │ │ │ │ +181 │ │ │ │ │ +182 │ │ │ │ │ +183template │ │ │ │ │ +_1_8_4_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s(PreBasis&&) -> _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_<_s_t_d_:_: │ │ │ │ │ +_d_e_c_a_y___t_<_P_r_e_B_a_s_i_s_>>; │ │ │ │ │ +185 │ │ │ │ │ +186template │ │ │ │ │ +_1_8_7_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s(const GridView& gv, PreBasisFactory&& f) - │ │ │ │ │ +> _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s>; │ │ │ │ │ +188 │ │ │ │ │ +189 │ │ │ │ │ +190 │ │ │ │ │ +191namespace BasisFactory { │ │ │ │ │ 192 │ │ │ │ │ -193 │ │ │ │ │ -194 template │ │ │ │ │ -_1_9_5 class _P_o_w_e_r_B_a_s_i_s_N_o_d_e : │ │ │ │ │ -196 public _B_a_s_i_s_N_o_d_e_M_i_x_i_n, │ │ │ │ │ -197 public TypeTree::PowerNode │ │ │ │ │ -198 { │ │ │ │ │ -199 │ │ │ │ │ -200 using Node = TypeTree::PowerNode; │ │ │ │ │ -201 │ │ │ │ │ -202 public: │ │ │ │ │ +193template │ │ │ │ │ +_1_9_4auto _m_a_k_e_B_a_s_i_s(const GridView& gridView, PreBasisFactory&& preBasisFactory) │ │ │ │ │ +195{ │ │ │ │ │ +196 return _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s(preBasisFactory(gridView)); │ │ │ │ │ +197} │ │ │ │ │ +198 │ │ │ │ │ +199} // end namespace BasisFactory │ │ │ │ │ +200 │ │ │ │ │ +201// Backward compatibility │ │ │ │ │ +202namespace [[deprecated("Will be removed after Dune 2.10")]] BasisBuilder { │ │ │ │ │ 203 │ │ │ │ │ -_2_0_4 using _E_l_e_m_e_n_t = typename T::Element; │ │ │ │ │ +204 using namespace BasisFactory; │ │ │ │ │ 205 │ │ │ │ │ -_2_0_6 _P_o_w_e_r_B_a_s_i_s_N_o_d_e() = default; │ │ │ │ │ +206} │ │ │ │ │ 207 │ │ │ │ │ -_2_0_8 _P_o_w_e_r_B_a_s_i_s_N_o_d_e(const typename Node::NodeStorage& children) : │ │ │ │ │ -209 Node(children) │ │ │ │ │ -210 {} │ │ │ │ │ +208 │ │ │ │ │ +209} // end namespace Functions │ │ │ │ │ +210} // end namespace Dune │ │ │ │ │ 211 │ │ │ │ │ -_2_1_2 const _E_l_e_m_e_n_t& _e_l_e_m_e_n_t() const │ │ │ │ │ -213 { │ │ │ │ │ -214 return this->child(Dune::Indices::_0).element(); │ │ │ │ │ -215 } │ │ │ │ │ -216 │ │ │ │ │ -217 }; │ │ │ │ │ -218 │ │ │ │ │ -219 │ │ │ │ │ -220 template │ │ │ │ │ -_2_2_1 class _D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e : │ │ │ │ │ -222 public _B_a_s_i_s_N_o_d_e_M_i_x_i_n, │ │ │ │ │ -223 public TypeTree::DynamicPowerNode │ │ │ │ │ -224 { │ │ │ │ │ -225 │ │ │ │ │ -226 using Node = TypeTree::DynamicPowerNode; │ │ │ │ │ -227 │ │ │ │ │ -228 public: │ │ │ │ │ -229 │ │ │ │ │ -_2_3_0 using _E_l_e_m_e_n_t = typename T::Element; │ │ │ │ │ -231 │ │ │ │ │ -_2_3_2 _D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e (std::size_t children) │ │ │ │ │ -233 : Node(children) │ │ │ │ │ -234 {} │ │ │ │ │ -235 │ │ │ │ │ -_2_3_6 _D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e (typename Node::NodeStorage children) │ │ │ │ │ -237 : Node(std::move(children)) │ │ │ │ │ -238 {} │ │ │ │ │ -239 │ │ │ │ │ -_2_4_0 const _E_l_e_m_e_n_t& _e_l_e_m_e_n_t() const │ │ │ │ │ -241 { │ │ │ │ │ -242 return this->child(0).element(); │ │ │ │ │ -243 } │ │ │ │ │ -244 │ │ │ │ │ -245 }; │ │ │ │ │ -246 │ │ │ │ │ -247 │ │ │ │ │ -248 template │ │ │ │ │ -_2_4_9 class _C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e : │ │ │ │ │ -250 public _B_a_s_i_s_N_o_d_e_M_i_x_i_n, │ │ │ │ │ -251 public TypeTree::CompositeNode │ │ │ │ │ -252 { │ │ │ │ │ -253 │ │ │ │ │ -254 using Node = TypeTree::CompositeNode; │ │ │ │ │ -255 │ │ │ │ │ -256 public: │ │ │ │ │ -257 │ │ │ │ │ -_2_5_8 using _E_l_e_m_e_n_t = typename Node::template Child<0>::Type::Element; │ │ │ │ │ -259 │ │ │ │ │ -_2_6_0 _C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e() = default; │ │ │ │ │ -261 │ │ │ │ │ -_2_6_2 _C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e(const typename Node::NodeStorage& children) : │ │ │ │ │ -263 Node(children) │ │ │ │ │ -264 {} │ │ │ │ │ -265 │ │ │ │ │ -266 template │ │ │ │ │ -_2_6_7 _C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e(const std::shared_ptr&... children) : │ │ │ │ │ -268 Node(children...) │ │ │ │ │ -269 {} │ │ │ │ │ -270 │ │ │ │ │ -_2_7_1 const _E_l_e_m_e_n_t& _e_l_e_m_e_n_t() const │ │ │ │ │ -272 { │ │ │ │ │ -273 return this->child(Dune::Indices::_0).element(); │ │ │ │ │ -274 } │ │ │ │ │ -275 │ │ │ │ │ -276 }; │ │ │ │ │ -277 │ │ │ │ │ -278 │ │ │ │ │ -279 template │ │ │ │ │ -_2_8_0 void _c_l_e_a_r_S_i_z_e(Tree& tree, std::size_t offset) │ │ │ │ │ -281 { │ │ │ │ │ -282 TypeTree::applyToTree(tree,Impl::ClearSizeVisitor(offset)); │ │ │ │ │ -283 } │ │ │ │ │ -284 │ │ │ │ │ -285 template │ │ │ │ │ -_2_8_6 void _b_i_n_d_T_r_e_e(Tree& tree, const Entity& entity, std::size_t offset = 0) │ │ │ │ │ -287 { │ │ │ │ │ -288 Impl::BindVisitor visitor(entity,offset); │ │ │ │ │ -289 TypeTree::applyToTree(tree,visitor); │ │ │ │ │ -290 } │ │ │ │ │ -291 │ │ │ │ │ -292 template │ │ │ │ │ -_2_9_3 void _i_n_i_t_i_a_l_i_z_e_T_r_e_e(Tree& tree, std::size_t treeIndexOffset = 0) │ │ │ │ │ -294 { │ │ │ │ │ -295 Impl::InitializeTreeVisitor visitor(treeIndexOffset); │ │ │ │ │ -296 TypeTree::applyToTree(tree,visitor); │ │ │ │ │ -297 } │ │ │ │ │ -298 │ │ │ │ │ -299 │ │ │ │ │ -300 } // namespace Functions │ │ │ │ │ -301 │ │ │ │ │ -302} // namespace Dune │ │ │ │ │ -303 │ │ │ │ │ -304#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_NODES_HH │ │ │ │ │ +212 │ │ │ │ │ +213 │ │ │ │ │ +214#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_DEFAULTGLOBALBASIS_HH │ │ │ │ │ +_t_y_p_e___t_r_a_i_t_s_._h_h │ │ │ │ │ +_d_e_f_a_u_l_t_l_o_c_a_l_v_i_e_w_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_e_n_a_b_l_e_I_f_C_o_n_s_t_r_u_c_t_i_b_l_e │ │ │ │ │ +std::enable_if_t< std::is_constructible_v< T, Args... >, int > │ │ │ │ │ +enableIfConstructible │ │ │ │ │ +Helper to constrain forwarding constructors. │ │ │ │ │ +DDeeffiinniittiioonn type_traits.hh:31 │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_c_l_e_a_r_S_i_z_e │ │ │ │ │ -void clearSize(Tree &tree, std::size_t offset) │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:280 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_b_i_n_d_T_r_e_e │ │ │ │ │ -void bindTree(Tree &tree, const Entity &entity, std::size_t offset=0) │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:286 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_i_n_i_t_i_a_l_i_z_e_T_r_e_e │ │ │ │ │ -void initializeTree(Tree &tree, std::size_t treeIndexOffset=0) │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:293 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:122 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_t_r_e_e_I_n_d_e_x │ │ │ │ │ -size_type treeIndex() const │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:152 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_l_o_c_a_l_I_n_d_e_x │ │ │ │ │ -size_type localIndex(size_type i) const │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:141 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_o_f_f_s_e_t │ │ │ │ │ -size_type offset() const │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:159 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_i_z_e │ │ │ │ │ -size_type size() const │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:147 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_e_t_O_f_f_s_e_t │ │ │ │ │ -void setOffset(const size_type offset) │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:164 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_m_a_k_e_B_a_s_i_s │ │ │ │ │ +auto makeBasis(const GridView &gridView, PreBasisFactory &&preBasisFactory) │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:194 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ +Global basis for given pre-basis. │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:50 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_S_i_z_e_P_r_e_f_i_x │ │ │ │ │ +Dune::ReservedVector< std::size_t, PreBasis::multiIndexBufferSize > SizePrefix │ │ │ │ │ +Type used for prefixes handed to the size() method. │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ std::size_t size_type │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:133 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n │ │ │ │ │ -BasisNodeMixin() │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:135 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_e_t_S_i_z_e │ │ │ │ │ -void setSize(const size_type size) │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:169 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_e_t_T_r_e_e_I_n_d_e_x │ │ │ │ │ -void setTreeIndex(size_type treeIndex) │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:174 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:191 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_B_a_s_i_s_N_o_d_e │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:198 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_B_a_s_i_s_N_o_d_e_:_:_e_l_e_m_e_n_t │ │ │ │ │ -const Element & element() const │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:212 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_B_a_s_i_s_N_o_d_e_:_:_E_l_e_m_e_n_t │ │ │ │ │ -typename T::Element Element │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:204 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_B_a_s_i_s_N_o_d_e_:_:_P_o_w_e_r_B_a_s_i_s_N_o_d_e │ │ │ │ │ -PowerBasisNode(const typename Node::NodeStorage &children) │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:208 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_P_o_w_e_r_B_a_s_i_s_N_o_d_e_:_:_P_o_w_e_r_B_a_s_i_s_N_o_d_e │ │ │ │ │ -PowerBasisNode()=default │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:224 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e_:_:_e_l_e_m_e_n_t │ │ │ │ │ -const Element & element() const │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:240 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e_:_:_D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e │ │ │ │ │ -DynamicPowerBasisNode(typename Node::NodeStorage children) │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:236 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e_:_:_D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e │ │ │ │ │ -DynamicPowerBasisNode(std::size_t children) │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:232 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_y_n_a_m_i_c_P_o_w_e_r_B_a_s_i_s_N_o_d_e_:_:_E_l_e_m_e_n_t │ │ │ │ │ -typename T::Element Element │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:230 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:252 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e_:_:_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e │ │ │ │ │ -CompositeBasisNode()=default │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e_:_:_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e │ │ │ │ │ -CompositeBasisNode(const typename Node::NodeStorage &children) │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:262 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e_:_:_e_l_e_m_e_n_t │ │ │ │ │ -const Element & element() const │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:271 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e_:_:_E_l_e_m_e_n_t │ │ │ │ │ -typename Node::template Child< 0 >::Type::Element Element │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:258 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e_:_:_C_o_m_p_o_s_i_t_e_B_a_s_i_s_N_o_d_e │ │ │ │ │ -CompositeBasisNode(const std::shared_ptr< Children > &... children) │ │ │ │ │ -DDeeffiinniittiioonn nodes.hh:267 │ │ │ │ │ +Type used for indices and size information. │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:64 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ +typename PreBasis::GridView GridView │ │ │ │ │ +The grid view that the FE space is defined on. │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ +const GridView & gridView() const │ │ │ │ │ +Obtain the grid view that the basis is defined on. │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:111 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_P_r_e_B_a_s_i_s │ │ │ │ │ +PB PreBasis │ │ │ │ │ +Pre-basis providing the implementation details. │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:55 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_p_r_e_B_a_s_i_s │ │ │ │ │ +PreBasis & preBasis() │ │ │ │ │ +Obtain the pre-basis providing the implementation details. │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:123 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_u_p_d_a_t_e │ │ │ │ │ +void update(const GridView &gv) │ │ │ │ │ +Update the stored grid view. │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:134 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_L_o_c_a_l_V_i_e_w │ │ │ │ │ +DefaultLocalView< DefaultGlobalBasis< PreBasis > > LocalView │ │ │ │ │ +Type of the local view on the restriction of the basis to a single element. │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:67 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_M_u_l_t_i_I_n_d_e_x │ │ │ │ │ +typename LocalView::MultiIndex MultiIndex │ │ │ │ │ +Type used for global numbering of the basis vectors. │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:70 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ +size_type size(const SizePrefix &prefix) const │ │ │ │ │ +Return number of possible values for next position in multi index. │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:153 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ +size_type dimension() const │ │ │ │ │ +Get the total dimension of the space spanned by this basis. │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:141 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_p_r_e_B_a_s_i_s__ │ │ │ │ │ +PreBasis preBasis_ │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:177 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_l_o_c_a_l_V_i_e_w │ │ │ │ │ +LocalView localView() const │ │ │ │ │ +Return local view for basis. │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:159 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_P_r_e_f_i_x_P_a_t_h │ │ │ │ │ +TypeTree::HybridTreePath<> PrefixPath │ │ │ │ │ +The empty prefix path that identifies the root in the local ansatz tree. │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:58 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ +DefaultGlobalBasis(T &&... t) │ │ │ │ │ +Constructor. │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:86 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ +DefaultGlobalBasis(const GridView &gridView, PreBasisFactory &&factory) │ │ │ │ │ +Constructor from a PreBasis factory. │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:102 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_s_i_z_e │ │ │ │ │ +size_type size() const │ │ │ │ │ +Return number of possible values for next position in empty multi index. │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:147 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_p_r_e_B_a_s_i_s │ │ │ │ │ +const PreBasis & preBasis() const │ │ │ │ │ +Obtain the pre-basis providing the implementation details. │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:117 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_p_r_e_f_i_x_P_a_t_h__ │ │ │ │ │ +PrefixPath prefixPath_ │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:178 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_r_o_o_t_B_a_s_i_s │ │ │ │ │ +const DefaultGlobalBasis & rootBasis() const │ │ │ │ │ +Return *this because we are not embedded in a larger basis. │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:165 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_:_:_p_r_e_f_i_x_P_a_t_h │ │ │ │ │ +const PrefixPath & prefixPath() const │ │ │ │ │ +Return empty path, because this is the root in the local ansatz tree. │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:171 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w │ │ │ │ │ +The restriction of a finite element basis to a single element. │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:32 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_L_o_c_a_l_V_i_e_w_:_:_M_u_l_t_i_I_n_d_e_x │ │ │ │ │ +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. │ │ │ │ │ +DDeeffiinniittiioonn defaultlocalview.hh:68 │ │ │ │ │ +_c_o_n_c_e_p_t_s_._h_h │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00197.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: leafprebasismixin.hh File Reference │ │ │ │ +dune-functions: rannacherturekbasis.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,37 +71,61 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
leafprebasismixin.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Typedefs | │ │ │ │ +Functions
│ │ │ │ +
rannacherturekbasis.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <cassert>
│ │ │ │ -#include <cstddef>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <dune/functions/functionspacebases/containerdescriptors.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>
│ │ │ │ +#include <dune/functions/functionspacebases/leafprebasismixin.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Functions::LeafPreBasisMixin< Derived >
 A generic MixIn class for PreBasis. More...
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<typename GV >
using Dune::Functions::RannacherTurekBasis = DefaultGlobalBasis< RannacherTurekPreBasis< GV > >
 Rannacher-Turek basis.
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<class Dummy = void>
auto Dune::Functions::BasisFactory::rannacherTurek ()
 Create a pre-basis factory that can create a Rannacher-Turek pre-basis.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,25 +1,44 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -leafprebasismixin.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h> │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +rannacherturekbasis.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n_<_ _D_e_r_i_v_e_d_ _> │ │ │ │ │ -  A generic MixIn class for PreBasis. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_<_ _G_V_ _> │ │ │ │ │ +  Pre-basis for a Rannacher-Turek basis. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e_<_ _G_V_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │   │ │ │ │ │ +namespace   _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y │ │ │ │ │ +  │ │ │ │ │ +TTyyppeeddeeffss │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s< │ │ │ │ │ + _R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s< GV > > │ │ │ │ │ +  Rannacher-Turek basis. │ │ │ │ │ +  │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +auto  _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_r_a_n_n_a_c_h_e_r_T_u_r_e_k () │ │ │ │ │ +  Create a pre-basis factory that can create a Rannacher-Turek pre-basis. │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a00197_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-functions: leafprebasismixin.hh Source File │ │ │ │ +dune-functions: rannacherturekbasis.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,95 +74,268 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
leafprebasismixin.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
│ │ │ │
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
│ │ │ │
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
│ │ │ │
6
│ │ │ │ -
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LEAFPREBASISMIXIN_HH
│ │ │ │ -
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LEAFPREBASISMIXIN_HH
│ │ │ │ +
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH
│ │ │ │ +
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH
│ │ │ │
9
│ │ │ │ -
10#include <cassert>
│ │ │ │ -
11#include <cstddef>
│ │ │ │ -
12#include <type_traits>
│ │ │ │ +
10#include <dune/common/exceptions.hh>
│ │ │ │ +
11
│ │ │ │ +
12#include <dune/grid/common/capabilities.hh>
│ │ │ │
13
│ │ │ │ - │ │ │ │ -
15
│ │ │ │ -
16namespace Dune::Functions {
│ │ │ │ +
14#include <dune/localfunctions/common/localfiniteelementvariant.hh>
│ │ │ │ +
15#include <dune/localfunctions/rannacherturek.hh>
│ │ │ │ +
16#include <dune/localfunctions/crouzeixraviart.hh>
│ │ │ │
17
│ │ │ │ -
34template<class Derived>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
36{
│ │ │ │ -
37public:
│ │ │ │ -
39 using size_type = std::size_t;
│ │ │ │ -
40
│ │ │ │ -
42 static constexpr size_type maxMultiIndexSize = 1;
│ │ │ │ -
43
│ │ │ │ -
45 static constexpr size_type minMultiIndexSize = 1;
│ │ │ │ -
46
│ │ │ │ -
48 static constexpr size_type multiIndexBufferSize = 1;
│ │ │ │ -
49
│ │ │ │ -
51 template<class SizePrefix,
│ │ │ │ -
52 decltype(std::declval<SizePrefix>().size(), bool{}) = true>
│ │ │ │ -
│ │ │ │ -
53 size_type size(const SizePrefix& prefix) const
│ │ │ │ -
54 {
│ │ │ │ -
55 assert(prefix.size() == 0 || prefix.size() == 1);
│ │ │ │ -
56 return (prefix.size() == 0) ? derived().dimension() : 0;
│ │ │ │ -
57 }
│ │ │ │ -
│ │ │ │ -
58
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
61 {
│ │ │ │ -
62 return derived().dimension();
│ │ │ │ -
63 }
│ │ │ │ -
│ │ │ │ -
64
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
67 {
│ │ │ │ - │ │ │ │ -
69 }
│ │ │ │ -
│ │ │ │ -
70
│ │ │ │ -
71private:
│ │ │ │ -
72 const Derived& derived() const
│ │ │ │ -
73 {
│ │ │ │ -
74 return static_cast<const Derived&>(*this);
│ │ │ │ -
75 }
│ │ │ │ -
76};
│ │ │ │ -
│ │ │ │ -
77
│ │ │ │ -
78
│ │ │ │ -
79} // end namespace Dune::Functions
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
21
│ │ │ │ +
22
│ │ │ │ +
23namespace Dune {
│ │ │ │ +
24namespace Functions {
│ │ │ │ +
25
│ │ │ │ +
26// *****************************************************************************
│ │ │ │ +
27// This is the reusable part of the basis. It contains
│ │ │ │ +
28//
│ │ │ │ +
29// RannacherTurekPreBasis
│ │ │ │ +
30// RannacherTurekNode
│ │ │ │ +
31//
│ │ │ │ +
32// The pre-basis allows to create the others and is the owner of possible shared
│ │ │ │ +
33// state. These components do _not_ depend on the global basis and local view
│ │ │ │ +
34// and can be used without a global basis.
│ │ │ │ +
35// *****************************************************************************
│ │ │ │ +
36
│ │ │ │ +
37template<typename GV>
│ │ │ │ +
38class RannacherTurekNode;
│ │ │ │ +
39
│ │ │ │ +
40template<typename GV>
│ │ │ │ +
41class RannacherTurekPreBasis;
│ │ │ │ +
42
│ │ │ │ +
55template<typename GV>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
57 public LeafPreBasisMixin< RannacherTurekPreBasis<GV> >
│ │ │ │ +
58{
│ │ │ │ +
59 static const int dim = GV::dimension;
│ │ │ │ +
60
│ │ │ │ +
61public:
│ │ │ │ +
62
│ │ │ │ +
64 using GridView = GV;
│ │ │ │ +
65
│ │ │ │ +
67 using size_type = std::size_t;
│ │ │ │ +
68
│ │ │ │ + │ │ │ │ +
71
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
74 gridView_(gv)
│ │ │ │ +
75 {
│ │ │ │ +
76 for(auto type : gv.indexSet().types(0))
│ │ │ │ +
77 if (!type.isSimplex() && !type.isCube())
│ │ │ │ +
78 DUNE_THROW(Dune::NotImplemented, "Rannacher-Turek or Crouzeix-Raviart elements are only implemented for grids with simplex or cube elements.");
│ │ │ │ +
79 }
│ │ │ │ +
│ │ │ │
80
│ │ │ │ -
81
│ │ │ │ -
82#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LEAFPREBASISMIXIN_HH
│ │ │ │ - │ │ │ │ -
Definition polynomial.hh:18
│ │ │ │ -
Uniform descriptor with dynamic size.
Definition containerdescriptors.hh:168
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
83 {}
│ │ │ │ +
│ │ │ │ +
84
│ │ │ │ +
│ │ │ │ +
86 const GridView& gridView() const
│ │ │ │ +
87 {
│ │ │ │ +
88 return gridView_;
│ │ │ │ +
89 }
│ │ │ │ +
│ │ │ │ +
90
│ │ │ │ +
│ │ │ │ +
92 void update (const GridView& gv)
│ │ │ │ +
93 {
│ │ │ │ +
94 gridView_ = gv;
│ │ │ │ +
95 }
│ │ │ │ +
│ │ │ │ +
96
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
101 {
│ │ │ │ +
102 return Node{};
│ │ │ │ +
103 }
│ │ │ │ +
│ │ │ │ +
104
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
107 {
│ │ │ │ +
108 return (size_type)(gridView_.size(1));
│ │ │ │ +
109 }
│ │ │ │ +
│ │ │ │ +
110
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
113 {
│ │ │ │ +
114 return 2*GV::dimension;
│ │ │ │ +
115 }
│ │ │ │ +
│ │ │ │ +
116
│ │ │ │ +
117 template<typename It>
│ │ │ │ +
│ │ │ │ +
118 It indices(const Node& node, It it) const
│ │ │ │ +
119 {
│ │ │ │ +
120 for (size_type i = 0, end = node.size() ; i < end ; ++i, ++it)
│ │ │ │ +
121 {
│ │ │ │ +
122 Dune::LocalKey localKey = node.finiteElement().localCoefficients().localKey(i);
│ │ │ │ +
123 const auto& gridIndexSet = gridView().indexSet();
│ │ │ │ +
124 const auto& element = node.element();
│ │ │ │ +
125
│ │ │ │ +
126 *it = {{ (size_type)(gridIndexSet.subIndex(element,localKey.subEntity(),1)) }};
│ │ │ │ +
127 }
│ │ │ │ +
128 return it;
│ │ │ │ +
129 }
│ │ │ │ +
│ │ │ │ +
130
│ │ │ │ +
131protected:
│ │ │ │ + │ │ │ │ +
133};
│ │ │ │ +
│ │ │ │ +
134
│ │ │ │ +
135
│ │ │ │ +
136
│ │ │ │ +
137template<typename GV>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
139 public LeafBasisNode
│ │ │ │ +
140{
│ │ │ │ +
141 static const int dim = GV::dimension;
│ │ │ │ +
142 static const int maxSize = 2*dim;
│ │ │ │ +
143
│ │ │ │ +
144 constexpr static bool hasFixedElementType = Capabilities::hasSingleGeometryType<typename GV::Grid>::v;
│ │ │ │ +
145
│ │ │ │ +
146 using CubeFiniteElement = RannacherTurekLocalFiniteElement<typename GV::ctype,double,dim>;
│ │ │ │ +
147 using SimplexFiniteElement = CrouzeixRaviartLocalFiniteElement<typename GV::ctype,double,dim>;
│ │ │ │ +
148
│ │ │ │ +
149 constexpr static unsigned int topologyId = Capabilities::hasSingleGeometryType<typename GV::Grid>::topologyId; // meaningless if hasFixedElementType is false
│ │ │ │ +
150 constexpr static GeometryType type = GeometryType(topologyId, GV::dimension);
│ │ │ │ +
151
│ │ │ │ +
152public:
│ │ │ │ +
153
│ │ │ │ +
154 using size_type = std::size_t;
│ │ │ │ +
155 using Element = typename GV::template Codim<0>::Entity;
│ │ │ │ +
156 using FiniteElement = std::conditional_t<hasFixedElementType,
│ │ │ │ +
157 std::conditional_t<type.isCube(),CubeFiniteElement,SimplexFiniteElement>,
│ │ │ │ +
158 LocalFiniteElementVariant<CubeFiniteElement, SimplexFiniteElement> >;
│ │ │ │ +
159
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
162 element_(nullptr)
│ │ │ │ +
163 {}
│ │ │ │ +
│ │ │ │ +
164
│ │ │ │ +
│ │ │ │ +
166 const Element& element() const
│ │ │ │ +
167 {
│ │ │ │ +
168 return *element_;
│ │ │ │ +
169 }
│ │ │ │ +
│ │ │ │ +
170
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
176 {
│ │ │ │ +
177 return finiteElement_;
│ │ │ │ +
178 }
│ │ │ │ +
│ │ │ │ +
179
│ │ │ │ +
│ │ │ │ +
181 void bind(const Element& e)
│ │ │ │ +
182 {
│ │ │ │ +
183 element_ = &e;
│ │ │ │ +
184 if constexpr (!hasFixedElementType)
│ │ │ │ +
185 finiteElement_ = e.type().isCube() ? static_cast<FiniteElement>(CubeFiniteElement())
│ │ │ │ +
186 : static_cast<FiniteElement>(SimplexFiniteElement()) ;
│ │ │ │ +
187 this->setSize(finiteElement_.size());
│ │ │ │ +
188 }
│ │ │ │ +
│ │ │ │ +
189
│ │ │ │ +
190protected:
│ │ │ │ +
191
│ │ │ │ + │ │ │ │ + │ │ │ │ +
194};
│ │ │ │ +
│ │ │ │ +
195
│ │ │ │ +
196
│ │ │ │ +
197
│ │ │ │ +
198namespace BasisFactory {
│ │ │ │ +
199
│ │ │ │ +
205template<class Dummy=void>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
207{
│ │ │ │ +
208 return [](const auto& gridView) {
│ │ │ │ +
209 return RannacherTurekPreBasis<std::decay_t<decltype(gridView)>>(gridView);
│ │ │ │ +
210 };
│ │ │ │ +
211}
│ │ │ │ +
│ │ │ │ +
212
│ │ │ │ +
213} // end namespace BasisFactory
│ │ │ │ +
214
│ │ │ │ +
215
│ │ │ │ +
216
│ │ │ │ +
217
│ │ │ │ +
229template<typename GV>
│ │ │ │ + │ │ │ │ +
231
│ │ │ │ +
232} // end namespace Functions
│ │ │ │ +
233} // end namespace Dune
│ │ │ │ +
234
│ │ │ │ +
235#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
auto rannacherTurek()
Create a pre-basis factory that can create a Rannacher-Turek pre-basis.
Definition rannacherturekbasis.hh:206
│ │ │ │ +
Definition polynomial.hh:17
│ │ │ │ +
Global basis for given pre-basis.
Definition defaultglobalbasis.hh:50
│ │ │ │
A generic MixIn class for PreBasis.
Definition leafprebasismixin.hh:36
│ │ │ │ -
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition leafprebasismixin.hh:53
│ │ │ │ -
static constexpr size_type minMultiIndexSize
Minimal length of global multi-indices.
Definition leafprebasismixin.hh:45
│ │ │ │ -
auto containerDescriptor() const
Return a flat container-descriptor.
Definition leafprebasismixin.hh:66
│ │ │ │ -
static constexpr size_type maxMultiIndexSize
Maximal length of global multi-indices.
Definition leafprebasismixin.hh:42
│ │ │ │ -
size_type size() const
Get the total dimension of the space spanned by this basis.
Definition leafprebasismixin.hh:60
│ │ │ │ -
std::size_t size_type
Type used for indices and size information.
Definition leafprebasismixin.hh:39
│ │ │ │ -
static constexpr size_type multiIndexBufferSize
Size required temporarily when constructing global multi-indices.
Definition leafprebasismixin.hh:48
│ │ │ │ +
size_type size() const
Definition nodes.hh:147
│ │ │ │ +
void setSize(const size_type size)
Definition nodes.hh:169
│ │ │ │ +
Definition nodes.hh:191
│ │ │ │ +
Definition rannacherturekbasis.hh:140
│ │ │ │ +
std::conditional_t< hasFixedElementType, std::conditional_t< type.isCube(), CubeFiniteElement, SimplexFiniteElement >, LocalFiniteElementVariant< CubeFiniteElement, SimplexFiniteElement > > FiniteElement
Definition rannacherturekbasis.hh:158
│ │ │ │ +
void bind(const Element &e)
Bind to element.
Definition rannacherturekbasis.hh:181
│ │ │ │ +
FiniteElement finiteElement_
Definition rannacherturekbasis.hh:192
│ │ │ │ +
std::size_t size_type
Definition rannacherturekbasis.hh:154
│ │ │ │ +
typename GV::template Codim< 0 >::Entity Element
Definition rannacherturekbasis.hh:155
│ │ │ │ +
RannacherTurekNode()
Definition rannacherturekbasis.hh:160
│ │ │ │ +
const Element * element_
Definition rannacherturekbasis.hh:193
│ │ │ │ +
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition rannacherturekbasis.hh:175
│ │ │ │ +
const Element & element() const
Return current element, throw if unbound.
Definition rannacherturekbasis.hh:166
│ │ │ │ +
Pre-basis for a Rannacher-Turek basis.
Definition rannacherturekbasis.hh:58
│ │ │ │ +
void initializeIndices()
Initialize the global indices.
Definition rannacherturekbasis.hh:82
│ │ │ │ +
std::size_t size_type
Type used for indices and size information.
Definition rannacherturekbasis.hh:67
│ │ │ │ +
Node makeNode() const
Create tree node.
Definition rannacherturekbasis.hh:100
│ │ │ │ +
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition rannacherturekbasis.hh:92
│ │ │ │ +
It indices(const Node &node, It it) const
Definition rannacherturekbasis.hh:118
│ │ │ │ +
GV GridView
The grid view that the FE basis is defined on.
Definition rannacherturekbasis.hh:64
│ │ │ │ +
size_type dimension() const
Same as size(prefix) with empty prefix.
Definition rannacherturekbasis.hh:106
│ │ │ │ +
RannacherTurekPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition rannacherturekbasis.hh:73
│ │ │ │ +
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition rannacherturekbasis.hh:86
│ │ │ │ +
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition rannacherturekbasis.hh:112
│ │ │ │ +
GridView gridView_
Definition rannacherturekbasis.hh:132
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,109 +1,317 @@ │ │ │ │ │ dune-functions 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _f_u_n_c_t_i_o_n_s │ │ │ │ │ * _f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s │ │ │ │ │ -leafprebasismixin.hh │ │ │ │ │ +rannacherturekbasis.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3 │ │ │ │ │ 4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file │ │ │ │ │ AUTHORS.md │ │ │ │ │ 5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR │ │ │ │ │ LGPL-3.0-or-later │ │ │ │ │ 6 │ │ │ │ │ -7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LEAFPREBASISMIXIN_HH │ │ │ │ │ -8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LEAFPREBASISMIXIN_HH │ │ │ │ │ +7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH │ │ │ │ │ +8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH │ │ │ │ │ 9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ +10#include │ │ │ │ │ +11 │ │ │ │ │ +12#include │ │ │ │ │ 13 │ │ │ │ │ -14#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h> │ │ │ │ │ -15 │ │ │ │ │ -16namespace _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s { │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ 17 │ │ │ │ │ -34template │ │ │ │ │ -_3_5class _L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n │ │ │ │ │ -36{ │ │ │ │ │ -37public: │ │ │ │ │ -_3_9 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ -40 │ │ │ │ │ -_4_2 static constexpr _s_i_z_e___t_y_p_e _m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e = 1; │ │ │ │ │ -43 │ │ │ │ │ -_4_5 static constexpr _s_i_z_e___t_y_p_e _m_i_n_M_u_l_t_i_I_n_d_e_x_S_i_z_e = 1; │ │ │ │ │ -46 │ │ │ │ │ -_4_8 static constexpr _s_i_z_e___t_y_p_e _m_u_l_t_i_I_n_d_e_x_B_u_f_f_e_r_S_i_z_e = 1; │ │ │ │ │ -49 │ │ │ │ │ -51 template().size(), bool{}) = true> │ │ │ │ │ -_5_3 _s_i_z_e___t_y_p_e _s_i_z_e(const SizePrefix& prefix) const │ │ │ │ │ -54 { │ │ │ │ │ -55 assert(prefix.size() == 0 || prefix.size() == 1); │ │ │ │ │ -56 return (prefix.size() == 0) ? derived().dimension() : 0; │ │ │ │ │ -57 } │ │ │ │ │ -58 │ │ │ │ │ -_6_0 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ │ -61 { │ │ │ │ │ -62 return derived().dimension(); │ │ │ │ │ -63 } │ │ │ │ │ -64 │ │ │ │ │ -_6_6 auto _c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r() const │ │ │ │ │ -67 { │ │ │ │ │ -68 return _C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_F_l_a_t_V_e_c_t_o_r{_s_i_z_e()}; │ │ │ │ │ -69 } │ │ │ │ │ -70 │ │ │ │ │ -71private: │ │ │ │ │ -72 const Derived& derived() const │ │ │ │ │ -73 { │ │ │ │ │ -74 return static_cast(*this); │ │ │ │ │ -75 } │ │ │ │ │ -76}; │ │ │ │ │ -77 │ │ │ │ │ -78 │ │ │ │ │ -79} // end namespace Dune::Functions │ │ │ │ │ +18#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_n_o_d_e_s_._h_h> │ │ │ │ │ +19#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h> │ │ │ │ │ +20#include <_d_u_n_e_/_f_u_n_c_t_i_o_n_s_/_f_u_n_c_t_i_o_n_s_p_a_c_e_b_a_s_e_s_/_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h> │ │ │ │ │ +21 │ │ │ │ │ +22 │ │ │ │ │ +23namespace _D_u_n_e { │ │ │ │ │ +24namespace Functions { │ │ │ │ │ +25 │ │ │ │ │ +26/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ +27// This is the reusable part of the basis. It contains │ │ │ │ │ +28// │ │ │ │ │ +29// RannacherTurekPreBasis │ │ │ │ │ +30// RannacherTurekNode │ │ │ │ │ +31// │ │ │ │ │ +32// The pre-basis allows to create the others and is the owner of possible │ │ │ │ │ +shared │ │ │ │ │ +33// state. These components do _not_ depend on the global basis and local view │ │ │ │ │ +34// and can be used without a global basis. │ │ │ │ │ +35/ │ │ │ │ │ +/ ***************************************************************************** │ │ │ │ │ +36 │ │ │ │ │ +37template │ │ │ │ │ +38class RannacherTurekNode; │ │ │ │ │ +39 │ │ │ │ │ +40template │ │ │ │ │ +41class RannacherTurekPreBasis; │ │ │ │ │ +42 │ │ │ │ │ +55template │ │ │ │ │ +_5_6class _R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s : │ │ │ │ │ +57 public _L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n< RannacherTurekPreBasis > │ │ │ │ │ +58{ │ │ │ │ │ +59 static const int dim = GV::dimension; │ │ │ │ │ +60 │ │ │ │ │ +61public: │ │ │ │ │ +62 │ │ │ │ │ +_6_4 using _G_r_i_d_V_i_e_w = GV; │ │ │ │ │ +65 │ │ │ │ │ +_6_7 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ +68 │ │ │ │ │ +_7_0 using _N_o_d_e = _R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e_<_G_V_>; │ │ │ │ │ +71 │ │ │ │ │ +_7_3 _R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s(const _G_r_i_d_V_i_e_w& gv) : │ │ │ │ │ +74 _g_r_i_d_V_i_e_w__(gv) │ │ │ │ │ +75 { │ │ │ │ │ +76 for(auto type : gv.indexSet().types(0)) │ │ │ │ │ +77 if (!type.isSimplex() && !type.isCube()) │ │ │ │ │ +78 DUNE_THROW(Dune::NotImplemented, "Rannacher-Turek or Crouzeix-Raviart │ │ │ │ │ +elements are only implemented for grids with simplex or cube elements."); │ │ │ │ │ +79 } │ │ │ │ │ 80 │ │ │ │ │ -81 │ │ │ │ │ -82#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_LEAFPREBASISMIXIN_HH │ │ │ │ │ -_c_o_n_t_a_i_n_e_r_d_e_s_c_r_i_p_t_o_r_s_._h_h │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s │ │ │ │ │ -DDeeffiinniittiioonn polynomial.hh:18 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_C_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r_s_:_:_U_n_i_f_o_r_m_V_e_c_t_o_r │ │ │ │ │ -Uniform descriptor with dynamic size. │ │ │ │ │ -DDeeffiinniittiioonn containerdescriptors.hh:168 │ │ │ │ │ +_8_2 void _i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s() │ │ │ │ │ +83 {} │ │ │ │ │ +84 │ │ │ │ │ +_8_6 const _G_r_i_d_V_i_e_w& _g_r_i_d_V_i_e_w() const │ │ │ │ │ +87 { │ │ │ │ │ +88 return _g_r_i_d_V_i_e_w__; │ │ │ │ │ +89 } │ │ │ │ │ +90 │ │ │ │ │ +_9_2 void _u_p_d_a_t_e (const _G_r_i_d_V_i_e_w& gv) │ │ │ │ │ +93 { │ │ │ │ │ +94 _g_r_i_d_V_i_e_w__ = gv; │ │ │ │ │ +95 } │ │ │ │ │ +96 │ │ │ │ │ +_1_0_0 _N_o_d_e _m_a_k_e_N_o_d_e() const │ │ │ │ │ +101 { │ │ │ │ │ +102 return _N_o_d_e{}; │ │ │ │ │ +103 } │ │ │ │ │ +104 │ │ │ │ │ +_1_0_6 _s_i_z_e___t_y_p_e _d_i_m_e_n_s_i_o_n() const │ │ │ │ │ +107 { │ │ │ │ │ +108 return (_s_i_z_e___t_y_p_e)(_g_r_i_d_V_i_e_w__.size(1)); │ │ │ │ │ +109 } │ │ │ │ │ +110 │ │ │ │ │ +_1_1_2 _s_i_z_e___t_y_p_e _m_a_x_N_o_d_e_S_i_z_e() const │ │ │ │ │ +113 { │ │ │ │ │ +114 return 2*GV::dimension; │ │ │ │ │ +115 } │ │ │ │ │ +116 │ │ │ │ │ +117 template │ │ │ │ │ +_1_1_8 It _i_n_d_i_c_e_s(const _N_o_d_e& node, It it) const │ │ │ │ │ +119 { │ │ │ │ │ +120 for (_s_i_z_e___t_y_p_e i = 0, end = node._s_i_z_e() ; i < end ; ++i, ++it) │ │ │ │ │ +121 { │ │ │ │ │ +122 Dune::LocalKey localKey = node._f_i_n_i_t_e_E_l_e_m_e_n_t().localCoefficients().localKey │ │ │ │ │ +(i); │ │ │ │ │ +123 const auto& gridIndexSet = _g_r_i_d_V_i_e_w().indexSet(); │ │ │ │ │ +124 const auto& element = node._e_l_e_m_e_n_t(); │ │ │ │ │ +125 │ │ │ │ │ +126 *it = {{ (_s_i_z_e___t_y_p_e)(gridIndexSet.subIndex(element,localKey.subEntity(),1)) │ │ │ │ │ +}}; │ │ │ │ │ +127 } │ │ │ │ │ +128 return it; │ │ │ │ │ +129 } │ │ │ │ │ +130 │ │ │ │ │ +131protected: │ │ │ │ │ +_1_3_2 _G_r_i_d_V_i_e_w _g_r_i_d_V_i_e_w__; │ │ │ │ │ +133}; │ │ │ │ │ +134 │ │ │ │ │ +135 │ │ │ │ │ +136 │ │ │ │ │ +137template │ │ │ │ │ +_1_3_8class _R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e : │ │ │ │ │ +139 public _L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ +140{ │ │ │ │ │ +141 static const int dim = GV::dimension; │ │ │ │ │ +142 static const int maxSize = 2*dim; │ │ │ │ │ +143 │ │ │ │ │ +144 constexpr static bool hasFixedElementType = Capabilities:: │ │ │ │ │ +hasSingleGeometryType::v; │ │ │ │ │ +145 │ │ │ │ │ +146 using CubeFiniteElement = RannacherTurekLocalFiniteElement; │ │ │ │ │ +147 using SimplexFiniteElement = CrouzeixRaviartLocalFiniteElement; │ │ │ │ │ +148 │ │ │ │ │ +149 constexpr static unsigned int topologyId = Capabilities:: │ │ │ │ │ +hasSingleGeometryType::topologyId; // meaningless if │ │ │ │ │ +hasFixedElementType is false │ │ │ │ │ +150 constexpr static GeometryType type = GeometryType(topologyId, GV:: │ │ │ │ │ +dimension); │ │ │ │ │ +151 │ │ │ │ │ +152public: │ │ │ │ │ +153 │ │ │ │ │ +_1_5_4 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ │ +_1_5_5 using _E_l_e_m_e_n_t = typename GV::template Codim<0>::Entity; │ │ │ │ │ +_1_5_6 using _F_i_n_i_t_e_E_l_e_m_e_n_t = std::conditional_t, │ │ │ │ │ +158 LocalFiniteElementVariant >; │ │ │ │ │ +159 │ │ │ │ │ +_1_6_0 _R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e() : │ │ │ │ │ +161 _f_i_n_i_t_e_E_l_e_m_e_n_t__(), │ │ │ │ │ +162 _e_l_e_m_e_n_t__(nullptr) │ │ │ │ │ +163 {} │ │ │ │ │ +164 │ │ │ │ │ +_1_6_6 const _E_l_e_m_e_n_t& _e_l_e_m_e_n_t() const │ │ │ │ │ +167 { │ │ │ │ │ +168 return *_e_l_e_m_e_n_t__; │ │ │ │ │ +169 } │ │ │ │ │ +170 │ │ │ │ │ +_1_7_5 const _F_i_n_i_t_e_E_l_e_m_e_n_t& _f_i_n_i_t_e_E_l_e_m_e_n_t() const │ │ │ │ │ +176 { │ │ │ │ │ +177 return _f_i_n_i_t_e_E_l_e_m_e_n_t__; │ │ │ │ │ +178 } │ │ │ │ │ +179 │ │ │ │ │ +_1_8_1 void _b_i_n_d(const _E_l_e_m_e_n_t& e) │ │ │ │ │ +182 { │ │ │ │ │ +183 _e_l_e_m_e_n_t__ = &e; │ │ │ │ │ +184 if constexpr (!hasFixedElementType) │ │ │ │ │ +185 _f_i_n_i_t_e_E_l_e_m_e_n_t__ = e.type().isCube() ? static_cast<_F_i_n_i_t_e_E_l_e_m_e_n_t> │ │ │ │ │ +(CubeFiniteElement()) │ │ │ │ │ +186 : static_cast<_F_i_n_i_t_e_E_l_e_m_e_n_t>(SimplexFiniteElement()) ; │ │ │ │ │ +187 this->_s_e_t_S_i_z_e(_f_i_n_i_t_e_E_l_e_m_e_n_t__.size()); │ │ │ │ │ +188 } │ │ │ │ │ +189 │ │ │ │ │ +190protected: │ │ │ │ │ +191 │ │ │ │ │ +_1_9_2 _F_i_n_i_t_e_E_l_e_m_e_n_t _f_i_n_i_t_e_E_l_e_m_e_n_t__; │ │ │ │ │ +_1_9_3 const _E_l_e_m_e_n_t* _e_l_e_m_e_n_t__; │ │ │ │ │ +194}; │ │ │ │ │ +195 │ │ │ │ │ +196 │ │ │ │ │ +197 │ │ │ │ │ +198namespace BasisFactory { │ │ │ │ │ +199 │ │ │ │ │ +205template │ │ │ │ │ +_2_0_6auto _r_a_n_n_a_c_h_e_r_T_u_r_e_k() │ │ │ │ │ +207{ │ │ │ │ │ +208 return [](const auto& gridView) { │ │ │ │ │ +209 return _R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s>(gridView); │ │ │ │ │ +210 }; │ │ │ │ │ +211} │ │ │ │ │ +212 │ │ │ │ │ +213} // end namespace BasisFactory │ │ │ │ │ +214 │ │ │ │ │ +215 │ │ │ │ │ +216 │ │ │ │ │ +217 │ │ │ │ │ +229template │ │ │ │ │ +_2_3_0using _R_a_n_n_a_c_h_e_r_T_u_r_e_k_B_a_s_i_s = _D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s_<_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_<_G_V_> >; │ │ │ │ │ +231 │ │ │ │ │ +232} // end namespace Functions │ │ │ │ │ +233} // end namespace Dune │ │ │ │ │ +234 │ │ │ │ │ +235#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RANNACHERTUREKBASIS_HH │ │ │ │ │ +_l_e_a_f_p_r_e_b_a_s_i_s_m_i_x_i_n_._h_h │ │ │ │ │ +_n_o_d_e_s_._h_h │ │ │ │ │ +_d_e_f_a_u_l_t_g_l_o_b_a_l_b_a_s_i_s_._h_h │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_F_a_c_t_o_r_y_:_:_r_a_n_n_a_c_h_e_r_T_u_r_e_k │ │ │ │ │ +auto rannacherTurek() │ │ │ │ │ +Create a pre-basis factory that can create a Rannacher-Turek pre-basis. │ │ │ │ │ +DDeeffiinniittiioonn rannacherturekbasis.hh:206 │ │ │ │ │ +_D_u_n_e │ │ │ │ │ +DDeeffiinniittiioonn polynomial.hh:17 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_D_e_f_a_u_l_t_G_l_o_b_a_l_B_a_s_i_s │ │ │ │ │ +Global basis for given pre-basis. │ │ │ │ │ +DDeeffiinniittiioonn defaultglobalbasis.hh:50 │ │ │ │ │ _D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n │ │ │ │ │ A generic MixIn class for PreBasis. │ │ │ │ │ DDeeffiinniittiioonn leafprebasismixin.hh:36 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_s_i_z_e │ │ │ │ │ -size_type size(const SizePrefix &prefix) const │ │ │ │ │ -Return number of possible values for next position in multi index. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismixin.hh:53 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_m_i_n_M_u_l_t_i_I_n_d_e_x_S_i_z_e │ │ │ │ │ -static constexpr size_type minMultiIndexSize │ │ │ │ │ -Minimal length of global multi-indices. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismixin.hh:45 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_c_o_n_t_a_i_n_e_r_D_e_s_c_r_i_p_t_o_r │ │ │ │ │ -auto containerDescriptor() const │ │ │ │ │ -Return a flat container-descriptor. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismixin.hh:66 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_m_a_x_M_u_l_t_i_I_n_d_e_x_S_i_z_e │ │ │ │ │ -static constexpr size_type maxMultiIndexSize │ │ │ │ │ -Maximal length of global multi-indices. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismixin.hh:42 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_s_i_z_e │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_i_z_e │ │ │ │ │ size_type size() const │ │ │ │ │ -Get the total dimension of the space spanned by this basis. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismixin.hh:60 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:147 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_B_a_s_i_s_N_o_d_e_M_i_x_i_n_:_:_s_e_t_S_i_z_e │ │ │ │ │ +void setSize(const size_type size) │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:169 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_B_a_s_i_s_N_o_d_e │ │ │ │ │ +DDeeffiinniittiioonn nodes.hh:191 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e │ │ │ │ │ +DDeeffiinniittiioonn rannacherturekbasis.hh:140 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e_:_:_F_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ +std::conditional_t< hasFixedElementType, std::conditional_t< type.isCube(), │ │ │ │ │ +CubeFiniteElement, SimplexFiniteElement >, LocalFiniteElementVariant< │ │ │ │ │ +CubeFiniteElement, SimplexFiniteElement > > FiniteElement │ │ │ │ │ +DDeeffiinniittiioonn rannacherturekbasis.hh:158 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e_:_:_b_i_n_d │ │ │ │ │ +void bind(const Element &e) │ │ │ │ │ +Bind to element. │ │ │ │ │ +DDeeffiinniittiioonn rannacherturekbasis.hh:181 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t__ │ │ │ │ │ +FiniteElement finiteElement_ │ │ │ │ │ +DDeeffiinniittiioonn rannacherturekbasis.hh:192 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +DDeeffiinniittiioonn rannacherturekbasis.hh:154 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e_:_:_E_l_e_m_e_n_t │ │ │ │ │ +typename GV::template Codim< 0 >::Entity Element │ │ │ │ │ +DDeeffiinniittiioonn rannacherturekbasis.hh:155 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e │ │ │ │ │ +RannacherTurekNode() │ │ │ │ │ +DDeeffiinniittiioonn rannacherturekbasis.hh:160 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e_:_:_e_l_e_m_e_n_t__ │ │ │ │ │ +const Element * element_ │ │ │ │ │ +DDeeffiinniittiioonn rannacherturekbasis.hh:193 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ +const FiniteElement & finiteElement() const │ │ │ │ │ +Return the LocalFiniteElement for the element we are bound to. │ │ │ │ │ +DDeeffiinniittiioonn rannacherturekbasis.hh:175 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_N_o_d_e_:_:_e_l_e_m_e_n_t │ │ │ │ │ +const Element & element() const │ │ │ │ │ +Return current element, throw if unbound. │ │ │ │ │ +DDeeffiinniittiioonn rannacherturekbasis.hh:166 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s │ │ │ │ │ +Pre-basis for a Rannacher-Turek basis. │ │ │ │ │ +DDeeffiinniittiioonn rannacherturekbasis.hh:58 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_:_:_i_n_i_t_i_a_l_i_z_e_I_n_d_i_c_e_s │ │ │ │ │ +void initializeIndices() │ │ │ │ │ +Initialize the global indices. │ │ │ │ │ +DDeeffiinniittiioonn rannacherturekbasis.hh:82 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ │ std::size_t size_type │ │ │ │ │ Type used for indices and size information. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismixin.hh:39 │ │ │ │ │ -_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_L_e_a_f_P_r_e_B_a_s_i_s_M_i_x_i_n_:_:_m_u_l_t_i_I_n_d_e_x_B_u_f_f_e_r_S_i_z_e │ │ │ │ │ -static constexpr size_type multiIndexBufferSize │ │ │ │ │ -Size required temporarily when constructing global multi-indices. │ │ │ │ │ -DDeeffiinniittiioonn leafprebasismixin.hh:48 │ │ │ │ │ +DDeeffiinniittiioonn rannacherturekbasis.hh:67 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_:_:_m_a_k_e_N_o_d_e │ │ │ │ │ +Node makeNode() const │ │ │ │ │ +Create tree node. │ │ │ │ │ +DDeeffiinniittiioonn rannacherturekbasis.hh:100 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_:_:_u_p_d_a_t_e │ │ │ │ │ +void update(const GridView &gv) │ │ │ │ │ +Update the stored grid view, to be called if the grid has changed. │ │ │ │ │ +DDeeffiinniittiioonn rannacherturekbasis.hh:92 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_:_:_i_n_d_i_c_e_s │ │ │ │ │ +It indices(const Node &node, It it) const │ │ │ │ │ +DDeeffiinniittiioonn rannacherturekbasis.hh:118 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_:_:_G_r_i_d_V_i_e_w │ │ │ │ │ +GV GridView │ │ │ │ │ +The grid view that the FE basis is defined on. │ │ │ │ │ +DDeeffiinniittiioonn rannacherturekbasis.hh:64 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ +size_type dimension() const │ │ │ │ │ +Same as size(prefix) with empty prefix. │ │ │ │ │ +DDeeffiinniittiioonn rannacherturekbasis.hh:106 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s │ │ │ │ │ +RannacherTurekPreBasis(const GridView &gv) │ │ │ │ │ +Constructor for a given grid view object. │ │ │ │ │ +DDeeffiinniittiioonn rannacherturekbasis.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w │ │ │ │ │ +const GridView & gridView() const │ │ │ │ │ +Obtain the grid view that the basis is defined on. │ │ │ │ │ +DDeeffiinniittiioonn rannacherturekbasis.hh:86 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_:_:_m_a_x_N_o_d_e_S_i_z_e │ │ │ │ │ +size_type maxNodeSize() const │ │ │ │ │ +Get the maximal number of DOFs associated to node for any element. │ │ │ │ │ +DDeeffiinniittiioonn rannacherturekbasis.hh:112 │ │ │ │ │ +_D_u_n_e_:_:_F_u_n_c_t_i_o_n_s_:_:_R_a_n_n_a_c_h_e_r_T_u_r_e_k_P_r_e_B_a_s_i_s_:_:_g_r_i_d_V_i_e_w__ │ │ │ │ │ +GridView gridView_ │ │ │ │ │ +DDeeffiinniittiioonn rannacherturekbasis.hh:132 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01055.html │ │ │ │ @@ -82,15 +82,15 @@ │ │ │ │
Dune::Functions::Polynomial< K, C > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A univariate polynomial implementation. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

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

│ │ │ │ +

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

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

│ │ │ │ Public Types

using Coefficients = C
 The type of the stored coefficient container.
 
│ │ │ │ @@ -299,15 +299,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Comparison of coefficients.

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

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

Evaluate function.

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

typedef InvalidRange Range
 Range of derivative for function with given signature.
 
│ │ │ │ @@ -111,15 +111,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 │ │ │ │ @@ -79,15 +79,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.
 
│ │ │ │ @@ -108,15 +108,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 │ │ │ │ @@ -79,15 +79,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.
 
│ │ │ │ @@ -117,15 +117,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/a01099.html │ │ │ │ @@ -79,15 +79,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.
 
│ │ │ │ @@ -117,15 +117,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/a01103.html │ │ │ │ @@ -79,15 +79,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.
 
│ │ │ │ @@ -117,15 +117,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/a01107.html │ │ │ │ @@ -73,17 +73,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/a01115.html │ │ │ │ @@ -80,15 +80,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -233,15 +233,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Evaluation of wrapped function.

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

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -262,15 +262,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Evaluate function.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01147.html │ │ │ │ @@ -81,15 +81,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.
 
using RawSignature = typename SignatureTraits< Signature >::RawSignature
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -270,15 +270,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Evaluate function.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01151.html │ │ │ │ @@ -79,15 +79,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 >()...))
 
│ │ │ │ @@ -120,15 +120,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
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::Function< Signature > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01159.html │ │ │ │ @@ -79,15 +79,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -131,15 +131,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01163.html │ │ │ │ @@ -73,15 +73,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/a01167.html │ │ │ │ @@ -80,15 +80,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -156,15 +156,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01171.html │ │ │ │ @@ -73,15 +73,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/a01175.html │ │ │ │ @@ -79,15 +79,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -132,15 +132,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01179.html │ │ │ │ @@ -73,15 +73,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/a01183.html │ │ │ │ @@ -79,15 +79,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -134,15 +134,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01187.html │ │ │ │ @@ -79,15 +79,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 >())
 
│ │ │ │ @@ -112,15 +112,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
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::GridFunction< Signature, EntitySet > Struct Template Reference
│ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01195.html │ │ │ │ @@ -80,15 +80,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -173,15 +173,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01199.html │ │ │ │ @@ -73,15 +73,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/a01203.html │ │ │ │ @@ -80,15 +80,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -196,15 +196,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01207.html │ │ │ │ @@ -73,15 +73,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/a01211.html │ │ │ │ @@ -79,15 +79,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -133,15 +133,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01215.html │ │ │ │ @@ -73,15 +73,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/a01219.html │ │ │ │ @@ -79,15 +79,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -134,15 +134,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01243.html │ │ │ │ @@ -79,15 +79,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -253,15 +253,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/a01247.html │ │ │ │ @@ -73,17 +73,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/a01255.html │ │ │ │ @@ -80,15 +80,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -361,15 +361,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Unbind from local context.

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

STL member.

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

STL member.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01275.html │ │ │ │ @@ -73,27 +73,27 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
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/a01279.html │ │ │ │ @@ -82,15 +82,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1067,15 +1067,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/a01283.html │ │ │ │ @@ -79,15 +79,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -490,15 +490,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Move assignment from other PolymorphicSmallObject.

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

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1029,15 +1029,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/a01291.html │ │ │ │ @@ -79,15 +79,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/a01295.html │ │ │ │ @@ -76,20 +76,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/a01299.html │ │ │ │ @@ -73,15 +73,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/a01303.html │ │ │ │ @@ -79,15 +79,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.
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -136,15 +136,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/a01315.html │ │ │ │ @@ -76,15 +76,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,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/a01319.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
Dune::Functions::StaticSizeOrZero< T > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Obtain size of statically sized container, or 0 if dynamic size. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

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

│ │ │ │ +

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

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

Detailed Description

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

Obtain size of statically sized container, or 0 if dynamic size.

│ │ │ │

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/a01367.html │ │ │ │ @@ -79,15 +79,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 = std::tuple_element_t< sizeof...(T) -1, std::tuple< T... > >
 
│ │ │ │

Detailed Description

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

│ │ │ │ @@ -108,15 +108,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01395.html │ │ │ │ @@ -76,15 +76,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))
 
│ │ │ │ @@ -106,15 +106,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01399.html │ │ │ │ @@ -76,15 +76,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -96,15 +96,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/a01403.html │ │ │ │ @@ -76,15 +76,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -128,15 +128,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/a01407.html │ │ │ │ @@ -76,15 +76,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -128,15 +128,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/a01411.html │ │ │ │ @@ -76,15 +76,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -128,15 +128,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/a01415.html │ │ │ │ @@ -76,15 +76,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -128,15 +128,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/a01451.html │ │ │ │ @@ -79,15 +79,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -583,15 +583,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01455.html │ │ │ │ @@ -79,15 +79,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>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::BrezziDouglasMariniPreBasis< GV, k >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -704,15 +704,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Size required temporarily when constructing global multi-indices.

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

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::BSplinePreBasis< GV >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1321,15 +1321,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/a01467.html │ │ │ │ @@ -81,15 +81,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -423,15 +423,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01471.html │ │ │ │ @@ -79,15 +79,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>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -192,15 +192,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

number of coefficients

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

Local interpolation of a function.

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

│ │ │ │ Public Member Functions

void init (const std::array< unsigned, dim > &sizes)
 
std::size_t size () const
 number of coefficients
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01487.html │ │ │ │ @@ -83,15 +83,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>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -892,15 +892,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using SubPreBases = std::tuple< SPB... >
 Tuple of child pre-bases.
 
template<std::size_t i>
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01543.html │ │ │ │ @@ -76,19 +76,19 @@ │ │ │ │
Dune::Functions::ContainerDescriptors::Unknown Struct Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Fallback container descriptor if nothing else fits. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

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

│ │ │ │ +

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

│ │ │ │

Detailed Description

│ │ │ │

Fallback container descriptor if nothing else fits.

│ │ │ │

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

The node in the descriptor tree representing a value placeholder. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

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

│ │ │ │ +

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

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -156,15 +156,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

A value placeholder does not have any sub-descriptors, thus its size is zero.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01551.html │ │ │ │ @@ -80,15 +80,15 @@ │ │ │ │
Dune::Functions::ContainerDescriptors::UniformArray< Child, n > Struct Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Descriptor for arrays with all children identical and the number of children a static size. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

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

│ │ │ │ +

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

│ │ │ │

│ │ │ │ Public Member Functions

template<class Index >
Value operator[] (const Index &) const
 The child access method is only available for the interface, but should not be called.
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -230,15 +230,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

The static size information, i.e., number of children.

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

Uniform descriptor with dynamic size. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

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

│ │ │ │ +

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

│ │ │ │

│ │ │ │ Public Member Functions

template<class C = Child, std::enable_if_t< std::is_default_constructible_v< C >, int > = 0>
 UniformArray ()
 Default constructor. Is enable if the child-type is default constructible.
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -237,15 +237,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

The dynamic size information, i.e., number of children.

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

│ │ │ │

│ │ │ │ Public Member Functions

template<class C = Child, std::enable_if_t< std::is_default_constructible_v< C >, int > = 0>
 UniformVector (std::size_t size)
 Default constructor with size. Is enable if the child-type is default constructible.
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -732,15 +732,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using PreBasis = PB
 Pre-basis providing the implementation details.
 
using PrefixPath = TypeTree::HybridTreePath<>
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01567.html │ │ │ │ @@ -82,15 +82,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>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -748,15 +748,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using GlobalBasis = GB
 The global FE basis that this is a view on.
 
using GridView = typename GlobalBasis::GridView
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01571.html │ │ │ │ @@ -81,15 +81,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
 
│ │ │ │ │ │ │ │

│ │ │ │ @@ -261,15 +261,15 @@ │ │ │ │

│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01575.html │ │ │ │ @@ -77,15 +77,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -210,15 +210,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01579.html │ │ │ │ @@ -84,15 +84,15 @@ │ │ │ │
Dune::Functions::DynamicPowerPreBasis< IMS, SPB > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

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

│ │ │ │ │ │ │ │ -

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

│ │ │ │ +

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

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::DynamicPowerPreBasis< IMS, SPB >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1369,15 +1369,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01631.html │ │ │ │ @@ -87,15 +87,15 @@ │ │ │ │ GVThe grid view that the FE basis is defined on │ │ │ │ kThe polynomial order of ansatz functions, (0 < k <= 2) │ │ │ │ RRange field-type used for shape function values │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01635.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │ Static Public Attributes | │ │ │ │ Protected Attributes | │ │ │ │ List of all members │ │ │ │
Dune::Functions::HierarchicalLagrangePreBasis< GV, 1, R > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

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

│ │ │ │ +

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

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::HierarchicalLagrangePreBasis< GV, 1, R >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -690,15 +690,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Size required temporarily when constructing global multi-indices.

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

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

│ │ │ │ +

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

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::HierarchicalLagrangePreBasis< GV, 2, R >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -690,15 +690,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Size required temporarily when constructing global multi-indices.

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

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -184,15 +184,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/a01663.html │ │ │ │ @@ -81,15 +81,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>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -398,15 +398,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/a01691.html │ │ │ │ @@ -80,15 +80,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -656,15 +656,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01695.html │ │ │ │ @@ -83,15 +83,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1329,15 +1329,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01703.html │ │ │ │ @@ -79,15 +79,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>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::LagrangeDGPreBasis< GV, k >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -940,15 +940,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01707.html │ │ │ │ @@ -82,15 +82,15 @@ │ │ │ │
Dune::Functions::LeafPreBasisMapperMixin< GV > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

A generic MixIn class for PreBasis with flat indices computed from a mapper. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

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

│ │ │ │ +

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

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

Size required temporarily when constructing global multi-indices.

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

A generic MixIn class for PreBasis. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

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

│ │ │ │ +

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

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::LeafPreBasisMixin< Derived >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -375,15 +375,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Size required temporarily when constructing global multi-indices.

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

A pre-basis mixin class parametrized with a local finite-element and a DOF layout. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

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

│ │ │ │ +

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

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::LFEPreBasisMixin< GV, LFE >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -794,15 +794,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Size required temporarily when constructing global multi-indices.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01719.html │ │ │ │ @@ -82,15 +82,15 @@ │ │ │ │
Dune::Functions::LFEPreBasisMixin< GV, LFE >::Node Class Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │

Leaf basis node that encapsulates a local finite-element given from the LFEPreBasisMixin of type LFE. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

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

│ │ │ │ +

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

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::LFEPreBasisMixin< GV, LFE >::Node:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -549,15 +549,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01727.html │ │ │ │ @@ -79,15 +79,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -583,15 +583,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01731.html │ │ │ │ @@ -79,15 +79,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>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::NedelecPreBasis< GV, Range, kind, order >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -677,15 +677,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Size required temporarily when constructing global multi-indices.

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01747.html │ │ │ │ @@ -78,15 +78,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -371,15 +371,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01751.html │ │ │ │ @@ -78,15 +78,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -337,15 +337,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01755.html │ │ │ │ @@ -78,15 +78,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -432,15 +432,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01759.html │ │ │ │ @@ -78,15 +78,15 @@ │ │ │ │ Public Member Functions | │ │ │ │ Protected Member Functions | │ │ │ │ List of all members │ │ │ │
Dune::Functions::DynamicPowerBasisNode< T > Class Template Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

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

│ │ │ │ +

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

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::DynamicPowerBasisNode< T >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -429,15 +429,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01763.html │ │ │ │ @@ -78,15 +78,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -465,15 +465,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01767.html │ │ │ │ @@ -79,15 +79,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>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -158,15 +158,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/a01779.html │ │ │ │ @@ -84,15 +84,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>

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::PowerPreBasis< IMS, SPB, C >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1397,15 +1397,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Member Functions

void unifyIndexPair (std::size_t a, std::size_t b)
 Insert a pair of indices.
 
const auto & indexPairSet () const
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01783.html │ │ │ │ @@ -79,15 +79,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -538,15 +538,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01787.html │ │ │ │ @@ -82,15 +82,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>

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

Size required temporarily when constructing global multi-indices.

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

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::RaviartThomasPreBasis< GV, k >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -704,15 +704,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Size required temporarily when constructing global multi-indices.

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

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

│ │ │ │ +

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

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

A pre-basis for a refined Lagrange bases. │ │ │ │ More...

│ │ │ │ │ │ │ │ -

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

│ │ │ │ +

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

│ │ │ │
│ │ │ │ Inheritance diagram for Dune::Functions::RefinedLagrangePreBasis< GV, k, R >:
│ │ │ │
│ │ │ │
Inheritance graph
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -769,15 +769,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Size required temporarily when constructing global multi-indices.

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

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -312,15 +312,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/a01855.html │ │ │ │ @@ -79,15 +79,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>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -377,15 +377,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Return number of contained DOFs.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01859.html │ │ │ │ @@ -78,15 +78,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.
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -606,15 +606,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/a01863.html │ │ │ │ @@ -81,15 +81,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>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -689,15 +689,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using RootLocalView = RLV
 
using GlobalBasis = SubspaceBasis< typename RootLocalView::GlobalBasis, PrefixPath >
 The global FE basis that this is a view on.
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01867.html │ │ │ │ @@ -78,15 +78,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -409,15 +409,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01871.html │ │ │ │ @@ -78,15 +78,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -408,15 +408,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01875.html │ │ │ │ @@ -84,15 +84,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>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -844,15 +844,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

using GridView = GV
 The grid view that the FE basis is defined on.
 
using size_type = std::size_t
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01879.html │ │ │ │ @@ -82,15 +82,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>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -811,15 +811,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Types

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

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

│ │ │ │ │ │ │ │ -

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

│ │ │ │ +

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

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -359,15 +359,15 @@ │ │ │ │ │ │ │ │

│ │ │ │ Public Member Functions

template<class IT_R , class SI_R , class CD_R >
 GenericIndexingTransformation (IT_R &&indexTransformation, SI_R &&sizeImplementation, CD_R &&containerDescriptorImplementation)
 
template<class MultiIndex , class PreBasis >
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01895.html │ │ │ │ @@ -86,15 +86,15 @@ │ │ │ │ │ │ │ │ template<class F , class GridView > │ │ │ │ auto makeAnalyticGridViewFunction (F &&f, const GridView &gridView) │ │ │ │  Create an AnalyticGridViewFunction from a function and a grid view.
│ │ │ │   │ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01899.html │ │ │ │ @@ -81,15 +81,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>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -493,15 +493,15 @@ │ │ │ │
│ │ │ │ │ │ │ │

Construct the associated local-function.

│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01903.html │ │ │ │ @@ -85,15 +85,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
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -490,15 +490,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/a01911.html │ │ │ │ @@ -80,15 +80,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -486,15 +486,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01915.html │ │ │ │ @@ -76,15 +76,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>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -155,15 +155,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/a01919.html │ │ │ │ @@ -79,15 +79,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -544,15 +544,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01923.html │ │ │ │ @@ -83,15 +83,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -683,15 +683,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01927.html │ │ │ │ @@ -84,15 +84,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -779,15 +779,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01931.html │ │ │ │ @@ -80,15 +80,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -585,15 +585,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01935.html │ │ │ │ @@ -83,15 +83,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -627,15 +627,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a01939.html │ │ │ │ @@ -82,15 +82,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>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -380,15 +380,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/a01947.html │ │ │ │ @@ -73,29 +73,29 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
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/a01955.html │ │ │ │ @@ -80,15 +80,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -326,15 +326,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/a01971.html │ │ │ │ @@ -80,15 +80,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -461,15 +461,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/a01975.html │ │ │ │ @@ -73,17 +73,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/a01979.html │ │ │ │ @@ -79,15 +79,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
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -129,15 +129,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/a01983.html │ │ │ │ @@ -80,15 +80,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>

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -135,15 +135,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/a01987.html │ │ │ │ @@ -76,15 +76,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

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

│ │ │ │ @@ -103,15 +103,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/a02939.html │ │ │ │ @@ -77,16 +77,16 @@ │ │ │ │ Classes | │ │ │ │ Namespaces │ │ │ │
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/a02939_source.html │ │ │ │ @@ -90,17 +90,17 @@ │ │ │ │
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_CONCEPTS_HH
│ │ │ │
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_CONCEPTS_HH
│ │ │ │
9
│ │ │ │
10
│ │ │ │
11#include <dune/common/concept.hh>
│ │ │ │
12#include <dune/common/reservedvector.hh>
│ │ │ │
13
│ │ │ │ - │ │ │ │ + │ │ │ │
15
│ │ │ │ - │ │ │ │ + │ │ │ │
17
│ │ │ │
18
│ │ │ │
19namespace Dune {
│ │ │ │
20namespace Functions {
│ │ │ │
21namespace Concept {
│ │ │ │
22
│ │ │ │
23using namespace Dune::Concept;
│ │ │ │ @@ -338,16 +338,16 @@ │ │ │ │
231
│ │ │ │
232} // namespace Dune::Functions::Concept
│ │ │ │
233} // namespace Dune::Functions
│ │ │ │
234} // namespace Dune
│ │ │ │
235
│ │ │ │
236
│ │ │ │
237#endif // DUNE_FUNCTIONS_FUNCTIONSPACEBASES_CONCEPTS_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │
Definition polynomial.hh:17
│ │ │ │
Definition functionspacebases/concepts.hh:27
│ │ │ │
auto require(C &&c) -> decltype(c.resize(0))
│ │ │ │
Definition functionspacebases/concepts.hh:37
│ │ │ │
auto require(C &&c) -> decltype(c.size())
│ │ │ │
Definition functionspacebases/concepts.hh:47
│ │ │ │
auto require(C &&c, I &&i) -> decltype(c[i])
│ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/dir_000001_000002.html │ │ │ │ @@ -69,14 +69,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 │ │ │ │ @@ -69,14 +69,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 │ │ │ │ @@ -69,14 +69,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 │ │ │ │ @@ -69,14 +69,14 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -

common → gridfunctions Relation

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

common → gridfunctions Relation

File in dune/functions/commonIncludes file in dune/functions/gridfunctions
functionconcepts.hhgridviewentityset.hh
functionconcepts.hhlocalderivativetraits.hh
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/dir_000007_000001.html │ │ │ │ @@ -69,14 +69,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 │ │ │ │ @@ -69,14 +69,14 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

functionspacebases → common Relation

File in dune/functions/functionspacebasesIncludes file in dune/functions/common
compositebasis.hhstaticforloop.hh
compositebasis.hhtype_traits.hh
compositebasis.hhutility.hh
containerdescriptors.hhtype_traits.hh
defaultglobalbasis.hhtype_traits.hh
defaultlocalview.hhmultiindex.hh
defaultlocalview.hhoverflowarray.hh
dynamicpowerbasis.hhtype_traits.hh
dynamicpowerbasis.hhutility.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 │ │ │ │ @@ -69,14 +69,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 │ │ │ │ @@ -69,14 +69,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 │ │ │ │ @@ -69,14 +69,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 │ │ │ │ @@ -69,14 +69,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 │ │ │ │ @@ -90,50 +90,50 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Files

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

│ │ │ │ Files

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

│ │ │ │ Files

 concepts.hh
 
 istlvectorbackend.hh
 istlvectorbackend.hh
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/dir_a2250aba7ee066a4c694d7c3cf43d078.html │ │ │ │ @@ -93,86 +93,86 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Files

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

│ │ │ │ Files

 polynomial.hh
 polynomial.hh
 
 trigonometricfunction.hh
 trigonometricfunction.hh
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-functions-doc/doxygen/dune-functions.tag.gz │ │ │ │ ├── dune-functions.tag │ │ │ │ │ ├── dune-functions.tag │ │ │ │ │ │ @@ -4,23 +4,23 @@ │ │ │ │ │ │ mainpage.md │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/doc/doxygen/ │ │ │ │ │ │ a00203.html │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ polynomial.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/analyticfunctions/ │ │ │ │ │ │ - a00002.html │ │ │ │ │ │ + a00005.html │ │ │ │ │ │ Dune::Functions::Polynomial │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ trigonometricfunction.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/analyticfunctions/ │ │ │ │ │ │ - a00005.html │ │ │ │ │ │ + a00002.html │ │ │ │ │ │ Dune::Functions::TrigonometricFunction │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ backends/concepts.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/backends/ │ │ │ │ │ │ @@ -31,16 +31,16 @@ │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::Concept │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ functionspacebases/concepts.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ a02939.html │ │ │ │ │ │ - dune/functions/common/utility.hh │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + 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::DynamicPowerBasisNode │ │ │ │ │ │ @@ -52,75 +52,75 @@ │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::Concept │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ istlvectorbackend.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/backends/ │ │ │ │ │ │ - a00011.html │ │ │ │ │ │ - dune/functions/common/indexaccess.hh │ │ │ │ │ │ + a00092.html │ │ │ │ │ │ + dune/functions/common/indexaccess.hh │ │ │ │ │ │ dune/functions/functionspacebases/concepts.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ defaultderivativetraits.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/common/ │ │ │ │ │ │ - a00071.html │ │ │ │ │ │ + a00047.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.10.0/dune/functions/common/ │ │ │ │ │ │ - a00062.html │ │ │ │ │ │ - dune/functions/common/type_traits.hh │ │ │ │ │ │ - dune/functions/common/defaultderivativetraits.hh │ │ │ │ │ │ - dune/functions/common/differentiablefunction_imp.hh │ │ │ │ │ │ - dune/functions/common/signature.hh │ │ │ │ │ │ + a00020.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/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.10.0/dune/functions/common/ │ │ │ │ │ │ - a00086.html │ │ │ │ │ │ - dune/functions/common/type_traits.hh │ │ │ │ │ │ + a00008.html │ │ │ │ │ │ + dune/functions/common/type_traits.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ differentiablefunctionfromcallables.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/common/ │ │ │ │ │ │ - a00092.html │ │ │ │ │ │ - dune/functions/common/signature.hh │ │ │ │ │ │ - dune/functions/common/differentiablefunction.hh │ │ │ │ │ │ - dune/functions/common/functionconcepts.hh │ │ │ │ │ │ + a00041.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 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ functionconcepts.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/common/ │ │ │ │ │ │ - a00047.html │ │ │ │ │ │ - dune/functions/common/signature.hh │ │ │ │ │ │ - dune/functions/gridfunctions/localderivativetraits.hh │ │ │ │ │ │ - dune/functions/gridfunctions/gridviewentityset.hh │ │ │ │ │ │ + a00023.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 > │ │ │ │ │ │ @@ -130,144 +130,144 @@ │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::Concept │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ indexaccess.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/common/ │ │ │ │ │ │ - a00041.html │ │ │ │ │ │ - dune/functions/common/utility.hh │ │ │ │ │ │ + a00011.html │ │ │ │ │ │ + dune/functions/common/utility.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ interfaces.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/common/ │ │ │ │ │ │ - a00083.html │ │ │ │ │ │ + a00032.html │ │ │ │ │ │ Dune::Functions::PolymorphicType │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ localfunction.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/common/ │ │ │ │ │ │ - a00059.html │ │ │ │ │ │ - dune/functions/common/defaultderivativetraits.hh │ │ │ │ │ │ - dune/functions/common/differentiablefunction.hh │ │ │ │ │ │ - dune/functions/common/localfunction_imp.hh │ │ │ │ │ │ + a00014.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/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.10.0/dune/functions/common/ │ │ │ │ │ │ - a00068.html │ │ │ │ │ │ - dune/functions/common/type_traits.hh │ │ │ │ │ │ - dune/functions/common/differentiablefunction_imp.hh │ │ │ │ │ │ + a00026.html │ │ │ │ │ │ + dune/functions/common/type_traits.hh │ │ │ │ │ │ + dune/functions/common/differentiablefunction_imp.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ multiindex.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/common/ │ │ │ │ │ │ - a00089.html │ │ │ │ │ │ + a00029.html │ │ │ │ │ │ Dune::Functions::StaticMultiIndex │ │ │ │ │ │ Dune::Functions::StaticMultiIndex< size_type, 1 > │ │ │ │ │ │ std::tuple_size< Dune::Functions::StaticMultiIndex< size_type, n > > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ overflowarray.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/common/ │ │ │ │ │ │ - a00065.html │ │ │ │ │ │ + a00050.html │ │ │ │ │ │ Dune::Functions::OverflowArray │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ polymorphicsmallobject.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/common/ │ │ │ │ │ │ - a00077.html │ │ │ │ │ │ + a00035.html │ │ │ │ │ │ Dune::Functions::PolymorphicSmallObject │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ reserveddeque.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/common/ │ │ │ │ │ │ - a00053.html │ │ │ │ │ │ + a00017.html │ │ │ │ │ │ Dune::Functions::ReservedDeque │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ #define │ │ │ │ │ │ CHECKSIZE │ │ │ │ │ │ - a00053.html │ │ │ │ │ │ + a00017.html │ │ │ │ │ │ a65543e75bc949ecdb95a25b1f4e11675 │ │ │ │ │ │ (X) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ signature.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/common/ │ │ │ │ │ │ - a00074.html │ │ │ │ │ │ - dune/functions/common/defaultderivativetraits.hh │ │ │ │ │ │ + a00053.html │ │ │ │ │ │ + dune/functions/common/defaultderivativetraits.hh │ │ │ │ │ │ Dune::Functions::SignatureTraits │ │ │ │ │ │ Dune::Functions::SignatureTag< Range(Domain), DerivativeTraitsT > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ staticforloop.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/common/ │ │ │ │ │ │ - a00050.html │ │ │ │ │ │ - dune/functions/common/type_traits.hh │ │ │ │ │ │ + a00059.html │ │ │ │ │ │ + dune/functions/common/type_traits.hh │ │ │ │ │ │ dune/functions/functionspacebases/concepts.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ type_traits.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/common/ │ │ │ │ │ │ - a00080.html │ │ │ │ │ │ + a00044.html │ │ │ │ │ │ Dune::Functions::HasStaticSize │ │ │ │ │ │ Dune::Functions::StaticSizeOrZero │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ typeerasure.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/common/ │ │ │ │ │ │ a00056.html │ │ │ │ │ │ - dune/functions/common/type_traits.hh │ │ │ │ │ │ - dune/functions/common/interfaces.hh │ │ │ │ │ │ - dune/functions/common/polymorphicsmallobject.hh │ │ │ │ │ │ + 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.10.0/dune/functions/common/ │ │ │ │ │ │ - a00044.html │ │ │ │ │ │ - dune/functions/common/functionconcepts.hh │ │ │ │ │ │ + a00038.html │ │ │ │ │ │ + dune/functions/common/functionconcepts.hh │ │ │ │ │ │ Dune::Functions::LastType │ │ │ │ │ │ Dune::Functions::RotateTuple │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ basistags.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00179.html │ │ │ │ │ │ + a00149.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 │ │ │ │ │ │ @@ -275,530 +275,530 @@ │ │ │ │ │ │ Dune::Functions::Concept │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ Dune::Functions::BasisBuilder │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ boundarydofs.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00185.html │ │ │ │ │ │ - dune/functions/functionspacebases/subentitydofs.hh │ │ │ │ │ │ + a00164.html │ │ │ │ │ │ + dune/functions/functionspacebases/subentitydofs.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ brezzidouglasmarinibasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00182.html │ │ │ │ │ │ - dune/functions/functionspacebases/globalvaluedlocalfiniteelement.hh │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ - dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ - dune/functions/functionspacebases/leafprebasismixin.hh │ │ │ │ │ │ + a00098.html │ │ │ │ │ │ + dune/functions/functionspacebases/globalvaluedlocalfiniteelement.hh │ │ │ │ │ │ + dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ + dune/functions/functionspacebases/leafprebasismixin.hh │ │ │ │ │ │ Dune::Functions::BrezziDouglasMariniPreBasis │ │ │ │ │ │ Dune::Functions::BrezziDouglasMariniNode │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ bsplinebasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00095.html │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ - dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ - dune/functions/functionspacebases/leafprebasismixin.hh │ │ │ │ │ │ + a00182.html │ │ │ │ │ │ + dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ + dune/functions/functionspacebases/leafprebasismixin.hh │ │ │ │ │ │ Dune::Functions::BSplineLocalBasis │ │ │ │ │ │ Dune::Functions::BSplineLocalCoefficients │ │ │ │ │ │ Dune::Functions::BSplineLocalInterpolation │ │ │ │ │ │ Dune::Functions::BSplineLocalFiniteElement │ │ │ │ │ │ Dune::Functions::BSplinePreBasis │ │ │ │ │ │ Dune::Functions::BSplineNode │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ compositebasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00191.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 │ │ │ │ │ │ + a00128.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/containerdescriptors.hh │ │ │ │ │ │ - dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ + dune/functions/functionspacebases/containerdescriptors.hh │ │ │ │ │ │ + dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ Dune::Functions::CompositePreBasis │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ Dune::Functions::BasisBuilder │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ containerdescriptors.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00161.html │ │ │ │ │ │ - dune/functions/common/type_traits.hh │ │ │ │ │ │ - dune/functions/functionspacebases/basistags.hh │ │ │ │ │ │ + a00152.html │ │ │ │ │ │ + dune/functions/common/type_traits.hh │ │ │ │ │ │ + dune/functions/functionspacebases/basistags.hh │ │ │ │ │ │ Dune::Functions::ContainerDescriptors::Unknown │ │ │ │ │ │ Dune::Functions::ContainerDescriptors::Value │ │ │ │ │ │ Dune::Functions::ContainerDescriptors::UniformArray │ │ │ │ │ │ Dune::Functions::ContainerDescriptors::UniformVector │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::ContainerDescriptors │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ defaultglobalbasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00110.html │ │ │ │ │ │ - dune/functions/common/type_traits.hh │ │ │ │ │ │ - dune/functions/functionspacebases/defaultlocalview.hh │ │ │ │ │ │ + a00194.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 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ defaultlocalview.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00131.html │ │ │ │ │ │ - dune/functions/common/overflowarray.hh │ │ │ │ │ │ - dune/functions/common/multiindex.hh │ │ │ │ │ │ + a00095.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.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00170.html │ │ │ │ │ │ + a00119.html │ │ │ │ │ │ dune/functions/functionspacebases/concepts.hh │ │ │ │ │ │ Dune::Functions::DefaultNodeToRangeMap │ │ │ │ │ │ Dune::Functions::DefaultNodeToRangeMap::Visitor │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dynamicpowerbasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00107.html │ │ │ │ │ │ - dune/functions/common/utility.hh │ │ │ │ │ │ - dune/functions/common/type_traits.hh │ │ │ │ │ │ - dune/functions/functionspacebases/basistags.hh │ │ │ │ │ │ - dune/functions/functionspacebases/containerdescriptors.hh │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + a00110.html │ │ │ │ │ │ + dune/functions/common/utility.hh │ │ │ │ │ │ + dune/functions/common/type_traits.hh │ │ │ │ │ │ + dune/functions/functionspacebases/basistags.hh │ │ │ │ │ │ + dune/functions/functionspacebases/containerdescriptors.hh │ │ │ │ │ │ + dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ dune/functions/functionspacebases/concepts.hh │ │ │ │ │ │ Dune::Functions::DynamicPowerPreBasis │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ flatmultiindex.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00113.html │ │ │ │ │ │ - dune/functions/common/multiindex.hh │ │ │ │ │ │ + a00143.html │ │ │ │ │ │ + dune/functions/common/multiindex.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ flatvectorview.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00119.html │ │ │ │ │ │ + a00140.html │ │ │ │ │ │ dune/functions/functionspacebases/concepts.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ globalvaluedlocalfiniteelement.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00125.html │ │ │ │ │ │ + a00170.html │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ hierarchicallagrangebasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00140.html │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ - dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ - dune/functions/functionspacebases/lfeprebasismixin.hh │ │ │ │ │ │ + a00137.html │ │ │ │ │ │ + dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ + dune/functions/functionspacebases/lfeprebasismixin.hh │ │ │ │ │ │ Dune::Functions::HierarchicalLagrangePreBasis< GV, 1, R > │ │ │ │ │ │ Dune::Functions::HierarchicalLagrangePreBasis< GV, 2, R > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ hierarchicnodetorangemap.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00155.html │ │ │ │ │ │ + a00146.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.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00149.html │ │ │ │ │ │ - dune/functions/common/indexaccess.hh │ │ │ │ │ │ - dune/functions/common/utility.hh │ │ │ │ │ │ - dune/functions/common/type_traits.hh │ │ │ │ │ │ + a00155.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 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ interpolate.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00164.html │ │ │ │ │ │ - dune/functions/gridfunctions/gridviewfunction.hh │ │ │ │ │ │ - dune/functions/common/functionconcepts.hh │ │ │ │ │ │ + a00167.html │ │ │ │ │ │ + dune/functions/gridfunctions/gridviewfunction.hh │ │ │ │ │ │ + dune/functions/common/functionconcepts.hh │ │ │ │ │ │ dune/functions/backends/concepts.hh │ │ │ │ │ │ - dune/functions/backends/istlvectorbackend.hh │ │ │ │ │ │ - dune/functions/functionspacebases/flatvectorview.hh │ │ │ │ │ │ - dune/functions/functionspacebases/hierarchicnodetorangemap.hh │ │ │ │ │ │ + dune/functions/backends/istlvectorbackend.hh │ │ │ │ │ │ + dune/functions/functionspacebases/flatvectorview.hh │ │ │ │ │ │ + dune/functions/functionspacebases/hierarchicnodetorangemap.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ lagrangebasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00116.html │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ - dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ - dune/functions/functionspacebases/leafprebasismixin.hh │ │ │ │ │ │ + a00113.html │ │ │ │ │ │ + dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ + dune/functions/functionspacebases/leafprebasismixin.hh │ │ │ │ │ │ Dune::Functions::LagrangePreBasis │ │ │ │ │ │ Dune::Functions::LagrangeNode │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ lagrangedgbasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00134.html │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ - dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ - dune/functions/functionspacebases/lagrangebasis.hh │ │ │ │ │ │ - dune/functions/functionspacebases/leafprebasismixin.hh │ │ │ │ │ │ + a00122.html │ │ │ │ │ │ + dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ + dune/functions/functionspacebases/lagrangebasis.hh │ │ │ │ │ │ + dune/functions/functionspacebases/leafprebasismixin.hh │ │ │ │ │ │ Dune::Functions::LagrangeDGPreBasis │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ leafprebasismappermixin.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00188.html │ │ │ │ │ │ - dune/functions/functionspacebases/leafprebasismixin.hh │ │ │ │ │ │ + a00104.html │ │ │ │ │ │ + dune/functions/functionspacebases/leafprebasismixin.hh │ │ │ │ │ │ Dune::Functions::LeafPreBasisMapperMixin │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ leafprebasismixin.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00197.html │ │ │ │ │ │ - dune/functions/functionspacebases/containerdescriptors.hh │ │ │ │ │ │ + a00158.html │ │ │ │ │ │ + dune/functions/functionspacebases/containerdescriptors.hh │ │ │ │ │ │ Dune::Functions::LeafPreBasisMixin │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ lfeprebasismixin.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00167.html │ │ │ │ │ │ - dune/functions/functionspacebases/leafprebasismappermixin.hh │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + a00131.html │ │ │ │ │ │ + dune/functions/functionspacebases/leafprebasismappermixin.hh │ │ │ │ │ │ + dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ Dune::Functions::LFEPreBasisMixin │ │ │ │ │ │ Dune::Functions::LFEPreBasisMixin::Node │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ nedelecbasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00122.html │ │ │ │ │ │ - dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ - dune/functions/functionspacebases/globalvaluedlocalfiniteelement.hh │ │ │ │ │ │ - dune/functions/functionspacebases/leafprebasismixin.hh │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + a00185.html │ │ │ │ │ │ + dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ + dune/functions/functionspacebases/globalvaluedlocalfiniteelement.hh │ │ │ │ │ │ + dune/functions/functionspacebases/leafprebasismixin.hh │ │ │ │ │ │ + dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ Dune::Functions::NedelecPreBasis │ │ │ │ │ │ Dune::Functions::NedelecNode │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ nodes.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00194.html │ │ │ │ │ │ + a00161.html │ │ │ │ │ │ Dune::Functions::BasisNodeMixin │ │ │ │ │ │ Dune::Functions::LeafBasisNode │ │ │ │ │ │ Dune::Functions::PowerBasisNode │ │ │ │ │ │ Dune::Functions::DynamicPowerBasisNode │ │ │ │ │ │ Dune::Functions::CompositeBasisNode │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ periodicbasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00104.html │ │ │ │ │ │ + a00101.html │ │ │ │ │ │ dune/functions/functionspacebases/concepts.hh │ │ │ │ │ │ - dune/functions/functionspacebases/containerdescriptors.hh │ │ │ │ │ │ - dune/functions/functionspacebases/transformedindexbasis.hh │ │ │ │ │ │ + dune/functions/functionspacebases/containerdescriptors.hh │ │ │ │ │ │ + dune/functions/functionspacebases/transformedindexbasis.hh │ │ │ │ │ │ Dune::Functions::BasisFactory::Experimental::PeriodicIndexSet │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ Dune::Functions::BasisFactory::Experimental │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ powerbasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00101.html │ │ │ │ │ │ - dune/functions/common/utility.hh │ │ │ │ │ │ - dune/functions/common/type_traits.hh │ │ │ │ │ │ - dune/functions/functionspacebases/basistags.hh │ │ │ │ │ │ - dune/functions/functionspacebases/dynamicpowerbasis.hh │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + a00107.html │ │ │ │ │ │ + dune/functions/common/utility.hh │ │ │ │ │ │ + dune/functions/common/type_traits.hh │ │ │ │ │ │ + dune/functions/functionspacebases/basistags.hh │ │ │ │ │ │ + dune/functions/functionspacebases/dynamicpowerbasis.hh │ │ │ │ │ │ + dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ dune/functions/functionspacebases/concepts.hh │ │ │ │ │ │ - dune/functions/functionspacebases/containerdescriptors.hh │ │ │ │ │ │ - dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ + dune/functions/functionspacebases/containerdescriptors.hh │ │ │ │ │ │ + dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ Dune::Functions::PowerPreBasis │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ Dune::Functions::BasisBuilder │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ rannacherturekbasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00158.html │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ - dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ - dune/functions/functionspacebases/leafprebasismixin.hh │ │ │ │ │ │ + a00197.html │ │ │ │ │ │ + dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ + dune/functions/functionspacebases/leafprebasismixin.hh │ │ │ │ │ │ Dune::Functions::RannacherTurekPreBasis │ │ │ │ │ │ Dune::Functions::RannacherTurekNode │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ raviartthomasbasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00128.html │ │ │ │ │ │ - dune/functions/functionspacebases/globalvaluedlocalfiniteelement.hh │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ - dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ - dune/functions/functionspacebases/leafprebasismixin.hh │ │ │ │ │ │ + a00176.html │ │ │ │ │ │ + dune/functions/functionspacebases/globalvaluedlocalfiniteelement.hh │ │ │ │ │ │ + dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ + dune/functions/functionspacebases/leafprebasismixin.hh │ │ │ │ │ │ Dune::Functions::RaviartThomasPreBasis │ │ │ │ │ │ Dune::Functions::RaviartThomasNode │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ refinedlagrangebasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00176.html │ │ │ │ │ │ - dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ - dune/functions/functionspacebases/leafprebasismappermixin.hh │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ + a00173.html │ │ │ │ │ │ + dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ + dune/functions/functionspacebases/leafprebasismappermixin.hh │ │ │ │ │ │ + dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ Dune::Functions::RefinedLagrangePreBasis │ │ │ │ │ │ Dune::Functions::RefinedLagrangeNode │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::BasisFactory │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ sizeinfo.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00146.html │ │ │ │ │ │ + a00125.html │ │ │ │ │ │ Dune::Functions::SizeInfo │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ subentitydofs.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00143.html │ │ │ │ │ │ + a00188.html │ │ │ │ │ │ Dune::Functions::SubEntityDOFs │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ subspacebasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00173.html │ │ │ │ │ │ - dune/functions/common/type_traits.hh │ │ │ │ │ │ - dune/functions/functionspacebases/subspacelocalview.hh │ │ │ │ │ │ + a00191.html │ │ │ │ │ │ + dune/functions/common/type_traits.hh │ │ │ │ │ │ + dune/functions/functionspacebases/subspacelocalview.hh │ │ │ │ │ │ dune/functions/functionspacebases/concepts.hh │ │ │ │ │ │ Dune::Functions::SubspaceBasis │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ subspacelocalview.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00137.html │ │ │ │ │ │ + a00134.html │ │ │ │ │ │ dune/functions/functionspacebases/concepts.hh │ │ │ │ │ │ Dune::Functions::SubspaceLocalView │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ taylorhoodbasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00098.html │ │ │ │ │ │ - dune/functions/functionspacebases/nodes.hh │ │ │ │ │ │ - dune/functions/functionspacebases/lagrangebasis.hh │ │ │ │ │ │ - dune/functions/functionspacebases/defaultglobalbasis.hh │ │ │ │ │ │ + a00116.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 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ transformedindexbasis.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/functionspacebases/ │ │ │ │ │ │ - a00152.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 │ │ │ │ │ │ + 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 │ │ │ │ │ │ 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 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ analyticgridviewfunction.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/gridfunctions/ │ │ │ │ │ │ - a00014.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 │ │ │ │ │ │ + a00068.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 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ composedgridfunction.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/gridfunctions/ │ │ │ │ │ │ - a00020.html │ │ │ │ │ │ - dune/functions/common/defaultderivativetraits.hh │ │ │ │ │ │ - dune/functions/common/differentiablefunction.hh │ │ │ │ │ │ - dune/functions/gridfunctions/gridfunction.hh │ │ │ │ │ │ + a00077.html │ │ │ │ │ │ + dune/functions/common/defaultderivativetraits.hh │ │ │ │ │ │ + dune/functions/common/differentiablefunction.hh │ │ │ │ │ │ + dune/functions/gridfunctions/gridfunction.hh │ │ │ │ │ │ Dune::Functions::ComposedGridFunction │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ discreteglobalbasisfunction.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/gridfunctions/ │ │ │ │ │ │ - a00026.html │ │ │ │ │ │ - dune/functions/functionspacebases/hierarchicnodetorangemap.hh │ │ │ │ │ │ - dune/functions/functionspacebases/flatvectorview.hh │ │ │ │ │ │ - dune/functions/gridfunctions/gridviewentityset.hh │ │ │ │ │ │ - dune/functions/gridfunctions/gridfunction.hh │ │ │ │ │ │ + a00071.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 │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ Dune::Functions::ImplDoc │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ facenormalgridfunction.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/gridfunctions/ │ │ │ │ │ │ - a00035.html │ │ │ │ │ │ - dune/functions/gridfunctions/gridfunction.hh │ │ │ │ │ │ - dune/functions/gridfunctions/gridviewentityset.hh │ │ │ │ │ │ + a00062.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.10.0/dune/functions/gridfunctions/ │ │ │ │ │ │ - a00017.html │ │ │ │ │ │ + a00080.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/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.10.0/dune/functions/gridfunctions/ │ │ │ │ │ │ - a00032.html │ │ │ │ │ │ - dune/functions/common/type_traits.hh │ │ │ │ │ │ - dune/functions/common/interfaces.hh │ │ │ │ │ │ - dune/functions/common/differentiablefunction_imp.hh │ │ │ │ │ │ + a00086.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.10.0/dune/functions/gridfunctions/ │ │ │ │ │ │ - a00023.html │ │ │ │ │ │ + a00074.html │ │ │ │ │ │ Dune::Functions::GridViewEntitySet │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Functions │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ gridviewfunction.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/gridfunctions/ │ │ │ │ │ │ - a00038.html │ │ │ │ │ │ - dune/functions/gridfunctions/gridfunction.hh │ │ │ │ │ │ - dune/functions/gridfunctions/gridviewentityset.hh │ │ │ │ │ │ - dune/functions/gridfunctions/analyticgridviewfunction.hh │ │ │ │ │ │ + a00065.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 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ localderivativetraits.hh │ │ │ │ │ │ /build/reproducible-path/dune-functions-2.10.0/dune/functions/gridfunctions/ │ │ │ │ │ │ - a00029.html │ │ │ │ │ │ - dune/functions/common/defaultderivativetraits.hh │ │ │ │ │ │ + a00083.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 │ │ │ │ @@ -75,85 +75,85 @@ │ │ │ │
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
 concepts.hh
 istlvectorbackend.hh
 istlvectorbackend.hh
  common
 defaultderivativetraits.hh
 differentiablefunction.hh
 differentiablefunction_imp.hh
 differentiablefunctionfromcallables.hh
 functionconcepts.hh
 indexaccess.hh
 interfaces.hh
 localfunction.hh
 localfunction_imp.hh
 multiindex.hh
 overflowarray.hh
 polymorphicsmallobject.hh
 reserveddeque.hhAn stl-compliant double-ended queue which stores everything on the stack
 signature.hh
 staticforloop.hh
 type_traits.hh
 defaultderivativetraits.hh
 differentiablefunction.hh
 differentiablefunction_imp.hh
 differentiablefunctionfromcallables.hh
 functionconcepts.hh
 indexaccess.hh
 interfaces.hh
 localfunction.hh
 localfunction_imp.hh
 multiindex.hh
 overflowarray.hh
 polymorphicsmallobject.hh
 reserveddeque.hhAn stl-compliant double-ended queue which stores everything on the stack
 signature.hh
 staticforloop.hh
 type_traits.hh
 typeerasure.hh
 utility.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
 concepts.hh
 containerdescriptors.hh
 defaultglobalbasis.hh
 defaultlocalview.hh
 defaultnodetorangemap.hh
 dynamicpowerbasis.hh
 flatmultiindex.hh
 flatvectorview.hh
 globalvaluedlocalfiniteelement.hh
 hierarchicallagrangebasis.hh
 hierarchicnodetorangemap.hh
 hierarchicvectorwrapper.hh
 interpolate.hh
 lagrangebasis.hh
 lagrangedgbasis.hh
 leafprebasismappermixin.hh
 leafprebasismixin.hh
 lfeprebasismixin.hh
 nedelecbasis.hh
 nodes.hh
 periodicbasis.hh
 powerbasis.hh
 rannacherturekbasis.hh
 raviartthomasbasis.hh
 refinedlagrangebasis.hh
 sizeinfo.hh
 subentitydofs.hh
 subspacebasis.hh
 subspacelocalview.hh
 taylorhoodbasis.hh
 transformedindexbasis.hh
 containerdescriptors.hh
 defaultglobalbasis.hh
 defaultlocalview.hh
 defaultnodetorangemap.hh
 dynamicpowerbasis.hh
 flatmultiindex.hh
 flatvectorview.hh
 globalvaluedlocalfiniteelement.hh
 hierarchicallagrangebasis.hh
 hierarchicnodetorangemap.hh
 hierarchicvectorwrapper.hh
 interpolate.hh
 lagrangebasis.hh
 lagrangedgbasis.hh
 leafprebasismappermixin.hh
 leafprebasismixin.hh
 lfeprebasismixin.hh
 nedelecbasis.hh
 nodes.hh
 periodicbasis.hh
 powerbasis.hh
 rannacherturekbasis.hh
 raviartthomasbasis.hh
 refinedlagrangebasis.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 │ │ │ │ @@ -66,15 +66,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 │ │ │ │ @@ -66,15 +66,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
Here is a list of all macros with links to the files they belong to:
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │